From 3afcde32179293695fa2c6d6d1d5c02b22a444ac Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 9 Apr 2021 13:29:59 +0300 Subject: [PATCH] Initial commit --- .babelrc | 18 + .browserslistrc | 1 + .editorconfig | 12 + .env.example | 4 + .eslintignore | 1 + .eslintrc | 65 + .gitattributes | 25 + .github/workflows/tests.yml | 30 + .gitignore | 10 + .postcssrc | 5 + README.md | 76 + deploy/contest.sh | 14 + deploy/copy_to_dist.sh | 15 + dev/localize/auto-localize.ts | 82 + dev/localize/auto-relocalize.ts | 84 + dev/localize/en-android.json | 15749 +++++++ dev/localize/en-extra.json | 102 + dev/localize/en-ios.json | 18304 +++++++++ dev/localize/ru-ios.json | 34246 ++++++++++++++++ dev/perf/globals/0c46207b-1000.json | 22051 ++++++++++ jest.config.js | 12 + package-lock.json | 20860 ++++++++++ package.json | 110 + public/android-chrome-192x192.png | Bin 0 -> 1753 bytes public/android-chrome-384x384.png | Bin 0 -> 3632 bytes public/apple-touch-icon.png | Bin 0 -> 1333 bytes public/browserconfig.xml | 9 + public/chartDummyData/followers.json | 1 + public/chartDummyData/growth.json | 1 + public/chartDummyData/interactions.json | 1 + public/chartDummyData/languages.json | 1 + public/chartDummyData/notifications.json | 1 + .../notifications_zoom/2018-10/04.json | 1 + .../notifications_zoom/2018-10/05.json | 1 + .../notifications_zoom/2018-10/06.json | 1 + .../notifications_zoom/2018-10/07.json | 1 + .../notifications_zoom/2018-10/08.json | 1 + .../notifications_zoom/2018-10/09.json | 1 + .../notifications_zoom/2018-10/10.json | 1 + .../notifications_zoom/2018-10/11.json | 1 + .../notifications_zoom/2018-10/12.json | 1 + .../notifications_zoom/2018-10/13.json | 1 + .../notifications_zoom/2018-10/14.json | 1 + .../notifications_zoom/2018-10/15.json | 1 + .../notifications_zoom/2018-10/16.json | 1 + .../notifications_zoom/2018-10/17.json | 1 + .../notifications_zoom/2018-10/18.json | 1 + .../notifications_zoom/2018-10/19.json | 1 + .../notifications_zoom/2018-10/20.json | 1 + .../notifications_zoom/2018-10/21.json | 1 + .../notifications_zoom/2018-10/22.json | 1 + .../notifications_zoom/2018-10/23.json | 1 + .../notifications_zoom/2018-10/24.json | 1 + .../notifications_zoom/2018-10/25.json | 1 + .../notifications_zoom/2018-10/26.json | 1 + .../notifications_zoom/2018-10/27.json | 1 + .../notifications_zoom/2018-10/28.json | 1 + .../notifications_zoom/2018-10/29.json | 1 + .../notifications_zoom/2018-10/30.json | 1 + .../notifications_zoom/2018-10/31.json | 1 + .../notifications_zoom/2018-11/01.json | 1 + .../notifications_zoom/2018-11/02.json | 1 + .../notifications_zoom/2018-11/03.json | 1 + .../notifications_zoom/2018-11/04.json | 1 + .../notifications_zoom/2018-11/05.json | 1 + .../notifications_zoom/2018-11/06.json | 1 + .../notifications_zoom/2018-11/07.json | 1 + .../notifications_zoom/2018-11/08.json | 1 + .../notifications_zoom/2018-11/09.json | 1 + .../notifications_zoom/2018-11/10.json | 1 + .../notifications_zoom/2018-11/11.json | 1 + .../notifications_zoom/2018-11/12.json | 1 + .../notifications_zoom/2018-11/13.json | 1 + .../notifications_zoom/2018-11/14.json | 1 + .../notifications_zoom/2018-11/15.json | 1 + .../notifications_zoom/2018-11/16.json | 1 + .../notifications_zoom/2018-11/17.json | 1 + .../notifications_zoom/2018-11/18.json | 1 + .../notifications_zoom/2018-11/19.json | 1 + .../notifications_zoom/2018-11/20.json | 1 + .../notifications_zoom/2018-11/21.json | 1 + .../notifications_zoom/2018-11/22.json | 1 + .../notifications_zoom/2018-11/23.json | 1 + .../notifications_zoom/2018-11/24.json | 1 + .../notifications_zoom/2018-11/25.json | 1 + .../notifications_zoom/2018-11/26.json | 1 + .../notifications_zoom/2018-11/27.json | 1 + .../notifications_zoom/2018-11/28.json | 1 + .../notifications_zoom/2018-11/29.json | 1 + .../notifications_zoom/2018-11/30.json | 1 + .../notifications_zoom/2018-12/01.json | 1 + .../notifications_zoom/2018-12/02.json | 1 + .../notifications_zoom/2018-12/03.json | 1 + .../notifications_zoom/2018-12/04.json | 1 + .../notifications_zoom/2018-12/05.json | 1 + .../notifications_zoom/2018-12/06.json | 1 + .../notifications_zoom/2018-12/07.json | 1 + .../notifications_zoom/2018-12/08.json | 1 + .../notifications_zoom/2018-12/09.json | 1 + .../notifications_zoom/2018-12/10.json | 1 + .../notifications_zoom/2018-12/11.json | 1 + .../notifications_zoom/2018-12/12.json | 1 + .../notifications_zoom/2018-12/13.json | 1 + .../notifications_zoom/2018-12/14.json | 1 + .../notifications_zoom/2018-12/15.json | 1 + .../notifications_zoom/2018-12/16.json | 1 + .../notifications_zoom/2018-12/17.json | 1 + .../notifications_zoom/2018-12/18.json | 1 + .../notifications_zoom/2018-12/19.json | 1 + .../notifications_zoom/2018-12/20.json | 1 + .../notifications_zoom/2018-12/21.json | 1 + .../notifications_zoom/2018-12/22.json | 1 + .../notifications_zoom/2018-12/23.json | 1 + .../notifications_zoom/2018-12/24.json | 1 + .../notifications_zoom/2018-12/25.json | 1 + .../notifications_zoom/2018-12/26.json | 1 + .../notifications_zoom/2018-12/27.json | 1 + .../notifications_zoom/2018-12/28.json | 1 + .../notifications_zoom/2018-12/29.json | 1 + .../notifications_zoom/2018-12/30.json | 1 + .../notifications_zoom/2018-12/31.json | 1 + .../notifications_zoom/2019-01/01.json | 1 + .../notifications_zoom/2019-01/02.json | 1 + .../notifications_zoom/2019-01/03.json | 1 + .../notifications_zoom/2019-01/04.json | 1 + .../notifications_zoom/2019-01/05.json | 1 + .../notifications_zoom/2019-01/06.json | 1 + .../notifications_zoom/2019-01/07.json | 1 + .../notifications_zoom/2019-01/08.json | 1 + .../notifications_zoom/2019-01/09.json | 1 + .../notifications_zoom/2019-01/10.json | 1 + .../notifications_zoom/2019-01/11.json | 1 + .../notifications_zoom/2019-01/12.json | 1 + .../notifications_zoom/2019-01/13.json | 1 + .../notifications_zoom/2019-01/14.json | 1 + .../notifications_zoom/2019-01/15.json | 1 + .../notifications_zoom/2019-01/16.json | 1 + .../notifications_zoom/2019-01/17.json | 1 + .../notifications_zoom/2019-01/18.json | 1 + .../notifications_zoom/2019-01/19.json | 1 + .../notifications_zoom/2019-01/20.json | 1 + .../notifications_zoom/2019-01/21.json | 1 + .../notifications_zoom/2019-01/22.json | 1 + .../notifications_zoom/2019-01/23.json | 1 + .../notifications_zoom/2019-01/24.json | 1 + .../notifications_zoom/2019-01/25.json | 1 + .../notifications_zoom/2019-01/26.json | 1 + .../notifications_zoom/2019-01/27.json | 1 + .../notifications_zoom/2019-01/28.json | 1 + .../notifications_zoom/2019-01/29.json | 1 + .../notifications_zoom/2019-01/30.json | 1 + .../notifications_zoom/2019-01/31.json | 1 + .../notifications_zoom/2019-02/01.json | 1 + .../notifications_zoom/2019-02/02.json | 1 + .../notifications_zoom/2019-02/03.json | 1 + .../notifications_zoom/2019-02/04.json | 1 + .../notifications_zoom/2019-02/05.json | 1 + .../notifications_zoom/2019-02/06.json | 1 + .../notifications_zoom/2019-02/07.json | 1 + .../notifications_zoom/2019-02/08.json | 1 + .../notifications_zoom/2019-02/09.json | 1 + .../notifications_zoom/2019-02/10.json | 1 + .../notifications_zoom/2019-02/11.json | 1 + .../notifications_zoom/2019-02/12.json | 1 + .../notifications_zoom/2019-02/13.json | 1 + .../notifications_zoom/2019-02/14.json | 1 + .../notifications_zoom/2019-02/15.json | 1 + .../notifications_zoom/2019-02/16.json | 1 + .../notifications_zoom/2019-02/17.json | 1 + .../notifications_zoom/2019-02/18.json | 1 + .../notifications_zoom/2019-02/19.json | 1 + .../notifications_zoom/2019-02/20.json | 1 + .../notifications_zoom/2019-02/21.json | 1 + .../notifications_zoom/2019-02/22.json | 1 + .../notifications_zoom/2019-02/23.json | 1 + .../notifications_zoom/2019-02/24.json | 1 + .../notifications_zoom/2019-02/25.json | 1 + .../notifications_zoom/2019-02/26.json | 1 + .../notifications_zoom/2019-02/27.json | 1 + .../notifications_zoom/2019-02/28.json | 1 + .../notifications_zoom/2019-03/01.json | 1 + .../notifications_zoom/2019-03/02.json | 1 + .../notifications_zoom/2019-03/03.json | 1 + .../notifications_zoom/2019-03/04.json | 1 + .../notifications_zoom/2019-03/05.json | 1 + .../notifications_zoom/2019-03/06.json | 1 + .../notifications_zoom/2019-03/07.json | 1 + .../notifications_zoom/2019-03/08.json | 1 + .../notifications_zoom/2019-03/09.json | 1 + .../notifications_zoom/2019-03/10.json | 1 + .../notifications_zoom/2019-03/11.json | 1 + .../notifications_zoom/2019-03/12.json | 1 + .../notifications_zoom/2019-03/13.json | 1 + .../notifications_zoom/2019-03/14.json | 1 + .../notifications_zoom/2019-03/15.json | 1 + .../notifications_zoom/2019-03/16.json | 1 + .../notifications_zoom/2019-03/17.json | 1 + .../notifications_zoom/2019-03/18.json | 1 + .../notifications_zoom/2019-03/19.json | 1 + .../notifications_zoom/2019-03/20.json | 1 + .../notifications_zoom/2019-03/21.json | 1 + .../notifications_zoom/2019-03/22.json | 1 + .../notifications_zoom/2019-03/23.json | 1 + .../notifications_zoom/2019-03/24.json | 1 + .../notifications_zoom/2019-03/25.json | 1 + .../notifications_zoom/2019-03/26.json | 1 + .../notifications_zoom/2019-03/27.json | 1 + .../notifications_zoom/2019-03/28.json | 1 + .../notifications_zoom/2019-03/29.json | 1 + .../notifications_zoom/2019-03/30.json | 1 + .../notifications_zoom/2019-03/31.json | 1 + .../notifications_zoom/2019-04/01.json | 1 + public/chartDummyData/views.json | 1 + .../chartDummyData/views_zoom/2018-04/07.json | 1 + .../chartDummyData/views_zoom/2018-04/08.json | 1 + .../chartDummyData/views_zoom/2018-04/09.json | 1 + .../chartDummyData/views_zoom/2018-04/10.json | 1 + .../chartDummyData/views_zoom/2018-04/11.json | 1 + .../chartDummyData/views_zoom/2018-04/12.json | 1 + .../chartDummyData/views_zoom/2018-04/13.json | 1 + .../chartDummyData/views_zoom/2018-04/14.json | 1 + .../chartDummyData/views_zoom/2018-04/15.json | 1 + .../chartDummyData/views_zoom/2018-04/16.json | 1 + .../chartDummyData/views_zoom/2018-04/17.json | 1 + .../chartDummyData/views_zoom/2018-04/18.json | 1 + .../chartDummyData/views_zoom/2018-04/19.json | 1 + .../chartDummyData/views_zoom/2018-04/20.json | 1 + .../chartDummyData/views_zoom/2018-04/21.json | 1 + .../chartDummyData/views_zoom/2018-04/22.json | 1 + .../chartDummyData/views_zoom/2018-04/23.json | 1 + .../chartDummyData/views_zoom/2018-04/24.json | 1 + .../chartDummyData/views_zoom/2018-04/25.json | 1 + .../chartDummyData/views_zoom/2018-04/26.json | 1 + .../chartDummyData/views_zoom/2018-04/27.json | 1 + .../chartDummyData/views_zoom/2018-04/28.json | 1 + .../chartDummyData/views_zoom/2018-04/29.json | 1 + .../chartDummyData/views_zoom/2018-04/30.json | 1 + .../chartDummyData/views_zoom/2018-05/01.json | 1 + .../chartDummyData/views_zoom/2018-05/02.json | 1 + .../chartDummyData/views_zoom/2018-05/03.json | 1 + .../chartDummyData/views_zoom/2018-05/04.json | 1 + .../chartDummyData/views_zoom/2018-05/05.json | 1 + .../chartDummyData/views_zoom/2018-05/06.json | 1 + .../chartDummyData/views_zoom/2018-05/07.json | 1 + .../chartDummyData/views_zoom/2018-05/08.json | 1 + .../chartDummyData/views_zoom/2018-05/09.json | 1 + .../chartDummyData/views_zoom/2018-05/10.json | 1 + .../chartDummyData/views_zoom/2018-05/11.json | 1 + .../chartDummyData/views_zoom/2018-05/12.json | 1 + .../chartDummyData/views_zoom/2018-05/13.json | 1 + .../chartDummyData/views_zoom/2018-05/14.json | 1 + .../chartDummyData/views_zoom/2018-05/15.json | 1 + .../chartDummyData/views_zoom/2018-05/16.json | 1 + .../chartDummyData/views_zoom/2018-05/17.json | 1 + .../chartDummyData/views_zoom/2018-05/18.json | 1 + .../chartDummyData/views_zoom/2018-05/19.json | 1 + .../chartDummyData/views_zoom/2018-05/20.json | 1 + .../chartDummyData/views_zoom/2018-05/21.json | 1 + .../chartDummyData/views_zoom/2018-05/22.json | 1 + .../chartDummyData/views_zoom/2018-05/23.json | 1 + .../chartDummyData/views_zoom/2018-05/24.json | 1 + .../chartDummyData/views_zoom/2018-05/25.json | 1 + .../chartDummyData/views_zoom/2018-05/26.json | 1 + .../chartDummyData/views_zoom/2018-05/27.json | 1 + .../chartDummyData/views_zoom/2018-05/28.json | 1 + .../chartDummyData/views_zoom/2018-05/29.json | 1 + .../chartDummyData/views_zoom/2018-05/30.json | 1 + .../chartDummyData/views_zoom/2018-05/31.json | 1 + .../chartDummyData/views_zoom/2018-06/01.json | 1 + .../chartDummyData/views_zoom/2018-06/02.json | 1 + .../chartDummyData/views_zoom/2018-06/03.json | 1 + .../chartDummyData/views_zoom/2018-06/04.json | 1 + .../chartDummyData/views_zoom/2018-06/05.json | 1 + .../chartDummyData/views_zoom/2018-06/06.json | 1 + .../chartDummyData/views_zoom/2018-06/07.json | 1 + .../chartDummyData/views_zoom/2018-06/08.json | 1 + .../chartDummyData/views_zoom/2018-06/09.json | 1 + .../chartDummyData/views_zoom/2018-06/10.json | 1 + .../chartDummyData/views_zoom/2018-06/11.json | 1 + .../chartDummyData/views_zoom/2018-06/12.json | 1 + .../chartDummyData/views_zoom/2018-06/13.json | 1 + .../chartDummyData/views_zoom/2018-06/14.json | 1 + .../chartDummyData/views_zoom/2018-06/15.json | 1 + .../chartDummyData/views_zoom/2018-06/16.json | 1 + .../chartDummyData/views_zoom/2018-06/17.json | 1 + .../chartDummyData/views_zoom/2018-06/18.json | 1 + .../chartDummyData/views_zoom/2018-06/19.json | 1 + .../chartDummyData/views_zoom/2018-06/20.json | 1 + .../chartDummyData/views_zoom/2018-06/21.json | 1 + .../chartDummyData/views_zoom/2018-06/22.json | 1 + .../chartDummyData/views_zoom/2018-06/23.json | 1 + .../chartDummyData/views_zoom/2018-06/24.json | 1 + .../chartDummyData/views_zoom/2018-06/25.json | 1 + .../chartDummyData/views_zoom/2018-06/26.json | 1 + .../chartDummyData/views_zoom/2018-06/27.json | 1 + .../chartDummyData/views_zoom/2018-06/28.json | 1 + .../chartDummyData/views_zoom/2018-06/29.json | 1 + .../chartDummyData/views_zoom/2018-06/30.json | 1 + .../chartDummyData/views_zoom/2018-07/01.json | 1 + .../chartDummyData/views_zoom/2018-07/02.json | 1 + .../chartDummyData/views_zoom/2018-07/03.json | 1 + .../chartDummyData/views_zoom/2018-07/04.json | 1 + .../chartDummyData/views_zoom/2018-07/05.json | 1 + .../chartDummyData/views_zoom/2018-07/06.json | 1 + .../chartDummyData/views_zoom/2018-07/07.json | 1 + .../chartDummyData/views_zoom/2018-07/08.json | 1 + .../chartDummyData/views_zoom/2018-07/09.json | 1 + .../chartDummyData/views_zoom/2018-07/10.json | 1 + .../chartDummyData/views_zoom/2018-07/11.json | 1 + .../chartDummyData/views_zoom/2018-07/12.json | 1 + .../chartDummyData/views_zoom/2018-07/13.json | 1 + .../chartDummyData/views_zoom/2018-07/14.json | 1 + .../chartDummyData/views_zoom/2018-07/15.json | 1 + .../chartDummyData/views_zoom/2018-07/16.json | 1 + .../chartDummyData/views_zoom/2018-07/17.json | 1 + .../chartDummyData/views_zoom/2018-07/18.json | 1 + .../chartDummyData/views_zoom/2018-07/19.json | 1 + .../chartDummyData/views_zoom/2018-07/20.json | 1 + .../chartDummyData/views_zoom/2018-07/21.json | 1 + .../chartDummyData/views_zoom/2018-07/22.json | 1 + .../chartDummyData/views_zoom/2018-07/23.json | 1 + .../chartDummyData/views_zoom/2018-07/24.json | 1 + .../chartDummyData/views_zoom/2018-07/25.json | 1 + .../chartDummyData/views_zoom/2018-07/26.json | 1 + .../chartDummyData/views_zoom/2018-07/27.json | 1 + .../chartDummyData/views_zoom/2018-07/28.json | 1 + .../chartDummyData/views_zoom/2018-07/29.json | 1 + .../chartDummyData/views_zoom/2018-07/30.json | 1 + .../chartDummyData/views_zoom/2018-07/31.json | 1 + .../chartDummyData/views_zoom/2018-08/01.json | 1 + .../chartDummyData/views_zoom/2018-08/02.json | 1 + .../chartDummyData/views_zoom/2018-08/03.json | 1 + .../chartDummyData/views_zoom/2018-08/04.json | 1 + .../chartDummyData/views_zoom/2018-08/05.json | 1 + .../chartDummyData/views_zoom/2018-08/06.json | 1 + .../chartDummyData/views_zoom/2018-08/07.json | 1 + .../chartDummyData/views_zoom/2018-08/08.json | 1 + .../chartDummyData/views_zoom/2018-08/09.json | 1 + .../chartDummyData/views_zoom/2018-08/10.json | 1 + .../chartDummyData/views_zoom/2018-08/11.json | 1 + .../chartDummyData/views_zoom/2018-08/12.json | 1 + .../chartDummyData/views_zoom/2018-08/13.json | 1 + .../chartDummyData/views_zoom/2018-08/14.json | 1 + .../chartDummyData/views_zoom/2018-08/15.json | 1 + .../chartDummyData/views_zoom/2018-08/16.json | 1 + .../chartDummyData/views_zoom/2018-08/17.json | 1 + .../chartDummyData/views_zoom/2018-08/18.json | 1 + .../chartDummyData/views_zoom/2018-08/19.json | 1 + .../chartDummyData/views_zoom/2018-08/20.json | 1 + .../chartDummyData/views_zoom/2018-08/21.json | 1 + .../chartDummyData/views_zoom/2018-08/22.json | 1 + .../chartDummyData/views_zoom/2018-08/23.json | 1 + .../chartDummyData/views_zoom/2018-08/24.json | 1 + .../chartDummyData/views_zoom/2018-08/25.json | 1 + .../chartDummyData/views_zoom/2018-08/26.json | 1 + .../chartDummyData/views_zoom/2018-08/27.json | 1 + .../chartDummyData/views_zoom/2018-08/28.json | 1 + .../chartDummyData/views_zoom/2018-08/29.json | 1 + .../chartDummyData/views_zoom/2018-08/30.json | 1 + .../chartDummyData/views_zoom/2018-08/31.json | 1 + .../chartDummyData/views_zoom/2018-09/01.json | 1 + .../chartDummyData/views_zoom/2018-09/02.json | 1 + .../chartDummyData/views_zoom/2018-09/03.json | 1 + .../chartDummyData/views_zoom/2018-09/04.json | 1 + .../chartDummyData/views_zoom/2018-09/05.json | 1 + .../chartDummyData/views_zoom/2018-09/06.json | 1 + .../chartDummyData/views_zoom/2018-09/07.json | 1 + .../chartDummyData/views_zoom/2018-09/08.json | 1 + .../chartDummyData/views_zoom/2018-09/09.json | 1 + .../chartDummyData/views_zoom/2018-09/10.json | 1 + .../chartDummyData/views_zoom/2018-09/11.json | 1 + .../chartDummyData/views_zoom/2018-09/12.json | 1 + .../chartDummyData/views_zoom/2018-09/13.json | 1 + .../chartDummyData/views_zoom/2018-09/14.json | 1 + .../chartDummyData/views_zoom/2018-09/15.json | 1 + .../chartDummyData/views_zoom/2018-09/16.json | 1 + .../chartDummyData/views_zoom/2018-09/17.json | 1 + .../chartDummyData/views_zoom/2018-09/18.json | 1 + .../chartDummyData/views_zoom/2018-09/19.json | 1 + .../chartDummyData/views_zoom/2018-09/20.json | 1 + .../chartDummyData/views_zoom/2018-09/21.json | 1 + .../chartDummyData/views_zoom/2018-09/22.json | 1 + .../chartDummyData/views_zoom/2018-09/23.json | 1 + .../chartDummyData/views_zoom/2018-09/24.json | 1 + .../chartDummyData/views_zoom/2018-09/25.json | 1 + .../chartDummyData/views_zoom/2018-09/26.json | 1 + .../chartDummyData/views_zoom/2018-09/27.json | 1 + .../chartDummyData/views_zoom/2018-09/28.json | 1 + .../chartDummyData/views_zoom/2018-09/29.json | 1 + .../chartDummyData/views_zoom/2018-09/30.json | 1 + .../chartDummyData/views_zoom/2018-10/01.json | 1 + .../chartDummyData/views_zoom/2018-10/02.json | 1 + .../chartDummyData/views_zoom/2018-10/03.json | 1 + .../chartDummyData/views_zoom/2018-10/04.json | 1 + .../chartDummyData/views_zoom/2018-10/05.json | 1 + .../chartDummyData/views_zoom/2018-10/06.json | 1 + .../chartDummyData/views_zoom/2018-10/07.json | 1 + .../chartDummyData/views_zoom/2018-10/08.json | 1 + .../chartDummyData/views_zoom/2018-10/09.json | 1 + .../chartDummyData/views_zoom/2018-10/10.json | 1 + .../chartDummyData/views_zoom/2018-10/11.json | 1 + .../chartDummyData/views_zoom/2018-10/12.json | 1 + .../chartDummyData/views_zoom/2018-10/13.json | 1 + .../chartDummyData/views_zoom/2018-10/14.json | 1 + .../chartDummyData/views_zoom/2018-10/15.json | 1 + .../chartDummyData/views_zoom/2018-10/16.json | 1 + .../chartDummyData/views_zoom/2018-10/17.json | 1 + .../chartDummyData/views_zoom/2018-10/18.json | 1 + .../chartDummyData/views_zoom/2018-10/19.json | 1 + .../chartDummyData/views_zoom/2018-10/20.json | 1 + .../chartDummyData/views_zoom/2018-10/21.json | 1 + .../chartDummyData/views_zoom/2018-10/22.json | 1 + .../chartDummyData/views_zoom/2018-10/23.json | 1 + .../chartDummyData/views_zoom/2018-10/24.json | 1 + .../chartDummyData/views_zoom/2018-10/25.json | 1 + .../chartDummyData/views_zoom/2018-10/26.json | 1 + .../chartDummyData/views_zoom/2018-10/27.json | 1 + .../chartDummyData/views_zoom/2018-10/28.json | 1 + .../chartDummyData/views_zoom/2018-10/29.json | 1 + .../chartDummyData/views_zoom/2018-10/30.json | 1 + .../chartDummyData/views_zoom/2018-10/31.json | 1 + .../chartDummyData/views_zoom/2018-11/01.json | 1 + .../chartDummyData/views_zoom/2018-11/02.json | 1 + .../chartDummyData/views_zoom/2018-11/03.json | 1 + .../chartDummyData/views_zoom/2018-11/04.json | 1 + .../chartDummyData/views_zoom/2018-11/05.json | 1 + .../chartDummyData/views_zoom/2018-11/06.json | 1 + .../chartDummyData/views_zoom/2018-11/07.json | 1 + .../chartDummyData/views_zoom/2018-11/08.json | 1 + .../chartDummyData/views_zoom/2018-11/09.json | 1 + .../chartDummyData/views_zoom/2018-11/10.json | 1 + .../chartDummyData/views_zoom/2018-11/11.json | 1 + .../chartDummyData/views_zoom/2018-11/12.json | 1 + .../chartDummyData/views_zoom/2018-11/13.json | 1 + .../chartDummyData/views_zoom/2018-11/14.json | 1 + .../chartDummyData/views_zoom/2018-11/15.json | 1 + .../chartDummyData/views_zoom/2018-11/16.json | 1 + .../chartDummyData/views_zoom/2018-11/17.json | 1 + .../chartDummyData/views_zoom/2018-11/18.json | 1 + .../chartDummyData/views_zoom/2018-11/19.json | 1 + .../chartDummyData/views_zoom/2018-11/20.json | 1 + .../chartDummyData/views_zoom/2018-11/21.json | 1 + .../chartDummyData/views_zoom/2018-11/22.json | 1 + .../chartDummyData/views_zoom/2018-11/23.json | 1 + .../chartDummyData/views_zoom/2018-11/24.json | 1 + .../chartDummyData/views_zoom/2018-11/25.json | 1 + .../chartDummyData/views_zoom/2018-11/26.json | 1 + .../chartDummyData/views_zoom/2018-11/27.json | 1 + .../chartDummyData/views_zoom/2018-11/28.json | 1 + .../chartDummyData/views_zoom/2018-11/29.json | 1 + .../chartDummyData/views_zoom/2018-11/30.json | 1 + .../chartDummyData/views_zoom/2018-12/01.json | 1 + .../chartDummyData/views_zoom/2018-12/02.json | 1 + .../chartDummyData/views_zoom/2018-12/03.json | 1 + .../chartDummyData/views_zoom/2018-12/04.json | 1 + .../chartDummyData/views_zoom/2018-12/05.json | 1 + .../chartDummyData/views_zoom/2018-12/06.json | 1 + .../chartDummyData/views_zoom/2018-12/07.json | 1 + .../chartDummyData/views_zoom/2018-12/08.json | 1 + .../chartDummyData/views_zoom/2018-12/09.json | 1 + .../chartDummyData/views_zoom/2018-12/10.json | 1 + .../chartDummyData/views_zoom/2018-12/11.json | 1 + .../chartDummyData/views_zoom/2018-12/12.json | 1 + .../chartDummyData/views_zoom/2018-12/13.json | 1 + .../chartDummyData/views_zoom/2018-12/14.json | 1 + .../chartDummyData/views_zoom/2018-12/15.json | 1 + .../chartDummyData/views_zoom/2018-12/16.json | 1 + .../chartDummyData/views_zoom/2018-12/17.json | 1 + .../chartDummyData/views_zoom/2018-12/18.json | 1 + .../chartDummyData/views_zoom/2018-12/19.json | 1 + .../chartDummyData/views_zoom/2018-12/20.json | 1 + .../chartDummyData/views_zoom/2018-12/21.json | 1 + .../chartDummyData/views_zoom/2018-12/22.json | 1 + .../chartDummyData/views_zoom/2018-12/23.json | 1 + .../chartDummyData/views_zoom/2018-12/24.json | 1 + .../chartDummyData/views_zoom/2018-12/25.json | 1 + .../chartDummyData/views_zoom/2018-12/26.json | 1 + .../chartDummyData/views_zoom/2018-12/27.json | 1 + .../chartDummyData/views_zoom/2018-12/28.json | 1 + .../chartDummyData/views_zoom/2018-12/29.json | 1 + .../chartDummyData/views_zoom/2018-12/30.json | 1 + .../chartDummyData/views_zoom/2018-12/31.json | 1 + .../chartDummyData/views_zoom/2019-01/01.json | 1 + .../chartDummyData/views_zoom/2019-01/02.json | 1 + .../chartDummyData/views_zoom/2019-01/03.json | 1 + .../chartDummyData/views_zoom/2019-01/04.json | 1 + .../chartDummyData/views_zoom/2019-01/05.json | 1 + .../chartDummyData/views_zoom/2019-01/06.json | 1 + .../chartDummyData/views_zoom/2019-01/07.json | 1 + .../chartDummyData/views_zoom/2019-01/08.json | 1 + .../chartDummyData/views_zoom/2019-01/09.json | 1 + .../chartDummyData/views_zoom/2019-01/10.json | 1 + .../chartDummyData/views_zoom/2019-01/11.json | 1 + .../chartDummyData/views_zoom/2019-01/12.json | 1 + .../chartDummyData/views_zoom/2019-01/13.json | 1 + .../chartDummyData/views_zoom/2019-01/14.json | 1 + .../chartDummyData/views_zoom/2019-01/15.json | 1 + .../chartDummyData/views_zoom/2019-01/16.json | 1 + .../chartDummyData/views_zoom/2019-01/17.json | 1 + .../chartDummyData/views_zoom/2019-01/18.json | 1 + .../chartDummyData/views_zoom/2019-01/19.json | 1 + .../chartDummyData/views_zoom/2019-01/20.json | 1 + .../chartDummyData/views_zoom/2019-01/21.json | 1 + .../chartDummyData/views_zoom/2019-01/22.json | 1 + .../chartDummyData/views_zoom/2019-01/23.json | 1 + .../chartDummyData/views_zoom/2019-01/24.json | 1 + .../chartDummyData/views_zoom/2019-01/25.json | 1 + .../chartDummyData/views_zoom/2019-01/26.json | 1 + .../chartDummyData/views_zoom/2019-01/27.json | 1 + .../chartDummyData/views_zoom/2019-01/28.json | 1 + .../chartDummyData/views_zoom/2019-01/29.json | 1 + .../chartDummyData/views_zoom/2019-01/30.json | 1 + .../chartDummyData/views_zoom/2019-01/31.json | 1 + .../chartDummyData/views_zoom/2019-02/01.json | 1 + .../chartDummyData/views_zoom/2019-02/02.json | 1 + .../chartDummyData/views_zoom/2019-02/03.json | 1 + .../chartDummyData/views_zoom/2019-02/04.json | 1 + .../chartDummyData/views_zoom/2019-02/05.json | 1 + .../chartDummyData/views_zoom/2019-02/06.json | 1 + .../chartDummyData/views_zoom/2019-02/07.json | 1 + .../chartDummyData/views_zoom/2019-02/08.json | 1 + .../chartDummyData/views_zoom/2019-02/09.json | 1 + .../chartDummyData/views_zoom/2019-02/10.json | 1 + .../chartDummyData/views_zoom/2019-02/11.json | 1 + .../chartDummyData/views_zoom/2019-02/12.json | 1 + .../chartDummyData/views_zoom/2019-02/13.json | 1 + .../chartDummyData/views_zoom/2019-02/14.json | 1 + .../chartDummyData/views_zoom/2019-02/15.json | 1 + .../chartDummyData/views_zoom/2019-02/16.json | 1 + .../chartDummyData/views_zoom/2019-02/17.json | 1 + .../chartDummyData/views_zoom/2019-02/18.json | 1 + .../chartDummyData/views_zoom/2019-02/19.json | 1 + .../chartDummyData/views_zoom/2019-02/20.json | 1 + .../chartDummyData/views_zoom/2019-02/21.json | 1 + .../chartDummyData/views_zoom/2019-02/22.json | 1 + .../chartDummyData/views_zoom/2019-02/23.json | 1 + .../chartDummyData/views_zoom/2019-02/24.json | 1 + .../chartDummyData/views_zoom/2019-02/25.json | 1 + .../chartDummyData/views_zoom/2019-02/26.json | 1 + .../chartDummyData/views_zoom/2019-02/27.json | 1 + .../chartDummyData/views_zoom/2019-02/28.json | 1 + .../chartDummyData/views_zoom/2019-03/01.json | 1 + .../chartDummyData/views_zoom/2019-03/02.json | 1 + .../chartDummyData/views_zoom/2019-03/03.json | 1 + .../chartDummyData/views_zoom/2019-03/04.json | 1 + .../chartDummyData/views_zoom/2019-03/05.json | 1 + .../chartDummyData/views_zoom/2019-03/06.json | 1 + .../chartDummyData/views_zoom/2019-03/07.json | 1 + .../chartDummyData/views_zoom/2019-03/08.json | 1 + .../chartDummyData/views_zoom/2019-03/09.json | 1 + .../chartDummyData/views_zoom/2019-03/10.json | 1 + .../chartDummyData/views_zoom/2019-03/11.json | 1 + .../chartDummyData/views_zoom/2019-03/12.json | 1 + .../chartDummyData/views_zoom/2019-03/13.json | 1 + .../chartDummyData/views_zoom/2019-03/14.json | 1 + .../chartDummyData/views_zoom/2019-03/15.json | 1 + .../chartDummyData/views_zoom/2019-03/16.json | 1 + .../chartDummyData/views_zoom/2019-03/17.json | 1 + .../chartDummyData/views_zoom/2019-03/18.json | 1 + .../chartDummyData/views_zoom/2019-03/19.json | 1 + .../chartDummyData/views_zoom/2019-03/20.json | 1 + .../chartDummyData/views_zoom/2019-03/21.json | 1 + .../chartDummyData/views_zoom/2019-03/22.json | 1 + .../chartDummyData/views_zoom/2019-03/23.json | 1 + .../chartDummyData/views_zoom/2019-03/24.json | 1 + .../chartDummyData/views_zoom/2019-03/25.json | 1 + .../chartDummyData/views_zoom/2019-03/26.json | 1 + .../chartDummyData/views_zoom/2019-03/27.json | 1 + .../chartDummyData/views_zoom/2019-03/28.json | 1 + .../chartDummyData/views_zoom/2019-03/29.json | 1 + .../chartDummyData/views_zoom/2019-03/30.json | 1 + .../chartDummyData/views_zoom/2019-03/31.json | 1 + .../chartDummyData/views_zoom/2019-04/01.json | 1 + .../chartDummyData/views_zoom/2019-04/02.json | 1 + .../chartDummyData/views_zoom/2019-04/03.json | 1 + .../chartDummyData/views_zoom/2019-04/04.json | 1 + .../chartDummyData/views_zoom/2019-04/05.json | 1 + .../chartDummyData/views_zoom/2019-04/06.json | 1 + public/favicon-16x16.png | Bin 0 -> 420 bytes public/favicon-32x32.png | Bin 0 -> 634 bytes public/mstile-150x150.png | Bin 0 -> 1254 bytes public/safari-pinned-tab.svg | 1 + public/site.webmanifest | 19 + src/@types/global.d.ts | 101 + src/@types/teact.d.ts | 3 + src/App.tsx | 52 + src/api/gramjs/apiBuilders/chats.ts | 366 + src/api/gramjs/apiBuilders/common.ts | 61 + src/api/gramjs/apiBuilders/helpers.ts | 22 + src/api/gramjs/apiBuilders/messages.ts | 904 + src/api/gramjs/apiBuilders/misc.ts | 98 + src/api/gramjs/apiBuilders/pathBytesToSvg.ts | 35 + src/api/gramjs/apiBuilders/payments.ts | 119 + src/api/gramjs/apiBuilders/peers.ts | 25 + src/api/gramjs/apiBuilders/symbols.ts | 101 + src/api/gramjs/apiBuilders/users.ts | 74 + src/api/gramjs/gramjsBuilders/index.ts | 391 + src/api/gramjs/helpers.ts | 14 + src/api/gramjs/index.ts | 2 + src/api/gramjs/localDb.ts | 21 + src/api/gramjs/methods/auth.ts | 176 + src/api/gramjs/methods/bots.ts | 26 + src/api/gramjs/methods/chats.ts | 933 + src/api/gramjs/methods/client.ts | 233 + src/api/gramjs/methods/index.ts | 60 + src/api/gramjs/methods/management.ts | 63 + src/api/gramjs/methods/media.ts | 214 + src/api/gramjs/methods/messages.ts | 1120 + src/api/gramjs/methods/payments.ts | 79 + src/api/gramjs/methods/settings.ts | 349 + src/api/gramjs/methods/symbols.ts | 290 + src/api/gramjs/methods/twoFaSettings.ts | 139 + src/api/gramjs/methods/types.ts | 5 + src/api/gramjs/methods/users.ts | 154 + src/api/gramjs/provider.ts | 73 + src/api/gramjs/updater.ts | 753 + src/api/gramjs/worker/__mocks__/provider.ts | 1 + src/api/gramjs/worker/provider.ts | 129 + src/api/gramjs/worker/types.ts | 45 + src/api/gramjs/worker/worker.ts | 117 + src/api/types/chats.ts | 140 + src/api/types/index.ts | 58 + src/api/types/media.ts | 13 + src/api/types/messages.ts | 272 + src/api/types/payments.ts | 60 + src/api/types/settings.ts | 26 + src/api/types/updates.ts | 366 + src/api/types/users.ts | 37 + src/assets/DiscussionGroupsDucks.tgs | Bin 0 -> 14488 bytes src/assets/FoldersAll.tgs | Bin 0 -> 13880 bytes src/assets/FoldersNew.tgs | Bin 0 -> 8460 bytes src/assets/TwoFactorSetupMonkeyClose.tgs | Bin 0 -> 27931 bytes .../TwoFactorSetupMonkeyCloseAndPeek.tgs | Bin 0 -> 28107 bytes ...TwoFactorSetupMonkeyCloseAndPeekToIdle.tgs | Bin 0 -> 28225 bytes src/assets/TwoFactorSetupMonkeyIdle.tgs | Bin 0 -> 6088 bytes src/assets/TwoFactorSetupMonkeyPeek.tgs | Bin 0 -> 18008 bytes src/assets/TwoFactorSetupMonkeyTracking.tgs | Bin 0 -> 12805 bytes src/assets/auth-caption.png | Bin 0 -> 1898 bytes src/assets/chat-bg-mobile.jpg | Bin 0 -> 8204 bytes src/assets/chat-bg.jpg | Bin 0 -> 17230 bytes src/assets/chat-bubble-green.svg | 1 + src/assets/chat-bubble-white.svg | 1 + .../KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 | Bin 0 -> 6864 bytes .../KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 | Bin 0 -> 11056 bytes .../KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 | Bin 0 -> 5080 bytes .../KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 | Bin 0 -> 824 bytes .../KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 | Bin 0 -> 10552 bytes .../KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 | Bin 0 -> 7924 bytes .../KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 | Bin 0 -> 3380 bytes .../fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 | Bin 0 -> 5004 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 | Bin 0 -> 11016 bytes .../fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 | Bin 0 -> 6720 bytes .../fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 | Bin 0 -> 10576 bytes .../fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 | Bin 0 -> 8024 bytes .../fonts/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 | Bin 0 -> 3384 bytes .../fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 | Bin 0 -> 796 bytes src/assets/fonts/icomoon.woff | Bin 0 -> 31064 bytes src/assets/fonts/icomoon.woff2 | Bin 0 -> 14140 bytes src/assets/fonts/roboto.css | 126 + src/assets/icon-verified.svg | 1 + src/assets/lang/en-extra.json | 102 + src/assets/lang/es-extra.json | 75 + src/assets/lang/it-extra.json | 75 + src/assets/lang/pl-extra.json | 79 + src/assets/lang/ru-extra.json | 76 + src/assets/mastercard.svg | 2 + src/assets/media_navigation_next.svg | 1 + src/assets/media_navigation_previous.svg | 1 + src/assets/monkey.svg | 1 + src/assets/stripe-logo.png | Bin 0 -> 6341 bytes src/assets/telegram-logo.svg | 1 + src/assets/visa.svg | 2 + src/bundles/auth.ts | 4 + src/bundles/extra.ts | 46 + src/bundles/main.ts | 12 + src/components/auth/Auth.scss | 168 + src/components/auth/Auth.tsx | 44 + src/components/auth/AuthCode.async.tsx | 13 + src/components/auth/AuthCode.tsx | 120 + src/components/auth/AuthPassword.async.tsx | 13 + src/components/auth/AuthPassword.tsx | 55 + src/components/auth/AuthPhoneNumber.tsx | 236 + src/components/auth/AuthQrCode.async.tsx | 13 + src/components/auth/AuthQrCode.tsx | 64 + src/components/auth/AuthRegister.async.tsx | 13 + src/components/auth/AuthRegister.tsx | 88 + src/components/auth/CountryCodeInput.scss | 90 + src/components/auth/CountryCodeInput.tsx | 152 + src/components/common/AnimatedEmoji.scss | 8 + src/components/common/AnimatedEmoji.tsx | 86 + src/components/common/AnimatedSticker.tsx | 212 + src/components/common/Audio.scss | 230 + src/components/common/Audio.tsx | 417 + src/components/common/Avatar.scss | 162 + src/components/common/Avatar.tsx | 104 + src/components/common/CalendarModal.async.tsx | 15 + src/components/common/CalendarModal.scss | 132 + src/components/common/CalendarModal.tsx | 302 + src/components/common/ChatLink.tsx | 40 + src/components/common/DeleteChatModal.scss | 21 + src/components/common/DeleteChatModal.tsx | 192 + .../common/DeleteMessageModal.async.tsx | 15 + src/components/common/DeleteMessageModal.tsx | 135 + src/components/common/Document.tsx | 111 + src/components/common/EmbeddedMessage.scss | 129 + src/components/common/EmbeddedMessage.tsx | 91 + src/components/common/File.scss | 208 + src/components/common/File.tsx | 151 + src/components/common/GifButton.scss | 43 + src/components/common/GifButton.tsx | 98 + src/components/common/GroupChatInfo.tsx | 171 + src/components/common/LastMessageMeta.scss | 20 + src/components/common/LastMessageMeta.tsx | 24 + src/components/common/Media.scss | 28 + src/components/common/Media.tsx | 48 + src/components/common/MessageLink.tsx | 41 + .../common/MessageOutgoingStatus.scss | 22 + .../common/MessageOutgoingStatus.tsx | 29 + src/components/common/NothingFound.scss | 10 + src/components/common/NothingFound.tsx | 24 + src/components/common/PasswordForm.tsx | 114 + src/components/common/PasswordMonkey.scss | 39 + src/components/common/PasswordMonkey.tsx | 76 + src/components/common/Picker.scss | 53 + src/components/common/Picker.tsx | 136 + src/components/common/PickerSelectedItem.scss | 120 + src/components/common/PickerSelectedItem.tsx | 115 + .../common/PinMessageModal.async.tsx | 15 + src/components/common/PinMessageModal.tsx | 133 + src/components/common/PrivateChatInfo.tsx | 150 + src/components/common/SafeLink.tsx | 105 + src/components/common/StickerButton.scss | 57 + src/components/common/StickerButton.tsx | 124 + .../common/StickerSetModal.async.tsx | 15 + src/components/common/StickerSetModal.scss | 48 + src/components/common/StickerSetModal.tsx | 121 + src/components/common/TrackingMonkey.tsx | 102 + src/components/common/TypingStatus.scss | 28 + src/components/common/TypingStatus.tsx | 44 + src/components/common/UiLoader.scss | 108 + src/components/common/UiLoader.tsx | 156 + .../common/UnpinAllMessagesModal.async.tsx | 15 + .../common/UnpinAllMessagesModal.tsx | 65 + src/components/common/UserLink.tsx | 41 + src/components/common/UsernameInput.tsx | 108 + src/components/common/VerifiedIcon.scss | 10 + src/components/common/VerifiedIcon.tsx | 11 + src/components/common/WebLink.scss | 83 + src/components/common/WebLink.tsx | 97 + .../common/helpers/animatedAssets.ts | 34 + .../common/helpers/detectCardType.ts | 31 + src/components/common/helpers/documentInfo.ts | 54 + .../common/helpers/mediaDimensions.ts | 202 + .../common/helpers/parseEmojiOnlyString.ts | 29 + .../helpers/renderActionMessageText.tsx | 193 + .../common/helpers/renderMessageText.tsx | 399 + src/components/common/helpers/renderText.tsx | 254 + src/components/common/helpers/waveform.ts | 63 + src/components/left/ArchivedChats.async.tsx | 15 + src/components/left/ArchivedChats.scss | 8 + src/components/left/ArchivedChats.tsx | 36 + src/components/left/ConnectionState.scss | 27 + src/components/left/ConnectionState.tsx | 30 + src/components/left/LeftColumn.scss | 36 + src/components/left/LeftColumn.tsx | 297 + src/components/left/NewChatButton.scss | 78 + src/components/left/NewChatButton.tsx | 104 + src/components/left/main/Badge.scss | 66 + src/components/left/main/Badge.tsx | 68 + src/components/left/main/Chat.scss | 100 + src/components/left/main/Chat.tsx | 325 + src/components/left/main/ChatFolders.tsx | 182 + src/components/left/main/ChatList.tsx | 208 + .../left/main/ContactList.async.tsx | 15 + src/components/left/main/ContactList.tsx | 106 + src/components/left/main/LeftMain.scss | 58 + src/components/left/main/LeftMain.tsx | 156 + src/components/left/main/LeftMainHeader.scss | 66 + src/components/left/main/LeftMainHeader.tsx | 232 + src/components/left/main/hooks/index.ts | 1 + .../left/main/hooks/useChatAnimationType.ts | 35 + src/components/left/newChat/NewChat.async.tsx | 16 + src/components/left/newChat/NewChat.scss | 46 + src/components/left/newChat/NewChat.tsx | 73 + .../left/newChat/NewChatStep1.async.tsx | 16 + src/components/left/newChat/NewChatStep1.tsx | 163 + .../left/newChat/NewChatStep2.async.tsx | 16 + src/components/left/newChat/NewChatStep2.tsx | 199 + src/components/left/search/AudioResults.tsx | 132 + src/components/left/search/ChatMessage.scss | 78 + src/components/left/search/ChatMessage.tsx | 139 + .../left/search/ChatMessageResults.tsx | 141 + src/components/left/search/ChatResults.tsx | 315 + src/components/left/search/DateSuggest.scss | 25 + src/components/left/search/DateSuggest.tsx | 57 + src/components/left/search/FileResults.tsx | 125 + .../left/search/LeftSearch.async.tsx | 15 + src/components/left/search/LeftSearch.scss | 185 + src/components/left/search/LeftSearch.tsx | 137 + .../left/search/LeftSearchResultChat.tsx | 82 + src/components/left/search/LinkResults.tsx | 119 + src/components/left/search/MediaResults.tsx | 132 + .../left/search/RecentContacts.scss | 81 + src/components/left/search/RecentContacts.tsx | 132 + .../search/helpers/createMapStateToProps.ts | 43 + .../left/search/helpers/getSenderName.ts | 31 + .../left/settings/Settings.async.tsx | 16 + src/components/left/settings/Settings.scss | 282 + src/components/left/settings/Settings.tsx | 225 + .../left/settings/SettingsEditProfile.tsx | 282 + .../left/settings/SettingsGeneral.tsx | 253 + .../settings/SettingsGeneralBackground.scss | 14 + .../settings/SettingsGeneralBackground.tsx | 149 + .../SettingsGeneralBackgroundColor.scss | 87 + .../SettingsGeneralBackgroundColor.tsx | 334 + .../left/settings/SettingsHeader.tsx | 249 + .../left/settings/SettingsLanguage.tsx | 84 + src/components/left/settings/SettingsMain.tsx | 88 + .../left/settings/SettingsNotifications.tsx | 157 + .../left/settings/SettingsPrivacy.tsx | 189 + .../SettingsPrivacyActiveSessions.tsx | 148 + .../settings/SettingsPrivacyBlockedUsers.tsx | 142 + .../settings/SettingsPrivacyVisibility.tsx | 242 + ...SettingsPrivacyVisibilityExceptionList.tsx | 193 + .../left/settings/SettingsStickerSet.scss | 25 + .../left/settings/SettingsStickerSet.tsx | 90 + .../left/settings/WallpaperTile.scss | 55 + .../left/settings/WallpaperTile.tsx | 114 + .../settings/folders/SettingsFolders.scss | 60 + .../left/settings/folders/SettingsFolders.tsx | 120 + .../folders/SettingsFoldersChatFilters.tsx | 171 + .../folders/SettingsFoldersChatsPicker.scss | 57 + .../folders/SettingsFoldersChatsPicker.tsx | 212 + .../settings/folders/SettingsFoldersEdit.tsx | 314 + .../settings/folders/SettingsFoldersMain.tsx | 229 + .../left/settings/helper/privacy.ts | 28 + .../left/settings/twoFa/SettingsTwoFa.tsx | 323 + .../twoFa/SettingsTwoFaCongratulations.tsx | 51 + .../settings/twoFa/SettingsTwoFaEmailCode.tsx | 94 + .../settings/twoFa/SettingsTwoFaEnabled.tsx | 65 + .../settings/twoFa/SettingsTwoFaPassword.tsx | 76 + .../twoFa/SettingsTwoFaSkippableForm.tsx | 158 + .../settings/twoFa/SettingsTwoFaStart.tsx | 44 + src/components/main/Errors.async.tsx | 13 + src/components/main/Errors.scss | 8 + src/components/main/Errors.tsx | 57 + src/components/main/ForwardPicker.async.tsx | 15 + src/components/main/ForwardPicker.scss | 60 + src/components/main/ForwardPicker.tsx | 190 + src/components/main/Main.async.tsx | 12 + src/components/main/Main.scss | 172 + src/components/main/Main.tsx | 135 + src/components/main/Notifications.async.tsx | 13 + src/components/main/Notifications.tsx | 38 + .../mediaViewer/MediaViewer.async.tsx | 16 + src/components/mediaViewer/MediaViewer.scss | 241 + src/components/mediaViewer/MediaViewer.tsx | 632 + .../mediaViewer/MediaViewerActions.scss | 19 + .../mediaViewer/MediaViewerActions.tsx | 184 + .../mediaViewer/MediaViewerFooter.scss | 95 + .../mediaViewer/MediaViewerFooter.tsx | 56 + src/components/mediaViewer/PanZoom.scss | 25 + src/components/mediaViewer/PanZoom.tsx | 211 + src/components/mediaViewer/SenderInfo.scss | 42 + src/components/mediaViewer/SenderInfo.tsx | 92 + src/components/mediaViewer/VideoPlayer.scss | 87 + src/components/mediaViewer/VideoPlayer.tsx | 205 + .../mediaViewer/VideoPlayerControls.scss | 160 + .../mediaViewer/VideoPlayerControls.tsx | 170 + src/components/mediaViewer/ZoomControls.scss | 99 + src/components/mediaViewer/ZoomControls.tsx | 126 + .../mediaViewer/helpers/formatFileSize.ts | 7 + .../mediaViewer/helpers/ghostAnimation.ts | 330 + src/components/middle/ActionMessage.tsx | 135 + src/components/middle/AudioPlayer.scss | 106 + src/components/middle/AudioPlayer.tsx | 122 + .../middle/DeleteSelectedMessagesModal.tsx | 129 + src/components/middle/HeaderActions.tsx | 238 + .../middle/HeaderMenuContainer.async.tsx | 15 + .../middle/HeaderMenuContainer.scss | 22 + src/components/middle/HeaderMenuContainer.tsx | 219 + src/components/middle/HeaderPinnedMessage.tsx | 110 + src/components/middle/MessageList.scss | 278 + src/components/middle/MessageList.tsx | 768 + src/components/middle/MessageScroll.tsx | 155 + .../middle/MessageSelectToolbar.async.tsx | 15 + .../middle/MessageSelectToolbar.scss | 138 + .../middle/MessageSelectToolbar.tsx | 137 + src/components/middle/MiddleColumn.scss | 369 + src/components/middle/MiddleColumn.tsx | 333 + src/components/middle/MiddleHeader.scss | 467 + src/components/middle/MiddleHeader.tsx | 495 + src/components/middle/MobileSearch.async.tsx | 15 + src/components/middle/MobileSearch.scss | 43 + src/components/middle/MobileSearch.tsx | 242 + .../middle/PinnedMessageNavigation.tsx | 223 + src/components/middle/ScrollDownButton.scss | 99 + src/components/middle/ScrollDownButton.tsx | 106 + .../middle/composer/AttachMenu.async.tsx | 15 + .../middle/composer/AttachMenu.scss | 18 + src/components/middle/composer/AttachMenu.tsx | 84 + .../middle/composer/AttachmentModal.async.tsx | 15 + .../middle/composer/AttachmentModal.scss | 77 + .../middle/composer/AttachmentModal.tsx | 161 + .../middle/composer/BotKeyboardMenu.async.tsx | 15 + .../middle/composer/BotKeyboardMenu.scss | 50 + .../middle/composer/BotKeyboardMenu.tsx | 82 + src/components/middle/composer/Composer.scss | 369 + src/components/middle/composer/Composer.tsx | 914 + .../composer/ComposerEmbeddedMessage.scss | 29 + .../composer/ComposerEmbeddedMessage.tsx | 175 + .../middle/composer/CustomSendMenu.async.tsx | 15 + .../middle/composer/CustomSendMenu.scss | 23 + .../middle/composer/CustomSendMenu.tsx | 46 + .../middle/composer/DropArea.async.tsx | 16 + src/components/middle/composer/DropArea.scss | 16 + src/components/middle/composer/DropArea.tsx | 94 + .../middle/composer/DropTarget.scss | 81 + src/components/middle/composer/DropTarget.tsx | 48 + .../middle/composer/EmojiButton.scss | 27 + .../middle/composer/EmojiButton.tsx | 28 + .../middle/composer/EmojiCategory.tsx | 75 + .../middle/composer/EmojiPicker.scss | 55 + .../middle/composer/EmojiPicker.tsx | 232 + .../middle/composer/EmojiTooltip.async.tsx | 15 + .../middle/composer/EmojiTooltip.scss | 37 + .../middle/composer/EmojiTooltip.tsx | 99 + src/components/middle/composer/GifPicker.scss | 15 + src/components/middle/composer/GifPicker.tsx | 88 + .../middle/composer/MentionMenu.async.tsx | 15 + .../middle/composer/MentionMenu.scss | 79 + .../middle/composer/MentionMenu.tsx | 163 + .../middle/composer/MessageInput.tsx | 348 + .../middle/composer/PollModal.async.tsx | 15 + src/components/middle/composer/PollModal.scss | 80 + src/components/middle/composer/PollModal.tsx | 354 + .../middle/composer/StickerPicker.scss | 94 + .../middle/composer/StickerPicker.tsx | 303 + src/components/middle/composer/StickerSet.tsx | 79 + .../middle/composer/StickerSetCover.tsx | 34 + .../composer/StickerSetCoverAnimated.tsx | 48 + .../middle/composer/SymbolMenu.async.tsx | 15 + .../middle/composer/SymbolMenu.scss | 148 + src/components/middle/composer/SymbolMenu.tsx | 195 + .../middle/composer/SymbolMenuFooter.tsx | 90 + .../middle/composer/TextFormatter.async.tsx | 15 + .../middle/composer/TextFormatter.scss | 123 + .../middle/composer/TextFormatter.tsx | 449 + .../middle/composer/WebPagePreview.scss | 41 + .../middle/composer/WebPagePreview.tsx | 84 + .../composer/helpers/buildAttachment.ts | 79 + .../composer/helpers/getMessageTextAsHtml.ts | 23 + .../composer/helpers/parseMessageInput.ts | 161 + .../middle/composer/helpers/searchUserName.ts | 15 + .../middle/composer/helpers/selection.ts | 15 + .../composer/hooks/useClipboardPaste.ts | 56 + .../middle/composer/hooks/useDraft.ts | 107 + .../middle/composer/hooks/useEditing.ts | 58 + .../middle/composer/hooks/useEmojiTooltip.ts | 36 + .../middle/composer/hooks/useMentionMenu.ts | 117 + .../composer/hooks/useVoiceRecording.ts | 96 + .../calculateMiddleFooterTransforms.ts | 83 + .../middle/helpers/getCurrencySign.ts | 17 + .../middle/helpers/groupMessages.ts | 93 + .../middle/helpers/inputFormatters.ts | 17 + src/components/middle/hooks/useStickyDates.ts | 59 + src/components/middle/message/Album.scss | 32 + src/components/middle/message/Album.tsx | 126 + .../middle/message/CommentButton.scss | 201 + .../middle/message/CommentButton.tsx | 114 + src/components/middle/message/Contact.scss | 34 + src/components/middle/message/Contact.tsx | 63 + .../message/ContextMenuContainer.async.tsx | 15 + .../middle/message/ContextMenuContainer.tsx | 320 + .../middle/message/InlineButtons.scss | 47 + .../middle/message/InlineButtons.tsx | 35 + src/components/middle/message/Invoice.scss | 33 + src/components/middle/message/Invoice.tsx | 52 + src/components/middle/message/MentionLink.tsx | 51 + src/components/middle/message/Message.scss | 537 + src/components/middle/message/Message.tsx | 876 + .../middle/message/MessageContextMenu.scss | 9 + .../middle/message/MessageContextMenu.tsx | 145 + .../middle/message/MessageMeta.scss | 110 + src/components/middle/message/MessageMeta.tsx | 50 + src/components/middle/message/Photo.tsx | 176 + src/components/middle/message/Poll.scss | 175 + src/components/middle/message/Poll.tsx | 371 + src/components/middle/message/PollOption.scss | 115 + src/components/middle/message/PollOption.tsx | 105 + src/components/middle/message/RoundVideo.scss | 38 + src/components/middle/message/RoundVideo.tsx | 216 + src/components/middle/message/Sticker.scss | 9 + src/components/middle/message/Sticker.tsx | 108 + src/components/middle/message/Video.tsx | 215 + src/components/middle/message/WebPage.scss | 93 + src/components/middle/message/WebPage.tsx | 101 + .../middle/message/_message-content.scss | 563 + .../message/helpers/buildContentClassName.ts | 106 + .../message/helpers/calculateAlbumLayout.ts | 606 + .../message/helpers/calculateAuthorWidth.ts | 17 + .../middle/message/helpers/copyOptions.ts | 84 + .../message/helpers/getCustomAppendixBg.ts | 47 + .../middle/message/helpers/mediaDimensions.ts | 51 + .../middle/message/hocs/withSelectControl.tsx | 97 + .../message/hooks/useBlurredMediaThumb.ts | 14 + .../middle/message/hooks/useFocusMessage.ts | 33 + src/components/payment/CardInput.scss | 18 + src/components/payment/CardInput.tsx | 79 + src/components/payment/Checkout.scss | 93 + src/components/payment/Checkout.tsx | 111 + src/components/payment/ExpiryInput.tsx | 48 + src/components/payment/PaymentInfo.scss | 20 + src/components/payment/PaymentInfo.tsx | 156 + src/components/payment/PaymentModal.async.tsx | 15 + src/components/payment/PaymentModal.scss | 86 + src/components/payment/PaymentModal.tsx | 515 + src/components/payment/ReceiptModal.async.tsx | 15 + src/components/payment/ReceiptModal.tsx | 152 + src/components/payment/Shipping.scss | 15 + src/components/payment/Shipping.tsx | 58 + src/components/payment/ShippingInfo.scss | 9 + src/components/payment/ShippingInfo.tsx | 203 + src/components/right/ChatExtra.tsx | 62 + src/components/right/GifSearch.async.tsx | 14 + src/components/right/GifSearch.scss | 23 + src/components/right/GifSearch.tsx | 133 + src/components/right/PollAnswerResults.scss | 56 + src/components/right/PollAnswerResults.tsx | 140 + src/components/right/PollResults.async.tsx | 13 + src/components/right/PollResults.scss | 32 + src/components/right/PollResults.tsx | 76 + src/components/right/Profile.scss | 133 + src/components/right/Profile.tsx | 412 + src/components/right/RightColumn.scss | 139 + src/components/right/RightColumn.tsx | 296 + src/components/right/RightHeader.scss | 49 + src/components/right/RightHeader.tsx | 386 + src/components/right/RightSearch.async.tsx | 15 + src/components/right/RightSearch.scss | 12 + src/components/right/RightSearch.tsx | 161 + src/components/right/Statistics.async.tsx | 13 + src/components/right/Statistics.scss | 87 + src/components/right/Statistics.tsx | 93 + src/components/right/StickerSearch.async.tsx | 14 + src/components/right/StickerSearch.scss | 64 + src/components/right/StickerSearch.tsx | 109 + src/components/right/StickerSetResult.tsx | 126 + src/components/right/UserExtra.tsx | 91 + .../right/hooks/useAsyncRendering.ts | 44 + src/components/right/hooks/useProfileState.ts | 110 + .../right/hooks/useProfileViewportIds.ts | 113 + .../right/hooks/useTransitionFixes.ts | 43 + .../right/management/ManageChannel.tsx | 251 + .../management/ManageChatAdministrators.tsx | 130 + .../management/ManageChatPrivacyType.tsx | 175 + .../right/management/ManageDiscussion.tsx | 272 + .../right/management/ManageGroup.tsx | 322 + .../management/ManageGroupAdminRights.tsx | 347 + .../right/management/ManageGroupMembers.tsx | 90 + .../management/ManageGroupPermissions.tsx | 301 + .../management/ManageGroupRecentActions.tsx | 152 + .../management/ManageGroupRemovedUsers.tsx | 106 + .../management/ManageGroupUserPermissions.tsx | 264 + .../ManageGroupUserPermissionsCreate.tsx | 90 + .../right/management/ManageUser.tsx | 215 + .../right/management/Management.async.tsx | 17 + .../right/management/Management.scss | 140 + .../right/management/Management.tsx | 148 + src/components/test/ErrorTest.tsx | 44 + src/components/test/SubTest.tsx | 35 + src/components/test/Test.tsx | 45 + src/components/test/TestNoRedundancy.tsx | 93 + src/components/test/TestOrdered.tsx | 108 + src/components/test/TestPortal.tsx | 42 + src/components/test/testTick.tsx | 14 + src/components/ui/AvatarEditable.scss | 76 + src/components/ui/AvatarEditable.tsx | 83 + src/components/ui/Button.scss | 304 + src/components/ui/Button.tsx | 159 + src/components/ui/Checkbox.scss | 115 + src/components/ui/Checkbox.tsx | 78 + src/components/ui/CheckboxGroup.tsx | 66 + src/components/ui/ConfirmDialog.tsx | 64 + src/components/ui/CropModal.scss | 84 + src/components/ui/CropModal.tsx | 132 + src/components/ui/DropdownMenu.scss | 3 + src/components/ui/DropdownMenu.tsx | 76 + src/components/ui/FloatingActionButton.scss | 15 + src/components/ui/FloatingActionButton.tsx | 49 + src/components/ui/InfiniteScroll.tsx | 207 + src/components/ui/InputText.tsx | 85 + src/components/ui/Link.scss | 7 + src/components/ui/Link.tsx | 30 + src/components/ui/ListItem.scss | 270 + src/components/ui/ListItem.tsx | 174 + src/components/ui/Loading.scss | 10 + src/components/ui/Loading.tsx | 19 + src/components/ui/Menu.scss | 67 + src/components/ui/Menu.tsx | 101 + src/components/ui/MenuItem.scss | 44 + src/components/ui/MenuItem.tsx | 106 + src/components/ui/Modal.scss | 139 + src/components/ui/Modal.tsx | 127 + src/components/ui/Notification.scss | 45 + src/components/ui/Notification.tsx | 81 + src/components/ui/Portal.ts | 35 + src/components/ui/ProgressSpinner.scss | 81 + src/components/ui/ProgressSpinner.tsx | 85 + src/components/ui/Radio.scss | 108 + src/components/ui/Radio.tsx | 61 + src/components/ui/RadioGroup.tsx | 55 + src/components/ui/RangeSlider.scss | 141 + src/components/ui/RangeSlider.tsx | 97 + src/components/ui/ResponsiveHoverButton.tsx | 60 + src/components/ui/RippleEffect.scss | 48 + src/components/ui/RippleEffect.tsx | 61 + src/components/ui/SearchInput.scss | 84 + src/components/ui/SearchInput.tsx | 122 + src/components/ui/Select.tsx | 60 + src/components/ui/ShowMoreButton.scss | 19 + src/components/ui/ShowMoreButton.tsx | 37 + src/components/ui/ShowTransition.tsx | 41 + src/components/ui/SimpleInfiniteScroll.tsx | 81 + src/components/ui/Spinner.scss | 86 + src/components/ui/Spinner.tsx | 21 + src/components/ui/Tab.scss | 83 + src/components/ui/Tab.tsx | 80 + src/components/ui/TabList.scss | 25 + src/components/ui/TabList.tsx | 75 + src/components/ui/Transition.scss | 657 + src/components/ui/Transition.tsx | 259 + src/config.ts | 117 + src/global/cache.ts | 198 + src/global/index.ts | 12 + src/global/initial.ts | 120 + src/global/types.ts | 445 + src/hooks/reducers/useFoldersReducer.ts | 243 + src/hooks/reducers/usePaymentReducer.ts | 229 + src/hooks/reducers/useTwoFaReducer.ts | 61 + src/hooks/useAudioPlayer.ts | 113 + src/hooks/useBackgroundMode.ts | 20 + src/hooks/useBlur.ts | 54 + src/hooks/useBlurSync.ts | 42 + src/hooks/useBuffering.ts | 48 + src/hooks/useCacheBuster.ts | 11 + src/hooks/useChatContextActions.ts | 69 + src/hooks/useContextMenuHandlers.ts | 140 + src/hooks/useContextMenuPosition.ts | 66 + src/hooks/useCurrentOrPrev.ts | 10 + src/hooks/useCustomBackground.ts | 24 + src/hooks/useDebounce.ts | 9 + src/hooks/useEffectWithPrevDeps.ts | 11 + src/hooks/useEnsureMessage.ts | 27 + src/hooks/useFlag.ts | 15 + src/hooks/useFocusAfterAnimation.tsx | 25 + src/hooks/useForceUpdate.ts | 9 + src/hooks/useFullscreen.ts | 99 + src/hooks/useHeavyAnimationCheck.ts | 42 + src/hooks/useHeavyAnimationCheckForVideo.ts | 24 + src/hooks/useHorizontalScroll.ts | 24 + src/hooks/useInfiniteScroll.ts | 117 + src/hooks/useIntersectionObserver.ts | 175 + src/hooks/useKeyboardListNavigation.ts | 54 + src/hooks/useLang.ts | 18 + src/hooks/useLayoutEffectWithPrevDeps.ts | 11 + src/hooks/useMedia.ts | 35 + src/hooks/useMediaWithDownloadProgress.ts | 76 + src/hooks/useModuleLoader.ts | 27 + src/hooks/useMouseInside.ts | 48 + src/hooks/useOnChange.ts | 9 + src/hooks/usePrevForAnimation.ts | 30 + src/hooks/usePrevious.ts | 16 + src/hooks/useReducer.ts | 22 + src/hooks/useShowTransition.ts | 57 + src/hooks/useThrottle.ts | 9 + src/hooks/useThrottledMemo.ts | 25 + src/hooks/useTransitionForMedia.ts | 37 + src/hooks/useVideoCleanup.ts | 21 + src/hooks/useVirtualBackdrop.ts | 41 + src/hooks/useWebpThumbnail.ts | 33 + src/hooks/useWindowSize.ts | 26 + src/index-perf.html | 29 + src/index-perf.tsx | 38 + src/index.html | 28 + src/index.tsx | 40 + src/lib/croppie.ts | 4 + src/lib/fastBlur.js | 168 + src/lib/gramjs/.editorconfig | 12 + src/lib/gramjs/Helpers.js | 348 + src/lib/gramjs/Password.js | 275 + src/lib/gramjs/Utils.js | 687 + src/lib/gramjs/Version.js | 1 + src/lib/gramjs/client/2fa.ts | 121 + src/lib/gramjs/client/TelegramClient.d.ts | 25 + src/lib/gramjs/client/TelegramClient.js | 960 + src/lib/gramjs/client/auth.ts | 324 + src/lib/gramjs/client/downloadFile.ts | 189 + src/lib/gramjs/client/uploadFile.ts | 127 + src/lib/gramjs/crypto/AuthKey.js | 74 + src/lib/gramjs/crypto/CTR.js | 17 + src/lib/gramjs/crypto/Factorizator.js | 79 + src/lib/gramjs/crypto/IGE.js | 37 + src/lib/gramjs/crypto/RSA.js | 57 + src/lib/gramjs/crypto/converters.ts | 55 + src/lib/gramjs/crypto/crypto.js | 124 + src/lib/gramjs/crypto/words.ts | 51 + src/lib/gramjs/errors/Common.js | 148 + src/lib/gramjs/errors/RPCBaseErrors.js | 123 + src/lib/gramjs/errors/RPCErrorList.js | 97 + src/lib/gramjs/errors/index.js | 27 + src/lib/gramjs/events/NewMessage.js | 94 + src/lib/gramjs/events/Raw.js | 21 + src/lib/gramjs/events/common.js | 22 + src/lib/gramjs/events/index.js | 8 + src/lib/gramjs/extensions/AsyncQueue.js | 30 + src/lib/gramjs/extensions/BinaryReader.js | 267 + src/lib/gramjs/extensions/BinaryWriter.js | 15 + src/lib/gramjs/extensions/Logger.js | 105 + src/lib/gramjs/extensions/MessagePacker.js | 112 + .../gramjs/extensions/PromisedWebSockets.js | 130 + src/lib/gramjs/extensions/index.js | 14 + src/lib/gramjs/index.d.ts | 10 + src/lib/gramjs/index.js | 16 + src/lib/gramjs/network/Authenticator.js | 181 + src/lib/gramjs/network/MTProtoPlainSender.js | 75 + src/lib/gramjs/network/MTProtoSender.js | 798 + src/lib/gramjs/network/MTProtoState.js | 237 + src/lib/gramjs/network/RequestState.js | 16 + .../gramjs/network/connection/Connection.js | 172 + .../gramjs/network/connection/TCPAbridged.js | 51 + src/lib/gramjs/network/connection/TCPFull.js | 57 + .../network/connection/TCPObfuscated.js | 78 + src/lib/gramjs/network/connection/index.js | 11 + src/lib/gramjs/network/index.js | 30 + src/lib/gramjs/sessions/Abstract.js | 175 + src/lib/gramjs/sessions/CacheApiSession.js | 21 + .../gramjs/sessions/LocalStorageSession.js | 13 + src/lib/gramjs/sessions/Memory.js | 256 + src/lib/gramjs/sessions/StorageSession.js | 120 + src/lib/gramjs/sessions/StringSession.js | 105 + src/lib/gramjs/sessions/index.js | 11 + src/lib/gramjs/tl/AllTLObjects.js | 19 + src/lib/gramjs/tl/MTProtoRequest.js | 42 + src/lib/gramjs/tl/api.d.ts | 10692 +++++ src/lib/gramjs/tl/api.js | 383 + src/lib/gramjs/tl/apiTl.js | 988 + src/lib/gramjs/tl/core/GZIPPacked.js | 57 + src/lib/gramjs/tl/core/MessageContainer.js | 45 + src/lib/gramjs/tl/core/RPCResult.js | 33 + src/lib/gramjs/tl/core/TLMessage.js | 14 + src/lib/gramjs/tl/core/index.js | 17 + src/lib/gramjs/tl/generateModules.js | 14 + src/lib/gramjs/tl/generationHelpers.js | 356 + src/lib/gramjs/tl/index.js | 12 + src/lib/gramjs/tl/schemaTl.js | 38 + src/lib/gramjs/tl/static/api.reduced.tl | 987 + src/lib/gramjs/tl/static/api.tl | 1552 + src/lib/gramjs/tl/static/schema.reduced.tl | 37 + src/lib/gramjs/tl/static/schema.tl | 113 + src/lib/gramjs/tl/types-generator/generate.js | 57 + src/lib/gramjs/tl/types-generator/template.js | 219 + src/lib/lovely-chart/Axes.js | 173 + src/lib/lovely-chart/Header.js | 64 + src/lib/lovely-chart/LovelyChart.js | 214 + src/lib/lovely-chart/Minimap.js | 276 + src/lib/lovely-chart/Projection.js | 79 + src/lib/lovely-chart/StateManager.js | 222 + src/lib/lovely-chart/Tools.js | 100 + src/lib/lovely-chart/Tooltip.js | 466 + src/lib/lovely-chart/TransitionManager.js | 138 + src/lib/lovely-chart/Zoomer.js | 161 + src/lib/lovely-chart/canvas.js | 22 + src/lib/lovely-chart/captureEvents.js | 79 + src/lib/lovely-chart/constants.js | 62 + src/lib/lovely-chart/data.js | 84 + src/lib/lovely-chart/drawDatasets.js | 229 + src/lib/lovely-chart/format.js | 81 + src/lib/lovely-chart/formulas.js | 56 + src/lib/lovely-chart/hideOnScroll.js | 42 + src/lib/lovely-chart/minifiers.js | 11 + src/lib/lovely-chart/preparePoints.js | 79 + src/lib/lovely-chart/simplify.js | 201 + src/lib/lovely-chart/skin.js | 90 + src/lib/lovely-chart/styles/_animations.scss | 124 + src/lib/lovely-chart/styles/_buttons.scss | 67 + src/lib/lovely-chart/styles/_common.scss | 152 + src/lib/lovely-chart/styles/_header.scss | 47 + src/lib/lovely-chart/styles/_minimap.scss | 142 + src/lib/lovely-chart/styles/_tools.scss | 14 + src/lib/lovely-chart/styles/_tooltip.scss | 99 + src/lib/lovely-chart/styles/_variables.scss | 21 + src/lib/lovely-chart/styles/index.scss | 8 + src/lib/lovely-chart/toggleText.js | 38 + src/lib/lovely-chart/utils.js | 126 + src/lib/punycode.js | 184 + src/lib/rlottie/RLottie.ts | 428 + src/lib/rlottie/__mocks__/RLottie.ts | 2 + src/lib/rlottie/rlottie-wasm.js | 1 + src/lib/rlottie/rlottie-wasm.wasm | Bin 0 -> 317584 bytes src/lib/rlottie/rlottie.worker.ts | 91 + src/lib/teact/dom-events.ts | 167 + src/lib/teact/teact-dom.ts | 474 + src/lib/teact/teact.ts | 578 + src/lib/teact/teactn.tsx | 233 + src/lib/twemojiRegex.js | 15 + src/lib/webp/webp_wasm.js | 1 + src/lib/webp/webp_wasm.wasm | Bin 0 -> 126584 bytes src/lib/webp/webp_wasm.worker.js | 51 + src/modules/actions/all.ts | 33 + src/modules/actions/api/bots.ts | 91 + src/modules/actions/api/chats.ts | 901 + src/modules/actions/api/globalSearch.ts | 177 + src/modules/actions/api/initial.ts | 123 + src/modules/actions/api/localSearch.ts | 174 + src/modules/actions/api/management.ts | 78 + src/modules/actions/api/messages.ts | 855 + src/modules/actions/api/payments.ts | 218 + src/modules/actions/api/settings.ts | 511 + src/modules/actions/api/symbols.ts | 355 + src/modules/actions/api/sync.ts | 293 + src/modules/actions/api/twoFaSettings.ts | 96 + src/modules/actions/api/users.ts | 172 + src/modules/actions/apiUpdaters/chats.ts | 321 + src/modules/actions/apiUpdaters/initial.ts | 153 + src/modules/actions/apiUpdaters/messages.ts | 580 + src/modules/actions/apiUpdaters/misc.ts | 39 + src/modules/actions/apiUpdaters/settings.ts | 15 + src/modules/actions/apiUpdaters/symbols.ts | 15 + .../actions/apiUpdaters/twoFaSettings.ts | 31 + src/modules/actions/apiUpdaters/users.ts | 64 + src/modules/actions/initial.ts | 3 + src/modules/actions/ui/chats.ts | 52 + src/modules/actions/ui/globalSearch.ts | 51 + src/modules/actions/ui/initial.ts | 57 + src/modules/actions/ui/localSearch.ts | 59 + src/modules/actions/ui/messages.ts | 355 + src/modules/actions/ui/misc.ts | 199 + src/modules/actions/ui/payments.ts | 21 + src/modules/actions/ui/settings.ts | 7 + src/modules/actions/ui/stickerSearch.ts | 32 + src/modules/actions/ui/users.ts | 15 + src/modules/helpers/chats.ts | 434 + src/modules/helpers/index.ts | 6 + src/modules/helpers/localSearch.ts | 3 + src/modules/helpers/messageMedia.ts | 367 + src/modules/helpers/messages.ts | 245 + src/modules/helpers/payments.ts | 105 + src/modules/helpers/users.ts | 231 + src/modules/reducers/chats.ts | 155 + src/modules/reducers/globalSearch.ts | 79 + src/modules/reducers/index.ts | 10 + src/modules/reducers/localSearch.ts | 162 + src/modules/reducers/management.ts | 34 + src/modules/reducers/messages.ts | 497 + src/modules/reducers/payments.ts | 131 + src/modules/reducers/settings.ts | 62 + src/modules/reducers/symbols.ts | 131 + src/modules/reducers/twoFaSettings.ts | 14 + src/modules/reducers/users.ts | 94 + src/modules/selectors/chats.ts | 152 + src/modules/selectors/globalSearch.ts | 5 + src/modules/selectors/index.ts | 9 + src/modules/selectors/localSearch.ts | 35 + src/modules/selectors/management.ts | 45 + src/modules/selectors/messages.ts | 688 + src/modules/selectors/payments.ts | 18 + src/modules/selectors/symbols.ts | 45 + src/modules/selectors/ui.ts | 58 + src/modules/selectors/users.ts | 18 + src/serviceWorker.ts | 45 + src/serviceWorker/assetCache.ts | 21 + src/serviceWorker/progressive.ts | 193 + src/styles/Telegram T.json | 3053 ++ src/styles/_common.scss | 96 + src/styles/_forms.scss | 157 + src/styles/_mixins.scss | 6 + src/styles/_spacing.scss | 39 + src/styles/_variables.scss | 197 + src/styles/icons.scss | 399 + src/styles/index.scss | 203 + src/styles/reboot.css | 329 + src/types/index.ts | 270 + src/util/WorkerConnector.ts | 139 + src/util/__mocks__/oggToWav.ts | 4 + src/util/__mocks__/voiceRecording.ts | 2 + src/util/__mocks__/webpToPng.ts | 6 + src/util/animation.ts | 32 + src/util/arePropsShallowEqual.ts | 11 + src/util/audioPlayer.ts | 162 + src/util/buildClassName.ts | 5 + src/util/cacheApi.ts | 68 + src/util/callbacks.ts | 30 + src/util/captureEscKeyListener.ts | 7 + src/util/captureEvents.ts | 170 + src/util/captureKeyboardListeners.ts | 83 + src/util/clipboard.ts | 64 + src/util/colors.ts | 134 + src/util/countries.ts | 209 + src/util/createWorkerInterface.ts | 99 + src/util/cycleRestrict.ts | 3 + src/util/dateFormat.ts | 233 + .../deleteLastCharacterOutsideSelection.ts | 34 + src/util/download.ts | 6 + src/util/emoji.ts | 73 + src/util/environment.ts | 77 + src/util/fastSmoothScroll.ts | 97 + src/util/fastSmoothScrollHorizontal.ts | 45 + src/util/files.ts | 120 + src/util/findInViewport.ts | 34 + src/util/focusEditableElement.ts | 16 + src/util/fonts.ts | 9 + src/util/generateIdFor.ts | 9 + src/util/getElementHasScroll.ts | 3 + src/util/getReadableErrorText.ts | 73 + src/util/handleError.ts | 51 + src/util/insertHtmlInSelection.ts | 18 + src/util/isFullyVisible.ts | 9 + src/util/iteratees.ts | 183 + src/util/langProvider.ts | 162 + src/util/mediaLoader.ts | 206 + src/util/memo.ts | 1 + src/util/moduleLoader.ts | 77 + src/util/oggToWav.ts | 61 + src/util/patchSafariProgressiveAudio.ts | 39 + src/util/phoneNumber.ts | 71 + src/util/requestQuery.ts | 4 + src/util/resetScroll.ts | 15 + src/util/safePlay.ts | 10 + src/util/schedulers.ts | 152 + src/util/scrollLock.ts | 41 + src/util/searchWords.ts | 14 + src/util/setupServiceWorker.ts | 38 + src/util/systemFilesDialog.ts | 23 + src/util/textFormat.ts | 34 + src/util/trapFocus.ts | 39 + src/util/trimText.ts | 9 + src/util/voiceRecording.ts | 118 + src/util/waveform.ts | 51 + src/util/webpToPng.ts | 104 + src/util/windowSize.ts | 30 + tests/assertions.ts | 186 + tests/config.ts | 3 + tests/helpers.ts | 3 + tests/init.js | 61 + tests/initApp.tsx | 24 + tests/messageLayout.test.tsx | 428 + tests/staticFileMock.js | 2 + tsconfig.json | 26 + webpack.config.js | 135 + 1450 files changed, 226262 insertions(+) create mode 100644 .babelrc create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitattributes create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .postcssrc create mode 100644 README.md create mode 100755 deploy/contest.sh create mode 100755 deploy/copy_to_dist.sh create mode 100644 dev/localize/auto-localize.ts create mode 100644 dev/localize/auto-relocalize.ts create mode 100644 dev/localize/en-android.json create mode 100644 dev/localize/en-extra.json create mode 100644 dev/localize/en-ios.json create mode 100644 dev/localize/ru-ios.json create mode 100644 dev/perf/globals/0c46207b-1000.json create mode 100644 jest.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-384x384.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/browserconfig.xml create mode 100644 public/chartDummyData/followers.json create mode 100644 public/chartDummyData/growth.json create mode 100644 public/chartDummyData/interactions.json create mode 100644 public/chartDummyData/languages.json create mode 100644 public/chartDummyData/notifications.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/04.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/05.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/06.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/07.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/08.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/09.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/10.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/11.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/12.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/13.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/14.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/15.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/16.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/17.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/18.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/19.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/20.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/21.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/22.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/23.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/24.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/25.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/26.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/27.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/28.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/29.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/30.json create mode 100644 public/chartDummyData/notifications_zoom/2018-10/31.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/01.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/02.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/03.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/04.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/05.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/06.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/07.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/08.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/09.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/10.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/11.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/12.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/13.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/14.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/15.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/16.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/17.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/18.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/19.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/20.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/21.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/22.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/23.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/24.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/25.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/26.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/27.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/28.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/29.json create mode 100644 public/chartDummyData/notifications_zoom/2018-11/30.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/01.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/02.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/03.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/04.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/05.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/06.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/07.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/08.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/09.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/10.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/11.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/12.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/13.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/14.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/15.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/16.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/17.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/18.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/19.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/20.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/21.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/22.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/23.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/24.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/25.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/26.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/27.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/28.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/29.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/30.json create mode 100644 public/chartDummyData/notifications_zoom/2018-12/31.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/01.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/02.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/03.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/04.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/05.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/06.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/07.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/08.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/09.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/10.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/11.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/12.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/13.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/14.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/15.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/16.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/17.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/18.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/19.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/20.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/21.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/22.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/23.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/24.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/25.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/26.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/27.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/28.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/29.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/30.json create mode 100644 public/chartDummyData/notifications_zoom/2019-01/31.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/01.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/02.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/03.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/04.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/05.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/06.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/07.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/08.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/09.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/10.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/11.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/12.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/13.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/14.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/15.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/16.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/17.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/18.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/19.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/20.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/21.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/22.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/23.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/24.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/25.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/26.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/27.json create mode 100644 public/chartDummyData/notifications_zoom/2019-02/28.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/01.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/02.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/03.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/04.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/05.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/06.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/07.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/08.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/09.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/10.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/11.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/12.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/13.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/14.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/15.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/16.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/17.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/18.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/19.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/20.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/21.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/22.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/23.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/24.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/25.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/26.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/27.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/28.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/29.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/30.json create mode 100644 public/chartDummyData/notifications_zoom/2019-03/31.json create mode 100644 public/chartDummyData/notifications_zoom/2019-04/01.json create mode 100644 public/chartDummyData/views.json create mode 100644 public/chartDummyData/views_zoom/2018-04/07.json create mode 100644 public/chartDummyData/views_zoom/2018-04/08.json create mode 100644 public/chartDummyData/views_zoom/2018-04/09.json create mode 100644 public/chartDummyData/views_zoom/2018-04/10.json create mode 100644 public/chartDummyData/views_zoom/2018-04/11.json create mode 100644 public/chartDummyData/views_zoom/2018-04/12.json create mode 100644 public/chartDummyData/views_zoom/2018-04/13.json create mode 100644 public/chartDummyData/views_zoom/2018-04/14.json create mode 100644 public/chartDummyData/views_zoom/2018-04/15.json create mode 100644 public/chartDummyData/views_zoom/2018-04/16.json create mode 100644 public/chartDummyData/views_zoom/2018-04/17.json create mode 100644 public/chartDummyData/views_zoom/2018-04/18.json create mode 100644 public/chartDummyData/views_zoom/2018-04/19.json create mode 100644 public/chartDummyData/views_zoom/2018-04/20.json create mode 100644 public/chartDummyData/views_zoom/2018-04/21.json create mode 100644 public/chartDummyData/views_zoom/2018-04/22.json create mode 100644 public/chartDummyData/views_zoom/2018-04/23.json create mode 100644 public/chartDummyData/views_zoom/2018-04/24.json create mode 100644 public/chartDummyData/views_zoom/2018-04/25.json create mode 100644 public/chartDummyData/views_zoom/2018-04/26.json create mode 100644 public/chartDummyData/views_zoom/2018-04/27.json create mode 100644 public/chartDummyData/views_zoom/2018-04/28.json create mode 100644 public/chartDummyData/views_zoom/2018-04/29.json create mode 100644 public/chartDummyData/views_zoom/2018-04/30.json create mode 100644 public/chartDummyData/views_zoom/2018-05/01.json create mode 100644 public/chartDummyData/views_zoom/2018-05/02.json create mode 100644 public/chartDummyData/views_zoom/2018-05/03.json create mode 100644 public/chartDummyData/views_zoom/2018-05/04.json create mode 100644 public/chartDummyData/views_zoom/2018-05/05.json create mode 100644 public/chartDummyData/views_zoom/2018-05/06.json create mode 100644 public/chartDummyData/views_zoom/2018-05/07.json create mode 100644 public/chartDummyData/views_zoom/2018-05/08.json create mode 100644 public/chartDummyData/views_zoom/2018-05/09.json create mode 100644 public/chartDummyData/views_zoom/2018-05/10.json create mode 100644 public/chartDummyData/views_zoom/2018-05/11.json create mode 100644 public/chartDummyData/views_zoom/2018-05/12.json create mode 100644 public/chartDummyData/views_zoom/2018-05/13.json create mode 100644 public/chartDummyData/views_zoom/2018-05/14.json create mode 100644 public/chartDummyData/views_zoom/2018-05/15.json create mode 100644 public/chartDummyData/views_zoom/2018-05/16.json create mode 100644 public/chartDummyData/views_zoom/2018-05/17.json create mode 100644 public/chartDummyData/views_zoom/2018-05/18.json create mode 100644 public/chartDummyData/views_zoom/2018-05/19.json create mode 100644 public/chartDummyData/views_zoom/2018-05/20.json create mode 100644 public/chartDummyData/views_zoom/2018-05/21.json create mode 100644 public/chartDummyData/views_zoom/2018-05/22.json create mode 100644 public/chartDummyData/views_zoom/2018-05/23.json create mode 100644 public/chartDummyData/views_zoom/2018-05/24.json create mode 100644 public/chartDummyData/views_zoom/2018-05/25.json create mode 100644 public/chartDummyData/views_zoom/2018-05/26.json create mode 100644 public/chartDummyData/views_zoom/2018-05/27.json create mode 100644 public/chartDummyData/views_zoom/2018-05/28.json create mode 100644 public/chartDummyData/views_zoom/2018-05/29.json create mode 100644 public/chartDummyData/views_zoom/2018-05/30.json create mode 100644 public/chartDummyData/views_zoom/2018-05/31.json create mode 100644 public/chartDummyData/views_zoom/2018-06/01.json create mode 100644 public/chartDummyData/views_zoom/2018-06/02.json create mode 100644 public/chartDummyData/views_zoom/2018-06/03.json create mode 100644 public/chartDummyData/views_zoom/2018-06/04.json create mode 100644 public/chartDummyData/views_zoom/2018-06/05.json create mode 100644 public/chartDummyData/views_zoom/2018-06/06.json create mode 100644 public/chartDummyData/views_zoom/2018-06/07.json create mode 100644 public/chartDummyData/views_zoom/2018-06/08.json create mode 100644 public/chartDummyData/views_zoom/2018-06/09.json create mode 100644 public/chartDummyData/views_zoom/2018-06/10.json create mode 100644 public/chartDummyData/views_zoom/2018-06/11.json create mode 100644 public/chartDummyData/views_zoom/2018-06/12.json create mode 100644 public/chartDummyData/views_zoom/2018-06/13.json create mode 100644 public/chartDummyData/views_zoom/2018-06/14.json create mode 100644 public/chartDummyData/views_zoom/2018-06/15.json create mode 100644 public/chartDummyData/views_zoom/2018-06/16.json create mode 100644 public/chartDummyData/views_zoom/2018-06/17.json create mode 100644 public/chartDummyData/views_zoom/2018-06/18.json create mode 100644 public/chartDummyData/views_zoom/2018-06/19.json create mode 100644 public/chartDummyData/views_zoom/2018-06/20.json create mode 100644 public/chartDummyData/views_zoom/2018-06/21.json create mode 100644 public/chartDummyData/views_zoom/2018-06/22.json create mode 100644 public/chartDummyData/views_zoom/2018-06/23.json create mode 100644 public/chartDummyData/views_zoom/2018-06/24.json create mode 100644 public/chartDummyData/views_zoom/2018-06/25.json create mode 100644 public/chartDummyData/views_zoom/2018-06/26.json create mode 100644 public/chartDummyData/views_zoom/2018-06/27.json create mode 100644 public/chartDummyData/views_zoom/2018-06/28.json create mode 100644 public/chartDummyData/views_zoom/2018-06/29.json create mode 100644 public/chartDummyData/views_zoom/2018-06/30.json create mode 100644 public/chartDummyData/views_zoom/2018-07/01.json create mode 100644 public/chartDummyData/views_zoom/2018-07/02.json create mode 100644 public/chartDummyData/views_zoom/2018-07/03.json create mode 100644 public/chartDummyData/views_zoom/2018-07/04.json create mode 100644 public/chartDummyData/views_zoom/2018-07/05.json create mode 100644 public/chartDummyData/views_zoom/2018-07/06.json create mode 100644 public/chartDummyData/views_zoom/2018-07/07.json create mode 100644 public/chartDummyData/views_zoom/2018-07/08.json create mode 100644 public/chartDummyData/views_zoom/2018-07/09.json create mode 100644 public/chartDummyData/views_zoom/2018-07/10.json create mode 100644 public/chartDummyData/views_zoom/2018-07/11.json create mode 100644 public/chartDummyData/views_zoom/2018-07/12.json create mode 100644 public/chartDummyData/views_zoom/2018-07/13.json create mode 100644 public/chartDummyData/views_zoom/2018-07/14.json create mode 100644 public/chartDummyData/views_zoom/2018-07/15.json create mode 100644 public/chartDummyData/views_zoom/2018-07/16.json create mode 100644 public/chartDummyData/views_zoom/2018-07/17.json create mode 100644 public/chartDummyData/views_zoom/2018-07/18.json create mode 100644 public/chartDummyData/views_zoom/2018-07/19.json create mode 100644 public/chartDummyData/views_zoom/2018-07/20.json create mode 100644 public/chartDummyData/views_zoom/2018-07/21.json create mode 100644 public/chartDummyData/views_zoom/2018-07/22.json create mode 100644 public/chartDummyData/views_zoom/2018-07/23.json create mode 100644 public/chartDummyData/views_zoom/2018-07/24.json create mode 100644 public/chartDummyData/views_zoom/2018-07/25.json create mode 100644 public/chartDummyData/views_zoom/2018-07/26.json create mode 100644 public/chartDummyData/views_zoom/2018-07/27.json create mode 100644 public/chartDummyData/views_zoom/2018-07/28.json create mode 100644 public/chartDummyData/views_zoom/2018-07/29.json create mode 100644 public/chartDummyData/views_zoom/2018-07/30.json create mode 100644 public/chartDummyData/views_zoom/2018-07/31.json create mode 100644 public/chartDummyData/views_zoom/2018-08/01.json create mode 100644 public/chartDummyData/views_zoom/2018-08/02.json create mode 100644 public/chartDummyData/views_zoom/2018-08/03.json create mode 100644 public/chartDummyData/views_zoom/2018-08/04.json create mode 100644 public/chartDummyData/views_zoom/2018-08/05.json create mode 100644 public/chartDummyData/views_zoom/2018-08/06.json create mode 100644 public/chartDummyData/views_zoom/2018-08/07.json create mode 100644 public/chartDummyData/views_zoom/2018-08/08.json create mode 100644 public/chartDummyData/views_zoom/2018-08/09.json create mode 100644 public/chartDummyData/views_zoom/2018-08/10.json create mode 100644 public/chartDummyData/views_zoom/2018-08/11.json create mode 100644 public/chartDummyData/views_zoom/2018-08/12.json create mode 100644 public/chartDummyData/views_zoom/2018-08/13.json create mode 100644 public/chartDummyData/views_zoom/2018-08/14.json create mode 100644 public/chartDummyData/views_zoom/2018-08/15.json create mode 100644 public/chartDummyData/views_zoom/2018-08/16.json create mode 100644 public/chartDummyData/views_zoom/2018-08/17.json create mode 100644 public/chartDummyData/views_zoom/2018-08/18.json create mode 100644 public/chartDummyData/views_zoom/2018-08/19.json create mode 100644 public/chartDummyData/views_zoom/2018-08/20.json create mode 100644 public/chartDummyData/views_zoom/2018-08/21.json create mode 100644 public/chartDummyData/views_zoom/2018-08/22.json create mode 100644 public/chartDummyData/views_zoom/2018-08/23.json create mode 100644 public/chartDummyData/views_zoom/2018-08/24.json create mode 100644 public/chartDummyData/views_zoom/2018-08/25.json create mode 100644 public/chartDummyData/views_zoom/2018-08/26.json create mode 100644 public/chartDummyData/views_zoom/2018-08/27.json create mode 100644 public/chartDummyData/views_zoom/2018-08/28.json create mode 100644 public/chartDummyData/views_zoom/2018-08/29.json create mode 100644 public/chartDummyData/views_zoom/2018-08/30.json create mode 100644 public/chartDummyData/views_zoom/2018-08/31.json create mode 100644 public/chartDummyData/views_zoom/2018-09/01.json create mode 100644 public/chartDummyData/views_zoom/2018-09/02.json create mode 100644 public/chartDummyData/views_zoom/2018-09/03.json create mode 100644 public/chartDummyData/views_zoom/2018-09/04.json create mode 100644 public/chartDummyData/views_zoom/2018-09/05.json create mode 100644 public/chartDummyData/views_zoom/2018-09/06.json create mode 100644 public/chartDummyData/views_zoom/2018-09/07.json create mode 100644 public/chartDummyData/views_zoom/2018-09/08.json create mode 100644 public/chartDummyData/views_zoom/2018-09/09.json create mode 100644 public/chartDummyData/views_zoom/2018-09/10.json create mode 100644 public/chartDummyData/views_zoom/2018-09/11.json create mode 100644 public/chartDummyData/views_zoom/2018-09/12.json create mode 100644 public/chartDummyData/views_zoom/2018-09/13.json create mode 100644 public/chartDummyData/views_zoom/2018-09/14.json create mode 100644 public/chartDummyData/views_zoom/2018-09/15.json create mode 100644 public/chartDummyData/views_zoom/2018-09/16.json create mode 100644 public/chartDummyData/views_zoom/2018-09/17.json create mode 100644 public/chartDummyData/views_zoom/2018-09/18.json create mode 100644 public/chartDummyData/views_zoom/2018-09/19.json create mode 100644 public/chartDummyData/views_zoom/2018-09/20.json create mode 100644 public/chartDummyData/views_zoom/2018-09/21.json create mode 100644 public/chartDummyData/views_zoom/2018-09/22.json create mode 100644 public/chartDummyData/views_zoom/2018-09/23.json create mode 100644 public/chartDummyData/views_zoom/2018-09/24.json create mode 100644 public/chartDummyData/views_zoom/2018-09/25.json create mode 100644 public/chartDummyData/views_zoom/2018-09/26.json create mode 100644 public/chartDummyData/views_zoom/2018-09/27.json create mode 100644 public/chartDummyData/views_zoom/2018-09/28.json create mode 100644 public/chartDummyData/views_zoom/2018-09/29.json create mode 100644 public/chartDummyData/views_zoom/2018-09/30.json create mode 100644 public/chartDummyData/views_zoom/2018-10/01.json create mode 100644 public/chartDummyData/views_zoom/2018-10/02.json create mode 100644 public/chartDummyData/views_zoom/2018-10/03.json create mode 100644 public/chartDummyData/views_zoom/2018-10/04.json create mode 100644 public/chartDummyData/views_zoom/2018-10/05.json create mode 100644 public/chartDummyData/views_zoom/2018-10/06.json create mode 100644 public/chartDummyData/views_zoom/2018-10/07.json create mode 100644 public/chartDummyData/views_zoom/2018-10/08.json create mode 100644 public/chartDummyData/views_zoom/2018-10/09.json create mode 100644 public/chartDummyData/views_zoom/2018-10/10.json create mode 100644 public/chartDummyData/views_zoom/2018-10/11.json create mode 100644 public/chartDummyData/views_zoom/2018-10/12.json create mode 100644 public/chartDummyData/views_zoom/2018-10/13.json create mode 100644 public/chartDummyData/views_zoom/2018-10/14.json create mode 100644 public/chartDummyData/views_zoom/2018-10/15.json create mode 100644 public/chartDummyData/views_zoom/2018-10/16.json create mode 100644 public/chartDummyData/views_zoom/2018-10/17.json create mode 100644 public/chartDummyData/views_zoom/2018-10/18.json create mode 100644 public/chartDummyData/views_zoom/2018-10/19.json create mode 100644 public/chartDummyData/views_zoom/2018-10/20.json create mode 100644 public/chartDummyData/views_zoom/2018-10/21.json create mode 100644 public/chartDummyData/views_zoom/2018-10/22.json create mode 100644 public/chartDummyData/views_zoom/2018-10/23.json create mode 100644 public/chartDummyData/views_zoom/2018-10/24.json create mode 100644 public/chartDummyData/views_zoom/2018-10/25.json create mode 100644 public/chartDummyData/views_zoom/2018-10/26.json create mode 100644 public/chartDummyData/views_zoom/2018-10/27.json create mode 100644 public/chartDummyData/views_zoom/2018-10/28.json create mode 100644 public/chartDummyData/views_zoom/2018-10/29.json create mode 100644 public/chartDummyData/views_zoom/2018-10/30.json create mode 100644 public/chartDummyData/views_zoom/2018-10/31.json create mode 100644 public/chartDummyData/views_zoom/2018-11/01.json create mode 100644 public/chartDummyData/views_zoom/2018-11/02.json create mode 100644 public/chartDummyData/views_zoom/2018-11/03.json create mode 100644 public/chartDummyData/views_zoom/2018-11/04.json create mode 100644 public/chartDummyData/views_zoom/2018-11/05.json create mode 100644 public/chartDummyData/views_zoom/2018-11/06.json create mode 100644 public/chartDummyData/views_zoom/2018-11/07.json create mode 100644 public/chartDummyData/views_zoom/2018-11/08.json create mode 100644 public/chartDummyData/views_zoom/2018-11/09.json create mode 100644 public/chartDummyData/views_zoom/2018-11/10.json create mode 100644 public/chartDummyData/views_zoom/2018-11/11.json create mode 100644 public/chartDummyData/views_zoom/2018-11/12.json create mode 100644 public/chartDummyData/views_zoom/2018-11/13.json create mode 100644 public/chartDummyData/views_zoom/2018-11/14.json create mode 100644 public/chartDummyData/views_zoom/2018-11/15.json create mode 100644 public/chartDummyData/views_zoom/2018-11/16.json create mode 100644 public/chartDummyData/views_zoom/2018-11/17.json create mode 100644 public/chartDummyData/views_zoom/2018-11/18.json create mode 100644 public/chartDummyData/views_zoom/2018-11/19.json create mode 100644 public/chartDummyData/views_zoom/2018-11/20.json create mode 100644 public/chartDummyData/views_zoom/2018-11/21.json create mode 100644 public/chartDummyData/views_zoom/2018-11/22.json create mode 100644 public/chartDummyData/views_zoom/2018-11/23.json create mode 100644 public/chartDummyData/views_zoom/2018-11/24.json create mode 100644 public/chartDummyData/views_zoom/2018-11/25.json create mode 100644 public/chartDummyData/views_zoom/2018-11/26.json create mode 100644 public/chartDummyData/views_zoom/2018-11/27.json create mode 100644 public/chartDummyData/views_zoom/2018-11/28.json create mode 100644 public/chartDummyData/views_zoom/2018-11/29.json create mode 100644 public/chartDummyData/views_zoom/2018-11/30.json create mode 100644 public/chartDummyData/views_zoom/2018-12/01.json create mode 100644 public/chartDummyData/views_zoom/2018-12/02.json create mode 100644 public/chartDummyData/views_zoom/2018-12/03.json create mode 100644 public/chartDummyData/views_zoom/2018-12/04.json create mode 100644 public/chartDummyData/views_zoom/2018-12/05.json create mode 100644 public/chartDummyData/views_zoom/2018-12/06.json create mode 100644 public/chartDummyData/views_zoom/2018-12/07.json create mode 100644 public/chartDummyData/views_zoom/2018-12/08.json create mode 100644 public/chartDummyData/views_zoom/2018-12/09.json create mode 100644 public/chartDummyData/views_zoom/2018-12/10.json create mode 100644 public/chartDummyData/views_zoom/2018-12/11.json create mode 100644 public/chartDummyData/views_zoom/2018-12/12.json create mode 100644 public/chartDummyData/views_zoom/2018-12/13.json create mode 100644 public/chartDummyData/views_zoom/2018-12/14.json create mode 100644 public/chartDummyData/views_zoom/2018-12/15.json create mode 100644 public/chartDummyData/views_zoom/2018-12/16.json create mode 100644 public/chartDummyData/views_zoom/2018-12/17.json create mode 100644 public/chartDummyData/views_zoom/2018-12/18.json create mode 100644 public/chartDummyData/views_zoom/2018-12/19.json create mode 100644 public/chartDummyData/views_zoom/2018-12/20.json create mode 100644 public/chartDummyData/views_zoom/2018-12/21.json create mode 100644 public/chartDummyData/views_zoom/2018-12/22.json create mode 100644 public/chartDummyData/views_zoom/2018-12/23.json create mode 100644 public/chartDummyData/views_zoom/2018-12/24.json create mode 100644 public/chartDummyData/views_zoom/2018-12/25.json create mode 100644 public/chartDummyData/views_zoom/2018-12/26.json create mode 100644 public/chartDummyData/views_zoom/2018-12/27.json create mode 100644 public/chartDummyData/views_zoom/2018-12/28.json create mode 100644 public/chartDummyData/views_zoom/2018-12/29.json create mode 100644 public/chartDummyData/views_zoom/2018-12/30.json create mode 100644 public/chartDummyData/views_zoom/2018-12/31.json create mode 100644 public/chartDummyData/views_zoom/2019-01/01.json create mode 100644 public/chartDummyData/views_zoom/2019-01/02.json create mode 100644 public/chartDummyData/views_zoom/2019-01/03.json create mode 100644 public/chartDummyData/views_zoom/2019-01/04.json create mode 100644 public/chartDummyData/views_zoom/2019-01/05.json create mode 100644 public/chartDummyData/views_zoom/2019-01/06.json create mode 100644 public/chartDummyData/views_zoom/2019-01/07.json create mode 100644 public/chartDummyData/views_zoom/2019-01/08.json create mode 100644 public/chartDummyData/views_zoom/2019-01/09.json create mode 100644 public/chartDummyData/views_zoom/2019-01/10.json create mode 100644 public/chartDummyData/views_zoom/2019-01/11.json create mode 100644 public/chartDummyData/views_zoom/2019-01/12.json create mode 100644 public/chartDummyData/views_zoom/2019-01/13.json create mode 100644 public/chartDummyData/views_zoom/2019-01/14.json create mode 100644 public/chartDummyData/views_zoom/2019-01/15.json create mode 100644 public/chartDummyData/views_zoom/2019-01/16.json create mode 100644 public/chartDummyData/views_zoom/2019-01/17.json create mode 100644 public/chartDummyData/views_zoom/2019-01/18.json create mode 100644 public/chartDummyData/views_zoom/2019-01/19.json create mode 100644 public/chartDummyData/views_zoom/2019-01/20.json create mode 100644 public/chartDummyData/views_zoom/2019-01/21.json create mode 100644 public/chartDummyData/views_zoom/2019-01/22.json create mode 100644 public/chartDummyData/views_zoom/2019-01/23.json create mode 100644 public/chartDummyData/views_zoom/2019-01/24.json create mode 100644 public/chartDummyData/views_zoom/2019-01/25.json create mode 100644 public/chartDummyData/views_zoom/2019-01/26.json create mode 100644 public/chartDummyData/views_zoom/2019-01/27.json create mode 100644 public/chartDummyData/views_zoom/2019-01/28.json create mode 100644 public/chartDummyData/views_zoom/2019-01/29.json create mode 100644 public/chartDummyData/views_zoom/2019-01/30.json create mode 100644 public/chartDummyData/views_zoom/2019-01/31.json create mode 100644 public/chartDummyData/views_zoom/2019-02/01.json create mode 100644 public/chartDummyData/views_zoom/2019-02/02.json create mode 100644 public/chartDummyData/views_zoom/2019-02/03.json create mode 100644 public/chartDummyData/views_zoom/2019-02/04.json create mode 100644 public/chartDummyData/views_zoom/2019-02/05.json create mode 100644 public/chartDummyData/views_zoom/2019-02/06.json create mode 100644 public/chartDummyData/views_zoom/2019-02/07.json create mode 100644 public/chartDummyData/views_zoom/2019-02/08.json create mode 100644 public/chartDummyData/views_zoom/2019-02/09.json create mode 100644 public/chartDummyData/views_zoom/2019-02/10.json create mode 100644 public/chartDummyData/views_zoom/2019-02/11.json create mode 100644 public/chartDummyData/views_zoom/2019-02/12.json create mode 100644 public/chartDummyData/views_zoom/2019-02/13.json create mode 100644 public/chartDummyData/views_zoom/2019-02/14.json create mode 100644 public/chartDummyData/views_zoom/2019-02/15.json create mode 100644 public/chartDummyData/views_zoom/2019-02/16.json create mode 100644 public/chartDummyData/views_zoom/2019-02/17.json create mode 100644 public/chartDummyData/views_zoom/2019-02/18.json create mode 100644 public/chartDummyData/views_zoom/2019-02/19.json create mode 100644 public/chartDummyData/views_zoom/2019-02/20.json create mode 100644 public/chartDummyData/views_zoom/2019-02/21.json create mode 100644 public/chartDummyData/views_zoom/2019-02/22.json create mode 100644 public/chartDummyData/views_zoom/2019-02/23.json create mode 100644 public/chartDummyData/views_zoom/2019-02/24.json create mode 100644 public/chartDummyData/views_zoom/2019-02/25.json create mode 100644 public/chartDummyData/views_zoom/2019-02/26.json create mode 100644 public/chartDummyData/views_zoom/2019-02/27.json create mode 100644 public/chartDummyData/views_zoom/2019-02/28.json create mode 100644 public/chartDummyData/views_zoom/2019-03/01.json create mode 100644 public/chartDummyData/views_zoom/2019-03/02.json create mode 100644 public/chartDummyData/views_zoom/2019-03/03.json create mode 100644 public/chartDummyData/views_zoom/2019-03/04.json create mode 100644 public/chartDummyData/views_zoom/2019-03/05.json create mode 100644 public/chartDummyData/views_zoom/2019-03/06.json create mode 100644 public/chartDummyData/views_zoom/2019-03/07.json create mode 100644 public/chartDummyData/views_zoom/2019-03/08.json create mode 100644 public/chartDummyData/views_zoom/2019-03/09.json create mode 100644 public/chartDummyData/views_zoom/2019-03/10.json create mode 100644 public/chartDummyData/views_zoom/2019-03/11.json create mode 100644 public/chartDummyData/views_zoom/2019-03/12.json create mode 100644 public/chartDummyData/views_zoom/2019-03/13.json create mode 100644 public/chartDummyData/views_zoom/2019-03/14.json create mode 100644 public/chartDummyData/views_zoom/2019-03/15.json create mode 100644 public/chartDummyData/views_zoom/2019-03/16.json create mode 100644 public/chartDummyData/views_zoom/2019-03/17.json create mode 100644 public/chartDummyData/views_zoom/2019-03/18.json create mode 100644 public/chartDummyData/views_zoom/2019-03/19.json create mode 100644 public/chartDummyData/views_zoom/2019-03/20.json create mode 100644 public/chartDummyData/views_zoom/2019-03/21.json create mode 100644 public/chartDummyData/views_zoom/2019-03/22.json create mode 100644 public/chartDummyData/views_zoom/2019-03/23.json create mode 100644 public/chartDummyData/views_zoom/2019-03/24.json create mode 100644 public/chartDummyData/views_zoom/2019-03/25.json create mode 100644 public/chartDummyData/views_zoom/2019-03/26.json create mode 100644 public/chartDummyData/views_zoom/2019-03/27.json create mode 100644 public/chartDummyData/views_zoom/2019-03/28.json create mode 100644 public/chartDummyData/views_zoom/2019-03/29.json create mode 100644 public/chartDummyData/views_zoom/2019-03/30.json create mode 100644 public/chartDummyData/views_zoom/2019-03/31.json create mode 100644 public/chartDummyData/views_zoom/2019-04/01.json create mode 100644 public/chartDummyData/views_zoom/2019-04/02.json create mode 100644 public/chartDummyData/views_zoom/2019-04/03.json create mode 100644 public/chartDummyData/views_zoom/2019-04/04.json create mode 100644 public/chartDummyData/views_zoom/2019-04/05.json create mode 100644 public/chartDummyData/views_zoom/2019-04/06.json create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/mstile-150x150.png create mode 100644 public/safari-pinned-tab.svg create mode 100644 public/site.webmanifest create mode 100644 src/@types/global.d.ts create mode 100644 src/@types/teact.d.ts create mode 100644 src/App.tsx create mode 100644 src/api/gramjs/apiBuilders/chats.ts create mode 100644 src/api/gramjs/apiBuilders/common.ts create mode 100644 src/api/gramjs/apiBuilders/helpers.ts create mode 100644 src/api/gramjs/apiBuilders/messages.ts create mode 100644 src/api/gramjs/apiBuilders/misc.ts create mode 100644 src/api/gramjs/apiBuilders/pathBytesToSvg.ts create mode 100644 src/api/gramjs/apiBuilders/payments.ts create mode 100644 src/api/gramjs/apiBuilders/peers.ts create mode 100644 src/api/gramjs/apiBuilders/symbols.ts create mode 100644 src/api/gramjs/apiBuilders/users.ts create mode 100644 src/api/gramjs/gramjsBuilders/index.ts create mode 100644 src/api/gramjs/helpers.ts create mode 100644 src/api/gramjs/index.ts create mode 100644 src/api/gramjs/localDb.ts create mode 100644 src/api/gramjs/methods/auth.ts create mode 100644 src/api/gramjs/methods/bots.ts create mode 100644 src/api/gramjs/methods/chats.ts create mode 100644 src/api/gramjs/methods/client.ts create mode 100644 src/api/gramjs/methods/index.ts create mode 100644 src/api/gramjs/methods/management.ts create mode 100644 src/api/gramjs/methods/media.ts create mode 100644 src/api/gramjs/methods/messages.ts create mode 100644 src/api/gramjs/methods/payments.ts create mode 100644 src/api/gramjs/methods/settings.ts create mode 100644 src/api/gramjs/methods/symbols.ts create mode 100644 src/api/gramjs/methods/twoFaSettings.ts create mode 100644 src/api/gramjs/methods/types.ts create mode 100644 src/api/gramjs/methods/users.ts create mode 100644 src/api/gramjs/provider.ts create mode 100644 src/api/gramjs/updater.ts create mode 100644 src/api/gramjs/worker/__mocks__/provider.ts create mode 100644 src/api/gramjs/worker/provider.ts create mode 100644 src/api/gramjs/worker/types.ts create mode 100644 src/api/gramjs/worker/worker.ts create mode 100644 src/api/types/chats.ts create mode 100644 src/api/types/index.ts create mode 100644 src/api/types/media.ts create mode 100644 src/api/types/messages.ts create mode 100644 src/api/types/payments.ts create mode 100644 src/api/types/settings.ts create mode 100644 src/api/types/updates.ts create mode 100644 src/api/types/users.ts create mode 100644 src/assets/DiscussionGroupsDucks.tgs create mode 100644 src/assets/FoldersAll.tgs create mode 100644 src/assets/FoldersNew.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyClose.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyCloseAndPeek.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyCloseAndPeekToIdle.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyIdle.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyPeek.tgs create mode 100644 src/assets/TwoFactorSetupMonkeyTracking.tgs create mode 100644 src/assets/auth-caption.png create mode 100644 src/assets/chat-bg-mobile.jpg create mode 100644 src/assets/chat-bg.jpg create mode 100644 src/assets/chat-bubble-green.svg create mode 100644 src/assets/chat-bubble-white.svg create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 create mode 100644 src/assets/fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 create mode 100755 src/assets/fonts/icomoon.woff create mode 100644 src/assets/fonts/icomoon.woff2 create mode 100644 src/assets/fonts/roboto.css create mode 100644 src/assets/icon-verified.svg create mode 100644 src/assets/lang/en-extra.json create mode 100644 src/assets/lang/es-extra.json create mode 100644 src/assets/lang/it-extra.json create mode 100644 src/assets/lang/pl-extra.json create mode 100644 src/assets/lang/ru-extra.json create mode 100644 src/assets/mastercard.svg create mode 100644 src/assets/media_navigation_next.svg create mode 100644 src/assets/media_navigation_previous.svg create mode 100644 src/assets/monkey.svg create mode 100644 src/assets/stripe-logo.png create mode 100644 src/assets/telegram-logo.svg create mode 100644 src/assets/visa.svg create mode 100644 src/bundles/auth.ts create mode 100644 src/bundles/extra.ts create mode 100644 src/bundles/main.ts create mode 100644 src/components/auth/Auth.scss create mode 100644 src/components/auth/Auth.tsx create mode 100644 src/components/auth/AuthCode.async.tsx create mode 100644 src/components/auth/AuthCode.tsx create mode 100644 src/components/auth/AuthPassword.async.tsx create mode 100644 src/components/auth/AuthPassword.tsx create mode 100644 src/components/auth/AuthPhoneNumber.tsx create mode 100644 src/components/auth/AuthQrCode.async.tsx create mode 100644 src/components/auth/AuthQrCode.tsx create mode 100644 src/components/auth/AuthRegister.async.tsx create mode 100644 src/components/auth/AuthRegister.tsx create mode 100644 src/components/auth/CountryCodeInput.scss create mode 100644 src/components/auth/CountryCodeInput.tsx create mode 100644 src/components/common/AnimatedEmoji.scss create mode 100644 src/components/common/AnimatedEmoji.tsx create mode 100644 src/components/common/AnimatedSticker.tsx create mode 100644 src/components/common/Audio.scss create mode 100644 src/components/common/Audio.tsx create mode 100644 src/components/common/Avatar.scss create mode 100644 src/components/common/Avatar.tsx create mode 100644 src/components/common/CalendarModal.async.tsx create mode 100644 src/components/common/CalendarModal.scss create mode 100644 src/components/common/CalendarModal.tsx create mode 100644 src/components/common/ChatLink.tsx create mode 100644 src/components/common/DeleteChatModal.scss create mode 100644 src/components/common/DeleteChatModal.tsx create mode 100644 src/components/common/DeleteMessageModal.async.tsx create mode 100644 src/components/common/DeleteMessageModal.tsx create mode 100644 src/components/common/Document.tsx create mode 100644 src/components/common/EmbeddedMessage.scss create mode 100644 src/components/common/EmbeddedMessage.tsx create mode 100644 src/components/common/File.scss create mode 100644 src/components/common/File.tsx create mode 100644 src/components/common/GifButton.scss create mode 100644 src/components/common/GifButton.tsx create mode 100644 src/components/common/GroupChatInfo.tsx create mode 100644 src/components/common/LastMessageMeta.scss create mode 100644 src/components/common/LastMessageMeta.tsx create mode 100644 src/components/common/Media.scss create mode 100644 src/components/common/Media.tsx create mode 100644 src/components/common/MessageLink.tsx create mode 100644 src/components/common/MessageOutgoingStatus.scss create mode 100644 src/components/common/MessageOutgoingStatus.tsx create mode 100644 src/components/common/NothingFound.scss create mode 100644 src/components/common/NothingFound.tsx create mode 100644 src/components/common/PasswordForm.tsx create mode 100644 src/components/common/PasswordMonkey.scss create mode 100644 src/components/common/PasswordMonkey.tsx create mode 100644 src/components/common/Picker.scss create mode 100644 src/components/common/Picker.tsx create mode 100644 src/components/common/PickerSelectedItem.scss create mode 100644 src/components/common/PickerSelectedItem.tsx create mode 100644 src/components/common/PinMessageModal.async.tsx create mode 100644 src/components/common/PinMessageModal.tsx create mode 100644 src/components/common/PrivateChatInfo.tsx create mode 100644 src/components/common/SafeLink.tsx create mode 100644 src/components/common/StickerButton.scss create mode 100644 src/components/common/StickerButton.tsx create mode 100644 src/components/common/StickerSetModal.async.tsx create mode 100644 src/components/common/StickerSetModal.scss create mode 100644 src/components/common/StickerSetModal.tsx create mode 100644 src/components/common/TrackingMonkey.tsx create mode 100644 src/components/common/TypingStatus.scss create mode 100644 src/components/common/TypingStatus.tsx create mode 100644 src/components/common/UiLoader.scss create mode 100644 src/components/common/UiLoader.tsx create mode 100644 src/components/common/UnpinAllMessagesModal.async.tsx create mode 100644 src/components/common/UnpinAllMessagesModal.tsx create mode 100644 src/components/common/UserLink.tsx create mode 100644 src/components/common/UsernameInput.tsx create mode 100644 src/components/common/VerifiedIcon.scss create mode 100644 src/components/common/VerifiedIcon.tsx create mode 100644 src/components/common/WebLink.scss create mode 100644 src/components/common/WebLink.tsx create mode 100644 src/components/common/helpers/animatedAssets.ts create mode 100644 src/components/common/helpers/detectCardType.ts create mode 100644 src/components/common/helpers/documentInfo.ts create mode 100644 src/components/common/helpers/mediaDimensions.ts create mode 100644 src/components/common/helpers/parseEmojiOnlyString.ts create mode 100644 src/components/common/helpers/renderActionMessageText.tsx create mode 100644 src/components/common/helpers/renderMessageText.tsx create mode 100644 src/components/common/helpers/renderText.tsx create mode 100644 src/components/common/helpers/waveform.ts create mode 100644 src/components/left/ArchivedChats.async.tsx create mode 100644 src/components/left/ArchivedChats.scss create mode 100644 src/components/left/ArchivedChats.tsx create mode 100644 src/components/left/ConnectionState.scss create mode 100644 src/components/left/ConnectionState.tsx create mode 100644 src/components/left/LeftColumn.scss create mode 100644 src/components/left/LeftColumn.tsx create mode 100644 src/components/left/NewChatButton.scss create mode 100644 src/components/left/NewChatButton.tsx create mode 100644 src/components/left/main/Badge.scss create mode 100644 src/components/left/main/Badge.tsx create mode 100644 src/components/left/main/Chat.scss create mode 100644 src/components/left/main/Chat.tsx create mode 100644 src/components/left/main/ChatFolders.tsx create mode 100644 src/components/left/main/ChatList.tsx create mode 100644 src/components/left/main/ContactList.async.tsx create mode 100644 src/components/left/main/ContactList.tsx create mode 100644 src/components/left/main/LeftMain.scss create mode 100644 src/components/left/main/LeftMain.tsx create mode 100644 src/components/left/main/LeftMainHeader.scss create mode 100644 src/components/left/main/LeftMainHeader.tsx create mode 100644 src/components/left/main/hooks/index.ts create mode 100644 src/components/left/main/hooks/useChatAnimationType.ts create mode 100644 src/components/left/newChat/NewChat.async.tsx create mode 100644 src/components/left/newChat/NewChat.scss create mode 100644 src/components/left/newChat/NewChat.tsx create mode 100644 src/components/left/newChat/NewChatStep1.async.tsx create mode 100644 src/components/left/newChat/NewChatStep1.tsx create mode 100644 src/components/left/newChat/NewChatStep2.async.tsx create mode 100644 src/components/left/newChat/NewChatStep2.tsx create mode 100644 src/components/left/search/AudioResults.tsx create mode 100644 src/components/left/search/ChatMessage.scss create mode 100644 src/components/left/search/ChatMessage.tsx create mode 100644 src/components/left/search/ChatMessageResults.tsx create mode 100644 src/components/left/search/ChatResults.tsx create mode 100644 src/components/left/search/DateSuggest.scss create mode 100644 src/components/left/search/DateSuggest.tsx create mode 100644 src/components/left/search/FileResults.tsx create mode 100644 src/components/left/search/LeftSearch.async.tsx create mode 100644 src/components/left/search/LeftSearch.scss create mode 100644 src/components/left/search/LeftSearch.tsx create mode 100644 src/components/left/search/LeftSearchResultChat.tsx create mode 100644 src/components/left/search/LinkResults.tsx create mode 100644 src/components/left/search/MediaResults.tsx create mode 100644 src/components/left/search/RecentContacts.scss create mode 100644 src/components/left/search/RecentContacts.tsx create mode 100644 src/components/left/search/helpers/createMapStateToProps.ts create mode 100644 src/components/left/search/helpers/getSenderName.ts create mode 100644 src/components/left/settings/Settings.async.tsx create mode 100644 src/components/left/settings/Settings.scss create mode 100644 src/components/left/settings/Settings.tsx create mode 100644 src/components/left/settings/SettingsEditProfile.tsx create mode 100644 src/components/left/settings/SettingsGeneral.tsx create mode 100644 src/components/left/settings/SettingsGeneralBackground.scss create mode 100644 src/components/left/settings/SettingsGeneralBackground.tsx create mode 100644 src/components/left/settings/SettingsGeneralBackgroundColor.scss create mode 100644 src/components/left/settings/SettingsGeneralBackgroundColor.tsx create mode 100644 src/components/left/settings/SettingsHeader.tsx create mode 100644 src/components/left/settings/SettingsLanguage.tsx create mode 100644 src/components/left/settings/SettingsMain.tsx create mode 100644 src/components/left/settings/SettingsNotifications.tsx create mode 100644 src/components/left/settings/SettingsPrivacy.tsx create mode 100644 src/components/left/settings/SettingsPrivacyActiveSessions.tsx create mode 100644 src/components/left/settings/SettingsPrivacyBlockedUsers.tsx create mode 100644 src/components/left/settings/SettingsPrivacyVisibility.tsx create mode 100644 src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx create mode 100644 src/components/left/settings/SettingsStickerSet.scss create mode 100644 src/components/left/settings/SettingsStickerSet.tsx create mode 100644 src/components/left/settings/WallpaperTile.scss create mode 100644 src/components/left/settings/WallpaperTile.tsx create mode 100644 src/components/left/settings/folders/SettingsFolders.scss create mode 100644 src/components/left/settings/folders/SettingsFolders.tsx create mode 100644 src/components/left/settings/folders/SettingsFoldersChatFilters.tsx create mode 100644 src/components/left/settings/folders/SettingsFoldersChatsPicker.scss create mode 100644 src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx create mode 100644 src/components/left/settings/folders/SettingsFoldersEdit.tsx create mode 100644 src/components/left/settings/folders/SettingsFoldersMain.tsx create mode 100644 src/components/left/settings/helper/privacy.ts create mode 100644 src/components/left/settings/twoFa/SettingsTwoFa.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx create mode 100644 src/components/left/settings/twoFa/SettingsTwoFaStart.tsx create mode 100644 src/components/main/Errors.async.tsx create mode 100644 src/components/main/Errors.scss create mode 100644 src/components/main/Errors.tsx create mode 100644 src/components/main/ForwardPicker.async.tsx create mode 100644 src/components/main/ForwardPicker.scss create mode 100644 src/components/main/ForwardPicker.tsx create mode 100644 src/components/main/Main.async.tsx create mode 100644 src/components/main/Main.scss create mode 100644 src/components/main/Main.tsx create mode 100644 src/components/main/Notifications.async.tsx create mode 100644 src/components/main/Notifications.tsx create mode 100644 src/components/mediaViewer/MediaViewer.async.tsx create mode 100644 src/components/mediaViewer/MediaViewer.scss create mode 100644 src/components/mediaViewer/MediaViewer.tsx create mode 100644 src/components/mediaViewer/MediaViewerActions.scss create mode 100644 src/components/mediaViewer/MediaViewerActions.tsx create mode 100644 src/components/mediaViewer/MediaViewerFooter.scss create mode 100644 src/components/mediaViewer/MediaViewerFooter.tsx create mode 100644 src/components/mediaViewer/PanZoom.scss create mode 100644 src/components/mediaViewer/PanZoom.tsx create mode 100644 src/components/mediaViewer/SenderInfo.scss create mode 100644 src/components/mediaViewer/SenderInfo.tsx create mode 100644 src/components/mediaViewer/VideoPlayer.scss create mode 100644 src/components/mediaViewer/VideoPlayer.tsx create mode 100644 src/components/mediaViewer/VideoPlayerControls.scss create mode 100644 src/components/mediaViewer/VideoPlayerControls.tsx create mode 100644 src/components/mediaViewer/ZoomControls.scss create mode 100644 src/components/mediaViewer/ZoomControls.tsx create mode 100644 src/components/mediaViewer/helpers/formatFileSize.ts create mode 100644 src/components/mediaViewer/helpers/ghostAnimation.ts create mode 100644 src/components/middle/ActionMessage.tsx create mode 100644 src/components/middle/AudioPlayer.scss create mode 100644 src/components/middle/AudioPlayer.tsx create mode 100644 src/components/middle/DeleteSelectedMessagesModal.tsx create mode 100644 src/components/middle/HeaderActions.tsx create mode 100644 src/components/middle/HeaderMenuContainer.async.tsx create mode 100644 src/components/middle/HeaderMenuContainer.scss create mode 100644 src/components/middle/HeaderMenuContainer.tsx create mode 100644 src/components/middle/HeaderPinnedMessage.tsx create mode 100644 src/components/middle/MessageList.scss create mode 100644 src/components/middle/MessageList.tsx create mode 100644 src/components/middle/MessageScroll.tsx create mode 100644 src/components/middle/MessageSelectToolbar.async.tsx create mode 100644 src/components/middle/MessageSelectToolbar.scss create mode 100644 src/components/middle/MessageSelectToolbar.tsx create mode 100644 src/components/middle/MiddleColumn.scss create mode 100644 src/components/middle/MiddleColumn.tsx create mode 100644 src/components/middle/MiddleHeader.scss create mode 100644 src/components/middle/MiddleHeader.tsx create mode 100644 src/components/middle/MobileSearch.async.tsx create mode 100644 src/components/middle/MobileSearch.scss create mode 100644 src/components/middle/MobileSearch.tsx create mode 100644 src/components/middle/PinnedMessageNavigation.tsx create mode 100644 src/components/middle/ScrollDownButton.scss create mode 100644 src/components/middle/ScrollDownButton.tsx create mode 100644 src/components/middle/composer/AttachMenu.async.tsx create mode 100644 src/components/middle/composer/AttachMenu.scss create mode 100644 src/components/middle/composer/AttachMenu.tsx create mode 100644 src/components/middle/composer/AttachmentModal.async.tsx create mode 100644 src/components/middle/composer/AttachmentModal.scss create mode 100644 src/components/middle/composer/AttachmentModal.tsx create mode 100644 src/components/middle/composer/BotKeyboardMenu.async.tsx create mode 100644 src/components/middle/composer/BotKeyboardMenu.scss create mode 100644 src/components/middle/composer/BotKeyboardMenu.tsx create mode 100644 src/components/middle/composer/Composer.scss create mode 100644 src/components/middle/composer/Composer.tsx create mode 100644 src/components/middle/composer/ComposerEmbeddedMessage.scss create mode 100644 src/components/middle/composer/ComposerEmbeddedMessage.tsx create mode 100644 src/components/middle/composer/CustomSendMenu.async.tsx create mode 100644 src/components/middle/composer/CustomSendMenu.scss create mode 100644 src/components/middle/composer/CustomSendMenu.tsx create mode 100644 src/components/middle/composer/DropArea.async.tsx create mode 100644 src/components/middle/composer/DropArea.scss create mode 100644 src/components/middle/composer/DropArea.tsx create mode 100644 src/components/middle/composer/DropTarget.scss create mode 100644 src/components/middle/composer/DropTarget.tsx create mode 100644 src/components/middle/composer/EmojiButton.scss create mode 100644 src/components/middle/composer/EmojiButton.tsx create mode 100644 src/components/middle/composer/EmojiCategory.tsx create mode 100644 src/components/middle/composer/EmojiPicker.scss create mode 100644 src/components/middle/composer/EmojiPicker.tsx create mode 100644 src/components/middle/composer/EmojiTooltip.async.tsx create mode 100644 src/components/middle/composer/EmojiTooltip.scss create mode 100644 src/components/middle/composer/EmojiTooltip.tsx create mode 100644 src/components/middle/composer/GifPicker.scss create mode 100644 src/components/middle/composer/GifPicker.tsx create mode 100644 src/components/middle/composer/MentionMenu.async.tsx create mode 100644 src/components/middle/composer/MentionMenu.scss create mode 100644 src/components/middle/composer/MentionMenu.tsx create mode 100644 src/components/middle/composer/MessageInput.tsx create mode 100644 src/components/middle/composer/PollModal.async.tsx create mode 100644 src/components/middle/composer/PollModal.scss create mode 100644 src/components/middle/composer/PollModal.tsx create mode 100644 src/components/middle/composer/StickerPicker.scss create mode 100644 src/components/middle/composer/StickerPicker.tsx create mode 100644 src/components/middle/composer/StickerSet.tsx create mode 100644 src/components/middle/composer/StickerSetCover.tsx create mode 100644 src/components/middle/composer/StickerSetCoverAnimated.tsx create mode 100644 src/components/middle/composer/SymbolMenu.async.tsx create mode 100644 src/components/middle/composer/SymbolMenu.scss create mode 100644 src/components/middle/composer/SymbolMenu.tsx create mode 100644 src/components/middle/composer/SymbolMenuFooter.tsx create mode 100644 src/components/middle/composer/TextFormatter.async.tsx create mode 100644 src/components/middle/composer/TextFormatter.scss create mode 100644 src/components/middle/composer/TextFormatter.tsx create mode 100644 src/components/middle/composer/WebPagePreview.scss create mode 100644 src/components/middle/composer/WebPagePreview.tsx create mode 100644 src/components/middle/composer/helpers/buildAttachment.ts create mode 100644 src/components/middle/composer/helpers/getMessageTextAsHtml.ts create mode 100644 src/components/middle/composer/helpers/parseMessageInput.ts create mode 100644 src/components/middle/composer/helpers/searchUserName.ts create mode 100644 src/components/middle/composer/helpers/selection.ts create mode 100644 src/components/middle/composer/hooks/useClipboardPaste.ts create mode 100644 src/components/middle/composer/hooks/useDraft.ts create mode 100644 src/components/middle/composer/hooks/useEditing.ts create mode 100644 src/components/middle/composer/hooks/useEmojiTooltip.ts create mode 100644 src/components/middle/composer/hooks/useMentionMenu.ts create mode 100644 src/components/middle/composer/hooks/useVoiceRecording.ts create mode 100644 src/components/middle/helpers/calculateMiddleFooterTransforms.ts create mode 100644 src/components/middle/helpers/getCurrencySign.ts create mode 100644 src/components/middle/helpers/groupMessages.ts create mode 100644 src/components/middle/helpers/inputFormatters.ts create mode 100644 src/components/middle/hooks/useStickyDates.ts create mode 100644 src/components/middle/message/Album.scss create mode 100644 src/components/middle/message/Album.tsx create mode 100644 src/components/middle/message/CommentButton.scss create mode 100644 src/components/middle/message/CommentButton.tsx create mode 100644 src/components/middle/message/Contact.scss create mode 100644 src/components/middle/message/Contact.tsx create mode 100644 src/components/middle/message/ContextMenuContainer.async.tsx create mode 100644 src/components/middle/message/ContextMenuContainer.tsx create mode 100644 src/components/middle/message/InlineButtons.scss create mode 100644 src/components/middle/message/InlineButtons.tsx create mode 100644 src/components/middle/message/Invoice.scss create mode 100644 src/components/middle/message/Invoice.tsx create mode 100644 src/components/middle/message/MentionLink.tsx create mode 100644 src/components/middle/message/Message.scss create mode 100644 src/components/middle/message/Message.tsx create mode 100644 src/components/middle/message/MessageContextMenu.scss create mode 100644 src/components/middle/message/MessageContextMenu.tsx create mode 100644 src/components/middle/message/MessageMeta.scss create mode 100644 src/components/middle/message/MessageMeta.tsx create mode 100644 src/components/middle/message/Photo.tsx create mode 100644 src/components/middle/message/Poll.scss create mode 100644 src/components/middle/message/Poll.tsx create mode 100644 src/components/middle/message/PollOption.scss create mode 100644 src/components/middle/message/PollOption.tsx create mode 100644 src/components/middle/message/RoundVideo.scss create mode 100644 src/components/middle/message/RoundVideo.tsx create mode 100644 src/components/middle/message/Sticker.scss create mode 100644 src/components/middle/message/Sticker.tsx create mode 100644 src/components/middle/message/Video.tsx create mode 100644 src/components/middle/message/WebPage.scss create mode 100644 src/components/middle/message/WebPage.tsx create mode 100644 src/components/middle/message/_message-content.scss create mode 100644 src/components/middle/message/helpers/buildContentClassName.ts create mode 100644 src/components/middle/message/helpers/calculateAlbumLayout.ts create mode 100644 src/components/middle/message/helpers/calculateAuthorWidth.ts create mode 100644 src/components/middle/message/helpers/copyOptions.ts create mode 100644 src/components/middle/message/helpers/getCustomAppendixBg.ts create mode 100644 src/components/middle/message/helpers/mediaDimensions.ts create mode 100644 src/components/middle/message/hocs/withSelectControl.tsx create mode 100644 src/components/middle/message/hooks/useBlurredMediaThumb.ts create mode 100644 src/components/middle/message/hooks/useFocusMessage.ts create mode 100644 src/components/payment/CardInput.scss create mode 100644 src/components/payment/CardInput.tsx create mode 100644 src/components/payment/Checkout.scss create mode 100644 src/components/payment/Checkout.tsx create mode 100644 src/components/payment/ExpiryInput.tsx create mode 100644 src/components/payment/PaymentInfo.scss create mode 100644 src/components/payment/PaymentInfo.tsx create mode 100644 src/components/payment/PaymentModal.async.tsx create mode 100644 src/components/payment/PaymentModal.scss create mode 100644 src/components/payment/PaymentModal.tsx create mode 100644 src/components/payment/ReceiptModal.async.tsx create mode 100644 src/components/payment/ReceiptModal.tsx create mode 100644 src/components/payment/Shipping.scss create mode 100644 src/components/payment/Shipping.tsx create mode 100644 src/components/payment/ShippingInfo.scss create mode 100644 src/components/payment/ShippingInfo.tsx create mode 100644 src/components/right/ChatExtra.tsx create mode 100644 src/components/right/GifSearch.async.tsx create mode 100644 src/components/right/GifSearch.scss create mode 100644 src/components/right/GifSearch.tsx create mode 100644 src/components/right/PollAnswerResults.scss create mode 100644 src/components/right/PollAnswerResults.tsx create mode 100644 src/components/right/PollResults.async.tsx create mode 100644 src/components/right/PollResults.scss create mode 100644 src/components/right/PollResults.tsx create mode 100644 src/components/right/Profile.scss create mode 100644 src/components/right/Profile.tsx create mode 100644 src/components/right/RightColumn.scss create mode 100644 src/components/right/RightColumn.tsx create mode 100644 src/components/right/RightHeader.scss create mode 100644 src/components/right/RightHeader.tsx create mode 100644 src/components/right/RightSearch.async.tsx create mode 100644 src/components/right/RightSearch.scss create mode 100644 src/components/right/RightSearch.tsx create mode 100644 src/components/right/Statistics.async.tsx create mode 100644 src/components/right/Statistics.scss create mode 100644 src/components/right/Statistics.tsx create mode 100644 src/components/right/StickerSearch.async.tsx create mode 100644 src/components/right/StickerSearch.scss create mode 100644 src/components/right/StickerSearch.tsx create mode 100644 src/components/right/StickerSetResult.tsx create mode 100644 src/components/right/UserExtra.tsx create mode 100644 src/components/right/hooks/useAsyncRendering.ts create mode 100644 src/components/right/hooks/useProfileState.ts create mode 100644 src/components/right/hooks/useProfileViewportIds.ts create mode 100644 src/components/right/hooks/useTransitionFixes.ts create mode 100644 src/components/right/management/ManageChannel.tsx create mode 100644 src/components/right/management/ManageChatAdministrators.tsx create mode 100644 src/components/right/management/ManageChatPrivacyType.tsx create mode 100644 src/components/right/management/ManageDiscussion.tsx create mode 100644 src/components/right/management/ManageGroup.tsx create mode 100644 src/components/right/management/ManageGroupAdminRights.tsx create mode 100644 src/components/right/management/ManageGroupMembers.tsx create mode 100644 src/components/right/management/ManageGroupPermissions.tsx create mode 100644 src/components/right/management/ManageGroupRecentActions.tsx create mode 100644 src/components/right/management/ManageGroupRemovedUsers.tsx create mode 100644 src/components/right/management/ManageGroupUserPermissions.tsx create mode 100644 src/components/right/management/ManageGroupUserPermissionsCreate.tsx create mode 100644 src/components/right/management/ManageUser.tsx create mode 100644 src/components/right/management/Management.async.tsx create mode 100644 src/components/right/management/Management.scss create mode 100644 src/components/right/management/Management.tsx create mode 100644 src/components/test/ErrorTest.tsx create mode 100644 src/components/test/SubTest.tsx create mode 100644 src/components/test/Test.tsx create mode 100644 src/components/test/TestNoRedundancy.tsx create mode 100644 src/components/test/TestOrdered.tsx create mode 100644 src/components/test/TestPortal.tsx create mode 100644 src/components/test/testTick.tsx create mode 100644 src/components/ui/AvatarEditable.scss create mode 100644 src/components/ui/AvatarEditable.tsx create mode 100644 src/components/ui/Button.scss create mode 100644 src/components/ui/Button.tsx create mode 100644 src/components/ui/Checkbox.scss create mode 100644 src/components/ui/Checkbox.tsx create mode 100644 src/components/ui/CheckboxGroup.tsx create mode 100644 src/components/ui/ConfirmDialog.tsx create mode 100644 src/components/ui/CropModal.scss create mode 100644 src/components/ui/CropModal.tsx create mode 100644 src/components/ui/DropdownMenu.scss create mode 100644 src/components/ui/DropdownMenu.tsx create mode 100644 src/components/ui/FloatingActionButton.scss create mode 100644 src/components/ui/FloatingActionButton.tsx create mode 100644 src/components/ui/InfiniteScroll.tsx create mode 100644 src/components/ui/InputText.tsx create mode 100644 src/components/ui/Link.scss create mode 100644 src/components/ui/Link.tsx create mode 100644 src/components/ui/ListItem.scss create mode 100644 src/components/ui/ListItem.tsx create mode 100644 src/components/ui/Loading.scss create mode 100644 src/components/ui/Loading.tsx create mode 100644 src/components/ui/Menu.scss create mode 100644 src/components/ui/Menu.tsx create mode 100644 src/components/ui/MenuItem.scss create mode 100644 src/components/ui/MenuItem.tsx create mode 100644 src/components/ui/Modal.scss create mode 100644 src/components/ui/Modal.tsx create mode 100644 src/components/ui/Notification.scss create mode 100644 src/components/ui/Notification.tsx create mode 100644 src/components/ui/Portal.ts create mode 100644 src/components/ui/ProgressSpinner.scss create mode 100644 src/components/ui/ProgressSpinner.tsx create mode 100644 src/components/ui/Radio.scss create mode 100644 src/components/ui/Radio.tsx create mode 100644 src/components/ui/RadioGroup.tsx create mode 100644 src/components/ui/RangeSlider.scss create mode 100644 src/components/ui/RangeSlider.tsx create mode 100644 src/components/ui/ResponsiveHoverButton.tsx create mode 100644 src/components/ui/RippleEffect.scss create mode 100644 src/components/ui/RippleEffect.tsx create mode 100644 src/components/ui/SearchInput.scss create mode 100644 src/components/ui/SearchInput.tsx create mode 100644 src/components/ui/Select.tsx create mode 100644 src/components/ui/ShowMoreButton.scss create mode 100644 src/components/ui/ShowMoreButton.tsx create mode 100644 src/components/ui/ShowTransition.tsx create mode 100644 src/components/ui/SimpleInfiniteScroll.tsx create mode 100644 src/components/ui/Spinner.scss create mode 100644 src/components/ui/Spinner.tsx create mode 100644 src/components/ui/Tab.scss create mode 100644 src/components/ui/Tab.tsx create mode 100644 src/components/ui/TabList.scss create mode 100644 src/components/ui/TabList.tsx create mode 100644 src/components/ui/Transition.scss create mode 100644 src/components/ui/Transition.tsx create mode 100644 src/config.ts create mode 100644 src/global/cache.ts create mode 100644 src/global/index.ts create mode 100644 src/global/initial.ts create mode 100644 src/global/types.ts create mode 100644 src/hooks/reducers/useFoldersReducer.ts create mode 100644 src/hooks/reducers/usePaymentReducer.ts create mode 100644 src/hooks/reducers/useTwoFaReducer.ts create mode 100644 src/hooks/useAudioPlayer.ts create mode 100644 src/hooks/useBackgroundMode.ts create mode 100644 src/hooks/useBlur.ts create mode 100644 src/hooks/useBlurSync.ts create mode 100644 src/hooks/useBuffering.ts create mode 100644 src/hooks/useCacheBuster.ts create mode 100644 src/hooks/useChatContextActions.ts create mode 100644 src/hooks/useContextMenuHandlers.ts create mode 100644 src/hooks/useContextMenuPosition.ts create mode 100644 src/hooks/useCurrentOrPrev.ts create mode 100644 src/hooks/useCustomBackground.ts create mode 100644 src/hooks/useDebounce.ts create mode 100644 src/hooks/useEffectWithPrevDeps.ts create mode 100644 src/hooks/useEnsureMessage.ts create mode 100644 src/hooks/useFlag.ts create mode 100644 src/hooks/useFocusAfterAnimation.tsx create mode 100644 src/hooks/useForceUpdate.ts create mode 100644 src/hooks/useFullscreen.ts create mode 100644 src/hooks/useHeavyAnimationCheck.ts create mode 100644 src/hooks/useHeavyAnimationCheckForVideo.ts create mode 100644 src/hooks/useHorizontalScroll.ts create mode 100644 src/hooks/useInfiniteScroll.ts create mode 100644 src/hooks/useIntersectionObserver.ts create mode 100644 src/hooks/useKeyboardListNavigation.ts create mode 100644 src/hooks/useLang.ts create mode 100644 src/hooks/useLayoutEffectWithPrevDeps.ts create mode 100644 src/hooks/useMedia.ts create mode 100644 src/hooks/useMediaWithDownloadProgress.ts create mode 100644 src/hooks/useModuleLoader.ts create mode 100644 src/hooks/useMouseInside.ts create mode 100644 src/hooks/useOnChange.ts create mode 100644 src/hooks/usePrevForAnimation.ts create mode 100644 src/hooks/usePrevious.ts create mode 100644 src/hooks/useReducer.ts create mode 100644 src/hooks/useShowTransition.ts create mode 100644 src/hooks/useThrottle.ts create mode 100644 src/hooks/useThrottledMemo.ts create mode 100644 src/hooks/useTransitionForMedia.ts create mode 100644 src/hooks/useVideoCleanup.ts create mode 100644 src/hooks/useVirtualBackdrop.ts create mode 100644 src/hooks/useWebpThumbnail.ts create mode 100644 src/hooks/useWindowSize.ts create mode 100644 src/index-perf.html create mode 100644 src/index-perf.tsx create mode 100644 src/index.html create mode 100644 src/index.tsx create mode 100644 src/lib/croppie.ts create mode 100644 src/lib/fastBlur.js create mode 100644 src/lib/gramjs/.editorconfig create mode 100644 src/lib/gramjs/Helpers.js create mode 100644 src/lib/gramjs/Password.js create mode 100644 src/lib/gramjs/Utils.js create mode 100644 src/lib/gramjs/Version.js create mode 100644 src/lib/gramjs/client/2fa.ts create mode 100644 src/lib/gramjs/client/TelegramClient.d.ts create mode 100644 src/lib/gramjs/client/TelegramClient.js create mode 100644 src/lib/gramjs/client/auth.ts create mode 100644 src/lib/gramjs/client/downloadFile.ts create mode 100644 src/lib/gramjs/client/uploadFile.ts create mode 100644 src/lib/gramjs/crypto/AuthKey.js create mode 100644 src/lib/gramjs/crypto/CTR.js create mode 100644 src/lib/gramjs/crypto/Factorizator.js create mode 100644 src/lib/gramjs/crypto/IGE.js create mode 100644 src/lib/gramjs/crypto/RSA.js create mode 100644 src/lib/gramjs/crypto/converters.ts create mode 100644 src/lib/gramjs/crypto/crypto.js create mode 100644 src/lib/gramjs/crypto/words.ts create mode 100644 src/lib/gramjs/errors/Common.js create mode 100644 src/lib/gramjs/errors/RPCBaseErrors.js create mode 100644 src/lib/gramjs/errors/RPCErrorList.js create mode 100644 src/lib/gramjs/errors/index.js create mode 100644 src/lib/gramjs/events/NewMessage.js create mode 100644 src/lib/gramjs/events/Raw.js create mode 100644 src/lib/gramjs/events/common.js create mode 100644 src/lib/gramjs/events/index.js create mode 100644 src/lib/gramjs/extensions/AsyncQueue.js create mode 100644 src/lib/gramjs/extensions/BinaryReader.js create mode 100644 src/lib/gramjs/extensions/BinaryWriter.js create mode 100644 src/lib/gramjs/extensions/Logger.js create mode 100644 src/lib/gramjs/extensions/MessagePacker.js create mode 100644 src/lib/gramjs/extensions/PromisedWebSockets.js create mode 100644 src/lib/gramjs/extensions/index.js create mode 100644 src/lib/gramjs/index.d.ts create mode 100644 src/lib/gramjs/index.js create mode 100644 src/lib/gramjs/network/Authenticator.js create mode 100644 src/lib/gramjs/network/MTProtoPlainSender.js create mode 100644 src/lib/gramjs/network/MTProtoSender.js create mode 100644 src/lib/gramjs/network/MTProtoState.js create mode 100644 src/lib/gramjs/network/RequestState.js create mode 100644 src/lib/gramjs/network/connection/Connection.js create mode 100644 src/lib/gramjs/network/connection/TCPAbridged.js create mode 100644 src/lib/gramjs/network/connection/TCPFull.js create mode 100644 src/lib/gramjs/network/connection/TCPObfuscated.js create mode 100644 src/lib/gramjs/network/connection/index.js create mode 100644 src/lib/gramjs/network/index.js create mode 100644 src/lib/gramjs/sessions/Abstract.js create mode 100644 src/lib/gramjs/sessions/CacheApiSession.js create mode 100644 src/lib/gramjs/sessions/LocalStorageSession.js create mode 100644 src/lib/gramjs/sessions/Memory.js create mode 100644 src/lib/gramjs/sessions/StorageSession.js create mode 100644 src/lib/gramjs/sessions/StringSession.js create mode 100644 src/lib/gramjs/sessions/index.js create mode 100644 src/lib/gramjs/tl/AllTLObjects.js create mode 100644 src/lib/gramjs/tl/MTProtoRequest.js create mode 100644 src/lib/gramjs/tl/api.d.ts create mode 100644 src/lib/gramjs/tl/api.js create mode 100644 src/lib/gramjs/tl/apiTl.js create mode 100644 src/lib/gramjs/tl/core/GZIPPacked.js create mode 100644 src/lib/gramjs/tl/core/MessageContainer.js create mode 100644 src/lib/gramjs/tl/core/RPCResult.js create mode 100644 src/lib/gramjs/tl/core/TLMessage.js create mode 100644 src/lib/gramjs/tl/core/index.js create mode 100644 src/lib/gramjs/tl/generateModules.js create mode 100644 src/lib/gramjs/tl/generationHelpers.js create mode 100644 src/lib/gramjs/tl/index.js create mode 100644 src/lib/gramjs/tl/schemaTl.js create mode 100644 src/lib/gramjs/tl/static/api.reduced.tl create mode 100644 src/lib/gramjs/tl/static/api.tl create mode 100644 src/lib/gramjs/tl/static/schema.reduced.tl create mode 100644 src/lib/gramjs/tl/static/schema.tl create mode 100644 src/lib/gramjs/tl/types-generator/generate.js create mode 100644 src/lib/gramjs/tl/types-generator/template.js create mode 100644 src/lib/lovely-chart/Axes.js create mode 100644 src/lib/lovely-chart/Header.js create mode 100644 src/lib/lovely-chart/LovelyChart.js create mode 100644 src/lib/lovely-chart/Minimap.js create mode 100644 src/lib/lovely-chart/Projection.js create mode 100644 src/lib/lovely-chart/StateManager.js create mode 100644 src/lib/lovely-chart/Tools.js create mode 100644 src/lib/lovely-chart/Tooltip.js create mode 100644 src/lib/lovely-chart/TransitionManager.js create mode 100644 src/lib/lovely-chart/Zoomer.js create mode 100644 src/lib/lovely-chart/canvas.js create mode 100644 src/lib/lovely-chart/captureEvents.js create mode 100644 src/lib/lovely-chart/constants.js create mode 100644 src/lib/lovely-chart/data.js create mode 100644 src/lib/lovely-chart/drawDatasets.js create mode 100644 src/lib/lovely-chart/format.js create mode 100644 src/lib/lovely-chart/formulas.js create mode 100644 src/lib/lovely-chart/hideOnScroll.js create mode 100644 src/lib/lovely-chart/minifiers.js create mode 100644 src/lib/lovely-chart/preparePoints.js create mode 100644 src/lib/lovely-chart/simplify.js create mode 100644 src/lib/lovely-chart/skin.js create mode 100644 src/lib/lovely-chart/styles/_animations.scss create mode 100644 src/lib/lovely-chart/styles/_buttons.scss create mode 100644 src/lib/lovely-chart/styles/_common.scss create mode 100644 src/lib/lovely-chart/styles/_header.scss create mode 100644 src/lib/lovely-chart/styles/_minimap.scss create mode 100644 src/lib/lovely-chart/styles/_tools.scss create mode 100644 src/lib/lovely-chart/styles/_tooltip.scss create mode 100644 src/lib/lovely-chart/styles/_variables.scss create mode 100644 src/lib/lovely-chart/styles/index.scss create mode 100644 src/lib/lovely-chart/toggleText.js create mode 100644 src/lib/lovely-chart/utils.js create mode 100644 src/lib/punycode.js create mode 100644 src/lib/rlottie/RLottie.ts create mode 100644 src/lib/rlottie/__mocks__/RLottie.ts create mode 100644 src/lib/rlottie/rlottie-wasm.js create mode 100644 src/lib/rlottie/rlottie-wasm.wasm create mode 100644 src/lib/rlottie/rlottie.worker.ts create mode 100644 src/lib/teact/dom-events.ts create mode 100644 src/lib/teact/teact-dom.ts create mode 100644 src/lib/teact/teact.ts create mode 100644 src/lib/teact/teactn.tsx create mode 100644 src/lib/twemojiRegex.js create mode 100644 src/lib/webp/webp_wasm.js create mode 100644 src/lib/webp/webp_wasm.wasm create mode 100644 src/lib/webp/webp_wasm.worker.js create mode 100644 src/modules/actions/all.ts create mode 100644 src/modules/actions/api/bots.ts create mode 100644 src/modules/actions/api/chats.ts create mode 100644 src/modules/actions/api/globalSearch.ts create mode 100644 src/modules/actions/api/initial.ts create mode 100644 src/modules/actions/api/localSearch.ts create mode 100644 src/modules/actions/api/management.ts create mode 100644 src/modules/actions/api/messages.ts create mode 100644 src/modules/actions/api/payments.ts create mode 100644 src/modules/actions/api/settings.ts create mode 100644 src/modules/actions/api/symbols.ts create mode 100644 src/modules/actions/api/sync.ts create mode 100644 src/modules/actions/api/twoFaSettings.ts create mode 100644 src/modules/actions/api/users.ts create mode 100644 src/modules/actions/apiUpdaters/chats.ts create mode 100644 src/modules/actions/apiUpdaters/initial.ts create mode 100644 src/modules/actions/apiUpdaters/messages.ts create mode 100644 src/modules/actions/apiUpdaters/misc.ts create mode 100644 src/modules/actions/apiUpdaters/settings.ts create mode 100644 src/modules/actions/apiUpdaters/symbols.ts create mode 100644 src/modules/actions/apiUpdaters/twoFaSettings.ts create mode 100644 src/modules/actions/apiUpdaters/users.ts create mode 100644 src/modules/actions/initial.ts create mode 100644 src/modules/actions/ui/chats.ts create mode 100644 src/modules/actions/ui/globalSearch.ts create mode 100644 src/modules/actions/ui/initial.ts create mode 100644 src/modules/actions/ui/localSearch.ts create mode 100644 src/modules/actions/ui/messages.ts create mode 100644 src/modules/actions/ui/misc.ts create mode 100644 src/modules/actions/ui/payments.ts create mode 100644 src/modules/actions/ui/settings.ts create mode 100644 src/modules/actions/ui/stickerSearch.ts create mode 100644 src/modules/actions/ui/users.ts create mode 100644 src/modules/helpers/chats.ts create mode 100644 src/modules/helpers/index.ts create mode 100644 src/modules/helpers/localSearch.ts create mode 100644 src/modules/helpers/messageMedia.ts create mode 100644 src/modules/helpers/messages.ts create mode 100644 src/modules/helpers/payments.ts create mode 100644 src/modules/helpers/users.ts create mode 100644 src/modules/reducers/chats.ts create mode 100644 src/modules/reducers/globalSearch.ts create mode 100644 src/modules/reducers/index.ts create mode 100644 src/modules/reducers/localSearch.ts create mode 100644 src/modules/reducers/management.ts create mode 100644 src/modules/reducers/messages.ts create mode 100644 src/modules/reducers/payments.ts create mode 100644 src/modules/reducers/settings.ts create mode 100644 src/modules/reducers/symbols.ts create mode 100644 src/modules/reducers/twoFaSettings.ts create mode 100644 src/modules/reducers/users.ts create mode 100644 src/modules/selectors/chats.ts create mode 100644 src/modules/selectors/globalSearch.ts create mode 100644 src/modules/selectors/index.ts create mode 100644 src/modules/selectors/localSearch.ts create mode 100644 src/modules/selectors/management.ts create mode 100644 src/modules/selectors/messages.ts create mode 100644 src/modules/selectors/payments.ts create mode 100644 src/modules/selectors/symbols.ts create mode 100644 src/modules/selectors/ui.ts create mode 100644 src/modules/selectors/users.ts create mode 100644 src/serviceWorker.ts create mode 100644 src/serviceWorker/assetCache.ts create mode 100644 src/serviceWorker/progressive.ts create mode 100644 src/styles/Telegram T.json create mode 100644 src/styles/_common.scss create mode 100644 src/styles/_forms.scss create mode 100644 src/styles/_mixins.scss create mode 100644 src/styles/_spacing.scss create mode 100644 src/styles/_variables.scss create mode 100644 src/styles/icons.scss create mode 100644 src/styles/index.scss create mode 100644 src/styles/reboot.css create mode 100644 src/types/index.ts create mode 100644 src/util/WorkerConnector.ts create mode 100644 src/util/__mocks__/oggToWav.ts create mode 100644 src/util/__mocks__/voiceRecording.ts create mode 100644 src/util/__mocks__/webpToPng.ts create mode 100644 src/util/animation.ts create mode 100644 src/util/arePropsShallowEqual.ts create mode 100644 src/util/audioPlayer.ts create mode 100644 src/util/buildClassName.ts create mode 100644 src/util/cacheApi.ts create mode 100644 src/util/callbacks.ts create mode 100644 src/util/captureEscKeyListener.ts create mode 100644 src/util/captureEvents.ts create mode 100644 src/util/captureKeyboardListeners.ts create mode 100644 src/util/clipboard.ts create mode 100644 src/util/colors.ts create mode 100644 src/util/countries.ts create mode 100644 src/util/createWorkerInterface.ts create mode 100644 src/util/cycleRestrict.ts create mode 100644 src/util/dateFormat.ts create mode 100644 src/util/deleteLastCharacterOutsideSelection.ts create mode 100644 src/util/download.ts create mode 100644 src/util/emoji.ts create mode 100644 src/util/environment.ts create mode 100644 src/util/fastSmoothScroll.ts create mode 100644 src/util/fastSmoothScrollHorizontal.ts create mode 100644 src/util/files.ts create mode 100644 src/util/findInViewport.ts create mode 100644 src/util/focusEditableElement.ts create mode 100644 src/util/fonts.ts create mode 100644 src/util/generateIdFor.ts create mode 100644 src/util/getElementHasScroll.ts create mode 100644 src/util/getReadableErrorText.ts create mode 100644 src/util/handleError.ts create mode 100644 src/util/insertHtmlInSelection.ts create mode 100644 src/util/isFullyVisible.ts create mode 100644 src/util/iteratees.ts create mode 100644 src/util/langProvider.ts create mode 100644 src/util/mediaLoader.ts create mode 100644 src/util/memo.ts create mode 100644 src/util/moduleLoader.ts create mode 100644 src/util/oggToWav.ts create mode 100644 src/util/patchSafariProgressiveAudio.ts create mode 100644 src/util/phoneNumber.ts create mode 100644 src/util/requestQuery.ts create mode 100644 src/util/resetScroll.ts create mode 100644 src/util/safePlay.ts create mode 100644 src/util/schedulers.ts create mode 100644 src/util/scrollLock.ts create mode 100644 src/util/searchWords.ts create mode 100644 src/util/setupServiceWorker.ts create mode 100644 src/util/systemFilesDialog.ts create mode 100644 src/util/textFormat.ts create mode 100644 src/util/trapFocus.ts create mode 100644 src/util/trimText.ts create mode 100644 src/util/voiceRecording.ts create mode 100644 src/util/waveform.ts create mode 100644 src/util/webpToPng.ts create mode 100644 src/util/windowSize.ts create mode 100644 tests/assertions.ts create mode 100644 tests/config.ts create mode 100644 tests/helpers.ts create mode 100644 tests/init.js create mode 100644 tests/initApp.tsx create mode 100644 tests/messageLayout.test.tsx create mode 100644 tests/staticFileMock.js create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..d5c48656c --- /dev/null +++ b/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + [ + "@babel/typescript" + ], + [ + "@babel/preset-env" + ], + [ + "@babel/preset-react" + ] + ], + "plugins": [ + [ + "@babel/plugin-proposal-class-properties" + ] + ] +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000..bbb709d46 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +> 2%, last 2 edge versions diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..88b016a85 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..467f0efd3 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +NODE_ENV=development + +TELEGRAM_T_API_ID= +TELEGRAM_T_API_HASH= diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..ffd5d96aa --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +src/lib/gramjs/* diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..b05e5939b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,65 @@ +{ + "extends": [ + "react-app", + "plugin:teactn/recommended", + "airbnb-typescript" + ], + "plugins": [ + "no-async-without-await", + "teactn", + "no-null" + ], + "rules": { + "indent": [ + "error", + 2, + { + "SwitchCase": 1 + } + ], + "max-len": [ + "error", + 120 + ], + "array-bracket-newline": [2, "consistent"], + "no-null/no-null": 2, + "no-console": "error", + "semi": "error", + "no-implicit-coercion": "error", + "react-hooks/exhaustive-deps": "error", + "arrow-body-style": "off", + "no-else-return": "off", + "no-plusplus": "off", + "no-void": "off", + "default-case": "off", + "no-param-reassign": "off", + "no-prototype-builtins": "off", + "no-await-in-loop": "off", + "no-nested-ternary": "off", + "import/no-extraneous-dependencies": "off", + "import/prefer-default-export": "off", + "import/named": "off", + "import/no-webpack-loader-syntax": "off", + "react/prop-types": "off", + "react/jsx-one-expression-per-line": "off", + // Teact feature + "react/style-prop-object": "off", + "jsx-a11y/click-events-have-key-events": "off", + "jsx-a11y/no-static-element-interactions": "off", + "jsx-a11y/label-has-associated-control": "off", + "jsx-a11y/anchor-is-valid": "off", + "no-async-without-await/no-async-without-await": 1, + "@typescript-eslint/no-use-before-define": [ + "error", + { + "functions": false + } + ], + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/member-delimiter-style": "error", + "teactn/prefer-separate-component-file": "off" + }, + "settings": { + "import/resolver": "webpack" + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..4f87d3308 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,25 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Declare files that will always have LF line endings on checkout. +.htaccess text eol=lf +*.html text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.js text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.json text eol=lf +*.map text eol=lf +*.md text eol=lf +*.mo text eol=lf +*.svg text eol=lf +*.sh text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.gif binary +*.ico binary +*.jpeg binary +*.jpg binary +*.png binary +*.wav binary diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..ad1765d86 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,30 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Tests + +on: + pull_request: + branches: [ master ] + +jobs: + build_and_test: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run gramjs:tl + - run: npm test + env: + TELEGRAM_T_API_ID: ${{ secrets.TELEGRAM_API_ID }} + TELEGRAM_T_API_HASH: ${{ secrets.TELEGRAM_API_HASH }} + TEST_SESSION: ${{ secrets.TEST_SESSION }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..15c5f26c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +node_modules +dist +.cache +.env +src/lib/gramjs/build/ +build-contest/ +.idea +*.iml +dev/perf/screenshot* +.DS_store diff --git a/.postcssrc b/.postcssrc new file mode 100644 index 000000000..cf78de025 --- /dev/null +++ b/.postcssrc @@ -0,0 +1,5 @@ +{ + "plugins": { + "autoprefixer": {}, + } +} diff --git a/README.md b/README.md new file mode 100644 index 000000000..0fd70a481 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# telegram-t + +## Demo + +https://telegram-t-rc-7.netlify.app/ + +## Local setup + +```sh +mv .env.example .env + +npm i +``` + +Obtain API ID and API hash on [my.telegram.org](https://my.telegram.org) and populate the `.env` file. + +## Dev mode + +```sh +npm run dev +``` + +## **Features** (as of August 22, 2020) +### Performance +- Transferred size: 156 kB on auth screen, 277 kB within a chat +- Instant launch with preserved state +- Smooth UI launch with no avatars and fonts flickering +- Only visible set of messages is rendered while scrolling the viewport +- Progressive media loading and playing when moving the viewport +- Lazy loading for heavy assets and features +- Unstable network support with auto-reconnects any sync +- Ripple effect is flawless during rendering (when switching chats) +### Nice stuff +- Apple emojis on all platforms +- Previews of media documents +- Custom media viewer controls +- Tails in photo messages +- Smart sticky dates in message list +- Deeply optimized animations and lists +### Message types and features +- Regular, replies (with focusing), forwarded +- With photo, stickers (incl. animated), video (incl. playing inline, GIF and round), audio, voice (with marking as read), documents (with downloading), polls (with voting), albums, web-pages, contacts, emoji-only +- Text formatting, links, mentions, hashtags, code samples, quotes, and other entities +- Various combinations of all above +- Service messages with interactive mentions +### Bigger features +- Navigating to any point in messages history, loading history starting from unread messages +- Updates support for all implemented UI features, incl. new/edited/deleted/pinned messages (incl. older chats) and various indicators for chats and users +- Support for attaching and copy-pasting quick photos and videos, documents, polls, recording audio, sending emojis, stickers, GIFs and web pages with preview. Flawless optimistic transitions between local and server sent messages +- Shared Media with infinite scroll and progressive loading. All messages with links (not only WebPages) are shown, support for audio files playback and documents download +- Message Search with infinite scroll and progressive loading +- Top Contacts, Recent Chats and fully-functional Global Search for chats and messages +- Media Viewer with preloading, navigation, forwarding and downloading +- Message Context Menu supporting reply, forward, edit, pin, copy (incl. media and selected text), delete features (incl. a popup with deleting options), respecting user permissions +- Creating groups and channels +- Profile management +- Full chat permissions support (incl. admin rights and slow mode) +- Full stickers and GIFs panel support with saved, favorites, search and trending +### Indicators +- Chats: online users, unread inbox counter, mentions, pending/delivered/read outbox, pinned, verified, muted, time/date formatting +- Messages: pending/delivered/read, "edited" mark, channel views counter +- Download progress spinners +- Profiles and chats information in the middle and the right columns, incl. online members counter for supergroups +- "typing..." and "uploading [media]..." statuses +### Misc +- The latest MTProto Layer 112 is used +- Cancelling sending media messages +- Manual read/unread marks for chats +- HTML and Markdown in message composer +- Drafts +- Charts statistics (mocked) +- Pinned message (with unpinning and focusing) +- \ key support for closing chat, reply form, popup, context menu, etc. +- Chat with self is displayed as Saved Messages +- Phone numbers formatting +- Nearest country auto-detect diff --git a/deploy/contest.sh b/deploy/contest.sh new file mode 100755 index 000000000..2410d1da3 --- /dev/null +++ b/deploy/contest.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -e + +OUT_DIR=./build-contest + +rm -rf ${OUT_DIR}; +mkdir -p ${OUT_DIR}; + +npm run build -- --output-path=${OUT_DIR}/dist/ --env.noSourceMap +./deploy/copy_to_dist.sh ${OUT_DIR}/dist/ + +npm run build -- --output-path=${OUT_DIR}/src/ --env.noMinify +rm ${OUT_DIR}/src/index.html +./deploy/copy_to_dist.sh ${OUT_DIR}/src/ diff --git a/deploy/copy_to_dist.sh b/deploy/copy_to_dist.sh new file mode 100755 index 000000000..6251c377b --- /dev/null +++ b/deploy/copy_to_dist.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +cp -R ./public/* ${1:-"dist"} + +cp ./src/lib/rlottie/rlottie-wasm.js ${1:-"dist"} +cp ./src/lib/rlottie/rlottie-wasm.wasm ${1:-"dist"} + +cp ./node_modules/opus-recorder/dist/encoderWorker.min.wasm ${1:-"dist"} +cp ./node_modules/opus-recorder/dist/decoderWorker.min.wasm ${1:-"dist"} + +cp ./src/lib/webp/webp_wasm.js ${1:-"dist"} +cp ./src/lib/webp/webp_wasm.wasm ${1:-"dist"} + +cp -R ./node_modules/emoji-data-ios/img-apple-64 ${1:-"dist"} +cp -R ./node_modules/emoji-data-ios/img-apple-160 ${1:-"dist"} diff --git a/dev/localize/auto-localize.ts b/dev/localize/auto-localize.ts new file mode 100644 index 000000000..e89c2ae6d --- /dev/null +++ b/dev/localize/auto-localize.ts @@ -0,0 +1,82 @@ +// @ts-ignore +const replaceInFile = require('replace-in-file'); +const langPackIOs = require('./en-ios.json'); +const langPackExtra = require('./en-extra.json'); + +(async () => { + const pairs = preparePairs(); + const pairs2 = preparePairs2(); + + await replaceInFile({ + files: './src/components/**/*.tsx', + from: [ + /(>[\r\n\s]*)([\w\-.?! ]+)([\r\n\s]*<)/gm, + /(placeholder=)"([\w\-.?! ]+)"()/gm, + /(label=)"([\w\-.?! ]+)"()/gm, + /(ariaLabel=)"([\w\-.?! ]+)"()/gm, + /(submitLabel=)"([\w\-.?! ]+)"()/gm, + ], + to: (match: string, p1: string, p2: string, p3: string) => { + const trimmed = p2.trim().toLowerCase(); + + if (pairs2[trimmed]) { + return `${p1}{lang('${pairs2[trimmed]}')}${p3}`; + } else if (pairs[trimmed]) { + return `${p1}{lang('${pairs[trimmed]}')}${p3}`; + } else { + return match; + } + }, + }); + + // eslint-disable-next-line no-console + console.log('Cool!'); +})(); + +interface ApiLangString { + key: string; + value?: string; + zeroValue?: string; + oneValue?: string; + twoValue?: string; + fewValue?: string; + manyValue?: string; + otherValue?: string; +} + +type ApiLangPack = Record; + +type ByValue = Record; +type Pairs = Record; + +function preparePairs() { + // Get key arrays by values (only for single-value strings) + const byValue = Object.values(langPackIOs as ApiLangPack).reduce((acc, { value, key }) => { + if (value) { + value = value.toLowerCase(); + + if (!acc[value]) { + acc[value] = [key]; + } else { + acc[value].push(key); + } + } + + return acc; + }, {} as ByValue); + + // Select the shortest key for each value + return Object.keys(byValue).reduce((acc, value) => { + const keys = byValue[value]; + const shortestKeyLength = Math.min(...keys.map((k) => k.length)); + acc[value] = keys.find((k) => k.length === shortestKeyLength)!; + return acc; + }, {} as Pairs); +} + +function preparePairs2() { + return Object.keys(langPackExtra).reduce((acc, key) => { + acc[langPackExtra[key].toLowerCase()] = key; + return acc; + }, {} as Pairs); +} diff --git a/dev/localize/auto-relocalize.ts b/dev/localize/auto-relocalize.ts new file mode 100644 index 000000000..2ccc40959 --- /dev/null +++ b/dev/localize/auto-relocalize.ts @@ -0,0 +1,84 @@ +// @ts-ignore +const replaceInFile = require('replace-in-file'); +const langPackAndroid = require('./en-android.json'); +const langPackIOs = require('./en-ios.json'); +const langPackExtra = require('./en-extra.json'); + + +interface ApiLangString { + key: string; + value?: string; + zeroValue?: string; + oneValue?: string; + twoValue?: string; + fewValue?: string; + manyValue?: string; + otherValue?: string; +} + +type ApiLangPack = Record; +type ByValue = Record; +type Pairs = Record; + +(async () => { + const androidByKey = prepareAndroidByKey(); + const extraByKey = langPackExtra; + const newKeysByValue = prepareByValue(langPackIOs); + + await replaceInFile({ + files: ['./src/components/**/*.tsx', './src/modules/**/*.ts'], + from: [ + /(?:lang|getTranslation)\('(\w+)'\)/g, + ], + to: (match: string, key: string) => { + if (extraByKey[key]) { + return match; + } + + const value = androidByKey[key]; + const newKey = newKeysByValue[value.toLowerCase()]; + if (!newKey) { + return match; + } + + return match.replace(key, newKey); + }, + }); + + // eslint-disable-next-line no-console + console.log('Cool!'); +})(); + +function prepareAndroidByKey() { + // Select the shortest key for each value + return Object.keys(langPackAndroid).reduce((acc, key) => { + acc[key] = langPackAndroid[key].value; + return acc; + }, {} as Pairs); +} + + +function prepareByValue(langPack: ApiLangPack) { + // Get key arrays by values (only for single-value strings) + const byValue = Object.values(langPack).reduce((acc, { value, key }) => { + if (value) { + value = value.toLowerCase(); + + if (!acc[value]) { + acc[value] = [key]; + } else { + acc[value].push(key); + } + } + + return acc; + }, {} as ByValue); + + // Select the shortest key for each value + return Object.keys(byValue).reduce((acc, value) => { + const keys = byValue[value]; + const shortestKeyLength = Math.min(...keys.map((k) => k.length)); + acc[value] = keys.find((k) => k.length === shortestKeyLength)!; + return acc; + }, {} as Pairs); +} diff --git a/dev/localize/en-android.json b/dev/localize/en-android.json new file mode 100644 index 000000000..0bded05a2 --- /dev/null +++ b/dev/localize/en-android.json @@ -0,0 +1,15749 @@ +{ + "ALongTimeAgo": { + "key": "ALongTimeAgo", + "value": "last seen a long time ago" + }, + "Abort": { + "key": "Abort", + "value": "Abort" + }, + "AbortEmail": { + "key": "AbortEmail", + "value": "Abort recovery email setup" + }, + "AbortPassword": { + "key": "AbortPassword", + "value": "Abort two-step verification setup" + }, + "AbortPasswordMenu": { + "key": "AbortPasswordMenu", + "value": "Abort setup" + }, + "AccActionCancelDownload": { + "key": "AccActionCancelDownload", + "value": "Cancel download" + }, + "AccActionDownload": { + "key": "AccActionDownload", + "value": "Download" + }, + "AccActionEnterSelectionMode": { + "key": "AccActionEnterSelectionMode", + "value": "Enter selection mode" + }, + "AccActionMessageOptions": { + "key": "AccActionMessageOptions", + "value": "Message options" + }, + "AccActionOpenFile": { + "key": "AccActionOpenFile", + "value": "Open file" + }, + "AccActionPause": { + "key": "AccActionPause", + "value": "Pause" + }, + "AccActionPlay": { + "key": "AccActionPlay", + "value": "Play" + }, + "AccActionRecordVideo": { + "key": "AccActionRecordVideo", + "value": "Record video" + }, + "AccActionTakePicture": { + "key": "AccActionTakePicture", + "value": "Take a picture" + }, + "AccAutoDeleteTimer": { + "key": "AccAutoDeleteTimer", + "value": "Auto-delete timer" + }, + "AccDescrAspectRatio": { + "key": "AccDescrAspectRatio", + "value": "Aspect ratio" + }, + "AccDescrAttachButton": { + "key": "AccDescrAttachButton", + "value": "Attach media" + }, + "AccDescrBackspace": { + "key": "AccDescrBackspace", + "value": "Backspace" + }, + "AccDescrBotCommands": { + "key": "AccDescrBotCommands", + "value": "Bot commands" + }, + "AccDescrBotKeyboard": { + "key": "AccDescrBotKeyboard", + "value": "Bot keyboard" + }, + "AccDescrCameraFlashAuto": { + "key": "AccDescrCameraFlashAuto", + "value": "Flash, Auto" + }, + "AccDescrCameraFlashOff": { + "key": "AccDescrCameraFlashOff", + "value": "Flash, Off" + }, + "AccDescrCameraFlashOn": { + "key": "AccDescrCameraFlashOn", + "value": "Flash, On" + }, + "AccDescrCancelEdit": { + "key": "AccDescrCancelEdit", + "value": "Cancel editing" + }, + "AccDescrCancelForward": { + "key": "AccDescrCancelForward", + "value": "Cancel forward" + }, + "AccDescrCancelReply": { + "key": "AccDescrCancelReply", + "value": "Cancel reply" + }, + "AccDescrChanSilentOff": { + "key": "AccDescrChanSilentOff", + "value": "Send notifications" + }, + "AccDescrChanSilentOn": { + "key": "AccDescrChanSilentOn", + "value": "Send silently" + }, + "AccDescrChangeProfilePicture": { + "key": "AccDescrChangeProfilePicture", + "value": "Change profile picture" + }, + "AccDescrChannel": { + "key": "AccDescrChannel", + "value": "Channel" + }, + "AccDescrCloseMenu": { + "key": "AccDescrCloseMenu", + "value": "Close menu" + }, + "AccDescrClosePlayer": { + "key": "AccDescrClosePlayer", + "value": "Close audio player" + }, + "AccDescrCollapsePanel": { + "key": "AccDescrCollapsePanel", + "value": "Collapse panel" + }, + "AccDescrContactSorting": { + "key": "AccDescrContactSorting", + "value": "Change sorting" + }, + "AccDescrDownloadProgress": { + "key": "AccDescrDownloadProgress", + "value": "Downloaded %1$s of %2$s" + }, + "AccDescrEditing": { + "key": "AccDescrEditing", + "value": "Editing" + }, + "AccDescrEmojiButton": { + "key": "AccDescrEmojiButton", + "value": "Emoji, stickers, and GIFs" + }, + "AccDescrExpandPanel": { + "key": "AccDescrExpandPanel", + "value": "Expand panel" + }, + "AccDescrForwarding": { + "key": "AccDescrForwarding", + "value": "Forwarding from" + }, + "AccDescrGIFs": { + "key": "AccDescrGIFs", + "value": "GIFs" + }, + "AccDescrGoBack": { + "key": "AccDescrGoBack", + "value": "Go back" + }, + "AccDescrGoToMessage": { + "key": "AccDescrGoToMessage", + "value": "Go to message" + }, + "AccDescrGroup": { + "key": "AccDescrGroup", + "value": "Group" + }, + "AccDescrHideAccounts": { + "key": "AccDescrHideAccounts", + "value": "Hide accounts" + }, + "AccDescrIVHeading": { + "key": "AccDescrIVHeading", + "value": "Heading" + }, + "AccDescrIVTitle": { + "key": "AccDescrIVTitle", + "value": "Title" + }, + "AccDescrInstantCamera": { + "key": "AccDescrInstantCamera", + "value": "Instant camera" + }, + "AccDescrLocationNotify": { + "key": "AccDescrLocationNotify", + "value": "Notify when people sharing location are in range" + }, + "AccDescrMentionDown": { + "key": "AccDescrMentionDown", + "value": "Go to next mention" + }, + "AccDescrMirror": { + "key": "AccDescrMirror", + "value": "Mirror" + }, + "AccDescrMoreOptions": { + "key": "AccDescrMoreOptions", + "value": "More options" + }, + "AccDescrMsgNotPlayed": { + "key": "AccDescrMsgNotPlayed", + "value": "Not played" + }, + "AccDescrMsgRead": { + "key": "AccDescrMsgRead", + "value": "Seen" + }, + "AccDescrMsgSending": { + "key": "AccDescrMsgSending", + "value": "Sending" + }, + "AccDescrMsgSendingError": { + "key": "AccDescrMsgSendingError", + "value": "Sending error" + }, + "AccDescrMsgUnread": { + "key": "AccDescrMsgUnread", + "value": "Not seen" + }, + "AccDescrMusicInfo": { + "key": "AccDescrMusicInfo", + "value": "%2$s by %1$s" + }, + "AccDescrMuteMic": { + "key": "AccDescrMuteMic", + "value": "Mute microphone" + }, + "AccDescrMyLocation": { + "key": "AccDescrMyLocation", + "value": "My location" + }, + "AccDescrNumberOfViews": { + "key": "AccDescrNumberOfViews", + "zeroValue": null, + "oneValue": "Viewed %1$d time", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Viewed %1$d times" + }, + "AccDescrOpenChat": { + "key": "AccDescrOpenChat", + "value": "Open chat" + }, + "AccDescrOpenInPhotoViewer": { + "key": "AccDescrOpenInPhotoViewer", + "value": "Open in photo viewer" + }, + "AccDescrOpenMenu": { + "key": "AccDescrOpenMenu", + "value": "Open navigation menu" + }, + "AccDescrOpenMenu2": { + "key": "AccDescrOpenMenu2", + "value": "Open menu" + }, + "AccDescrPageDown": { + "key": "AccDescrPageDown", + "value": "Go to bottom" + }, + "AccDescrPasscodeLock": { + "key": "AccDescrPasscodeLock", + "value": "Lock application" + }, + "AccDescrPasscodeUnlock": { + "key": "AccDescrPasscodeUnlock", + "value": "Unlock application" + }, + "AccDescrPhotoAdjust": { + "key": "AccDescrPhotoAdjust", + "value": "Adjustments" + }, + "AccDescrPhotoEditor": { + "key": "AccDescrPhotoEditor", + "value": "Photo editor" + }, + "AccDescrPhotoViewer": { + "key": "AccDescrPhotoViewer", + "value": "Photo viewer" + }, + "AccDescrPipMode": { + "key": "AccDescrPipMode", + "value": "Picture-in-Picture mode" + }, + "AccDescrPlayerDuration": { + "key": "AccDescrPlayerDuration", + "value": "%1$s of %2$s" + }, + "AccDescrPlayerSpeed": { + "key": "AccDescrPlayerSpeed", + "value": "2X playback" + }, + "AccDescrPrevious": { + "key": "AccDescrPrevious", + "value": "Previous" + }, + "AccDescrProfilePicture": { + "key": "AccDescrProfilePicture", + "value": "Profile picture" + }, + "AccDescrQuizCorrectAnswer": { + "key": "AccDescrQuizCorrectAnswer", + "value": "Correct answer" + }, + "AccDescrQuizExplanation": { + "key": "AccDescrQuizExplanation", + "value": "Explanation" + }, + "AccDescrReceivedDate": { + "key": "AccDescrReceivedDate", + "value": "Received %s" + }, + "AccDescrRepeatList": { + "key": "AccDescrRepeatList", + "value": "Repeat, playlist" + }, + "AccDescrRepeatOff": { + "key": "AccDescrRepeatOff", + "value": "Repeat, off" + }, + "AccDescrRepeatOne": { + "key": "AccDescrRepeatOne", + "value": "Repeat, one" + }, + "AccDescrReplying": { + "key": "AccDescrReplying", + "value": "Replying to" + }, + "AccDescrRotate": { + "key": "AccDescrRotate", + "value": "Rotate" + }, + "AccDescrScheduledDate": { + "key": "AccDescrScheduledDate", + "value": "Scheduled for %s" + }, + "AccDescrSearchByUser": { + "key": "AccDescrSearchByUser", + "value": "Filter by user" + }, + "AccDescrSearchNext": { + "key": "AccDescrSearchNext", + "value": "Next search result" + }, + "AccDescrSearchPrev": { + "key": "AccDescrSearchPrev", + "value": "Previous search result" + }, + "AccDescrSecretChat": { + "key": "AccDescrSecretChat", + "value": "Secret chat" + }, + "AccDescrSendAudio": { + "key": "AccDescrSendAudio", + "zeroValue": null, + "oneValue": "Send %1$d audio file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %1$d audio files" + }, + "AccDescrSendFiles": { + "key": "AccDescrSendFiles", + "zeroValue": null, + "oneValue": "Send %1$d file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %1$d files" + }, + "AccDescrSendPhotos": { + "key": "AccDescrSendPhotos", + "zeroValue": null, + "oneValue": "Send %1$d photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %1$d photos" + }, + "AccDescrSentDate": { + "key": "AccDescrSentDate", + "value": "Sent %s" + }, + "AccDescrShareInChats": { + "key": "AccDescrShareInChats", + "zeroValue": null, + "oneValue": "Share in %1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Share in %1$d chats" + }, + "AccDescrShowAccounts": { + "key": "AccDescrShowAccounts", + "value": "Show accounts" + }, + "AccDescrShowKeyboard": { + "key": "AccDescrShowKeyboard", + "value": "Show keyboard" + }, + "AccDescrShutter": { + "key": "AccDescrShutter", + "value": "Shutter" + }, + "AccDescrStickerSet": { + "key": "AccDescrStickerSet", + "value": "Sticker set" + }, + "AccDescrStickers": { + "key": "AccDescrStickers", + "value": "Stickers" + }, + "AccDescrStopLiveLocation": { + "key": "AccDescrStopLiveLocation", + "value": "Stop sharing live location" + }, + "AccDescrSwitchCamera": { + "key": "AccDescrSwitchCamera", + "value": "Switch camera" + }, + "AccDescrSwitchToDayTheme": { + "key": "AccDescrSwitchToDayTheme", + "value": "Switch to day theme" + }, + "AccDescrSwitchToNightTheme": { + "key": "AccDescrSwitchToNightTheme", + "value": "Switch to night theme" + }, + "AccDescrTakeMorePics": { + "key": "AccDescrTakeMorePics", + "value": "Take one more picture" + }, + "AccDescrUploadProgress": { + "key": "AccDescrUploadProgress", + "value": "Uploaded %1$s of %2$s" + }, + "AccDescrUserOptions": { + "key": "AccDescrUserOptions", + "value": "User options" + }, + "AccDescrVideoCompressHigh": { + "key": "AccDescrVideoCompressHigh", + "value": "Higher quality" + }, + "AccDescrVideoCompressLow": { + "key": "AccDescrVideoCompressLow", + "value": "Smaller size" + }, + "AccDescrVideoMessage": { + "key": "AccDescrVideoMessage", + "value": "Record video message" + }, + "AccDescrVideoQuality": { + "key": "AccDescrVideoQuality", + "value": "Video quality" + }, + "AccDescrVoiceMessage": { + "key": "AccDescrVoiceMessage", + "value": "Record voice message" + }, + "AccDescrVoipCamOff": { + "key": "AccDescrVoipCamOff", + "value": "Camera is off" + }, + "AccDescrVoipCamOn": { + "key": "AccDescrVoipCamOn", + "value": "Camera is on" + }, + "AccDescrVoipCamSwitchedToBack": { + "key": "AccDescrVoipCamSwitchedToBack", + "value": "Switched to rear camera" + }, + "AccDescrVoipCamSwitchedToFront": { + "key": "AccDescrVoipCamSwitchedToFront", + "value": "Switched to front camera" + }, + "AccDescrVoipMicOff": { + "key": "AccDescrVoipMicOff", + "value": "Microphone is off" + }, + "AccDescrVoipMicOn": { + "key": "AccDescrVoipMicOn", + "value": "Microphone is on" + }, + "AccExitFullscreen": { + "key": "AccExitFullscreen", + "value": "Exit fullscreen" + }, + "AccPinnedMessagesList": { + "key": "AccPinnedMessagesList", + "value": "Pinned message list" + }, + "AccReleaseForArchive": { + "key": "AccReleaseForArchive", + "value": "Release for archive" + }, + "AccSwipeForArchive": { + "key": "AccSwipeForArchive", + "value": "Swipe down for archive" + }, + "AccSwitchToFullscreen": { + "key": "AccSwitchToFullscreen", + "value": "Switch to fullscreen" + }, + "Accept": { + "key": "Accept", + "value": "Accept" + }, + "AcceptCall": { + "key": "AcceptCall", + "value": "Accept" + }, + "AccessError": { + "key": "AccessError", + "value": "Access error" + }, + "Account": { + "key": "Account", + "value": "Account" + }, + "AccountAlreadyLoggedIn": { + "key": "AccountAlreadyLoggedIn", + "value": "This account is already logged in from this app." + }, + "AccountSettings": { + "key": "AccountSettings", + "value": "Account Settings" + }, + "AccountSwitch": { + "key": "AccountSwitch", + "value": "Switch" + }, + "AccurateTo": { + "key": "AccurateTo", + "value": "Accurate to %1$s" + }, + "ActionAddUser": { + "key": "ActionAddUser", + "value": "un1 added un2" + }, + "ActionAddUserSelf": { + "key": "ActionAddUserSelf", + "value": "un1 returned to the group" + }, + "ActionAddUserSelfMega": { + "key": "ActionAddUserSelfMega", + "value": "un1 joined the group" + }, + "ActionAddUserSelfYou": { + "key": "ActionAddUserSelfYou", + "value": "You returned to the group" + }, + "ActionAddUserYou": { + "key": "ActionAddUserYou", + "value": "un1 added you" + }, + "ActionBotAllowed": { + "key": "ActionBotAllowed", + "value": "You allowed this bot to message you when you logged in on %1$s." + }, + "ActionBotDocumentAddress": { + "key": "ActionBotDocumentAddress", + "value": "Address" + }, + "ActionBotDocumentBankStatement": { + "key": "ActionBotDocumentBankStatement", + "value": "Bank Statement" + }, + "ActionBotDocumentDriverLicence": { + "key": "ActionBotDocumentDriverLicence", + "value": "Driver Licence" + }, + "ActionBotDocumentEmail": { + "key": "ActionBotDocumentEmail", + "value": "Email Address" + }, + "ActionBotDocumentIdentity": { + "key": "ActionBotDocumentIdentity", + "value": "Personal details" + }, + "ActionBotDocumentIdentityCard": { + "key": "ActionBotDocumentIdentityCard", + "value": "Identity Card" + }, + "ActionBotDocumentInternalPassport": { + "key": "ActionBotDocumentInternalPassport", + "value": "Internal Passport" + }, + "ActionBotDocumentPassport": { + "key": "ActionBotDocumentPassport", + "value": "Passport" + }, + "ActionBotDocumentPassportRegistration": { + "key": "ActionBotDocumentPassportRegistration", + "value": "Passport Registration" + }, + "ActionBotDocumentPhone": { + "key": "ActionBotDocumentPhone", + "value": "Phone Number" + }, + "ActionBotDocumentRentalAgreement": { + "key": "ActionBotDocumentRentalAgreement", + "value": "Rental Agreement" + }, + "ActionBotDocumentTemporaryRegistration": { + "key": "ActionBotDocumentTemporaryRegistration", + "value": "Temporary Registration" + }, + "ActionBotDocumentUtilityBill": { + "key": "ActionBotDocumentUtilityBill", + "value": "Utility Bill" + }, + "ActionBotDocuments": { + "key": "ActionBotDocuments", + "value": "%1$s received the following documents: %2$s" + }, + "ActionChangedPhoto": { + "key": "ActionChangedPhoto", + "value": "un1 changed the group photo" + }, + "ActionChangedTitle": { + "key": "ActionChangedTitle", + "value": "un1 changed the group name to un2" + }, + "ActionChangedVideo": { + "key": "ActionChangedVideo", + "value": "un1 changed the group video" + }, + "ActionChannelChangedPhoto": { + "key": "ActionChannelChangedPhoto", + "value": "Channel photo changed" + }, + "ActionChannelChangedTitle": { + "key": "ActionChannelChangedTitle", + "value": "Channel name changed to un2" + }, + "ActionChannelChangedVideo": { + "key": "ActionChannelChangedVideo", + "value": "Channel video changed" + }, + "ActionChannelRemovedPhoto": { + "key": "ActionChannelRemovedPhoto", + "value": "Channel photo removed" + }, + "ActionCreateChannel": { + "key": "ActionCreateChannel", + "value": "Channel created" + }, + "ActionCreateGroup": { + "key": "ActionCreateGroup", + "value": "un1 created the group" + }, + "ActionCreateMega": { + "key": "ActionCreateMega", + "value": "Group created" + }, + "ActionCreatedInviteLink": { + "key": "ActionCreatedInviteLink", + "value": "un1 created invite link %1$s" + }, + "ActionDeletedInviteLink": { + "key": "ActionDeletedInviteLink", + "value": "un1 deleted invite link %1$s" + }, + "ActionEditedInviteLink": { + "key": "ActionEditedInviteLink", + "value": "un1 edited invite link %1$s to %2$s" + }, + "ActionEditedInviteLinkToSame": { + "key": "ActionEditedInviteLinkToSame", + "value": "un1 edited invite link %1$s" + }, + "ActionGroupCallEnded": { + "key": "ActionGroupCallEnded", + "value": "Voice chat ended (%s)" + }, + "ActionGroupCallInvited": { + "key": "ActionGroupCallInvited", + "value": "un1 invited un2 to the voice chat" + }, + "ActionGroupCallInvitedYou": { + "key": "ActionGroupCallInvitedYou", + "value": "un1 invited you to the voice chat" + }, + "ActionGroupCallStarted": { + "key": "ActionGroupCallStarted", + "value": "un1 started a voice chat" + }, + "ActionGroupCallStartedByYou": { + "key": "ActionGroupCallStartedByYou", + "value": "You started a voice chat" + }, + "ActionGroupCallYouInvited": { + "key": "ActionGroupCallYouInvited", + "value": "You invited un2 to the voice chat" + }, + "ActionInviteUser": { + "key": "ActionInviteUser", + "value": "un1 joined the group via invite link" + }, + "ActionInviteYou": { + "key": "ActionInviteYou", + "value": "You joined the group via invite link" + }, + "ActionKickUser": { + "key": "ActionKickUser", + "value": "un1 removed un2" + }, + "ActionKickUserYou": { + "key": "ActionKickUserYou", + "value": "un1 removed you" + }, + "ActionLeftUser": { + "key": "ActionLeftUser", + "value": "un1 left the group" + }, + "ActionMigrateFromGroup": { + "key": "ActionMigrateFromGroup", + "value": "This group was upgraded to a supergroup" + }, + "ActionMigrateFromGroupNotify": { + "key": "ActionMigrateFromGroupNotify", + "value": "%1$s was upgraded to a supergroup" + }, + "ActionPinnedContact": { + "key": "ActionPinnedContact", + "value": "un1 pinned a contact" + }, + "ActionPinnedFile": { + "key": "ActionPinnedFile", + "value": "un1 pinned a file" + }, + "ActionPinnedGame": { + "key": "ActionPinnedGame", + "value": "un1 pinned %1$s" + }, + "ActionPinnedGeo": { + "key": "ActionPinnedGeo", + "value": "un1 pinned a map" + }, + "ActionPinnedGeoLive": { + "key": "ActionPinnedGeoLive", + "value": "un1 pinned a live location" + }, + "ActionPinnedGif": { + "key": "ActionPinnedGif", + "value": "un1 pinned a GIF" + }, + "ActionPinnedMusic": { + "key": "ActionPinnedMusic", + "value": "un1 pinned an audio file" + }, + "ActionPinnedNoText": { + "key": "ActionPinnedNoText", + "value": "un1 pinned a message" + }, + "ActionPinnedPhoto": { + "key": "ActionPinnedPhoto", + "value": "un1 pinned a photo" + }, + "ActionPinnedPoll": { + "key": "ActionPinnedPoll", + "value": "un1 pinned a poll" + }, + "ActionPinnedQuiz": { + "key": "ActionPinnedQuiz", + "value": "un1 pinned a quiz" + }, + "ActionPinnedRound": { + "key": "ActionPinnedRound", + "value": "un1 pinned a video message" + }, + "ActionPinnedSticker": { + "key": "ActionPinnedSticker", + "value": "un1 pinned a sticker" + }, + "ActionPinnedText": { + "key": "ActionPinnedText", + "value": "un1 pinned \"%1$s\"" + }, + "ActionPinnedVideo": { + "key": "ActionPinnedVideo", + "value": "un1 pinned a video" + }, + "ActionPinnedVoice": { + "key": "ActionPinnedVoice", + "value": "un1 pinned a voice message" + }, + "ActionRemovedPhoto": { + "key": "ActionRemovedPhoto", + "value": "un1 removed the group photo" + }, + "ActionRevokedInviteLink": { + "key": "ActionRevokedInviteLink", + "value": "un1 revoked invite link %1$s" + }, + "ActionTTLChanged": { + "key": "ActionTTLChanged", + "value": "un1 has set messages to auto-delete in %1$s" + }, + "ActionTTLChannelChanged": { + "key": "ActionTTLChannelChanged", + "value": "Messages in this channel will be automatically deleted after %1$s" + }, + "ActionTTLChannelDisabled": { + "key": "ActionTTLChannelDisabled", + "value": "Messages in this channel will no longer be automatically deleted" + }, + "ActionTTLDisabled": { + "key": "ActionTTLDisabled", + "value": "un1 disabled the auto-delete timer" + }, + "ActionTTLYouChanged": { + "key": "ActionTTLYouChanged", + "value": "You set messages to auto-delete in %1$s" + }, + "ActionTTLYouDisabled": { + "key": "ActionTTLYouDisabled", + "value": "You disabled the auto-delete timer" + }, + "ActionTakeScreenshoot": { + "key": "ActionTakeScreenshoot", + "value": "un1 took a screenshot!" + }, + "ActionTakeScreenshootYou": { + "key": "ActionTakeScreenshootYou", + "value": "You took a screenshot!" + }, + "ActionUserInvitedToChannel": { + "key": "ActionUserInvitedToChannel", + "value": "un1 invited you to this channel" + }, + "ActionUserInvitedToGroup": { + "key": "ActionUserInvitedToGroup", + "value": "un1 invited you to this group" + }, + "ActionUserScored": { + "key": "ActionUserScored", + "value": "un1 scored %1$s" + }, + "ActionUserScoredInGame": { + "key": "ActionUserScoredInGame", + "value": "un1 scored %1$s in un2" + }, + "ActionUserWithinOtherRadius": { + "key": "ActionUserWithinOtherRadius", + "value": "un1 is now within %1$s from un2" + }, + "ActionUserWithinRadius": { + "key": "ActionUserWithinRadius", + "value": "un1 is now within %1$s from you" + }, + "ActionUserWithinYouRadius": { + "key": "ActionUserWithinYouRadius", + "value": "You are now within %1$s from un1" + }, + "ActionVolumeChanged": { + "key": "ActionVolumeChanged", + "value": "un1 changed un2 volume to %1$d%%" + }, + "ActionYouAddUser": { + "key": "ActionYouAddUser", + "value": "You added un2" + }, + "ActionYouChangedPhoto": { + "key": "ActionYouChangedPhoto", + "value": "You changed the group photo" + }, + "ActionYouChangedTitle": { + "key": "ActionYouChangedTitle", + "value": "You changed the group name to un2" + }, + "ActionYouChangedVideo": { + "key": "ActionYouChangedVideo", + "value": "You changed the group video" + }, + "ActionYouCreateGroup": { + "key": "ActionYouCreateGroup", + "value": "You created the group" + }, + "ActionYouKickUser": { + "key": "ActionYouKickUser", + "value": "You removed un2" + }, + "ActionYouLeftUser": { + "key": "ActionYouLeftUser", + "value": "You left the group" + }, + "ActionYouRemovedPhoto": { + "key": "ActionYouRemovedPhoto", + "value": "You removed the group photo" + }, + "ActionYouScored": { + "key": "ActionYouScored", + "value": "You scored %1$s" + }, + "ActionYouScoredInGame": { + "key": "ActionYouScoredInGame", + "value": "You scored %1$s in un2" + }, + "ActionsChartTitle": { + "key": "ActionsChartTitle", + "value": "Actions" + }, + "Add": { + "key": "Add", + "value": "Add" + }, + "AddAccount": { + "key": "AddAccount", + "value": "Add Account" + }, + "AddAdminErrorBlacklisted": { + "key": "AddAdminErrorBlacklisted", + "value": "Sorry, you can't add this user as an admin because they are in the Removed Users list and you can't unban them." + }, + "AddAdminErrorNotAMember": { + "key": "AddAdminErrorNotAMember", + "value": "Sorry, you can't add this user as an admin because they are not a member of this group and you are not allowed to add them." + }, + "AddAnExplanation": { + "key": "AddAnExplanation", + "value": "Add an explanation" + }, + "AddAnExplanationInfo": { + "key": "AddAnExplanationInfo", + "value": "Users will see this text after choosing the wrong answer, good for educational purposes." + }, + "AddAnOption": { + "key": "AddAnOption", + "value": "Add an Option..." + }, + "AddAnOptionInfo": { + "key": "AddAnOptionInfo", + "value": "You can add %1$s." + }, + "AddAnOptionInfoMax": { + "key": "AddAnOptionInfoMax", + "value": "You have added the maximum number of options." + }, + "AddAnotherAccount": { + "key": "AddAnotherAccount", + "value": "Add another account" + }, + "AddAnotherAccountInfo": { + "key": "AddAnotherAccountInfo", + "value": "Connect other Telegram accounts and easily switch between them." + }, + "AddBannedErrorAdmin": { + "key": "AddBannedErrorAdmin", + "value": "Sorry, you can't ban this user because they are an admin in this group and you are not allowed to demote them." + }, + "AddBotAsAdmin": { + "key": "AddBotAsAdmin", + "value": "Bots can only be added as administrators." + }, + "AddCaption": { + "key": "AddCaption", + "value": "Add a caption..." + }, + "AddContact": { + "key": "AddContact", + "value": "Add to contacts" + }, + "AddContactByPhone": { + "key": "AddContactByPhone", + "value": "Add %1$s" + }, + "AddContactChat": { + "key": "AddContactChat", + "value": "ADD CONTACT" + }, + "AddContactFullChat": { + "key": "AddContactFullChat", + "value": "ADD %1$s TO CONTACTS" + }, + "AddContactPhonebookTitle": { + "key": "AddContactPhonebookTitle", + "value": "Add Contact" + }, + "AddContactTitle": { + "key": "AddContactTitle", + "value": "Add Contact" + }, + "AddExceptions": { + "key": "AddExceptions", + "value": "Add exceptions" + }, + "AddMasks": { + "key": "AddMasks", + "value": "Add Masks" + }, + "AddMasksInstalled": { + "key": "AddMasksInstalled", + "value": "New masks added" + }, + "AddMasksInstalledInfo": { + "key": "AddMasksInstalledInfo", + "value": "%1$s has been added to your masks." + }, + "AddMember": { + "key": "AddMember", + "value": "Add Member" + }, + "AddMembersAlertCountText": { + "key": "AddMembersAlertCountText", + "value": "Are you sure you want to add %1$s to **%2$s**?" + }, + "AddMembersAlertNamesText": { + "key": "AddMembersAlertNamesText", + "value": "Are you sure you want to add %1$s to **%2$s**?" + }, + "AddMembersAlertTitle": { + "key": "AddMembersAlertTitle", + "value": "Add %1$s" + }, + "AddMembersForwardMessages": { + "key": "AddMembersForwardMessages", + "value": "Show the last 100 messages to the new members" + }, + "AddMutual": { + "key": "AddMutual", + "value": "Add people to your channel" + }, + "AddOneMemberAlertTitle": { + "key": "AddOneMemberAlertTitle", + "value": "Add member" + }, + "AddOneMemberForwardMessages": { + "key": "AddOneMemberForwardMessages", + "value": "Show the last 100 messages to **%1$s**" + }, + "AddPeopleNearby": { + "key": "AddPeopleNearby", + "value": "Find People Nearby" + }, + "AddPhoto": { + "key": "AddPhoto", + "value": "Set new photo" + }, + "AddProxy": { + "key": "AddProxy", + "value": "Add Proxy" + }, + "AddRecipient": { + "key": "AddRecipient", + "value": "Add recipient" + }, + "AddShortcut": { + "key": "AddShortcut", + "value": "Add to Home screen" + }, + "AddStickers": { + "key": "AddStickers", + "value": "Add Stickers" + }, + "AddStickersCount": { + "key": "AddStickersCount", + "value": "ADD %1$s" + }, + "AddStickersInstalled": { + "key": "AddStickersInstalled", + "value": "New stickers added" + }, + "AddStickersInstalledInfo": { + "key": "AddStickersInstalledInfo", + "value": "%1$s has been added to your stickers." + }, + "AddStickersNotFound": { + "key": "AddStickersNotFound", + "value": "Stickers not found" + }, + "AddSubscriber": { + "key": "AddSubscriber", + "value": "Add subscriber" + }, + "AddToContacts": { + "key": "AddToContacts", + "value": "Add to contacts" + }, + "AddToExceptions": { + "key": "AddToExceptions", + "value": "Add to exceptions" + }, + "AddToExistingContact": { + "key": "AddToExistingContact", + "value": "Add to Existing Contact" + }, + "AddToFavorites": { + "key": "AddToFavorites", + "value": "Add to Favorites" + }, + "AddToMasks": { + "key": "AddToMasks", + "value": "Add to Masks" + }, + "AddToStickers": { + "key": "AddToStickers", + "value": "Add to Stickers" + }, + "AddToTheGroup": { + "key": "AddToTheGroup", + "value": "Add %1$s to the group?" + }, + "AddToTheGroupAlertText": { + "key": "AddToTheGroupAlertText", + "value": "Do you want to add **%1$s** to the group **%2$s**?" + }, + "AddToTheGroupAlertTitle": { + "key": "AddToTheGroupAlertTitle", + "value": "Add bot" + }, + "AddToTheGroupForwardCount": { + "key": "AddToTheGroupForwardCount", + "value": "Number of last messages to forward:" + }, + "AddToTheGroupTitle": { + "key": "AddToTheGroupTitle", + "value": "Add %1$s to the chat %2$s?" + }, + "AddUserErrorBlacklisted": { + "key": "AddUserErrorBlacklisted", + "value": "Sorry, you can't add this user because they are on the list of Removed Users and you can't unban them." + }, + "AddedToFavorites": { + "key": "AddedToFavorites", + "value": "Sticker was added to Favorites" + }, + "AdminWillBeRemoved": { + "key": "AdminWillBeRemoved", + "value": "%1$s will be removed from admins if you restrict them." + }, + "Agree": { + "key": "Agree", + "value": "Agree" + }, + "Alert": { + "key": "Alert", + "value": "Show notifications" + }, + "AlertClearHistory": { + "key": "AlertClearHistory", + "value": "Clear History" + }, + "AllAccounts": { + "key": "AllAccounts", + "value": "All Accounts" + }, + "AllMedia": { + "key": "AllMedia", + "value": "All media" + }, + "AllPhotos": { + "key": "AllPhotos", + "value": "All photos" + }, + "AllVideo": { + "key": "AllVideo", + "value": "All Videos" + }, + "AllVideos": { + "key": "AllVideos", + "value": "All videos" + }, + "AllowCustomQuickReply": { + "key": "AllowCustomQuickReply", + "value": "Allow Custom" + }, + "AllowFillNumber": { + "key": "AllowFillNumber", + "value": "Please allow Telegram to receive calls so that we can automatically confirm your phone number." + }, + "AllowReadCall": { + "key": "AllowReadCall", + "value": "Please allow Telegram to receive calls so that we can automatically enter your code for you." + }, + "AllowReadCallAndLog": { + "key": "AllowReadCallAndLog", + "value": "Please allow Telegram to receive calls and read the call log so that we can automatically enter your code for you." + }, + "AllowReadCallAndSms": { + "key": "AllowReadCallAndSms", + "value": "Please allow Telegram to receive calls so that we can automatically confirm your phone number." + }, + "AllowReadCallLog": { + "key": "AllowReadCallLog", + "value": "Please allow Telegram to read the call log so that we can automatically enter your code for you." + }, + "AllowReadSms": { + "key": "AllowReadSms", + "value": "Please allow Telegram to receive SMS so that we can automatically enter your code for you." + }, + "AlternativeOptions": { + "key": "AlternativeOptions", + "value": "Alternative options" + }, + "AlwaysAllow": { + "key": "AlwaysAllow", + "value": "Always Allow" + }, + "AlwaysAllowPlaceholder": { + "key": "AlwaysAllowPlaceholder", + "value": "Always allow..." + }, + "AlwaysShareWith": { + "key": "AlwaysShareWith", + "value": "Always Share With" + }, + "AlwaysShareWithPlaceholder": { + "key": "AlwaysShareWithPlaceholder", + "value": "Always share with users..." + }, + "AlwaysShareWithTitle": { + "key": "AlwaysShareWithTitle", + "value": "Always Share" + }, + "AlwaysShowPopup": { + "key": "AlwaysShowPopup", + "value": "Always show popup" + }, + "AndMoreTyping": { + "key": "AndMoreTyping", + "zeroValue": null, + "oneValue": "and %1$d more are typing", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "and %1$d more are typing" + }, + "AndMoreTypingGroup": { + "key": "AndMoreTypingGroup", + "zeroValue": null, + "oneValue": "%1$s and %2$d more are typing", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s and %2$d more are typing" + }, + "AndOther": { + "key": "AndOther", + "zeroValue": null, + "oneValue": "and %1$d other", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "and %1$d others" + }, + "AnimatedStickers": { + "key": "AnimatedStickers", + "value": "Animated Stickers" + }, + "AnonymousPoll": { + "key": "AnonymousPoll", + "value": "Anonymous Poll" + }, + "AnonymousQuizPoll": { + "key": "AnonymousQuizPoll", + "value": "Anonymous Quiz" + }, + "Answer": { + "key": "Answer", + "zeroValue": null, + "oneValue": "%1$d answer", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d answers" + }, + "AnswerOptions": { + "key": "AnswerOptions", + "value": "Answer options" + }, + "ApkRestricted": { + "key": "ApkRestricted", + "value": "APK installation is restricted for this app. You can enable this in system settings." + }, + "AppFolderInfo": { + "key": "AppFolderInfo", + "value": "Browse the app's folder" + }, + "AppName": { + "key": "AppName", + "value": "Telegram" + }, + "AppNameBeta": { + "key": "AppNameBeta", + "value": "Telegram" + }, + "Appearance": { + "key": "Appearance", + "value": "Appearance" + }, + "ApplyLocalizationFile": { + "key": "ApplyLocalizationFile", + "value": "Apply localization file" + }, + "ApplyTheme": { + "key": "ApplyTheme", + "value": "APPLY" + }, + "ApplyThemeFile": { + "key": "ApplyThemeFile", + "value": "Apply theme file" + }, + "April": { + "key": "April", + "value": "April" + }, + "Archive": { + "key": "Archive", + "value": "Archive" + }, + "ArchiveAndMute": { + "key": "ArchiveAndMute", + "value": "Archive and Mute" + }, + "ArchiveAndMuteInfo": { + "key": "ArchiveAndMuteInfo", + "value": "Automatically archive and mute new chats, groups and channels from non-contacts." + }, + "ArchiveHidden": { + "key": "ArchiveHidden", + "value": "Archive hidden." + }, + "ArchiveHiddenInfo": { + "key": "ArchiveHiddenInfo", + "value": "Swipe down to see the archive." + }, + "ArchiveHintHeader1": { + "key": "ArchiveHintHeader1", + "value": "This is your Archive" + }, + "ArchiveHintHeader2": { + "key": "ArchiveHintHeader2", + "value": "Muted chats" + }, + "ArchiveHintHeader3": { + "key": "ArchiveHintHeader3", + "value": "Pinned chats" + }, + "ArchiveHintText1": { + "key": "ArchiveHintText1", + "value": "Chats with enabled notifications get unarchived when new messages arrive." + }, + "ArchiveHintText2": { + "key": "ArchiveHintText2", + "value": "Chats with disabled notifications stay archived when new messages arrive." + }, + "ArchiveHintText3": { + "key": "ArchiveHintText3", + "value": "You can pin an unlimited number of archived chats to the top." + }, + "ArchivePinned": { + "key": "ArchivePinned", + "value": "Archive pinned." + }, + "ArchivePinnedInfo": { + "key": "ArchivePinnedInfo", + "value": "Swipe left on the archive to hide it." + }, + "ArchiveSearchFilter": { + "key": "ArchiveSearchFilter", + "value": "Archive" + }, + "ArchiveStickerSetsAlertTitle": { + "key": "ArchiveStickerSetsAlertTitle", + "value": "Archive %1$s" + }, + "ArchiveStickersAlertMessage": { + "key": "ArchiveStickersAlertMessage", + "value": "Are you sure you want to archive the selected sticker sets?" + }, + "ArchivedChats": { + "key": "ArchivedChats", + "value": "Archived Chats" + }, + "ArchivedMasks": { + "key": "ArchivedMasks", + "value": "Archived Masks" + }, + "ArchivedMasksAlertInfo": { + "key": "ArchivedMasksAlertInfo", + "value": "Some of your older masks sets have been archived. You can reactivate them in the Masks Settings." + }, + "ArchivedMasksAlertTitle": { + "key": "ArchivedMasksAlertTitle", + "value": "Archived masks" + }, + "ArchivedMasksEmpty": { + "key": "ArchivedMasksEmpty", + "value": "No archived masks" + }, + "ArchivedMasksInfo": { + "key": "ArchivedMasksInfo", + "value": "You can have up to 200 sets of masks.\nUnused sets are archived when you add more." + }, + "ArchivedStickers": { + "key": "ArchivedStickers", + "value": "Archived Stickers" + }, + "ArchivedStickersAlertInfo": { + "key": "ArchivedStickersAlertInfo", + "value": "Some of your older sticker sets have been archived. You can reactivate them in the Stickers Settings." + }, + "ArchivedStickersAlertTitle": { + "key": "ArchivedStickersAlertTitle", + "value": "Archived stickers" + }, + "ArchivedStickersEmpty": { + "key": "ArchivedStickersEmpty", + "value": "No archived stickers" + }, + "ArchivedStickersInfo": { + "key": "ArchivedStickersInfo", + "value": "You can have 200 active sticker sets.\nUnused sets are archived when you add more." + }, + "AreTyping": { + "key": "AreTyping", + "value": "are typing..." + }, + "AreTypingGroup": { + "key": "AreTypingGroup", + "value": "%1$s are typing..." + }, + "AreYouSure": { + "key": "AreYouSure", + "value": "Are you sure?" + }, + "AreYouSureBlockContact": { + "key": "AreYouSureBlockContact", + "value": "Are you sure you want to block this contact?" + }, + "AreYouSureBlockContact2": { + "key": "AreYouSureBlockContact2", + "value": "Are you sure you want to block **%1$s**?" + }, + "AreYouSureClearDrafts": { + "key": "AreYouSureClearDrafts", + "value": "Are you sure you want to delete all cloud drafts?" + }, + "AreYouSureClearDraftsTitle": { + "key": "AreYouSureClearDraftsTitle", + "value": "Delete cloud drafts" + }, + "AreYouSureClearHistory": { + "key": "AreYouSureClearHistory", + "value": "Are you sure you want to delete all messages in this chat?" + }, + "AreYouSureClearHistoryCacheFewChats": { + "key": "AreYouSureClearHistoryCacheFewChats", + "value": "Delete all cached text and media from selected chats?" + }, + "AreYouSureClearHistoryChannel": { + "key": "AreYouSureClearHistoryChannel", + "value": "Delete all cached text and media from this channel?" + }, + "AreYouSureClearHistoryFewChats": { + "key": "AreYouSureClearHistoryFewChats", + "value": "Are you sure you want to clear history in selected chats?" + }, + "AreYouSureClearHistoryGroup": { + "key": "AreYouSureClearHistoryGroup", + "value": "Delete all cached text and media from this group?" + }, + "AreYouSureClearHistorySavedMessages": { + "key": "AreYouSureClearHistorySavedMessages", + "value": "Are you sure you want to clear **Saved Messages**?" + }, + "AreYouSureClearHistoryWithChat": { + "key": "AreYouSureClearHistoryWithChat", + "value": "Are you sure you want to clear the chat history in **%1$s**?" + }, + "AreYouSureClearHistoryWithSecretUser": { + "key": "AreYouSureClearHistoryWithSecretUser", + "value": "Are you sure you want to clear your secret chat history with **%1$s**?" + }, + "AreYouSureClearHistoryWithUser": { + "key": "AreYouSureClearHistoryWithUser", + "value": "Are you sure you want to clear your chat history with **%1$s**?" + }, + "AreYouSureDeleteAndExit": { + "key": "AreYouSureDeleteAndExit", + "value": "Are you sure you want to delete and leave the group?" + }, + "AreYouSureDeleteAndExitChannel": { + "key": "AreYouSureDeleteAndExitChannel", + "value": "Do you want to delete and leave the channel?" + }, + "AreYouSureDeleteAndExitName": { + "key": "AreYouSureDeleteAndExitName", + "value": "Are you sure you want to delete and leave the group **%1$s**?" + }, + "AreYouSureDeleteContact": { + "key": "AreYouSureDeleteContact", + "value": "Are you sure you want to delete this contact?" + }, + "AreYouSureDeleteFewChats": { + "key": "AreYouSureDeleteFewChats", + "value": "Are you sure you want to delete selected chats?" + }, + "AreYouSureDeleteFewMessages": { + "key": "AreYouSureDeleteFewMessages", + "value": "Are you sure you want to delete these messages?" + }, + "AreYouSureDeleteFewMessagesMega": { + "key": "AreYouSureDeleteFewMessagesMega", + "value": "Are you sure you want to delete these messages for everyone?" + }, + "AreYouSureDeleteGIF": { + "key": "AreYouSureDeleteGIF", + "value": "Are you sure you want to delete this GIF?" + }, + "AreYouSureDeleteGIFEveryone": { + "key": "AreYouSureDeleteGIFEveryone", + "value": "Are you sure you want to delete this GIF for everyone?" + }, + "AreYouSureDeleteGIFTitle": { + "key": "AreYouSureDeleteGIFTitle", + "value": "Delete GIF" + }, + "AreYouSureDeleteMessages": { + "key": "AreYouSureDeleteMessages", + "value": "Are you sure you want to delete %1$s?" + }, + "AreYouSureDeletePhoto": { + "key": "AreYouSureDeletePhoto", + "value": "Are you sure you want to delete this photo?" + }, + "AreYouSureDeletePhotoEveryone": { + "key": "AreYouSureDeletePhotoEveryone", + "value": "Are you sure you want to delete this photo for everyone?" + }, + "AreYouSureDeletePhotoTitle": { + "key": "AreYouSureDeletePhotoTitle", + "value": "Delete photo" + }, + "AreYouSureDeleteSingleMessage": { + "key": "AreYouSureDeleteSingleMessage", + "value": "Are you sure you want to delete this message?" + }, + "AreYouSureDeleteSingleMessageMega": { + "key": "AreYouSureDeleteSingleMessageMega", + "value": "Are you sure you want to delete this message for everyone?" + }, + "AreYouSureDeleteThisChat": { + "key": "AreYouSureDeleteThisChat", + "value": "Are you sure you want to delete this chat?" + }, + "AreYouSureDeleteThisChatSavedMessages": { + "key": "AreYouSureDeleteThisChatSavedMessages", + "value": "Are you sure you want to delete **Saved Messages**?" + }, + "AreYouSureDeleteThisChatWithBot": { + "key": "AreYouSureDeleteThisChatWithBot", + "value": "Are you sure you want to delete the chat with **%1$s** and block them?" + }, + "AreYouSureDeleteThisChatWithGroup": { + "key": "AreYouSureDeleteThisChatWithGroup", + "value": "Are you sure you want to delete the chat **%1$s**?" + }, + "AreYouSureDeleteThisChatWithSecretUser": { + "key": "AreYouSureDeleteThisChatWithSecretUser", + "value": "Are you sure you want to delete your secret chat with **%1$s**?" + }, + "AreYouSureDeleteThisChatWithUser": { + "key": "AreYouSureDeleteThisChatWithUser", + "value": "Are you sure you want to delete the chat with **%1$s**?" + }, + "AreYouSureDeleteVideo": { + "key": "AreYouSureDeleteVideo", + "value": "Are you sure you want to delete this video?" + }, + "AreYouSureDeleteVideoEveryone": { + "key": "AreYouSureDeleteVideoEveryone", + "value": "Are you sure you want to delete this video for everyone?" + }, + "AreYouSureDeleteVideoTitle": { + "key": "AreYouSureDeleteVideoTitle", + "value": "Delete video" + }, + "AreYouSureLogout": { + "key": "AreYouSureLogout", + "value": "Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.\n\nRemember, logging out kills all your Secret Chats." + }, + "AreYouSureRegistration": { + "key": "AreYouSureRegistration", + "value": "Are you sure you want to cancel registration?" + }, + "AreYouSureSecretChat": { + "key": "AreYouSureSecretChat", + "value": "Are you sure you want to start a secret chat?" + }, + "AreYouSureSecretChatTitle": { + "key": "AreYouSureSecretChatTitle", + "value": "Secret chat" + }, + "AreYouSureSessionTitle": { + "key": "AreYouSureSessionTitle", + "value": "Terminate session" + }, + "AreYouSureSessions": { + "key": "AreYouSureSessions", + "value": "Are you sure you want to terminate all other sessions?" + }, + "AreYouSureSessionsTitle": { + "key": "AreYouSureSessionsTitle", + "value": "Terminate sessions" + }, + "AreYouSureShareMyContactInfo": { + "key": "AreYouSureShareMyContactInfo", + "value": "Are you sure you want to share your phone number?" + }, + "AreYouSureShareMyContactInfoBot": { + "key": "AreYouSureShareMyContactInfoBot", + "value": "The bot will know your phone number. This can be useful for integration with other services." + }, + "AreYouSureShareMyContactInfoUser": { + "key": "AreYouSureShareMyContactInfoUser", + "value": "Do you want to share your phone number %1$s with **%2$s**?" + }, + "AreYouSureUnblockContact": { + "key": "AreYouSureUnblockContact", + "value": "Are you sure you want to unblock this contact?" + }, + "AreYouSureWebSessions": { + "key": "AreYouSureWebSessions", + "value": "Are you sure you want to disconnect all websites where you used Telegram to log in?" + }, + "ArticleByAuthor": { + "key": "ArticleByAuthor", + "value": "by %1$s" + }, + "ArticleDateByAuthor": { + "key": "ArticleDateByAuthor", + "value": "%1$s by %2$s" + }, + "AskAQuestion": { + "key": "AskAQuestion", + "value": "Ask a Question" + }, + "AskAQuestionInfo": { + "key": "AskAQuestionInfo", + "value": "Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.\n\nPlease take a look at the Telegram FAQ]]>: it has answers to most questions and important tips for troubleshooting]]>." + }, + "AskButton": { + "key": "AskButton", + "value": "Ask a volunteer" + }, + "AttachAudio": { + "key": "AttachAudio", + "value": "Voice message" + }, + "AttachBotsHelp": { + "key": "AttachBotsHelp", + "value": "Scroll down for bots" + }, + "AttachContact": { + "key": "AttachContact", + "value": "Contact" + }, + "AttachDestructingPhoto": { + "key": "AttachDestructingPhoto", + "value": "Self-Destructing Photo" + }, + "AttachDestructingVideo": { + "key": "AttachDestructingVideo", + "value": "Self-Destructing Video" + }, + "AttachDocument": { + "key": "AttachDocument", + "value": "File" + }, + "AttachGame": { + "key": "AttachGame", + "value": "Game" + }, + "AttachGif": { + "key": "AttachGif", + "value": "GIF" + }, + "AttachGifRestricted": { + "key": "AttachGifRestricted", + "value": "The admins of this group have restricted you from sending GIFs here until %1$s" + }, + "AttachGifRestrictedForever": { + "key": "AttachGifRestrictedForever", + "value": "The admins of this group have restricted you from sending GIFs." + }, + "AttachInlineRestricted": { + "key": "AttachInlineRestricted", + "value": "The admins of this group have restricted you from sending inline content here until %1$s" + }, + "AttachInlineRestrictedForever": { + "key": "AttachInlineRestrictedForever", + "value": "The admins of this group have restricted you from sending inline content here." + }, + "AttachLiveLocation": { + "key": "AttachLiveLocation", + "value": "Live Location" + }, + "AttachLiveLocationIsSharing": { + "key": "AttachLiveLocationIsSharing", + "value": "%1$s sharing with %2$s" + }, + "AttachLiveLocationIsSharingChat": { + "key": "AttachLiveLocationIsSharingChat", + "value": "%1$s sharing with %2$s" + }, + "AttachLiveLocationIsSharingChats": { + "key": "AttachLiveLocationIsSharingChats", + "value": "%1$s sharing with %2$s" + }, + "AttachLocation": { + "key": "AttachLocation", + "value": "Location" + }, + "AttachMediaRestricted": { + "key": "AttachMediaRestricted", + "value": "The admins of this group have restricted you from sending media here until %1$s" + }, + "AttachMediaRestrictedForever": { + "key": "AttachMediaRestrictedForever", + "value": "The admins of this group have restricted you from sending media here." + }, + "AttachMusic": { + "key": "AttachMusic", + "value": "Music" + }, + "AttachPhoto": { + "key": "AttachPhoto", + "value": "Photo" + }, + "AttachPhotoExpired": { + "key": "AttachPhotoExpired", + "value": "Photo has expired" + }, + "AttachRound": { + "key": "AttachRound", + "value": "Video message" + }, + "AttachSticker": { + "key": "AttachSticker", + "value": "Sticker" + }, + "AttachStickersRestricted": { + "key": "AttachStickersRestricted", + "value": "The admins of this group have restricted you from sending stickers here until %1$s" + }, + "AttachStickersRestrictedForever": { + "key": "AttachStickersRestrictedForever", + "value": "The admins of this group have restricted you from sending stickers." + }, + "AttachVideo": { + "key": "AttachVideo", + "value": "Video" + }, + "AttachVideoExpired": { + "key": "AttachVideoExpired", + "value": "Video has expired" + }, + "AudioAutodownload": { + "key": "AudioAutodownload", + "value": "Voice messages" + }, + "AudioSavedHint": { + "key": "AudioSavedHint", + "value": "File saved to music" + }, + "AudioSpeedFast": { + "key": "AudioSpeedFast", + "value": "Audio will play two times faster." + }, + "AudioSpeedNormal": { + "key": "AudioSpeedNormal", + "value": "Audio will play at normal speed." + }, + "AudioTitle": { + "key": "AudioTitle", + "value": "Shared Music" + }, + "AudioUnknownArtist": { + "key": "AudioUnknownArtist", + "value": "Unknown artist" + }, + "AudioUnknownTitle": { + "key": "AudioUnknownTitle", + "value": "Unknown title" + }, + "AudiosSavedHint": { + "key": "AudiosSavedHint", + "zeroValue": null, + "oneValue": "File saved to music", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d files saved to music" + }, + "August": { + "key": "August", + "value": "August" + }, + "AuthAnotherClient": { + "key": "AuthAnotherClient", + "value": "Scan QR Code" + }, + "AuthAnotherClientDownloadClientUrl": { + "key": "AuthAnotherClientDownloadClientUrl", + "value": "https://desktop.telegram.org/" + }, + "AuthAnotherClientInfo1": { + "key": "AuthAnotherClientInfo1", + "value": "Download Telegram on your computer from *desktop.telegram.org*." + }, + "AuthAnotherClientInfo2": { + "key": "AuthAnotherClientInfo2", + "value": "Run Telegram Desktop to get the QR code." + }, + "AuthAnotherClientInfo3": { + "key": "AuthAnotherClientInfo3", + "value": "Scan the QR code to connect your account." + }, + "AuthAnotherClientNotFound": { + "key": "AuthAnotherClientNotFound", + "value": "No auth token found" + }, + "AuthAnotherClientOk": { + "key": "AuthAnotherClientOk", + "value": "Auth successful" + }, + "AuthAnotherClientScan": { + "key": "AuthAnotherClientScan", + "value": "Scan QR Code" + }, + "AuthAnotherClientTokenError": { + "key": "AuthAnotherClientTokenError", + "value": "Token invalid or already expired." + }, + "AuthAnotherClientUrl": { + "key": "AuthAnotherClientUrl", + "value": "This code can be used to allow someone to log in to your Telegram account.\n\nTo confirm Telegram login, please go to Settings > Devices > Scan QR and scan the code." + }, + "AutoDelete24Hours": { + "key": "AutoDelete24Hours", + "value": "24 hours" + }, + "AutoDelete7Days": { + "key": "AutoDelete7Days", + "value": "7 days" + }, + "AutoDeleteAlertChannelInfo": { + "key": "AutoDeleteAlertChannelInfo", + "value": "Automatically delete new messages after a certain period of time for subscribers of this channel." + }, + "AutoDeleteAlertGroupInfo": { + "key": "AutoDeleteAlertGroupInfo", + "value": "Automatically delete new messages after a certain period of time for members of this group." + }, + "AutoDeleteAlertTitle": { + "key": "AutoDeleteAlertTitle", + "value": "Auto-delete messages" + }, + "AutoDeleteAlertUserInfo": { + "key": "AutoDeleteAlertUserInfo", + "value": "Automatically delete new messages after a certain period of time for you and %1$s." + }, + "AutoDeleteConfirm": { + "key": "AutoDeleteConfirm", + "value": "Confirm" + }, + "AutoDeleteHeader": { + "key": "AutoDeleteHeader", + "value": "Auto-delete messages in this chat" + }, + "AutoDeleteHintOffText": { + "key": "AutoDeleteHintOffText", + "value": "Auto-delete is now disabled." + }, + "AutoDeleteHintOnText": { + "key": "AutoDeleteHintOnText", + "value": "New messages in this chat will be automatically deleted in %1$s." + }, + "AutoDeleteIn": { + "key": "AutoDeleteIn", + "value": "Auto-deletes in %1$s" + }, + "AutoDeleteInfo": { + "key": "AutoDeleteInfo", + "value": "Automatically delete new messages sent in this chat after a certain period of time." + }, + "AutoDeleteNever": { + "key": "AutoDeleteNever", + "value": "Off" + }, + "AutoDeleteSet": { + "key": "AutoDeleteSet", + "value": "Set for this chat" + }, + "AutoDeleteSetInfo": { + "key": "AutoDeleteSetInfo", + "value": "Messages in this chat are automatically\ndeleted %1$s after they are sent." + }, + "AutoDeleteSetTimer": { + "key": "AutoDeleteSetTimer", + "value": "Set auto-delete timer" + }, + "AutoDownloadAudioInfo": { + "key": "AutoDownloadAudioInfo", + "value": "Voice messages are tiny, so they're always downloaded automatically." + }, + "AutoDownloadChannels": { + "key": "AutoDownloadChannels", + "value": "Channels" + }, + "AutoDownloadContacts": { + "key": "AutoDownloadContacts", + "value": "Contacts" + }, + "AutoDownloadCustom": { + "key": "AutoDownloadCustom", + "value": "Custom" + }, + "AutoDownloadDataUsage": { + "key": "AutoDownloadDataUsage", + "value": "Data usage" + }, + "AutoDownloadFiles": { + "key": "AutoDownloadFiles", + "value": "Files" + }, + "AutoDownloadFilesOn": { + "key": "AutoDownloadFilesOn", + "value": "Files" + }, + "AutoDownloadFilesTitle": { + "key": "AutoDownloadFilesTitle", + "value": "Auto-download files and music" + }, + "AutoDownloadGroups": { + "key": "AutoDownloadGroups", + "value": "Groups" + }, + "AutoDownloadHigh": { + "key": "AutoDownloadHigh", + "value": "High" + }, + "AutoDownloadLow": { + "key": "AutoDownloadLow", + "value": "Low" + }, + "AutoDownloadMaxFileSize": { + "key": "AutoDownloadMaxFileSize", + "value": "Maximum file size" + }, + "AutoDownloadMaxVideoSize": { + "key": "AutoDownloadMaxVideoSize", + "value": "Maximum video size" + }, + "AutoDownloadMedia": { + "key": "AutoDownloadMedia", + "value": "Auto-Download Media" + }, + "AutoDownloadMedium": { + "key": "AutoDownloadMedium", + "value": "Medium" + }, + "AutoDownloadOff": { + "key": "AutoDownloadOff", + "value": "Off" + }, + "AutoDownloadOnAllChats": { + "key": "AutoDownloadOnAllChats", + "value": "On in all chats" + }, + "AutoDownloadOnFor": { + "key": "AutoDownloadOnFor", + "value": "On for %1$s" + }, + "AutoDownloadOnMobileData": { + "key": "AutoDownloadOnMobileData", + "value": "On Mobile Data" + }, + "AutoDownloadOnMobileDataInfo": { + "key": "AutoDownloadOnMobileDataInfo", + "value": "Turn this ON if you want media to be automatically downloaded on mobile data." + }, + "AutoDownloadOnRoamingData": { + "key": "AutoDownloadOnRoamingData", + "value": "When Roaming" + }, + "AutoDownloadOnRoamingDataInfo": { + "key": "AutoDownloadOnRoamingDataInfo", + "value": "Turn this ON if you want media to be automatically downloaded when roaming." + }, + "AutoDownloadOnUpToFor": { + "key": "AutoDownloadOnUpToFor", + "value": "Up to %1$s for %2$s" + }, + "AutoDownloadOnWiFiData": { + "key": "AutoDownloadOnWiFiData", + "value": "On Wi-Fi" + }, + "AutoDownloadOnWiFiDataInfo": { + "key": "AutoDownloadOnWiFiDataInfo", + "value": "Turn this ON if you want media to be automatically downloaded on Wi-Fi." + }, + "AutoDownloadPhotos": { + "key": "AutoDownloadPhotos", + "value": "Photos" + }, + "AutoDownloadPhotosOn": { + "key": "AutoDownloadPhotosOn", + "value": "Photos" + }, + "AutoDownloadPhotosTitle": { + "key": "AutoDownloadPhotosTitle", + "value": "Auto-download photos" + }, + "AutoDownloadPm": { + "key": "AutoDownloadPm", + "value": "PM" + }, + "AutoDownloadPreloadMusic": { + "key": "AutoDownloadPreloadMusic", + "value": "Preload next track" + }, + "AutoDownloadPreloadMusicInfo": { + "key": "AutoDownloadPreloadMusicInfo", + "value": "Start downloading the next track while you are listening to an audio file." + }, + "AutoDownloadPreloadVideo": { + "key": "AutoDownloadPreloadVideo", + "value": "Preload larger videos" + }, + "AutoDownloadPreloadVideoInfo": { + "key": "AutoDownloadPreloadVideoInfo", + "value": "Preload the first few seconds (1-2 MB) of videos larger than %1$s for instant playback." + }, + "AutoDownloadTypes": { + "key": "AutoDownloadTypes", + "value": "Types of media" + }, + "AutoDownloadUpToOnAllChats": { + "key": "AutoDownloadUpToOnAllChats", + "value": "Up to %1$s in all chats" + }, + "AutoDownloadVideos": { + "key": "AutoDownloadVideos", + "value": "Videos" + }, + "AutoDownloadVideosOn": { + "key": "AutoDownloadVideosOn", + "value": "Videos" + }, + "AutoDownloadVideosTitle": { + "key": "AutoDownloadVideosTitle", + "value": "Auto-download videos and GIFs" + }, + "AutoLock": { + "key": "AutoLock", + "value": "Auto-lock" + }, + "AutoLockDisabled": { + "key": "AutoLockDisabled", + "value": "Disabled" + }, + "AutoLockInTime": { + "key": "AutoLockInTime", + "value": "in %1$s" + }, + "AutoLockInfo": { + "key": "AutoLockInfo", + "value": "Require passcode if away for a time." + }, + "AutoNightAdaptive": { + "key": "AutoNightAdaptive", + "value": "Adaptive" + }, + "AutoNightAutomatic": { + "key": "AutoNightAutomatic", + "value": "Automatic" + }, + "AutoNightBrightness": { + "key": "AutoNightBrightness", + "value": "Brightness threshold" + }, + "AutoNightBrightnessInfo": { + "key": "AutoNightBrightnessInfo", + "value": "Switch to your preferred night theme when ambient lighting falls below %1$d%%." + }, + "AutoNightDisabled": { + "key": "AutoNightDisabled", + "value": "Disabled" + }, + "AutoNightFrom": { + "key": "AutoNightFrom", + "value": "From" + }, + "AutoNightLocation": { + "key": "AutoNightLocation", + "value": "Use Local Sunset & Sunrise" + }, + "AutoNightModeOff": { + "key": "AutoNightModeOff", + "value": "Auto-Night Mode is off" + }, + "AutoNightPreferred": { + "key": "AutoNightPreferred", + "value": "Preferred night theme" + }, + "AutoNightSchedule": { + "key": "AutoNightSchedule", + "value": "Schedule" + }, + "AutoNightScheduled": { + "key": "AutoNightScheduled", + "value": "Scheduled" + }, + "AutoNightSystemDefault": { + "key": "AutoNightSystemDefault", + "value": "System Default" + }, + "AutoNightTheme": { + "key": "AutoNightTheme", + "value": "Auto-Night Mode" + }, + "AutoNightThemeOff": { + "key": "AutoNightThemeOff", + "value": "Off" + }, + "AutoNightTo": { + "key": "AutoNightTo", + "value": "To" + }, + "AutoNightUpdateLocation": { + "key": "AutoNightUpdateLocation", + "value": "Update Location" + }, + "AutoNightUpdateLocationInfo": { + "key": "AutoNightUpdateLocationInfo", + "value": "Calculating sunset & sunrise times requires a one-time check of your approximate location. Note that this location is only stored locally on your device.\n\nSunset: %1$s\nSunrise: %2$s" + }, + "AutodownloadChannels": { + "key": "AutodownloadChannels", + "value": "Channels" + }, + "AutodownloadContacts": { + "key": "AutodownloadContacts", + "value": "Contacts" + }, + "AutodownloadGroupChats": { + "key": "AutodownloadGroupChats", + "value": "Group Chats" + }, + "AutodownloadPrivateChats": { + "key": "AutodownloadPrivateChats", + "value": "Private Chats" + }, + "AutodownloadSizeLimit": { + "key": "AutodownloadSizeLimit", + "value": "Limit by Size" + }, + "AutodownloadSizeLimitUpTo": { + "key": "AutodownloadSizeLimitUpTo", + "value": "up to %1$s" + }, + "AutomaticMediaDownload": { + "key": "AutomaticMediaDownload", + "value": "Automatic media download" + }, + "AutoplayGIF": { + "key": "AutoplayGIF", + "value": "GIFs" + }, + "AutoplayGifs": { + "key": "AutoplayGifs", + "value": "Autoplay GIFs" + }, + "AutoplayMedia": { + "key": "AutoplayMedia", + "value": "Auto-play media" + }, + "AutoplayVideo": { + "key": "AutoplayVideo", + "value": "Videos" + }, + "AutoplayVideoInfo": { + "key": "AutoplayVideoInfo", + "value": "Press the volume buttons to turn sound on." + }, + "Available": { + "key": "Available", + "value": "Available" + }, + "AwaitingEncryption": { + "key": "AwaitingEncryption", + "value": "Waiting for %s to get online..." + }, + "AwayTo": { + "key": "AwayTo", + "value": "%1$s away" + }, + "Back": { + "key": "Back", + "value": "Back" + }, + "BackgroundBlurred": { + "key": "BackgroundBlurred", + "value": "Blurred" + }, + "BackgroundBrightness": { + "key": "BackgroundBrightness", + "value": "Brightness" + }, + "BackgroundChoosePattern": { + "key": "BackgroundChoosePattern", + "value": "Choose pattern" + }, + "BackgroundColor": { + "key": "BackgroundColor", + "value": "Color" + }, + "BackgroundColorPreviewLine1": { + "key": "BackgroundColorPreviewLine1", + "value": "Swipe left or right to see more colors." + }, + "BackgroundColorPreviewLine2": { + "key": "BackgroundColorPreviewLine2", + "value": "Salmon is a fish, not a color." + }, + "BackgroundColorSinglePreviewLine1": { + "key": "BackgroundColorSinglePreviewLine1", + "value": "Press 'Set' to apply the background." + }, + "BackgroundColorSinglePreviewLine2": { + "key": "BackgroundColorSinglePreviewLine2", + "value": "Enjoy the view." + }, + "BackgroundHexColorCode": { + "key": "BackgroundHexColorCode", + "value": "Hex color code" + }, + "BackgroundIntensity": { + "key": "BackgroundIntensity", + "value": "Intensity" + }, + "BackgroundMotion": { + "key": "BackgroundMotion", + "value": "Motion" + }, + "BackgroundPattern": { + "key": "BackgroundPattern", + "value": "Pattern" + }, + "BackgroundPreview": { + "key": "BackgroundPreview", + "value": "Background Preview" + }, + "BackgroundPreviewLine1": { + "key": "BackgroundPreviewLine1", + "value": "Hint: some background images look better when blurred." + }, + "BackgroundPreviewLine2": { + "key": "BackgroundPreviewLine2", + "value": "Woo-hoo! Thanks" + }, + "BackgroundRestricted": { + "key": "BackgroundRestricted", + "value": "Background data restricted." + }, + "BackgroundSearchColor": { + "key": "BackgroundSearchColor", + "value": "Color:" + }, + "BadgeNumber": { + "key": "BadgeNumber", + "value": "Badge Counter" + }, + "BadgeNumberMutedChats": { + "key": "BadgeNumberMutedChats", + "value": "Include Muted Chats" + }, + "BadgeNumberShow": { + "key": "BadgeNumberShow", + "value": "Enabled" + }, + "BadgeNumberUnread": { + "key": "BadgeNumberUnread", + "value": "Count Unread Messages" + }, + "BanFromTheGroup": { + "key": "BanFromTheGroup", + "value": "BAN FROM THE GROUP" + }, + "BannedPhoneNumber": { + "key": "BannedPhoneNumber", + "value": "This phone number is banned." + }, + "Bans": { + "key": "Bans", + "zeroValue": null, + "oneValue": "%1$d ban", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d bans" + }, + "BioCopied": { + "key": "BioCopied", + "value": "Bio copied to clipboard." + }, + "Black": { + "key": "Black", + "value": "Black" + }, + "Block": { + "key": "Block", + "value": "BLOCK" + }, + "BlockAndDeleteReplies": { + "key": "BlockAndDeleteReplies", + "value": "BLOCK AND DELETE REPLIES" + }, + "BlockContact": { + "key": "BlockContact", + "value": "Block user" + }, + "BlockUser": { + "key": "BlockUser", + "value": "Block user" + }, + "BlockUserAlert": { + "key": "BlockUserAlert", + "value": "Do you want to block **%1$s** from messaging and calling you on Telegram?" + }, + "BlockUserChatsTitle": { + "key": "BlockUserChatsTitle", + "value": "CHATS" + }, + "BlockUserContactsTitle": { + "key": "BlockUserContactsTitle", + "value": "CONTACTS" + }, + "BlockUserMessage": { + "key": "BlockUserMessage", + "value": "Do you want to block **%1$s** from messaging and calling you on Telegram?" + }, + "BlockUserMultiTitle": { + "key": "BlockUserMultiTitle", + "value": "Block User" + }, + "BlockUserReplyAlert": { + "key": "BlockUserReplyAlert", + "value": "Do you want to block messages from **%1$s**?" + }, + "BlockUserTitle": { + "key": "BlockUserTitle", + "value": "Block %1$s" + }, + "BlockUsers": { + "key": "BlockUsers", + "value": "Block users" + }, + "BlockUsersMessage": { + "key": "BlockUsersMessage", + "value": "Do you want to block **%1$s** from messaging and calling you on Telegram?" + }, + "BlockedEmpty": { + "key": "BlockedEmpty", + "value": "None" + }, + "BlockedUsers": { + "key": "BlockedUsers", + "value": "Blocked Users" + }, + "BlockedUsersCount": { + "key": "BlockedUsersCount", + "zeroValue": null, + "oneValue": "%1$d blocked user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d blocked users" + }, + "BlockedUsersInfo": { + "key": "BlockedUsersInfo", + "value": "Blocked users will not be able to contact you and will not see your Last Seen time." + }, + "Blue": { + "key": "Blue", + "value": "Blue" + }, + "BlurLinear": { + "key": "BlurLinear", + "value": "Linear" + }, + "BlurOff": { + "key": "BlurOff", + "value": "Off" + }, + "BlurRadial": { + "key": "BlurRadial", + "value": "Radial" + }, + "Bold": { + "key": "Bold", + "value": "Bold" + }, + "Bot": { + "key": "Bot", + "value": "bot" + }, + "BotCantJoinGroups": { + "key": "BotCantJoinGroups", + "value": "This bot can't join groups." + }, + "BotHelp": { + "key": "BotHelp", + "value": "Help" + }, + "BotInfoTitle": { + "key": "BotInfoTitle", + "value": "What can this bot do?" + }, + "BotInvite": { + "key": "BotInvite", + "value": "Add to group" + }, + "BotOwnershipTransfer": { + "key": "BotOwnershipTransfer", + "value": "Transfer Bot Ownership" + }, + "BotOwnershipTransferAlertText": { + "key": "BotOwnershipTransferAlertText", + "value": "You can transfer this bot only if you have:" + }, + "BotOwnershipTransferChangeOwner": { + "key": "BotOwnershipTransferChangeOwner", + "value": "Change Owner" + }, + "BotOwnershipTransferReadyAlertText": { + "key": "BotOwnershipTransferReadyAlertText", + "value": "This will transfer the **full owner** rights for the bot to the selected user." + }, + "BotPermissionGameAlert": { + "key": "BotPermissionGameAlert", + "value": "Allow %1$s to pass your Telegram name and id (not your phone number) to pages you open with this bot?" + }, + "BotRestart": { + "key": "BotRestart", + "value": "Restart bot" + }, + "BotSettings": { + "key": "BotSettings", + "value": "Settings" + }, + "BotShare": { + "key": "BotShare", + "value": "Share" + }, + "BotStart": { + "key": "BotStart", + "value": "START" + }, + "BotStatusCantRead": { + "key": "BotStatusCantRead", + "value": "has no access to messages" + }, + "BotStatusRead": { + "key": "BotStatusRead", + "value": "has access to messages" + }, + "BotStop": { + "key": "BotStop", + "value": "Stop bot" + }, + "BotUnblock": { + "key": "BotUnblock", + "value": "RESTART" + }, + "BroadcastGroup": { + "key": "BroadcastGroup", + "value": "Broadcast Group" + }, + "BroadcastGroupConvert": { + "key": "BroadcastGroupConvert", + "value": "Convert to Broadcast Group" + }, + "BroadcastGroupConvertInfo": { + "key": "BroadcastGroupConvertInfo", + "value": "Broadcast groups can have over 200,000 members, but only admins can send messages in them." + }, + "BroadcastGroupConvertSuccess": { + "key": "BroadcastGroupConvertSuccess", + "value": "Your group can now have more than 200,000 members." + }, + "BroadcastGroupInfo": { + "key": "BroadcastGroupInfo", + "value": "Only admins can send messages in this group." + }, + "Brown": { + "key": "Brown", + "value": "Brown" + }, + "BubbleRadius": { + "key": "BubbleRadius", + "value": "Message corners" + }, + "BuiltInThemes": { + "key": "BuiltInThemes", + "value": "Built-in themes" + }, + "BytesReceived": { + "key": "BytesReceived", + "value": "Bytes received" + }, + "BytesSent": { + "key": "BytesSent", + "value": "Bytes sent" + }, + "CacheClear": { + "key": "CacheClear", + "value": "Clear" + }, + "CacheEmpty": { + "key": "CacheEmpty", + "value": "Empty" + }, + "CacheWasCleared": { + "key": "CacheWasCleared", + "value": "%s freed on your device!" + }, + "CalculatingSize": { + "key": "CalculatingSize", + "value": "Calculating..." + }, + "Call": { + "key": "Call", + "value": "Call" + }, + "CallAgain": { + "key": "CallAgain", + "value": "Call Again" + }, + "CallAlert": { + "key": "CallAlert", + "value": "Are you sure you want to call **%1$s**?" + }, + "CallAlertTitle": { + "key": "CallAlertTitle", + "value": "Voice Call" + }, + "CallBack": { + "key": "CallBack", + "value": "Call Back" + }, + "CallEmojiKeyTooltip": { + "key": "CallEmojiKeyTooltip", + "value": "If emoji on %1$s's screen are the same, this call is 100%% secure." + }, + "CallMessageIncoming": { + "key": "CallMessageIncoming", + "value": "Incoming Call" + }, + "CallMessageIncomingDeclined": { + "key": "CallMessageIncomingDeclined", + "value": "Declined Call" + }, + "CallMessageIncomingMissed": { + "key": "CallMessageIncomingMissed", + "value": "Missed Call" + }, + "CallMessageOutgoing": { + "key": "CallMessageOutgoing", + "value": "Outgoing Call" + }, + "CallMessageOutgoingMissed": { + "key": "CallMessageOutgoingMissed", + "value": "Cancelled Call" + }, + "CallMessageReportProblem": { + "key": "CallMessageReportProblem", + "value": "Rate Call" + }, + "CallMessageVideoIncoming": { + "key": "CallMessageVideoIncoming", + "value": "Incoming Video Call" + }, + "CallMessageVideoIncomingDeclined": { + "key": "CallMessageVideoIncomingDeclined", + "value": "Declined Video Call" + }, + "CallMessageVideoIncomingMissed": { + "key": "CallMessageVideoIncomingMissed", + "value": "Missed Video Call" + }, + "CallMessageVideoOutgoing": { + "key": "CallMessageVideoOutgoing", + "value": "Outgoing Video Call" + }, + "CallMessageVideoOutgoingMissed": { + "key": "CallMessageVideoOutgoingMissed", + "value": "Cancelled Video Call" + }, + "CallMessageWithDuration": { + "key": "CallMessageWithDuration", + "value": "%1$s (%2$s)" + }, + "CallNotAvailable": { + "key": "CallNotAvailable", + "value": "Sorry, you cannot call %1$s because of their privacy settings." + }, + "CallReportHint": { + "key": "CallReportHint", + "value": "What went wrong?" + }, + "CallReportIncludeLogs": { + "key": "CallReportIncludeLogs", + "value": "Include technical information" + }, + "CallReportLogsExplain": { + "key": "CallReportLogsExplain", + "value": "Doesn't reveal chat contents and helps us fix the issue sooner." + }, + "CallReportSent": { + "key": "CallReportSent", + "value": "Thank you for helping make Telegram calls better." + }, + "CallText": { + "key": "CallText", + "value": "Telegram will call you in %1$d:%2$02d" + }, + "CallViaTelegram": { + "key": "CallViaTelegram", + "value": "Telegram Call" + }, + "Calling": { + "key": "Calling", + "value": "Calling you..." + }, + "Calls": { + "key": "Calls", + "value": "Calls" + }, + "CallsDataUsage": { + "key": "CallsDataUsage", + "value": "Calls" + }, + "CallsTotalTime": { + "key": "CallsTotalTime", + "value": "Total time" + }, + "CameraPermissionText": { + "key": "CameraPermissionText", + "value": "Tap to allow access to your Camera" + }, + "CanJoin": { + "key": "CanJoin", + "zeroValue": null, + "oneValue": "%1$d can join", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d can join" + }, + "Cancel": { + "key": "Cancel", + "value": "Cancel" + }, + "CancelAccountReset": { + "key": "CancelAccountReset", + "value": "Cancel account reset" + }, + "CancelAccountResetInfo": { + "key": "CancelAccountResetInfo", + "value": "Somebody with access to **%1$s** has requested to delete your Telegram account and reset your 2-Step Verification password.\n\nIf this wasn't you, please enter the code we've just sent you via SMS. You can also cancel this by **changing your phone number**." + }, + "CancelAccountResetInfo2": { + "key": "CancelAccountResetInfo2", + "value": "Somebody with access to **%1$s** has requested to delete your Telegram account and reset your 2-Step Verification password.\n\nIf this wasn't you, please enter the code we've just sent you via SMS. You can also cancel this by *changing your phone number*." + }, + "CancelEmailQuestion": { + "key": "CancelEmailQuestion", + "value": "Are you sure you want to abort recovery email setup?" + }, + "CancelEmailQuestionTitle": { + "key": "CancelEmailQuestionTitle", + "value": "Abort setup" + }, + "CancelLinkExpired": { + "key": "CancelLinkExpired", + "value": "Link is invalid or expired." + }, + "CancelLinkSuccess": { + "key": "CancelLinkSuccess", + "value": "The deletion process was cancelled for your account %1$s. You may close this window now." + }, + "CancelPasswordQuestion": { + "key": "CancelPasswordQuestion", + "value": "Are you sure you want to abort two-step verification setup?" + }, + "CancelPollAlertText": { + "key": "CancelPollAlertText", + "value": "Are you sure you want to discard this poll?" + }, + "CancelPollAlertTitle": { + "key": "CancelPollAlertTitle", + "value": "Discard poll?" + }, + "CancelRegistration": { + "key": "CancelRegistration", + "value": "Cancel registration" + }, + "CancelSending": { + "key": "CancelSending", + "value": "Cancel sending" + }, + "CantAddBotAsAdmin": { + "key": "CantAddBotAsAdmin", + "value": "Bots can only be added to channels as admins." + }, + "CantPlayVideo": { + "key": "CantPlayVideo", + "value": "App was unable to play this video. Try to play it with external player?" + }, + "Caption": { + "key": "Caption", + "value": "Caption" + }, + "CardNumberCopied": { + "key": "CardNumberCopied", + "value": "Card number copied to clipboard" + }, + "Change": { + "key": "Change", + "value": "Change" + }, + "ChangeChatBackground": { + "key": "ChangeChatBackground", + "value": "Change Chat Background" + }, + "ChangeLanguageLater": { + "key": "ChangeLanguageLater", + "value": "You can change your language later in Settings." + }, + "ChangePasscode": { + "key": "ChangePasscode", + "value": "Change Passcode" + }, + "ChangePasscodeInfo": { + "key": "ChangePasscodeInfo", + "value": "When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock your Telegram app.\n\nNote: if you forget the passcode, you'll need to delete and reinstall the app. All secret chats will be lost." + }, + "ChangePassword": { + "key": "ChangePassword", + "value": "Change Password" + }, + "ChangePermissions": { + "key": "ChangePermissions", + "value": "Change permissions" + }, + "ChangePhoneHelp": { + "key": "ChangePhoneHelp", + "value": "We will send an SMS with a confirmation code to your new number." + }, + "ChangePhoneNewNumber": { + "key": "ChangePhoneNewNumber", + "value": "New Number" + }, + "ChangePhoneNumber": { + "key": "ChangePhoneNumber", + "value": "Change Phone Number" + }, + "ChangePhoneNumberInfo": { + "key": "ChangePhoneNumberInfo", + "value": "Move your account, chats and media to a new number." + }, + "ChangePhoneNumberOccupied": { + "key": "ChangePhoneNumberOccupied", + "value": "The number %1$s is already connected to a Telegram account. Please delete that account before migrating to the new number." + }, + "ChangePublicLimitReached": { + "key": "ChangePublicLimitReached", + "value": "You have reserved too many public links. Try revoking the link from an older group or channel, or create a private one instead." + }, + "ChangeRecoveryEmail": { + "key": "ChangeRecoveryEmail", + "value": "Change Recovery Email" + }, + "ChangeWallpaperToColor": { + "key": "ChangeWallpaperToColor", + "value": "Are you sure you want to change your chat wallpaper to a color?" + }, + "ChannelAddAdmin": { + "key": "ChannelAddAdmin", + "value": "Add Admin" + }, + "ChannelAddException": { + "key": "ChannelAddException", + "value": "Add Exception" + }, + "ChannelAddMembers": { + "key": "ChannelAddMembers", + "value": "Add members" + }, + "ChannelAddSubscribers": { + "key": "ChannelAddSubscribers", + "value": "Add Subscribers" + }, + "ChannelAddTo": { + "key": "ChannelAddTo", + "value": "Add %1$s to the channel?" + }, + "ChannelAddToChannel": { + "key": "ChannelAddToChannel", + "value": "Add to channel" + }, + "ChannelAddToGroup": { + "key": "ChannelAddToGroup", + "value": "Add to group" + }, + "ChannelAddedBy": { + "key": "ChannelAddedBy", + "value": "un1 added you to this channel" + }, + "ChannelAddedByNotification": { + "key": "ChannelAddedByNotification", + "value": "%1$s added you to the channel %2$s" + }, + "ChannelAdmin": { + "key": "ChannelAdmin", + "value": "Admin" + }, + "ChannelAdministrator": { + "key": "ChannelAdministrator", + "value": "Admin" + }, + "ChannelAdministrators": { + "key": "ChannelAdministrators", + "value": "Administrators" + }, + "ChannelAdminsInfo": { + "key": "ChannelAdminsInfo", + "value": "You can add administrators to help you manage your channel. Tap and hold to remove admins." + }, + "ChannelAlertCreate": { + "key": "ChannelAlertCreate", + "value": "CREATE CHANNEL" + }, + "ChannelAlertCreate2": { + "key": "ChannelAlertCreate2", + "value": "Create Channel" + }, + "ChannelAlertText": { + "key": "ChannelAlertText", + "value": "Channels are a one-to-many tool for broadcasting your messages to unlimited audiences." + }, + "ChannelAlertTitle": { + "key": "ChannelAlertTitle", + "value": "What is a Channel?" + }, + "ChannelBlacklist": { + "key": "ChannelBlacklist", + "value": "Removed Users" + }, + "ChannelBlockUser": { + "key": "ChannelBlockUser", + "value": "Remove User" + }, + "ChannelBlockedUsers": { + "key": "ChannelBlockedUsers", + "value": "Removed users" + }, + "ChannelBots": { + "key": "ChannelBots", + "value": "Bots" + }, + "ChannelBroadcast": { + "key": "ChannelBroadcast", + "value": "Broadcast" + }, + "ChannelCantOpenBanned": { + "key": "ChannelCantOpenBanned", + "value": "Unfortunately, you were banned from participating in public groups." + }, + "ChannelCantOpenBannedByAdmin": { + "key": "ChannelCantOpenBannedByAdmin", + "value": "Sorry, you can't access this chat because you were banned by an admin." + }, + "ChannelCantOpenNa": { + "key": "ChannelCantOpenNa", + "value": "Sorry, this chat is no longer accessible." + }, + "ChannelCantOpenPrivate": { + "key": "ChannelCantOpenPrivate", + "value": "Sorry, this chat is no longer accessible." + }, + "ChannelCantSendMessage": { + "key": "ChannelCantSendMessage", + "value": "Sorry, you can't send messages to this channel." + }, + "ChannelContacts": { + "key": "ChannelContacts", + "value": "Contacts in this channel" + }, + "ChannelCreator": { + "key": "ChannelCreator", + "value": "Owner" + }, + "ChannelDelete": { + "key": "ChannelDelete", + "value": "Delete Channel" + }, + "ChannelDeleteAlert": { + "key": "ChannelDeleteAlert", + "value": "Wait! Deleting this channel will remove all subscribers and all messages will be lost. Delete the channel anyway?" + }, + "ChannelDeleteFromList": { + "key": "ChannelDeleteFromList", + "value": "Delete from this list" + }, + "ChannelDeleteInfo": { + "key": "ChannelDeleteInfo", + "value": "You will lose all messages in this channel." + }, + "ChannelDeleteMenu": { + "key": "ChannelDeleteMenu", + "value": "Delete channel" + }, + "ChannelDeletedUndo": { + "key": "ChannelDeletedUndo", + "value": "Channel deleted." + }, + "ChannelDiscuss": { + "key": "ChannelDiscuss", + "value": "DISCUSS" + }, + "ChannelEdit": { + "key": "ChannelEdit", + "value": "Edit" + }, + "ChannelEditPermissions": { + "key": "ChannelEditPermissions", + "value": "Edit permissions" + }, + "ChannelInviteLinkTitle": { + "key": "ChannelInviteLinkTitle", + "value": "Invite Link" + }, + "ChannelInviteViaLink": { + "key": "ChannelInviteViaLink", + "value": "Invite via Link" + }, + "ChannelJoin": { + "key": "ChannelJoin", + "value": "JOIN" + }, + "ChannelJoinTo": { + "key": "ChannelJoinTo", + "value": "Do you want to join the channel '%1$s'?" + }, + "ChannelJoined": { + "key": "ChannelJoined", + "value": "You joined this channel" + }, + "ChannelLeaveAlert": { + "key": "ChannelLeaveAlert", + "value": "Are you sure you want to leave the channel?" + }, + "ChannelLeaveAlertWithName": { + "key": "ChannelLeaveAlertWithName", + "value": "Are you sure you want to leave **%1$s**?" + }, + "ChannelLinkInfo": { + "key": "ChannelLinkInfo", + "value": "Anyone who has Telegram installed will be able to join your channel by following this link." + }, + "ChannelLinkTitle": { + "key": "ChannelLinkTitle", + "value": "Public link" + }, + "ChannelMegaJoined": { + "key": "ChannelMegaJoined", + "value": "You joined this group" + }, + "ChannelMembers": { + "key": "ChannelMembers", + "value": "Members" + }, + "ChannelMembersInfo": { + "key": "ChannelMembersInfo", + "value": "Only channel admins can see this list." + }, + "ChannelMessageAlbum": { + "key": "ChannelMessageAlbum", + "value": "%1$s posted an album" + }, + "ChannelMessageAudio": { + "key": "ChannelMessageAudio", + "value": "%1$s posted a voice message" + }, + "ChannelMessageContact": { + "key": "ChannelMessageContact", + "value": "%1$s posted a contact" + }, + "ChannelMessageContact2": { + "key": "ChannelMessageContact2", + "value": "%1$s posted a contact %2$s" + }, + "ChannelMessageDocument": { + "key": "ChannelMessageDocument", + "value": "%1$s posted a file" + }, + "ChannelMessageFew": { + "key": "ChannelMessageFew", + "value": "%1$s posted %2$s" + }, + "ChannelMessageGIF": { + "key": "ChannelMessageGIF", + "value": "%1$s posted a GIF" + }, + "ChannelMessageLiveLocation": { + "key": "ChannelMessageLiveLocation", + "value": "%1$s posted a live location" + }, + "ChannelMessageMap": { + "key": "ChannelMessageMap", + "value": "%1$s posted a location" + }, + "ChannelMessageMusic": { + "key": "ChannelMessageMusic", + "value": "%1$s posted an audio file" + }, + "ChannelMessageNoText": { + "key": "ChannelMessageNoText", + "value": "%1$s posted a message" + }, + "ChannelMessagePhoto": { + "key": "ChannelMessagePhoto", + "value": "%1$s posted a photo" + }, + "ChannelMessagePoll": { + "key": "ChannelMessagePoll", + "value": "%1$s posted a poll" + }, + "ChannelMessagePoll2": { + "key": "ChannelMessagePoll2", + "value": "%1$s posted a poll %2$s" + }, + "ChannelMessageQuiz2": { + "key": "ChannelMessageQuiz2", + "value": "%1$s posted the quiz \"%2$s\"" + }, + "ChannelMessageRound": { + "key": "ChannelMessageRound", + "value": "%1$s posted a video message" + }, + "ChannelMessageSticker": { + "key": "ChannelMessageSticker", + "value": "%1$s posted a sticker" + }, + "ChannelMessageStickerEmoji": { + "key": "ChannelMessageStickerEmoji", + "value": "%1$s posted a %2$s sticker" + }, + "ChannelMessageVideo": { + "key": "ChannelMessageVideo", + "value": "%1$s posted a video" + }, + "ChannelModerator": { + "key": "ChannelModerator", + "value": "Moderator" + }, + "ChannelMute": { + "key": "ChannelMute", + "value": "MUTE" + }, + "ChannelNotifyMembersInfoOff": { + "key": "ChannelNotifyMembersInfoOff", + "value": "Subscribers will receive a silent notification" + }, + "ChannelNotifyMembersInfoOn": { + "key": "ChannelNotifyMembersInfoOn", + "value": "Subscribers will be notified when you post" + }, + "ChannelOtherMembers": { + "key": "ChannelOtherMembers", + "value": "Other members" + }, + "ChannelOtherSubscriberJoined": { + "key": "ChannelOtherSubscriberJoined", + "value": "joined %1$s" + }, + "ChannelOtherSubscribers": { + "key": "ChannelOtherSubscribers", + "value": "Other subscribers" + }, + "ChannelPermissions": { + "key": "ChannelPermissions", + "value": "Permissions" + }, + "ChannelPermissionsHeader": { + "key": "ChannelPermissionsHeader", + "value": "What can members of this group do?" + }, + "ChannelPhotoEditNotification": { + "key": "ChannelPhotoEditNotification", + "value": "Channel %1$s updated its photo" + }, + "ChannelPostDeleted": { + "key": "ChannelPostDeleted", + "value": "Sorry, this post has been removed from the discussion group." + }, + "ChannelPrivate": { + "key": "ChannelPrivate", + "value": "Private Channel" + }, + "ChannelPrivateInfo": { + "key": "ChannelPrivateInfo", + "value": "Private channels can only be joined via an invite link." + }, + "ChannelPrivateLinkHelp": { + "key": "ChannelPrivateLinkHelp", + "value": "People can join your channel by following this link. You can revoke the link any time." + }, + "ChannelPublic": { + "key": "ChannelPublic", + "value": "Public Channel" + }, + "ChannelPublicEmptyUsername": { + "key": "ChannelPublicEmptyUsername", + "value": "Please choose a link for your public channel, so that people can find it in search and share with others.\n\nIf you're not interested, we suggest creating a private channel instead." + }, + "ChannelPublicEmptyUsernameTitle": { + "key": "ChannelPublicEmptyUsernameTitle", + "value": "Choose a link" + }, + "ChannelPublicInfo": { + "key": "ChannelPublicInfo", + "value": "Public channels can be found in search, anyone can join them." + }, + "ChannelRemoveUser": { + "key": "ChannelRemoveUser", + "value": "Remove from channel" + }, + "ChannelRemoveUserAdmin": { + "key": "ChannelRemoveUserAdmin", + "value": "Dismiss admin" + }, + "ChannelRestrictedUsers": { + "key": "ChannelRestrictedUsers", + "value": "Restricted users" + }, + "ChannelSearchException": { + "key": "ChannelSearchException", + "value": "Search Exceptions" + }, + "ChannelSettings": { + "key": "ChannelSettings", + "value": "Settings" + }, + "ChannelSettingsChangedAlert": { + "key": "ChannelSettingsChangedAlert", + "value": "You have changed some settings in this channel. Apply changes?" + }, + "ChannelSettingsTitle": { + "key": "ChannelSettingsTitle", + "value": "Channel Settings" + }, + "ChannelSignMessages": { + "key": "ChannelSignMessages", + "value": "Sign Messages" + }, + "ChannelSignMessagesInfo": { + "key": "ChannelSignMessagesInfo", + "value": "Add names of the admins to the messages they post." + }, + "ChannelSilentBroadcast": { + "key": "ChannelSilentBroadcast", + "value": "Silent Broadcast" + }, + "ChannelSubscribers": { + "key": "ChannelSubscribers", + "value": "Subscribers" + }, + "ChannelTooMuch": { + "key": "ChannelTooMuch", + "value": "Sorry, you are a member of too many groups and channels. Please leave some before creating a new one." + }, + "ChannelTooMuchJoin": { + "key": "ChannelTooMuchJoin", + "value": "Sorry, you are a member of too many groups and channels. Please leave some before joining a new one." + }, + "ChannelTooMuchTitle": { + "key": "ChannelTooMuchTitle", + "value": "Too many communities" + }, + "ChannelType": { + "key": "ChannelType", + "value": "Channel Type" + }, + "ChannelTypeHeader": { + "key": "ChannelTypeHeader", + "value": "Channel type" + }, + "ChannelUnmute": { + "key": "ChannelUnmute", + "value": "UNMUTE" + }, + "ChannelUserAddLimit": { + "key": "ChannelUserAddLimit", + "value": "Sorry, you can only add the first 200 subscribers to a channel. Note that an unlimited number of people may join via the channel's link." + }, + "ChannelUserCantAdd": { + "key": "ChannelUserCantAdd", + "value": "Sorry, you can't add this user to channels." + }, + "ChannelUserCantAdmin": { + "key": "ChannelUserCantAdmin", + "value": "Sorry, too many admins in this channel." + }, + "ChannelUserCantBot": { + "key": "ChannelUserCantBot", + "value": "Sorry, too many bots in this channel." + }, + "ChannelUserLeftError": { + "key": "ChannelUserLeftError", + "value": "Sorry, if a person is no longer part of a channel, you need to be in their Telegram contacts in order to add them back.\n\nNote that they could still join via the channel's invite link as long as they are not in the Removed users list." + }, + "ChannelUsernameHelp": { + "key": "ChannelUsernameHelp", + "value": "If you set a permanent link, other people will be able to find and join your channel.\n\nYou can use a-z, 0-9 and underscores.\nMinimum length is 5 characters." + }, + "ChannelUsernamePlaceholder": { + "key": "ChannelUsernamePlaceholder", + "value": "link" + }, + "ChannelVerifiedWarning": { + "key": "ChannelVerifiedWarning", + "value": "Warning" + }, + "ChannelVideoEditNotification": { + "key": "ChannelVideoEditNotification", + "value": "Channel %1$s updated its video" + }, + "Channels": { + "key": "Channels", + "zeroValue": null, + "oneValue": "%1$d channel", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d channels" + }, + "Characters": { + "key": "Characters", + "zeroValue": null, + "oneValue": "%1$d character", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d characters" + }, + "CharactersPerMessage": { + "key": "CharactersPerMessage", + "value": "%s per message" + }, + "ChatAdmin": { + "key": "ChatAdmin", + "value": "admin" + }, + "ChatArchived": { + "key": "ChatArchived", + "value": "Chat archived." + }, + "ChatArchivedInfo": { + "key": "ChatArchivedInfo", + "value": "Hide the archive by swiping left on it." + }, + "ChatBackground": { + "key": "ChatBackground", + "value": "Chat Background" + }, + "ChatCamera": { + "key": "ChatCamera", + "value": "Camera" + }, + "ChatDeletedUndo": { + "key": "ChatDeletedUndo", + "value": "Chat deleted" + }, + "ChatDistanceToPeer": { + "key": "ChatDistanceToPeer", + "value": "%1$s is %2$s" + }, + "ChatDocument": { + "key": "ChatDocument", + "value": "File" + }, + "ChatGallery": { + "key": "ChatGallery", + "value": "Gallery" + }, + "ChatHints": { + "key": "ChatHints", + "value": "People" + }, + "ChatHintsDelete": { + "key": "ChatHintsDelete", + "value": "Remove %1$s from suggestions?" + }, + "ChatHintsDeleteAlert": { + "key": "ChatHintsDeleteAlert", + "value": "Are you sure you want to remove **%1$s** from suggestions?" + }, + "ChatHintsDeleteAlertTitle": { + "key": "ChatHintsDeleteAlertTitle", + "value": "Remove suggestion" + }, + "ChatHistory": { + "key": "ChatHistory", + "value": "Chat history for new members" + }, + "ChatHistoryHidden": { + "key": "ChatHistoryHidden", + "value": "Hidden" + }, + "ChatHistoryHiddenInfo": { + "key": "ChatHistoryHiddenInfo", + "value": "New members won't see earlier messages." + }, + "ChatHistoryHiddenInfo2": { + "key": "ChatHistoryHiddenInfo2", + "value": "New members won't see more than 100 previous messages." + }, + "ChatHistoryVisible": { + "key": "ChatHistoryVisible", + "value": "Visible" + }, + "ChatHistoryVisibleInfo": { + "key": "ChatHistoryVisibleInfo", + "value": "New members will see messages that were sent before they joined." + }, + "ChatList": { + "key": "ChatList", + "value": "Chat list view" + }, + "ChatListDefault": { + "key": "ChatListDefault", + "value": "Two lines" + }, + "ChatListExpanded": { + "key": "ChatListExpanded", + "value": "Three lines" + }, + "ChatLocation": { + "key": "ChatLocation", + "value": "Location" + }, + "ChatSetLocation": { + "key": "ChatSetLocation", + "value": "Set Location" + }, + "ChatSetLocationInfo": { + "key": "ChatSetLocationInfo", + "value": "People will be able to find your group in the \"People Nearby\" section." + }, + "ChatSetNewPhoto": { + "key": "ChatSetNewPhoto", + "value": "Set New Photo" + }, + "ChatSetPhotoOrVideo": { + "key": "ChatSetPhotoOrVideo", + "value": "Set Photo or Video" + }, + "ChatSetThisLocation": { + "key": "ChatSetThisLocation", + "value": "Set this location" + }, + "ChatSettings": { + "key": "ChatSettings", + "value": "Chat Settings" + }, + "ChatVideo": { + "key": "ChatVideo", + "value": "Video" + }, + "ChatWasMovedToMainList": { + "key": "ChatWasMovedToMainList", + "value": "The chat was moved to your main list." + }, + "ChatYourSelf": { + "key": "ChatYourSelf", + "value": "forward here to save" + }, + "ChatYourSelfDescription1": { + "key": "ChatYourSelfDescription1", + "value": "Forward messages here to save them" + }, + "ChatYourSelfDescription2": { + "key": "ChatYourSelfDescription2", + "value": "Send media and files to store them" + }, + "ChatYourSelfDescription3": { + "key": "ChatYourSelfDescription3", + "value": "Access this chat from any device" + }, + "ChatYourSelfDescription4": { + "key": "ChatYourSelfDescription4", + "value": "Use search to quickly find things" + }, + "ChatYourSelfName": { + "key": "ChatYourSelfName", + "value": "You" + }, + "ChatYourSelfTitle": { + "key": "ChatYourSelfTitle", + "value": "Your cloud storage" + }, + "Chats": { + "key": "Chats", + "zeroValue": null, + "oneValue": "%1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d chats" + }, + "ChatsArchived": { + "key": "ChatsArchived", + "value": "Chats archived." + }, + "ChatsException": { + "key": "ChatsException", + "zeroValue": null, + "oneValue": "%1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d chats" + }, + "ChatsMute": { + "key": "ChatsMute", + "value": "Mute" + }, + "ChatsNearbyHeader": { + "key": "ChatsNearbyHeader", + "value": "Groups nearby" + }, + "ChatsSelected": { + "key": "ChatsSelected", + "zeroValue": null, + "oneValue": "%1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d chats" + }, + "ChatsSelectedClear": { + "key": "ChatsSelectedClear", + "zeroValue": null, + "oneValue": "%1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d chats" + }, + "ChatsSelectedClearCache": { + "key": "ChatsSelectedClearCache", + "zeroValue": null, + "oneValue": "%1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d chats" + }, + "ChatsUnmute": { + "key": "ChatsUnmute", + "value": "Unmute" + }, + "Checking": { + "key": "Checking", + "value": "Checking..." + }, + "ChooseCountry": { + "key": "ChooseCountry", + "value": "Choose a country" + }, + "ChooseCover": { + "key": "ChooseCover", + "value": "Choose a cover for your profile video" + }, + "ChooseDate": { + "key": "ChooseDate", + "value": "Choose date" + }, + "ChooseFromGallery": { + "key": "ChooseFromGallery", + "value": "Upload from Gallery" + }, + "ChooseFromSearch": { + "key": "ChooseFromSearch", + "value": "Search web" + }, + "ChooseFromYourStickers": { + "key": "ChooseFromYourStickers", + "value": "Choose from your stickers" + }, + "ChooseMapPreviewProvider": { + "key": "ChooseMapPreviewProvider", + "value": "Choose Map Preview Provider" + }, + "ChoosePhoto": { + "key": "ChoosePhoto", + "value": "Choose photo" + }, + "ChoosePhotoOrVideo": { + "key": "ChoosePhotoOrVideo", + "value": "Choose photo or video" + }, + "ChooseRecordVideo": { + "key": "ChooseRecordVideo", + "value": "Record video" + }, + "ChooseStickerSet": { + "key": "ChooseStickerSet", + "value": "CHOOSE STICKER SET" + }, + "ChooseStickerSetMy": { + "key": "ChooseStickerSetMy", + "value": "You can create your own custom sticker sets using the @stickers bot." + }, + "ChooseStickerSetNotFound": { + "key": "ChooseStickerSetNotFound", + "value": "No such sticker set found" + }, + "ChooseStickerSetNotFoundInfo": { + "key": "ChooseStickerSetNotFoundInfo", + "value": "Try again or choose from the list below" + }, + "ChooseStickerSetPlaceholder": { + "key": "ChooseStickerSetPlaceholder", + "value": "stickerset" + }, + "ChooseTakePhoto": { + "key": "ChooseTakePhoto", + "value": "Take photo" + }, + "ChooseTheme": { + "key": "ChooseTheme", + "value": "Choose theme" + }, + "ChooseYourLanguage": { + "key": "ChooseYourLanguage", + "value": "Choose your language" + }, + "ChooseYourLanguageOther": { + "key": "ChooseYourLanguageOther", + "value": "Other" + }, + "ChromeCustomTabs": { + "key": "ChromeCustomTabs", + "value": "In-App Browser" + }, + "ChromeCustomTabsInfo": { + "key": "ChromeCustomTabsInfo", + "value": "Open external links within the app" + }, + "ClearButton": { + "key": "ClearButton", + "value": "Clear" + }, + "ClearCache": { + "key": "ClearCache", + "value": "Clear Cache" + }, + "ClearCacheFewChatsTitle": { + "key": "ClearCacheFewChatsTitle", + "value": "Empty cache for %1$s" + }, + "ClearCacheInfo": { + "key": "ClearCacheInfo", + "value": "Free up disk space on your device; your media will stay in the cloud." + }, + "ClearFewChatsTitle": { + "key": "ClearFewChatsTitle", + "value": "Clear %1$s" + }, + "ClearHistory": { + "key": "ClearHistory", + "value": "Clear history" + }, + "ClearHistoryCache": { + "key": "ClearHistoryCache", + "value": "Delete from cache" + }, + "ClearHistoryOptionAlso": { + "key": "ClearHistoryOptionAlso", + "value": "Also clear history for %1$s" + }, + "ClearLocalDatabase": { + "key": "ClearLocalDatabase", + "value": "Clear Local Database" + }, + "ClearMediaCache": { + "key": "ClearMediaCache", + "value": "Clear Cache" + }, + "ClearOtherSessionsHelp": { + "key": "ClearOtherSessionsHelp", + "value": "Logs out all devices except for this one." + }, + "ClearOtherWebSessionsHelp": { + "key": "ClearOtherWebSessionsHelp", + "value": "You can log in on websites that support signing in with Telegram." + }, + "ClearRecentEmoji": { + "key": "ClearRecentEmoji", + "value": "Clear recent emoji?" + }, + "ClearRecentHistory": { + "key": "ClearRecentHistory", + "value": "Clear history" + }, + "ClearSearch": { + "key": "ClearSearch", + "value": "Clear search history?" + }, + "ClearSearchAlert": { + "key": "ClearSearchAlert", + "value": "Are you sure you want to clear your search history?" + }, + "ClearSearchAlertTitle": { + "key": "ClearSearchAlertTitle", + "value": "Clear search history" + }, + "ClearSearchRemove": { + "key": "ClearSearchRemove", + "value": "Remove" + }, + "ClearSearchSingleAlertTitle": { + "key": "ClearSearchSingleAlertTitle", + "value": "Search history" + }, + "ClearSearchSingleChatAlertText": { + "key": "ClearSearchSingleChatAlertText", + "value": "Are you sure you want to remove \"%1$s\" from your search history?" + }, + "ClearSearchSingleUserAlertText": { + "key": "ClearSearchSingleUserAlertText", + "value": "Are you sure you want to remove \"%1$s\" from your search history?" + }, + "ClearTelegramCache": { + "key": "ClearTelegramCache", + "value": "Clear Telegram Cache" + }, + "Close": { + "key": "Close", + "value": "Close" + }, + "CloseEditor": { + "key": "CloseEditor", + "value": "CLOSE EDITOR" + }, + "Code": { + "key": "Code", + "value": "Code" + }, + "CodeExpired": { + "key": "CodeExpired", + "value": "Code expired, please retry login." + }, + "ColorBlue": { + "key": "ColorBlue", + "value": "Blue" + }, + "ColorCyan": { + "key": "ColorCyan", + "value": "Cyan" + }, + "ColorDark": { + "key": "ColorDark", + "value": "Dark" + }, + "ColorGreen": { + "key": "ColorGreen", + "value": "Green" + }, + "ColorOrange": { + "key": "ColorOrange", + "value": "Orange" + }, + "ColorPickerBackground": { + "key": "ColorPickerBackground", + "value": "Background" + }, + "ColorPickerMainColor": { + "key": "ColorPickerMainColor", + "value": "Accent Color" + }, + "ColorPickerMyMessages": { + "key": "ColorPickerMyMessages", + "value": "My Messages" + }, + "ColorPickerReset": { + "key": "ColorPickerReset", + "value": "RESET" + }, + "ColorPickerResetAll": { + "key": "ColorPickerResetAll", + "value": "RESET ALL" + }, + "ColorPink": { + "key": "ColorPink", + "value": "Pink" + }, + "ColorRed": { + "key": "ColorRed", + "value": "Red" + }, + "ColorSepia": { + "key": "ColorSepia", + "value": "Sepia" + }, + "ColorTheme": { + "key": "ColorTheme", + "value": "Color theme" + }, + "ColorThemeChanged": { + "key": "ColorThemeChanged", + "value": "Color theme changed." + }, + "ColorThemeChangedInfo": { + "key": "ColorThemeChangedInfo", + "value": "You can change it back in *Chat Settings*." + }, + "ColorThemes": { + "key": "ColorThemes", + "value": "Color Themes" + }, + "ColorViolet": { + "key": "ColorViolet", + "value": "Violet" + }, + "ColorWhite": { + "key": "ColorWhite", + "value": "White" + }, + "ColorYellow": { + "key": "ColorYellow", + "value": "Yellow" + }, + "Comment": { + "key": "Comment", + "value": "Comment" + }, + "Comments": { + "key": "Comments", + "zeroValue": null, + "oneValue": "%1$d Comment", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d Comments" + }, + "CommentsCount": { + "key": "CommentsCount", + "zeroValue": null, + "oneValue": "%1$d comment", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d comments" + }, + "CommentsNoNumber": { + "key": "CommentsNoNumber", + "zeroValue": null, + "oneValue": "comment", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "comments" + }, + "CommentsTitle": { + "key": "CommentsTitle", + "value": "Comments" + }, + "CommonGroups": { + "key": "CommonGroups", + "zeroValue": null, + "oneValue": "%1$d group in common", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d groups in common" + }, + "CompatibilityChat": { + "key": "CompatibilityChat", + "value": "%1$s is using an older version of Telegram, so secret photos will be shown in compatibility mode.\n\nOnce %2$s updates Telegram, photos with timers for 1 minute or less will start working in 'Tap and hold to view' mode, and you will be notified whenever the other party takes a screenshot." + }, + "ConfirmDeleteCallLog": { + "key": "ConfirmDeleteCallLog", + "value": "Do you want to delete this entry from the call log?" + }, + "Connected": { + "key": "Connected", + "value": "Connected" + }, + "Connecting": { + "key": "Connecting", + "value": "Connecting..." + }, + "ConnectingConnectProxy": { + "key": "ConnectingConnectProxy", + "value": "Connect Proxy" + }, + "ConnectingToProxy": { + "key": "ConnectingToProxy", + "value": "Connecting to proxy" + }, + "ConnectingToProxyDisable": { + "key": "ConnectingToProxyDisable", + "value": "Disable" + }, + "ConnectingToProxyDisableAlert": { + "key": "ConnectingToProxyDisableAlert", + "value": "Are you sure you want to disable proxy server %1$s? You can reenable it later in Settings > Data and Storage." + }, + "ConnectingToProxyEnable": { + "key": "ConnectingToProxyEnable", + "value": "Enable" + }, + "ConnectingToProxyTapToDisable": { + "key": "ConnectingToProxyTapToDisable", + "value": "Tap here to disable proxy..." + }, + "ContactBirthday": { + "key": "ContactBirthday", + "value": "Birthday" + }, + "ContactJob": { + "key": "ContactJob", + "value": "Job" + }, + "ContactJobTitle": { + "key": "ContactJobTitle", + "value": "Title" + }, + "ContactJoined": { + "key": "ContactJoined", + "value": "Contact joined Telegram" + }, + "ContactNotRegistered": { + "key": "ContactNotRegistered", + "value": "%1$s is not on Telegram yet, would you like to invite them to join?" + }, + "ContactNotRegisteredTitle": { + "key": "ContactNotRegisteredTitle", + "value": "Invite to Telegram" + }, + "ContactShare": { + "key": "ContactShare", + "value": "SHARE CONTACT" + }, + "ContactShortcutMessage": { + "key": "ContactShortcutMessage", + "value": "Message %1$s" + }, + "ContactShortcutVideoCall": { + "key": "ContactShortcutVideoCall", + "value": "Video call %1$s" + }, + "ContactShortcutVoiceCall": { + "key": "ContactShortcutVoiceCall", + "value": "Voice call %1$s" + }, + "ContactSupport": { + "key": "ContactSupport", + "value": "Contact Support" + }, + "ContactSupportInfo": { + "key": "ContactSupportInfo", + "value": "Tell us about any issues; logging out doesn't usually help." + }, + "Contacts": { + "key": "Contacts", + "value": "Contacts" + }, + "ContactsPermissionAlert": { + "key": "ContactsPermissionAlert", + "value": "**Telegram** needs access to your contacts so that you can connect with your friends across all your devices. Your contacts will be continuously synced with Telegram's heavily encrypted cloud servers." + }, + "ContactsPermissionAlertContinue": { + "key": "ContactsPermissionAlertContinue", + "value": "CONTINUE" + }, + "ContactsPermissionAlertNotNow": { + "key": "ContactsPermissionAlertNotNow", + "value": "NOT NOW" + }, + "Continue": { + "key": "Continue", + "value": "Continue" + }, + "ContinueOnThisLanguage": { + "key": "ContinueOnThisLanguage", + "value": "Continue in English" + }, + "Contrast": { + "key": "Contrast", + "value": "Contrast" + }, + "ConvertGroup": { + "key": "ConvertGroup", + "value": "Convert to Supergroup" + }, + "ConvertGroupAlert": { + "key": "ConvertGroupAlert", + "value": "This action is irreversible. It is not possible to downgrade a supergroup to a regular group." + }, + "ConvertGroupAlertWarning": { + "key": "ConvertGroupAlertWarning", + "value": "Warning" + }, + "ConvertGroupInfo": { + "key": "ConvertGroupInfo", + "value": "**Member limit reached.**\n\nFor more space and additional features, upgrade to a supergroup:\n\n• Supergroups can hold up to %1$s\n• New members can see the full message history\n• Deleted messages will disappear for all members\n• Admins can add a description to the group\n• Owner can set a public link for the group" + }, + "ConvertGroupInfo2": { + "key": "ConvertGroupInfo2", + "value": "**In supergroups:**\n\n• New members can see the full message history\n• Deleted messages will disappear for all members\n• Admins can add a description to the group\n• Creator can set a public link for the group" + }, + "ConvertGroupInfo3": { + "key": "ConvertGroupInfo3", + "value": "**Note:** this action can't be undone." + }, + "ConvertGroupMenu": { + "key": "ConvertGroupMenu", + "value": "Convert to supergroup" + }, + "Copy": { + "key": "Copy", + "value": "Copy" + }, + "CopyCardNumber": { + "key": "CopyCardNumber", + "value": "Copy" + }, + "CopyLink": { + "key": "CopyLink", + "value": "Copy Link" + }, + "CountOfResults": { + "key": "CountOfResults", + "zeroValue": null, + "oneValue": "%1$d of %2$d results", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d of %2$d results" + }, + "CountReceived": { + "key": "CountReceived", + "value": "Received" + }, + "CountSent": { + "key": "CountSent", + "value": "Sent" + }, + "Create": { + "key": "Create", + "value": "Create" + }, + "CreateEncryptedChatError": { + "key": "CreateEncryptedChatError", + "value": "An error occurred." + }, + "CreateGroupError": { + "key": "CreateGroupError", + "value": "Sorry, you can't create a group with these users because of their privacy settings." + }, + "CreateGroupForImport": { + "key": "CreateGroupForImport", + "value": "Create a New Group to Import" + }, + "CreateLink": { + "key": "CreateLink", + "value": "Create Link" + }, + "CreateNewContact": { + "key": "CreateNewContact", + "value": "Create New Contact" + }, + "CreateNewFilter": { + "key": "CreateNewFilter", + "value": "Create New Folder" + }, + "CreateNewFilterInfo": { + "key": "CreateNewFilterInfo", + "value": "Create folders for different groups of chats and quickly switch between them." + }, + "CreateNewLink": { + "key": "CreateNewLink", + "value": "Create a New Link" + }, + "CreateNewLinkHelp": { + "key": "CreateNewLinkHelp", + "value": "You can generate invite links that expire after they are used." + }, + "CreateNewTheme": { + "key": "CreateNewTheme", + "value": "Create New Theme" + }, + "CreateNewThemeAlert": { + "key": "CreateNewThemeAlert", + "value": "You can create your own theme by changing colors within the app.\n\nYou can always switch back to the default Telegram theme here." + }, + "CreateNewThemeHelp": { + "key": "CreateNewThemeHelp", + "value": "Tap on the palette icon to view the list of elements on each screen - and edit them." + }, + "CreateNewThemeInfo": { + "key": "CreateNewThemeInfo", + "value": "You can create your own theme by changing colors within the app. You can always switch back to the default Telegram theme here." + }, + "CreateNewThemeMenu": { + "key": "CreateNewThemeMenu", + "value": "Create new theme" + }, + "CreateTheme": { + "key": "CreateTheme", + "value": "CREATE THEME" + }, + "Crop": { + "key": "Crop", + "value": "CROP" + }, + "CropImage": { + "key": "CropImage", + "value": "Crop image" + }, + "CropOriginal": { + "key": "CropOriginal", + "value": "Original" + }, + "CropReset": { + "key": "CropReset", + "value": "Reset" + }, + "CropSquare": { + "key": "CropSquare", + "value": "Square" + }, + "CurrentGroupStickers": { + "key": "CurrentGroupStickers", + "value": "Group Stickers" + }, + "CurrentSession": { + "key": "CurrentSession", + "value": "This device" + }, + "CurvesAll": { + "key": "CurvesAll", + "value": "ALL" + }, + "CurvesBlue": { + "key": "CurvesBlue", + "value": "BLUE" + }, + "CurvesGreen": { + "key": "CurvesGreen", + "value": "GREEN" + }, + "CurvesRed": { + "key": "CurvesRed", + "value": "RED" + }, + "CustomCallInfo": { + "key": "CustomCallInfo", + "value": "These users will or will not be able to call you regardless of the settings above." + }, + "CustomHelp": { + "key": "CustomHelp", + "value": "You won't see Last Seen or Online statuses for people with whom you don't share yours. Approximate times will be shown instead (recently, within a week, within a month)." + }, + "CustomNotifications": { + "key": "CustomNotifications", + "value": "Custom Notifications" + }, + "CustomP2PInfo": { + "key": "CustomP2PInfo", + "value": "Peer-to-peer in calls will or will not be used with these users regardless of the settings above." + }, + "CustomShareInfo": { + "key": "CustomShareInfo", + "value": "These users will or will not be able to add you to groups and channels regardless of the settings above." + }, + "CustomShareSettingsHelp": { + "key": "CustomShareSettingsHelp", + "value": "You can add users or entire groups as exceptions that will override the settings above." + }, + "CustomThemes": { + "key": "CustomThemes", + "value": "Custom themes" + }, + "DartInfo": { + "key": "DartInfo", + "value": "Send a **:darts:** emoji to try your luck." + }, + "DataSettings": { + "key": "DataSettings", + "value": "Data and Storage" + }, + "DataUsage": { + "key": "DataUsage", + "value": "Disk and network usage" + }, + "Days": { + "key": "Days", + "zeroValue": null, + "oneValue": "%1$d day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d days" + }, + "DaysBold": { + "key": "DaysBold", + "zeroValue": null, + "oneValue": "**%1$d** day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "**%1$d** days" + }, + "DaysLeft": { + "key": "DaysLeft", + "zeroValue": null, + "oneValue": "%1$d day left", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d days left" + }, + "Deactivate": { + "key": "Deactivate", + "value": "DELETE NOW" + }, + "DebugClearLogs": { + "key": "DebugClearLogs", + "value": "Clear Logs" + }, + "DebugMenu": { + "key": "DebugMenu", + "value": "Debug Menu" + }, + "DebugMenuCallSettings": { + "key": "DebugMenuCallSettings", + "value": "Call settings" + }, + "DebugMenuClearMediaCache": { + "key": "DebugMenuClearMediaCache", + "value": "Clear sent media cache" + }, + "DebugMenuDisableCamera": { + "key": "DebugMenuDisableCamera", + "value": "Disable in-app camera" + }, + "DebugMenuDisableLogs": { + "key": "DebugMenuDisableLogs", + "value": "Disable Logs" + }, + "DebugMenuDisablePauseMusic": { + "key": "DebugMenuDisablePauseMusic", + "value": "Disable pause music when recording" + }, + "DebugMenuDisableSmoothKeyboard": { + "key": "DebugMenuDisableSmoothKeyboard", + "value": "Disable smooth keyboard" + }, + "DebugMenuEnableCamera": { + "key": "DebugMenuEnableCamera", + "value": "Enable in-app camera" + }, + "DebugMenuEnableLogs": { + "key": "DebugMenuEnableLogs", + "value": "Enable Logs" + }, + "DebugMenuEnablePauseMusic": { + "key": "DebugMenuEnablePauseMusic", + "value": "Enable pause music when recording" + }, + "DebugMenuEnableSmoothKeyboard": { + "key": "DebugMenuEnableSmoothKeyboard", + "value": "Enable smooth keyboard" + }, + "DebugMenuImportContacts": { + "key": "DebugMenuImportContacts", + "value": "Import Contacts" + }, + "DebugMenuReadAllDialogs": { + "key": "DebugMenuReadAllDialogs", + "value": "Read all Chats" + }, + "DebugMenuReloadContacts": { + "key": "DebugMenuReloadContacts", + "value": "Reload Contacts" + }, + "DebugMenuResetContacts": { + "key": "DebugMenuResetContacts", + "value": "Reset Imported Contacts" + }, + "DebugMenuResetDialogs": { + "key": "DebugMenuResetDialogs", + "value": "Reset Chats" + }, + "DebugSendLogs": { + "key": "DebugSendLogs", + "value": "Send Logs" + }, + "December": { + "key": "December", + "value": "December" + }, + "Decline": { + "key": "Decline", + "value": "Decline" + }, + "DeclineCall": { + "key": "DeclineCall", + "value": "Decline" + }, + "DeclineDeactivate": { + "key": "DeclineDeactivate", + "value": "Decline & Delete" + }, + "Default": { + "key": "Default", + "value": "Default" + }, + "DefaultRingtone": { + "key": "DefaultRingtone", + "value": "Default" + }, + "Delete": { + "key": "Delete", + "value": "Delete" + }, + "DeleteAccountHelp": { + "key": "DeleteAccountHelp", + "value": "If you do not come online at least once within this period, your account will be deleted along with all messages and contacts." + }, + "DeleteAccountIfAwayFor": { + "key": "DeleteAccountIfAwayFor", + "value": "If you're away for" + }, + "DeleteAccountIfAwayFor2": { + "key": "DeleteAccountIfAwayFor2", + "value": "Delete my account if away for" + }, + "DeleteAccountIfAwayFor3": { + "key": "DeleteAccountIfAwayFor3", + "value": "If away for" + }, + "DeleteAccountTitle": { + "key": "DeleteAccountTitle", + "value": "Account self-destructs" + }, + "DeleteAll": { + "key": "DeleteAll", + "value": "Delete All" + }, + "DeleteAllCalls": { + "key": "DeleteAllCalls", + "value": "Delete all calls" + }, + "DeleteAllCallsText": { + "key": "DeleteAllCallsText", + "value": "Do you want to delete all recent calls?" + }, + "DeleteAllFrom": { + "key": "DeleteAllFrom", + "value": "Delete all from %1$s" + }, + "DeleteAllMessagesAlert": { + "key": "DeleteAllMessagesAlert", + "value": "Warning! This will **delete all messages** in this chat for **both** participants." + }, + "DeleteAllMessagesSavedAlert": { + "key": "DeleteAllMessagesSavedAlert", + "value": "Warning! This will **delete all messages** in this chat." + }, + "DeleteAllRevokedLinkHelp": { + "key": "DeleteAllRevokedLinkHelp", + "value": "This will delete all revoked links." + }, + "DeleteAllRevokedLinks": { + "key": "DeleteAllRevokedLinks", + "value": "Delete All Revoked Links" + }, + "DeleteAndExit": { + "key": "DeleteAndExit", + "value": "Delete and leave group" + }, + "DeleteAndExitButton": { + "key": "DeleteAndExitButton", + "value": "Delete and Leave Group" + }, + "DeleteAndStop": { + "key": "DeleteAndStop", + "value": "Delete and stop" + }, + "DeleteBackground": { + "key": "DeleteBackground", + "zeroValue": null, + "oneValue": "Delete background", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Delete %1$d backgrounds" + }, + "DeleteBanUser": { + "key": "DeleteBanUser", + "value": "Ban user" + }, + "DeleteCalls": { + "key": "DeleteCalls", + "value": "Delete calls" + }, + "DeleteCallsForEveryone": { + "key": "DeleteCallsForEveryone", + "value": "Delete for everyone" + }, + "DeleteChannelForAll": { + "key": "DeleteChannelForAll", + "value": "Delete for all subscribers" + }, + "DeleteChat": { + "key": "DeleteChat", + "value": "Delete and exit" + }, + "DeleteChatBackgroundsAlert": { + "key": "DeleteChatBackgroundsAlert", + "value": "Are you sure you want to delete the selected backgrounds?" + }, + "DeleteChatUser": { + "key": "DeleteChatUser", + "value": "Delete chat" + }, + "DeleteContact": { + "key": "DeleteContact", + "value": "Delete contact" + }, + "DeleteFewChatsTitle": { + "key": "DeleteFewChatsTitle", + "value": "Delete %1$s" + }, + "DeleteForAll": { + "key": "DeleteForAll", + "value": "Delete for all members" + }, + "DeleteForUser": { + "key": "DeleteForUser", + "value": "Delete for %1$s" + }, + "DeleteFromFavorites": { + "key": "DeleteFromFavorites", + "value": "Delete from Favorites" + }, + "DeleteFromRecent": { + "key": "DeleteFromRecent", + "value": "Remove from Recent" + }, + "DeleteGif": { + "key": "DeleteGif", + "value": "Remove GIF from this section?" + }, + "DeleteGroupForAll": { + "key": "DeleteGroupForAll", + "value": "Delete the group for all members" + }, + "DeleteLink": { + "key": "DeleteLink", + "value": "Delete Link" + }, + "DeleteLinkHelp": { + "key": "DeleteLinkHelp", + "value": "This will delete link." + }, + "DeleteLocalization": { + "key": "DeleteLocalization", + "value": "Delete localization?" + }, + "DeleteLocalizationText": { + "key": "DeleteLocalizationText", + "value": "Are you sure you want to delete **%1$s** language pack?" + }, + "DeleteLocalizationTitle": { + "key": "DeleteLocalizationTitle", + "value": "Delete language pack" + }, + "DeleteMega": { + "key": "DeleteMega", + "value": "Delete Group" + }, + "DeleteMegaMenu": { + "key": "DeleteMegaMenu", + "value": "Delete group" + }, + "DeleteMessagesOption": { + "key": "DeleteMessagesOption", + "value": "Unsend My Messages" + }, + "DeleteMessagesOptionAlso": { + "key": "DeleteMessagesOptionAlso", + "value": "Also delete for %1$s" + }, + "DeleteMessagesText": { + "key": "DeleteMessagesText", + "value": "You can also delete the %1$s you sent from **%2$s**'s inbox by checking \"Unsend my messages\"." + }, + "DeleteMessagesTextGroup": { + "key": "DeleteMessagesTextGroup", + "value": "You can also delete the %1$s you sent from the inboxes of other group members by checking \"Unsend my messages\"." + }, + "DeleteMessagesTextGroupPart": { + "key": "DeleteMessagesTextGroupPart", + "value": "You can also delete the %1$s from the inboxes of other group members by checking \"Delete for all members\"." + }, + "DeleteMessagesTitle": { + "key": "DeleteMessagesTitle", + "value": "Delete %1$s" + }, + "DeleteMyAccount": { + "key": "DeleteMyAccount", + "value": "Delete my account" + }, + "DeletePhoto": { + "key": "DeletePhoto", + "value": "Remove photo" + }, + "DeleteProxy": { + "key": "DeleteProxy", + "value": "Delete Proxy?" + }, + "DeleteReportSpam": { + "key": "DeleteReportSpam", + "value": "Report spam" + }, + "DeleteSelectedCallsText": { + "key": "DeleteSelectedCallsText", + "value": "Do you want to delete selected calls from recent?" + }, + "DeleteSingleMessagesTitle": { + "key": "DeleteSingleMessagesTitle", + "value": "Delete message" + }, + "DeleteStickerSetsAlertTitle": { + "key": "DeleteStickerSetsAlertTitle", + "value": "Delete %1$s" + }, + "DeleteStickersAlertMessage": { + "key": "DeleteStickersAlertMessage", + "value": "Are you sure you want to delete the selected sticker sets?" + }, + "DeleteTheme": { + "key": "DeleteTheme", + "value": "Delete theme" + }, + "DeleteThemeAlert": { + "key": "DeleteThemeAlert", + "value": "Are you sure you want to delete this theme?" + }, + "DeleteThemeTitle": { + "key": "DeleteThemeTitle", + "value": "Delete theme" + }, + "DeleteTheseChats": { + "key": "DeleteTheseChats", + "value": "Delete chats" + }, + "DeleteTheseChatsBothSides": { + "key": "DeleteTheseChatsBothSides", + "value": "Delete chats" + }, + "DeleteThisChat": { + "key": "DeleteThisChat", + "value": "Delete this chat" + }, + "DeleteThisChatBothSides": { + "key": "DeleteThisChatBothSides", + "value": "Delete this chat" + }, + "DeleteThisGroup": { + "key": "DeleteThisGroup", + "value": "Delete this group" + }, + "DeletedFromYourContacts": { + "key": "DeletedFromYourContacts", + "value": "%s deleted from your contacts" + }, + "Deletions": { + "key": "Deletions", + "zeroValue": null, + "oneValue": "%1$d deletion", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d deletions" + }, + "DescriptionInfo": { + "key": "DescriptionInfo", + "value": "You can provide an optional description for your channel." + }, + "DescriptionOptionalPlaceholder": { + "key": "DescriptionOptionalPlaceholder", + "value": "Description (optional)" + }, + "DescriptionPlaceholder": { + "key": "DescriptionPlaceholder", + "value": "Description" + }, + "DeviceStorage": { + "key": "DeviceStorage", + "value": "Device storage" + }, + "Devices": { + "key": "Devices", + "value": "Devices" + }, + "DialogPin": { + "key": "DialogPin", + "value": "Pin" + }, + "DialogUnpin": { + "key": "DialogUnpin", + "value": "Unpin" + }, + "DiceEmojiInfo": { + "key": "DiceEmojiInfo", + "value": "Send a %1$s emoji to try your luck." + }, + "DiceInfo": { + "key": "DiceInfo", + "value": "Send a 🎲 emoji to any chat to get a random number from Telegram." + }, + "DiceInfo2": { + "key": "DiceInfo2", + "value": "Send a **:dice:** emoji to any chat to roll a die." + }, + "DidNotGetTheCode": { + "key": "DidNotGetTheCode", + "value": "Didn't get the code?" + }, + "DidNotGetTheCodeSms": { + "key": "DidNotGetTheCodeSms", + "value": "Send the code as an SMS" + }, + "DirectShare": { + "key": "DirectShare", + "value": "Direct Share" + }, + "DirectShareInfo": { + "key": "DirectShareInfo", + "value": "Show recent chats in Android share menu" + }, + "Directions": { + "key": "Directions", + "value": "Directions" + }, + "Disable": { + "key": "Disable", + "value": "Disable" + }, + "DisappearingGif": { + "key": "DisappearingGif", + "value": "Secret GIF" + }, + "DisappearingPhoto": { + "key": "DisappearingPhoto", + "value": "Secret Photo" + }, + "DisappearingVideo": { + "key": "DisappearingVideo", + "value": "Disappearing Video" + }, + "DiscardChanges": { + "key": "DiscardChanges", + "value": "Discard changes?" + }, + "DiscardVideoMessageDescription": { + "key": "DiscardVideoMessageDescription", + "value": "Are you sure you want to stop recording and discard your video message?" + }, + "DiscardVideoMessageTitle": { + "key": "DiscardVideoMessageTitle", + "value": "Discard Video Message" + }, + "DiscardVoiceMessageAction": { + "key": "DiscardVoiceMessageAction", + "value": "Discard" + }, + "DiscardVoiceMessageDescription": { + "key": "DiscardVoiceMessageDescription", + "value": "Are you sure you want to stop recording and discard your voice message?" + }, + "DiscardVoiceMessageTitle": { + "key": "DiscardVoiceMessageTitle", + "value": "Discard Voice Message" + }, + "Disconnect": { + "key": "Disconnect", + "value": "Disconnect" + }, + "DiscussChannel": { + "key": "DiscussChannel", + "value": "channel" + }, + "Discussion": { + "key": "Discussion", + "value": "Discussion" + }, + "DiscussionChannelGroupSetHelp": { + "key": "DiscussionChannelGroupSetHelp", + "value": "A link to **%1$s** is shown to all subscribers in the bottom panel." + }, + "DiscussionChannelGroupSetHelp2": { + "key": "DiscussionChannelGroupSetHelp2", + "value": "**%1$s** is selected as the group that hosts comments for your channel." + }, + "DiscussionChannelHelp": { + "key": "DiscussionChannelHelp", + "value": "Select a group chat for discussion that will be displayed in your channel." + }, + "DiscussionChannelHelp2": { + "key": "DiscussionChannelHelp2", + "value": "Everything you post in the channel will be forwarded to this group." + }, + "DiscussionChannelHelp3": { + "key": "DiscussionChannelHelp3", + "value": "Select a group chat that will host comments from your channel." + }, + "DiscussionCreateGroup": { + "key": "DiscussionCreateGroup", + "value": "Create a New Group" + }, + "DiscussionGroupHelp": { + "key": "DiscussionGroupHelp", + "value": "This group is linked as the discussion board for %1$s." + }, + "DiscussionGroupHelp2": { + "key": "DiscussionGroupHelp2", + "value": "All new messages posted in this channel are forwarded to the group." + }, + "DiscussionInfo": { + "key": "DiscussionInfo", + "value": "Add a group chat for comments" + }, + "DiscussionLinkGroup": { + "key": "DiscussionLinkGroup", + "value": "LINK GROUP" + }, + "DiscussionLinkGroupAlertHistory": { + "key": "DiscussionLinkGroupAlertHistory", + "value": "\"Chat history for new members\" will be switched to Visible." + }, + "DiscussionLinkGroupPrivateAlert": { + "key": "DiscussionLinkGroupPrivateAlert", + "value": "Do you want to make **%1$s** the discussion board for **%2$s**?\n\nAny member of this group will be able to see messages in the channel." + }, + "DiscussionLinkGroupPublicAlert": { + "key": "DiscussionLinkGroupPublicAlert", + "value": "Do you want to make **%1$s** the discussion board for **%2$s**?" + }, + "DiscussionLinkGroupPublicPrivateAlert": { + "key": "DiscussionLinkGroupPublicPrivateAlert", + "value": "Do you want to make **%1$s** the discussion board for **%2$s**?\n\nAnyone from the channel will be able to see messages in this group." + }, + "DiscussionStarted": { + "key": "DiscussionStarted", + "value": "Discussion started" + }, + "DiscussionUnlink": { + "key": "DiscussionUnlink", + "value": "Unlink" + }, + "DiscussionUnlinkChannel": { + "key": "DiscussionUnlinkChannel", + "value": "Unlink Channel" + }, + "DiscussionUnlinkChannelAlert": { + "key": "DiscussionUnlinkChannelAlert", + "value": "Are you sure you want to unlink **%1$s** from this channel?" + }, + "DiscussionUnlinkGroup": { + "key": "DiscussionUnlinkGroup", + "value": "Unlink Group" + }, + "DiscussionUnlinkGroupAlert": { + "key": "DiscussionUnlinkGroupAlert", + "value": "Are you sure you want to unlink **%1$s** from this group?" + }, + "DistanceUnits": { + "key": "DistanceUnits", + "value": "Distance Units" + }, + "DistanceUnitsAutomatic": { + "key": "DistanceUnitsAutomatic", + "value": "Automatic" + }, + "DistanceUnitsKilometers": { + "key": "DistanceUnitsKilometers", + "value": "Kilometers" + }, + "DistanceUnitsMiles": { + "key": "DistanceUnitsMiles", + "value": "Miles" + }, + "DistanceUnitsTitle": { + "key": "DistanceUnitsTitle", + "value": "Distance units" + }, + "DocumentsTitle": { + "key": "DocumentsTitle", + "value": "Shared Files" + }, + "Done": { + "key": "Done", + "value": "Done" + }, + "Draft": { + "key": "Draft", + "value": "Draft" + }, + "Edit": { + "key": "Edit", + "value": "Edit" + }, + "EditAdmin": { + "key": "EditAdmin", + "value": "Admin Rights" + }, + "EditAdminAddAdmins": { + "key": "EditAdminAddAdmins", + "value": "Add New Admins" + }, + "EditAdminAddUsers": { + "key": "EditAdminAddUsers", + "value": "Add Users" + }, + "EditAdminAddUsersViaLink": { + "key": "EditAdminAddUsersViaLink", + "value": "Invite Users via Link" + }, + "EditAdminBanUsers": { + "key": "EditAdminBanUsers", + "value": "Ban Users" + }, + "EditAdminCantEdit": { + "key": "EditAdminCantEdit", + "value": "You cannot edit the rights of this admin." + }, + "EditAdminChangeChannelInfo": { + "key": "EditAdminChangeChannelInfo", + "value": "Change Channel Info" + }, + "EditAdminChangeGroupInfo": { + "key": "EditAdminChangeGroupInfo", + "value": "Change Group Info" + }, + "EditAdminChannelTransfer": { + "key": "EditAdminChannelTransfer", + "value": "Transfer Channel Ownership" + }, + "EditAdminDeleteMessages": { + "key": "EditAdminDeleteMessages", + "value": "Delete Messages of Others" + }, + "EditAdminEditMessages": { + "key": "EditAdminEditMessages", + "value": "Edit Messages of Others" + }, + "EditAdminGroupDeleteMessages": { + "key": "EditAdminGroupDeleteMessages", + "value": "Delete Messages" + }, + "EditAdminGroupTransfer": { + "key": "EditAdminGroupTransfer", + "value": "Transfer Group Ownership" + }, + "EditAdminPinMessages": { + "key": "EditAdminPinMessages", + "value": "Pin Messages" + }, + "EditAdminPostMessages": { + "key": "EditAdminPostMessages", + "value": "Post Messages" + }, + "EditAdminPromotedBy": { + "key": "EditAdminPromotedBy", + "value": "Promoted by %1$s" + }, + "EditAdminRank": { + "key": "EditAdminRank", + "value": "Custom title" + }, + "EditAdminRankInfo": { + "key": "EditAdminRankInfo", + "value": "A custom title that will be shown to all members instead of '%1$s'." + }, + "EditAdminRemoveAdmin": { + "key": "EditAdminRemoveAdmin", + "value": "Dismiss Admin" + }, + "EditAdminRights": { + "key": "EditAdminRights", + "value": "Edit admin rights" + }, + "EditAdminSendAnonymously": { + "key": "EditAdminSendAnonymously", + "value": "Remain Anonymous" + }, + "EditAdminTransferAlertText": { + "key": "EditAdminTransferAlertText", + "value": "You can transfer this group to **%1$s** only if you:" + }, + "EditAdminTransferAlertText1": { + "key": "EditAdminTransferAlertText1", + "value": "Enabled **Two-Step Verification** more than **7 days** ago." + }, + "EditAdminTransferAlertText2": { + "key": "EditAdminTransferAlertText2", + "value": "Logged in on this device more than **24 hours** ago." + }, + "EditAdminTransferAlertText3": { + "key": "EditAdminTransferAlertText3", + "value": "Please come back later." + }, + "EditAdminTransferAlertTitle": { + "key": "EditAdminTransferAlertTitle", + "value": "Security Check" + }, + "EditAdminTransferChangeOwner": { + "key": "EditAdminTransferChangeOwner", + "value": "Change Owner" + }, + "EditAdminTransferChannelToast": { + "key": "EditAdminTransferChannelToast", + "value": "**%1$s** is now the owner of the channel." + }, + "EditAdminTransferGroupToast": { + "key": "EditAdminTransferGroupToast", + "value": "**%1$s** is now the owner of the group." + }, + "EditAdminTransferReadyAlertText": { + "key": "EditAdminTransferReadyAlertText", + "value": "This will transfer the **full owner** rights for **%1$s** to **%2$s**." + }, + "EditAdminTransferSetPassword": { + "key": "EditAdminTransferSetPassword", + "value": "Set Password" + }, + "EditAdminWhatCanDo": { + "key": "EditAdminWhatCanDo", + "value": "What can this admin do?" + }, + "EditCantEditPermissions": { + "key": "EditCantEditPermissions", + "value": "You cannot edit this permission." + }, + "EditCantEditPermissionsPublic": { + "key": "EditCantEditPermissionsPublic", + "value": "This permission is not available in public groups." + }, + "EditCaption": { + "key": "EditCaption", + "value": "Edit Caption" + }, + "EditChannelAdminTransferAlertText": { + "key": "EditChannelAdminTransferAlertText", + "value": "You can transfer this channel to **%1$s** only if you have:" + }, + "EditContact": { + "key": "EditContact", + "value": "Edit contact" + }, + "EditLink": { + "key": "EditLink", + "value": "Edit link" + }, + "EditMessage": { + "key": "EditMessage", + "value": "Edit Message" + }, + "EditMessageEditPhoto": { + "key": "EditMessageEditPhoto", + "value": "Edit this photo" + }, + "EditMessageEditVideo": { + "key": "EditMessageEditVideo", + "value": "Edit this video" + }, + "EditMessageError": { + "key": "EditMessageError", + "value": "Sorry, you can't edit this message." + }, + "EditMessageMedia": { + "key": "EditMessageMedia", + "value": "Tap to edit media" + }, + "EditMessageReplaceAudio": { + "key": "EditMessageReplaceAudio", + "value": "Replace audio file" + }, + "EditMessageReplaceFile": { + "key": "EditMessageReplaceFile", + "value": "Replace file" + }, + "EditMessageReplaceGif": { + "key": "EditMessageReplaceGif", + "value": "Replace media" + }, + "EditMessageReplacePhoto": { + "key": "EditMessageReplacePhoto", + "value": "Replace photo" + }, + "EditMessageReplaceVideo": { + "key": "EditMessageReplaceVideo", + "value": "Replace video" + }, + "EditName": { + "key": "EditName", + "value": "Edit name" + }, + "EditPhoto": { + "key": "EditPhoto", + "value": "Open in editor" + }, + "EditThemeColors": { + "key": "EditThemeColors", + "value": "Edit colors" + }, + "EditThemeTitle": { + "key": "EditThemeTitle", + "value": "Edit Theme" + }, + "EditWidget": { + "key": "EditWidget", + "value": "Edit Widget" + }, + "EditWidgetChatsInfo": { + "key": "EditWidgetChatsInfo", + "value": "Display the latest message from the chats you choose.\n\nIf no specific chats are selected, your most recent chats will be shown in this widget." + }, + "EditWidgetContactsInfo": { + "key": "EditWidgetContactsInfo", + "value": "Display shortcuts to your most important chats for quick access.\n\nIf nobody is selected, your most frequent contacts will be shown in this widget." + }, + "EditedMessage": { + "key": "EditedMessage", + "value": "edited" + }, + "EmailCopied": { + "key": "EmailCopied", + "value": "Email copied to clipboard" + }, + "EmailPasswordConfirmText": { + "key": "EmailPasswordConfirmText", + "value": "Please follow these steps to complete Two-Step Verification Setup:\n\n1. Check your email (don't forget the spam folder)\n%1$s\n\n2. Click on the validation link." + }, + "EmailPasswordConfirmText2": { + "key": "EmailPasswordConfirmText2", + "value": "To complete Two-Step Verification Setup, check your email (don't forget the spam folder) and enter the code we just sent you." + }, + "EmailPasswordConfirmText3": { + "key": "EmailPasswordConfirmText3", + "value": "To complete reсoverу email setup, check %1$s (don't forget the spam folder) and enter the code we just sent you." + }, + "Emoji": { + "key": "Emoji", + "value": "Emoji" + }, + "Emoji1": { + "key": "Emoji1", + "value": "Smileys and people" + }, + "Emoji2": { + "key": "Emoji2", + "value": "Animals and nature" + }, + "Emoji3": { + "key": "Emoji3", + "value": "Food and drink" + }, + "Emoji4": { + "key": "Emoji4", + "value": "Activity" + }, + "Emoji5": { + "key": "Emoji5", + "value": "Travel and places" + }, + "Emoji6": { + "key": "Emoji6", + "value": "Objects" + }, + "Emoji7": { + "key": "Emoji7", + "value": "Symbols" + }, + "Emoji8": { + "key": "Emoji8", + "value": "Flags" + }, + "EmojiBigSize": { + "key": "EmojiBigSize", + "value": "Draw single big emoji" + }, + "EmojiSuggestions": { + "key": "EmojiSuggestions", + "value": "Emoji suggestions" + }, + "EmojiSuggestionsInfo": { + "key": "EmojiSuggestionsInfo", + "value": "**Telegram** lets you find emoji by thousands of keywords, but there is always something missing. If you want to suggest a new emoji replacement, you can help us by visiting:" + }, + "EmojiSuggestionsUrl": { + "key": "EmojiSuggestionsUrl", + "value": "https://translations.telegram.org/%1$s/emoji" + }, + "EmojiUseDefault": { + "key": "EmojiUseDefault", + "value": "Use system default emoji" + }, + "EmpryUsersPlaceholder": { + "key": "EmpryUsersPlaceholder", + "value": "Add Users" + }, + "EmptyExceptions": { + "key": "EmptyExceptions", + "value": "None" + }, + "Enable": { + "key": "Enable", + "value": "Enable" + }, + "EnableAllStreamingInfo": { + "key": "EnableAllStreamingInfo", + "value": "Some videos can't be streamed – e.g., all videos that were sent from Android using Telegram 4.7 and earlier versions.\n" + }, + "EnableAnimations": { + "key": "EnableAnimations", + "value": "Enable Animations" + }, + "EnableAutoDelete": { + "key": "EnableAutoDelete", + "value": "Enable Auto-Delete" + }, + "EnableProxyAlert": { + "key": "EnableProxyAlert", + "value": "Are you sure you want to enable this proxy?" + }, + "EnableProxyAlert2": { + "key": "EnableProxyAlert2", + "value": "You can change your proxy server later in Settings > Data and Storage." + }, + "EnableStreaming": { + "key": "EnableStreaming", + "value": "Stream Videos and Audio Files" + }, + "EnabledNotifications": { + "key": "EnabledNotifications", + "value": "Enabled Notifications" + }, + "EnabledPasswordText": { + "key": "EnabledPasswordText", + "value": "You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account." + }, + "EncryptedChatStartedIncoming": { + "key": "EncryptedChatStartedIncoming", + "value": "You joined the secret chat." + }, + "EncryptedChatStartedOutgoing": { + "key": "EncryptedChatStartedOutgoing", + "value": "%s joined your secret chat." + }, + "EncryptedDescription1": { + "key": "EncryptedDescription1", + "value": "Use end-to-end encryption" + }, + "EncryptedDescription2": { + "key": "EncryptedDescription2", + "value": "Leave no trace on our servers" + }, + "EncryptedDescription3": { + "key": "EncryptedDescription3", + "value": "Have a self-destruct timer" + }, + "EncryptedDescription4": { + "key": "EncryptedDescription4", + "value": "Do not allow forwarding" + }, + "EncryptedDescriptionTitle": { + "key": "EncryptedDescriptionTitle", + "value": "Secret chats:" + }, + "EncryptedPlaceholderTitleIncoming": { + "key": "EncryptedPlaceholderTitleIncoming", + "value": "%s invited you to join a secret chat." + }, + "EncryptedPlaceholderTitleOutgoing": { + "key": "EncryptedPlaceholderTitleOutgoing", + "value": "You have invited %s to join a secret chat." + }, + "EncryptionKey": { + "key": "EncryptionKey", + "value": "Encryption Key" + }, + "EncryptionKeyDescription": { + "key": "EncryptionKeyDescription", + "value": "This image and text were derived from the encryption key for this secret chat with **%1$s**.\n\nIf they look the same on **%2$s's** device, end-to-end encryption is guaranteed.\n\nLearn more at telegram.org" + }, + "EncryptionKeyLink": { + "key": "EncryptionKeyLink", + "value": "https://telegram.org/faq#secret-chats" + }, + "EncryptionProcessing": { + "key": "EncryptionProcessing", + "value": "Exchanging encryption keys..." + }, + "EncryptionRejected": { + "key": "EncryptionRejected", + "value": "Secret chat cancelled" + }, + "English": { + "key": "English", + "value": "English" + }, + "Enhance": { + "key": "Enhance", + "value": "Enhance" + }, + "EnterChannelName": { + "key": "EnterChannelName", + "value": "Channel name" + }, + "EnterCode": { + "key": "EnterCode", + "value": "Enter code" + }, + "EnterCurrentPasscode": { + "key": "EnterCurrentPasscode", + "value": "Enter your current passcode" + }, + "EnterGroupNamePlaceholder": { + "key": "EnterGroupNamePlaceholder", + "value": "Enter group name" + }, + "EnterListName": { + "key": "EnterListName", + "value": "Enter list name" + }, + "EnterNewFirstPasscode": { + "key": "EnterNewFirstPasscode", + "value": "Enter a passcode" + }, + "EnterNewPasscode": { + "key": "EnterNewPasscode", + "value": "Enter your new passcode" + }, + "EnterThemeName": { + "key": "EnterThemeName", + "value": "Enter theme name" + }, + "EnterThemeNameEdit": { + "key": "EnterThemeNameEdit", + "value": "Tap **Create** if you want to share your theme with others or customize each color manually.\n\nPlease enter theme name:" + }, + "EnterYourPasscode": { + "key": "EnterYourPasscode", + "value": "Enter your passcode" + }, + "ErrorOccurred": { + "key": "ErrorOccurred", + "value": "An error occurred." + }, + "ErrorSendRestrictedMedia": { + "key": "ErrorSendRestrictedMedia", + "value": "Sorry, the admins of this group have restricted you from sending media." + }, + "ErrorSendRestrictedMediaAll": { + "key": "ErrorSendRestrictedMediaAll", + "value": "Sorry, sending media is not allowed in this group." + }, + "ErrorSendRestrictedPolls": { + "key": "ErrorSendRestrictedPolls", + "value": "Sorry, the admins of this group have restricted you from sending polls." + }, + "ErrorSendRestrictedPollsAll": { + "key": "ErrorSendRestrictedPollsAll", + "value": "Sorry, sending polls is not allowed in this group." + }, + "ErrorSendRestrictedStickers": { + "key": "ErrorSendRestrictedStickers", + "value": "Sorry, the admins of this group have restricted you from sending stickers." + }, + "ErrorSendRestrictedStickersAll": { + "key": "ErrorSendRestrictedStickersAll", + "value": "Sorry, sending stickers is not allowed in this group." + }, + "EventLog": { + "key": "EventLog", + "value": "Recent Actions" + }, + "EventLogAdded": { + "key": "EventLogAdded", + "value": "un1 added un2" + }, + "EventLogAllAdmins": { + "key": "EventLogAllAdmins", + "value": "All admins" + }, + "EventLogAllEvents": { + "key": "EventLogAllEvents", + "value": "All actions" + }, + "EventLogChangedChannelLink": { + "key": "EventLogChangedChannelLink", + "value": "un1 changed the channel link:" + }, + "EventLogChangedGroupLink": { + "key": "EventLogChangedGroupLink", + "value": "un1 changed the group link:" + }, + "EventLogChangedLinkedChannel": { + "key": "EventLogChangedLinkedChannel", + "value": "un1 linked this group to un2" + }, + "EventLogChangedLinkedGroup": { + "key": "EventLogChangedLinkedGroup", + "value": "un1 made un2 the discussion group for this channel" + }, + "EventLogChangedLocation": { + "key": "EventLogChangedLocation", + "value": "un1 changed the group location to \"%1$s\"" + }, + "EventLogChangedOwnership": { + "key": "EventLogChangedOwnership", + "value": "transferred ownership to %1$s" + }, + "EventLogChangedStickersSet": { + "key": "EventLogChangedStickersSet", + "value": "un1 changed the group sticker set" + }, + "EventLogChannelJoined": { + "key": "EventLogChannelJoined", + "value": "un1 joined the channel" + }, + "EventLogChannelRestricted": { + "key": "EventLogChannelRestricted", + "value": "banned %1$s" + }, + "EventLogChannelUnrestricted": { + "key": "EventLogChannelUnrestricted", + "value": "unbanned %1$s" + }, + "EventLogDefaultPermissions": { + "key": "EventLogDefaultPermissions", + "value": "changed default permissions" + }, + "EventLogDeletedMessages": { + "key": "EventLogDeletedMessages", + "value": "un1 deleted this message:" + }, + "EventLogEditedCaption": { + "key": "EventLogEditedCaption", + "value": "un1 edited caption:" + }, + "EventLogEditedChannelDescription": { + "key": "EventLogEditedChannelDescription", + "value": "un1 edited the channel description:" + }, + "EventLogEditedChannelPhoto": { + "key": "EventLogEditedChannelPhoto", + "value": "un1 set a new channel photo" + }, + "EventLogEditedChannelTitle": { + "key": "EventLogEditedChannelTitle", + "value": "un1 renamed the channel to \"%1$s\"" + }, + "EventLogEditedChannelVideo": { + "key": "EventLogEditedChannelVideo", + "value": "un1 set a new channel video" + }, + "EventLogEditedGroupDescription": { + "key": "EventLogEditedGroupDescription", + "value": "un1 edited the group description:" + }, + "EventLogEditedGroupPhoto": { + "key": "EventLogEditedGroupPhoto", + "value": "un1 set a new group photo" + }, + "EventLogEditedGroupTitle": { + "key": "EventLogEditedGroupTitle", + "value": "un1 renamed the group to \"%1$s\"" + }, + "EventLogEditedGroupVideo": { + "key": "EventLogEditedGroupVideo", + "value": "un1 set a new group video" + }, + "EventLogEditedMedia": { + "key": "EventLogEditedMedia", + "value": "un1 edited media:" + }, + "EventLogEditedMediaCaption": { + "key": "EventLogEditedMediaCaption", + "value": "un1 edited media and caption:" + }, + "EventLogEditedMessages": { + "key": "EventLogEditedMessages", + "value": "un1 edited this message:" + }, + "EventLogEditedYouChannelPhoto": { + "key": "EventLogEditedYouChannelPhoto", + "value": "You set new channel photo" + }, + "EventLogEditedYouChannelTitle": { + "key": "EventLogEditedYouChannelTitle", + "value": "You renamed the channel to \"%1$s\"" + }, + "EventLogEditedYouGroupPhoto": { + "key": "EventLogEditedYouGroupPhoto", + "value": "You set new group photo" + }, + "EventLogEditedYouGroupTitle": { + "key": "EventLogEditedYouGroupTitle", + "value": "You renamed the group to \"%1$s\"" + }, + "EventLogEmpty": { + "key": "EventLogEmpty", + "value": "**No actions here yet**\n\nThe group's members and admins\nhave not taken any service actions\nin the last 48 hours." + }, + "EventLogEmptyChannel": { + "key": "EventLogEmptyChannel", + "value": "**No actions here yet**\n\nThe channel's admins\nhave not taken any service actions\nin the last 48 hours." + }, + "EventLogEmptySearch": { + "key": "EventLogEmptySearch", + "value": "**No actions found**\n\nNo recent actions that match your query\nwere found." + }, + "EventLogEmptyTextSearch": { + "key": "EventLogEmptyTextSearch", + "value": "No recent actions that contain '**%1$s**' have been found." + }, + "EventLogEndedVoiceChat": { + "key": "EventLogEndedVoiceChat", + "value": "un1 ended the voice chat" + }, + "EventLogFilterAll": { + "key": "EventLogFilterAll", + "value": "All actions" + }, + "EventLogFilterCalls": { + "key": "EventLogFilterCalls", + "value": "Voice chats" + }, + "EventLogFilterChannelInfo": { + "key": "EventLogFilterChannelInfo", + "value": "Channel info" + }, + "EventLogFilterChannelSettings": { + "key": "EventLogFilterChannelSettings", + "value": "Channel settings" + }, + "EventLogFilterDeletedMessages": { + "key": "EventLogFilterDeletedMessages", + "value": "Deleted messages" + }, + "EventLogFilterEditedMessages": { + "key": "EventLogFilterEditedMessages", + "value": "Edited messages" + }, + "EventLogFilterGroupInfo": { + "key": "EventLogFilterGroupInfo", + "value": "Group info" + }, + "EventLogFilterInvites": { + "key": "EventLogFilterInvites", + "value": "Invite links" + }, + "EventLogFilterLeavingMembers": { + "key": "EventLogFilterLeavingMembers", + "value": "Leaving members" + }, + "EventLogFilterNewAdmins": { + "key": "EventLogFilterNewAdmins", + "value": "Admin rights" + }, + "EventLogFilterNewMembers": { + "key": "EventLogFilterNewMembers", + "value": "New members" + }, + "EventLogFilterNewRestrictions": { + "key": "EventLogFilterNewRestrictions", + "value": "New exceptions" + }, + "EventLogFilterPinnedMessages": { + "key": "EventLogFilterPinnedMessages", + "value": "Pinned messages" + }, + "EventLogGroupJoined": { + "key": "EventLogGroupJoined", + "value": "un1 joined the group" + }, + "EventLogInfoDetail": { + "key": "EventLogInfoDetail", + "value": "This is a list of notable actions by members and admins in the last 48 hours." + }, + "EventLogInfoDetailChannel": { + "key": "EventLogInfoDetailChannel", + "value": "This is a list of all service actions taken by the channel's admins in the last 48 hours." + }, + "EventLogInfoTitle": { + "key": "EventLogInfoTitle", + "value": "What is the Recent Actions?" + }, + "EventLogLeft": { + "key": "EventLogLeft", + "value": "un1 left the group" + }, + "EventLogLeftChannel": { + "key": "EventLogLeftChannel", + "value": "un1 left the channel" + }, + "EventLogLeftGroup": { + "key": "EventLogLeftGroup", + "value": "un1 left the group" + }, + "EventLogOriginalCaption": { + "key": "EventLogOriginalCaption", + "value": "Original caption" + }, + "EventLogOriginalCaptionEmpty": { + "key": "EventLogOriginalCaptionEmpty", + "value": "Empty" + }, + "EventLogOriginalMessages": { + "key": "EventLogOriginalMessages", + "value": "Original message" + }, + "EventLogPinnedMessages": { + "key": "EventLogPinnedMessages", + "value": "un1 pinned this message:" + }, + "EventLogPreviousChannelLink": { + "key": "EventLogPreviousChannelLink", + "value": "Previous channel link" + }, + "EventLogPreviousGroupDescription": { + "key": "EventLogPreviousGroupDescription", + "value": "Previous description" + }, + "EventLogPreviousGroupLink": { + "key": "EventLogPreviousGroupLink", + "value": "Previous group link" + }, + "EventLogPreviousLink": { + "key": "EventLogPreviousLink", + "value": "Previous link" + }, + "EventLogPromoted": { + "key": "EventLogPromoted", + "value": "changed privileges of %1$s" + }, + "EventLogPromotedAddAdmins": { + "key": "EventLogPromotedAddAdmins", + "value": "Add admins" + }, + "EventLogPromotedAddUsers": { + "key": "EventLogPromotedAddUsers", + "value": "Add users" + }, + "EventLogPromotedBanUsers": { + "key": "EventLogPromotedBanUsers", + "value": "Ban users" + }, + "EventLogPromotedChangeChannelInfo": { + "key": "EventLogPromotedChangeChannelInfo", + "value": "Change channel Info" + }, + "EventLogPromotedChangeGroupInfo": { + "key": "EventLogPromotedChangeGroupInfo", + "value": "Edit group info" + }, + "EventLogPromotedDeleteMessages": { + "key": "EventLogPromotedDeleteMessages", + "value": "Delete messages" + }, + "EventLogPromotedEditMessages": { + "key": "EventLogPromotedEditMessages", + "value": "Edit messages" + }, + "EventLogPromotedInviteLink": { + "key": "EventLogPromotedInviteLink", + "value": "Invite via link" + }, + "EventLogPromotedManageCall": { + "key": "EventLogPromotedManageCall", + "value": "Manage voice chats" + }, + "EventLogPromotedNoRights": { + "key": "EventLogPromotedNoRights", + "value": "promoted %1$s" + }, + "EventLogPromotedPinMessages": { + "key": "EventLogPromotedPinMessages", + "value": "Pin messages" + }, + "EventLogPromotedPostMessages": { + "key": "EventLogPromotedPostMessages", + "value": "Post messages" + }, + "EventLogPromotedRemovedTitle": { + "key": "EventLogPromotedRemovedTitle", + "value": "Title" + }, + "EventLogPromotedSendAnonymously": { + "key": "EventLogPromotedSendAnonymously", + "value": "Remain Anonymous" + }, + "EventLogPromotedTitle": { + "key": "EventLogPromotedTitle", + "value": "Title: %1$s" + }, + "EventLogRemoved": { + "key": "EventLogRemoved", + "value": "un1 removed un2" + }, + "EventLogRemovedChannelLink": { + "key": "EventLogRemovedChannelLink", + "value": "un1 removed the channel link" + }, + "EventLogRemovedChannelPhoto": { + "key": "EventLogRemovedChannelPhoto", + "value": "un1 removed the channel photo" + }, + "EventLogRemovedGroupLink": { + "key": "EventLogRemovedGroupLink", + "value": "un1 removed the group link" + }, + "EventLogRemovedLinkedChannel": { + "key": "EventLogRemovedLinkedChannel", + "value": "un1 unlinked this group from un2" + }, + "EventLogRemovedLinkedGroup": { + "key": "EventLogRemovedLinkedGroup", + "value": "un1 removed the discussion group un2" + }, + "EventLogRemovedLocation": { + "key": "EventLogRemovedLocation", + "value": "un1 removed the group location" + }, + "EventLogRemovedStickersSet": { + "key": "EventLogRemovedStickersSet", + "value": "un1 removed the group sticker set" + }, + "EventLogRemovedWGroupPhoto": { + "key": "EventLogRemovedWGroupPhoto", + "value": "un1 removed the group photo" + }, + "EventLogRemovedYouChannelPhoto": { + "key": "EventLogRemovedYouChannelPhoto", + "value": "You removed channel photo" + }, + "EventLogRemovedYouGroupPhoto": { + "key": "EventLogRemovedYouGroupPhoto", + "value": "You removed group photo" + }, + "EventLogRestricted": { + "key": "EventLogRestricted", + "value": "changed restrictions for %1$s indefinitely" + }, + "EventLogRestrictedChangeInfo": { + "key": "EventLogRestrictedChangeInfo", + "value": "Change info" + }, + "EventLogRestrictedInviteUsers": { + "key": "EventLogRestrictedInviteUsers", + "value": "Add users" + }, + "EventLogRestrictedPinMessages": { + "key": "EventLogRestrictedPinMessages", + "value": "Pin messages" + }, + "EventLogRestrictedReadMessages": { + "key": "EventLogRestrictedReadMessages", + "value": "Read messages" + }, + "EventLogRestrictedSendEmbed": { + "key": "EventLogRestrictedSendEmbed", + "value": "Embed links" + }, + "EventLogRestrictedSendMedia": { + "key": "EventLogRestrictedSendMedia", + "value": "Send media" + }, + "EventLogRestrictedSendMessages": { + "key": "EventLogRestrictedSendMessages", + "value": "Send messages" + }, + "EventLogRestrictedSendPolls": { + "key": "EventLogRestrictedSendPolls", + "value": "Send polls" + }, + "EventLogRestrictedSendStickers": { + "key": "EventLogRestrictedSendStickers", + "value": "Send stickers & GIFs" + }, + "EventLogRestrictedUntil": { + "key": "EventLogRestrictedUntil", + "value": "changed permissions for %1$s\n\nDuration: %2$s" + }, + "EventLogSelectedEvents": { + "key": "EventLogSelectedEvents", + "value": "selected actions" + }, + "EventLogStartedVoiceChat": { + "key": "EventLogStartedVoiceChat", + "value": "un1 started a voice chat" + }, + "EventLogStopPoll": { + "key": "EventLogStopPoll", + "value": "un1 stopped the poll:" + }, + "EventLogStopQuiz": { + "key": "EventLogStopQuiz", + "value": "un1 stopped the quiz:" + }, + "EventLogToggledInvitesHistoryOff": { + "key": "EventLogToggledInvitesHistoryOff", + "value": "un1 made group history hidden for new members" + }, + "EventLogToggledInvitesHistoryOn": { + "key": "EventLogToggledInvitesHistoryOn", + "value": "un1 made group history visible for new members" + }, + "EventLogToggledInvitesOff": { + "key": "EventLogToggledInvitesOff", + "value": "un1 disabled group invites" + }, + "EventLogToggledInvitesOn": { + "key": "EventLogToggledInvitesOn", + "value": "un1 enabled group invites" + }, + "EventLogToggledSignaturesOff": { + "key": "EventLogToggledSignaturesOff", + "value": "un1 disabled signatures" + }, + "EventLogToggledSignaturesOn": { + "key": "EventLogToggledSignaturesOn", + "value": "un1 enabled signatures" + }, + "EventLogToggledSlowmodeOff": { + "key": "EventLogToggledSlowmodeOff", + "value": "un1 disabled the slow mode" + }, + "EventLogToggledSlowmodeOn": { + "key": "EventLogToggledSlowmodeOn", + "value": "un1 set the slow mode timer to %1$s" + }, + "EventLogUnpinnedMessages": { + "key": "EventLogUnpinnedMessages", + "value": "un1 unpinned a message" + }, + "EventLogVoiceChatAllowedToSpeak": { + "key": "EventLogVoiceChatAllowedToSpeak", + "value": "un1 allowed new voice chat participants to speak" + }, + "EventLogVoiceChatMuted": { + "key": "EventLogVoiceChatMuted", + "value": "un1 muted un2 in a voice chat" + }, + "EventLogVoiceChatNotAllowedToSpeak": { + "key": "EventLogVoiceChatNotAllowedToSpeak", + "value": "un1 muted new voice chat participants" + }, + "EventLogVoiceChatUnmuted": { + "key": "EventLogVoiceChatUnmuted", + "value": "un1 unmuted un2 in a voice chat" + }, + "EventLogYouChannelJoined": { + "key": "EventLogYouChannelJoined", + "value": "You joined channel" + }, + "EventLogYouGroupJoined": { + "key": "EventLogYouGroupJoined", + "value": "You joined group" + }, + "EventLogYouLeft": { + "key": "EventLogYouLeft", + "value": "You left group" + }, + "EventLogYouPromoted": { + "key": "EventLogYouPromoted", + "value": "You changed privileges of un2 (%1$s)" + }, + "EventLogYouRestricted": { + "key": "EventLogYouRestricted", + "value": "You changed restrictions for un2 (%1$s)" + }, + "Events": { + "key": "Events", + "value": "Events" + }, + "Exception": { + "key": "Exception", + "zeroValue": null, + "oneValue": "%1$d exception", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d exceptions" + }, + "ExpireAfter": { + "key": "ExpireAfter", + "value": "Expire after" + }, + "Expired": { + "key": "Expired", + "value": "Expired" + }, + "ExpiredLink": { + "key": "ExpiredLink", + "value": "Expired Link" + }, + "ExportTheme": { + "key": "ExportTheme", + "value": "Export" + }, + "Exposure": { + "key": "Exposure", + "value": "Exposure" + }, + "ExternalFolderInfo": { + "key": "ExternalFolderInfo", + "value": "Browse your external storage" + }, + "ExternalStorage": { + "key": "ExternalStorage", + "value": "External Storage" + }, + "Fade": { + "key": "Fade", + "value": "Fade" + }, + "FakeMessage": { + "key": "FakeMessage", + "value": "FAKE" + }, + "FavoriteStickers": { + "key": "FavoriteStickers", + "value": "Favorites" + }, + "FeaturedGifs": { + "key": "FeaturedGifs", + "value": "Trending GIFs" + }, + "FeaturedStickers": { + "key": "FeaturedStickers", + "value": "Trending Stickers" + }, + "FeaturedStickersInfo": { + "key": "FeaturedStickersInfo", + "value": "These stickers are currently trending on Telegram. You can add custom stickers via the @stickers bot." + }, + "February": { + "key": "February", + "value": "February" + }, + "FileSavedHint": { + "key": "FileSavedHint", + "value": "File saved to downloads" + }, + "FileUploadLimit": { + "key": "FileUploadLimit", + "value": "File size shouldn't be greater than %1$s" + }, + "Files": { + "key": "Files", + "zeroValue": null, + "oneValue": "%1$d file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d files" + }, + "FilesDataUsage": { + "key": "FilesDataUsage", + "value": "Files" + }, + "FilesSavedHint": { + "key": "FilesSavedHint", + "zeroValue": null, + "oneValue": "File saved to downloads", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d files saved to downloads" + }, + "FilterAddChats": { + "key": "FilterAddChats", + "value": "Add Chats" + }, + "FilterAddException": { + "key": "FilterAddException", + "value": "Add Exception" + }, + "FilterAddTo": { + "key": "FilterAddTo", + "value": "Add to folder" + }, + "FilterAddToAlertFullText": { + "key": "FilterAddToAlertFullText", + "value": "Sorry, you can't exclude more than 100 chats from a folder." + }, + "FilterAddToAlertFullTitle": { + "key": "FilterAddToAlertFullTitle", + "value": "Limit reached" + }, + "FilterAddingChats": { + "key": "FilterAddingChats", + "value": "Adding chats" + }, + "FilterAddingChatsInfo": { + "key": "FilterAddingChatsInfo", + "value": "Please wait a few moments while we fill this folder for you..." + }, + "FilterAllChats": { + "key": "FilterAllChats", + "value": "All Chats" + }, + "FilterAllChatsShort": { + "key": "FilterAllChatsShort", + "value": "All" + }, + "FilterAlwaysShow": { + "key": "FilterAlwaysShow", + "value": "Include Chats" + }, + "FilterArchived": { + "key": "FilterArchived", + "value": "Archived" + }, + "FilterAvailableText": { + "key": "FilterAvailableText", + "value": "Open *Settings > Folders* to organize your chats into folders." + }, + "FilterAvailableTitle": { + "key": "FilterAvailableTitle", + "value": "Chat folders" + }, + "FilterBots": { + "key": "FilterBots", + "value": "Bots" + }, + "FilterChannels": { + "key": "FilterChannels", + "value": "Channels" + }, + "FilterChatAddedToExisting": { + "key": "FilterChatAddedToExisting", + "value": "**%1$s** added to **%2$s**" + }, + "FilterChatRemovedFrom": { + "key": "FilterChatRemovedFrom", + "value": "**%1$s** removed from **%2$s**" + }, + "FilterChatTypes": { + "key": "FilterChatTypes", + "value": "Chat types" + }, + "FilterChats": { + "key": "FilterChats", + "value": "Chats" + }, + "FilterChatsAddedToExisting": { + "key": "FilterChatsAddedToExisting", + "value": "**%1$s** added to **%2$s**" + }, + "FilterChatsRemovedFrom": { + "key": "FilterChatsRemovedFrom", + "value": "**%1$s** removed from **%2$s**" + }, + "FilterChoose": { + "key": "FilterChoose", + "value": "Choose a folder" + }, + "FilterContact": { + "key": "FilterContact", + "value": "Contact" + }, + "FilterContacts": { + "key": "FilterContacts", + "value": "Contacts" + }, + "FilterDelete": { + "key": "FilterDelete", + "value": "Remove Folder" + }, + "FilterDeleteAlert": { + "key": "FilterDeleteAlert", + "value": "Are you sure you want to remove this folder? Your chats will not be deleted." + }, + "FilterDeleteItem": { + "key": "FilterDeleteItem", + "value": "Delete" + }, + "FilterDiscardAlert": { + "key": "FilterDiscardAlert", + "value": "You have edited this folder. Apply changes?" + }, + "FilterDiscardNewAlert": { + "key": "FilterDiscardNewAlert", + "value": "You have not finished creating the folder yet. Create now?" + }, + "FilterDiscardNewSave": { + "key": "FilterDiscardNewSave", + "value": "Create" + }, + "FilterDiscardNewTitle": { + "key": "FilterDiscardNewTitle", + "value": "Create Folder?" + }, + "FilterDiscardTitle": { + "key": "FilterDiscardTitle", + "value": "Apply Changes?" + }, + "FilterEdit": { + "key": "FilterEdit", + "value": "Edit folder" + }, + "FilterEditAll": { + "key": "FilterEditAll", + "value": "Edit folders" + }, + "FilterEditItem": { + "key": "FilterEditItem", + "value": "Edit" + }, + "FilterExclude": { + "key": "FilterExclude", + "value": "Excluded Chats" + }, + "FilterExcludeArchived": { + "key": "FilterExcludeArchived", + "value": "Exclude Archived" + }, + "FilterExcludeInfo": { + "key": "FilterExcludeInfo", + "value": "Choose chats and types of chats that will not appear in this folder." + }, + "FilterExcludeMuted": { + "key": "FilterExcludeMuted", + "value": "Exclude Muted" + }, + "FilterExcludeRead": { + "key": "FilterExcludeRead", + "value": "Exclude Read" + }, + "FilterGroups": { + "key": "FilterGroups", + "value": "Groups" + }, + "FilterInclude": { + "key": "FilterInclude", + "value": "Included Chats" + }, + "FilterIncludeInfo": { + "key": "FilterIncludeInfo", + "value": "Choose chats and types of chats that will appear in this folder." + }, + "FilterMuted": { + "key": "FilterMuted", + "value": "Muted" + }, + "FilterNameHint": { + "key": "FilterNameHint", + "value": "Folder name" + }, + "FilterNameNonMuted": { + "key": "FilterNameNonMuted", + "value": "Not Muted" + }, + "FilterNameUnread": { + "key": "FilterNameUnread", + "value": "Unread" + }, + "FilterNeverShow": { + "key": "FilterNeverShow", + "value": "Exclude Chats" + }, + "FilterNew": { + "key": "FilterNew", + "value": "New Folder" + }, + "FilterNoChats": { + "key": "FilterNoChats", + "value": "No Chats" + }, + "FilterNoChatsToDisplay": { + "key": "FilterNoChatsToDisplay", + "value": "Folder is empty" + }, + "FilterNoChatsToDisplayInfo": { + "key": "FilterNoChatsToDisplayInfo", + "value": "No chats currently belong to this folder." + }, + "FilterNonContact": { + "key": "FilterNonContact", + "value": "Non-Contact" + }, + "FilterNonContacts": { + "key": "FilterNonContacts", + "value": "Non Contacts" + }, + "FilterRead": { + "key": "FilterRead", + "value": "Read" + }, + "FilterRecommended": { + "key": "FilterRecommended", + "value": "Recommended Folders" + }, + "FilterRemoveChats": { + "key": "FilterRemoveChats", + "value": "Remove Chats" + }, + "FilterRemoveExclusionChatText": { + "key": "FilterRemoveExclusionChatText", + "value": "Are you sure you want to remove \"%1$s\" from the always excluded list?" + }, + "FilterRemoveExclusionText": { + "key": "FilterRemoveExclusionText", + "value": "Are you sure you want to remove \"%1$s\" from the always excluded list?" + }, + "FilterRemoveExclusionTitle": { + "key": "FilterRemoveExclusionTitle", + "value": "Remove exception" + }, + "FilterRemoveExclusionUserText": { + "key": "FilterRemoveExclusionUserText", + "value": "Are you sure you want to remove \"%1$s\" from the always excluded list?" + }, + "FilterRemoveFrom": { + "key": "FilterRemoveFrom", + "value": "Remove from folder" + }, + "FilterRemoveFromAlertFullText": { + "key": "FilterRemoveFromAlertFullText", + "value": "Sorry, you can't add more than 100 chats to a folder." + }, + "FilterRemoveInclusionChatText": { + "key": "FilterRemoveInclusionChatText", + "value": "Are you sure you want to remove \"%1$s\" from the always included list?" + }, + "FilterRemoveInclusionText": { + "key": "FilterRemoveInclusionText", + "value": "Are you sure you want to remove \"%1$s\" from the always included list?" + }, + "FilterRemoveInclusionTitle": { + "key": "FilterRemoveInclusionTitle", + "value": "Remove exception" + }, + "FilterRemoveInclusionUserText": { + "key": "FilterRemoveInclusionUserText", + "value": "Are you sure you want to remove \"%1$s\" from the always included list?" + }, + "FilterReorder": { + "key": "FilterReorder", + "value": "Reorder" + }, + "FilterSecretChats": { + "key": "FilterSecretChats", + "value": "Secret Chats" + }, + "FilterShowMoreChats": { + "key": "FilterShowMoreChats", + "zeroValue": null, + "oneValue": "Show %1$d More Chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %1$d More Chats" + }, + "FilterUnread": { + "key": "FilterUnread", + "value": "Unread" + }, + "FilterUserAddedToExisting": { + "key": "FilterUserAddedToExisting", + "value": "**%1$s** added to **%2$s**" + }, + "FilterUserRemovedFrom": { + "key": "FilterUserRemovedFrom", + "value": "**%1$s** removed from **%2$s**" + }, + "Filters": { + "key": "Filters", + "value": "Folders" + }, + "FiltersSetup": { + "key": "FiltersSetup", + "value": "Setup" + }, + "FiltersSetupPinAlert": { + "key": "FiltersSetupPinAlert", + "value": "Set Up Folders" + }, + "FinalResults": { + "key": "FinalResults", + "value": "Final Results" + }, + "FingerprintHelp": { + "key": "FingerprintHelp", + "value": "Touch sensor" + }, + "FingerprintInfo": { + "key": "FingerprintInfo", + "value": "Confirm fingerprint to continue" + }, + "FingerprintNotRecognized": { + "key": "FingerprintNotRecognized", + "value": "Fingerprint not recognized. Try again." + }, + "FirstName": { + "key": "FirstName", + "value": "First name (required)" + }, + "FloodWait": { + "key": "FloodWait", + "value": "Too many attempts, please try again later." + }, + "FloodWaitTime": { + "key": "FloodWaitTime", + "value": "Too many attempts, please try again in %1$s" + }, + "Folder": { + "key": "Folder", + "value": "Folder" + }, + "FollowersChartTitle": { + "key": "FollowersChartTitle", + "value": "Followers" + }, + "FontSize": { + "key": "FontSize", + "value": "Font Size" + }, + "FontSizePreviewLine1": { + "key": "FontSizePreviewLine1", + "value": "Do you know what time it is?" + }, + "FontSizePreviewLine2": { + "key": "FontSizePreviewLine2", + "value": "It's morning in Tokyo 😎" + }, + "FontSizePreviewName": { + "key": "FontSizePreviewName", + "value": "Bob Harris" + }, + "FontSizePreviewReply": { + "key": "FontSizePreviewReply", + "value": "Good morning! 👋" + }, + "FontType": { + "key": "FontType", + "value": "Font Type" + }, + "FootsAway": { + "key": "FootsAway", + "value": "%1$s ft away" + }, + "FootsFromYou": { + "key": "FootsFromYou", + "value": "%1$s ft from you" + }, + "FootsShort": { + "key": "FootsShort", + "value": "%1$s ft" + }, + "ForgotPassword": { + "key": "ForgotPassword", + "value": "Forgot password?" + }, + "Forward": { + "key": "Forward", + "value": "Forward" + }, + "ForwardTo": { + "key": "ForwardTo", + "value": "Forward to..." + }, + "ForwardedAudio": { + "key": "ForwardedAudio", + "zeroValue": null, + "oneValue": "Forwarded voice message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded voice messages" + }, + "ForwardedContact": { + "key": "ForwardedContact", + "zeroValue": null, + "oneValue": "Forwarded contact", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded contacts" + }, + "ForwardedFile": { + "key": "ForwardedFile", + "zeroValue": null, + "oneValue": "Forwarded file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded files" + }, + "ForwardedLocation": { + "key": "ForwardedLocation", + "zeroValue": null, + "oneValue": "Forwarded location", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded locations" + }, + "ForwardedMessage": { + "key": "ForwardedMessage", + "value": "Forwarded message" + }, + "ForwardedMessageCount": { + "key": "ForwardedMessageCount", + "zeroValue": null, + "oneValue": "Forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded messages" + }, + "ForwardedMusic": { + "key": "ForwardedMusic", + "zeroValue": null, + "oneValue": "Forwarded audio file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded audio files" + }, + "ForwardedPhoto": { + "key": "ForwardedPhoto", + "zeroValue": null, + "oneValue": "Forwarded photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded photos" + }, + "ForwardedPoll": { + "key": "ForwardedPoll", + "zeroValue": null, + "oneValue": "Forwarded poll", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded polls" + }, + "ForwardedRound": { + "key": "ForwardedRound", + "zeroValue": null, + "oneValue": "Forwarded video message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded video messages" + }, + "ForwardedSticker": { + "key": "ForwardedSticker", + "zeroValue": null, + "oneValue": "Forwarded sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded stickers" + }, + "ForwardedVideo": { + "key": "ForwardedVideo", + "zeroValue": null, + "oneValue": "Forwarded video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d forwarded videos" + }, + "FreeOfTotal": { + "key": "FreeOfTotal", + "value": "Free %1$s of %2$s" + }, + "From": { + "key": "From", + "value": "From" + }, + "FromCamera": { + "key": "FromCamera", + "value": "From camera" + }, + "FromChats": { + "key": "FromChats", + "zeroValue": null, + "oneValue": "from %1$d chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "from %1$d chats" + }, + "FromFormatted": { + "key": "FromFormatted", + "value": "From %1$s" + }, + "FromGalley": { + "key": "FromGalley", + "value": "From Gallery" + }, + "FromYou": { + "key": "FromYou", + "value": "You" + }, + "FwdMessageToChats": { + "key": "FwdMessageToChats", + "value": "Message forwarded to **%1$s**." + }, + "FwdMessageToGroup": { + "key": "FwdMessageToGroup", + "value": "Message forwarded to **%1$s**." + }, + "FwdMessageToSavedMessages": { + "key": "FwdMessageToSavedMessages", + "value": "Message forwarded to **Saved Messages**." + }, + "FwdMessageToUser": { + "key": "FwdMessageToUser", + "value": "Message forwarded to **%1$s**." + }, + "FwdMessagesToChats": { + "key": "FwdMessagesToChats", + "value": "Messages forwarded to **%1$s**." + }, + "FwdMessagesToGroup": { + "key": "FwdMessagesToGroup", + "value": "Messages forwarded to **%1$s**." + }, + "FwdMessagesToSavedMessages": { + "key": "FwdMessagesToSavedMessages", + "value": "Messages forwarded to **Saved Messages**." + }, + "FwdMessagesToUser": { + "key": "FwdMessagesToUser", + "value": "Messages forwarded to **%1$s**." + }, + "GIFs": { + "key": "GIFs", + "zeroValue": null, + "oneValue": "%1$d GIF", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d GIFs" + }, + "Gallery": { + "key": "Gallery", + "value": "Gallery" + }, + "GalleryInfo": { + "key": "GalleryInfo", + "value": "To send images without compression" + }, + "GalleryPermissionText": { + "key": "GalleryPermissionText", + "value": "Tap to allow access to your Gallery" + }, + "General": { + "key": "General", + "value": "General" + }, + "GetQRCode": { + "key": "GetQRCode", + "value": "Get QR code" + }, + "GettingLinkInfo": { + "key": "GettingLinkInfo", + "value": "Getting Link Info..." + }, + "GifCaption": { + "key": "GifCaption", + "value": "GIF Caption" + }, + "GifSavedToDownloadsHint": { + "key": "GifSavedToDownloadsHint", + "value": "GIF saved to downloads" + }, + "GifsTab": { + "key": "GifsTab", + "value": "GIFS" + }, + "GifsTab2": { + "key": "GifsTab2", + "value": "GIFs" + }, + "GigagroupAlertLearnMore": { + "key": "GigagroupAlertLearnMore", + "value": "LEARN MORE" + }, + "GigagroupAlertText": { + "key": "GigagroupAlertText", + "value": "Your group has reached the limit of **200,000** members.\n\nYou can increase this limit by converting the group to a **broadcast group** where only admins can post.\nInterested?" + }, + "GigagroupAlertTitle": { + "key": "GigagroupAlertTitle", + "value": "Limit reached" + }, + "GigagroupConvertAlertConver": { + "key": "GigagroupConvertAlertConver", + "value": "CONVERT" + }, + "GigagroupConvertAlertText": { + "key": "GigagroupConvertAlertText", + "value": "Regular members of the group (non-admins) will **irrevocably** lose their right to post messages in the group.\n\nThis action **can't** be undone." + }, + "GigagroupConvertAlertTitle": { + "key": "GigagroupConvertAlertTitle", + "value": "Are you sure?" + }, + "GigagroupConvertCancelButton": { + "key": "GigagroupConvertCancelButton", + "value": "Leave as regular group" + }, + "GigagroupConvertCancelHint": { + "key": "GigagroupConvertCancelHint", + "value": "If you change your mind, go to your group's Settings > Permissions." + }, + "GigagroupConvertInfo1": { + "key": "GigagroupConvertInfo1", + "value": "No limit on the number of members." + }, + "GigagroupConvertInfo2": { + "key": "GigagroupConvertInfo2", + "value": "Only admins can send messages." + }, + "GigagroupConvertInfo3": { + "key": "GigagroupConvertInfo3", + "value": "Can't be turned back into a regular group." + }, + "GigagroupConvertProcessButton": { + "key": "GigagroupConvertProcessButton", + "value": "Convert to Broadcast Group" + }, + "GigagroupConvertTitle": { + "key": "GigagroupConvertTitle", + "value": "Broadcast Groups" + }, + "GlobalAttachGifRestricted": { + "key": "GlobalAttachGifRestricted", + "value": "GIFs aren't allowed in this group." + }, + "GlobalAttachInlineRestricted": { + "key": "GlobalAttachInlineRestricted", + "value": "Inline bots aren't allowed in this group." + }, + "GlobalAttachMediaRestricted": { + "key": "GlobalAttachMediaRestricted", + "value": "Sending media isn't allowed in this group." + }, + "GlobalAttachStickersRestricted": { + "key": "GlobalAttachStickersRestricted", + "value": "Stickers aren't allowed in this group." + }, + "GlobalSearch": { + "key": "GlobalSearch", + "value": "Global search" + }, + "GlobalSendMessageRestricted": { + "key": "GlobalSendMessageRestricted", + "value": "Writing messages isn't allowed in this group." + }, + "GoToSettings": { + "key": "GoToSettings", + "value": "GO TO SETTINGS" + }, + "GotAQuestion": { + "key": "GotAQuestion", + "value": "Got a question\nabout Telegram?" + }, + "GpsDisabledAlert": { + "key": "GpsDisabledAlert", + "value": "Your GPS seems to be disabled, please enable it to access location-based features." + }, + "GpsDisabledAlertText": { + "key": "GpsDisabledAlertText", + "value": "Please enable your GPS to access location-based features." + }, + "GpsDisabledAlertTitle": { + "key": "GpsDisabledAlertTitle", + "value": "Enable GPS" + }, + "Grain": { + "key": "Grain", + "value": "Grain" + }, + "Gray": { + "key": "Gray", + "value": "Gray" + }, + "Green": { + "key": "Green", + "value": "Green" + }, + "GroupAddMembers": { + "key": "GroupAddMembers", + "value": "Add Members" + }, + "GroupContacts": { + "key": "GroupContacts", + "value": "Contacts in this group" + }, + "GroupDeletedUndo": { + "key": "GroupDeletedUndo", + "value": "Group deleted." + }, + "GroupDescription1": { + "key": "GroupDescription1", + "value": "Up to 200,000 members" + }, + "GroupDescription2": { + "key": "GroupDescription2", + "value": "Persistent chat history" + }, + "GroupDescription3": { + "key": "GroupDescription3", + "value": "Public links such as t.me/title" + }, + "GroupDescription4": { + "key": "GroupDescription4", + "value": "Admins with different rights" + }, + "GroupEmptyTitle1": { + "key": "GroupEmptyTitle1", + "value": "You have created a **group**." + }, + "GroupEmptyTitle2": { + "key": "GroupEmptyTitle2", + "value": "Groups can have:" + }, + "GroupMembers": { + "key": "GroupMembers", + "value": "Members" + }, + "GroupMembersChartTitle": { + "key": "GroupMembersChartTitle", + "value": "Group members" + }, + "GroupName": { + "key": "GroupName", + "value": "Group name" + }, + "GroupNotifications": { + "key": "GroupNotifications", + "value": "Group notifications" + }, + "GroupPhotosHelp": { + "key": "GroupPhotosHelp", + "value": "Group media into one message" + }, + "GroupSettingsChangedAlert": { + "key": "GroupSettingsChangedAlert", + "value": "You have changed some settings in this group. Apply changes?" + }, + "GroupSettingsTitle": { + "key": "GroupSettingsTitle", + "value": "Group Settings" + }, + "GroupStickers": { + "key": "GroupStickers", + "value": "Group Stickers" + }, + "GroupStickersInfo": { + "key": "GroupStickersInfo", + "value": "You can choose a sticker set that will be available to all group members when they are chatting in this group." + }, + "GroupType": { + "key": "GroupType", + "value": "Group Type" + }, + "GroupTypeHeader": { + "key": "GroupTypeHeader", + "value": "Group type" + }, + "GroupUserAddLimit": { + "key": "GroupUserAddLimit", + "value": "Sorry, this group is full." + }, + "GroupUserCantAdd": { + "key": "GroupUserCantAdd", + "value": "Sorry, you can't add this user to groups." + }, + "GroupUserCantAdmin": { + "key": "GroupUserCantAdmin", + "value": "Sorry, too many administrators in this group." + }, + "GroupUserCantBot": { + "key": "GroupUserCantBot", + "value": "Sorry, too many bots in this group." + }, + "GroupUserLeftError": { + "key": "GroupUserLeftError", + "value": "Sorry, if a person is no longer part of a group, you need to be in their Telegram contacts to add them back.\n\nNote that they can still join via the group's invite link as long as they are not in the Removed Users list." + }, + "Groups": { + "key": "Groups", + "zeroValue": null, + "oneValue": "%1$d group", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d groups" + }, + "GroupsAndChannels": { + "key": "GroupsAndChannels", + "value": "Groups" + }, + "GroupsAndChannelsHelp": { + "key": "GroupsAndChannelsHelp", + "value": "Change who can add you to groups and channels." + }, + "GroupsInCommon": { + "key": "GroupsInCommon", + "value": "Groups in Common" + }, + "GroupsInCommonTitle": { + "key": "GroupsInCommonTitle", + "value": "Groups in common" + }, + "GrowthChartTitle": { + "key": "GrowthChartTitle", + "value": "Growth" + }, + "HashtagCopied": { + "key": "HashtagCopied", + "value": "Hashtag copied to clipboard." + }, + "Hashtags": { + "key": "Hashtags", + "value": "HASHTAGS" + }, + "HidAccount": { + "key": "HidAccount", + "value": "The account was hidden by the user" + }, + "HiddenName": { + "key": "HiddenName", + "value": "Deleted Account" + }, + "HideAboveTheList": { + "key": "HideAboveTheList", + "value": "Hide above the list" + }, + "HideNewChatsAlertText": { + "key": "HideNewChatsAlertText", + "value": "You are receiving many new chats from users who are not in your Contacts List. Do you want have such chats **automatically muted** and **archived**?" + }, + "HideNewChatsAlertTitle": { + "key": "HideNewChatsAlertTitle", + "value": "Hide new chats?" + }, + "HideOnTop": { + "key": "HideOnTop", + "value": "Hide" + }, + "HidePinnedMessages": { + "key": "HidePinnedMessages", + "value": "HIDE PINNED MESSAGES" + }, + "Highlights": { + "key": "Highlights", + "value": "Highlights" + }, + "HintRead": { + "key": "HintRead", + "value": "Read" + }, + "HintSent": { + "key": "HintSent", + "value": "Delivered" + }, + "HistoryCleared": { + "key": "HistoryCleared", + "value": "History was cleared" + }, + "HistoryClearedUndo": { + "key": "HistoryClearedUndo", + "value": "History cleared." + }, + "HoldToAudio": { + "key": "HoldToAudio", + "value": "Hold to record audio. Tap to switch to video." + }, + "HoldToAudioOnly": { + "key": "HoldToAudioOnly", + "value": "Hold to record audio." + }, + "HoldToVideo": { + "key": "HoldToVideo", + "value": "Hold to record video. Tap to switch to audio." + }, + "Hours": { + "key": "Hours", + "zeroValue": null, + "oneValue": "%1$d hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d hours" + }, + "HoursBold": { + "key": "HoursBold", + "zeroValue": null, + "oneValue": "**%1$d** hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "**%1$d** hours" + }, + "Hybrid": { + "key": "Hybrid", + "value": "Hybrid" + }, + "IVInteractionsChartTitle": { + "key": "IVInteractionsChartTitle", + "value": "IV Interactions" + }, + "ImagesTab": { + "key": "ImagesTab", + "value": "IMAGES" + }, + "ImagesTab2": { + "key": "ImagesTab2", + "value": "Images" + }, + "ImporImportingService": { + "key": "ImporImportingService", + "value": "Importing messages and media..." + }, + "Import": { + "key": "Import", + "value": "IMPORT" + }, + "ImportContacts": { + "key": "ImportContacts", + "value": "Import Contacts" + }, + "ImportCount": { + "key": "ImportCount", + "value": "%1$s of %2$s" + }, + "ImportDone": { + "key": "ImportDone", + "value": "Done" + }, + "ImportDoneInfo": { + "key": "ImportDoneInfo", + "value": "Save space on your device by importing more chats to Telegram." + }, + "ImportDoneTitle": { + "key": "ImportDoneTitle", + "value": "Chat imported successfully!" + }, + "ImportErrorChatInvalidGroup": { + "key": "ImportErrorChatInvalidGroup", + "value": "The file format is for a user, but you selected a group." + }, + "ImportErrorChatInvalidUser": { + "key": "ImportErrorChatInvalidUser", + "value": "The file format is for a group, but you selected a user." + }, + "ImportErrorFileFormatInvalid": { + "key": "ImportErrorFileFormatInvalid", + "value": "Invalid file format." + }, + "ImportErrorFileLang": { + "key": "ImportErrorFileLang", + "value": "Unknown file language." + }, + "ImportErrorNotAdmin": { + "key": "ImportErrorNotAdmin", + "value": "You must be an admin in the group to import messages." + }, + "ImportErrorPeerInvalid": { + "key": "ImportErrorPeerInvalid", + "value": "Unable to import history to selected chat." + }, + "ImportErrorTitle": { + "key": "ImportErrorTitle", + "value": "Import Error" + }, + "ImportErrorUserBlocked": { + "key": "ImportErrorUserBlocked", + "value": "Unable to import messages due to privacy settings." + }, + "ImportFailedToUpload": { + "key": "ImportFailedToUpload", + "value": "Failed to upload file." + }, + "ImportFileTooLarge": { + "key": "ImportFileTooLarge", + "value": "File is too large for import." + }, + "ImportHeader": { + "key": "ImportHeader", + "value": "Import messages and media to..." + }, + "ImportHeaderContacts": { + "key": "ImportHeaderContacts", + "value": "Or choose one of your contacts" + }, + "ImportImportingInfo": { + "key": "ImportImportingInfo", + "value": "Please keep Telegram open\nuntil the import is completed." + }, + "ImportImportingTitle": { + "key": "ImportImportingTitle", + "value": "Importing chat" + }, + "ImportMessages": { + "key": "ImportMessages", + "value": "Import Messages" + }, + "ImportMutualError": { + "key": "ImportMutualError", + "value": "You can only import messages into private chats with users with whom you are mutual contacts." + }, + "ImportNotAdmin": { + "key": "ImportNotAdmin", + "value": "You must be an admin in the group to import messages." + }, + "ImportToChat": { + "key": "ImportToChat", + "value": "Do you want to import messages from **%1$s** to the group **%2$s**?\n\nMessages will be imported into the current day but will also include their original timestamps. All members will see the messages." + }, + "ImportToChatNoTitle": { + "key": "ImportToChatNoTitle", + "value": "Do you want to import messages to the group **%1$s**?\n\nMessages will be imported into the current day but will also include their original timestamps. All members will see the messages." + }, + "ImportToUser": { + "key": "ImportToUser", + "value": "Do you want to import messages from **%1$s** to the chat with **%2$s**?\n\nMessages will be imported into the current day but will also include their original timestamps. Both sides will see the messages." + }, + "ImportToUserNoTitle": { + "key": "ImportToUserNoTitle", + "value": "Do you want to import messages to the chat with **%1$s**?\n\nMessages will be imported into the current day but will also include their original timestamps. Both sides will see the messages." + }, + "ImportUploading": { + "key": "ImportUploading", + "value": "Importing messages and media... **%d%%**" + }, + "ImportedInfo": { + "key": "ImportedInfo", + "value": "This message was imported from another app. We can't guarantee it's real." + }, + "ImportedMessage": { + "key": "ImportedMessage", + "value": "Imported" + }, + "InAppNotifications": { + "key": "InAppNotifications", + "value": "In-app notifications" + }, + "InAppPreview": { + "key": "InAppPreview", + "value": "In-App Preview" + }, + "InAppSounds": { + "key": "InAppSounds", + "value": "In-App Sounds" + }, + "InAppVibrate": { + "key": "InAppVibrate", + "value": "In-App Vibrate" + }, + "InChatSound": { + "key": "InChatSound", + "value": "In-Chat Sounds" + }, + "InactiveChannelSignature": { + "key": "InactiveChannelSignature", + "value": "channel, inactive for %1$s" + }, + "InactiveChatSignature": { + "key": "InactiveChatSignature", + "value": "%1$s, inactive for %2$s" + }, + "InactiveChats": { + "key": "InactiveChats", + "value": "Inactive chats" + }, + "IncomingCalls": { + "key": "IncomingCalls", + "value": "Incoming calls" + }, + "IncorrectLocalization": { + "key": "IncorrectLocalization", + "value": "Incorrect localization file" + }, + "IncorrectTheme": { + "key": "IncorrectTheme", + "value": "Incorrect theme file" + }, + "Info": { + "key": "Info", + "value": "Info" + }, + "InstallGoogleMaps": { + "key": "InstallGoogleMaps", + "value": "Install Google Maps?" + }, + "InstantView": { + "key": "InstantView", + "value": "INSTANT VIEW" + }, + "InstantViewNightMode": { + "key": "InstantViewNightMode", + "value": "The dark theme will turn automatically during night time" + }, + "InstantViewReference": { + "key": "InstantViewReference", + "value": "Reference" + }, + "InteractionsChartTitle": { + "key": "InteractionsChartTitle", + "value": "Interactions" + }, + "InternalFolderInfo": { + "key": "InternalFolderInfo", + "value": "Browse your file system" + }, + "InternalStorage": { + "key": "InternalStorage", + "value": "Internal Storage" + }, + "InvalidCode": { + "key": "InvalidCode", + "value": "Invalid code, please try again." + }, + "InvalidFirstName": { + "key": "InvalidFirstName", + "value": "Invalid first name" + }, + "InvalidLastName": { + "key": "InvalidLastName", + "value": "Sorry, this last name can't be used" + }, + "InvalidPhoneNumber": { + "key": "InvalidPhoneNumber", + "value": "Invalid phone number. Please check the number and try again." + }, + "Invisible": { + "key": "Invisible", + "value": "invisible" + }, + "Invitations": { + "key": "Invitations", + "zeroValue": null, + "oneValue": "%1$d invitation", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d invitations" + }, + "Invite": { + "key": "Invite", + "value": "Invite" + }, + "InviteByQRCode": { + "key": "InviteByQRCode", + "value": "Invite by QR Code" + }, + "InviteExpired": { + "key": "InviteExpired", + "value": "This invite link has expired." + }, + "InviteFriends": { + "key": "InviteFriends", + "value": "Invite Friends" + }, + "InviteFriendsHelp": { + "key": "InviteFriendsHelp", + "value": "Select contacts to invite them to Telegram" + }, + "InviteLink": { + "key": "InviteLink", + "value": "Invite Link" + }, + "InviteLinkCount": { + "key": "InviteLinkCount", + "zeroValue": null, + "oneValue": "%1$d invite link", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d invite links" + }, + "InviteLinks": { + "key": "InviteLinks", + "value": "Invite Links" + }, + "InviteRevokedHint": { + "key": "InviteRevokedHint", + "value": "The invite link has been revoked." + }, + "InviteText2": { + "key": "InviteText2", + "value": "Hey, I'm using Telegram to chat. Join me! Download it here: %1$s" + }, + "InviteTextNum": { + "key": "InviteTextNum", + "zeroValue": null, + "oneValue": "Hey, I'm using Telegram to chat – and so are %1$d of our other contact. Join us! Download it here: %2$s", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Hey, I'm using Telegram to chat – and so are %1$d of our other contacts. Join us! Download it here: %2$s" + }, + "InviteToChannelError": { + "key": "InviteToChannelError", + "value": "Sorry, you can't add this user to channels because of user's privacy settings." + }, + "InviteToGroupByLink": { + "key": "InviteToGroupByLink", + "value": "Invite to Group via Link" + }, + "InviteToGroupError": { + "key": "InviteToGroupError", + "value": "Sorry, you can't add this user to groups because of user's privacy settings." + }, + "InviteToTelegram": { + "key": "InviteToTelegram", + "value": "INVITE TO TELEGRAM" + }, + "InviteUser": { + "key": "InviteUser", + "value": "This user does not have Telegram yet, send an invitation?" + }, + "Invited": { + "key": "Invited", + "value": "invited" + }, + "IsRecordingAudio": { + "key": "IsRecordingAudio", + "value": "%1$s is recording a voice message..." + }, + "IsRecordingRound": { + "key": "IsRecordingRound", + "value": "%1$s is recording a video message..." + }, + "IsSendingAudio": { + "key": "IsSendingAudio", + "value": "%1$s is sending audio..." + }, + "IsSendingFile": { + "key": "IsSendingFile", + "value": "%1$s is sending a file..." + }, + "IsSendingGame": { + "key": "IsSendingGame", + "value": "%1$s is playing a game..." + }, + "IsSendingPhoto": { + "key": "IsSendingPhoto", + "value": "%1$s is sending photo..." + }, + "IsSendingVideo": { + "key": "IsSendingVideo", + "value": "%1$s is sending video..." + }, + "IsTyping": { + "key": "IsTyping", + "value": "is typing..." + }, + "IsTypingGroup": { + "key": "IsTypingGroup", + "value": "%1$s is typing..." + }, + "Italic": { + "key": "Italic", + "value": "Italic" + }, + "January": { + "key": "January", + "value": "January" + }, + "JoinByPeekChannelText": { + "key": "JoinByPeekChannelText", + "value": "This channel is private. Please join it to continue viewing its content." + }, + "JoinByPeekChannelTitle": { + "key": "JoinByPeekChannelTitle", + "value": "Join Channel" + }, + "JoinByPeekGroupText": { + "key": "JoinByPeekGroupText", + "value": "This group is private. Please join it to continue viewing its content." + }, + "JoinByPeekGroupTitle": { + "key": "JoinByPeekGroupTitle", + "value": "Join Group" + }, + "JoinByPeekJoin": { + "key": "JoinByPeekJoin", + "value": "JOIN" + }, + "JoinGroup": { + "key": "JoinGroup", + "value": "JOIN GROUP" + }, + "JoinToGroupErrorFull": { + "key": "JoinToGroupErrorFull", + "value": "Sorry, this group is already full." + }, + "JoinToGroupErrorNotExist": { + "key": "JoinToGroupErrorNotExist", + "value": "Sorry, this chat does not seem to exist." + }, + "July": { + "key": "July", + "value": "July" + }, + "JumpToDate": { + "key": "JumpToDate", + "value": "Jump to Date" + }, + "June": { + "key": "June", + "value": "June" + }, + "KMetersAway": { + "key": "KMetersAway", + "value": "km away" + }, + "KMetersAway2": { + "key": "KMetersAway2", + "value": "%1$s km away" + }, + "KMetersFromYou2": { + "key": "KMetersFromYou2", + "value": "%1$s km from you" + }, + "KMetersShort": { + "key": "KMetersShort", + "value": "%1$s km" + }, + "KeepMedia": { + "key": "KeepMedia", + "value": "Keep Media" + }, + "KeepMediaForever": { + "key": "KeepMediaForever", + "value": "Forever" + }, + "KeepMediaInfo": { + "key": "KeepMediaInfo", + "value": "Photos, videos and other files from cloud chats that you have **not accessed** during this period will be removed from this device to save disk space.\n\nAll media will stay in the Telegram cloud and can be re-downloaded if you need it again." + }, + "KickFromBroadcast": { + "key": "KickFromBroadcast", + "value": "Remove from broadcast list" + }, + "KickFromGroup": { + "key": "KickFromGroup", + "value": "Remove from group" + }, + "KickFromSupergroup": { + "key": "KickFromSupergroup", + "value": "Restrict user" + }, + "Km": { + "key": "Km", + "value": "km" + }, + "Language": { + "key": "Language", + "value": "Language" + }, + "LanguageAlert": { + "key": "LanguageAlert", + "value": "You are about to apply a language pack (**%1$s**) that is %2$d%% complete.\n\nThis will translate the entire interface. You can suggest corrections via the [translation platform].\n\nYou can change your language back at any time in Settings." + }, + "LanguageCode": { + "key": "LanguageCode", + "value": "en" + }, + "LanguageCustom": { + "key": "LanguageCustom", + "value": "Custom" + }, + "LanguageCustomAlert": { + "key": "LanguageCustomAlert", + "value": "You are about to apply a custom language pack (**%1$s**) that is %2$d%% complete.\n\nThis will translate the entire interface. You can suggest corrections via the [translation platform].\n\nYou can change your language back at any time in Settings." + }, + "LanguageName": { + "key": "LanguageName", + "value": "English" + }, + "LanguageNameInEnglish": { + "key": "LanguageNameInEnglish", + "value": "English" + }, + "LanguageSame": { + "key": "LanguageSame", + "value": "You are already using this language pack (**%1$s**). You can change your language at any time in Settings." + }, + "LanguageSuggested": { + "key": "LanguageSuggested", + "value": "Install \"%1$s\" language?" + }, + "LanguageTitle": { + "key": "LanguageTitle", + "value": "Change language?" + }, + "LanguageUnknownCustomAlert": { + "key": "LanguageUnknownCustomAlert", + "value": "Unfortunately, this custom language pack (**%1$s**) doesn't contain data for Telegram Android." + }, + "LanguageUnknownTitle": { + "key": "LanguageUnknownTitle", + "value": "Insufficient data" + }, + "LanguageUnofficial": { + "key": "LanguageUnofficial", + "value": "Unofficial languages" + }, + "LanguageUnsupportedError": { + "key": "LanguageUnsupportedError", + "value": "There is no such language." + }, + "LanguagesChartTitle": { + "key": "LanguagesChartTitle", + "value": "Languages" + }, + "LargeEmoji": { + "key": "LargeEmoji", + "value": "Large Emoji" + }, + "LastName": { + "key": "LastName", + "value": "Last name (optional)" + }, + "LastSeen": { + "key": "LastSeen", + "value": "last seen" + }, + "LastSeenContacts": { + "key": "LastSeenContacts", + "value": "My Contacts" + }, + "LastSeenContactsMinus": { + "key": "LastSeenContactsMinus", + "value": "My Contacts (-%1$d)" + }, + "LastSeenContactsMinusPlus": { + "key": "LastSeenContactsMinusPlus", + "value": "My Contacts (-%1$d, +%2$d)" + }, + "LastSeenContactsPlus": { + "key": "LastSeenContactsPlus", + "value": "My Contacts (+%1$d)" + }, + "LastSeenDate": { + "key": "LastSeenDate", + "value": "last seen" + }, + "LastSeenDateFormatted": { + "key": "LastSeenDateFormatted", + "value": "last seen %1$s" + }, + "LastSeenEverybody": { + "key": "LastSeenEverybody", + "value": "Everybody" + }, + "LastSeenEverybodyMinus": { + "key": "LastSeenEverybodyMinus", + "value": "Everybody (-%1$d)" + }, + "LastSeenFormatted": { + "key": "LastSeenFormatted", + "value": "last seen %1$s" + }, + "LastSeenNobody": { + "key": "LastSeenNobody", + "value": "Nobody" + }, + "LastSeenNobodyPlus": { + "key": "LastSeenNobodyPlus", + "value": "Nobody (+%1$d)" + }, + "LastSeenTitle": { + "key": "LastSeenTitle", + "value": "Who can see your Last Seen time?" + }, + "Lately": { + "key": "Lately", + "value": "last seen recently" + }, + "Later": { + "key": "Later", + "value": "LATER" + }, + "LeaveAComment": { + "key": "LeaveAComment", + "value": "Leave a comment" + }, + "LeaveChannel": { + "key": "LeaveChannel", + "value": "Leave Channel" + }, + "LeaveChannelMenu": { + "key": "LeaveChannelMenu", + "value": "Leave channel" + }, + "LeaveChats": { + "key": "LeaveChats", + "value": "Leave %1$s" + }, + "LeaveMegaMenu": { + "key": "LeaveMegaMenu", + "value": "Leave group" + }, + "LedColor": { + "key": "LedColor", + "value": "LED Color" + }, + "LedDisabled": { + "key": "LedDisabled", + "value": "Disabled" + }, + "LimitByPeriod": { + "key": "LimitByPeriod", + "value": "Limit by time period" + }, + "LimitNumberOfUses": { + "key": "LimitNumberOfUses", + "value": "Limit number of uses" + }, + "LimitReached": { + "key": "LimitReached", + "value": "Limit Reached" + }, + "LinkActionCopy": { + "key": "LinkActionCopy", + "value": "Copy" + }, + "LinkActionShare": { + "key": "LinkActionShare", + "value": "Share" + }, + "LinkAvailable": { + "key": "LinkAvailable", + "value": "%1$s is available." + }, + "LinkChecking": { + "key": "LinkChecking", + "value": "Checking name…" + }, + "LinkCopied": { + "key": "LinkCopied", + "value": "Link copied to clipboard" + }, + "LinkCopiedPrivate": { + "key": "LinkCopiedPrivate", + "value": "Link copied to clipboard.\nThis link will only work for members of this chat." + }, + "LinkCopiedPrivateInfo": { + "key": "LinkCopiedPrivateInfo", + "value": "This link will only work for members of this chat." + }, + "LinkCreatedeBy": { + "key": "LinkCreatedeBy", + "value": "Link created by" + }, + "LinkExpiresIn": { + "key": "LinkExpiresIn", + "value": "The link expires %s" + }, + "LinkExpiresInTime": { + "key": "LinkExpiresInTime", + "value": "The link expires in %s" + }, + "LinkInUse": { + "key": "LinkInUse", + "value": "Sorry, this name is already taken." + }, + "LinkInfo": { + "key": "LinkInfo", + "value": "Anyone who has Telegram installed will be able to join your group by following this link." + }, + "LinkInfoChannel": { + "key": "LinkInfoChannel", + "value": "Anyone who has Telegram installed will be able to join your channel by following this link." + }, + "LinkInvalid": { + "key": "LinkInvalid", + "value": "Sorry, this name is invalid." + }, + "LinkInvalidLong": { + "key": "LinkInvalidLong", + "value": "The name must not exceed 32 characters." + }, + "LinkInvalidShort": { + "key": "LinkInvalidShort", + "value": "Channel names must have at least 5 characters." + }, + "LinkInvalidShortMega": { + "key": "LinkInvalidShortMega", + "value": "Group names must have at least 5 characters." + }, + "LinkInvalidStartNumber": { + "key": "LinkInvalidStartNumber", + "value": "Channel names can't start with a number." + }, + "LinkInvalidStartNumberMega": { + "key": "LinkInvalidStartNumberMega", + "value": "Group names can't start with a number." + }, + "LinkIsExpired": { + "key": "LinkIsExpired", + "value": "The time limit for this link has expired." + }, + "LinkIsExpiredLimitReached": { + "key": "LinkIsExpiredLimitReached", + "value": "This link reached its usage limit." + }, + "LinkIsNoActive": { + "key": "LinkIsNoActive", + "value": "This link is no longer active" + }, + "LinkLimitReached": { + "key": "LinkLimitReached", + "value": "Limit reached" + }, + "LinkNotFound": { + "key": "LinkNotFound", + "value": "Unfortunately, you can't access this message. You are not a member of the chat where it was posted." + }, + "LinkPreview": { + "key": "LinkPreview", + "value": "Link preview" + }, + "LinkedChannel": { + "key": "LinkedChannel", + "value": "Linked Channel" + }, + "Links": { + "key": "Links", + "zeroValue": null, + "oneValue": "%1$d link", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d links" + }, + "LinksCreatedByOtherAdmins": { + "key": "LinksCreatedByOtherAdmins", + "value": "Invite links created by other admins" + }, + "LinksCreatedByThisAdmin": { + "key": "LinksCreatedByThisAdmin", + "value": "Invite links created by this admin" + }, + "LinksTitle": { + "key": "LinksTitle", + "value": "Shared Links" + }, + "Listening": { + "key": "Listening", + "value": "listening" + }, + "LiveLocationAlertGroup": { + "key": "LiveLocationAlertGroup", + "value": "Choose for how long people in this chat will see your live location." + }, + "LiveLocationAlertPrivate": { + "key": "LiveLocationAlertPrivate", + "value": "Choose for how long %1$s will see your accurate location." + }, + "LiveLocationContext": { + "key": "LiveLocationContext", + "value": "Live Location" + }, + "LiveLocations": { + "key": "LiveLocations", + "value": "Live locations" + }, + "Loading": { + "key": "Loading", + "value": "Loading..." + }, + "LoadingFullImage": { + "key": "LoadingFullImage", + "value": "loading full image..." + }, + "LoadingStats": { + "key": "LoadingStats", + "value": "Loading stats..." + }, + "LoadingStatsDescription": { + "key": "LoadingStatsDescription", + "value": "Please wait a few moments while we are generating graphs." + }, + "LocalAudioCache": { + "key": "LocalAudioCache", + "value": "Voice & Video messages" + }, + "LocalCache": { + "key": "LocalCache", + "value": "Other files" + }, + "LocalDatabase": { + "key": "LocalDatabase", + "value": "Local Database" + }, + "LocalDatabaseClear": { + "key": "LocalDatabaseClear", + "value": "Clear cached text messages?" + }, + "LocalDatabaseClearText": { + "key": "LocalDatabaseClearText", + "value": "Are you sure you want to clear cached text messages?" + }, + "LocalDatabaseClearTextTitle": { + "key": "LocalDatabaseClearTextTitle", + "value": "Clear local database" + }, + "LocalDatabaseInfo": { + "key": "LocalDatabaseInfo", + "value": "Clearing the local database will delete the texts of cached messages and compress the database to save internal disk space. Telegram needs some data to work, so database size will not reach zero.\n\nThis operation can take a few minutes to complete." + }, + "LocalDatabaseSize": { + "key": "LocalDatabaseSize", + "value": "%s Telegram Local Database" + }, + "LocalDocumentCache": { + "key": "LocalDocumentCache", + "value": "Documents" + }, + "LocalGifCache": { + "key": "LocalGifCache", + "value": "GIFs" + }, + "LocalMusicCache": { + "key": "LocalMusicCache", + "value": "Music" + }, + "LocalPhotoCache": { + "key": "LocalPhotoCache", + "value": "Photos" + }, + "LocalVideoCache": { + "key": "LocalVideoCache", + "value": "Videos" + }, + "LocatedChannelsTooMuch": { + "key": "LocatedChannelsTooMuch", + "value": "Sorry, the target user owns too many location-based groups. Please ask them to delete or transfer an existing one first." + }, + "LocationNotifiation": { + "key": "LocationNotifiation", + "value": "Proximity alert" + }, + "LocationNotifiationButton": { + "key": "LocationNotifiationButton", + "value": "Notify me within %1$s" + }, + "LocationNotifiationButtonGroup": { + "key": "LocationNotifiationButtonGroup", + "value": "Notify when someone is within %1$s" + }, + "LocationNotifiationButtonUser": { + "key": "LocationNotifiationButtonUser", + "value": "Notify when %1$s is within %2$s" + }, + "LocationNotifiationCloser": { + "key": "LocationNotifiationCloser", + "value": "You are already closer than %1$s" + }, + "LocationUpdated": { + "key": "LocationUpdated", + "value": "updated" + }, + "LocationUpdatedFormatted": { + "key": "LocationUpdatedFormatted", + "value": "updated %1$s" + }, + "LocationUpdatedJustNow": { + "key": "LocationUpdatedJustNow", + "value": "updated just now" + }, + "LogOut": { + "key": "LogOut", + "value": "Log out" + }, + "LogOutInfo": { + "key": "LogOutInfo", + "value": "Logging out deactivates all Secret Chats." + }, + "LogOutTitle": { + "key": "LogOutTitle", + "value": "Log Out" + }, + "LoginAttempts": { + "key": "LoginAttempts", + "value": "Incomplete login attempts" + }, + "LoginAttemptsInfo": { + "key": "LoginAttemptsInfo", + "value": "The devices above have no access to your messages. The code was entered correctly, but no correct password was given." + }, + "LoginPassword": { + "key": "LoginPassword", + "value": "Password" + }, + "LoginPasswordText": { + "key": "LoginPasswordText", + "value": "You have Two-Step Verification enabled, so your account is protected with an additional password." + }, + "Long": { + "key": "Long", + "value": "Long" + }, + "LoopAnimatedStickers": { + "key": "LoopAnimatedStickers", + "value": "Loop Animated Stickers" + }, + "LoopAnimatedStickersInfo": { + "key": "LoopAnimatedStickersInfo", + "value": "Animated stickers will play continuously in chats." + }, + "LowDiskSpaceMessage": { + "key": "LowDiskSpaceMessage", + "value": "Your device is almost out of disk space. To free some space, you can set up Telegram to cache only recent media." + }, + "LowDiskSpaceNeverRemove": { + "key": "LowDiskSpaceNeverRemove", + "value": "Never remove" + }, + "LowDiskSpaceTitle": { + "key": "LowDiskSpaceTitle", + "value": "Attention" + }, + "LowDiskSpaceTitle2": { + "key": "LowDiskSpaceTitle2", + "value": "Remove media after" + }, + "MainChannelProfilePhotoSetHint": { + "key": "MainChannelProfilePhotoSetHint", + "value": "This is the main channel photo now." + }, + "MainChannelProfileVideoSetHint": { + "key": "MainChannelProfileVideoSetHint", + "value": "This is the main channel video now." + }, + "MainGroupProfilePhotoSetHint": { + "key": "MainGroupProfilePhotoSetHint", + "value": "This is the main group photo now." + }, + "MainGroupProfileVideoSetHint": { + "key": "MainGroupProfileVideoSetHint", + "value": "This is the main group video now." + }, + "MainProfilePhotoSetHint": { + "key": "MainProfilePhotoSetHint", + "value": "This is your main profile photo now." + }, + "MainProfileVideoSetHint": { + "key": "MainProfileVideoSetHint", + "value": "This is your main profile video now." + }, + "MakeAdmin": { + "key": "MakeAdmin", + "value": "MAKE ADMIN" + }, + "MakeMyselfVisible": { + "key": "MakeMyselfVisible", + "value": "Make Myself Visible" + }, + "MakeMyselfVisibleInfo": { + "key": "MakeMyselfVisibleInfo", + "value": "Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden." + }, + "MakeMyselfVisibleTitle": { + "key": "MakeMyselfVisibleTitle", + "value": "Show Your Profile?" + }, + "ManageChannel": { + "key": "ManageChannel", + "value": "Manage Channel" + }, + "ManageChannelMenu": { + "key": "ManageChannelMenu", + "value": "Manage channel" + }, + "ManageGroup": { + "key": "ManageGroup", + "value": "Manage Group" + }, + "ManageGroupMenu": { + "key": "ManageGroupMenu", + "value": "Manage group" + }, + "ManageInviteLinks": { + "key": "ManageInviteLinks", + "value": "Manage Invite Links" + }, + "ManageLinksInfoHelp": { + "key": "ManageLinksInfoHelp", + "value": "You can create additional invite links that have a limited time or number of uses" + }, + "Map": { + "key": "Map", + "value": "Map" + }, + "MapPreviewProvider": { + "key": "MapPreviewProvider", + "value": "Map Preview Provider" + }, + "MapPreviewProviderGoogle": { + "key": "MapPreviewProviderGoogle", + "value": "Google" + }, + "MapPreviewProviderNobody": { + "key": "MapPreviewProviderNobody", + "value": "No previews" + }, + "MapPreviewProviderTelegram": { + "key": "MapPreviewProviderTelegram", + "value": "Telegram" + }, + "MapPreviewProviderTitle": { + "key": "MapPreviewProviderTitle", + "value": "Map preview provider" + }, + "MapPreviewProviderYandex": { + "key": "MapPreviewProviderYandex", + "value": "Yandex" + }, + "March": { + "key": "March", + "value": "March" + }, + "MarkAllAsRead": { + "key": "MarkAllAsRead", + "value": "Mark all as read" + }, + "MarkAsRead": { + "key": "MarkAsRead", + "value": "Mark as read" + }, + "MarkAsUnread": { + "key": "MarkAsUnread", + "value": "Mark as unread" + }, + "Masks": { + "key": "Masks", + "value": "Masks" + }, + "MasksArchived": { + "key": "MasksArchived", + "value": "Masks archived." + }, + "MasksArchivedInfo": { + "key": "MasksArchivedInfo", + "value": "%1$s has been moved to your archive." + }, + "MasksCount": { + "key": "MasksCount", + "zeroValue": null, + "oneValue": "%1$d mask", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d masks" + }, + "MasksInfo": { + "key": "MasksInfo", + "value": "You can add masks to photos you send. To do this, open the photo editor before sending a photo." + }, + "MasksRemoved": { + "key": "MasksRemoved", + "value": "Masks removed" + }, + "MasksRemovedInfo": { + "key": "MasksRemovedInfo", + "value": "%1$s is no longer in your masks." + }, + "May": { + "key": "May", + "value": "May" + }, + "Media": { + "key": "Media", + "zeroValue": null, + "oneValue": "%1$d media", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d media" + }, + "MediaSavedHint": { + "key": "MediaSavedHint", + "zeroValue": null, + "oneValue": "One item saved to gallery", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d items saved to gallery" + }, + "MediaSelected": { + "key": "MediaSelected", + "zeroValue": null, + "oneValue": "%1$d media selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d media selected" + }, + "MegaAddedBy": { + "key": "MegaAddedBy", + "value": "un1 added you to this group" + }, + "MegaAdminsInfo": { + "key": "MegaAdminsInfo", + "value": "You can add administrators to help you manage your group. Tap and hold to remove them." + }, + "MegaDeleteAlert": { + "key": "MegaDeleteAlert", + "value": "Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?" + }, + "MegaDeleteInfo": { + "key": "MegaDeleteInfo", + "value": "You will lose all messages in this group." + }, + "MegaLeaveAlert": { + "key": "MegaLeaveAlert", + "value": "Are you sure you want to leave the group?" + }, + "MegaLeaveAlertWithName": { + "key": "MegaLeaveAlertWithName", + "value": "Are you sure you want to leave **%1$s**?" + }, + "MegaLocation": { + "key": "MegaLocation", + "value": "Location-based Group" + }, + "MegaPrivate": { + "key": "MegaPrivate", + "value": "Private Group" + }, + "MegaPrivateInfo": { + "key": "MegaPrivateInfo", + "value": "Private groups can only be joined if you were invited or have an invite link." + }, + "MegaPrivateLinkHelp": { + "key": "MegaPrivateLinkHelp", + "value": "People can join your group by following this link. You can revoke the link any time." + }, + "MegaPublic": { + "key": "MegaPublic", + "value": "Public Group" + }, + "MegaPublicInfo": { + "key": "MegaPublicInfo", + "value": "Public groups can be found in search, chat history is available to everyone and anyone can join." + }, + "MegaUsernameHelp": { + "key": "MegaUsernameHelp", + "value": "If you set a public link, other people will be able to find and join your group.\n\nYou can use a-z, 0-9 and underscores.\nMinimum length is 5 characters." + }, + "Members": { + "key": "Members", + "zeroValue": null, + "oneValue": "%1$d member", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d members" + }, + "MembersCount": { + "key": "MembersCount", + "value": "%1$d of %2$d selected" + }, + "MembersCountSelected": { + "key": "MembersCountSelected", + "zeroValue": null, + "oneValue": "%1$d of %2$d selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d of %2$d selected" + }, + "MembersCountZero": { + "key": "MembersCountZero", + "value": "up to %1$s" + }, + "MembersLanguageChartTitle": { + "key": "MembersLanguageChartTitle", + "value": "Members' primary language" + }, + "MembersOverviewTitle": { + "key": "MembersOverviewTitle", + "value": "Members" + }, + "MembersTalking": { + "key": "MembersTalking", + "zeroValue": null, + "oneValue": "%1$s member speaking", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s members talking" + }, + "MembersTalkingNobody": { + "key": "MembersTalkingNobody", + "value": "Tap to join" + }, + "Mention": { + "key": "Mention", + "value": "Mention" + }, + "Message": { + "key": "Message", + "value": "Message" + }, + "MessageCopied": { + "key": "MessageCopied", + "value": "Message copied to clipboard." + }, + "MessageLifetime": { + "key": "MessageLifetime", + "value": "Self-Destruct Timer" + }, + "MessageLifetimeChanged": { + "key": "MessageLifetimeChanged", + "value": "%1$s set the self-destruct timer to %2$s" + }, + "MessageLifetimeChangedOutgoing": { + "key": "MessageLifetimeChangedOutgoing", + "value": "You set the self-destruct timer to %1$s" + }, + "MessageLifetimePhoto": { + "key": "MessageLifetimePhoto", + "value": "If you set a timer, the photo will self-destruct after it was viewed." + }, + "MessageLifetimeRemoved": { + "key": "MessageLifetimeRemoved", + "value": "%1$s disabled the self-destruct timer" + }, + "MessageLifetimeVideo": { + "key": "MessageLifetimeVideo", + "value": "If you set a timer, the video will self-destruct after it was viewed." + }, + "MessageLifetimeYouRemoved": { + "key": "MessageLifetimeYouRemoved", + "value": "You disabled the self-destruct timer" + }, + "MessageNotFound": { + "key": "MessageNotFound", + "value": "Message doesn't exist" + }, + "MessageNotifications": { + "key": "MessageNotifications", + "value": "Message notifications" + }, + "MessagePinnedHint": { + "key": "MessagePinnedHint", + "value": "Message pinned" + }, + "MessagePreview": { + "key": "MessagePreview", + "value": "Message Preview" + }, + "MessageScheduleEditTime": { + "key": "MessageScheduleEditTime", + "value": "Reschedule" + }, + "MessageScheduleSend": { + "key": "MessageScheduleSend", + "value": "Send Now" + }, + "MessageScheduleToday": { + "key": "MessageScheduleToday", + "value": "Today" + }, + "MessageScheduledBotAction": { + "key": "MessageScheduledBotAction", + "value": "This action will become available after the message is published." + }, + "MessageScheduledLimitReached": { + "key": "MessageScheduledLimitReached", + "value": "Sorry, you can not schedule more than 100 messages." + }, + "MessageScheduledOn": { + "key": "MessageScheduledOn", + "value": "Scheduled for %1$s" + }, + "MessageScheduledReminderNotification": { + "key": "MessageScheduledReminderNotification", + "value": "📅 Reminder" + }, + "MessageScheduledUntilOnline": { + "key": "MessageScheduledUntilOnline", + "value": "Scheduled until online" + }, + "MessageScheduledVote": { + "key": "MessageScheduledVote", + "value": "Voting will become available after the message is published." + }, + "MessageScheduledVoteResults": { + "key": "MessageScheduledVoteResults", + "value": "Poll results will become available after the message is published." + }, + "MessageUnpinnedHint": { + "key": "MessageUnpinnedHint", + "value": "Message unpinned" + }, + "MessagesChartTitle": { + "key": "MessagesChartTitle", + "value": "Messages" + }, + "MessagesDataUsage": { + "key": "MessagesDataUsage", + "value": "Messages and other data" + }, + "MessagesDeletedHint": { + "key": "MessagesDeletedHint", + "zeroValue": null, + "oneValue": "Message deleted", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d messages deleted" + }, + "MessagesOverview": { + "key": "MessagesOverview", + "value": "Messages" + }, + "MessagesSettings": { + "key": "MessagesSettings", + "value": "Messages" + }, + "MessagesUnpinned": { + "key": "MessagesUnpinned", + "zeroValue": null, + "oneValue": "Message unpinned", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d messages unpinned" + }, + "Meters": { + "key": "Meters", + "zeroValue": null, + "oneValue": "%1$d meter", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d meters" + }, + "MetersAway": { + "key": "MetersAway", + "value": "m away" + }, + "MetersAway2": { + "key": "MetersAway2", + "value": "%1$s m away" + }, + "MetersFromYou2": { + "key": "MetersFromYou2", + "value": "%1$s m from you" + }, + "MetersShort": { + "key": "MetersShort", + "value": "%1$s m" + }, + "Mi": { + "key": "Mi", + "value": "mi" + }, + "MilesAway": { + "key": "MilesAway", + "value": "%1$s mi away" + }, + "MilesFromYou": { + "key": "MilesFromYou", + "value": "%1$s mi from you" + }, + "MilesShort": { + "key": "MilesShort", + "value": "%1$s mi" + }, + "Minutes": { + "key": "Minutes", + "zeroValue": null, + "oneValue": "%1$d minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d minutes" + }, + "MinutesBold": { + "key": "MinutesBold", + "zeroValue": null, + "oneValue": "**%1$d** minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "**%1$d** minutes" + }, + "MobileHidden": { + "key": "MobileHidden", + "value": "Mobile hidden" + }, + "MobileHiddenExceptionInfo": { + "key": "MobileHiddenExceptionInfo", + "value": "Phone number will be visible once %1$s adds you as a contact." + }, + "MobileUsage": { + "key": "MobileUsage", + "value": "Mobile Data Usage" + }, + "MobileVisibleInfo": { + "key": "MobileVisibleInfo", + "value": "When you tap **DONE**, your phone number will become visible to %1$s." + }, + "Mono": { + "key": "Mono", + "value": "Mono" + }, + "Months": { + "key": "Months", + "zeroValue": null, + "oneValue": "%1$d month", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d months" + }, + "MoreInfo": { + "key": "MoreInfo", + "value": "More info" + }, + "MusicFiles": { + "key": "MusicFiles", + "zeroValue": null, + "oneValue": "%1$d music file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d music files" + }, + "MusicInfo": { + "key": "MusicInfo", + "value": "To send music files" + }, + "MuteDisable": { + "key": "MuteDisable", + "value": "Disable" + }, + "MuteFor": { + "key": "MuteFor", + "value": "Mute for %1$s" + }, + "MuteNotifications": { + "key": "MuteNotifications", + "value": "Mute notifications" + }, + "NearbyCreateGroup": { + "key": "NearbyCreateGroup", + "value": "Create a Local Group" + }, + "NearbyCreateGroupInfo": { + "key": "NearbyCreateGroupInfo", + "value": "Anyone close to this location (neighbors, co-workers, fellow students, event attendees, visitors of a venue) will be able to see your group in the People Nearby section." + }, + "NearbyCreateGroupInfo2": { + "key": "NearbyCreateGroupInfo2", + "value": "If you start an unrelated group at this location, you may lose the ability to create location-based groups." + }, + "NearbyPeopleGreetingsDescription": { + "key": "NearbyPeopleGreetingsDescription", + "value": "Send a message or tap on the greeting below to show that you are ready to chat." + }, + "NearbyPeopleGreetingsMessage": { + "key": "NearbyPeopleGreetingsMessage", + "value": "%1$s is %2$s" + }, + "NearbyPlaces": { + "key": "NearbyPlaces", + "value": "Or choose a place" + }, + "NearbyStartGroup": { + "key": "NearbyStartGroup", + "value": "Start Group" + }, + "NearbyVenue": { + "key": "NearbyVenue", + "value": "Or choose a venue" + }, + "NetworkUsage": { + "key": "NetworkUsage", + "value": "Data Usage" + }, + "NetworkUsageMobile": { + "key": "NetworkUsageMobile", + "value": "MOBILE" + }, + "NetworkUsageMobileTab": { + "key": "NetworkUsageMobileTab", + "value": "Mobile" + }, + "NetworkUsageRoaming": { + "key": "NetworkUsageRoaming", + "value": "ROAMING" + }, + "NetworkUsageRoamingTab": { + "key": "NetworkUsageRoamingTab", + "value": "Roaming" + }, + "NetworkUsageSince": { + "key": "NetworkUsageSince", + "value": "Network usage since %1$s" + }, + "NetworkUsageWiFi": { + "key": "NetworkUsageWiFi", + "value": "WI-FI" + }, + "NetworkUsageWiFiTab": { + "key": "NetworkUsageWiFiTab", + "value": "Wi-Fi" + }, + "NeverAllow": { + "key": "NeverAllow", + "value": "Never Allow" + }, + "NeverAllowPlaceholder": { + "key": "NeverAllowPlaceholder", + "value": "Never allow..." + }, + "NeverShareWith": { + "key": "NeverShareWith", + "value": "Never Share With" + }, + "NeverShareWithPlaceholder": { + "key": "NeverShareWithPlaceholder", + "value": "Never share with users..." + }, + "NeverShareWithTitle": { + "key": "NeverShareWithTitle", + "value": "Never Share" + }, + "NewBroadcastList": { + "key": "NewBroadcastList", + "value": "New Broadcast List" + }, + "NewChannel": { + "key": "NewChannel", + "value": "New Channel" + }, + "NewChatsFromNonContacts": { + "key": "NewChatsFromNonContacts", + "value": "New chats from unknown users" + }, + "NewContact": { + "key": "NewContact", + "value": "New Contact" + }, + "NewContactAlertButton": { + "key": "NewContactAlertButton", + "value": "Add contact" + }, + "NewContactAlertMessage": { + "key": "NewContactAlertMessage", + "value": "The phone number **%1$s** is not in your contacts. Do you want to add it?" + }, + "NewContactAlertTitle": { + "key": "NewContactAlertTitle", + "value": "New contact" + }, + "NewConversationShortcut": { + "key": "NewConversationShortcut", + "value": "New conversation" + }, + "NewFollowersBySourceChartTitle": { + "key": "NewFollowersBySourceChartTitle", + "value": "New followers by source" + }, + "NewGroup": { + "key": "NewGroup", + "value": "New Group" + }, + "NewLink": { + "key": "NewLink", + "value": "New Link" + }, + "NewMembersBySourceChartTitle": { + "key": "NewMembersBySourceChartTitle", + "value": "New members by source" + }, + "NewMessageTitle": { + "key": "NewMessageTitle", + "value": "New Message" + }, + "NewMessages": { + "key": "NewMessages", + "zeroValue": null, + "oneValue": "%1$d new message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d new messages" + }, + "NewPoll": { + "key": "NewPoll", + "value": "New Poll" + }, + "NewQuiz": { + "key": "NewQuiz", + "value": "New Quiz" + }, + "NewSecretChat": { + "key": "NewSecretChat", + "value": "New Secret Chat" + }, + "NewTheme": { + "key": "NewTheme", + "value": "New color theme" + }, + "NewThemePreviewLine1": { + "key": "NewThemePreviewLine1", + "value": "Do you know what time it is?" + }, + "NewThemePreviewLine2": { + "key": "NewThemePreviewLine2", + "value": "It's morning in Tokyo 😎" + }, + "NewThemePreviewLine3": { + "key": "NewThemePreviewLine3", + "value": "It's morning in *Tokyo* 😎" + }, + "NewThemePreviewName": { + "key": "NewThemePreviewName", + "value": "Bob Harris" + }, + "NewThemePreviewReply": { + "key": "NewThemePreviewReply", + "value": "Good morning! 👋" + }, + "NewThemePreviewReply2": { + "key": "NewThemePreviewReply2", + "value": "Good morning" + }, + "NewThemeTitle": { + "key": "NewThemeTitle", + "value": "New Theme" + }, + "Next": { + "key": "Next", + "value": "Next" + }, + "NoAudio": { + "key": "NoAudio", + "value": "Please add files to the music library on your device to see them here." + }, + "NoAudioFiles": { + "key": "NoAudioFiles", + "value": "No audio files" + }, + "NoAudioFilesInfo": { + "key": "NoAudioFilesInfo", + "value": "Your music library is empty." + }, + "NoAudioFound": { + "key": "NoAudioFound", + "value": "No results found" + }, + "NoAudioFoundInfo": { + "key": "NoAudioFoundInfo", + "value": "There are no matches with **%1$s** in your music library." + }, + "NoAudioFoundPlayerInfo": { + "key": "NoAudioFoundPlayerInfo", + "value": "There are no matches for **%1$s**." + }, + "NoBlocked": { + "key": "NoBlocked", + "value": "No blocked users yet" + }, + "NoBlockedChannel": { + "key": "NoBlockedChannel", + "value": "Banned users are removed from the channel and can only come back if added by an admin. Invite links don't work for them." + }, + "NoBlockedChannel2": { + "key": "NoBlockedChannel2", + "value": "Users removed from the channel by the admins can't rejoin via invite links." + }, + "NoBlockedGroup": { + "key": "NoBlockedGroup", + "value": "Banned users are removed from the group and can only come back if added by an admin. Invite links don't work for them." + }, + "NoBlockedGroup2": { + "key": "NoBlockedGroup2", + "value": "Users removed from the group by the admins can't rejoin via invite links." + }, + "NoBlockedUsers": { + "key": "NoBlockedUsers", + "value": "No removed users" + }, + "NoCallLog": { + "key": "NoCallLog", + "value": "No calls here yet..." + }, + "NoChats": { + "key": "NoChats", + "value": "Welcome to Telegram" + }, + "NoChatsContactsHelp": { + "key": "NoChatsContactsHelp", + "value": "Start messaging by tapping one of your contacts below." + }, + "NoChatsHelp": { + "key": "NoChatsHelp", + "value": "Start messaging by tapping the pencil button in the bottom right corner." + }, + "NoComments": { + "key": "NoComments", + "value": "No comments here yet..." + }, + "NoContacts": { + "key": "NoContacts", + "value": "No contacts yet" + }, + "NoContactsYet": { + "key": "NoContactsYet", + "value": "You have no contacts on Telegram yet" + }, + "NoContactsYetLine1": { + "key": "NoContactsYetLine1", + "value": "Invite friends to try Telegram" + }, + "NoContactsYetLine2": { + "key": "NoContactsYetLine2", + "value": "Find people nearby to chat with" + }, + "NoContactsYetLine3": { + "key": "NoContactsYetLine3", + "value": "Search people by username" + }, + "NoEmojiFound": { + "key": "NoEmojiFound", + "value": "No emoji found" + }, + "NoExceptions": { + "key": "NoExceptions", + "value": "This section will list all chats with non-default notification settings.\n\nYou can customize notifications for a chat by opening its profile and choosing 'Notifications'." + }, + "NoFilesFound": { + "key": "NoFilesFound", + "value": "No results found" + }, + "NoFilesFoundInfo": { + "key": "NoFilesFoundInfo", + "value": "There are no matches with **%1$s** in current directory." + }, + "NoFilesInfo": { + "key": "NoFilesInfo", + "value": "This folder is empty." + }, + "NoGIFs": { + "key": "NoGIFs", + "value": "No GIFs" + }, + "NoGIFsFound": { + "key": "NoGIFsFound", + "value": "No GIFs found" + }, + "NoGroupsInCommon": { + "key": "NoGroupsInCommon", + "value": "No common groups" + }, + "NoHandleAppInstalled": { + "key": "NoHandleAppInstalled", + "value": "You don't have applications that can handle the file type '%1$s', please install one to continue" + }, + "NoLimit": { + "key": "NoLimit", + "value": "No limit" + }, + "NoMailInstalled": { + "key": "NoMailInstalled", + "value": "Please send an email describing your problem to sms@stel.com" + }, + "NoMasks": { + "key": "NoMasks", + "value": "No masks yet" + }, + "NoMedia": { + "key": "NoMedia", + "value": "Share photos and videos in this chat and access them on any of your devices." + }, + "NoMediaAutoDownload": { + "key": "NoMediaAutoDownload", + "value": "No media" + }, + "NoMediaSecret": { + "key": "NoMediaSecret", + "value": "Photos and videos from this chat will be shown here." + }, + "NoMessages": { + "key": "NoMessages", + "value": "No messages here yet..." + }, + "NoMessagesGreetingsDescription": { + "key": "NoMessagesGreetingsDescription", + "value": "Send a message or tap the greeting below." + }, + "NoOneJoined": { + "key": "NoOneJoined", + "value": "No one joined" + }, + "NoOneJoinedYet": { + "key": "NoOneJoinedYet", + "value": "No one joined yet" + }, + "NoOtherSessions": { + "key": "NoOtherSessions", + "value": "No other active sessions" + }, + "NoOtherSessionsInfo": { + "key": "NoOtherSessionsInfo", + "value": "You can log in to Telegram from other mobile, tablet and desktop devices, using the same phone number. All your data will be instantly synchronized." + }, + "NoOtherWebSessions": { + "key": "NoOtherWebSessions", + "value": "No active logins." + }, + "NoOtherWebSessionsInfo": { + "key": "NoOtherWebSessionsInfo", + "value": "You can log in on websites that support signing in with Telegram." + }, + "NoPhotos": { + "key": "NoPhotos", + "value": "No photos yet" + }, + "NoPlacesFound": { + "key": "NoPlacesFound", + "value": "No places found" + }, + "NoPlacesFoundInfo": { + "key": "NoPlacesFoundInfo", + "value": "There are no matches with **%1$s** near you." + }, + "NoPlayerInstalled": { + "key": "NoPlayerInstalled", + "value": "You don't have a video player, please install one to continue" + }, + "NoPopup": { + "key": "NoPopup", + "value": "No popup" + }, + "NoRecent": { + "key": "NoRecent", + "value": "No recent" + }, + "NoRecentGIFs": { + "key": "NoRecentGIFs", + "value": "No recent GIFs" + }, + "NoRecentPhotos": { + "key": "NoRecentPhotos", + "value": "No recent photos" + }, + "NoRecentSearches": { + "key": "NoRecentSearches", + "value": "No recent searches" + }, + "NoReplies": { + "key": "NoReplies", + "value": "No replies here yet..." + }, + "NoResult": { + "key": "NoResult", + "value": "No results" + }, + "NoScheduledMessages": { + "key": "NoScheduledMessages", + "value": "No scheduled messages here yet..." + }, + "NoSharedAudio": { + "key": "NoSharedAudio", + "value": "Share music in this chat and access it on any of your devices." + }, + "NoSharedAudioSecret": { + "key": "NoSharedAudioSecret", + "value": "Music from this chat will be shown here." + }, + "NoSharedFiles": { + "key": "NoSharedFiles", + "value": "Share files and documents in this chat and access them on any of your devices." + }, + "NoSharedFilesSecret": { + "key": "NoSharedFilesSecret", + "value": "Files and documents from this chat will be shown here." + }, + "NoSharedGifSecret": { + "key": "NoSharedGifSecret", + "value": "GIFs from this chat will be shown here." + }, + "NoSharedLinks": { + "key": "NoSharedLinks", + "value": "Share links in this chat and access them on any of your devices." + }, + "NoSharedLinksSecret": { + "key": "NoSharedLinksSecret", + "value": "Shared links from this chat will be shown here." + }, + "NoSharedVoice": { + "key": "NoSharedVoice", + "value": "Share voice messages in this chat and access them on any of your devices." + }, + "NoSharedVoiceSecret": { + "key": "NoSharedVoiceSecret", + "value": "Voice messages from this chat will be shown here." + }, + "NoSound": { + "key": "NoSound", + "value": "No sound" + }, + "NoStickers": { + "key": "NoStickers", + "value": "No stickers yet" + }, + "NoStickersFound": { + "key": "NoStickersFound", + "value": "No stickers found" + }, + "NoUsernameFound": { + "key": "NoUsernameFound", + "value": "There is no Telegram account with this username." + }, + "NoVotes": { + "key": "NoVotes", + "value": "No votes" + }, + "NoVotesQuiz": { + "key": "NoVotesQuiz", + "value": "Nobody answered" + }, + "NobodyLikesSpam1": { + "key": "NobodyLikesSpam1", + "value": "Sorry, you can only send messages to mutual contacts at the moment." + }, + "NobodyLikesSpam2": { + "key": "NobodyLikesSpam2", + "value": "Sorry, you can only add mutual contacts to groups at the moment." + }, + "NobodyLikesSpam3": { + "key": "NobodyLikesSpam3", + "value": "Sorry, you are currently restricted from posting to public groups." + }, + "NotMounted": { + "key": "NotMounted", + "value": "Storage not mounted" + }, + "NotificationActionPinnedContact": { + "key": "NotificationActionPinnedContact", + "value": "%1$s pinned a contact in the group %2$s" + }, + "NotificationActionPinnedContact2": { + "key": "NotificationActionPinnedContact2", + "value": "%1$s pinned a contact %3$s in the group %2$s" + }, + "NotificationActionPinnedContactChannel": { + "key": "NotificationActionPinnedContactChannel", + "value": "%1$s pinned a contact" + }, + "NotificationActionPinnedContactChannel2": { + "key": "NotificationActionPinnedContactChannel2", + "value": "%1$s pinned a contact %2$s" + }, + "NotificationActionPinnedContactUser": { + "key": "NotificationActionPinnedContactUser", + "value": "%1$s pinned a contact %2$s" + }, + "NotificationActionPinnedFile": { + "key": "NotificationActionPinnedFile", + "value": "%1$s pinned a file in the group %2$s" + }, + "NotificationActionPinnedFileChannel": { + "key": "NotificationActionPinnedFileChannel", + "value": "%1$s pinned a file" + }, + "NotificationActionPinnedFileUser": { + "key": "NotificationActionPinnedFileUser", + "value": "%1$s pinned a file" + }, + "NotificationActionPinnedGame": { + "key": "NotificationActionPinnedGame", + "value": "%1$s pinned a game in the group %2$s" + }, + "NotificationActionPinnedGameChannel": { + "key": "NotificationActionPinnedGameChannel", + "value": "%1$s pinned a game" + }, + "NotificationActionPinnedGameScore": { + "key": "NotificationActionPinnedGameScore", + "value": "%1$s pinned a game score in the group %2$s" + }, + "NotificationActionPinnedGameScoreChannel": { + "key": "NotificationActionPinnedGameScoreChannel", + "value": "%1$s pinned a game score" + }, + "NotificationActionPinnedGameScoreUser": { + "key": "NotificationActionPinnedGameScoreUser", + "value": "%1$s pinned a game score" + }, + "NotificationActionPinnedGameUser": { + "key": "NotificationActionPinnedGameUser", + "value": "%1$s pinned a game" + }, + "NotificationActionPinnedGeo": { + "key": "NotificationActionPinnedGeo", + "value": "%1$s pinned a map in the group %2$s" + }, + "NotificationActionPinnedGeoChannel": { + "key": "NotificationActionPinnedGeoChannel", + "value": "%1$s pinned a map" + }, + "NotificationActionPinnedGeoLive": { + "key": "NotificationActionPinnedGeoLive", + "value": "%1$s pinned a live location in the group %2$s" + }, + "NotificationActionPinnedGeoLiveChannel": { + "key": "NotificationActionPinnedGeoLiveChannel", + "value": "%1$s pinned a live location" + }, + "NotificationActionPinnedGeoLiveUser": { + "key": "NotificationActionPinnedGeoLiveUser", + "value": "%1$s pinned a live location" + }, + "NotificationActionPinnedGeoUser": { + "key": "NotificationActionPinnedGeoUser", + "value": "%1$s pinned a map" + }, + "NotificationActionPinnedGif": { + "key": "NotificationActionPinnedGif", + "value": "%1$s pinned a GIF in the group %2$s" + }, + "NotificationActionPinnedGifChannel": { + "key": "NotificationActionPinnedGifChannel", + "value": "%1$s pinned a GIF" + }, + "NotificationActionPinnedGifUser": { + "key": "NotificationActionPinnedGifUser", + "value": "%1$s pinned a GIF" + }, + "NotificationActionPinnedInvoice": { + "key": "NotificationActionPinnedInvoice", + "value": "%1$s pinned an invoice in the group %2$s" + }, + "NotificationActionPinnedInvoiceChannel": { + "key": "NotificationActionPinnedInvoiceChannel", + "value": "%1$s pinned an invoice" + }, + "NotificationActionPinnedInvoiceUser": { + "key": "NotificationActionPinnedInvoiceUser", + "value": "%1$s pinned an invoice" + }, + "NotificationActionPinnedMusic": { + "key": "NotificationActionPinnedMusic", + "value": "%1$s pinned an audio file in the group %2$s" + }, + "NotificationActionPinnedMusicChannel": { + "key": "NotificationActionPinnedMusicChannel", + "value": "%1$s pinned an audio file" + }, + "NotificationActionPinnedMusicUser": { + "key": "NotificationActionPinnedMusicUser", + "value": "%1$s pinned an audio file" + }, + "NotificationActionPinnedNoText": { + "key": "NotificationActionPinnedNoText", + "value": "%1$s pinned a message in the group %2$s" + }, + "NotificationActionPinnedNoTextChannel": { + "key": "NotificationActionPinnedNoTextChannel", + "value": "%1$s pinned a message" + }, + "NotificationActionPinnedNoTextUser": { + "key": "NotificationActionPinnedNoTextUser", + "value": "%1$s pinned a message" + }, + "NotificationActionPinnedPhoto": { + "key": "NotificationActionPinnedPhoto", + "value": "%1$s pinned a photo in the group %2$s" + }, + "NotificationActionPinnedPhotoChannel": { + "key": "NotificationActionPinnedPhotoChannel", + "value": "%1$s pinned a photo" + }, + "NotificationActionPinnedPhotoUser": { + "key": "NotificationActionPinnedPhotoUser", + "value": "%1$s pinned a photo" + }, + "NotificationActionPinnedPoll": { + "key": "NotificationActionPinnedPoll", + "value": "%1$s pinned a poll in the group %2$s" + }, + "NotificationActionPinnedPoll2": { + "key": "NotificationActionPinnedPoll2", + "value": "%1$s pinned a poll %3$s in the group %2$s" + }, + "NotificationActionPinnedPollChannel": { + "key": "NotificationActionPinnedPollChannel", + "value": "%1$s pinned a poll" + }, + "NotificationActionPinnedPollChannel2": { + "key": "NotificationActionPinnedPollChannel2", + "value": "%1$s pinned a poll %2$s" + }, + "NotificationActionPinnedPollUser": { + "key": "NotificationActionPinnedPollUser", + "value": "%1$s pinned a poll %2$s" + }, + "NotificationActionPinnedQuiz2": { + "key": "NotificationActionPinnedQuiz2", + "value": "%1$s pinned the quiz \"%3$s\" in the group %2$s" + }, + "NotificationActionPinnedQuizChannel2": { + "key": "NotificationActionPinnedQuizChannel2", + "value": "%1$s pinned the quiz \"%2$s\"" + }, + "NotificationActionPinnedQuizUser": { + "key": "NotificationActionPinnedQuizUser", + "value": "%1$s pinned a quiz %2$s" + }, + "NotificationActionPinnedRound": { + "key": "NotificationActionPinnedRound", + "value": "%1$s pinned a video message in the group %2$s" + }, + "NotificationActionPinnedRoundChannel": { + "key": "NotificationActionPinnedRoundChannel", + "value": "%1$s pinned a video message" + }, + "NotificationActionPinnedRoundUser": { + "key": "NotificationActionPinnedRoundUser", + "value": "%1$s pinned a video message" + }, + "NotificationActionPinnedSticker": { + "key": "NotificationActionPinnedSticker", + "value": "%1$s pinned a sticker in the group %2$s" + }, + "NotificationActionPinnedStickerChannel": { + "key": "NotificationActionPinnedStickerChannel", + "value": "%1$s pinned a sticker" + }, + "NotificationActionPinnedStickerEmoji": { + "key": "NotificationActionPinnedStickerEmoji", + "value": "%1$s pinned a %3$s sticker in the group %2$s" + }, + "NotificationActionPinnedStickerEmojiChannel": { + "key": "NotificationActionPinnedStickerEmojiChannel", + "value": "%1$s pinned a %2$s sticker" + }, + "NotificationActionPinnedStickerEmojiUser": { + "key": "NotificationActionPinnedStickerEmojiUser", + "value": "%1$s pinned a %2$s sticker" + }, + "NotificationActionPinnedStickerUser": { + "key": "NotificationActionPinnedStickerUser", + "value": "%1$s pinned a sticker" + }, + "NotificationActionPinnedText": { + "key": "NotificationActionPinnedText", + "value": "%1$s pinned \"%2$s\" in the group %3$s" + }, + "NotificationActionPinnedTextChannel": { + "key": "NotificationActionPinnedTextChannel", + "value": "%1$s pinned \"%2$s\"" + }, + "NotificationActionPinnedTextUser": { + "key": "NotificationActionPinnedTextUser", + "value": "%1$s pinned \"%2$s\"" + }, + "NotificationActionPinnedVideo": { + "key": "NotificationActionPinnedVideo", + "value": "%1$s pinned a video in the group %2$s" + }, + "NotificationActionPinnedVideoChannel": { + "key": "NotificationActionPinnedVideoChannel", + "value": "%1$s pinned a video" + }, + "NotificationActionPinnedVideoUser": { + "key": "NotificationActionPinnedVideoUser", + "value": "%1$s pinned a video" + }, + "NotificationActionPinnedVoice": { + "key": "NotificationActionPinnedVoice", + "value": "%1$s pinned a voice message in %2$s" + }, + "NotificationActionPinnedVoiceChannel": { + "key": "NotificationActionPinnedVoiceChannel", + "value": "%1$s pinned a voice message" + }, + "NotificationActionPinnedVoiceUser": { + "key": "NotificationActionPinnedVoiceUser", + "value": "%1$s pinned a voice message" + }, + "NotificationContactJoined": { + "key": "NotificationContactJoined", + "value": "%1$s joined Telegram!" + }, + "NotificationContactNewPhoto": { + "key": "NotificationContactNewPhoto", + "value": "%1$s updated profile photo" + }, + "NotificationEditedGroupName": { + "key": "NotificationEditedGroupName", + "value": "%1$s renamed the group %2$s" + }, + "NotificationEditedGroupPhoto": { + "key": "NotificationEditedGroupPhoto", + "value": "%1$s changed the group photo for %2$s" + }, + "NotificationEditedGroupVideo": { + "key": "NotificationEditedGroupVideo", + "value": "%1$s changed the group video for %2$s" + }, + "NotificationGroupAddMember": { + "key": "NotificationGroupAddMember", + "value": "%1$s invited %3$s to the group %2$s" + }, + "NotificationGroupAddSelf": { + "key": "NotificationGroupAddSelf", + "value": "%1$s returned to the group %2$s" + }, + "NotificationGroupAddSelfMega": { + "key": "NotificationGroupAddSelfMega", + "value": "%1$s joined the group %2$s" + }, + "NotificationGroupAlbum": { + "key": "NotificationGroupAlbum", + "value": "%1$s sent an album to the group %2$s" + }, + "NotificationGroupCreatedCall": { + "key": "NotificationGroupCreatedCall", + "value": "%1$s started a voice chat in %2$s" + }, + "NotificationGroupEndedCall": { + "key": "NotificationGroupEndedCall", + "value": "%1$s ended the voice chat in %2$s" + }, + "NotificationGroupFew": { + "key": "NotificationGroupFew", + "value": "%1$s sent %3$s to the group %2$s" + }, + "NotificationGroupForwardedFew": { + "key": "NotificationGroupForwardedFew", + "value": "%1$s forwarded %3$s to the group %2$s" + }, + "NotificationGroupInvitedToCall": { + "key": "NotificationGroupInvitedToCall", + "value": "%1$s invited %3$s to a voice chat in %2$s" + }, + "NotificationGroupInvitedYouToCall": { + "key": "NotificationGroupInvitedYouToCall", + "value": "%1$s invited you to a voice chat in %2$s" + }, + "NotificationGroupKickMember": { + "key": "NotificationGroupKickMember", + "value": "%1$s removed %3$s from the group %2$s" + }, + "NotificationGroupKickYou": { + "key": "NotificationGroupKickYou", + "value": "%1$s removed you from the group %2$s" + }, + "NotificationGroupLeftMember": { + "key": "NotificationGroupLeftMember", + "value": "%1$s left the group %2$s" + }, + "NotificationHiddenChatName": { + "key": "NotificationHiddenChatName", + "value": "Telegram" + }, + "NotificationHiddenChatUserName": { + "key": "NotificationHiddenChatUserName", + "value": "User" + }, + "NotificationHiddenMessage": { + "key": "NotificationHiddenMessage", + "value": "New message" + }, + "NotificationHiddenName": { + "key": "NotificationHiddenName", + "value": "Telegram" + }, + "NotificationInvitedToGroup": { + "key": "NotificationInvitedToGroup", + "value": "%1$s invited you to the group %2$s" + }, + "NotificationInvitedToGroupByLink": { + "key": "NotificationInvitedToGroupByLink", + "value": "%1$s joined to the group %2$s via invite link" + }, + "NotificationMessageAlbum": { + "key": "NotificationMessageAlbum", + "value": "%1$s sent you an album" + }, + "NotificationMessageAudio": { + "key": "NotificationMessageAudio", + "value": "%1$s sent you a voice message" + }, + "NotificationMessageContact": { + "key": "NotificationMessageContact", + "value": "%1$s shared a contact with you" + }, + "NotificationMessageContact2": { + "key": "NotificationMessageContact2", + "value": "%1$s shared a contact %2$s with you" + }, + "NotificationMessageDocument": { + "key": "NotificationMessageDocument", + "value": "%1$s sent you a file" + }, + "NotificationMessageFew": { + "key": "NotificationMessageFew", + "value": "%1$s sent you %2$s" + }, + "NotificationMessageForwardFew": { + "key": "NotificationMessageForwardFew", + "value": "%1$s forwarded you %2$s" + }, + "NotificationMessageGame": { + "key": "NotificationMessageGame", + "value": "%1$s invited you to play %2$s" + }, + "NotificationMessageGameScored": { + "key": "NotificationMessageGameScored", + "value": "%1$s scored %3$s in game %2$s" + }, + "NotificationMessageGif": { + "key": "NotificationMessageGif", + "value": "%1$s sent you a GIF" + }, + "NotificationMessageGroupAudio": { + "key": "NotificationMessageGroupAudio", + "value": "%1$s sent a voice message to %2$s" + }, + "NotificationMessageGroupContact": { + "key": "NotificationMessageGroupContact", + "value": "%1$s shared a contact in the group %2$s" + }, + "NotificationMessageGroupContact2": { + "key": "NotificationMessageGroupContact2", + "value": "%1$s shared a contact %3$s in the group %2$s" + }, + "NotificationMessageGroupDocument": { + "key": "NotificationMessageGroupDocument", + "value": "%1$s sent a file to the group %2$s" + }, + "NotificationMessageGroupGame": { + "key": "NotificationMessageGroupGame", + "value": "%1$s invited the group %2$s to play %3$s" + }, + "NotificationMessageGroupGameScored": { + "key": "NotificationMessageGroupGameScored", + "value": "%1$s scored %4$s in game %3$s in the group %2$s" + }, + "NotificationMessageGroupGif": { + "key": "NotificationMessageGroupGif", + "value": "%1$s sent a GIF to the group %2$s" + }, + "NotificationMessageGroupInvoice": { + "key": "NotificationMessageGroupInvoice", + "value": "%1$s sent an invoice to the group %2$s for %3$s" + }, + "NotificationMessageGroupLiveLocation": { + "key": "NotificationMessageGroupLiveLocation", + "value": "%1$s shared a live location with the group %2$s" + }, + "NotificationMessageGroupMap": { + "key": "NotificationMessageGroupMap", + "value": "%1$s sent a location to the group %2$s" + }, + "NotificationMessageGroupMusic": { + "key": "NotificationMessageGroupMusic", + "value": "%1$s sent an audio file to the group %2$s" + }, + "NotificationMessageGroupNoText": { + "key": "NotificationMessageGroupNoText", + "value": "%1$s sent a message to the group %2$s" + }, + "NotificationMessageGroupPhoto": { + "key": "NotificationMessageGroupPhoto", + "value": "%1$s sent a photo to the group %2$s" + }, + "NotificationMessageGroupPoll": { + "key": "NotificationMessageGroupPoll", + "value": "%1$s sent a poll to the group %2$s" + }, + "NotificationMessageGroupPoll2": { + "key": "NotificationMessageGroupPoll2", + "value": "%1$s sent a poll %3$s to the group %2$s" + }, + "NotificationMessageGroupQuiz2": { + "key": "NotificationMessageGroupQuiz2", + "value": "%1$s sent the quiz \"%3$s\" to the group %2$s" + }, + "NotificationMessageGroupRound": { + "key": "NotificationMessageGroupRound", + "value": "%1$s sent a video message to the group %2$s" + }, + "NotificationMessageGroupSticker": { + "key": "NotificationMessageGroupSticker", + "value": "%1$s sent a sticker to the group %2$s" + }, + "NotificationMessageGroupStickerEmoji": { + "key": "NotificationMessageGroupStickerEmoji", + "value": "%1$s sent a %3$s sticker to the group %2$s" + }, + "NotificationMessageGroupText": { + "key": "NotificationMessageGroupText", + "value": "%1$s @ %2$s: %3$s" + }, + "NotificationMessageGroupVideo": { + "key": "NotificationMessageGroupVideo", + "value": "%1$s sent a video to the group %2$s" + }, + "NotificationMessageInvoice": { + "key": "NotificationMessageInvoice", + "value": "%1$s sent you an invoice for %2$s" + }, + "NotificationMessageLiveLocation": { + "key": "NotificationMessageLiveLocation", + "value": "%1$s sent you a live location" + }, + "NotificationMessageMap": { + "key": "NotificationMessageMap", + "value": "%1$s sent you a location" + }, + "NotificationMessageMusic": { + "key": "NotificationMessageMusic", + "value": "%1$s sent you an audio file" + }, + "NotificationMessageNoText": { + "key": "NotificationMessageNoText", + "value": "%1$s sent you a message" + }, + "NotificationMessagePhoto": { + "key": "NotificationMessagePhoto", + "value": "%1$s sent you a photo" + }, + "NotificationMessagePoll": { + "key": "NotificationMessagePoll", + "value": "%1$s sent you a poll" + }, + "NotificationMessagePoll2": { + "key": "NotificationMessagePoll2", + "value": "%1$s sent you a poll %2$s" + }, + "NotificationMessageQuiz2": { + "key": "NotificationMessageQuiz2", + "value": "%1$s sent you the quiz \"%2$s\"" + }, + "NotificationMessageRound": { + "key": "NotificationMessageRound", + "value": "%1$s sent you a video message" + }, + "NotificationMessageSDPhoto": { + "key": "NotificationMessageSDPhoto", + "value": "%1$s sent you a self-destructing photo" + }, + "NotificationMessageSDVideo": { + "key": "NotificationMessageSDVideo", + "value": "%1$s sent you a self-destructing video" + }, + "NotificationMessageScheduled": { + "key": "NotificationMessageScheduled", + "value": "📅 You: %1$s" + }, + "NotificationMessageScheduledName": { + "key": "NotificationMessageScheduledName", + "value": "📅 You" + }, + "NotificationMessageSticker": { + "key": "NotificationMessageSticker", + "value": "%1$s sent you a sticker" + }, + "NotificationMessageStickerEmoji": { + "key": "NotificationMessageStickerEmoji", + "value": "%1$s sent you a %2$s sticker" + }, + "NotificationMessageText": { + "key": "NotificationMessageText", + "value": "%1$s: %2$s" + }, + "NotificationMessageVideo": { + "key": "NotificationMessageVideo", + "value": "%1$s sent you a video" + }, + "NotificationMessagesPeopleDisplayOrder": { + "key": "NotificationMessagesPeopleDisplayOrder", + "value": "%1$s %2$s" + }, + "NotificationUnrecognizedDevice": { + "key": "NotificationUnrecognizedDevice", + "value": "%1$s,\nWe detected a login to your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn't you, you can go to Settings > Devices and terminate that session.\n\nIf you think that somebody logged in to your account against your will, you can enable Two-Step Verification in Privacy and Security settings.\n\nSincerely,\nThe Telegram Team" + }, + "Notifications": { + "key": "Notifications", + "value": "Notifications" + }, + "NotificationsAddAnException": { + "key": "NotificationsAddAnException", + "value": "Add an Exception" + }, + "NotificationsAndSounds": { + "key": "NotificationsAndSounds", + "value": "Notifications and Sounds" + }, + "NotificationsChannels": { + "key": "NotificationsChannels", + "value": "Channels" + }, + "NotificationsChartTitle": { + "key": "NotificationsChartTitle", + "value": "Notifications" + }, + "NotificationsChatInApp": { + "key": "NotificationsChatInApp", + "value": "%1$s In-App" + }, + "NotificationsCustom": { + "key": "NotificationsCustom", + "value": "Custom" + }, + "NotificationsCustomize": { + "key": "NotificationsCustomize", + "value": "Customize" + }, + "NotificationsDefault": { + "key": "NotificationsDefault", + "value": "Default" + }, + "NotificationsDefaultOff": { + "key": "NotificationsDefaultOff", + "value": "Default (Off)" + }, + "NotificationsDefaultOn": { + "key": "NotificationsDefaultOn", + "value": "Default (On)" + }, + "NotificationsDeleteAllException": { + "key": "NotificationsDeleteAllException", + "value": "Delete All Exceptions" + }, + "NotificationsDeleteAllExceptionAlert": { + "key": "NotificationsDeleteAllExceptionAlert", + "value": "Are you sure you want to delete all exceptions?" + }, + "NotificationsDeleteAllExceptionTitle": { + "key": "NotificationsDeleteAllExceptionTitle", + "value": "Delete all exceptions" + }, + "NotificationsEnableCustom": { + "key": "NotificationsEnableCustom", + "value": "Enable Custom Notifications" + }, + "NotificationsExceptions": { + "key": "NotificationsExceptions", + "value": "Exceptions" + }, + "NotificationsExceptionsAlert": { + "key": "NotificationsExceptionsAlert", + "value": "Please note that **%1$s** are listed as exceptions and won't be affected by this change." + }, + "NotificationsExceptionsSingleAlert": { + "key": "NotificationsExceptionsSingleAlert", + "value": "Please note that **%1$s** is listed as an exception and won't be affected by this change." + }, + "NotificationsForChannels": { + "key": "NotificationsForChannels", + "value": "Notifications for channels" + }, + "NotificationsForChats": { + "key": "NotificationsForChats", + "value": "Notifications for chats" + }, + "NotificationsForGroups": { + "key": "NotificationsForGroups", + "value": "Notifications for groups" + }, + "NotificationsForPrivateChats": { + "key": "NotificationsForPrivateChats", + "value": "Notifications for private chats" + }, + "NotificationsGroups": { + "key": "NotificationsGroups", + "value": "Groups" + }, + "NotificationsImportance": { + "key": "NotificationsImportance", + "value": "Importance" + }, + "NotificationsInAppDefault": { + "key": "NotificationsInAppDefault", + "value": "In-App Default" + }, + "NotificationsLed": { + "key": "NotificationsLed", + "value": "LED" + }, + "NotificationsLedColor": { + "key": "NotificationsLedColor", + "value": "Color" + }, + "NotificationsLedInfo": { + "key": "NotificationsLedInfo", + "value": "LED is a small blinking light on some devices that is used to indicate new messages." + }, + "NotificationsMuted": { + "key": "NotificationsMuted", + "value": "Muted" + }, + "NotificationsMutedForHint": { + "key": "NotificationsMutedForHint", + "value": "Notifications muted for %1$s" + }, + "NotificationsMutedHint": { + "key": "NotificationsMutedHint", + "value": "Notifications muted" + }, + "NotificationsNewException": { + "key": "NotificationsNewException", + "value": "New Exception" + }, + "NotificationsOff": { + "key": "NotificationsOff", + "value": "Off" + }, + "NotificationsOffUntil": { + "key": "NotificationsOffUntil", + "value": "Off until %1$s" + }, + "NotificationsOn": { + "key": "NotificationsOn", + "value": "On" + }, + "NotificationsOther": { + "key": "NotificationsOther", + "value": "Other" + }, + "NotificationsPriority": { + "key": "NotificationsPriority", + "value": "Priority" + }, + "NotificationsPriorityDefault": { + "key": "NotificationsPriorityDefault", + "value": "Default" + }, + "NotificationsPriorityHigh": { + "key": "NotificationsPriorityHigh", + "value": "High" + }, + "NotificationsPriorityLow": { + "key": "NotificationsPriorityLow", + "value": "Low" + }, + "NotificationsPriorityMax": { + "key": "NotificationsPriorityMax", + "value": "Max" + }, + "NotificationsPriorityMedium": { + "key": "NotificationsPriorityMedium", + "value": "Medium" + }, + "NotificationsPrioritySettings": { + "key": "NotificationsPrioritySettings", + "value": "Same as in Settings" + }, + "NotificationsPriorityUrgent": { + "key": "NotificationsPriorityUrgent", + "value": "Urgent" + }, + "NotificationsPrivateChats": { + "key": "NotificationsPrivateChats", + "value": "Private Chats" + }, + "NotificationsService": { + "key": "NotificationsService", + "value": "Keep-Alive Service" + }, + "NotificationsServiceConnection": { + "key": "NotificationsServiceConnection", + "value": "Background Connection" + }, + "NotificationsServiceConnectionInfo": { + "key": "NotificationsServiceConnectionInfo", + "value": "Keep a low impact background connection to Telegram for reliable notifications." + }, + "NotificationsServiceInfo": { + "key": "NotificationsServiceInfo", + "value": "Relaunch app when shut down. Enable for reliable notifications." + }, + "NotificationsSilent": { + "key": "NotificationsSilent", + "value": "Silent" + }, + "NotificationsTurnOff": { + "key": "NotificationsTurnOff", + "value": "Turn Off" + }, + "NotificationsTurnOn": { + "key": "NotificationsTurnOn", + "value": "Turn On" + }, + "NotificationsUnmuted": { + "key": "NotificationsUnmuted", + "value": "Unmuted" + }, + "NotificationsUnmutedHint": { + "key": "NotificationsUnmutedHint", + "value": "Notifications unmuted" + }, + "November": { + "key": "November", + "value": "November" + }, + "NowInContacts": { + "key": "NowInContacts", + "value": "%1$s is now in your contact list." + }, + "NumberUnknown": { + "key": "NumberUnknown", + "value": "Unknown" + }, + "OK": { + "key": "OK", + "value": "OK" + }, + "October": { + "key": "October", + "value": "October" + }, + "Of": { + "key": "Of", + "value": "%1$d of %2$d" + }, + "OfCounted": { + "key": "OfCounted", + "value": "**%1$d** of %2$d" + }, + "OneResult": { + "key": "OneResult", + "value": "1 result" + }, + "Online": { + "key": "Online", + "value": "online" + }, + "OnlineCount": { + "key": "OnlineCount", + "zeroValue": null, + "oneValue": "%1$d online", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d online" + }, + "OnlyIfSilent": { + "key": "OnlyIfSilent", + "value": "Only if silent" + }, + "OnlyWhenScreenOff": { + "key": "OnlyWhenScreenOff", + "value": "Only when screen \"off\"" + }, + "OnlyWhenScreenOn": { + "key": "OnlyWhenScreenOn", + "value": "Only when screen \"on\"" + }, + "Open": { + "key": "Open", + "value": "Open" + }, + "OpenBackground": { + "key": "OpenBackground", + "value": "VIEW BACKGROUND" + }, + "OpenChannel": { + "key": "OpenChannel", + "value": "VIEW CHANNEL" + }, + "OpenChannel2": { + "key": "OpenChannel2", + "value": "Open Channel" + }, + "OpenFile": { + "key": "OpenFile", + "value": "OPEN FILE" + }, + "OpenGroup": { + "key": "OpenGroup", + "value": "VIEW GROUP" + }, + "OpenGroup2": { + "key": "OpenGroup2", + "value": "Open Group" + }, + "OpenInBrowser": { + "key": "OpenInBrowser", + "value": "OPEN IN..." + }, + "OpenInEditor": { + "key": "OpenInEditor", + "value": "Open in editor" + }, + "OpenInExternalApp": { + "key": "OpenInExternalApp", + "value": "Open in..." + }, + "OpenMessage": { + "key": "OpenMessage", + "value": "VIEW MESSAGE" + }, + "OpenProfile": { + "key": "OpenProfile", + "value": "Open Profile" + }, + "OpenTheme": { + "key": "OpenTheme", + "value": "VIEW THEME" + }, + "OpenUrlAlert": { + "key": "OpenUrlAlert", + "value": "Open URL %1$s?" + }, + "OpenUrlAlert2": { + "key": "OpenUrlAlert2", + "value": "Do you want to open %1$s?" + }, + "OpenUrlOption1": { + "key": "OpenUrlOption1", + "value": "Log in to %1$s as **%2$s**" + }, + "OpenUrlOption2": { + "key": "OpenUrlOption2", + "value": "Allow **%1$s** to send me messages" + }, + "OpenUrlTitle": { + "key": "OpenUrlTitle", + "value": "Open Link" + }, + "Option": { + "key": "Option", + "zeroValue": null, + "oneValue": "%1$d more option", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d more options" + }, + "OptionHint": { + "key": "OptionHint", + "value": "Option" + }, + "Orange": { + "key": "Orange", + "value": "Orange" + }, + "OtherLoginCode": { + "key": "OtherLoginCode", + "value": "Your login code is **%1$s**. Enter it in the Telegram app where you are trying to log in.\n\nDo not give this code to anyone." + }, + "OtherSessions": { + "key": "OtherSessions", + "value": "Active sessions" + }, + "OtherStickers": { + "key": "OtherStickers", + "value": "More Stickers" + }, + "OtherWebSessions": { + "key": "OtherWebSessions", + "value": "Connected websites" + }, + "OutgoingCalls": { + "key": "OutgoingCalls", + "value": "Outgoing calls" + }, + "P2PContacts": { + "key": "P2PContacts", + "value": "My Contacts" + }, + "P2PContactsMinus": { + "key": "P2PContactsMinus", + "value": "My Contacts (-%1$d)" + }, + "P2PContactsMinusPlus": { + "key": "P2PContactsMinusPlus", + "value": "My Contacts (-%1$d, +%2$d)" + }, + "P2PContactsPlus": { + "key": "P2PContactsPlus", + "value": "My Contacts (+%1$d)" + }, + "P2PEnabledWith": { + "key": "P2PEnabledWith", + "value": "Use peer-to-peer with" + }, + "P2PEverybody": { + "key": "P2PEverybody", + "value": "Everybody" + }, + "P2PEverybodyMinus": { + "key": "P2PEverybodyMinus", + "value": "Everybody (-%1$d)" + }, + "P2PNobody": { + "key": "P2PNobody", + "value": "Nobody" + }, + "P2PNobodyPlus": { + "key": "P2PNobodyPlus", + "value": "Nobody (+%1$d)" + }, + "Page1Message": { + "key": "Page1Message", + "value": "The world's **fastest** messaging app.\nIt is **free** and **secure**." + }, + "Page1Title": { + "key": "Page1Title", + "value": "Telegram" + }, + "Page2Message": { + "key": "Page2Message", + "value": "**Telegram** delivers messages faster than\nany other application." + }, + "Page2Title": { + "key": "Page2Title", + "value": "Fast" + }, + "Page3Message": { + "key": "Page3Message", + "value": "**Telegram** is free forever. No ads.\nNo subscription fees." + }, + "Page3Title": { + "key": "Page3Title", + "value": "Free" + }, + "Page4Message": { + "key": "Page4Message", + "value": "**Telegram** keeps your messages safe\nfrom hacker attacks." + }, + "Page4Title": { + "key": "Page4Title", + "value": "Secure" + }, + "Page5Message": { + "key": "Page5Message", + "value": "**Telegram** has no limits on\nthe size of your media and chats." + }, + "Page5Title": { + "key": "Page5Title", + "value": "Powerful" + }, + "Page6Message": { + "key": "Page6Message", + "value": "**Telegram** lets you access your messages\nfrom multiple devices." + }, + "Page6Title": { + "key": "Page6Title", + "value": "Cloud-Based" + }, + "PaintArrow": { + "key": "PaintArrow", + "value": "Arrow" + }, + "PaintDelete": { + "key": "PaintDelete", + "value": "Delete" + }, + "PaintDuplicate": { + "key": "PaintDuplicate", + "value": "Duplicate" + }, + "PaintEdit": { + "key": "PaintEdit", + "value": "Edit" + }, + "PaintFramed": { + "key": "PaintFramed", + "value": "Framed" + }, + "PaintMarker": { + "key": "PaintMarker", + "value": "Marker" + }, + "PaintNeon": { + "key": "PaintNeon", + "value": "Neon" + }, + "PaintOutlined": { + "key": "PaintOutlined", + "value": "Outlined" + }, + "PaintPen": { + "key": "PaintPen", + "value": "Pen" + }, + "PaintRegular": { + "key": "PaintRegular", + "value": "Regular" + }, + "Participants": { + "key": "Participants", + "zeroValue": null, + "oneValue": "%1$d participant", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d participants" + }, + "Passcode": { + "key": "Passcode", + "value": "Passcode Lock" + }, + "PasscodeDoNotMatch": { + "key": "PasscodeDoNotMatch", + "value": "Passcodes do not match" + }, + "PasscodePIN": { + "key": "PasscodePIN", + "value": "PIN" + }, + "PasscodePassword": { + "key": "PasscodePassword", + "value": "Password" + }, + "PassportAddAddressUploadInfo": { + "key": "PassportAddAddressUploadInfo", + "value": "To confirm your address, please upload a scan or photo of the selected document (all pages)." + }, + "PassportAddAgreement": { + "key": "PassportAddAgreement", + "value": "Add Tenancy Agreement" + }, + "PassportAddAgreementInfo": { + "key": "PassportAddAgreementInfo", + "value": "Upload a scan of your tenancy agreement." + }, + "PassportAddBank": { + "key": "PassportAddBank", + "value": "Add Bank Statement" + }, + "PassportAddBankInfo": { + "key": "PassportAddBankInfo", + "value": "Upload a scan of your bank statement." + }, + "PassportAddBill": { + "key": "PassportAddBill", + "value": "Add Utility Bill" + }, + "PassportAddBillInfo": { + "key": "PassportAddBillInfo", + "value": "Upload a scan of your utility bill." + }, + "PassportAddCard": { + "key": "PassportAddCard", + "value": "Add Identity Card" + }, + "PassportAddDriverLicenceInfo": { + "key": "PassportAddDriverLicenceInfo", + "value": "Upload scans of a certified English translation of your driver's license." + }, + "PassportAddIdentityCardInfo": { + "key": "PassportAddIdentityCardInfo", + "value": "Upload scans of a certified English translation of your identity card." + }, + "PassportAddInternalPassport": { + "key": "PassportAddInternalPassport", + "value": "Add Internal Passport" + }, + "PassportAddInternalPassportInfo": { + "key": "PassportAddInternalPassportInfo", + "value": "Upload scans of a certified English translation of your internal passport." + }, + "PassportAddLicence": { + "key": "PassportAddLicence", + "value": "Add Driver's License" + }, + "PassportAddPassport": { + "key": "PassportAddPassport", + "value": "Add Passport" + }, + "PassportAddPassportInfo": { + "key": "PassportAddPassportInfo", + "value": "Upload scans of a certified English translation of your passport." + }, + "PassportAddPassportRegistration": { + "key": "PassportAddPassportRegistration", + "value": "Passport Registration" + }, + "PassportAddPassportRegistrationInfo": { + "key": "PassportAddPassportRegistrationInfo", + "value": "Upload a scan of your passport registration page." + }, + "PassportAddTemporaryRegistration": { + "key": "PassportAddTemporaryRegistration", + "value": "Temporary Registration" + }, + "PassportAddTemporaryRegistrationInfo": { + "key": "PassportAddTemporaryRegistrationInfo", + "value": "Upload a scan of your temporary registration." + }, + "PassportAddTranslationAgreementInfo": { + "key": "PassportAddTranslationAgreementInfo", + "value": "Upload scans of a certified English translation of your tenancy agreement." + }, + "PassportAddTranslationBankInfo": { + "key": "PassportAddTranslationBankInfo", + "value": "Upload scans of a certified English translation of your bank statement." + }, + "PassportAddTranslationBillInfo": { + "key": "PassportAddTranslationBillInfo", + "value": "Upload scans of a certified English translation of your utility bill." + }, + "PassportAddTranslationPassportRegistrationInfo": { + "key": "PassportAddTranslationPassportRegistrationInfo", + "value": "Upload scans of a certified English translation of your passport registration page." + }, + "PassportAddTranslationTemporaryRegistrationInfo": { + "key": "PassportAddTranslationTemporaryRegistrationInfo", + "value": "Upload scans of a certified English translation of your temporary registration." + }, + "PassportAddTranslationUploadInfo": { + "key": "PassportAddTranslationUploadInfo", + "value": "Upload scans of a certified English translation of the selected document." + }, + "PassportAddress": { + "key": "PassportAddress", + "value": "Address" + }, + "PassportAddressHeader": { + "key": "PassportAddressHeader", + "value": "Address" + }, + "PassportAddressInfo": { + "key": "PassportAddressInfo", + "value": "Upload proof of your address" + }, + "PassportAddressNoUploadInfo": { + "key": "PassportAddressNoUploadInfo", + "value": "Provide your address" + }, + "PassportAuthorize": { + "key": "PassportAuthorize", + "value": "AUTHORIZE" + }, + "PassportBirthdate": { + "key": "PassportBirthdate", + "value": "Date of Birth" + }, + "PassportCitizenship": { + "key": "PassportCitizenship", + "value": "Citizenship" + }, + "PassportCity": { + "key": "PassportCity", + "value": "City" + }, + "PassportCorrectErrors": { + "key": "PassportCorrectErrors", + "value": "Tap to correct errors." + }, + "PassportCountry": { + "key": "PassportCountry", + "value": "Country" + }, + "PassportDeleteAddressAlert": { + "key": "PassportDeleteAddressAlert", + "value": "Do you want to delete address details?" + }, + "PassportDeleteDocument": { + "key": "PassportDeleteDocument", + "value": "Delete Document" + }, + "PassportDeleteDocumentAddress": { + "key": "PassportDeleteDocumentAddress", + "value": "Delete address details" + }, + "PassportDeleteDocumentAlert": { + "key": "PassportDeleteDocumentAlert", + "value": "Do you want to delete this document?" + }, + "PassportDeleteDocumentPersonal": { + "key": "PassportDeleteDocumentPersonal", + "value": "Delete personal details" + }, + "PassportDeleteEmailAlert": { + "key": "PassportDeleteEmailAlert", + "value": "Delete email?" + }, + "PassportDeleteInfo": { + "key": "PassportDeleteInfo", + "value": "Delete" + }, + "PassportDeletePersonalAlert": { + "key": "PassportDeletePersonalAlert", + "value": "Are you sure you want to delete personal details?" + }, + "PassportDeletePhoneAlert": { + "key": "PassportDeletePhoneAlert", + "value": "Delete phone number?" + }, + "PassportDeleteScan": { + "key": "PassportDeleteScan", + "value": "Delete scan?" + }, + "PassportDeleteScanAlert": { + "key": "PassportDeleteScanAlert", + "value": "Do you want to delete this scan?" + }, + "PassportDeleteSelfie": { + "key": "PassportDeleteSelfie", + "value": "Delete selfie?" + }, + "PassportDeleteSelfieAlert": { + "key": "PassportDeleteSelfieAlert", + "value": "Do you want to delete this selfie?" + }, + "PassportDiscard": { + "key": "PassportDiscard", + "value": "Discard" + }, + "PassportDiscardChanges": { + "key": "PassportDiscardChanges", + "value": "Are you sure you want to discard all information you've entered?" + }, + "PassportDocument": { + "key": "PassportDocument", + "value": "Document Details" + }, + "PassportDocumentNumber": { + "key": "PassportDocumentNumber", + "value": "Document Number" + }, + "PassportDocuments": { + "key": "PassportDocuments", + "value": "Scans" + }, + "PassportEmail": { + "key": "PassportEmail", + "value": "Email" + }, + "PassportEmailCode": { + "key": "PassportEmailCode", + "value": "Code" + }, + "PassportEmailInfo": { + "key": "PassportEmailInfo", + "value": "Enter your email address" + }, + "PassportEmailUploadInfo": { + "key": "PassportEmailUploadInfo", + "value": "Note: You will receive a confirmation code on the email address you provide." + }, + "PassportEmailVerifyInfo": { + "key": "PassportEmailVerifyInfo", + "value": "Please enter the confirmation code we've just sent to %1$s." + }, + "PassportExpired": { + "key": "PassportExpired", + "value": "Expiry Date" + }, + "PassportFemale": { + "key": "PassportFemale", + "value": "Female" + }, + "PassportFrontSide": { + "key": "PassportFrontSide", + "value": "Front Side" + }, + "PassportFrontSideInfo": { + "key": "PassportFrontSideInfo", + "value": "Upload a photo of the front side of the document" + }, + "PassportGender": { + "key": "PassportGender", + "value": "Gender" + }, + "PassportIdentityDocument": { + "key": "PassportIdentityDocument", + "value": "Identity Document" + }, + "PassportIdentityDocumentInfo": { + "key": "PassportIdentityDocumentInfo", + "value": "Upload a scan of your passport or other ID" + }, + "PassportIdentityDriverLicence": { + "key": "PassportIdentityDriverLicence", + "value": "Upload a scan of your driver's license" + }, + "PassportIdentityID": { + "key": "PassportIdentityID", + "value": "Upload a scan of your identity card" + }, + "PassportIdentityInternalPassport": { + "key": "PassportIdentityInternalPassport", + "value": "Upload a scan of your internal passport" + }, + "PassportIdentityPassport": { + "key": "PassportIdentityPassport", + "value": "Upload a scan of your passport" + }, + "PassportInfo": { + "key": "PassportInfo", + "value": "With Telegram Passport you can easily sign up for websites and services that require identity verification.\n\nYour information, personal data, and documents are protected by end-to-end encryption. Nobody, including Telegram, can access them without your permission.\n\nYou can visit our FAQ to learn more." + }, + "PassportInfo2": { + "key": "PassportInfo2", + "value": "With Telegram Passport you can easily sign up for websites and services that require identity verification.\n\nYour information, personal data, and documents are protected by end-to-end encryption. Nobody, including Telegram, can access them without your permission.\n\nYou can visit our *FAQ* to learn more." + }, + "PassportInfoTitle": { + "key": "PassportInfoTitle", + "value": "What is Telegram Passport?" + }, + "PassportInfoUrl": { + "key": "PassportInfoUrl", + "value": "https://telegram.org/faq#passport" + }, + "PassportLanguage_AR": { + "key": "PassportLanguage_AR", + "value": "Arabic" + }, + "PassportLanguage_AZ": { + "key": "PassportLanguage_AZ", + "value": "Azerbaijani" + }, + "PassportLanguage_BG": { + "key": "PassportLanguage_BG", + "value": "Bulgarian" + }, + "PassportLanguage_BN": { + "key": "PassportLanguage_BN", + "value": "Bangla" + }, + "PassportLanguage_CS": { + "key": "PassportLanguage_CS", + "value": "Czech" + }, + "PassportLanguage_DA": { + "key": "PassportLanguage_DA", + "value": "Danish" + }, + "PassportLanguage_DE": { + "key": "PassportLanguage_DE", + "value": "German" + }, + "PassportLanguage_DV": { + "key": "PassportLanguage_DV", + "value": "Divehi" + }, + "PassportLanguage_DZ": { + "key": "PassportLanguage_DZ", + "value": "Dzongkha" + }, + "PassportLanguage_EL": { + "key": "PassportLanguage_EL", + "value": "Greek" + }, + "PassportLanguage_ES": { + "key": "PassportLanguage_ES", + "value": "Spanish" + }, + "PassportLanguage_ET": { + "key": "PassportLanguage_ET", + "value": "Estonian" + }, + "PassportLanguage_FA": { + "key": "PassportLanguage_FA", + "value": "Persian" + }, + "PassportLanguage_FR": { + "key": "PassportLanguage_FR", + "value": "French" + }, + "PassportLanguage_HE": { + "key": "PassportLanguage_HE", + "value": "Hebrew" + }, + "PassportLanguage_HR": { + "key": "PassportLanguage_HR", + "value": "Croatian" + }, + "PassportLanguage_HU": { + "key": "PassportLanguage_HU", + "value": "Hungarian" + }, + "PassportLanguage_HY": { + "key": "PassportLanguage_HY", + "value": "Armenian" + }, + "PassportLanguage_ID": { + "key": "PassportLanguage_ID", + "value": "Indonesian" + }, + "PassportLanguage_IS": { + "key": "PassportLanguage_IS", + "value": "Icelandic" + }, + "PassportLanguage_IT": { + "key": "PassportLanguage_IT", + "value": "Italian" + }, + "PassportLanguage_JA": { + "key": "PassportLanguage_JA", + "value": "Japanese" + }, + "PassportLanguage_KA": { + "key": "PassportLanguage_KA", + "value": "Georgian" + }, + "PassportLanguage_KM": { + "key": "PassportLanguage_KM", + "value": "Khmer" + }, + "PassportLanguage_KO": { + "key": "PassportLanguage_KO", + "value": "Korean" + }, + "PassportLanguage_LO": { + "key": "PassportLanguage_LO", + "value": "Lao" + }, + "PassportLanguage_LT": { + "key": "PassportLanguage_LT", + "value": "Lithuanian" + }, + "PassportLanguage_LV": { + "key": "PassportLanguage_LV", + "value": "Latvian" + }, + "PassportLanguage_MK": { + "key": "PassportLanguage_MK", + "value": "Macedonian" + }, + "PassportLanguage_MN": { + "key": "PassportLanguage_MN", + "value": "Mongolian" + }, + "PassportLanguage_MS": { + "key": "PassportLanguage_MS", + "value": "Malay" + }, + "PassportLanguage_MY": { + "key": "PassportLanguage_MY", + "value": "Burmese" + }, + "PassportLanguage_NE": { + "key": "PassportLanguage_NE", + "value": "Nepali" + }, + "PassportLanguage_NL": { + "key": "PassportLanguage_NL", + "value": "Dutch" + }, + "PassportLanguage_PL": { + "key": "PassportLanguage_PL", + "value": "Polish" + }, + "PassportLanguage_PT": { + "key": "PassportLanguage_PT", + "value": "Portuguese" + }, + "PassportLanguage_RO": { + "key": "PassportLanguage_RO", + "value": "Romanian" + }, + "PassportLanguage_RU": { + "key": "PassportLanguage_RU", + "value": "Russian" + }, + "PassportLanguage_SK": { + "key": "PassportLanguage_SK", + "value": "Slovak" + }, + "PassportLanguage_SL": { + "key": "PassportLanguage_SL", + "value": "Slovenian" + }, + "PassportLanguage_TH": { + "key": "PassportLanguage_TH", + "value": "Thai" + }, + "PassportLanguage_TK": { + "key": "PassportLanguage_TK", + "value": "Turkmen" + }, + "PassportLanguage_TR": { + "key": "PassportLanguage_TR", + "value": "Turkish" + }, + "PassportLanguage_UK": { + "key": "PassportLanguage_UK", + "value": "Ukrainian" + }, + "PassportLanguage_UZ": { + "key": "PassportLanguage_UZ", + "value": "Uzbek" + }, + "PassportLanguage_VI": { + "key": "PassportLanguage_VI", + "value": "Vietnamese" + }, + "PassportMainPage": { + "key": "PassportMainPage", + "value": "Main Page" + }, + "PassportMainPageInfo": { + "key": "PassportMainPageInfo", + "value": "Upload a photo of the main page of the document" + }, + "PassportMale": { + "key": "PassportMale", + "value": "Male" + }, + "PassportMidname": { + "key": "PassportMidname", + "value": "Middle name" + }, + "PassportMidnameCountry": { + "key": "PassportMidnameCountry", + "value": "Middle name (%1$s)" + }, + "PassportMidnameLatin": { + "key": "PassportMidnameLatin", + "value": "Middle name (latin)" + }, + "PassportName": { + "key": "PassportName", + "value": "Name" + }, + "PassportNameCheckAlert": { + "key": "PassportNameCheckAlert", + "value": "Please check if this name is correct:\n\n%1$s %2$s %3$s" + }, + "PassportNameCountry": { + "key": "PassportNameCountry", + "value": "Name (%1$s)" + }, + "PassportNameLatin": { + "key": "PassportNameLatin", + "value": "Name (latin)" + }, + "PassportNativeHeader": { + "key": "PassportNativeHeader", + "value": "Your name" + }, + "PassportNativeHeaderLang": { + "key": "PassportNativeHeaderLang", + "value": "Your name in %1$s" + }, + "PassportNativeInfo": { + "key": "PassportNativeInfo", + "value": "Your name in the language of your country of residence (%1$s)." + }, + "PassportNoDocuments": { + "key": "PassportNoDocuments", + "value": "You have no documents yet" + }, + "PassportNoDocumentsAdd": { + "key": "PassportNoDocumentsAdd", + "value": "Add a Document" + }, + "PassportNoDocumentsInfo": { + "key": "PassportNoDocumentsInfo", + "value": "You can add your phone number, email address, identity document or residential address." + }, + "PassportNoExpireDate": { + "key": "PassportNoExpireDate", + "value": "None" + }, + "PassportNoPolicy": { + "key": "PassportNoPolicy", + "value": "You are sending your documents directly to %1$s and allowing their @%2$s to send you messages." + }, + "PassportPersonal": { + "key": "PassportPersonal", + "value": "Personal Details" + }, + "PassportPersonalDetails": { + "key": "PassportPersonalDetails", + "value": "Personal Details" + }, + "PassportPersonalDetailsInfo": { + "key": "PassportPersonalDetailsInfo", + "value": "Fill in your personal details" + }, + "PassportPersonalUploadInfo": { + "key": "PassportPersonalUploadInfo", + "value": "The document must contain your photograph, first and last name, date of birth, document number, country of issue, and expiry date." + }, + "PassportPhone": { + "key": "PassportPhone", + "value": "Phone Number" + }, + "PassportPhoneInfo": { + "key": "PassportPhoneInfo", + "value": "Enter your phone number" + }, + "PassportPhoneUploadInfo": { + "key": "PassportPhoneUploadInfo", + "value": "Note: You will receive a confirmation code on the phone number you provide." + }, + "PassportPhoneUseOther": { + "key": "PassportPhoneUseOther", + "value": "Or enter a new phone number" + }, + "PassportPhoneUseSame": { + "key": "PassportPhoneUseSame", + "value": "Use %1$s" + }, + "PassportPhoneUseSameEmailInfo": { + "key": "PassportPhoneUseSameEmailInfo", + "value": "Use the same email as on Telegram." + }, + "PassportPhoneUseSameInfo": { + "key": "PassportPhoneUseSameInfo", + "value": "Use the same phone number as on Telegram." + }, + "PassportPolicy": { + "key": "PassportPolicy", + "value": "You accept the *%1$s Privacy Policy* and allow their @%2$s to send you messages." + }, + "PassportPostcode": { + "key": "PassportPostcode", + "value": "Postcode" + }, + "PassportProvidedInformation": { + "key": "PassportProvidedInformation", + "value": "Provided Information" + }, + "PassportRequest": { + "key": "PassportRequest", + "value": "**%1$s** requests access to your personal data to sign you up for their services." + }, + "PassportRequestPasswordInfo": { + "key": "PassportRequestPasswordInfo", + "value": "Enter your Telegram Password to decrypt your data." + }, + "PassportRequestedInformation": { + "key": "PassportRequestedInformation", + "value": "Requested Information" + }, + "PassportRequiredDocuments": { + "key": "PassportRequiredDocuments", + "value": "Required Documents" + }, + "PassportResidence": { + "key": "PassportResidence", + "value": "Residence" + }, + "PassportResidentialAddress": { + "key": "PassportResidentialAddress", + "value": "Residential Address" + }, + "PassportReverseSide": { + "key": "PassportReverseSide", + "value": "Reverse Side" + }, + "PassportReverseSideInfo": { + "key": "PassportReverseSideInfo", + "value": "Upload a photo of the reverse side of the document" + }, + "PassportSDK_Cancel": { + "key": "PassportSDK_Cancel", + "value": "Cancel" + }, + "PassportSDK_DownloadTelegram": { + "key": "PassportSDK_DownloadTelegram", + "value": "You need Telegram to log in to **%s**. Would you like to install it now?" + }, + "PassportSDK_LogInWithTelegram": { + "key": "PassportSDK_LogInWithTelegram", + "value": "Log in with Telegram" + }, + "PassportSDK_OpenGooglePlay": { + "key": "PassportSDK_OpenGooglePlay", + "value": "Open Google Play" + }, + "PassportSDK_TelegramPassport": { + "key": "PassportSDK_TelegramPassport", + "value": "Telegram Passport" + }, + "PassportScanPassport": { + "key": "PassportScanPassport", + "value": "Scan Your Passport" + }, + "PassportScanPassportInfo": { + "key": "PassportScanPassportInfo", + "value": "Scan your passport or identity card's machine-readable zone to fill in your details automatically." + }, + "PassportSelectBithdayDate": { + "key": "PassportSelectBithdayDate", + "value": "Select Date of Birth" + }, + "PassportSelectExpiredDate": { + "key": "PassportSelectExpiredDate", + "value": "Select Expiry Date" + }, + "PassportSelectGender": { + "key": "PassportSelectGender", + "value": "Select Gender" + }, + "PassportSelectNotExpire": { + "key": "PassportSelectNotExpire", + "value": "Does not Expire" + }, + "PassportSelfRequest": { + "key": "PassportSelfRequest", + "value": "Please enter your password to access your personal data." + }, + "PassportSelfie": { + "key": "PassportSelfie", + "value": "Selfie" + }, + "PassportSelfieInfo": { + "key": "PassportSelfieInfo", + "value": "Upload a selfie of yourself holding the document" + }, + "PassportState": { + "key": "PassportState", + "value": "State/Region" + }, + "PassportStreet1": { + "key": "PassportStreet1", + "value": "Street" + }, + "PassportStreet2": { + "key": "PassportStreet2", + "value": "Street" + }, + "PassportSurname": { + "key": "PassportSurname", + "value": "Last name" + }, + "PassportSurnameCountry": { + "key": "PassportSurnameCountry", + "value": "Last name (%1$s)" + }, + "PassportSurnameLatin": { + "key": "PassportSurnameLatin", + "value": "Last name (latin)" + }, + "PassportTranslation": { + "key": "PassportTranslation", + "value": "Translation" + }, + "PassportTwoDocuments": { + "key": "PassportTwoDocuments", + "value": "%1$s or %2$s" + }, + "PassportUploadAdditinalDocument": { + "key": "PassportUploadAdditinalDocument", + "value": "Upload Additional Scans" + }, + "PassportUploadDocument": { + "key": "PassportUploadDocument", + "value": "Upload Scans" + }, + "PassportUploadMaxReached": { + "key": "PassportUploadMaxReached", + "value": "You can't upload more than %1$s." + }, + "PassportUploadNotImage": { + "key": "PassportUploadNotImage", + "value": "You can only upload image files." + }, + "PassportUseLatinOnly": { + "key": "PassportUseLatinOnly", + "value": "Please use latin characters only." + }, + "PasswordAsHintError": { + "key": "PasswordAsHintError", + "value": "Hint must be different from your password" + }, + "PasswordCode": { + "key": "PasswordCode", + "value": "Code" + }, + "PasswordDoNotMatch": { + "key": "PasswordDoNotMatch", + "value": "Passwords do not match" + }, + "PasswordEmailInvalid": { + "key": "PasswordEmailInvalid", + "value": "Invalid email address. Please check that you've entered it correctly and try again." + }, + "PasswordHint": { + "key": "PasswordHint", + "value": "Password Hint" + }, + "PasswordHintPlaceholder": { + "key": "PasswordHintPlaceholder", + "value": "Hint" + }, + "PasswordHintText": { + "key": "PasswordHintText", + "value": "Create a hint for your password" + }, + "PasswordOff": { + "key": "PasswordOff", + "value": "Off" + }, + "PasswordOn": { + "key": "PasswordOn", + "value": "On" + }, + "PasswordRecovery": { + "key": "PasswordRecovery", + "value": "Password Recovery" + }, + "PasswordReset": { + "key": "PasswordReset", + "value": "Password deactivated" + }, + "PasteFromClipboard": { + "key": "PasteFromClipboard", + "value": "Paste from clipboard" + }, + "PaymentBillingAddress": { + "key": "PaymentBillingAddress", + "value": "Billing address" + }, + "PaymentCardCvv": { + "key": "PaymentCardCvv", + "value": "Security Code (CVV)" + }, + "PaymentCardExpireDate": { + "key": "PaymentCardExpireDate", + "value": "MM/YY" + }, + "PaymentCardInfo": { + "key": "PaymentCardInfo", + "value": "Payment Info" + }, + "PaymentCardName": { + "key": "PaymentCardName", + "value": "First and Last Name" + }, + "PaymentCardNumber": { + "key": "PaymentCardNumber", + "value": "Card Number" + }, + "PaymentCardSavePaymentInformation": { + "key": "PaymentCardSavePaymentInformation", + "value": "Save Payment Information" + }, + "PaymentCardSavePaymentInformationInfoLine1": { + "key": "PaymentCardSavePaymentInformationInfoLine1", + "value": "You can save your payment info for future use." + }, + "PaymentCardSavePaymentInformationInfoLine2": { + "key": "PaymentCardSavePaymentInformationInfoLine2", + "value": "Please *turn on Two-Step Verification* to enable this." + }, + "PaymentCardTitle": { + "key": "PaymentCardTitle", + "value": "Payment card" + }, + "PaymentCheckout": { + "key": "PaymentCheckout", + "value": "Checkout" + }, + "PaymentCheckoutEmail": { + "key": "PaymentCheckoutEmail", + "value": "Contact address" + }, + "PaymentCheckoutMethod": { + "key": "PaymentCheckoutMethod", + "value": "Payment method" + }, + "PaymentCheckoutName": { + "key": "PaymentCheckoutName", + "value": "Name" + }, + "PaymentCheckoutPay": { + "key": "PaymentCheckoutPay", + "value": "PAY %1$s" + }, + "PaymentCheckoutPhoneNumber": { + "key": "PaymentCheckoutPhoneNumber", + "value": "Phone number" + }, + "PaymentCheckoutProvider": { + "key": "PaymentCheckoutProvider", + "value": "Payment provider" + }, + "PaymentCheckoutShippingMethod": { + "key": "PaymentCheckoutShippingMethod", + "value": "Shipping method" + }, + "PaymentConfirmationMessage": { + "key": "PaymentConfirmationMessage", + "value": "Your card %1$s is on file. To pay with this card, please enter your 2-Step-Verification password." + }, + "PaymentConfirmationNewCard": { + "key": "PaymentConfirmationNewCard", + "value": "Choose a different card" + }, + "PaymentConnectionFailed": { + "key": "PaymentConnectionFailed", + "value": "Unable to reach payment server. Please check your internet connection and try again." + }, + "PaymentEmailToProvider": { + "key": "PaymentEmailToProvider", + "value": "Email address will be passed to %1$s as billing info." + }, + "PaymentFailed": { + "key": "PaymentFailed", + "value": "Sorry, the payment was declined." + }, + "PaymentInvoice": { + "key": "PaymentInvoice", + "value": "INVOICE" + }, + "PaymentNoShippingMethod": { + "key": "PaymentNoShippingMethod", + "value": "Sorry, it is not possible to deliver to your address." + }, + "PaymentPassword": { + "key": "PaymentPassword", + "value": "Password & Email" + }, + "PaymentPasswordEmail": { + "key": "PaymentPasswordEmail", + "value": "Your email address" + }, + "PaymentPasswordEmailInfo": { + "key": "PaymentPasswordEmailInfo", + "value": "Please enter a valid email address. It is the only way to recover a forgotten password." + }, + "PaymentPasswordEmailTitle": { + "key": "PaymentPasswordEmailTitle", + "value": "Recovery email" + }, + "PaymentPasswordEnter": { + "key": "PaymentPasswordEnter", + "value": "Enter a password" + }, + "PaymentPasswordInfo": { + "key": "PaymentPasswordInfo", + "value": "Please create a password to protect your payment info. You'll be asked to enter it when you log in." + }, + "PaymentPasswordReEnter": { + "key": "PaymentPasswordReEnter", + "value": "Re-enter your password" + }, + "PaymentPasswordTitle": { + "key": "PaymentPasswordTitle", + "value": "Password" + }, + "PaymentPhoneEmailToProvider": { + "key": "PaymentPhoneEmailToProvider", + "value": "Phone and email address will be passed to %1$s as billing info." + }, + "PaymentPhoneToProvider": { + "key": "PaymentPhoneToProvider", + "value": "Phone will be passed to %1$s as billing info." + }, + "PaymentPrecheckoutFailed": { + "key": "PaymentPrecheckoutFailed", + "value": "Sorry, the payment was cancelled by the bot." + }, + "PaymentReceipt": { + "key": "PaymentReceipt", + "value": "Receipt" + }, + "PaymentShippingAddress": { + "key": "PaymentShippingAddress", + "value": "Shipping address" + }, + "PaymentShippingAddress1Placeholder": { + "key": "PaymentShippingAddress1Placeholder", + "value": "Address 1 (Street)" + }, + "PaymentShippingAddress2Placeholder": { + "key": "PaymentShippingAddress2Placeholder", + "value": "Address 2 (Street)" + }, + "PaymentShippingCityPlaceholder": { + "key": "PaymentShippingCityPlaceholder", + "value": "City" + }, + "PaymentShippingCountry": { + "key": "PaymentShippingCountry", + "value": "Country" + }, + "PaymentShippingEmailPlaceholder": { + "key": "PaymentShippingEmailPlaceholder", + "value": "Email" + }, + "PaymentShippingInfo": { + "key": "PaymentShippingInfo", + "value": "Shipping Information" + }, + "PaymentShippingMethod": { + "key": "PaymentShippingMethod", + "value": "Shipping methods" + }, + "PaymentShippingName": { + "key": "PaymentShippingName", + "value": "Full Name" + }, + "PaymentShippingPhoneNumber": { + "key": "PaymentShippingPhoneNumber", + "value": "Phone Number" + }, + "PaymentShippingReceiver": { + "key": "PaymentShippingReceiver", + "value": "Receiver" + }, + "PaymentShippingSave": { + "key": "PaymentShippingSave", + "value": "Save Shipping Information" + }, + "PaymentShippingSaveInfo": { + "key": "PaymentShippingSaveInfo", + "value": "You can save your shipping info for future use." + }, + "PaymentShippingStatePlaceholder": { + "key": "PaymentShippingStatePlaceholder", + "value": "State" + }, + "PaymentShippingZipPlaceholder": { + "key": "PaymentShippingZipPlaceholder", + "value": "Postcode" + }, + "PaymentSuccessfullyPaid": { + "key": "PaymentSuccessfullyPaid", + "value": "You successfully transferred %1$s to %2$s for %3$s" + }, + "PaymentSuccessfullyPaidNoItem": { + "key": "PaymentSuccessfullyPaidNoItem", + "value": "You successfully transferred %1$s to %2$s" + }, + "PaymentTestInvoice": { + "key": "PaymentTestInvoice", + "value": "TEST INVOICE" + }, + "PaymentTransactionMessage": { + "key": "PaymentTransactionMessage", + "value": "Do you really want to transfer %1$s to the %2$s bot for %3$s?" + }, + "PaymentTransactionReview": { + "key": "PaymentTransactionReview", + "value": "Transaction Review" + }, + "PaymentTransactionTotal": { + "key": "PaymentTransactionTotal", + "value": "Total" + }, + "PaymentWarning": { + "key": "PaymentWarning", + "value": "Warning" + }, + "PaymentWarningText": { + "key": "PaymentWarningText", + "value": "Neither Telegram, nor %1$s will have access to your credit card information. Credit card details will be handled only by the payment system, %2$s.\n\nPayments will go directly to the developer of %1$s. Telegram cannot provide any guarantees, so proceed at your own risk. In case of problems, please contact the developer of %1$s or your bank." + }, + "PendingEmailText": { + "key": "PendingEmailText", + "value": "Your recovery email %1$s is not yet active and pending confirmation." + }, + "PeopleCanJoinViaLink": { + "key": "PeopleCanJoinViaLink", + "value": "%s people can join via this link" + }, + "PeopleJoined": { + "key": "PeopleJoined", + "zeroValue": null, + "oneValue": "%1$d people joined", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d people joined" + }, + "PeopleJoinedRemaining": { + "key": "PeopleJoinedRemaining", + "zeroValue": null, + "oneValue": "%1$d remaining", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d remaining" + }, + "PeopleNearby": { + "key": "PeopleNearby", + "value": "People Nearby" + }, + "PeopleNearbyAccessInfo": { + "key": "PeopleNearbyAccessInfo", + "value": "Quickly add people nearby who are viewing this section and discover local group chats.\n\nPlease switch on location access to enable this feature." + }, + "PeopleNearbyAllowAccess": { + "key": "PeopleNearbyAllowAccess", + "value": "Allow Access" + }, + "PeopleNearbyEmpty": { + "key": "PeopleNearbyEmpty", + "value": "Looking for users around you..." + }, + "PeopleNearbyGps": { + "key": "PeopleNearbyGps", + "value": "Turn On" + }, + "PeopleNearbyGpsInfo": { + "key": "PeopleNearbyGpsInfo", + "value": "Quickly add people nearby who are also viewing this section and discover local group chats.\n\nPlease turn on location services to enable this feature." + }, + "PeopleNearbyHeader": { + "key": "PeopleNearbyHeader", + "value": "People nearby" + }, + "PeopleNearbyInfo": { + "key": "PeopleNearbyInfo", + "value": "Ask your friend nearby to open this page to exchange phone numbers." + }, + "PeopleNearbyInfo2": { + "key": "PeopleNearbyInfo2", + "value": "Exchange contact info with people nearby and find new friends." + }, + "Permanent": { + "key": "Permanent", + "value": "Primary link" + }, + "PermanentLinkForThisAdmin": { + "key": "PermanentLinkForThisAdmin", + "value": "Invite link for this admin" + }, + "PermissionBackgroundLocation": { + "key": "PermissionBackgroundLocation", + "value": "To share your live location in this chat, Telegram needs access to your location all the time, including while the app is in the background.\n\nWe will access your location only for the duration you choose, and you can stop sharing it any time. We won't use your location for any purpose other than sharing it in this chat." + }, + "PermissionContacts": { + "key": "PermissionContacts", + "value": "To let you connect with friends across all your devices, your contacts will be continuously synced with Telegram's heavily encrypted cloud servers." + }, + "PermissionDrawAboveOtherApps": { + "key": "PermissionDrawAboveOtherApps", + "value": "Telegram needs access to draw above other apps to play videos in Picture-in-Picture mode." + }, + "PermissionDrawAboveOtherAppsGroupCall": { + "key": "PermissionDrawAboveOtherAppsGroupCall", + "value": "Overlay mode lets you use push-to-talk and see who is talking even when you are outside of Telegram." + }, + "PermissionDrawAboveOtherAppsGroupCallTitle": { + "key": "PermissionDrawAboveOtherAppsGroupCallTitle", + "value": "Voice chat overlay" + }, + "PermissionDrawAboveOtherAppsTitle": { + "key": "PermissionDrawAboveOtherAppsTitle", + "value": "Picture-in-Picture" + }, + "PermissionNoAudio": { + "key": "PermissionNoAudio", + "value": "Telegram needs microphone access so that you can send voice messages." + }, + "PermissionNoAudioVideo": { + "key": "PermissionNoAudioVideo", + "value": "Telegram needs access to your microphone so that you can record videos." + }, + "PermissionNoCamera": { + "key": "PermissionNoCamera", + "value": "Telegram needs camera access so that you can take photos and videos. Please enable it in Settings." + }, + "PermissionNoLocation": { + "key": "PermissionNoLocation", + "value": "Telegram needs access to your location so that you can share it with your friends." + }, + "PermissionNoLocationPosition": { + "key": "PermissionNoLocationPosition", + "value": "Telegram needs access to your location." + }, + "PermissionOpenSettings": { + "key": "PermissionOpenSettings", + "value": "SETTINGS" + }, + "PermissionStorage": { + "key": "PermissionStorage", + "value": "Telegram needs storage access so you can send and save photos, videos, music and other media." + }, + "PermissionXiaomiLockscreen": { + "key": "PermissionXiaomiLockscreen", + "value": "Please allow Telegram to be shown on the lock screen so that calls can work properly." + }, + "Phone": { + "key": "Phone", + "value": "Phone" + }, + "PhoneCopied": { + "key": "PhoneCopied", + "value": "Phone copied to clipboard" + }, + "PhoneHidden": { + "key": "PhoneHidden", + "value": "Unknown" + }, + "PhoneHome": { + "key": "PhoneHome", + "value": "Home" + }, + "PhoneMain": { + "key": "PhoneMain", + "value": "Main" + }, + "PhoneMobile": { + "key": "PhoneMobile", + "value": "Mobile" + }, + "PhoneNumberAlert": { + "key": "PhoneNumberAlert", + "value": "Users will see your new number if they have it in their address book or your privacy settings allow them to see it. You can modify this in Settings > Privacy and Security > Phone number." + }, + "PhoneNumberChange": { + "key": "PhoneNumberChange", + "value": "CHANGE NUMBER" + }, + "PhoneNumberChange2": { + "key": "PhoneNumberChange2", + "value": "Change Number" + }, + "PhoneNumberChangeTitle": { + "key": "PhoneNumberChangeTitle", + "value": "Change number" + }, + "PhoneNumberFlood": { + "key": "PhoneNumberFlood", + "value": "Sorry, you have deleted and re-created your account too many times recently. Please wait for a few days before signing up again." + }, + "PhoneNumberHelp": { + "key": "PhoneNumberHelp", + "value": "You can change your Telegram number here. Your account and all your cloud data — messages, media, contacts, etc. will be moved to the new number." + }, + "PhoneNumberSearch": { + "key": "PhoneNumberSearch", + "value": "Phone number" + }, + "PhoneOther": { + "key": "PhoneOther", + "value": "Other" + }, + "PhoneWork": { + "key": "PhoneWork", + "value": "Work" + }, + "PhotoCaption": { + "key": "PhotoCaption", + "value": "Photo Caption" + }, + "PhotoEditorDiscardAlert": { + "key": "PhotoEditorDiscardAlert", + "value": "Are you sure you want to discard all changes?" + }, + "PhotoSavedHint": { + "key": "PhotoSavedHint", + "value": "Photo saved to gallery" + }, + "PhotoSavedToDownloadsHint": { + "key": "PhotoSavedToDownloadsHint", + "value": "Photo saved to downloads" + }, + "Photos": { + "key": "Photos", + "zeroValue": null, + "oneValue": "%1$d photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d photos" + }, + "PhotosSavedHint": { + "key": "PhotosSavedHint", + "zeroValue": null, + "oneValue": "Photo saved to gallery", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d photos saved to gallery" + }, + "PhotosSelected": { + "key": "PhotosSelected", + "zeroValue": null, + "oneValue": "%1$d photo selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d photos selected" + }, + "PinAlsoFor": { + "key": "PinAlsoFor", + "value": "Also pin for %1$s" + }, + "PinFolderLimitReached": { + "key": "PinFolderLimitReached", + "value": "Sorry, you can't pin any more chats to the top." + }, + "PinInTheList": { + "key": "PinInTheList", + "value": "Pin in the list" + }, + "PinMessage": { + "key": "PinMessage", + "value": "Pin" + }, + "PinMessageAlert": { + "key": "PinMessageAlert", + "value": "Pin this message in the group?" + }, + "PinMessageAlertChannel": { + "key": "PinMessageAlertChannel", + "value": "Do you want to pin this message in this channel?" + }, + "PinMessageAlertChat": { + "key": "PinMessageAlertChat", + "value": "Do you want to pin this message at the top of the chat?" + }, + "PinMessageAlertTitle": { + "key": "PinMessageAlertTitle", + "value": "Pin message" + }, + "PinNotify": { + "key": "PinNotify", + "value": "Notify all members" + }, + "PinOldMessageAlert": { + "key": "PinOldMessageAlert", + "value": "Do you want to pin an older message while leaving a more recent one pinned?" + }, + "PinToTop": { + "key": "PinToTop", + "value": "Pin to top" + }, + "PinToTopLimitReached": { + "key": "PinToTopLimitReached", + "value": "Sorry, you can only pin %1$s in your main list. For more organization, your Archived Chats list allows unlimited pins." + }, + "PinToTopLimitReached2": { + "key": "PinToTopLimitReached2", + "value": "Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive." + }, + "Ping": { + "key": "Ping", + "value": "Ping: %1$d ms" + }, + "Pink": { + "key": "Pink", + "value": "Pink" + }, + "PinnedMessage": { + "key": "PinnedMessage", + "value": "Pinned Message" + }, + "PinnedMessages": { + "key": "PinnedMessages", + "value": "Pinned Messages" + }, + "PinnedMessagesCount": { + "key": "PinnedMessagesCount", + "zeroValue": null, + "oneValue": "Pinned Message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d Pinned Messages" + }, + "PinnedMessagesHidden": { + "key": "PinnedMessagesHidden", + "value": "Pinned messages hidden" + }, + "PinnedMessagesHiddenInfo": { + "key": "PinnedMessagesHiddenInfo", + "value": "Pinned messages will be shown again if a new message is pinned." + }, + "PinnedPoll": { + "key": "PinnedPoll", + "value": "Pinned poll" + }, + "PlacesInThisArea": { + "key": "PlacesInThisArea", + "value": "Places in this area" + }, + "PleaseDownload": { + "key": "PleaseDownload", + "value": "Please download media first" + }, + "PleaseEnterCurrentPassword": { + "key": "PleaseEnterCurrentPassword", + "value": "Enter your password" + }, + "PleaseEnterCurrentPasswordTransfer": { + "key": "PleaseEnterCurrentPasswordTransfer", + "value": "Please enter your password to complete the transfer." + }, + "PleaseEnterFirstPassword": { + "key": "PleaseEnterFirstPassword", + "value": "Enter a password" + }, + "PleaseEnterNewFirstPassword": { + "key": "PleaseEnterNewFirstPassword", + "value": "Enter a new password" + }, + "PleaseEnterPassword": { + "key": "PleaseEnterPassword", + "value": "Enter your new password" + }, + "PleaseLoginPassport": { + "key": "PleaseLoginPassport", + "value": "Please log in to your Telegram account to use Telegram Passport." + }, + "PleaseReEnterPassword": { + "key": "PleaseReEnterPassword", + "value": "Re-enter your password" + }, + "PleaseStreamDownload": { + "key": "PleaseStreamDownload", + "value": "Please wait for the video to be fully downloaded." + }, + "Points": { + "key": "Points", + "zeroValue": null, + "oneValue": "%1$d", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d" + }, + "Poll": { + "key": "Poll", + "value": "Poll" + }, + "PollAnonymous": { + "key": "PollAnonymous", + "value": "Anonymous Voting" + }, + "PollCantForwardSecretChat": { + "key": "PollCantForwardSecretChat", + "value": "Sorry, polls can’t be forwarded to secret chats." + }, + "PollCollapse": { + "key": "PollCollapse", + "value": "Collapse" + }, + "PollExpand": { + "key": "PollExpand", + "value": "Expand" + }, + "PollMultiple": { + "key": "PollMultiple", + "value": "Multiple Answers" + }, + "PollOptions": { + "key": "PollOptions", + "value": "Poll options" + }, + "PollQuestion": { + "key": "PollQuestion", + "value": "Poll question" + }, + "PollQuiz": { + "key": "PollQuiz", + "value": "Quiz Mode" + }, + "PollResults": { + "key": "PollResults", + "value": "Poll Results" + }, + "PollSelectOption": { + "key": "PollSelectOption", + "value": "Select an option first" + }, + "PollSubmitVotes": { + "key": "PollSubmitVotes", + "value": "VOTE" + }, + "PollTapToSelect": { + "key": "PollTapToSelect", + "value": "Tap to choose the correct answer" + }, + "PollViewResults": { + "key": "PollViewResults", + "value": "VIEW RESULTS" + }, + "PopupDisabled": { + "key": "PopupDisabled", + "value": "Disabled" + }, + "PopupEnabled": { + "key": "PopupEnabled", + "value": "Enabled" + }, + "PopupNotification": { + "key": "PopupNotification", + "value": "Popup Notifications" + }, + "PostingMembers": { + "key": "PostingMembers", + "value": "Posting Members" + }, + "PreviewFeedback": { + "key": "PreviewFeedback", + "value": "Report a bug with this preview" + }, + "PreviewFeedback2": { + "key": "PreviewFeedback2", + "value": "Wrong layout?" + }, + "PreviousPinnedMessage": { + "key": "PreviousPinnedMessage", + "value": "Previous Message" + }, + "PrimaryLinkHelp": { + "key": "PrimaryLinkHelp", + "value": "Anyone on Telegram will be able to join your group by following this link." + }, + "PrimaryLinkHelpChannel": { + "key": "PrimaryLinkHelpChannel", + "value": "Anyone on Telegram will be able to join your channel by following this link." + }, + "PriorityInfo": { + "key": "PriorityInfo", + "value": "Higher priority notifications will work even if your phone is in Do Not Disturb mode." + }, + "PrivacyAddAnException": { + "key": "PrivacyAddAnException", + "value": "Add Users or Groups" + }, + "PrivacyAdvanced": { + "key": "PrivacyAdvanced", + "value": "Advanced" + }, + "PrivacyBots": { + "key": "PrivacyBots", + "value": "Bots and websites" + }, + "PrivacyBotsInfo": { + "key": "PrivacyBotsInfo", + "value": "Websites where you used Telegram to log in." + }, + "PrivacyCallsP2PHelp": { + "key": "PrivacyCallsP2PHelp", + "value": "Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may decrease audio and video quality." + }, + "PrivacyCallsP2PTitle": { + "key": "PrivacyCallsP2PTitle", + "value": "Peer-to-Peer" + }, + "PrivacyClearPayment": { + "key": "PrivacyClearPayment", + "value": "Payment info" + }, + "PrivacyClearShipping": { + "key": "PrivacyClearShipping", + "value": "Shipping info" + }, + "PrivacyDeleteCloudDrafts": { + "key": "PrivacyDeleteCloudDrafts", + "value": "Delete All Cloud Drafts" + }, + "PrivacyExceptions": { + "key": "PrivacyExceptions", + "value": "Exceptions" + }, + "PrivacyFloodControlError": { + "key": "PrivacyFloodControlError", + "value": "Sorry, too many requests. Unable to change privacy settings now, please wait." + }, + "PrivacyForwards": { + "key": "PrivacyForwards", + "value": "Forwarded Messages" + }, + "PrivacyForwardsContacts": { + "key": "PrivacyForwardsContacts", + "value": "Link if allowed by the settings below" + }, + "PrivacyForwardsEverybody": { + "key": "PrivacyForwardsEverybody", + "value": "Link to your account" + }, + "PrivacyForwardsInfo": { + "key": "PrivacyForwardsInfo", + "value": "Messages you send will not link back to your account when forwarded by other users." + }, + "PrivacyForwardsInfo2": { + "key": "PrivacyForwardsInfo2", + "value": "You can add users or entire groups as exceptions that will override the settings above." + }, + "PrivacyForwardsMessageLine": { + "key": "PrivacyForwardsMessageLine", + "value": "Reinhardt, we need to find you some new tunes 🎶." + }, + "PrivacyForwardsNobody": { + "key": "PrivacyForwardsNobody", + "value": "Not a link to your account" + }, + "PrivacyForwardsTitle": { + "key": "PrivacyForwardsTitle", + "value": "Who can add a link to my account when forwarding my messages?" + }, + "PrivacyLastSeen": { + "key": "PrivacyLastSeen", + "value": "Last Seen & Online" + }, + "PrivacyP2P": { + "key": "PrivacyP2P", + "value": "Peer-to-Peer in Calls" + }, + "PrivacyP2P2": { + "key": "PrivacyP2P2", + "value": "Use Peer-to-Peer with" + }, + "PrivacyP2PHeader": { + "key": "PrivacyP2PHeader", + "value": "Peer-to-Peer" + }, + "PrivacyPayments": { + "key": "PrivacyPayments", + "value": "Payments" + }, + "PrivacyPaymentsClear": { + "key": "PrivacyPaymentsClear", + "value": "Clear Payment and Shipping Info" + }, + "PrivacyPaymentsClearAlert": { + "key": "PrivacyPaymentsClearAlert", + "value": "Delete your shipping info and instruct all payment providers to remove your saved credit cards? Note that Telegram never stores your credit card data." + }, + "PrivacyPaymentsClearAlertText": { + "key": "PrivacyPaymentsClearAlertText", + "value": "Are you sure you want to clear your payment and shipping info?" + }, + "PrivacyPaymentsClearAlertTitle": { + "key": "PrivacyPaymentsClearAlertTitle", + "value": "Clear payment info" + }, + "PrivacyPaymentsClearInfo": { + "key": "PrivacyPaymentsClearInfo", + "value": "You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data." + }, + "PrivacyPhone": { + "key": "PrivacyPhone", + "value": "Phone Number" + }, + "PrivacyPhoneInfo": { + "key": "PrivacyPhoneInfo", + "value": "Users who have your number saved in their contacts will also see it on Telegram." + }, + "PrivacyPhoneInfo2": { + "key": "PrivacyPhoneInfo2", + "value": "You can add users or entire groups as exceptions that will override the settings above." + }, + "PrivacyPhoneInfo3": { + "key": "PrivacyPhoneInfo3", + "value": "Users who add your number to their contacts will see it on Telegram only if they are your contacts." + }, + "PrivacyPhoneTitle": { + "key": "PrivacyPhoneTitle", + "value": "Who can see my phone number?" + }, + "PrivacyPhoneTitle2": { + "key": "PrivacyPhoneTitle2", + "value": "Who can find me by my number?" + }, + "PrivacyPolicy": { + "key": "PrivacyPolicy", + "value": "Privacy Policy" + }, + "PrivacyPolicyAndTerms": { + "key": "PrivacyPolicyAndTerms", + "value": "Privacy Policy and Terms of Service" + }, + "PrivacyPolicyUrl": { + "key": "PrivacyPolicyUrl", + "value": "https://telegram.org/privacy" + }, + "PrivacyProfilePhoto": { + "key": "PrivacyProfilePhoto", + "value": "Profile Photos" + }, + "PrivacyProfilePhotoInfo": { + "key": "PrivacyProfilePhotoInfo", + "value": "You can restrict who can see your profile photo with granular precision." + }, + "PrivacyProfilePhotoInfo2": { + "key": "PrivacyProfilePhotoInfo2", + "value": "You can add users or entire groups as exceptions that will override the settings above." + }, + "PrivacyProfilePhotoTitle": { + "key": "PrivacyProfilePhotoTitle", + "value": "Who can see my profile photos & videos?" + }, + "PrivacySettings": { + "key": "PrivacySettings", + "value": "Privacy and Security" + }, + "PrivacySettingsChangedAlert": { + "key": "PrivacySettingsChangedAlert", + "value": "You have changed some privacy settings. Apply changes?" + }, + "PrivacyTitle": { + "key": "PrivacyTitle", + "value": "Privacy" + }, + "PrivateShares": { + "key": "PrivateShares", + "value": "Private Shares" + }, + "ProfileJoinChannel": { + "key": "ProfileJoinChannel", + "value": "Join Channel" + }, + "ProfileJoinGroup": { + "key": "ProfileJoinGroup", + "value": "Join Group" + }, + "ProfilePopupNotification": { + "key": "ProfilePopupNotification", + "value": "Popup notifications" + }, + "ProfilePopupNotificationInfo": { + "key": "ProfilePopupNotificationInfo", + "value": "New messages from this contact will appear on your screen when you are not using Telegram." + }, + "ProximityAlertCancelled": { + "key": "ProximityAlertCancelled", + "value": "Proximity alert cancelled" + }, + "ProximityAlertSet": { + "key": "ProximityAlertSet", + "value": "Proximity alert set" + }, + "ProximityAlertSetInfoGroup2": { + "key": "ProximityAlertSetInfoGroup2", + "value": "We will notify you once someone is within %1$s from you." + }, + "ProximityAlertSetInfoUser": { + "key": "ProximityAlertSetInfoUser", + "value": "We will notify you once %1$s is within %2$s from you." + }, + "ProximityTooltioGroup": { + "key": "ProximityTooltioGroup", + "value": "Alert when other members of the group are close" + }, + "ProximityTooltioUser": { + "key": "ProximityTooltioUser", + "value": "Alert when %1$s is close" + }, + "Proxy": { + "key": "Proxy", + "value": "Proxy" + }, + "ProxyConnections": { + "key": "ProxyConnections", + "value": "Connections" + }, + "ProxyDetails": { + "key": "ProxyDetails", + "value": "Proxy Details" + }, + "ProxySettings": { + "key": "ProxySettings", + "value": "Proxy Settings" + }, + "PsaHide": { + "key": "PsaHide", + "value": "Hide" + }, + "PsaHideChatAlertText": { + "key": "PsaHideChatAlertText", + "value": "Are you sure you want to hide this chat?" + }, + "PsaHideChatAlertTitle": { + "key": "PsaHideChatAlertTitle", + "value": "Hide chat" + }, + "PsaInfoDefault": { + "key": "PsaInfoDefault", + "value": "PSA info test" + }, + "PsaInfo_covid": { + "key": "PsaInfo_covid", + "value": "This message provides you with a public service announcement in relation to the ongoing COVID-19 pandemic. Learn more about this initiative at https://telegram.org/blog/coronavirus" + }, + "PsaMessageDefault": { + "key": "PsaMessageDefault", + "value": "Important Notification" + }, + "PsaMessageInfoDefault": { + "key": "PsaMessageInfoDefault", + "value": "This is an important notification." + }, + "PsaMessageInfo_covid": { + "key": "PsaMessageInfo_covid", + "value": "This message provides you with a public service announcement in relation to the ongoing COVID-19 pandemic. Learn more about this initiative at https://telegram.org/blog/coronavirus" + }, + "PsaMessage_covid": { + "key": "PsaMessage_covid", + "value": "COVID-19 Notification" + }, + "PsaTypeDefault": { + "key": "PsaTypeDefault", + "value": "PSA" + }, + "PsaType_covid": { + "key": "PsaType_covid", + "value": "COVID-19" + }, + "PublicChannelsTooMuch": { + "key": "PublicChannelsTooMuch", + "value": "Sorry, the target user has too many public groups or channels already. Please ask them to make one of their existing groups or channels private first." + }, + "PublicLink": { + "key": "PublicLink", + "value": "Public link" + }, + "PublicPoll": { + "key": "PublicPoll", + "value": "Poll" + }, + "PublicPollCantForward": { + "key": "PublicPollCantForward", + "value": "Sorry, polls with visible votes can’t be forwarded to channels." + }, + "PublicShares": { + "key": "PublicShares", + "value": "Public Shares" + }, + "PublicSharesCount": { + "key": "PublicSharesCount", + "zeroValue": null, + "oneValue": "%1$s public share", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s public shares" + }, + "Purple": { + "key": "Purple", + "value": "Purple" + }, + "QRCodeLinkHelpChannel": { + "key": "QRCodeLinkHelpChannel", + "value": "Everyone on Telegram can scan this code to join your channel." + }, + "QRCodeLinkHelpGroup": { + "key": "QRCodeLinkHelpGroup", + "value": "Everyone on Telegram can scan this code to join your group" + }, + "QRCodePermissionNoCamera": { + "key": "QRCodePermissionNoCamera", + "value": "Telegram needs access to your camera so that you can scan QR codes." + }, + "Question": { + "key": "Question", + "value": "Question" + }, + "QuestionHint": { + "key": "QuestionHint", + "value": "Ask a question" + }, + "QuickReplyCustom": { + "key": "QuickReplyCustom", + "value": "Custom Message..." + }, + "QuickReplyDefault1": { + "key": "QuickReplyDefault1", + "value": "Can't talk now. What's up?" + }, + "QuickReplyDefault2": { + "key": "QuickReplyDefault2", + "value": "I'll call you right back." + }, + "QuickReplyDefault3": { + "key": "QuickReplyDefault3", + "value": "I'll call you later." + }, + "QuickReplyDefault4": { + "key": "QuickReplyDefault4", + "value": "Can't talk now. Call me later?" + }, + "QuizAnswers": { + "key": "QuizAnswers", + "value": "Quiz answers" + }, + "QuizInfo": { + "key": "QuizInfo", + "value": "Polls in Quiz Mode have one correct answer. Users can't revoke their answers." + }, + "QuizPoll": { + "key": "QuizPoll", + "value": "Quiz" + }, + "QuizWellDone": { + "key": "QuizWellDone", + "value": "Well done!" + }, + "QuizWellDoneInfo": { + "key": "QuizWellDoneInfo", + "value": "You chose the right answer." + }, + "QuizWrongAnswer": { + "key": "QuizWrongAnswer", + "value": "Wrong answer!" + }, + "QuizWrongAnswerInfo": { + "key": "QuizWrongAnswerInfo", + "value": "You missed the correct option." + }, + "RaiseToSpeak": { + "key": "RaiseToSpeak", + "value": "Raise to Speak" + }, + "RateCallDistorted": { + "key": "RateCallDistorted", + "value": "Speech was distorted" + }, + "RateCallDropped": { + "key": "RateCallDropped", + "value": "Call ended unexpectedly" + }, + "RateCallEcho": { + "key": "RateCallEcho", + "value": "I heard my own voice" + }, + "RateCallInterruptions": { + "key": "RateCallInterruptions", + "value": "The other side kept disappearing" + }, + "RateCallNoise": { + "key": "RateCallNoise", + "value": "I heard background noise" + }, + "RateCallSilentLocal": { + "key": "RateCallSilentLocal", + "value": "I couldn't hear the other side" + }, + "RateCallSilentRemote": { + "key": "RateCallSilentRemote", + "value": "The other side couldn't hear me" + }, + "RateCallVideoDistorted": { + "key": "RateCallVideoDistorted", + "value": "Video was distorted" + }, + "RateCallVideoPixelated": { + "key": "RateCallVideoPixelated", + "value": "Video was pixelated" + }, + "ReEnterYourPasscode": { + "key": "ReEnterYourPasscode", + "value": "Re-enter your new passcode" + }, + "Recent": { + "key": "Recent", + "value": "Recent" + }, + "RecentFiles": { + "key": "RecentFiles", + "value": "Recent files" + }, + "RecentFilesAZ": { + "key": "RecentFilesAZ", + "value": "Files A-Z" + }, + "RecentPosts": { + "key": "RecentPosts", + "value": "Recent posts" + }, + "RecentStickers": { + "key": "RecentStickers", + "value": "Recently Used" + }, + "RecentlyViewed": { + "key": "RecentlyViewed", + "value": "Recently viewed" + }, + "RecentlyViewedHide": { + "key": "RecentlyViewedHide", + "value": "HIDE" + }, + "Recipient": { + "key": "Recipient", + "zeroValue": null, + "oneValue": "%1$d recipient", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d recipients" + }, + "RecordingAudio": { + "key": "RecordingAudio", + "value": "recording voice message..." + }, + "RecordingRound": { + "key": "RecordingRound", + "value": "recording video message..." + }, + "RecoveryEmail": { + "key": "RecoveryEmail", + "value": "Recovery email" + }, + "RecoveryEmailTitle": { + "key": "RecoveryEmailTitle", + "value": "Recovery Email" + }, + "Red": { + "key": "Red", + "value": "Red" + }, + "RegisterText": { + "key": "RegisterText", + "value": "Set up your first and last name" + }, + "RegisterText2": { + "key": "RegisterText2", + "value": "Enter your name and add a profile picture." + }, + "Regular": { + "key": "Regular", + "value": "Regular" + }, + "RemindDayAt": { + "key": "RemindDayAt", + "value": "'Remind on' MMM d 'at' HH:mm" + }, + "RemindDayYearAt": { + "key": "RemindDayYearAt", + "value": "'Remind on' MMM d yyyy 'at' HH:mm" + }, + "RemindTodayAt": { + "key": "RemindTodayAt", + "value": "'Remind today at' HH:mm" + }, + "Reminders": { + "key": "Reminders", + "value": "Reminders" + }, + "RemoveFromListText": { + "key": "RemoveFromListText", + "value": "Tap and hold on user to delete." + }, + "RemoveStickersCount": { + "key": "RemoveStickersCount", + "value": "REMOVE %1$s" + }, + "RemovedFromFavorites": { + "key": "RemovedFromFavorites", + "value": "Sticker was removed from Favorites" + }, + "RemovedFromRecent": { + "key": "RemovedFromRecent", + "value": "Sticker was removed from Recent" + }, + "RemovedUser": { + "key": "RemovedUser", + "zeroValue": null, + "oneValue": "%1$d removed user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d removed users" + }, + "RepeatDisabled": { + "key": "RepeatDisabled", + "value": "Off" + }, + "RepeatList": { + "key": "RepeatList", + "value": "Repeat list" + }, + "RepeatNotifications": { + "key": "RepeatNotifications", + "value": "Repeat Notifications" + }, + "RepeatNotificationsNever": { + "key": "RepeatNotificationsNever", + "value": "Never" + }, + "RepeatSong": { + "key": "RepeatSong", + "value": "Repeat track" + }, + "ReplacePhoto": { + "key": "ReplacePhoto", + "value": "Replace photo" + }, + "Replies": { + "key": "Replies", + "zeroValue": null, + "oneValue": "%1$d Reply", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d Replies" + }, + "RepliesChatInfo": { + "key": "RepliesChatInfo", + "value": "This chat helps you keep track of replies to your comments in Channels." + }, + "RepliesTitle": { + "key": "RepliesTitle", + "value": "Replies" + }, + "Reply": { + "key": "Reply", + "value": "Reply" + }, + "ReplyToGroup": { + "key": "ReplyToGroup", + "value": "Reply to %1$s" + }, + "ReplyToUser": { + "key": "ReplyToUser", + "value": "Reply to %1$s" + }, + "ReportChat": { + "key": "ReportChat", + "value": "Report" + }, + "ReportChatChild": { + "key": "ReportChatChild", + "value": "Child Abuse" + }, + "ReportChatDescription": { + "key": "ReportChatDescription", + "value": "Description" + }, + "ReportChatFakeAccount": { + "key": "ReportChatFakeAccount", + "value": "Fake Account" + }, + "ReportChatOther": { + "key": "ReportChatOther", + "value": "Other" + }, + "ReportChatPornography": { + "key": "ReportChatPornography", + "value": "Pornography" + }, + "ReportChatSent": { + "key": "ReportChatSent", + "value": "Report sent" + }, + "ReportChatSpam": { + "key": "ReportChatSpam", + "value": "Spam" + }, + "ReportChatViolence": { + "key": "ReportChatViolence", + "value": "Violence" + }, + "ReportHint": { + "key": "ReportHint", + "value": "Additional details..." + }, + "ReportInfo": { + "key": "ReportInfo", + "value": "Please enter any additional details relevant to your report." + }, + "ReportMessages": { + "key": "ReportMessages", + "value": "REPORT MESSAGES" + }, + "ReportMessagesCount": { + "key": "ReportMessagesCount", + "value": "REPORT %1$s" + }, + "ReportSelectMessages": { + "key": "ReportSelectMessages", + "value": "Select messages" + }, + "ReportSend": { + "key": "ReportSend", + "value": "Send Report" + }, + "ReportSentInfo": { + "key": "ReportSentInfo", + "value": "Telegram moderators will study your report.\nThank you for your cooperation!" + }, + "ReportSpam": { + "key": "ReportSpam", + "value": "REPORT SPAM" + }, + "ReportSpamAlert": { + "key": "ReportSpamAlert", + "value": "Are you sure you want to report spam from this user?" + }, + "ReportSpamAlertChannel": { + "key": "ReportSpamAlertChannel", + "value": "Are you sure you want to report spam from this channel?" + }, + "ReportSpamAlertGroup": { + "key": "ReportSpamAlertGroup", + "value": "Are you sure you want to report spam from this group?" + }, + "ReportSpamAndLeave": { + "key": "ReportSpamAndLeave", + "value": "REPORT SPAM AND LEAVE" + }, + "ReportSpamLocation": { + "key": "ReportSpamLocation", + "value": "GROUP UNRELATED TO LOCATION?" + }, + "ReportSpamTitle": { + "key": "ReportSpamTitle", + "value": "Report spam" + }, + "ReportSpamUser": { + "key": "ReportSpamUser", + "value": "BLOCK USER" + }, + "ReportTitleChild": { + "key": "ReportTitleChild", + "value": "Report Child Abuse" + }, + "ReportTitleFake": { + "key": "ReportTitleFake", + "value": "Report Fake" + }, + "ReportTitlePornography": { + "key": "ReportTitlePornography", + "value": "Report Pornography" + }, + "ReportTitleSpam": { + "key": "ReportTitleSpam", + "value": "Report Spam" + }, + "ReportTitleViolence": { + "key": "ReportTitleViolence", + "value": "Report Violence" + }, + "ReportUnrelatedGroup": { + "key": "ReportUnrelatedGroup", + "value": "Report unrelated group" + }, + "ReportUnrelatedGroupText": { + "key": "ReportUnrelatedGroupText", + "value": "Please let us know if this group is not related to this location:\n\n**%1$s**" + }, + "ReportUnrelatedGroupTextNoAddress": { + "key": "ReportUnrelatedGroupTextNoAddress", + "value": "Please let us know if this group is not related to this location." + }, + "ReportUserLocation": { + "key": "ReportUserLocation", + "value": "Report" + }, + "ResendCode": { + "key": "ResendCode", + "value": "Resend code" + }, + "ResendCodeInfo": { + "key": "ResendCodeInfo", + "value": "The verification code was sent to your email." + }, + "Reset": { + "key": "Reset", + "value": "Reset" + }, + "ResetAccount": { + "key": "ResetAccount", + "value": "Reset account" + }, + "ResetAccountButton": { + "key": "ResetAccountButton", + "value": "RESET ACCOUNT" + }, + "ResetAccountCancelledAlert": { + "key": "ResetAccountCancelledAlert", + "value": "Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days." + }, + "ResetAccountInfo": { + "key": "ResetAccountInfo", + "value": "Since the account **%1$s** is active and protected by a password, it will be deleted in 1 week. This delay is required for security purposes.\n\nYou can cancel this process anytime." + }, + "ResetAccountStatus": { + "key": "ResetAccountStatus", + "value": "You'll be able to reset your account in:" + }, + "ResetAllNotifications": { + "key": "ResetAllNotifications", + "value": "Reset All Notifications" + }, + "ResetAutomaticMediaDownload": { + "key": "ResetAutomaticMediaDownload", + "value": "Reset Auto-Download Settings" + }, + "ResetAutomaticMediaDownloadAlert": { + "key": "ResetAutomaticMediaDownloadAlert", + "value": "Are you sure you want to reset auto-download settings?" + }, + "ResetAutomaticMediaDownloadAlertTitle": { + "key": "ResetAutomaticMediaDownloadAlertTitle", + "value": "Reset settings" + }, + "ResetChatBackgrounds": { + "key": "ResetChatBackgrounds", + "value": "Reset Chat Backgrounds" + }, + "ResetChatBackgroundsAlert": { + "key": "ResetChatBackgroundsAlert", + "value": "Are you sure you want to reset all chat backgrounds?" + }, + "ResetChatBackgroundsAlertTitle": { + "key": "ResetChatBackgroundsAlertTitle", + "value": "Reset chat backgrounds" + }, + "ResetChatBackgroundsInfo": { + "key": "ResetChatBackgroundsInfo", + "value": "Remove all uploaded chat backgrounds and restore the pre-installed ones." + }, + "ResetMyAccount": { + "key": "ResetMyAccount", + "value": "RESET MY ACCOUNT" + }, + "ResetMyAccountText": { + "key": "ResetMyAccountText", + "value": "You will lose all your chats and messages, along with any media and files you shared, if you proceed with resetting your account." + }, + "ResetMyAccountWarning": { + "key": "ResetMyAccountWarning", + "value": "Warning" + }, + "ResetMyAccountWarningReset": { + "key": "ResetMyAccountWarningReset", + "value": "Reset account" + }, + "ResetMyAccountWarningText": { + "key": "ResetMyAccountWarningText", + "value": "This action can't be undone.\n\nIf you reset your account, all your messages and chats will be deleted." + }, + "ResetNotificationsAlert": { + "key": "ResetNotificationsAlert", + "value": "Are you sure you want to reset all notification settings to default?" + }, + "ResetNotificationsAlertTitle": { + "key": "ResetNotificationsAlertTitle", + "value": "Reset all notifications" + }, + "ResetNotificationsText": { + "key": "ResetNotificationsText", + "value": "All notification settings reset to default" + }, + "ResetStatistics": { + "key": "ResetStatistics", + "value": "Reset Statistics" + }, + "ResetStatisticsAlert": { + "key": "ResetStatisticsAlert", + "value": "Do you want to reset your usage statistics?" + }, + "ResetStatisticsAlertTitle": { + "key": "ResetStatisticsAlertTitle", + "value": "Reset statistics" + }, + "RestoreEmailSent": { + "key": "RestoreEmailSent", + "value": "We have sent a recovery code to the email address you provided:\n\n%1$s" + }, + "RestoreEmailSentInfo": { + "key": "RestoreEmailSentInfo", + "value": "Please check your email and enter the 6-digit code we sent you." + }, + "RestoreEmailSentTitle": { + "key": "RestoreEmailSentTitle", + "value": "Recovery code" + }, + "RestoreEmailTrouble": { + "key": "RestoreEmailTrouble", + "value": "Unable to access %1$s?" + }, + "RestoreEmailTroubleNoEmail": { + "key": "RestoreEmailTroubleNoEmail", + "value": "Having trouble accessing your email?" + }, + "RestoreEmailTroubleText": { + "key": "RestoreEmailTroubleText", + "value": "If you can't restore access to your email, your remaining options are either to remember your password or to reset your account." + }, + "RestorePasswordNoEmailText": { + "key": "RestorePasswordNoEmailText", + "value": "Since you didn't provide a recovery email when setting up your password, your remaining options are either to remember your password or to reset your account." + }, + "RestorePasswordNoEmailTitle": { + "key": "RestorePasswordNoEmailTitle", + "value": "Sorry" + }, + "RestorePasswordResetAccount": { + "key": "RestorePasswordResetAccount", + "value": "RESET ACCOUNT" + }, + "Restrictions": { + "key": "Restrictions", + "zeroValue": null, + "oneValue": "%1$d restriction", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d restrictions" + }, + "Retry": { + "key": "Retry", + "value": "Retry" + }, + "RetryCall": { + "key": "RetryCall", + "value": "Retry" + }, + "ReturnToCall": { + "key": "ReturnToCall", + "value": "RETURN TO CALL" + }, + "ReverseOrder": { + "key": "ReverseOrder", + "value": "Reverse order" + }, + "RevokeAlert": { + "key": "RevokeAlert", + "value": "Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it." + }, + "RevokeAlertNewLink": { + "key": "RevokeAlertNewLink", + "value": "The previous invite link is now inactive. A new link has been generated." + }, + "RevokeButton": { + "key": "RevokeButton", + "value": "Revoke" + }, + "RevokeLink": { + "key": "RevokeLink", + "value": "Revoke Link" + }, + "RevokeLinkAlert": { + "key": "RevokeLinkAlert", + "value": "Are you sure you want to revoke the link **%1$s**?\n\nThe group \"**%2$s**\" will become private." + }, + "RevokeLinkAlertChannel": { + "key": "RevokeLinkAlertChannel", + "value": "Are you sure you want to revoke the link **%1$s**?\n\nThe channel \"**%2$s**\" will become private." + }, + "Revoked": { + "key": "Revoked", + "value": "Revoked" + }, + "RevokedLink": { + "key": "RevokedLink", + "value": "Revoked Link" + }, + "RevokedLinks": { + "key": "RevokedLinks", + "value": "Revoked Links" + }, + "RoamingUsage": { + "key": "RoamingUsage", + "value": "Roaming Data Usage" + }, + "SETTINGS": { + "key": "SETTINGS", + "value": "Settings" + }, + "Satellite": { + "key": "Satellite", + "value": "Satellite" + }, + "Saturation": { + "key": "Saturation", + "value": "Saturation" + }, + "Save": { + "key": "Save", + "value": "Save" + }, + "SaveChangesAlertText": { + "key": "SaveChangesAlertText", + "value": "Do you want to apply the new colors you chose?" + }, + "SaveChangesAlertTitle": { + "key": "SaveChangesAlertTitle", + "value": "Save changes?" + }, + "SaveLink": { + "key": "SaveLink", + "value": "Save Link" + }, + "SaveTheme": { + "key": "SaveTheme", + "value": "SAVE THEME" + }, + "SaveToDownloads": { + "key": "SaveToDownloads", + "value": "Save to downloads" + }, + "SaveToGIFs": { + "key": "SaveToGIFs", + "value": "Save to GIFs" + }, + "SaveToGallery": { + "key": "SaveToGallery", + "value": "Save to gallery" + }, + "SaveToGallerySettings": { + "key": "SaveToGallerySettings", + "value": "Save to Gallery" + }, + "SaveToMusic": { + "key": "SaveToMusic", + "value": "Save to music" + }, + "SavedMessages": { + "key": "SavedMessages", + "value": "Saved Messages" + }, + "SavedMessagesInfo": { + "key": "SavedMessagesInfo", + "value": "Forward here to save." + }, + "ScamMessage": { + "key": "ScamMessage", + "value": "SCAM" + }, + "Schedule": { + "key": "Schedule", + "value": "Schedule" + }, + "ScheduleMessage": { + "key": "ScheduleMessage", + "value": "Schedule message" + }, + "ScheduleWhenOnline": { + "key": "ScheduleWhenOnline", + "value": "Send when %1$s comes online" + }, + "ScheduledMessages": { + "key": "ScheduledMessages", + "value": "Scheduled Messages" + }, + "ScheduledOrNoSoundHint": { + "key": "ScheduledOrNoSoundHint", + "value": "Hold this button to schedule your message or send it without sound." + }, + "ScreenCapture": { + "key": "ScreenCapture", + "value": "Show App Content in Task Switcher" + }, + "ScreenCaptureAlert": { + "key": "ScreenCaptureAlert", + "value": "This will hide the contents of your chats or chat list from the task switcher, but you will not be able to take screenshots on Telegram.\n\nYou may need to restart the app for this to take effect." + }, + "ScreenCaptureInfo": { + "key": "ScreenCaptureInfo", + "value": "If disabled, you won't be able to take screenshots in the app but chat content will be hidden in the task switcher." + }, + "SdCard": { + "key": "SdCard", + "value": "SD Card" + }, + "Search": { + "key": "Search", + "value": "Search" + }, + "SearchAllChatsShort": { + "key": "SearchAllChatsShort", + "value": "Chats" + }, + "SearchBackgrounds": { + "key": "SearchBackgrounds", + "value": "Search Backgrounds" + }, + "SearchByColor": { + "key": "SearchByColor", + "value": "Search by color" + }, + "SearchEmojiHint": { + "key": "SearchEmojiHint", + "value": "Search emoji" + }, + "SearchEmptyViewFilteredSubtitle2": { + "key": "SearchEmptyViewFilteredSubtitle2", + "value": "Try a new search." + }, + "SearchEmptyViewFilteredSubtitleFiles": { + "key": "SearchEmptyViewFilteredSubtitleFiles", + "value": "Files from all your chats will be shown here." + }, + "SearchEmptyViewFilteredSubtitleLinks": { + "key": "SearchEmptyViewFilteredSubtitleLinks", + "value": "Links from all your chats will be shown here." + }, + "SearchEmptyViewFilteredSubtitleMedia": { + "key": "SearchEmptyViewFilteredSubtitleMedia", + "value": "Media from all your chats will be shown here." + }, + "SearchEmptyViewFilteredSubtitleMusic": { + "key": "SearchEmptyViewFilteredSubtitleMusic", + "value": "Music from all your chats will be shown here." + }, + "SearchEmptyViewFilteredSubtitleVoice": { + "key": "SearchEmptyViewFilteredSubtitleVoice", + "value": "Voice from all your chats will be shown here." + }, + "SearchEmptyViewTitle": { + "key": "SearchEmptyViewTitle", + "value": "No Results" + }, + "SearchEmptyViewTitle2": { + "key": "SearchEmptyViewTitle2", + "value": "No Results" + }, + "SearchForChats": { + "key": "SearchForChats", + "value": "Search for chats..." + }, + "SearchForPeople": { + "key": "SearchForPeople", + "value": "Search for people..." + }, + "SearchForPeopleAndGroups": { + "key": "SearchForPeopleAndGroups", + "value": "Search for users and groups..." + }, + "SearchFriends": { + "key": "SearchFriends", + "value": "Search contacts" + }, + "SearchFrom": { + "key": "SearchFrom", + "value": "from:" + }, + "SearchGifs": { + "key": "SearchGifs", + "value": "FIND GIFS" + }, + "SearchGifsTitle": { + "key": "SearchGifsTitle", + "value": "Search GIFs" + }, + "SearchImages": { + "key": "SearchImages", + "value": "FIND IMAGES" + }, + "SearchImagesInfo": { + "key": "SearchImagesInfo", + "value": "WEB SEARCH" + }, + "SearchImagesTitle": { + "key": "SearchImagesTitle", + "value": "Search web" + }, + "SearchInSettings": { + "key": "SearchInSettings", + "value": "Search Settings and FAQ" + }, + "SearchMembers": { + "key": "SearchMembers", + "value": "Search members" + }, + "SearchMessages": { + "key": "SearchMessages", + "value": "Messages" + }, + "SearchMusic": { + "key": "SearchMusic", + "value": "Search music" + }, + "SearchRecentFiles": { + "key": "SearchRecentFiles", + "value": "Search Recent Files" + }, + "SearchStickersHint": { + "key": "SearchStickersHint", + "value": "Search sticker sets" + }, + "SearchTipToday": { + "key": "SearchTipToday", + "value": "Today" + }, + "SearchTipYesterday": { + "key": "SearchTipYesterday", + "value": "Yesterday" + }, + "SearchTrendingStickersHint": { + "key": "SearchTrendingStickersHint", + "value": "Search trending stickers" + }, + "Seconds": { + "key": "Seconds", + "zeroValue": null, + "oneValue": "%1$d second", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d seconds" + }, + "SecondsBold": { + "key": "SecondsBold", + "zeroValue": null, + "oneValue": "**%1$d** second", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "**%1$d** seconds" + }, + "SecretChat": { + "key": "SecretChat", + "value": "Secret chats" + }, + "SecretChatContextBotAlert": { + "key": "SecretChatContextBotAlert", + "value": "Please note that inline bots are provided by third-party developers. For the bot to work, the symbols you type after the bot's username are sent to its respective developer." + }, + "SecretChatName": { + "key": "SecretChatName", + "value": "Telegram" + }, + "SecretChatTimerDays": { + "key": "SecretChatTimerDays", + "value": "d" + }, + "SecretChatTimerHours": { + "key": "SecretChatTimerHours", + "value": "h" + }, + "SecretChatTimerMinutes": { + "key": "SecretChatTimerMinutes", + "value": "m" + }, + "SecretChatTimerSeconds": { + "key": "SecretChatTimerSeconds", + "value": "s" + }, + "SecretChatTimerWeeks": { + "key": "SecretChatTimerWeeks", + "value": "w" + }, + "SecretLinkPreviewAlert": { + "key": "SecretLinkPreviewAlert", + "value": "Enable extended link previews in Secret Chats? Note that link previews are generated on Telegram servers." + }, + "SecretWebPage": { + "key": "SecretWebPage", + "value": "Link Previews" + }, + "SecretWebPageInfo": { + "key": "SecretWebPageInfo", + "value": "Link previews will be generated on Telegram servers. We do not store data about the links you send." + }, + "SecurityTitle": { + "key": "SecurityTitle", + "value": "Security" + }, + "SelectAccount": { + "key": "SelectAccount", + "value": "Select Account" + }, + "SelectChat": { + "key": "SelectChat", + "value": "Select Chat" + }, + "SelectChats": { + "key": "SelectChats", + "value": "Select Chats" + }, + "SelectColor": { + "key": "SelectColor", + "value": "Select color" + }, + "SelectColorTitle": { + "key": "SelectColorTitle", + "value": "Select a color" + }, + "SelectContact": { + "key": "SelectContact", + "value": "Select Contact" + }, + "SelectContacts": { + "key": "SelectContacts", + "value": "Select Contacts" + }, + "SelectFile": { + "key": "SelectFile", + "value": "Select File" + }, + "SelectFromGallery": { + "key": "SelectFromGallery", + "value": "Select from Gallery" + }, + "SelectImage": { + "key": "SelectImage", + "value": "Select image" + }, + "Send": { + "key": "Send", + "value": "Send" + }, + "SendAnonymously": { + "key": "SendAnonymously", + "value": "Send anonymously" + }, + "SendAsFile": { + "key": "SendAsFile", + "value": "Send as file" + }, + "SendAsFiles": { + "key": "SendAsFiles", + "value": "Send as files" + }, + "SendAsNewPhoto": { + "key": "SendAsNewPhoto", + "value": "Send as a new photo" + }, + "SendByEnter": { + "key": "SendByEnter", + "value": "Send by Enter" + }, + "SendContactTo": { + "key": "SendContactTo", + "value": "Send contact to %1$s?" + }, + "SendContactToGroup": { + "key": "SendContactToGroup", + "value": "Send contact to %1$s?" + }, + "SendContactToGroupText": { + "key": "SendContactToGroupText", + "value": "Do you want to send this contact to **%1$s**?" + }, + "SendContactToText": { + "key": "SendContactToText", + "value": "Do you want to send this contact to **%1$s**?" + }, + "SendDayAt": { + "key": "SendDayAt", + "value": "'Send on' MMM d 'at' HH:mm" + }, + "SendDayYearAt": { + "key": "SendDayYearAt", + "value": "'Send on' MMM d yyyy 'at' HH:mm" + }, + "SendDice": { + "key": "SendDice", + "value": "SEND" + }, + "SendGameTo": { + "key": "SendGameTo", + "value": "Share game to %1$s?" + }, + "SendGameToGroup": { + "key": "SendGameToGroup", + "value": "Share game to %1$s?" + }, + "SendGameToGroupText": { + "key": "SendGameToGroupText", + "value": "Do you want to share this game to **%1$s**?" + }, + "SendGameToText": { + "key": "SendGameToText", + "value": "Do you want to share this game to **%1$s**?" + }, + "SendGifPreview": { + "key": "SendGifPreview", + "value": "Send GIF" + }, + "SendItems": { + "key": "SendItems", + "value": "Send %1$s" + }, + "SendLiveLocation": { + "key": "SendLiveLocation", + "value": "Share My Live Location for..." + }, + "SendLiveLocationFor15m": { + "key": "SendLiveLocationFor15m", + "value": "for 15 minutes" + }, + "SendLiveLocationFor1h": { + "key": "SendLiveLocationFor1h", + "value": "for 1 hour" + }, + "SendLiveLocationFor8h": { + "key": "SendLiveLocationFor8h", + "value": "for 8 hours" + }, + "SendLiveLocationInfo": { + "key": "SendLiveLocationInfo", + "value": "Updated in real time as you move" + }, + "SendLiveLocationMenu": { + "key": "SendLiveLocationMenu", + "value": "Share my Live Location" + }, + "SendLocation": { + "key": "SendLocation", + "value": "Send My Current Location" + }, + "SendMessage": { + "key": "SendMessage", + "value": "Send Message" + }, + "SendMessageLocation": { + "key": "SendMessageLocation", + "value": "Send Message" + }, + "SendMessageRestricted": { + "key": "SendMessageRestricted", + "value": "The admins of this group have restricted you from writing here until %1$s" + }, + "SendMessageRestrictedForever": { + "key": "SendMessageRestrictedForever", + "value": "The admins of this group have restricted you from writing here." + }, + "SendMessageTitle": { + "key": "SendMessageTitle", + "value": "Send message" + }, + "SendMessageTo": { + "key": "SendMessageTo", + "value": "Add people..." + }, + "SendMessagesTo": { + "key": "SendMessagesTo", + "value": "Send messages to %1$s?" + }, + "SendMessagesToGroup": { + "key": "SendMessagesToGroup", + "value": "Send messages to %1$s?" + }, + "SendMessagesToGroupText": { + "key": "SendMessagesToGroupText", + "value": "Do you want to send this message to **%1$s**?" + }, + "SendMessagesToText": { + "key": "SendMessagesToText", + "value": "Do you want to send this message to **%1$s**?" + }, + "SendSelectedLocation": { + "key": "SendSelectedLocation", + "value": "Send selected location" + }, + "SendSticker": { + "key": "SendSticker", + "value": "SEND STICKER" + }, + "SendStickerPreview": { + "key": "SendStickerPreview", + "value": "Send Sticker" + }, + "SendTodayAt": { + "key": "SendTodayAt", + "value": "'Send today at' HH:mm" + }, + "SendWithoutCompression": { + "key": "SendWithoutCompression", + "value": "Send without compression" + }, + "SendWithoutGrouping": { + "key": "SendWithoutGrouping", + "value": "Send without grouping" + }, + "SendWithoutSound": { + "key": "SendWithoutSound", + "value": "Send without sound" + }, + "SendingAudio": { + "key": "SendingAudio", + "value": "sending audio..." + }, + "SendingFile": { + "key": "SendingFile", + "value": "sending a file..." + }, + "SendingGame": { + "key": "SendingGame", + "value": "playing a game..." + }, + "SendingGif": { + "key": "SendingGif", + "value": "Sending GIF..." + }, + "SendingPhoto": { + "key": "SendingPhoto", + "value": "sending a photo..." + }, + "SendingSms": { + "key": "SendingSms", + "value": "Sending SMS..." + }, + "SendingVideo": { + "key": "SendingVideo", + "value": "Sending video..." + }, + "SendingVideoStatus": { + "key": "SendingVideoStatus", + "value": "sending a video..." + }, + "SentAppCode": { + "key": "SentAppCode", + "value": "We've sent the code to the **Telegram** app on your other device." + }, + "SentAppCodeTitle": { + "key": "SentAppCodeTitle", + "value": "Check your Telegram messages" + }, + "SentCallCode": { + "key": "SentCallCode", + "value": "We're calling your phone **%1$s**.\n\nDon't accept the call, Telegram will process everything automatically." + }, + "SentCallOnly": { + "key": "SentCallOnly", + "value": "Calling your phone **%1$s** to dictate the code." + }, + "SentSmsCode": { + "key": "SentSmsCode", + "value": "We’ve sent an SMS with an activation code to your phone **%1$s**." + }, + "SentSmsCodeTitle": { + "key": "SentSmsCodeTitle", + "value": "Enter code" + }, + "September": { + "key": "September", + "value": "September" + }, + "ServiceNotifications": { + "key": "ServiceNotifications", + "value": "Service notifications" + }, + "SessionsInfo": { + "key": "SessionsInfo", + "value": "Control your sessions on other devices." + }, + "SessionsTitle": { + "key": "SessionsTitle", + "value": "Active Sessions" + }, + "Set": { + "key": "Set", + "value": "Set" + }, + "SetAdditionalPassword": { + "key": "SetAdditionalPassword", + "value": "Set Additional Password" + }, + "SetAdditionalPasswordInfo": { + "key": "SetAdditionalPasswordInfo", + "value": "You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS." + }, + "SetAdmins": { + "key": "SetAdmins", + "value": "Add admins" + }, + "SetAdminsAll": { + "key": "SetAdminsAll", + "value": "All Members Are Admins" + }, + "SetAdminsAllInfo": { + "key": "SetAdminsAllInfo", + "value": "All members can add new members, pin messages, edit name and photo of the group." + }, + "SetAdminsNotAllInfo": { + "key": "SetAdminsNotAllInfo", + "value": "Only admins can add and remove members, pin messages, edit name and photo of the group." + }, + "SetAdminsTitle": { + "key": "SetAdminsTitle", + "value": "Chat Admins" + }, + "SetAsAdmin": { + "key": "SetAsAdmin", + "value": "Promote to admin" + }, + "SetAsMain": { + "key": "SetAsMain", + "value": "Set as main" + }, + "SetBackground": { + "key": "SetBackground", + "value": "SET BACKGROUND" + }, + "SetColor": { + "key": "SetColor", + "value": "Set a color" + }, + "SetPasscode": { + "key": "SetPasscode", + "value": "Set a Passcode" + }, + "SetPasscodeInfo": { + "key": "SetPasscodeInfo", + "value": "Lock the app with a passcode so that others can't open it." + }, + "SetProfilePhoto": { + "key": "SetProfilePhoto", + "value": "Set Profile Photo" + }, + "SetRecoveryEmail": { + "key": "SetRecoveryEmail", + "value": "Set Recovery Email" + }, + "SetReminder": { + "key": "SetReminder", + "value": "Set a reminder" + }, + "SetTimeLimit": { + "key": "SetTimeLimit", + "value": "Set Time Limit" + }, + "SetTimer": { + "key": "SetTimer", + "value": "Set self-destruct timer" + }, + "SetUrlAvailable": { + "key": "SetUrlAvailable", + "value": "%1$s is available." + }, + "SetUrlChecking": { + "key": "SetUrlChecking", + "value": "Checking link..." + }, + "SetUrlInUse": { + "key": "SetUrlInUse", + "value": "Sorry, this link is already taken." + }, + "SetUrlInvalid": { + "key": "SetUrlInvalid", + "value": "Sorry, this link is invalid." + }, + "SetUrlInvalidLong": { + "key": "SetUrlInvalidLong", + "value": "The link must not exceed 64 characters." + }, + "SetUrlInvalidShort": { + "key": "SetUrlInvalidShort", + "value": "A link must have at least 5 characters." + }, + "SetUrlInvalidStartNumber": { + "key": "SetUrlInvalidStartNumber", + "value": "Sorry, the link can't start with a number." + }, + "SetUrlPlaceholder": { + "key": "SetUrlPlaceholder", + "value": "Link" + }, + "Settings": { + "key": "Settings", + "value": "Settings" + }, + "SettingsDebug": { + "key": "SettingsDebug", + "value": "Debug" + }, + "SettingsFaqSearchTitle": { + "key": "SettingsFaqSearchTitle", + "value": "Frequently asked questions" + }, + "SettingsHelp": { + "key": "SettingsHelp", + "value": "Help" + }, + "SettingsNoRecent": { + "key": "SettingsNoRecent", + "value": "No recent searches" + }, + "SettingsNoResults": { + "key": "SettingsNoResults", + "value": "No results found" + }, + "SettingsRecent": { + "key": "SettingsRecent", + "value": "Recent searches" + }, + "SettingsSearchFaq": { + "key": "SettingsSearchFaq", + "value": "FAQ" + }, + "Shadows": { + "key": "Shadows", + "value": "Shadows" + }, + "ShareComment": { + "key": "ShareComment", + "value": "Write a comment..." + }, + "ShareContact": { + "key": "ShareContact", + "value": "Share contact" + }, + "ShareContactTitle": { + "key": "ShareContactTitle", + "value": "Share Contact" + }, + "ShareFile": { + "key": "ShareFile", + "value": "Share" + }, + "ShareLink": { + "key": "ShareLink", + "value": "Share Link" + }, + "ShareLocation": { + "key": "ShareLocation", + "value": "Location" + }, + "ShareLocationAlertButton": { + "key": "ShareLocationAlertButton", + "value": "Share" + }, + "ShareLocationAlertText": { + "key": "ShareLocationAlertText", + "value": "For the alert to work, please share your live location in this chat." + }, + "ShareLocationAlertTitle": { + "key": "ShareLocationAlertTitle", + "value": "Share Location" + }, + "ShareMyContactInfo": { + "key": "ShareMyContactInfo", + "value": "Share my contact" + }, + "ShareMyPhone": { + "key": "ShareMyPhone", + "value": "SHARE MY PHONE NUMBER" + }, + "SharePhoneNumberWith": { + "key": "SharePhoneNumberWith", + "value": "Share my phone number with %1$s" + }, + "ShareQrCode": { + "key": "ShareQrCode", + "value": "Share QR Code" + }, + "ShareSendTo": { + "key": "ShareSendTo", + "value": "Send to..." + }, + "ShareTelegram": { + "key": "ShareTelegram", + "value": "Share Telegram..." + }, + "ShareTheme": { + "key": "ShareTheme", + "value": "Share theme" + }, + "ShareYouLocationInfo": { + "key": "ShareYouLocationInfo", + "value": "This will send your current location to the bot." + }, + "ShareYouLocationInline": { + "key": "ShareYouLocationInline", + "value": "This bot would like to know your location each time you send it a request. This can be used to provide location-specific results." + }, + "ShareYouLocationTitle": { + "key": "ShareYouLocationTitle", + "value": "Share Your Location?" + }, + "ShareYouLocationUnable": { + "key": "ShareYouLocationUnable", + "value": "App was unable to determine your current location" + }, + "ShareYouLocationUnableManually": { + "key": "ShareYouLocationUnableManually", + "value": "Choose manually" + }, + "ShareYouPhoneNumberTitle": { + "key": "ShareYouPhoneNumberTitle", + "value": "Share your phone number?" + }, + "Shared": { + "key": "Shared", + "zeroValue": null, + "oneValue": "%1$s shared", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s shared" + }, + "SharedAudioFiles": { + "key": "SharedAudioFiles", + "value": "Audio files" + }, + "SharedContent": { + "key": "SharedContent", + "value": "Shared content" + }, + "SharedContentTitle": { + "key": "SharedContentTitle", + "value": "Shared Content" + }, + "SharedFilesTab": { + "key": "SharedFilesTab", + "value": "FILES" + }, + "SharedFilesTab2": { + "key": "SharedFilesTab2", + "value": "Files" + }, + "SharedGIFsTab2": { + "key": "SharedGIFsTab2", + "value": "GIFs" + }, + "SharedGroupsTab2": { + "key": "SharedGroupsTab2", + "value": "Groups" + }, + "SharedLinks": { + "key": "SharedLinks", + "value": "Links" + }, + "SharedLinksTab": { + "key": "SharedLinksTab", + "value": "LINKS" + }, + "SharedLinksTab2": { + "key": "SharedLinksTab2", + "value": "Links" + }, + "SharedMedia": { + "key": "SharedMedia", + "value": "Shared Media" + }, + "SharedMediaTab": { + "key": "SharedMediaTab", + "value": "MEDIA" + }, + "SharedMediaTab2": { + "key": "SharedMediaTab2", + "value": "Media" + }, + "SharedMediaTabFull2": { + "key": "SharedMediaTabFull2", + "value": "Shared Media" + }, + "SharedMediaTitle": { + "key": "SharedMediaTitle", + "value": "Shared Media" + }, + "SharedMusicTab": { + "key": "SharedMusicTab", + "value": "MUSIC" + }, + "SharedMusicTab2": { + "key": "SharedMusicTab2", + "value": "Music" + }, + "SharedPhotosAndVideos": { + "key": "SharedPhotosAndVideos", + "value": "Photos and videos" + }, + "SharedPlace": { + "key": "SharedPlace", + "value": "Place" + }, + "SharedToPrivateMessagesAndGroups": { + "key": "SharedToPrivateMessagesAndGroups", + "value": "to private messages and groups" + }, + "SharedVoiceTab": { + "key": "SharedVoiceTab", + "value": "VOICE" + }, + "SharedVoiceTab2": { + "key": "SharedVoiceTab2", + "value": "Voice" + }, + "Shares": { + "key": "Shares", + "zeroValue": null, + "oneValue": "%1$s share", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s shares" + }, + "SharesPerPost": { + "key": "SharesPerPost", + "value": "Shares Per Post" + }, + "SharingLiveLocationTitle": { + "key": "SharingLiveLocationTitle", + "value": "You are sharing your Live Location with %1$s" + }, + "SharingYouAndOtherName": { + "key": "SharingYouAndOtherName", + "value": "You and %1$s" + }, + "Sharpen": { + "key": "Sharpen", + "value": "Sharpen" + }, + "Short": { + "key": "Short", + "value": "Short" + }, + "ShortMessageLifetimeForever": { + "key": "ShortMessageLifetimeForever", + "value": "Off" + }, + "ShowAllFiles": { + "key": "ShowAllFiles", + "value": "Show all files" + }, + "ShowAllGIFs": { + "key": "ShowAllGIFs", + "value": "Show all GIFs" + }, + "ShowAllMedia": { + "key": "ShowAllMedia", + "value": "Show all media" + }, + "ShowAllThemes": { + "key": "ShowAllThemes", + "value": "Show all Themes" + }, + "ShowAsGrid": { + "key": "ShowAsGrid", + "value": "Show as grid" + }, + "ShowAsList": { + "key": "ShowAsList", + "value": "Show as list" + }, + "ShowInChat": { + "key": "ShowInChat", + "value": "Show in chat" + }, + "ShowNearbyPlaces": { + "key": "ShowNearbyPlaces", + "value": "Pull up to see places nearby" + }, + "ShowNotificationsFor": { + "key": "ShowNotificationsFor", + "value": "Show notifications for" + }, + "ShowNotificationsForInfo": { + "key": "ShowNotificationsForInfo", + "value": "Turn this off if you want to receive notifications only from the account you are currently using." + }, + "ShowStickers": { + "key": "ShowStickers", + "value": "Show stickers" + }, + "ShowVotes": { + "key": "ShowVotes", + "zeroValue": null, + "oneValue": "Show More (%1$d)", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show More (%1$d)" + }, + "Shuffle": { + "key": "Shuffle", + "value": "Shuffle" + }, + "ShuffleList": { + "key": "ShuffleList", + "value": "Shuffle list" + }, + "SignUp": { + "key": "SignUp", + "value": "Sign Up" + }, + "SinglePhotosHelp": { + "key": "SinglePhotosHelp", + "value": "Show media as separate messages" + }, + "SlideToCancel": { + "key": "SlideToCancel", + "value": "SLIDE TO CANCEL" + }, + "SlideUpToLock": { + "key": "SlideUpToLock", + "value": "Slide up to lock recording" + }, + "SlowModeHint": { + "key": "SlowModeHint", + "value": "Slow Mode is enabled. You can send\nyour next message in %1$s" + }, + "Slowmode": { + "key": "Slowmode", + "value": "Slow Mode" + }, + "SlowmodeHours": { + "key": "SlowmodeHours", + "value": "%1$dh" + }, + "SlowmodeInfoOff": { + "key": "SlowmodeInfoOff", + "value": "Choose how long each member must wait before sending their next message." + }, + "SlowmodeInfoSelected": { + "key": "SlowmodeInfoSelected", + "value": "Members will be able to send only one message every %1$s." + }, + "SlowmodeMinutes": { + "key": "SlowmodeMinutes", + "value": "%1$dm" + }, + "SlowmodeOff": { + "key": "SlowmodeOff", + "value": "Off" + }, + "SlowmodeSeconds": { + "key": "SlowmodeSeconds", + "value": "%1$ds" + }, + "SlowmodeSelectSendError": { + "key": "SlowmodeSelectSendError", + "value": "Slow Mode is enabled. You can't select more items." + }, + "SlowmodeSendError": { + "key": "SlowmodeSendError", + "value": "Slow Mode is enabled. You can't send more than one message at once." + }, + "SlowmodeSendErrorTooLong": { + "key": "SlowmodeSendErrorTooLong", + "value": "Sorry, this text is too long to send as one message.\n\nSlow Mode is enabled. You can't send more than one message at once." + }, + "SmartNotifications": { + "key": "SmartNotifications", + "value": "Smart Notifications" + }, + "SmartNotificationsAlert": { + "key": "SmartNotificationsAlert", + "value": "Sound Alert Frequency" + }, + "SmartNotificationsDetail": { + "key": "SmartNotificationsDetail", + "value": "%1$s within %2$s" + }, + "SmartNotificationsDisabled": { + "key": "SmartNotificationsDisabled", + "value": "Disabled" + }, + "SmartNotificationsInfo": { + "key": "SmartNotificationsInfo", + "value": "%1$d / %2$s" + }, + "SmsText": { + "key": "SmsText", + "value": "Sending you an SMS in %1$d:%2$02d" + }, + "SoftUserLimitAlert": { + "key": "SoftUserLimitAlert", + "value": "You will be able to add more members after you create the group." + }, + "SoftenSkin": { + "key": "SoftenSkin", + "value": "Soften Skin" + }, + "SortBy": { + "key": "SortBy", + "value": "Sort By" + }, + "SortFirstName": { + "key": "SortFirstName", + "value": "First name" + }, + "SortLastName": { + "key": "SortLastName", + "value": "Last name" + }, + "SortedByLastSeen": { + "key": "SortedByLastSeen", + "value": "Sorted by last seen time" + }, + "SortedByName": { + "key": "SortedByName", + "value": "Sorted by name" + }, + "Sound": { + "key": "Sound", + "value": "Sound" + }, + "SoundDefault": { + "key": "SoundDefault", + "value": "Default" + }, + "SoundMuted": { + "key": "SoundMuted", + "value": "Sound muted" + }, + "Speaking": { + "key": "Speaking", + "value": "speaking" + }, + "Start": { + "key": "Start", + "value": "Start" + }, + "StartEncryptedChat": { + "key": "StartEncryptedChat", + "value": "Start Secret Chat" + }, + "StartMessaging": { + "key": "StartMessaging", + "value": "Start Messaging" + }, + "StartText": { + "key": "StartText", + "value": "Please confirm your country code and enter your phone number." + }, + "StartVoipChat": { + "key": "StartVoipChat", + "value": "Start Voice chat" + }, + "StartVoipChatAlertText": { + "key": "StartVoipChatAlertText", + "value": "Start a voice chat in this group?" + }, + "StartVoipChatPermission": { + "key": "StartVoipChatPermission", + "value": "Manage Voice Chats" + }, + "StartVoipChatTitle": { + "key": "StartVoipChatTitle", + "value": "Voice Chat" + }, + "StatisticOpenProfile": { + "key": "StatisticOpenProfile", + "value": "Open Profile" + }, + "StatisticOverview": { + "key": "StatisticOverview", + "value": "Overview" + }, + "StatisticSearchUserHistory": { + "key": "StatisticSearchUserHistory", + "value": "View Messages" + }, + "StatisticViews": { + "key": "StatisticViews", + "value": "Views" + }, + "Statistics": { + "key": "Statistics", + "value": "Statistics" + }, + "StickerSets": { + "key": "StickerSets", + "zeroValue": null, + "oneValue": "%1$s sticker set", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s sticker sets" + }, + "Stickers": { + "key": "Stickers", + "zeroValue": null, + "oneValue": "%1$d sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d stickers" + }, + "StickersAndMasks": { + "key": "StickersAndMasks", + "value": "Stickers and Masks" + }, + "StickersArchived": { + "key": "StickersArchived", + "value": "Stickers archived." + }, + "StickersArchivedInfo": { + "key": "StickersArchivedInfo", + "value": "%1$s has been moved to your archive." + }, + "StickersBotInfo": { + "key": "StickersBotInfo", + "value": "Artists are welcome to add their own sticker sets using our @stickers bot." + }, + "StickersCopy": { + "key": "StickersCopy", + "value": "Copy link" + }, + "StickersHide": { + "key": "StickersHide", + "value": "Archive" + }, + "StickersName": { + "key": "StickersName", + "value": "Stickers and Masks" + }, + "StickersRemove": { + "key": "StickersRemove", + "value": "Remove" + }, + "StickersRemoved": { + "key": "StickersRemoved", + "value": "Stickers removed" + }, + "StickersRemovedInfo": { + "key": "StickersRemovedInfo", + "value": "%1$s is no longer in your stickers." + }, + "StickersReorder": { + "key": "StickersReorder", + "value": "Reorder" + }, + "StickersReorderHint": { + "key": "StickersReorderHint", + "value": "Move stickers to reorder." + }, + "StickersShare": { + "key": "StickersShare", + "value": "Share" + }, + "Stop": { + "key": "Stop", + "value": "Stop" + }, + "StopAllLocationSharings": { + "key": "StopAllLocationSharings", + "value": "STOP ALL" + }, + "StopDownload": { + "key": "StopDownload", + "value": "Stop downloading" + }, + "StopLiveLocation": { + "key": "StopLiveLocation", + "value": "Stop Sharing Location" + }, + "StopLiveLocationAlertAll": { + "key": "StopLiveLocationAlertAll", + "value": "Are you sure you want to stop sharing your live location?" + }, + "StopLiveLocationAlertAllText": { + "key": "StopLiveLocationAlertAllText", + "value": "Do you want to stop sharing your live location?" + }, + "StopLiveLocationAlertToGroup": { + "key": "StopLiveLocationAlertToGroup", + "value": "Are you sure you want to stop sharing live location with %1$s?" + }, + "StopLiveLocationAlertToGroupText": { + "key": "StopLiveLocationAlertToGroupText", + "value": "Do you want to stop sharing your live location with **%1$s**?" + }, + "StopLiveLocationAlertToTitle": { + "key": "StopLiveLocationAlertToTitle", + "value": "Stop location sharing" + }, + "StopLiveLocationAlertToUser": { + "key": "StopLiveLocationAlertToUser", + "value": "Stop sharing your live location with %1$s?" + }, + "StopLiveLocationAlertToUserText": { + "key": "StopLiveLocationAlertToUserText", + "value": "Do you want to stop sharing your live location with **%1$s**?" + }, + "StopLoading": { + "key": "StopLoading", + "value": "Stop loading?" + }, + "StopPoll": { + "key": "StopPoll", + "value": "Stop Poll" + }, + "StopPollAlertText": { + "key": "StopPollAlertText", + "value": "If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone." + }, + "StopPollAlertTitle": { + "key": "StopPollAlertTitle", + "value": "Stop poll?" + }, + "StopQuiz": { + "key": "StopQuiz", + "value": "Stop Quiz" + }, + "StopQuizAlertText": { + "key": "StopQuizAlertText", + "value": "If you stop this quiz now, nobody will be able to submit answers. This action cannot be undone." + }, + "StopQuizAlertTitle": { + "key": "StopQuizAlertTitle", + "value": "Stop quiz?" + }, + "StopShowingMe": { + "key": "StopShowingMe", + "value": "Stop Showing Me" + }, + "StopVerification": { + "key": "StopVerification", + "value": "Do you want to stop the verification process?" + }, + "StoragePath": { + "key": "StoragePath", + "value": "Storage Path" + }, + "StorageUsage": { + "key": "StorageUsage", + "value": "Storage Usage" + }, + "Streaming": { + "key": "Streaming", + "value": "Streaming" + }, + "Strike": { + "key": "Strike", + "value": "Strikethrough" + }, + "Subscribers": { + "key": "Subscribers", + "zeroValue": null, + "oneValue": "%1$d subscriber", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d subscribers" + }, + "SuggestContacts": { + "key": "SuggestContacts", + "value": "Suggest Frequent Contacts" + }, + "SuggestContactsAlert": { + "key": "SuggestContactsAlert", + "value": "This will delete all data about the people you message frequently as well as the inline bots you are likely to use." + }, + "SuggestContactsInfo": { + "key": "SuggestContactsInfo", + "value": "Display people you message frequently at the top of the search section for quick access." + }, + "SuggestContactsTitle": { + "key": "SuggestContactsTitle", + "value": "Disable suggestions" + }, + "SuggestStickers": { + "key": "SuggestStickers", + "value": "Suggest stickers by emoji" + }, + "SuggestStickersAll": { + "key": "SuggestStickersAll", + "value": "All Sets" + }, + "SuggestStickersInstalled": { + "key": "SuggestStickersInstalled", + "value": "My Sets" + }, + "SuggestStickersNone": { + "key": "SuggestStickersNone", + "value": "None" + }, + "Support": { + "key": "Support", + "value": "Support" + }, + "SupportStatus": { + "key": "SupportStatus", + "value": "support" + }, + "SyncContacts": { + "key": "SyncContacts", + "value": "Sync Contacts" + }, + "SyncContactsAdded": { + "key": "SyncContactsAdded", + "value": "Contacts from this device were added to your account." + }, + "SyncContactsDelete": { + "key": "SyncContactsDelete", + "value": "Delete Synced Contacts" + }, + "SyncContactsDeleteInfo": { + "key": "SyncContactsDeleteInfo", + "value": "This will remove your contacts from the Telegram servers. If 'Sync Contacts' is enabled, contacts will be re-synced." + }, + "SyncContactsDeleteText": { + "key": "SyncContactsDeleteText", + "value": "This will remove your contacts from the Telegram servers.\n\nIf '**Sync Contacts**' is enabled, contacts will be re-synced." + }, + "SyncContactsDeleteTitle": { + "key": "SyncContactsDeleteTitle", + "value": "Delete contacts" + }, + "SyncContactsInfoOff": { + "key": "SyncContactsInfoOff", + "value": "Turn on to continuously sync contacts from this device with your account." + }, + "SyncContactsInfoOn": { + "key": "SyncContactsInfoOn", + "value": "Contacts from this device will be added to your account." + }, + "SyncContactsOff": { + "key": "SyncContactsOff", + "value": "Contacts from this device will not be added to this account." + }, + "SyncContactsOn": { + "key": "SyncContactsOn", + "value": "Contacts from this device will be added to this account." + }, + "SystemRoot": { + "key": "SystemRoot", + "value": "System Root" + }, + "TapForVideo": { + "key": "TapForVideo", + "value": "Tap for photo, hold for video" + }, + "TapHereGifs": { + "key": "TapHereGifs", + "value": "Tap here to access saved GIFs" + }, + "TapOnThePencil": { + "key": "TapOnThePencil", + "value": "Tap on the pencil to start a new chat" + }, + "TapToChange": { + "key": "TapToChange", + "value": "Tap to change" + }, + "TapToChangePhone": { + "key": "TapToChangePhone", + "value": "Tap to change phone number" + }, + "TapToDownload": { + "key": "TapToDownload", + "value": "Tap to download" + }, + "TapToEditWidget": { + "key": "TapToEditWidget", + "value": "tap to edit widget" + }, + "TapToEditWidgetShort": { + "key": "TapToEditWidgetShort", + "value": "tap to edit" + }, + "TapToSendLocation": { + "key": "TapToSendLocation", + "value": "Tap to send this location" + }, + "TapToTurnCamera": { + "key": "TapToTurnCamera", + "value": "Tap here to turn on your camera" + }, + "TapToViewAsList": { + "key": "TapToViewAsList", + "value": "Tap to view as a list." + }, + "Teal": { + "key": "Teal", + "value": "Teal" + }, + "TelegramCacheSize": { + "key": "TelegramCacheSize", + "value": "%s Telegram Cache" + }, + "TelegramContacts": { + "key": "TelegramContacts", + "zeroValue": null, + "oneValue": "%1$d contact on Telegram", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d contacts on Telegram" + }, + "TelegramFAQ": { + "key": "TelegramFAQ", + "value": "Telegram FAQ" + }, + "TelegramFaq": { + "key": "TelegramFaq", + "value": "Telegram FAQ" + }, + "TelegramFaqUrl": { + "key": "TelegramFaqUrl", + "value": "https://telegram.org/faq" + }, + "TelegramPassport": { + "key": "TelegramPassport", + "value": "Telegram Passport" + }, + "TelegramPassportCreatePassword": { + "key": "TelegramPassportCreatePassword", + "value": "CREATE A PASSWORD" + }, + "TelegramPassportCreatePasswordInfo": { + "key": "TelegramPassportCreatePasswordInfo", + "value": "Please create a password to secure your personal data with end-to-end encryption.\n\nThis password will also be required whenever you log in to Telegram on a new device." + }, + "TelegramPassportDelete": { + "key": "TelegramPassportDelete", + "value": "Delete Telegram Passport" + }, + "TelegramPassportDeleteAlert": { + "key": "TelegramPassportDeleteAlert", + "value": "Are you sure you want to delete your Telegram Passport?" + }, + "TelegramPassportDeleteTitle": { + "key": "TelegramPassportDeleteTitle", + "value": "Delete Telegram passport" + }, + "TelegramVersion": { + "key": "TelegramVersion", + "value": "Telegram for Android %1$s" + }, + "Terminate": { + "key": "Terminate", + "value": "Terminate" + }, + "TerminateAllSessions": { + "key": "TerminateAllSessions", + "value": "Terminate All Other Sessions" + }, + "TerminateAllWebSessions": { + "key": "TerminateAllWebSessions", + "value": "Disconnect All Websites" + }, + "TerminateSessionInfo": { + "key": "TerminateSessionInfo", + "value": "Tap on a session to terminate." + }, + "TerminateSessionQuestion": { + "key": "TerminateSessionQuestion", + "value": "Terminate this session?" + }, + "TerminateSessionText": { + "key": "TerminateSessionText", + "value": "Are you sure you want to terminate this session?" + }, + "TerminateWebSessionInfo": { + "key": "TerminateWebSessionInfo", + "value": "Tap to disconnect from your Telegram account." + }, + "TerminateWebSessionQuestion": { + "key": "TerminateWebSessionQuestion", + "value": "Disconnect %1$s?" + }, + "TerminateWebSessionStop": { + "key": "TerminateWebSessionStop", + "value": "Block %1$s" + }, + "TerminateWebSessionText": { + "key": "TerminateWebSessionText", + "value": "Are you sure you want to disconnect %1$s?" + }, + "TerminateWebSessionTitle": { + "key": "TerminateWebSessionTitle", + "value": "Disconnect website" + }, + "TerminateWebSessionsTitle": { + "key": "TerminateWebSessionsTitle", + "value": "Disconnect websites" + }, + "TermsOfService": { + "key": "TermsOfService", + "value": "Terms of Service" + }, + "TermsOfServiceLogin": { + "key": "TermsOfServiceLogin", + "value": "By signing up,\nyou agree to the *Terms of Service*." + }, + "TextCopied": { + "key": "TextCopied", + "value": "Text copied to clipboard" + }, + "TextSelectionHit": { + "key": "TextSelectionHit", + "value": "Hold the **word**, then move the cursor to select more text to copy." + }, + "TextSize": { + "key": "TextSize", + "value": "Message Text Size" + }, + "TextSizeHeader": { + "key": "TextSizeHeader", + "value": "Message text size" + }, + "Theme": { + "key": "Theme", + "value": "Theme" + }, + "ThemeArcticBlue": { + "key": "ThemeArcticBlue", + "value": "Arctic" + }, + "ThemeBlue": { + "key": "ThemeBlue", + "value": "Mono" + }, + "ThemeClassic": { + "key": "ThemeClassic", + "value": "Classic" + }, + "ThemeCreateHelp": { + "key": "ThemeCreateHelp", + "value": "Anyone can install your theme using this link. When you change the theme, it will be updated for all users who installed it.\n\nThe theme will be based on your currently selected theme and wallpaper." + }, + "ThemeCreateHelp2": { + "key": "ThemeCreateHelp2", + "value": "You can change the link of your theme.\n\nTheme links must be longer than 5 characters and can use a-z, 0-9 and underscores." + }, + "ThemeDark": { + "key": "ThemeDark", + "value": "Dark" + }, + "ThemeDarkBlue": { + "key": "ThemeDarkBlue", + "value": "Dark Blue" + }, + "ThemeDay": { + "key": "ThemeDay", + "value": "Day" + }, + "ThemeGraphite": { + "key": "ThemeGraphite", + "value": "Graphite" + }, + "ThemeHelpLink": { + "key": "ThemeHelpLink", + "value": "Your theme will be updated for all users each time you change it. Anyone can install it using this link:\n%1$s" + }, + "ThemeInfo": { + "key": "ThemeInfo", + "value": "Choose custom color schemes" + }, + "ThemeInstallCount": { + "key": "ThemeInstallCount", + "zeroValue": null, + "oneValue": "%1$d person is using this theme", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d people are using this theme" + }, + "ThemeNameInvalid": { + "key": "ThemeNameInvalid", + "value": "Sorry, theme name is invalid." + }, + "ThemeNamePlaceholder": { + "key": "ThemeNamePlaceholder", + "value": "Name" + }, + "ThemeNight": { + "key": "ThemeNight", + "value": "Night" + }, + "ThemeNotFound": { + "key": "ThemeNotFound", + "value": "Theme not found" + }, + "ThemeNotSupported": { + "key": "ThemeNotSupported", + "value": "Sorry, this color theme doesn’t support your device yet." + }, + "ThemePreview": { + "key": "ThemePreview", + "value": "Theme Preview" + }, + "ThemePreviewDialog1": { + "key": "ThemePreviewDialog1", + "value": "Eva Summer" + }, + "ThemePreviewDialog2": { + "key": "ThemePreviewDialog2", + "value": "Your inner Competition" + }, + "ThemePreviewDialog3": { + "key": "ThemePreviewDialog3", + "value": "Mike Apple" + }, + "ThemePreviewDialog4": { + "key": "ThemePreviewDialog4", + "value": "Paul Newman" + }, + "ThemePreviewDialog5": { + "key": "ThemePreviewDialog5", + "value": "Old Pirates" + }, + "ThemePreviewDialog6": { + "key": "ThemePreviewDialog6", + "value": "Kate Bright" + }, + "ThemePreviewDialog7": { + "key": "ThemePreviewDialog7", + "value": "Nick K" + }, + "ThemePreviewDialog8": { + "key": "ThemePreviewDialog8", + "value": "Adler Toberg" + }, + "ThemePreviewDialogMessage1": { + "key": "ThemePreviewDialogMessage1", + "value": "Reminds me of a Chinese prove..." + }, + "ThemePreviewDialogMessage2": { + "key": "ThemePreviewDialogMessage2", + "value": "hey, I've updated the source code." + }, + "ThemePreviewDialogMessage3": { + "key": "ThemePreviewDialogMessage3", + "value": "🤷‍♂️ Sticker" + }, + "ThemePreviewDialogMessage4": { + "key": "ThemePreviewDialogMessage4", + "value": "Any ideas?" + }, + "ThemePreviewDialogMessage5": { + "key": "ThemePreviewDialogMessage5", + "value": "Yo-ho-ho!" + }, + "ThemePreviewDialogMessage6": { + "key": "ThemePreviewDialogMessage6", + "value": "Hola!" + }, + "ThemePreviewDialogMessage7": { + "key": "ThemePreviewDialogMessage7", + "value": "These are not the droids you are looking for." + }, + "ThemePreviewDialogMessage8": { + "key": "ThemePreviewDialogMessage8", + "value": "Did someone say peanut butter?" + }, + "ThemePreviewLine1": { + "key": "ThemePreviewLine1", + "value": "Reinhardt, we need to find you some new tunes 🎶." + }, + "ThemePreviewLine2": { + "key": "ThemePreviewLine2", + "value": "I can't even take you seriously right now." + }, + "ThemePreviewLine3": { + "key": "ThemePreviewLine3", + "value": "Ah, you kids today with techno music! You should enjoy the classics, like Hasselhoff!" + }, + "ThemePreviewLine3Reply": { + "key": "ThemePreviewLine3Reply", + "value": "Lucio" + }, + "ThemePreviewLine4": { + "key": "ThemePreviewLine4", + "value": "Bring it on! I LIVE for this!" + }, + "ThemePreviewSongPerformer": { + "key": "ThemePreviewSongPerformer", + "value": "David Hasselhoff" + }, + "ThemePreviewSongTitle": { + "key": "ThemePreviewSongTitle", + "value": "True Survivor" + }, + "ThemePreviewTitle": { + "key": "ThemePreviewTitle", + "value": "Reinhardt" + }, + "ThemeResetToDefaults": { + "key": "ThemeResetToDefaults", + "value": "Reset to default" + }, + "ThemeResetToDefaultsText": { + "key": "ThemeResetToDefaultsText", + "value": "Are you sure you want to reset text size and color settings?" + }, + "ThemeResetToDefaultsTitle": { + "key": "ThemeResetToDefaultsTitle", + "value": "Reset settings" + }, + "ThemeSetUrl": { + "key": "ThemeSetUrl", + "value": "Set link" + }, + "ThemeSetUrlHelp": { + "key": "ThemeSetUrlHelp", + "value": "You can use a-z, 0-9 and underscores.\nMinimum length is 5 characters." + }, + "ThemeUrl": { + "key": "ThemeUrl", + "value": "Theme Link" + }, + "TimeLimitHelp": { + "key": "TimeLimitHelp", + "value": "You can make the link expire after a certain time." + }, + "TimeLimitHint": { + "key": "TimeLimitHint", + "value": "Set custom duration" + }, + "TimeToEdit": { + "key": "TimeToEdit", + "value": "%1$s" + }, + "TimeToEditExpired": { + "key": "TimeToEditExpired", + "value": "Sorry, editing time expired." + }, + "Times": { + "key": "Times", + "zeroValue": null, + "oneValue": "%1$d time", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d times" + }, + "TintHighlights": { + "key": "TintHighlights", + "value": "HIGHLIGHTS" + }, + "TintShadows": { + "key": "TintShadows", + "value": "SHADOWS" + }, + "TodayAt": { + "key": "TodayAt", + "value": "at" + }, + "TodayAtFormatted": { + "key": "TodayAtFormatted", + "value": "at %1$s" + }, + "TodayAtFormattedWithToday": { + "key": "TodayAtFormattedWithToday", + "value": "today at %1$s" + }, + "TooManyCommunities": { + "key": "TooManyCommunities", + "value": "Too Many Communities" + }, + "TooManyCommunitiesHintCreate": { + "key": "TooManyCommunitiesHintCreate", + "value": "Sorry, you are a member of too many groups or channels. Please leave some before creating a new one." + }, + "TooManyCommunitiesHintEdit": { + "key": "TooManyCommunitiesHintEdit", + "value": "Sorry, you are a member of too many groups and channels. For technical reasons, you need to leave some first before changing this setting in your groups." + }, + "TooManyCommunitiesHintJoin": { + "key": "TooManyCommunitiesHintJoin", + "value": "Sorry, you are a member of too many groups or channels. Please leave some before joining a new one." + }, + "TooManyTries": { + "key": "TooManyTries", + "value": "Too many tries.\nPlease try again in %1$s." + }, + "TopAdmins": { + "key": "TopAdmins", + "value": "Top admins" + }, + "TopDaysOfWeekChartTitle": { + "key": "TopDaysOfWeekChartTitle", + "value": "Top days of week" + }, + "TopHoursChartTitle": { + "key": "TopHoursChartTitle", + "value": "Views by hours (UTC)" + }, + "TopInviters": { + "key": "TopInviters", + "value": "Top inviters" + }, + "TopMembers": { + "key": "TopMembers", + "value": "Top members" + }, + "TosAgeText": { + "key": "TosAgeText", + "value": "Tap Agree to confirm that you are %1$s or over." + }, + "TosAgeTitle": { + "key": "TosAgeTitle", + "value": "Age Verification" + }, + "TosDecline": { + "key": "TosDecline", + "value": "We're very sorry, but this means you can't sign up for Telegram.\n\nUnlike others, we don't use your data for ad targeting or other commercial purposes. Telegram only stores the information it needs to function as a feature-rich cloud service. You can adjust how we use your data (e.g., delete synced contacts) in Privacy & Security settings.\n\nBut if you're generally not OK with Telegram's modest requirements, it won't be possible for us to provide you with this service." + }, + "TosDeclineDeleteAccount": { + "key": "TosDeclineDeleteAccount", + "value": "Warning, this will irreversibly delete your Telegram account along with all the data you store in the Telegram cloud.\n\nImportant: You can cancel now and export your data before deleting your account instead of losing it all. (To do this, open the latest version of Telegram Desktop and go to Settings > Advanced > Export Telegram data.)" + }, + "TosUpdateDecline": { + "key": "TosUpdateDecline", + "value": "We're very sorry, but this means we must part ways here. Unlike others, we don't use your data for ad targeting or other commercial purposes. Telegram only stores the information it needs to function as a feature-rich cloud service. You can adjust how we use your data (e.g., delete synced contacts) in Privacy & Security settings.\n\nBut if you're generally not OK with Telegram's modest needs, it won't be possible for us to provide this service. You can deactivate your account now — or look around some more and deactivate it later if you feel you're not happy with the way we use your data." + }, + "TotalDataUsage": { + "key": "TotalDataUsage", + "value": "Total" + }, + "TotalDeviceFreeSize": { + "key": "TotalDeviceFreeSize", + "value": "%s Free" + }, + "TotalDeviceSize": { + "key": "TotalDeviceSize", + "value": "%s Other Data" + }, + "TurnPasswordOff": { + "key": "TurnPasswordOff", + "value": "Turn Password Off" + }, + "TurnPasswordOffPassport": { + "key": "TurnPasswordOffPassport", + "value": "Warning! All data saved in your Telegram Passport will be lost!" + }, + "TurnPasswordOffQuestion": { + "key": "TurnPasswordOffQuestion", + "value": "Are you sure you want to disable your password?" + }, + "TurnPasswordOffQuestionTitle": { + "key": "TurnPasswordOffQuestionTitle", + "value": "Disable password" + }, + "TwoStepVerification": { + "key": "TwoStepVerification", + "value": "Two-Step Verification" + }, + "TwoStepVerificationPasswordReturnPassport": { + "key": "TwoStepVerificationPasswordReturnPassport", + "value": "Return to Passport" + }, + "TwoStepVerificationPasswordReturnSettings": { + "key": "TwoStepVerificationPasswordReturnSettings", + "value": "Return to Settings" + }, + "TwoStepVerificationPasswordSet": { + "key": "TwoStepVerificationPasswordSet", + "value": "Password Set!" + }, + "TwoStepVerificationPasswordSetInfo": { + "key": "TwoStepVerificationPasswordSetInfo", + "value": "This password will be required when you log in on a new device in addition to the code you get in the SMS." + }, + "TwoStepVerificationSetPassword": { + "key": "TwoStepVerificationSetPassword", + "value": "Set Password" + }, + "TwoStepVerificationShowPassword": { + "key": "TwoStepVerificationShowPassword", + "value": "Show password" + }, + "TwoStepVerificationTitle": { + "key": "TwoStepVerificationTitle", + "value": "Two-Step Verification" + }, + "TypeLocationGroup": { + "key": "TypeLocationGroup", + "value": "Link" + }, + "TypeLocationGroupEdit": { + "key": "TypeLocationGroupEdit", + "value": "Tap to add a permanent link" + }, + "TypeMessage": { + "key": "TypeMessage", + "value": "Message" + }, + "TypePrivate": { + "key": "TypePrivate", + "value": "Private" + }, + "TypePrivateGroup": { + "key": "TypePrivateGroup", + "value": "Private" + }, + "TypePublic": { + "key": "TypePublic", + "value": "Public" + }, + "TypePublicGroup": { + "key": "TypePublicGroup", + "value": "Public" + }, + "TypeScheduleMessage": { + "key": "TypeScheduleMessage", + "value": "Schedule message" + }, + "Typing": { + "key": "Typing", + "value": "typing..." + }, + "URL": { + "key": "URL", + "value": "URL" + }, + "Unarchive": { + "key": "Unarchive", + "value": "Unarchive" + }, + "Unavailable": { + "key": "Unavailable", + "value": "Unavailable" + }, + "Unban": { + "key": "Unban", + "value": "Unban" + }, + "UnbanText": { + "key": "UnbanText", + "value": "Press and hold user to unban." + }, + "Unblock": { + "key": "Unblock", + "value": "Unblock" + }, + "UnblockText": { + "key": "UnblockText", + "value": "Tap and hold on user to unblock." + }, + "Underline": { + "key": "Underline", + "value": "Underline" + }, + "Undo": { + "key": "Undo", + "value": "UNDO" + }, + "UndoAllCustom": { + "key": "UndoAllCustom", + "value": "Undo all custom notification settings for all your contacts, groups and channels." + }, + "UnhideFromTop": { + "key": "UnhideFromTop", + "value": "Pin" + }, + "UnknownError": { + "key": "UnknownError", + "value": "Unknown error" + }, + "UnlockFingerprint": { + "key": "UnlockFingerprint", + "value": "Unlock with Fingerprint" + }, + "UnmuteNotifications": { + "key": "UnmuteNotifications", + "value": "Unmute" + }, + "UnofficialApp": { + "key": "UnofficialApp", + "value": "unofficial app" + }, + "UnpinAllMessages": { + "key": "UnpinAllMessages", + "value": "UNPIN ALL MESSAGES" + }, + "UnpinFromTop": { + "key": "UnpinFromTop", + "value": "Unpin from top" + }, + "UnpinMessage": { + "key": "UnpinMessage", + "value": "Unpin" + }, + "UnpinMessageAlert": { + "key": "UnpinMessageAlert", + "value": "Do you want to unpin this message?" + }, + "UnpinMessageAlertTitle": { + "key": "UnpinMessageAlertTitle", + "value": "Unpin message" + }, + "UnreadMessages": { + "key": "UnreadMessages", + "value": "Unread Messages" + }, + "UnsupportedAttachment": { + "key": "UnsupportedAttachment", + "value": "Unsupported attachment" + }, + "UnsupportedMedia": { + "key": "UnsupportedMedia", + "value": "This message is not supported by your version of Telegram. Update the app to view: https://telegram.org/update" + }, + "Unvote": { + "key": "Unvote", + "value": "Retract Vote" + }, + "Update": { + "key": "Update", + "value": "UPDATE" + }, + "UpdateApp": { + "key": "UpdateApp", + "value": "Update app" + }, + "UpdateAppAlert": { + "key": "UpdateAppAlert", + "value": "Sorry, your Telegram app is out of date and can't handle this request. Please update Telegram." + }, + "UpdateContactsMessage": { + "key": "UpdateContactsMessage", + "value": "Telegram has detected many unsynced contacts, would you like to sync them now? Choose 'OK' if you're using your own device, SIM card and Google account." + }, + "UpdateContactsTitle": { + "key": "UpdateContactsTitle", + "value": "Update contacts?" + }, + "UpdateNow": { + "key": "UpdateNow", + "value": "UPDATE NOW" + }, + "UpdateTelegram": { + "key": "UpdateTelegram", + "value": "Update Telegram" + }, + "UpdatedMinutes": { + "key": "UpdatedMinutes", + "zeroValue": null, + "oneValue": "updated %1$d minute ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "updated %1$d minutes ago" + }, + "Updating": { + "key": "Updating", + "value": "Updating..." + }, + "UpgradeGroup": { + "key": "UpgradeGroup", + "value": "Upgrade to Supergroup" + }, + "UploadImage": { + "key": "UploadImage", + "value": "Upload image" + }, + "UploadItems": { + "key": "UploadItems", + "value": "Upload %1$s" + }, + "UsbActive": { + "key": "UsbActive", + "value": "USB transfer active" + }, + "UseDifferentTheme": { + "key": "UseDifferentTheme", + "value": "Use a different theme" + }, + "UseDifferentThemeInfo": { + "key": "UseDifferentThemeInfo", + "value": "You can also use an existing custom theme as a foundation for your theme." + }, + "UseLessDataAlways": { + "key": "UseLessDataAlways", + "value": "Always" + }, + "UseLessDataNever": { + "key": "UseLessDataNever", + "value": "Never" + }, + "UseLessDataOnMobile": { + "key": "UseLessDataOnMobile", + "value": "Only on mobile data" + }, + "UseLessDataOnRoaming": { + "key": "UseLessDataOnRoaming", + "value": "Only while roaming" + }, + "UseProxyAddress": { + "key": "UseProxyAddress", + "value": "Server" + }, + "UseProxyForCalls": { + "key": "UseProxyForCalls", + "value": "Use proxy for calls" + }, + "UseProxyForCallsInfo": { + "key": "UseProxyForCallsInfo", + "value": "Proxy servers may degrade the quality of your calls." + }, + "UseProxyInfo": { + "key": "UseProxyInfo", + "value": "SOCKS5 proxy settings." + }, + "UseProxyPassword": { + "key": "UseProxyPassword", + "value": "Password" + }, + "UseProxyPort": { + "key": "UseProxyPort", + "value": "Port" + }, + "UseProxySecret": { + "key": "UseProxySecret", + "value": "Secret" + }, + "UseProxySettings": { + "key": "UseProxySettings", + "value": "Use Proxy" + }, + "UseProxySocks5": { + "key": "UseProxySocks5", + "value": "SOCKS5 Proxy" + }, + "UseProxySponsor": { + "key": "UseProxySponsor", + "value": "Proxy sponsor" + }, + "UseProxySponsorInfo": { + "key": "UseProxySponsorInfo", + "value": "This channel is shown by your proxy server. To remove this channel from your chat list, disable the proxy in Telegram Settings." + }, + "UseProxyTelegram": { + "key": "UseProxyTelegram", + "value": "MTProto Proxy" + }, + "UseProxyTelegramError": { + "key": "UseProxyTelegramError", + "value": "The proxy you are using is not configured correctly and will be disabled. Please find another one." + }, + "UseProxyTelegramInfo": { + "key": "UseProxyTelegramInfo", + "value": "MTProto proxy settings." + }, + "UseProxyTelegramInfo2": { + "key": "UseProxyTelegramInfo2", + "value": "This proxy may display a sponsored channel in your chat list. This doesn't reveal any of your Telegram traffic." + }, + "UseProxyUsername": { + "key": "UseProxyUsername", + "value": "Username" + }, + "UserBio": { + "key": "UserBio", + "value": "Bio" + }, + "UserBioDetail": { + "key": "UserBioDetail", + "value": "Add a few words about yourself" + }, + "UserBioEmpty": { + "key": "UserBioEmpty", + "value": "None" + }, + "UserBioInfo": { + "key": "UserBioInfo", + "value": "You can add a few lines about yourself. Anyone who opens your profile will see this text." + }, + "UserBlocked": { + "key": "UserBlocked", + "value": "User blocked" + }, + "UserChannelTooMuchJoin": { + "key": "UserChannelTooMuchJoin", + "value": "Sorry, the target user is a member of too many groups and channels. Please ask them to leave some first." + }, + "UserRemovedBy": { + "key": "UserRemovedBy", + "value": "Removed by %1$s" + }, + "UserRemovedFromChatHint": { + "key": "UserRemovedFromChatHint", + "value": "**%1$s** removed from **%2$s**" + }, + "UserRestricted": { + "key": "UserRestricted", + "value": "Sorry, you are not allowed to do this." + }, + "UserRestrictions": { + "key": "UserRestrictions", + "value": "User Permissions" + }, + "UserRestrictionsApplyChanges": { + "key": "UserRestrictionsApplyChanges", + "value": "Apply Changes?" + }, + "UserRestrictionsApplyChangesText": { + "key": "UserRestrictionsApplyChangesText", + "value": "You have changed this user's rights in **%1$s**. Apply changes?" + }, + "UserRestrictionsBlock": { + "key": "UserRestrictionsBlock", + "value": "Ban and remove from group" + }, + "UserRestrictionsBy": { + "key": "UserRestrictionsBy", + "value": "Restricted by %1$s" + }, + "UserRestrictionsCanDo": { + "key": "UserRestrictionsCanDo", + "value": "What can this user do?" + }, + "UserRestrictionsChangeInfo": { + "key": "UserRestrictionsChangeInfo", + "value": "Change Chat Info" + }, + "UserRestrictionsCustom": { + "key": "UserRestrictionsCustom", + "value": "Custom" + }, + "UserRestrictionsDisabled": { + "key": "UserRestrictionsDisabled", + "value": "This option is disabled for all members in Group Permissions" + }, + "UserRestrictionsDuration": { + "key": "UserRestrictionsDuration", + "value": "Duration" + }, + "UserRestrictionsEmbedLinks": { + "key": "UserRestrictionsEmbedLinks", + "value": "Embed Links" + }, + "UserRestrictionsInviteUsers": { + "key": "UserRestrictionsInviteUsers", + "value": "Add Users" + }, + "UserRestrictionsNoChangeInfo": { + "key": "UserRestrictionsNoChangeInfo", + "value": "can't change Info" + }, + "UserRestrictionsNoEmbedLinks": { + "key": "UserRestrictionsNoEmbedLinks", + "value": "no embed links" + }, + "UserRestrictionsNoInviteUsers": { + "key": "UserRestrictionsNoInviteUsers", + "value": "can't add users" + }, + "UserRestrictionsNoPinMessages": { + "key": "UserRestrictionsNoPinMessages", + "value": "no pins" + }, + "UserRestrictionsNoRead": { + "key": "UserRestrictionsNoRead", + "value": "can't read" + }, + "UserRestrictionsNoSend": { + "key": "UserRestrictionsNoSend", + "value": "can't send messages" + }, + "UserRestrictionsNoSendMedia": { + "key": "UserRestrictionsNoSendMedia", + "value": "no media" + }, + "UserRestrictionsNoSendPolls": { + "key": "UserRestrictionsNoSendPolls", + "value": "no polls" + }, + "UserRestrictionsNoSendStickers": { + "key": "UserRestrictionsNoSendStickers", + "value": "no stickers & GIFs" + }, + "UserRestrictionsPinMessages": { + "key": "UserRestrictionsPinMessages", + "value": "Pin Messages" + }, + "UserRestrictionsRead": { + "key": "UserRestrictionsRead", + "value": "Read Messages" + }, + "UserRestrictionsSend": { + "key": "UserRestrictionsSend", + "value": "Send Messages" + }, + "UserRestrictionsSendMedia": { + "key": "UserRestrictionsSendMedia", + "value": "Send Media" + }, + "UserRestrictionsSendPolls": { + "key": "UserRestrictionsSendPolls", + "value": "Send Polls" + }, + "UserRestrictionsSendStickers": { + "key": "UserRestrictionsSendStickers", + "value": "Send Stickers and GIFs" + }, + "UserRestrictionsUntil": { + "key": "UserRestrictionsUntil", + "value": "Restricted until" + }, + "UserRestrictionsUntilForever": { + "key": "UserRestrictionsUntilForever", + "value": "Forever" + }, + "UserSetAsAdminHint": { + "key": "UserSetAsAdminHint", + "value": "**%1$s** promoted to admin" + }, + "UserUnblocked": { + "key": "UserUnblocked", + "value": "User unblocked" + }, + "Username": { + "key": "Username", + "value": "Username" + }, + "UsernameAvailable": { + "key": "UsernameAvailable", + "value": "%1$s is available." + }, + "UsernameChecking": { + "key": "UsernameChecking", + "value": "Checking username..." + }, + "UsernameCopied": { + "key": "UsernameCopied", + "value": "Username copied to clipboard." + }, + "UsernameEmpty": { + "key": "UsernameEmpty", + "value": "None" + }, + "UsernameHelp": { + "key": "UsernameHelp", + "value": "You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters." + }, + "UsernameHelpLink": { + "key": "UsernameHelpLink", + "value": "This link opens a chat with you:\n%1$s" + }, + "UsernameInUse": { + "key": "UsernameInUse", + "value": "Sorry, this username is already taken." + }, + "UsernameInvalid": { + "key": "UsernameInvalid", + "value": "Sorry, this username is invalid." + }, + "UsernameInvalidLong": { + "key": "UsernameInvalidLong", + "value": "The username must not exceed 32 characters." + }, + "UsernameInvalidShort": { + "key": "UsernameInvalidShort", + "value": "A username must have at least 5 characters." + }, + "UsernameInvalidStartNumber": { + "key": "UsernameInvalidStartNumber", + "value": "Usernames can't start with a number." + }, + "UsernamePlaceholder": { + "key": "UsernamePlaceholder", + "value": "Your Username" + }, + "Users": { + "key": "Users", + "zeroValue": null, + "oneValue": "%1$d user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d users" + }, + "UsersCount": { + "key": "UsersCount", + "zeroValue": null, + "oneValue": "%1$d user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d users" + }, + "UsersCountTitle": { + "key": "UsersCountTitle", + "zeroValue": null, + "oneValue": "%1$d user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d users" + }, + "UsersPluralized": { + "key": "UsersPluralized", + "zeroValue": null, + "oneValue": "%@ user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ users" + }, + "UsesLimitHelp": { + "key": "UsesLimitHelp", + "value": "You can make the link expire after it has been used for a certain number of times." + }, + "UsesLimitHint": { + "key": "UsesLimitHint", + "value": "Enter custom limit" + }, + "VerificationCode": { + "key": "VerificationCode", + "value": "Verification code" + }, + "ViaBot": { + "key": "ViaBot", + "value": "via" + }, + "Vibrate": { + "key": "Vibrate", + "value": "Vibrate" + }, + "VibrationDefault": { + "key": "VibrationDefault", + "value": "Default" + }, + "VibrationDisabled": { + "key": "VibrationDisabled", + "value": "Disabled" + }, + "VideoCall": { + "key": "VideoCall", + "value": "Video Call" + }, + "VideoCallAlert": { + "key": "VideoCallAlert", + "value": "Are you sure you want to video call **%1$s**?" + }, + "VideoCallAlertTitle": { + "key": "VideoCallAlertTitle", + "value": "Video Call" + }, + "VideoCallViaTelegram": { + "key": "VideoCallViaTelegram", + "value": "Telegram Video Call" + }, + "VideoCaption": { + "key": "VideoCaption", + "value": "Video Caption" + }, + "VideoDoesNotSupportStreaming": { + "key": "VideoDoesNotSupportStreaming", + "value": "This video is not optimized for streaming. You may need to download it in full to play it." + }, + "VideoMessagesAutodownload": { + "key": "VideoMessagesAutodownload", + "value": "Video messages" + }, + "VideoQualityIsTooLow": { + "key": "VideoQualityIsTooLow", + "value": "Video quality is too low to change compression settings." + }, + "VideoSavedHint": { + "key": "VideoSavedHint", + "value": "Video saved to gallery" + }, + "VideoSavedToDownloadsHint": { + "key": "VideoSavedToDownloadsHint", + "value": "Video saved to downloads" + }, + "Videos": { + "key": "Videos", + "zeroValue": null, + "oneValue": "%1$d video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d videos" + }, + "VideosSavedHint": { + "key": "VideosSavedHint", + "zeroValue": null, + "oneValue": "Video saved to gallery", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d videos saved to gallery" + }, + "VideosSelected": { + "key": "VideosSelected", + "zeroValue": null, + "oneValue": "%1$d video selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d videos selected" + }, + "ViewChannelStats": { + "key": "ViewChannelStats", + "value": "View Channel Stats" + }, + "ViewContact": { + "key": "ViewContact", + "value": "VIEW CONTACT" + }, + "ViewDetails": { + "key": "ViewDetails", + "value": "VIEW CONTACT" + }, + "ViewDiscussion": { + "key": "ViewDiscussion", + "value": "View discussion" + }, + "ViewExceptions": { + "key": "ViewExceptions", + "value": "View Exceptions" + }, + "ViewInChat": { + "key": "ViewInChat", + "value": "View in chat" + }, + "ViewMessage": { + "key": "ViewMessage", + "value": "Open Message" + }, + "ViewMessageStatistic": { + "key": "ViewMessageStatistic", + "value": "Message Statistics" + }, + "ViewPackPreview": { + "key": "ViewPackPreview", + "value": "View Pack" + }, + "ViewReplies": { + "key": "ViewReplies", + "zeroValue": null, + "oneValue": "View %1$d Reply", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "View %1$d Replies" + }, + "ViewStats": { + "key": "ViewStats", + "value": "View Stats" + }, + "ViewThread": { + "key": "ViewThread", + "value": "View Thread" + }, + "ViewingMembers": { + "key": "ViewingMembers", + "value": "Viewing Members" + }, + "Views": { + "key": "Views", + "zeroValue": null, + "oneValue": "%1$s view", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$s views" + }, + "ViewsBySourceChartTitle": { + "key": "ViewsBySourceChartTitle", + "value": "Views by source" + }, + "ViewsPerPost": { + "key": "ViewsPerPost", + "value": "Views Per Post" + }, + "Vignette": { + "key": "Vignette", + "value": "Vignette" + }, + "Voice": { + "key": "Voice", + "zeroValue": null, + "oneValue": "%1$d voice message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d voice messages" + }, + "VoipAnswerCall": { + "key": "VoipAnswerCall", + "value": "Answer" + }, + "VoipAnsweringAsAccount": { + "key": "VoipAnsweringAsAccount", + "value": "answering as %s" + }, + "VoipAudioRoutingBluetooth": { + "key": "VoipAudioRoutingBluetooth", + "value": "Bluetooth" + }, + "VoipAudioRoutingEarpiece": { + "key": "VoipAudioRoutingEarpiece", + "value": "Earpiece" + }, + "VoipAudioRoutingHeadset": { + "key": "VoipAudioRoutingHeadset", + "value": "Headset" + }, + "VoipAudioRoutingSpeaker": { + "key": "VoipAudioRoutingSpeaker", + "value": "Speaker" + }, + "VoipBusy": { + "key": "VoipBusy", + "value": "Line busy" + }, + "VoipCallEnded": { + "key": "VoipCallEnded", + "value": "Call ended" + }, + "VoipChatJoin": { + "key": "VoipChatJoin", + "value": "Join" + }, + "VoipConnecting": { + "key": "VoipConnecting", + "value": "Connecting" + }, + "VoipDeclineCall": { + "key": "VoipDeclineCall", + "value": "Decline" + }, + "VoipEndCall": { + "key": "VoipEndCall", + "value": "End call" + }, + "VoipErrorUnknown": { + "key": "VoipErrorUnknown", + "value": "Can't place a Telegram call at the moment." + }, + "VoipExchangingKeys": { + "key": "VoipExchangingKeys", + "value": "Exchanging encryption keys" + }, + "VoipFailed": { + "key": "VoipFailed", + "value": "Failed to connect" + }, + "VoipFeedbackCommentHint": { + "key": "VoipFeedbackCommentHint", + "value": "Add an optional comment" + }, + "VoipFlip": { + "key": "VoipFlip", + "value": "Flip" + }, + "VoipGroupAdd": { + "key": "VoipGroupAdd", + "value": "Add" + }, + "VoipGroupAddMemberText": { + "key": "VoipGroupAddMemberText", + "value": "Do you want to add **%1$s** to **%2$s**?" + }, + "VoipGroupAddMemberTitle": { + "key": "VoipGroupAddMemberTitle", + "value": "Add Member" + }, + "VoipGroupAllCanSpeak": { + "key": "VoipGroupAllCanSpeak", + "value": "New participants can speak" + }, + "VoipGroupAllowToSpeak": { + "key": "VoipGroupAllowToSpeak", + "value": "Allow to speak" + }, + "VoipGroupConnecting": { + "key": "VoipGroupConnecting", + "value": "Connecting..." + }, + "VoipGroupCopyInviteLink": { + "key": "VoipGroupCopyInviteLink", + "value": "Copy Invite Link" + }, + "VoipGroupCopyInviteLinkCopied": { + "key": "VoipGroupCopyInviteLinkCopied", + "value": "Invite link copied to clipboard." + }, + "VoipGroupEnd": { + "key": "VoipGroupEnd", + "value": "End" + }, + "VoipGroupEndAlertText": { + "key": "VoipGroupEndAlertText", + "value": "Are you sure you want to end this voice chat?" + }, + "VoipGroupEndAlertTitle": { + "key": "VoipGroupEndAlertTitle", + "value": "End voice chat" + }, + "VoipGroupEndChat": { + "key": "VoipGroupEndChat", + "value": "End voice chat" + }, + "VoipGroupEndedStartNew": { + "key": "VoipGroupEndedStartNew", + "value": "Voice chat ended. Start a new one?" + }, + "VoipGroupInviteAlreadyParticipant": { + "key": "VoipGroupInviteAlreadyParticipant", + "value": "The selected user is already in this voice chat." + }, + "VoipGroupInviteMember": { + "key": "VoipGroupInviteMember", + "value": "Invite Members" + }, + "VoipGroupInviteText": { + "key": "VoipGroupInviteText", + "value": "Hey! Join our voice chat: %1$s" + }, + "VoipGroupInvitedToVoiceChat": { + "key": "VoipGroupInvitedToVoiceChat", + "value": "un1 invited un2 to the voice chat" + }, + "VoipGroupInvitedUser": { + "key": "VoipGroupInvitedUser", + "value": "You invited **%1$s** to the voice chat." + }, + "VoipGroupJoinAnonymousAdmin": { + "key": "VoipGroupJoinAnonymousAdmin", + "value": "Sorry, you can't join voice chats as an anonymous administrator." + }, + "VoipGroupJoinCall": { + "key": "VoipGroupJoinCall", + "value": "Join voice chat" + }, + "VoipGroupLeave": { + "key": "VoipGroupLeave", + "value": "Leave" + }, + "VoipGroupLeaveAlertEndChat": { + "key": "VoipGroupLeaveAlertEndChat", + "value": "End voice chat" + }, + "VoipGroupLeaveAlertText": { + "key": "VoipGroupLeaveAlertText", + "value": "Are you sure you want to leave this voice chat?" + }, + "VoipGroupLeaveAlertTitle": { + "key": "VoipGroupLeaveAlertTitle", + "value": "Leave voice chat" + }, + "VoipGroupMute": { + "key": "VoipGroupMute", + "value": "Mute" + }, + "VoipGroupMuteForMe": { + "key": "VoipGroupMuteForMe", + "value": "Mute for me" + }, + "VoipGroupMuteMemberAlertText": { + "key": "VoipGroupMuteMemberAlertText", + "value": "Are you sure you want to mute **%1$s** in this voice chat?" + }, + "VoipGroupMuteMemberAlertTitle": { + "key": "VoipGroupMuteMemberAlertTitle", + "value": "Mute microphone" + }, + "VoipGroupMutedForMe": { + "key": "VoipGroupMutedForMe", + "value": "Muted for me" + }, + "VoipGroupOffline": { + "key": "VoipGroupOffline", + "value": "You're currently offline. Please connect to the Internet to join voice chats." + }, + "VoipGroupOfflineAirplane": { + "key": "VoipGroupOfflineAirplane", + "value": "You currently have airplane mode enabled. Please turn it off or connect to Wi-Fi to join voice chats." + }, + "VoipGroupOnlyAdminsCanSpeak": { + "key": "VoipGroupOnlyAdminsCanSpeak", + "value": "New participants are muted" + }, + "VoipGroupOpenProfile": { + "key": "VoipGroupOpenProfile", + "value": "Open Profile" + }, + "VoipGroupOpenVoiceChat": { + "key": "VoipGroupOpenVoiceChat", + "value": "Open voice chat" + }, + "VoipGroupRecordCall": { + "key": "VoipGroupRecordCall", + "value": "Start recording" + }, + "VoipGroupRemoveMemberAlertText": { + "key": "VoipGroupRemoveMemberAlertText", + "value": "Do you want to remove %1$s from the group chat?" + }, + "VoipGroupRemoveMemberAlertTitle": { + "key": "VoipGroupRemoveMemberAlertTitle", + "value": "Remove member" + }, + "VoipGroupRemovedFromGroup": { + "key": "VoipGroupRemovedFromGroup", + "value": "**%1$s** removed from the group." + }, + "VoipGroupSearchMembers": { + "key": "VoipGroupSearchMembers", + "value": "Search members to invite..." + }, + "VoipGroupShareInviteLink": { + "key": "VoipGroupShareInviteLink", + "value": "Share invite link" + }, + "VoipGroupStopRecordCall": { + "key": "VoipGroupStopRecordCall", + "value": "Stop recording" + }, + "VoipGroupTooMuch": { + "key": "VoipGroupTooMuch", + "value": "Sorry, this voice chat is full." + }, + "VoipGroupUnmute": { + "key": "VoipGroupUnmute", + "value": "Unmute" + }, + "VoipGroupUnmuteForMe": { + "key": "VoipGroupUnmuteForMe", + "value": "Unmute for me" + }, + "VoipGroupUserCanNowSpeak": { + "key": "VoipGroupUserCanNowSpeak", + "value": "**%1$s** can now speak." + }, + "VoipGroupUserCanNowSpeakForYou": { + "key": "VoipGroupUserCanNowSpeakForYou", + "value": "**%1$s** is now unmuted for you." + }, + "VoipGroupUserCantNowSpeak": { + "key": "VoipGroupUserCantNowSpeak", + "value": "**%1$s** is now muted in this chat." + }, + "VoipGroupUserCantNowSpeakForYou": { + "key": "VoipGroupUserCantNowSpeakForYou", + "value": "**%1$s** is now muted in this chat for you." + }, + "VoipGroupUserRemove": { + "key": "VoipGroupUserRemove", + "value": "Remove" + }, + "VoipGroupViewVoiceChat": { + "key": "VoipGroupViewVoiceChat", + "value": "VIEW VOICE CHAT" + }, + "VoipGroupVoiceChat": { + "key": "VoipGroupVoiceChat", + "value": "Voice Chat" + }, + "VoipGroupVolume": { + "key": "VoipGroupVolume", + "value": "Volume" + }, + "VoipHangingUp": { + "key": "VoipHangingUp", + "value": "Hanging up" + }, + "VoipHoldAndTalk": { + "key": "VoipHoldAndTalk", + "value": "or hold and talk" + }, + "VoipInCallBranding": { + "key": "VoipInCallBranding", + "value": "Telegram Call" + }, + "VoipInCallBrandingWithName": { + "key": "VoipInCallBrandingWithName", + "value": "Telegram Call to %s" + }, + "VoipInVideoCallBranding": { + "key": "VoipInVideoCallBranding", + "value": "Telegram Video Call" + }, + "VoipInVideoCallBrandingWithName": { + "key": "VoipInVideoCallBrandingWithName", + "value": "Telegram Video Call to %s" + }, + "VoipIncoming": { + "key": "VoipIncoming", + "value": "Incoming call" + }, + "VoipMute": { + "key": "VoipMute", + "value": "Mute" + }, + "VoipMutedByAdmin": { + "key": "VoipMutedByAdmin", + "value": "Muted by admin" + }, + "VoipMutedByAdminInfo": { + "key": "VoipMutedByAdminInfo", + "value": "You are in Listen Only Mode" + }, + "VoipMutedByAdminShort": { + "key": "VoipMutedByAdminShort", + "value": "Muted" + }, + "VoipNeedMicCameraPermission": { + "key": "VoipNeedMicCameraPermission", + "value": "Telegram needs access to your microphone and camera so that you can make video calls." + }, + "VoipNeedMicPermission": { + "key": "VoipNeedMicPermission", + "value": "Telegram needs access to your microphone so that you can make calls." + }, + "VoipNotificationSettings": { + "key": "VoipNotificationSettings", + "value": "Calls" + }, + "VoipOffline": { + "key": "VoipOffline", + "value": "You're currently offline. Please connect to the Internet in order to make calls." + }, + "VoipOfflineAirplane": { + "key": "VoipOfflineAirplane", + "value": "You currently have airplane mode enabled. Please turn it off or connect to Wi-Fi in order to make calls." + }, + "VoipOfflineAirplaneTitle": { + "key": "VoipOfflineAirplaneTitle", + "value": "Airplane Mode" + }, + "VoipOfflineOpenSettings": { + "key": "VoipOfflineOpenSettings", + "value": "Settings" + }, + "VoipOfflineTitle": { + "key": "VoipOfflineTitle", + "value": "Offline" + }, + "VoipOngoingAlert": { + "key": "VoipOngoingAlert", + "value": "End call with **%1$s** and start a new one with **%2$s**?" + }, + "VoipOngoingAlert2": { + "key": "VoipOngoingAlert2", + "value": "End call with **%1$s** and start voice chat in **%2$s**?" + }, + "VoipOngoingAlertTitle": { + "key": "VoipOngoingAlertTitle", + "value": "Another call in progress" + }, + "VoipOngoingChatAlert": { + "key": "VoipOngoingChatAlert", + "value": "Leave voice chat in **%1$s** and start a new one in **%2$s**?" + }, + "VoipOngoingChatAlert2": { + "key": "VoipOngoingChatAlert2", + "value": "Leave voice chat in **%1$s** and call **%2$s**?" + }, + "VoipOngoingChatAlertTitle": { + "key": "VoipOngoingChatAlertTitle", + "value": "Another voice chat in progress" + }, + "VoipOutgoingCall": { + "key": "VoipOutgoingCall", + "value": "Ongoing Telegram call" + }, + "VoipOutputDevices": { + "key": "VoipOutputDevices", + "value": "Output Devices" + }, + "VoipPeerIncompatible": { + "key": "VoipPeerIncompatible", + "value": "**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them." + }, + "VoipPeerOutdated": { + "key": "VoipPeerOutdated", + "value": "**%1$s**'s app does not support calls. They need to update their app before you can call them." + }, + "VoipPeerVideoOutdated": { + "key": "VoipPeerVideoOutdated", + "value": "Sorry, **%1$s** is using an old version of Telegram that doesn't support video calls." + }, + "VoipPeerVideoOutdatedMakeVoice": { + "key": "VoipPeerVideoOutdatedMakeVoice", + "value": "Make a voice call" + }, + "VoipQuickReplies": { + "key": "VoipQuickReplies", + "value": "Respond with Text" + }, + "VoipQuickRepliesExplain": { + "key": "VoipQuickRepliesExplain", + "value": "These quick responses will be available when you respond to an incoming call with a Telegram message. Change them to say anything you like." + }, + "VoipRateCallAlert": { + "key": "VoipRateCallAlert", + "value": "Please rate the quality of your Telegram call" + }, + "VoipReconnecting": { + "key": "VoipReconnecting", + "value": "Reconnecting" + }, + "VoipRequesting": { + "key": "VoipRequesting", + "value": "Requesting" + }, + "VoipRinging": { + "key": "VoipRinging", + "value": "Ringing" + }, + "VoipRingtoneInfo": { + "key": "VoipRingtoneInfo", + "value": "You can customize the ringtone used when this contact calls you on Telegram." + }, + "VoipSettingsRingtone": { + "key": "VoipSettingsRingtone", + "value": "Ringtone" + }, + "VoipSpeaker": { + "key": "VoipSpeaker", + "value": "Speaker" + }, + "VoipStartVideo": { + "key": "VoipStartVideo", + "value": "Start Video" + }, + "VoipStopVideo": { + "key": "VoipStopVideo", + "value": "Stop Video" + }, + "VoipSwitch": { + "key": "VoipSwitch", + "value": "SWITCH" + }, + "VoipSwitchToVideoCall": { + "key": "VoipSwitchToVideoCall", + "value": "Switch to video call?" + }, + "VoipTapToMute": { + "key": "VoipTapToMute", + "value": "You're Live" + }, + "VoipUnmute": { + "key": "VoipUnmute", + "value": "Unmute" + }, + "VoipUseLessData": { + "key": "VoipUseLessData", + "value": "Less Data for Calls" + }, + "VoipUserCameraIsOff": { + "key": "VoipUserCameraIsOff", + "value": "%s's camera is off" + }, + "VoipUserMicrophoneIsOff": { + "key": "VoipUserMicrophoneIsOff", + "value": "%s's microphone is off" + }, + "VoipVideoUnavailable": { + "key": "VoipVideoUnavailable", + "value": "Video" + }, + "VoipVoiceChat": { + "key": "VoipVoiceChat", + "value": "Ongoing Voice Chat" + }, + "VoipWaiting": { + "key": "VoipWaiting", + "value": "Waiting" + }, + "Vote": { + "key": "Vote", + "zeroValue": null, + "oneValue": "%1$d vote", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d votes" + }, + "WaitMore": { + "key": "WaitMore", + "value": "Wait more" + }, + "WaitingForNetwork": { + "key": "WaitingForNetwork", + "value": "Waiting for network..." + }, + "Warmth": { + "key": "Warmth", + "value": "Warmth" + }, + "WebSessionsTitle": { + "key": "WebSessionsTitle", + "value": "Logged In with Telegram" + }, + "Weeks": { + "key": "Weeks", + "zeroValue": null, + "oneValue": "%1$d week", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d weeks" + }, + "WhenConnectedOnWiFi": { + "key": "WhenConnectedOnWiFi", + "value": "When connected on Wi-Fi" + }, + "WhenRoaming": { + "key": "WhenRoaming", + "value": "When roaming" + }, + "WhenUsingMobileData": { + "key": "WhenUsingMobileData", + "value": "When using mobile data" + }, + "White": { + "key": "White", + "value": "White" + }, + "WhoCanAddMe": { + "key": "WhoCanAddMe", + "value": "Who can add me to group chats?" + }, + "WhoCanAddMeInfo": { + "key": "WhoCanAddMeInfo", + "value": "You can restrict who can add you to groups and channels with granular precision." + }, + "WhoCanAddMembers": { + "key": "WhoCanAddMembers", + "value": "Who can add members?" + }, + "WhoCanAddMembersAdmins": { + "key": "WhoCanAddMembersAdmins", + "value": "Only Admins" + }, + "WhoCanAddMembersAllMembers": { + "key": "WhoCanAddMembersAllMembers", + "value": "All Members" + }, + "WhoCanCallMe": { + "key": "WhoCanCallMe", + "value": "Who can call me?" + }, + "WhoCanCallMeInfo": { + "key": "WhoCanCallMeInfo", + "value": "You can restrict who can call you." + }, + "WiFiUsage": { + "key": "WiFiUsage", + "value": "Wi-Fi Data Usage" + }, + "WidgetChats": { + "key": "WidgetChats", + "value": "Chats" + }, + "WidgetLoggedOff": { + "key": "WidgetLoggedOff", + "value": "Account was logged off." + }, + "WidgetPasscode": { + "key": "WidgetPasscode", + "value": "​\n\nNote: Your passcode will be **ignored** for widgets." + }, + "WidgetPasscodeEnable": { + "key": "WidgetPasscodeEnable", + "value": "​\n\nYour passcode **will not affect** widgets added to homescreen." + }, + "WidgetPreview": { + "key": "WidgetPreview", + "value": "Preview of the widget" + }, + "WidgetShortcuts": { + "key": "WidgetShortcuts", + "value": "Shortcuts" + }, + "WillUnmuteIn": { + "key": "WillUnmuteIn", + "value": "In %1$s" + }, + "WithinAMonth": { + "key": "WithinAMonth", + "value": "last seen within a month" + }, + "WithinAWeek": { + "key": "WithinAWeek", + "value": "last seen within a week" + }, + "WrongCountry": { + "key": "WrongCountry", + "value": "Invalid country code" + }, + "WrongNumber": { + "key": "WrongNumber", + "value": "Wrong number?" + }, + "Years": { + "key": "Years", + "zeroValue": null, + "oneValue": "%1$d year", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d years" + }, + "Yellow": { + "key": "Yellow", + "value": "Yellow" + }, + "Yesterday": { + "key": "Yesterday", + "value": "yesterday" + }, + "YesterdayAt": { + "key": "YesterdayAt", + "value": "yesterday at" + }, + "YesterdayAtFormatted": { + "key": "YesterdayAtFormatted", + "value": "yesterday at %1$s" + }, + "YouBlockedUser": { + "key": "YouBlockedUser", + "value": "Sorry, you can't add this user or bot to groups because you've blocked them. Please unblock to proceed." + }, + "YouCreatedBroadcastList": { + "key": "YouCreatedBroadcastList", + "value": "You created a broadcast list" + }, + "YouHaveNewMessage": { + "key": "YouHaveNewMessage", + "value": "You have a new message" + }, + "YouLeft": { + "key": "YouLeft", + "value": "You left this group" + }, + "YouWereKicked": { + "key": "YouWereKicked", + "value": "you were removed" + }, + "YourCode": { + "key": "YourCode", + "value": "Phone verification" + }, + "YourContacts": { + "key": "YourContacts", + "value": "Your contacts on Telegram" + }, + "YourEmail": { + "key": "YourEmail", + "value": "Your email" + }, + "YourEmailAlmostThere": { + "key": "YourEmailAlmostThere", + "value": "Almost there!" + }, + "YourEmailAlmostThereText": { + "key": "YourEmailAlmostThereText", + "value": "Please check your email (don't forget the spam folder) to complete Two-Step Verification setup." + }, + "YourEmailCode": { + "key": "YourEmailCode", + "value": "Your Email Code" + }, + "YourEmailCodeInfo": { + "key": "YourEmailCodeInfo", + "value": "Please confirm your email address by entering the code you just received on %1$s." + }, + "YourEmailInfo": { + "key": "YourEmailInfo", + "value": "Please add your valid email. It is the only way to recover a forgotten password." + }, + "YourEmailSkip": { + "key": "YourEmailSkip", + "value": "Skip" + }, + "YourEmailSkipWarning": { + "key": "YourEmailSkipWarning", + "value": "Warning" + }, + "YourEmailSkipWarningText": { + "key": "YourEmailSkipWarningText", + "value": "No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it." + }, + "YourEmailSuccessChangedText": { + "key": "YourEmailSuccessChangedText", + "value": "Your recovery email for Two-Step Verification has been changed." + }, + "YourEmailSuccessText": { + "key": "YourEmailSuccessText", + "value": "Your recovery email for Two-Step Verification is now active." + }, + "YourLocatedChannelsTooMuch": { + "key": "YourLocatedChannelsTooMuch", + "value": "Sorry, you have too many location-based groups already. Please delete one of your existing ones first." + }, + "YourName": { + "key": "YourName", + "value": "Your Name" + }, + "YourPassword": { + "key": "YourPassword", + "value": "Your Password" + }, + "YourPasswordChangedSuccessText": { + "key": "YourPasswordChangedSuccessText", + "value": "Your password for Two-Step Verification has been changed." + }, + "YourPasswordSuccess": { + "key": "YourPasswordSuccess", + "value": "Success!" + }, + "YourPasswordSuccessText": { + "key": "YourPasswordSuccessText", + "value": "Your password for Two-Step Verification is now active." + }, + "YourPhone": { + "key": "YourPhone", + "value": "Your Phone" + }, + "ZoomOut": { + "key": "ZoomOut", + "value": "Zoom out" + }, + "_tg_cancel": { + "key": "_tg_cancel", + "value": "Cancel" + }, + "_tg_open_google_play": { + "key": "_tg_open_google_play", + "value": "Open Google Play" + }, + "chatDate": { + "key": "chatDate", + "value": "MMMM d" + }, + "chatFullDate": { + "key": "chatFullDate", + "value": "MMMM d, yyyy" + }, + "download_telegram_text": { + "key": "download_telegram_text", + "value": "You need Telegram to log in to **%s**. Would you like to install it now?" + }, + "formatDateAtTime": { + "key": "formatDateAtTime", + "value": "%1$s at %2$s" + }, + "formatDateSchedule": { + "key": "formatDateSchedule", + "value": "MMM d" + }, + "formatDateScheduleDay": { + "key": "formatDateScheduleDay", + "value": "EEE MMM d" + }, + "formatDateScheduleYear": { + "key": "formatDateScheduleYear", + "value": "MMM d yyyy" + }, + "formatterBannedUntil12H": { + "key": "formatterBannedUntil12H", + "value": "MMM dd yyyy, h:mm a" + }, + "formatterBannedUntil24H": { + "key": "formatterBannedUntil24H", + "value": "MMM dd yyyy, HH:mm" + }, + "formatterBannedUntilThisYear12H": { + "key": "formatterBannedUntilThisYear12H", + "value": "MMM dd, h:mm a" + }, + "formatterBannedUntilThisYear24H": { + "key": "formatterBannedUntilThisYear24H", + "value": "MMM dd, HH:mm" + }, + "formatterDay12H": { + "key": "formatterDay12H", + "value": "h:mm a" + }, + "formatterDay24H": { + "key": "formatterDay24H", + "value": "HH:mm" + }, + "formatterMonth": { + "key": "formatterMonth", + "value": "MMM dd" + }, + "formatterMonthName": { + "key": "formatterMonthName", + "value": "LLLL" + }, + "formatterMonthYear": { + "key": "formatterMonthYear", + "value": "MMMM yyyy" + }, + "formatterMonthYear2": { + "key": "formatterMonthYear2", + "value": "LLLL yyyy" + }, + "formatterStats12H": { + "key": "formatterStats12H", + "value": "MMM dd yyyy, h:mm a" + }, + "formatterStats24H": { + "key": "formatterStats24H", + "value": "MMM dd yyyy, HH:mm" + }, + "formatterWeek": { + "key": "formatterWeek", + "value": "EEE" + }, + "formatterWeekLong": { + "key": "formatterWeekLong", + "value": "EEEE" + }, + "formatterYear": { + "key": "formatterYear", + "value": "dd.MM.yy" + }, + "formatterYearMax": { + "key": "formatterYearMax", + "value": "dd.MM.yyyy" + }, + "items": { + "key": "items", + "zeroValue": null, + "oneValue": "%1$d item", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d items" + }, + "login_with_telegram": { + "key": "login_with_telegram", + "value": "Log in with Telegram" + }, + "messages": { + "key": "messages", + "zeroValue": null, + "oneValue": "%1$d message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$d messages" + }, + "telegram_passport": { + "key": "telegram_passport", + "value": "Telegram Passport" + } +} diff --git a/dev/localize/en-extra.json b/dev/localize/en-extra.json new file mode 100644 index 000000000..4950a3527 --- /dev/null +++ b/dev/localize/en-extra.json @@ -0,0 +1,102 @@ +{ + "ActionSendTTLPhoto": "un1 sent a self-destructing photo. Please view it on your mobile", + "ActionSendTTLVideo": "un1 sent a self-destructing video. Please view it on your mobile", + "ActionYouSendTTLPhoto": "You sent a self-destructing photo. Please view it on your mobile", + "ActionYouSendTTLVideo": "You sent a self-destructing video. Please view it on your mobile", + "Activity": "Activity", + "AnimalsNature": "Animals & Nature", + "AppName": "Telegram", + "Archived": "Archived", + "BioAbout": "Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco.", + "ChannelInfo": "Channel Info", + "ChatInfo": "Chat Info", + "ChatsAndContacts": "Chats and contacts", + "ChooseDefaultSkinTone": "Choose your default skin tone", + "Connecting": "Connecting...", + "ConnectingToProxy": "Connecting to proxy...", + "ContactJoinedDisabled": "Disabled", + "ContactJoinedEnabled": "Enabled", + "ContinueOnThisLanguage": "Continue in English", + "CopyMessageLink": "Copy Message Link", + "Country": "Country", + "Custom": "Custom", + "DeletedMessage": "Deleted message", + "DragToReposition": "Drag to Reposition", + "EditProfile": "Edit Profile", + "Emoji": "EMOJI", + "EnterFullScreen": "Enter full screen", + "EnterPassword": "Enter a Password", + "ExitFullScreen": "Exit full screen", + "FilterChooseChats": "Please choose at least one chat for this folder.", + "FilterCreateError": "Sorry, you can't add more than 10 folders.", + "Flags": "Flags", + "FoodDrink": "Food & Drink", + "GeneralSettings": "General Settings", + "GoToMessage": "Go to message", + "InputDevice": "Input Device", + "InvalidPassword": "Invalid password. Please check the password and try again.", + "InvalidPhoneNumber": "Invalid phone number. Please check the number and try again.", + "KeepMeSignedIn": "Keep me signed in", + "Keyboard": "Keyboard", + "LeftChannel": "Left channel", + "LeftGroup": "Left group", + "Loading": "Loading...", + "LogInByPhone": "Or log in by using your phone number", + "LogInViaQR": "Quick log in using QR code", + "Microphone": "Microphone", + "More": "More", + "Next": "Next", + "NewLineByEnter": "New line by Enter", + "NewLineByShiftEnter": "New line by Shift + Enter", + "NewVersionText": "New and improved version of Telegram is ready for use.", + "NewVersionTitle": "Update available", + "NotEmojiFound": "No Emoji Found", + "NotificationsDisabled": "Disabled", + "NotificationsEnabled": "Enabled", + "Objects": "Objects", + "OutputDevice": "Output Device", + "PaymentsNotSupported": "Sorry, this Telegram client doesn't support payments yet. Please use one of our mobile apps to do this.", + "PhoneNumber": "Phone Number", + "PhotosTitle": "Photos", + "PollQuizOneRightAnswer": "Quiz has only one right answer.", + "PreviewDisabled": "Disabled", + "PreviewEnabled": "Enabled", + "QRHint": "1. Open Telegram on your phone\n2. Go to Settings > Devices > Scan QR\n3. Scan this image to Log in", + "Recent": "Frequently Used", + "RecordDeniedDescription": "You must allow your browser to access your microphone before being able to record voice notes. Click on the padlock icon next to the URL and then make sure you click Allow in the microphone settings to enable Telegram to access your microphone.", + "RecordDeniedTitle": "Permission Denied", + "Saved": "Saved", + "Search": "Search", + "SearchMessagesIn": "Search messages in", + "SearchResults": "Search Results", + "SelectChatToStartMessaging": "Please select a chat to start messaging", + "SendAsFile": "Send as a file", + "SendAsPhoto": "Send as a photo", + "SendByCommandEnter": "Send by Cmd + Enter", + "SendByControlEnter": "Send by Ctrl + Enter", + "SendByEnter": "Send by Enter", + "SendFileConfirmation": "Are you sure you want to send file?", + "SendFilesConfirmation": "Are you sure you want to send files?", + "SendMessage": "Send Message", + "SignInToTelegram": "Sign in to Telegram", + "SmileysPeople": "Smileys & People", + "StartScreenSharing": "Start screen sharing", + "StartText": "Please confirm your country code and enter your phone number.", + "Stickers": "STICKERS", + "StopScreenSharing": "Stop screen sharing", + "Symbols": "Symbols", + "Text": "Text", + "TravelPlaces": "Travel & Places", + "UnpinAllMessagesAlert": "Do you want to unpin all messages?", + "UpdateDraftConfirmation": "Are you sure you want to update draft?", + "Updating": "Updating...", + "VideosTitle": "Videos", + "ViewChannelInfo": "View channel info", + "ViewGroupInfo": "View group info", + "ViewProfile": "View profile", + "VoiceTitle": "Voice messages", + "WaitingForNetwork": "Waiting for network...", + "WriteChatCant": "Sorry, no way to write here :(", + "YourAccountProtectedWithPassword": "Your account is protected with an additional password.", + "YourPhone": "Your Phone" +} diff --git a/dev/localize/en-ios.json b/dev/localize/en-ios.json new file mode 100644 index 000000000..ab630d08b --- /dev/null +++ b/dev/localize/en-ios.json @@ -0,0 +1,18304 @@ +{ + "AUTH_REGION": { + "key": "AUTH_REGION", + "value": "Login from a new device %1$@, location: %2$@" + }, + "AUTH_REGION_SEPARATED": { + "key": "AUTH_REGION_SEPARATED", + "value": "New login|from unrecognized device %1$@, location: %2$@" + }, + "AUTH_UNKNOWN_SEPARATED": { + "key": "AUTH_UNKNOWN_SEPARATED", + "value": "New login|from unrecognized device %1$@" + }, + "AccentColor.Title": { + "key": "AccentColor.Title", + "value": "Accent Color" + }, + "AccessDenied.CallMicrophone": { + "key": "AccessDenied.CallMicrophone", + "value": "Telegram needs access to your microphone so that you can make calls.\n\nPlease go to your device‘s settings > Privacy > Microphone and set Telegram to ON." + }, + "AccessDenied.Camera": { + "key": "AccessDenied.Camera", + "value": "Telegram needs camera access so that you can take photos and videos.\n\nPlease go to your device settings > Privacy > Camera and set Telegram to ON." + }, + "AccessDenied.CameraDisabled": { + "key": "AccessDenied.CameraDisabled", + "value": "Camera access is globally restricted on your phone.\n\nPlease go to Settings > General > Restrictions and set Camera to ON" + }, + "AccessDenied.CameraRestricted": { + "key": "AccessDenied.CameraRestricted", + "value": "Camera access is restricted for Telegram.\n\nPlease go to your device‘s settings > General > Restrictions > Camera and set Telegram to ON." + }, + "AccessDenied.Contacts": { + "key": "AccessDenied.Contacts", + "value": "Telegram messaging is based on your existing contact list.\n\nPlease go to your device‘s settings > Privacy > Contacts and set Telegram to ON." + }, + "AccessDenied.LocationAlwaysDenied": { + "key": "AccessDenied.LocationAlwaysDenied", + "value": "If you'd like to share your Live Location with friends, Telegram needs location access when the app is in the background.\n\nPlease go to your device‘s settings > Privacy > Location Services and set Telegram to Always." + }, + "AccessDenied.LocationDenied": { + "key": "AccessDenied.LocationDenied", + "value": "Telegram needs access to your location so that you can share it with your contacts.\n\nPlease go to your device‘s settings > Privacy > Location Services and set Telegram to ON." + }, + "AccessDenied.LocationDisabled": { + "key": "AccessDenied.LocationDisabled", + "value": "Telegram needs access to your location so that you can share it with your contacts.\n\nPlease go to your device‘s settings > Privacy > Location Services and set it to ON." + }, + "AccessDenied.LocationTracking": { + "key": "AccessDenied.LocationTracking", + "value": "Telegram needs access to your location so that you can share it with your friends.\n\nPlease go to your device‘s settings > Privacy > Location Services and set it to ON." + }, + "AccessDenied.MicrophoneRestricted": { + "key": "AccessDenied.MicrophoneRestricted", + "value": "Microphone access is restricted for Telegram.\n\nPlease go to your device‘s settings > General > Restrictions > Microphone and set Telegram to ON." + }, + "AccessDenied.PhotosAndVideos": { + "key": "AccessDenied.PhotosAndVideos", + "value": "Telegram needs access to your photo library so that you can send photos and videos.\n\nPlease go to your device‘s settings > Privacy > Photos and set Telegram to ON." + }, + "AccessDenied.PhotosRestricted": { + "key": "AccessDenied.PhotosRestricted", + "value": "Photo access is restricted for Telegram.\n\nPlease go to your device settings > General > Restrictions > Photos and set Telegram to ON." + }, + "AccessDenied.SaveMedia": { + "key": "AccessDenied.SaveMedia", + "value": "Telegram needs access to your photo library so that you can save photos and videos.\n\nPlease go to your device‘s settings > Privacy > Photos and set Telegram to ON." + }, + "AccessDenied.Settings": { + "key": "AccessDenied.Settings", + "value": "Settings" + }, + "AccessDenied.Title": { + "key": "AccessDenied.Title", + "value": "Please Allow Access" + }, + "AccessDenied.VideoCallCamera": { + "key": "AccessDenied.VideoCallCamera", + "value": "Telegram needs access to your camera to make video calls.\n\nPlease go to your device‘s settings > Privacy > Camera and set Telegram to ON." + }, + "AccessDenied.VideoMessageCamera": { + "key": "AccessDenied.VideoMessageCamera", + "value": "Telegram needs access to your camera so that you can send video messages.\n\nPlease go to your device‘s settings > Privacy > Camera and set Telegram to ON." + }, + "AccessDenied.VideoMessageMicrophone": { + "key": "AccessDenied.VideoMessageMicrophone", + "value": "Telegram needs access to your microphone so that you can send video messages.\n\nPlease go to your device‘s settings > Privacy > Microphone and set Telegram to ON." + }, + "AccessDenied.VideoMicrophone": { + "key": "AccessDenied.VideoMicrophone", + "value": "Telegram needs access to your microphone so that you can record sound in videos recording.\n\nPlease go to your device‘s settings > Privacy > Microphone and set Telegram to ON." + }, + "AccessDenied.VoiceMicrophone": { + "key": "AccessDenied.VoiceMicrophone", + "value": "Telegram needs access to your microphone so that you can send voice messages.\n\nPlease go to your device‘s settings > Privacy > Microphone and set Telegram to ON." + }, + "AccessDenied.Wallpapers": { + "key": "AccessDenied.Wallpapers", + "value": "Telegram needs access to your photo library to set a custom wallpaper.\n\nPlease go to your device‘s settings > Privacy > Photos and set Telegram to ON." + }, + "Activity.PlayingGame": { + "key": "Activity.PlayingGame", + "value": "playing a game" + }, + "Activity.RecordingAudio": { + "key": "Activity.RecordingAudio", + "value": "recording" + }, + "Activity.RecordingVideoMessage": { + "key": "Activity.RecordingVideoMessage", + "value": "recording video" + }, + "Activity.UploadingDocument": { + "key": "Activity.UploadingDocument", + "value": "sending a file" + }, + "Activity.UploadingPhoto": { + "key": "Activity.UploadingPhoto", + "value": "sending a photo" + }, + "Activity.UploadingVideo": { + "key": "Activity.UploadingVideo", + "value": "sending a video" + }, + "Activity.UploadingVideoMessage": { + "key": "Activity.UploadingVideoMessage", + "value": "sending a video" + }, + "AddContact.ContactWillBeSharedAfterMutual": { + "key": "AddContact.ContactWillBeSharedAfterMutual", + "value": "Phone number will be visible once %1$@ adds you as a contact." + }, + "AddContact.SharedContactException": { + "key": "AddContact.SharedContactException", + "value": "Share My Phone Number" + }, + "AddContact.SharedContactExceptionInfo": { + "key": "AddContact.SharedContactExceptionInfo", + "value": "You can make your phone visible to %@." + }, + "AddContact.StatusSuccess": { + "key": "AddContact.StatusSuccess", + "value": "%@ is now in your contacts list." + }, + "Appearance.AccentColor": { + "key": "Appearance.AccentColor", + "value": "Accent Color" + }, + "Appearance.Animations": { + "key": "Appearance.Animations", + "value": "ANIMATIONS" + }, + "Appearance.AppIcon": { + "key": "Appearance.AppIcon", + "value": "App Icon" + }, + "Appearance.AppIconClassic": { + "key": "Appearance.AppIconClassic", + "value": "Classic" + }, + "Appearance.AppIconClassicX": { + "key": "Appearance.AppIconClassicX", + "value": "Classic X" + }, + "Appearance.AppIconDefault": { + "key": "Appearance.AppIconDefault", + "value": "Default" + }, + "Appearance.AppIconDefaultX": { + "key": "Appearance.AppIconDefaultX", + "value": "Default X" + }, + "Appearance.AppIconFilled": { + "key": "Appearance.AppIconFilled", + "value": "Filled" + }, + "Appearance.AppIconFilledX": { + "key": "Appearance.AppIconFilledX", + "value": "Filled X" + }, + "Appearance.AutoNightTheme": { + "key": "Appearance.AutoNightTheme", + "value": "Auto-Night Mode" + }, + "Appearance.AutoNightThemeDisabled": { + "key": "Appearance.AutoNightThemeDisabled", + "value": "Disabled" + }, + "Appearance.BubbleCorners.AdjustAdjacent": { + "key": "Appearance.BubbleCorners.AdjustAdjacent", + "value": "Adjust Adjacent Corners" + }, + "Appearance.BubbleCorners.Apply": { + "key": "Appearance.BubbleCorners.Apply", + "value": "Set" + }, + "Appearance.BubbleCorners.Title": { + "key": "Appearance.BubbleCorners.Title", + "value": "Message Corners" + }, + "Appearance.BubbleCornersSetting": { + "key": "Appearance.BubbleCornersSetting", + "value": "Message Corners" + }, + "Appearance.ColorTheme": { + "key": "Appearance.ColorTheme", + "value": "COLOR THEME" + }, + "Appearance.ColorThemeNight": { + "key": "Appearance.ColorThemeNight", + "value": "COLOR THEME — AUTO-NIGHT MODE" + }, + "Appearance.CreateTheme": { + "key": "Appearance.CreateTheme", + "value": "Create New Theme" + }, + "Appearance.CreateThemeInfo": { + "key": "Appearance.CreateThemeInfo", + "value": "A new theme template has been created from your current theme and was sent to your Saved Messages." + }, + "Appearance.EditTheme": { + "key": "Appearance.EditTheme", + "value": "Edit Theme" + }, + "Appearance.LargeEmoji": { + "key": "Appearance.LargeEmoji", + "value": "Large Emoji" + }, + "Appearance.Other": { + "key": "Appearance.Other", + "value": "Other" + }, + "Appearance.PickAccentColor": { + "key": "Appearance.PickAccentColor", + "value": "Pick an Accent Color" + }, + "Appearance.Preview": { + "key": "Appearance.Preview", + "value": "CHAT PREVIEW" + }, + "Appearance.PreviewIncomingText": { + "key": "Appearance.PreviewIncomingText", + "value": "Do you know what time it is?" + }, + "Appearance.PreviewOutgoingText": { + "key": "Appearance.PreviewOutgoingText", + "value": "It's morning in Tokyo 😎" + }, + "Appearance.PreviewReplyAuthor": { + "key": "Appearance.PreviewReplyAuthor", + "value": "Bob Harris" + }, + "Appearance.PreviewReplyText": { + "key": "Appearance.PreviewReplyText", + "value": "Good morning! 👋" + }, + "Appearance.Publish": { + "key": "Appearance.Publish", + "value": "Publish" + }, + "Appearance.ReduceMotion": { + "key": "Appearance.ReduceMotion", + "value": "Reduce Motion" + }, + "Appearance.ReduceMotionInfo": { + "key": "Appearance.ReduceMotionInfo", + "value": "Disable animations in message bubbles and in the chat list." + }, + "Appearance.RemoveTheme": { + "key": "Appearance.RemoveTheme", + "value": "Remove" + }, + "Appearance.RemoveThemeColor": { + "key": "Appearance.RemoveThemeColor", + "value": "Remove" + }, + "Appearance.RemoveThemeColorConfirmation": { + "key": "Appearance.RemoveThemeColorConfirmation", + "value": "Remove Color" + }, + "Appearance.RemoveThemeConfirmation": { + "key": "Appearance.RemoveThemeConfirmation", + "value": "Remove Theme" + }, + "Appearance.ShareTheme": { + "key": "Appearance.ShareTheme", + "value": "Share" + }, + "Appearance.ShareThemeColor": { + "key": "Appearance.ShareThemeColor", + "value": "Share" + }, + "Appearance.TextSize": { + "key": "Appearance.TextSize", + "value": "TEXT SIZE" + }, + "Appearance.TextSize.Apply": { + "key": "Appearance.TextSize.Apply", + "value": "Set" + }, + "Appearance.TextSize.Automatic": { + "key": "Appearance.TextSize.Automatic", + "value": "System" + }, + "Appearance.TextSize.Title": { + "key": "Appearance.TextSize.Title", + "value": "Text Size" + }, + "Appearance.TextSize.UseSystem": { + "key": "Appearance.TextSize.UseSystem", + "value": "Use System Text Size" + }, + "Appearance.TextSizeSetting": { + "key": "Appearance.TextSizeSetting", + "value": "Text Size" + }, + "Appearance.ThemeCarouselClassic": { + "key": "Appearance.ThemeCarouselClassic", + "value": "Classic" + }, + "Appearance.ThemeCarouselDay": { + "key": "Appearance.ThemeCarouselDay", + "value": "Day" + }, + "Appearance.ThemeCarouselNewNight": { + "key": "Appearance.ThemeCarouselNewNight", + "value": "Night" + }, + "Appearance.ThemeCarouselNight": { + "key": "Appearance.ThemeCarouselNight", + "value": "Monochrome" + }, + "Appearance.ThemeCarouselNightBlue": { + "key": "Appearance.ThemeCarouselNightBlue", + "value": "Night Blue" + }, + "Appearance.ThemeCarouselTintedNight": { + "key": "Appearance.ThemeCarouselTintedNight", + "value": "Tinted Night" + }, + "Appearance.ThemeDay": { + "key": "Appearance.ThemeDay", + "value": "Day" + }, + "Appearance.ThemeDayClassic": { + "key": "Appearance.ThemeDayClassic", + "value": "Day Classic" + }, + "Appearance.ThemeNight": { + "key": "Appearance.ThemeNight", + "value": "Monochrome" + }, + "Appearance.ThemeNightBlue": { + "key": "Appearance.ThemeNightBlue", + "value": "Night Blue" + }, + "Appearance.ThemePreview.Chat.1.Text": { + "key": "Appearance.ThemePreview.Chat.1.Text", + "value": "Does he want me to turn from the right or turn from the left? 🤔" + }, + "Appearance.ThemePreview.Chat.2.ReplyName": { + "key": "Appearance.ThemePreview.Chat.2.ReplyName", + "value": "Bob Harris" + }, + "Appearance.ThemePreview.Chat.2.Text": { + "key": "Appearance.ThemePreview.Chat.2.Text", + "value": "Right side. And, uh, with intensity." + }, + "Appearance.ThemePreview.Chat.3.Text": { + "key": "Appearance.ThemePreview.Chat.3.Text", + "value": "Is that everything? It seemed like he said quite a bit more than that. 😯" + }, + "Appearance.ThemePreview.Chat.3.TextWithLink": { + "key": "Appearance.ThemePreview.Chat.3.TextWithLink", + "value": "Is that everything? It seemed like he said [quite a bit more] than that. 😯" + }, + "Appearance.ThemePreview.Chat.4.Text": { + "key": "Appearance.ThemePreview.Chat.4.Text", + "value": "For relaxing times, make it Suntory time. 😎" + }, + "Appearance.ThemePreview.Chat.5.Text": { + "key": "Appearance.ThemePreview.Chat.5.Text", + "value": "He wants you to turn, look in camera. O.K.?" + }, + "Appearance.ThemePreview.Chat.6.Text": { + "key": "Appearance.ThemePreview.Chat.6.Text", + "value": "That’s all he said?" + }, + "Appearance.ThemePreview.Chat.7.Text": { + "key": "Appearance.ThemePreview.Chat.7.Text", + "value": "Yes, turn to camera." + }, + "Appearance.ThemePreview.ChatList.1.Name": { + "key": "Appearance.ThemePreview.ChatList.1.Name", + "value": "Alicia Torreaux" + }, + "Appearance.ThemePreview.ChatList.1.Text": { + "key": "Appearance.ThemePreview.ChatList.1.Text", + "value": "Bob says hi. 😊 ❤️ 😱" + }, + "Appearance.ThemePreview.ChatList.2.Name": { + "key": "Appearance.ThemePreview.ChatList.2.Name", + "value": "Roberto" + }, + "Appearance.ThemePreview.ChatList.2.Text": { + "key": "Appearance.ThemePreview.ChatList.2.Text", + "value": "Say hello to Alice 👋" + }, + "Appearance.ThemePreview.ChatList.3.AuthorName": { + "key": "Appearance.ThemePreview.ChatList.3.AuthorName", + "value": "Jennie Alpha" + }, + "Appearance.ThemePreview.ChatList.3.Name": { + "key": "Appearance.ThemePreview.ChatList.3.Name", + "value": "Campus Public Chat" + }, + "Appearance.ThemePreview.ChatList.3.Text": { + "key": "Appearance.ThemePreview.ChatList.3.Text", + "value": "We just reached 2,500 members! WOO!" + }, + "Appearance.ThemePreview.ChatList.4.Name": { + "key": "Appearance.ThemePreview.ChatList.4.Name", + "value": "Veronica" + }, + "Appearance.ThemePreview.ChatList.4.Text": { + "key": "Appearance.ThemePreview.ChatList.4.Text", + "value": "Table for four, 2PM. Be there." + }, + "Appearance.ThemePreview.ChatList.5.Name": { + "key": "Appearance.ThemePreview.ChatList.5.Name", + "value": "Animal Videos" + }, + "Appearance.ThemePreview.ChatList.5.Text": { + "key": "Appearance.ThemePreview.ChatList.5.Text", + "value": "Vote now! Moar cat videos in this channel?" + }, + "Appearance.ThemePreview.ChatList.6.Name": { + "key": "Appearance.ThemePreview.ChatList.6.Name", + "value": "Little Sister" + }, + "Appearance.ThemePreview.ChatList.6.Text": { + "key": "Appearance.ThemePreview.ChatList.6.Text", + "value": "Don't tell mom yet, but I got the job! I'm going to ROME!" + }, + "Appearance.ThemePreview.ChatList.7.Name": { + "key": "Appearance.ThemePreview.ChatList.7.Name", + "value": "Jennie Alpha" + }, + "Appearance.ThemePreview.ChatList.7.Text": { + "key": "Appearance.ThemePreview.ChatList.7.Text", + "value": "🖼 Check these out" + }, + "Appearance.Title": { + "key": "Appearance.Title", + "value": "Appearance" + }, + "AppleWatch.ReplyPresets": { + "key": "AppleWatch.ReplyPresets", + "value": "REPLY PRESETS" + }, + "AppleWatch.ReplyPresetsHelp": { + "key": "AppleWatch.ReplyPresetsHelp", + "value": "You can select one of these default replies when you compose or reply to a message, or you can change them to anything you like." + }, + "AppleWatch.Title": { + "key": "AppleWatch.Title", + "value": "Apple Watch" + }, + "Application.Name": { + "key": "Application.Name", + "value": "Telegram" + }, + "Application.Update": { + "key": "Application.Update", + "value": "Update" + }, + "ApplyLanguage.ApplyLanguageAction": { + "key": "ApplyLanguage.ApplyLanguageAction", + "value": "Change" + }, + "ApplyLanguage.ApplySuccess": { + "key": "ApplyLanguage.ApplySuccess", + "value": "Language changed" + }, + "ApplyLanguage.ChangeLanguageAction": { + "key": "ApplyLanguage.ChangeLanguageAction", + "value": "Change" + }, + "ApplyLanguage.ChangeLanguageAlreadyActive": { + "key": "ApplyLanguage.ChangeLanguageAlreadyActive", + "value": "This language (%1$@) is already active." + }, + "ApplyLanguage.ChangeLanguageOfficialText": { + "key": "ApplyLanguage.ChangeLanguageOfficialText", + "value": "You are about to apply a language pack (**%1$@**).\n\nThis will translate the entire interface. You can suggest corrections via the [translation platform]().\n\nYou can change your language back at any time in Settings." + }, + "ApplyLanguage.ChangeLanguageTitle": { + "key": "ApplyLanguage.ChangeLanguageTitle", + "value": "Change Language?" + }, + "ApplyLanguage.ChangeLanguageUnofficialText": { + "key": "ApplyLanguage.ChangeLanguageUnofficialText", + "value": "You are about to apply a custom language pack (**%1$@**) that is %2$@% complete.\n\nThis will translate the entire interface. You can suggest corrections via the [translation platform]().\n\nYou can change your language back at any time in Settings." + }, + "ApplyLanguage.LanguageNotSupportedError": { + "key": "ApplyLanguage.LanguageNotSupportedError", + "value": "Sorry, this language doesn't seem to exist." + }, + "ApplyLanguage.UnsufficientDataText": { + "key": "ApplyLanguage.UnsufficientDataText", + "value": "Unfortunately, this custom language pack (%1$@) doesn't contain data for Telegram iOS. You can contribute to this language pack using the [translation platform]()." + }, + "ApplyLanguage.UnsufficientDataTitle": { + "key": "ApplyLanguage.UnsufficientDataTitle", + "value": "Insufficient Data" + }, + "Appstore.Cloud": { + "key": "Appstore.Cloud", + "value": "**Cloud-based**\nUnlimited storage for chats,\nmedia and documents." + }, + "Appstore.Cloud.Profile": { + "key": "Appstore.Cloud.Profile", + "value": "**Jennifer**\n23 y.o. designer from San Francisco." + }, + "Appstore.Creative": { + "key": "Appstore.Creative", + "value": "**Creative**\nColor themes, stickers, GIFs,\nvideo messages and more." + }, + "Appstore.Creative.Chat": { + "key": "Appstore.Creative.Chat", + "value": "**You**\nSend a dice emoji to roll a die!\n**You**\nAdvance to Illinois Ave. If you pass Go, collect coffee\n**Gabriella**\nPassed!\n**You**\nOkay\nWait for me there." + }, + "Appstore.Creative.Chat.Name": { + "key": "Appstore.Creative.Chat.Name", + "value": "**Gabriella**" + }, + "Appstore.Fast": { + "key": "Appstore.Fast", + "value": "**Fast**\nSimple, reliable and synced\nacross all your devices." + }, + "Appstore.Fast.Chat1": { + "key": "Appstore.Fast.Chat1", + "value": "**Alicia Torreaux**\nBob says hi." + }, + "Appstore.Fast.Chat2": { + "key": "Appstore.Fast.Chat2", + "value": "**Roberto**\nSay hello to Alice." + }, + "Appstore.Fast.Chat3": { + "key": "Appstore.Fast.Chat3", + "value": "**Digital Nomads**\nJennie\nWe just reached 2,500 members! WOO!" + }, + "Appstore.Fast.Chat4": { + "key": "Appstore.Fast.Chat4", + "value": "**Veronica**\nTable for four, 2 PM. Be there." + }, + "Appstore.Fast.Chat5": { + "key": "Appstore.Fast.Chat5", + "value": "**Animal Videos**\nVote now! Moar cat videos in this channel?" + }, + "Appstore.Fast.Chat6": { + "key": "Appstore.Fast.Chat6", + "value": "**Little Sister**\nDon't tell mom yet, but I got the job! I'm going to ROME!" + }, + "Appstore.Fast.Chat7": { + "key": "Appstore.Fast.Chat7", + "value": "**James**\nCheck these out" + }, + "Appstore.Fast.Chat8": { + "key": "Appstore.Fast.Chat8", + "value": "**Study Group**\nEmma\nSticker" + }, + "Appstore.Fast.Chat9": { + "key": "Appstore.Fast.Chat9", + "value": "**Digital Nomads**" + }, + "Appstore.Free.Chat": { + "key": "Appstore.Free.Chat", + "value": "**Jessica**\nPaper airplane is lyfted by...\nWings\nPropeller\n**You**\nIs this from Monday’s test?\n**Harry**\nOnlinePartyPlan.ppd\nLet's get back to planning!\n**You**\n550 MB keynote file??\n**Helene**\nHe added fireworks videos" + }, + "Appstore.Free.Chat.Name": { + "key": "Appstore.Free.Chat.Name", + "value": "**Study Group**" + }, + "Appstore.Open": { + "key": "Appstore.Open", + "value": "**Open**\nNo ads, no fees. Open source\ncode free for everyone." + }, + "Appstore.Powerful": { + "key": "Appstore.Powerful", + "value": "**Powerful**\nNo limits on the size of\ngroups and broadcasts." + }, + "Appstore.Powerful.Chat": { + "key": "Appstore.Powerful.Chat", + "value": "**James**\nGood morning!\n\nDwayne joined the group\n\n**You**\nDo you have any idea what time it is?\n**Roxanne**\nIs it still morning?\nSure!\nNot sure\n**Emma**\nVoice" + }, + "Appstore.Private": { + "key": "Appstore.Private", + "value": "**Private**\nYour data is never disclosed.\nOnly you are in control." + }, + "Appstore.Private.Chat": { + "key": "Appstore.Private.Chat", + "value": "**You**\nNo limits on the size of your cats." + }, + "Appstore.Private.Chat.Name": { + "key": "Appstore.Private.Chat.Name", + "value": "**Beatrice**" + }, + "Appstore.Public": { + "key": "Appstore.Public", + "value": "**Public**\nPublic channels, open groups,\nbots for integrations." + }, + "Appstore.Public.Chat1": { + "key": "Appstore.Public.Chat1", + "value": "**Financial Times**\nTruth is like the sun. You can shut it out for a time, but it ain’t goin’ away." + }, + "Appstore.Public.Chat2": { + "key": "Appstore.Public.Chat2", + "value": "**Bloomberg**\nWe'll be sending you a few big stories daily, which you can expect to start..." + }, + "Appstore.Public.Chat3": { + "key": "Appstore.Public.Chat3", + "value": "**Health and Safety**\nIf you're looking for official news about the Novel Coronavirus and COVID-19" + }, + "Appstore.Public.IV": { + "key": "Appstore.Public.IV", + "value": "We now have enough data to measure the relative effectiveness of major climate solutions. This simulator lets you see which ones would work best.\n\nBloomberg\n\nThe Best Way to Slow Global Warming? You Decide in This Climate Simulator\nIt was on Earth Day 2016 when more than 170 nations signed the Paris Agreement calling for limiting global warming \"to well below 2°C\"." + }, + "Appstore.Secure": { + "key": "Appstore.Secure", + "value": "**Secure**\nAll chats are protected\nwith strong encryption." + }, + "Appstore.Secure.Chat": { + "key": "Appstore.Secure.Chat", + "value": "**Little Sister**\nAny gift ideas for mom?\n**You**A dog!\n**You**I'm serious. Let's get her a puppy. \n**You**\nI saw this!\n**Little Sister**\nI needed proof this was your idea!" + }, + "Appstore.Secure.Chat.Name": { + "key": "Appstore.Secure.Chat.Name", + "value": "**Little Sister**" + }, + "ArchivedChats.IntroText1": { + "key": "ArchivedChats.IntroText1", + "value": "Chats with enabled notifications get unarchived when new notifications arrive." + }, + "ArchivedChats.IntroText2": { + "key": "ArchivedChats.IntroText2", + "value": "Muted chats stay archived when new messages arrive." + }, + "ArchivedChats.IntroText3": { + "key": "ArchivedChats.IntroText3", + "value": "You can pin an unlimited number of archived chats to the top." + }, + "ArchivedChats.IntroTitle1": { + "key": "ArchivedChats.IntroTitle1", + "value": "This is your archive" + }, + "ArchivedChats.IntroTitle2": { + "key": "ArchivedChats.IntroTitle2", + "value": "Muted Chats" + }, + "ArchivedChats.IntroTitle3": { + "key": "ArchivedChats.IntroTitle3", + "value": "Pinned Chats" + }, + "ArchivedPacksAlert.Title": { + "key": "ArchivedPacksAlert.Title", + "value": "Some of your older sticker sets have been archived. You can reactivate them in the Sticker Settings." + }, + "AttachmentMenu.File": { + "key": "AttachmentMenu.File", + "value": "File" + }, + "AttachmentMenu.PhotoOrVideo": { + "key": "AttachmentMenu.PhotoOrVideo", + "value": "Photo or Video" + }, + "AttachmentMenu.Poll": { + "key": "AttachmentMenu.Poll", + "value": "Poll" + }, + "AttachmentMenu.SendAsFile": { + "key": "AttachmentMenu.SendAsFile", + "value": "Send as File" + }, + "AttachmentMenu.SendAsFiles": { + "key": "AttachmentMenu.SendAsFiles", + "value": "Send as Files" + }, + "AttachmentMenu.SendGif": { + "key": "AttachmentMenu.SendGif", + "zeroValue": null, + "oneValue": "Send 1 GIF", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ GIFs" + }, + "AttachmentMenu.SendItem": { + "key": "AttachmentMenu.SendItem", + "zeroValue": null, + "oneValue": "Send 1 Item", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ Items" + }, + "AttachmentMenu.SendPhoto": { + "key": "AttachmentMenu.SendPhoto", + "zeroValue": null, + "oneValue": "Send 1 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ Photos" + }, + "AttachmentMenu.SendVideo": { + "key": "AttachmentMenu.SendVideo", + "zeroValue": null, + "oneValue": "Send 1 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ Videos" + }, + "AttachmentMenu.WebSearch": { + "key": "AttachmentMenu.WebSearch", + "value": "Web Search" + }, + "AuthCode.Alert": { + "key": "AuthCode.Alert", + "value": "Your login code is %@. Enter it in the Telegram app where you are trying to log in.\n\nDo not give this code to anyone." + }, + "AuthSessions.AddDevice": { + "key": "AuthSessions.AddDevice", + "value": "Scan QR Code" + }, + "AuthSessions.AddDevice.InvalidQRCode": { + "key": "AuthSessions.AddDevice.InvalidQRCode", + "value": "Invalid QR Code" + }, + "AuthSessions.AddDevice.ScanInfo": { + "key": "AuthSessions.AddDevice.ScanInfo", + "value": "Scan a QR code to log into\nthis account on another device." + }, + "AuthSessions.AddDevice.ScanTitle": { + "key": "AuthSessions.AddDevice.ScanTitle", + "value": "Scan QR Code" + }, + "AuthSessions.AddDevice.UrlLoginHint": { + "key": "AuthSessions.AddDevice.UrlLoginHint", + "value": "This code can be used to allow someone to log in to your Telegram account.\n\nTo confirm Telegram login, please go to Settings > Devices > Scan QR and scan the code." + }, + "AuthSessions.AddDeviceIntro.Action": { + "key": "AuthSessions.AddDeviceIntro.Action", + "value": "Scan QR Code" + }, + "AuthSessions.AddDeviceIntro.Text1": { + "key": "AuthSessions.AddDeviceIntro.Text1", + "value": "Download Telegram on your computer from [desktop.telegram.org]()" + }, + "AuthSessions.AddDeviceIntro.Text2": { + "key": "AuthSessions.AddDeviceIntro.Text2", + "value": "Run Telegram on your computer to get the QR code" + }, + "AuthSessions.AddDeviceIntro.Text3": { + "key": "AuthSessions.AddDeviceIntro.Text3", + "value": "Scan the QR code to connect your account" + }, + "AuthSessions.AddDeviceIntro.Title": { + "key": "AuthSessions.AddDeviceIntro.Title", + "value": "Log in by QR Code" + }, + "AuthSessions.AddedDeviceTerminate": { + "key": "AuthSessions.AddedDeviceTerminate", + "value": "Terminate" + }, + "AuthSessions.AddedDeviceTitle": { + "key": "AuthSessions.AddedDeviceTitle", + "value": "Login Successful" + }, + "AuthSessions.AppUnofficial": { + "key": "AuthSessions.AppUnofficial", + "value": "(ID: %@)" + }, + "AuthSessions.CurrentSession": { + "key": "AuthSessions.CurrentSession", + "value": "CURRENT SESSION" + }, + "AuthSessions.DevicesTitle": { + "key": "AuthSessions.DevicesTitle", + "value": "Devices" + }, + "AuthSessions.EmptyText": { + "key": "AuthSessions.EmptyText", + "value": "You can log in to Telegram from other mobile, tablet and desktop devices, using the same phone number. All your data will be instantly synchronized." + }, + "AuthSessions.EmptyTitle": { + "key": "AuthSessions.EmptyTitle", + "value": "No other sessions" + }, + "AuthSessions.IncompleteAttempts": { + "key": "AuthSessions.IncompleteAttempts", + "value": "INCOMPLETE LOGIN ATTEMPTS" + }, + "AuthSessions.IncompleteAttemptsInfo": { + "key": "AuthSessions.IncompleteAttemptsInfo", + "value": "These devices have no access to your account. The code was entered correctly, but no correct password was given." + }, + "AuthSessions.LogOut": { + "key": "AuthSessions.LogOut", + "value": "Log Out" + }, + "AuthSessions.LogOutApplications": { + "key": "AuthSessions.LogOutApplications", + "value": "Disconnect All Websites" + }, + "AuthSessions.LogOutApplicationsHelp": { + "key": "AuthSessions.LogOutApplicationsHelp", + "value": "You can log in on websites that support signing in with Telegram." + }, + "AuthSessions.LoggedIn": { + "key": "AuthSessions.LoggedIn", + "value": "Websites" + }, + "AuthSessions.LoggedInWithTelegram": { + "key": "AuthSessions.LoggedInWithTelegram", + "value": "LOGGED IN WITH TELEGRAM" + }, + "AuthSessions.Message": { + "key": "AuthSessions.Message", + "value": "You allowed this bot to message you when you logged in on %@." + }, + "AuthSessions.OtherDevices": { + "key": "AuthSessions.OtherDevices", + "value": "The official Telegram App is available for iPhone, iPad, Android, macOS, Windows and Linux. [Learn More]()" + }, + "AuthSessions.OtherSessions": { + "key": "AuthSessions.OtherSessions", + "value": "ACTIVE SESSIONS" + }, + "AuthSessions.Sessions": { + "key": "AuthSessions.Sessions", + "value": "Sessions" + }, + "AuthSessions.Terminate": { + "key": "AuthSessions.Terminate", + "value": "Terminate" + }, + "AuthSessions.TerminateOtherSessions": { + "key": "AuthSessions.TerminateOtherSessions", + "value": "Terminate all other sessions" + }, + "AuthSessions.TerminateOtherSessionsHelp": { + "key": "AuthSessions.TerminateOtherSessionsHelp", + "value": "Logs out all devices except for this one." + }, + "AuthSessions.TerminateSession": { + "key": "AuthSessions.TerminateSession", + "value": "Terminate session" + }, + "AuthSessions.Title": { + "key": "AuthSessions.Title", + "value": "Active Sessions" + }, + "AutoDownloadSettings.AutoDownload": { + "key": "AutoDownloadSettings.AutoDownload", + "value": "Auto-Download Media" + }, + "AutoDownloadSettings.AutodownloadFiles": { + "key": "AutoDownloadSettings.AutodownloadFiles", + "value": "AUTO-DOWNLOAD FILES AND MUSIC" + }, + "AutoDownloadSettings.AutodownloadPhotos": { + "key": "AutoDownloadSettings.AutodownloadPhotos", + "value": "AUTO-DOWNLOAD PHOTOS" + }, + "AutoDownloadSettings.AutodownloadVideos": { + "key": "AutoDownloadSettings.AutodownloadVideos", + "value": "AUTO-DOWNLOAD VIDEOS AND GIFS" + }, + "AutoDownloadSettings.Cellular": { + "key": "AutoDownloadSettings.Cellular", + "value": "CELLULAR" + }, + "AutoDownloadSettings.CellularTitle": { + "key": "AutoDownloadSettings.CellularTitle", + "value": "Using Cellular" + }, + "AutoDownloadSettings.Channels": { + "key": "AutoDownloadSettings.Channels", + "value": "Channels" + }, + "AutoDownloadSettings.Contacts": { + "key": "AutoDownloadSettings.Contacts", + "value": "Contacts" + }, + "AutoDownloadSettings.DataUsage": { + "key": "AutoDownloadSettings.DataUsage", + "value": "DATA USAGE" + }, + "AutoDownloadSettings.DataUsageCustom": { + "key": "AutoDownloadSettings.DataUsageCustom", + "value": "Custom" + }, + "AutoDownloadSettings.DataUsageHigh": { + "key": "AutoDownloadSettings.DataUsageHigh", + "value": "High" + }, + "AutoDownloadSettings.DataUsageLow": { + "key": "AutoDownloadSettings.DataUsageLow", + "value": "Low" + }, + "AutoDownloadSettings.DataUsageMedium": { + "key": "AutoDownloadSettings.DataUsageMedium", + "value": "Medium" + }, + "AutoDownloadSettings.Delimeter": { + "key": "AutoDownloadSettings.Delimeter", + "value": ", " + }, + "AutoDownloadSettings.DocumentsTitle": { + "key": "AutoDownloadSettings.DocumentsTitle", + "value": "Files" + }, + "AutoDownloadSettings.Files": { + "key": "AutoDownloadSettings.Files", + "value": "Files" + }, + "AutoDownloadSettings.GroupChats": { + "key": "AutoDownloadSettings.GroupChats", + "value": "Group Chats" + }, + "AutoDownloadSettings.LastDelimeter": { + "key": "AutoDownloadSettings.LastDelimeter", + "value": " and " + }, + "AutoDownloadSettings.LimitBySize": { + "key": "AutoDownloadSettings.LimitBySize", + "value": "LIMIT BY SIZE" + }, + "AutoDownloadSettings.MaxFileSize": { + "key": "AutoDownloadSettings.MaxFileSize", + "value": "MAXIMUM FILE SIZE" + }, + "AutoDownloadSettings.MaxVideoSize": { + "key": "AutoDownloadSettings.MaxVideoSize", + "value": "MAXIMUM VIDEO SIZE" + }, + "AutoDownloadSettings.MediaTypes": { + "key": "AutoDownloadSettings.MediaTypes", + "value": "TYPES OF MEDIA" + }, + "AutoDownloadSettings.OffForAll": { + "key": "AutoDownloadSettings.OffForAll", + "value": "Off for all chats" + }, + "AutoDownloadSettings.OnFor": { + "key": "AutoDownloadSettings.OnFor", + "value": "On for %@" + }, + "AutoDownloadSettings.OnForAll": { + "key": "AutoDownloadSettings.OnForAll", + "value": "On for all chats" + }, + "AutoDownloadSettings.Photos": { + "key": "AutoDownloadSettings.Photos", + "value": "Photos" + }, + "AutoDownloadSettings.PhotosTitle": { + "key": "AutoDownloadSettings.PhotosTitle", + "value": "Photos" + }, + "AutoDownloadSettings.PreloadVideo": { + "key": "AutoDownloadSettings.PreloadVideo", + "value": "Preload Larger Videos" + }, + "AutoDownloadSettings.PreloadVideoInfo": { + "key": "AutoDownloadSettings.PreloadVideoInfo", + "value": "Preload the first seconds of videos larger than %@ for instant playback." + }, + "AutoDownloadSettings.PrivateChats": { + "key": "AutoDownloadSettings.PrivateChats", + "value": "Other Private Chats" + }, + "AutoDownloadSettings.Reset": { + "key": "AutoDownloadSettings.Reset", + "value": "Reset" + }, + "AutoDownloadSettings.ResetHelp": { + "key": "AutoDownloadSettings.ResetHelp", + "value": "Undo all custom auto-download settings." + }, + "AutoDownloadSettings.ResetSettings": { + "key": "AutoDownloadSettings.ResetSettings", + "value": "Reset Auto-Download Settings" + }, + "AutoDownloadSettings.Title": { + "key": "AutoDownloadSettings.Title", + "value": "Auto-Download" + }, + "AutoDownloadSettings.TypeChannels": { + "key": "AutoDownloadSettings.TypeChannels", + "value": "Channels" + }, + "AutoDownloadSettings.TypeContacts": { + "key": "AutoDownloadSettings.TypeContacts", + "value": "Contacts" + }, + "AutoDownloadSettings.TypeGroupChats": { + "key": "AutoDownloadSettings.TypeGroupChats", + "value": "Groups" + }, + "AutoDownloadSettings.TypePrivateChats": { + "key": "AutoDownloadSettings.TypePrivateChats", + "value": "PM" + }, + "AutoDownloadSettings.Unlimited": { + "key": "AutoDownloadSettings.Unlimited", + "value": "unlimited" + }, + "AutoDownloadSettings.UpTo": { + "key": "AutoDownloadSettings.UpTo", + "value": "up to %@" + }, + "AutoDownloadSettings.UpToFor": { + "key": "AutoDownloadSettings.UpToFor", + "value": "Up to %@ for %@" + }, + "AutoDownloadSettings.UpToForAll": { + "key": "AutoDownloadSettings.UpToForAll", + "value": "Up to %@ for all chats" + }, + "AutoDownloadSettings.VideoMessagesTitle": { + "key": "AutoDownloadSettings.VideoMessagesTitle", + "value": "Video Messages" + }, + "AutoDownloadSettings.Videos": { + "key": "AutoDownloadSettings.Videos", + "value": "Videos" + }, + "AutoDownloadSettings.VideosTitle": { + "key": "AutoDownloadSettings.VideosTitle", + "value": "Videos" + }, + "AutoDownloadSettings.VoiceMessagesInfo": { + "key": "AutoDownloadSettings.VoiceMessagesInfo", + "value": "Voice messages are tiny, they are always downloaded automatically." + }, + "AutoDownloadSettings.VoiceMessagesTitle": { + "key": "AutoDownloadSettings.VoiceMessagesTitle", + "value": "Voice Messages" + }, + "AutoDownloadSettings.WiFi": { + "key": "AutoDownloadSettings.WiFi", + "value": "WI-FI" + }, + "AutoDownloadSettings.WifiTitle": { + "key": "AutoDownloadSettings.WifiTitle", + "value": "Using Wi-Fi" + }, + "AutoNightTheme.Automatic": { + "key": "AutoNightTheme.Automatic", + "value": "Automatic" + }, + "AutoNightTheme.AutomaticHelp": { + "key": "AutoNightTheme.AutomaticHelp", + "value": "Switch to night theme when brightness is %@%% or less. Auto-brightness should be enabled for this feature to work correctly." + }, + "AutoNightTheme.AutomaticSection": { + "key": "AutoNightTheme.AutomaticSection", + "value": "BRIGHTNESS THRESHOLD" + }, + "AutoNightTheme.Disabled": { + "key": "AutoNightTheme.Disabled", + "value": "Disabled" + }, + "AutoNightTheme.LocationHelp": { + "key": "AutoNightTheme.LocationHelp", + "value": "Calculating sunset & sunrise times requires a one-time check of your approximate location. Note that this location is stored locally on your device only.\n\nSunset: %@\nSunrise: %@" + }, + "AutoNightTheme.NotAvailable": { + "key": "AutoNightTheme.NotAvailable", + "value": "N/A" + }, + "AutoNightTheme.PreferredTheme": { + "key": "AutoNightTheme.PreferredTheme", + "value": "PREFERRED NIGHT THEME" + }, + "AutoNightTheme.ScheduleSection": { + "key": "AutoNightTheme.ScheduleSection", + "value": "SCHEDULE" + }, + "AutoNightTheme.Scheduled": { + "key": "AutoNightTheme.Scheduled", + "value": "Scheduled" + }, + "AutoNightTheme.ScheduledFrom": { + "key": "AutoNightTheme.ScheduledFrom", + "value": "From" + }, + "AutoNightTheme.ScheduledTo": { + "key": "AutoNightTheme.ScheduledTo", + "value": "To" + }, + "AutoNightTheme.System": { + "key": "AutoNightTheme.System", + "value": "System" + }, + "AutoNightTheme.Title": { + "key": "AutoNightTheme.Title", + "value": "Auto-Night Mode" + }, + "AutoNightTheme.UpdateLocation": { + "key": "AutoNightTheme.UpdateLocation", + "value": "Update Location" + }, + "AutoNightTheme.UseSunsetSunrise": { + "key": "AutoNightTheme.UseSunsetSunrise", + "value": "Use Local Sunset & Sunrise" + }, + "AutoremoveSetup.TimeSectionHeader": { + "key": "AutoremoveSetup.TimeSectionHeader", + "value": "AUTO-DELETE MESSAGES" + }, + "AutoremoveSetup.TimerInfoChannel": { + "key": "AutoremoveSetup.TimerInfoChannel", + "value": "Automatically delete messages sent in this channel after a certain period of time." + }, + "AutoremoveSetup.TimerInfoChat": { + "key": "AutoremoveSetup.TimerInfoChat", + "value": "Automatically delete messages sent in this chat after a certain period of time." + }, + "AutoremoveSetup.TimerValueAfter": { + "key": "AutoremoveSetup.TimerValueAfter", + "value": "After %@" + }, + "AutoremoveSetup.TimerValueNever": { + "key": "AutoremoveSetup.TimerValueNever", + "value": "Never" + }, + "AutoremoveSetup.Title": { + "key": "AutoremoveSetup.Title", + "value": "Auto-Deletion" + }, + "BlockedUsers.AddNew": { + "key": "BlockedUsers.AddNew", + "value": "Add New..." + }, + "BlockedUsers.BlockTitle": { + "key": "BlockedUsers.BlockTitle", + "value": "Block" + }, + "BlockedUsers.BlockUser": { + "key": "BlockedUsers.BlockUser", + "value": "Block User..." + }, + "BlockedUsers.Info": { + "key": "BlockedUsers.Info", + "value": "Blocked users can't send you messages or add you to groups. They will not see your profile pictures, online and last seen status." + }, + "BlockedUsers.LeavePrefix": { + "key": "BlockedUsers.LeavePrefix", + "value": "Leave " + }, + "BlockedUsers.SelectUserTitle": { + "key": "BlockedUsers.SelectUserTitle", + "value": "Block User" + }, + "BlockedUsers.Title": { + "key": "BlockedUsers.Title", + "value": "Blocked" + }, + "BlockedUsers.Unblock": { + "key": "BlockedUsers.Unblock", + "value": "Unblock" + }, + "Bot.DescriptionTitle": { + "key": "Bot.DescriptionTitle", + "value": "What can this bot do?" + }, + "Bot.GenericBotStatus": { + "key": "Bot.GenericBotStatus", + "value": "bot" + }, + "Bot.GenericSupportStatus": { + "key": "Bot.GenericSupportStatus", + "value": "support" + }, + "Bot.GroupStatusDoesNotReadHistory": { + "key": "Bot.GroupStatusDoesNotReadHistory", + "value": "has no access to messages" + }, + "Bot.GroupStatusReadsHistory": { + "key": "Bot.GroupStatusReadsHistory", + "value": "has access to messages" + }, + "Bot.Start": { + "key": "Bot.Start", + "value": "Start" + }, + "Bot.Stop": { + "key": "Bot.Stop", + "value": "Stop Bot" + }, + "Bot.Unblock": { + "key": "Bot.Unblock", + "value": "Restart Bot" + }, + "Broadcast.AdminLog.EmptyText": { + "key": "Broadcast.AdminLog.EmptyText", + "value": "No service actions were taken by the channel's admins in the last 48 hours." + }, + "BroadcastGroups.Cancel": { + "key": "BroadcastGroups.Cancel", + "value": "Leave as regular group" + }, + "BroadcastGroups.ConfirmationAlert.Convert": { + "key": "BroadcastGroups.ConfirmationAlert.Convert", + "value": "Convert" + }, + "BroadcastGroups.ConfirmationAlert.Text": { + "key": "BroadcastGroups.ConfirmationAlert.Text", + "value": "Regular members of the group (non-admins) will **irrevocably** lose their right to post messages in the group.\n\nThis action **cannot** be undone." + }, + "BroadcastGroups.ConfirmationAlert.Title": { + "key": "BroadcastGroups.ConfirmationAlert.Title", + "value": "Are you sure?" + }, + "BroadcastGroups.Convert": { + "key": "BroadcastGroups.Convert", + "value": "Convert to Broadcast Group" + }, + "BroadcastGroups.IntroText": { + "key": "BroadcastGroups.IntroText", + "value": "• No limit on the number of members.\n\n• Only admins can post.\n\n• Can't be turned back into a regular group." + }, + "BroadcastGroups.IntroTitle": { + "key": "BroadcastGroups.IntroTitle", + "value": "Broadcast Groups" + }, + "BroadcastGroups.LimitAlert.LearnMore": { + "key": "BroadcastGroups.LimitAlert.LearnMore", + "value": "Learn More" + }, + "BroadcastGroups.LimitAlert.SettingsTip": { + "key": "BroadcastGroups.LimitAlert.SettingsTip", + "value": "If you change your mind, go to your group's Settings > Permissions." + }, + "BroadcastGroups.LimitAlert.Text": { + "key": "BroadcastGroups.LimitAlert.Text", + "value": "Your group has reached a limit of **%@** members.\n\nYou can increase this limit by converting the group to a **broadcast group** where only admins can post. Interested?" + }, + "BroadcastGroups.LimitAlert.Title": { + "key": "BroadcastGroups.LimitAlert.Title", + "value": "Limit Reached" + }, + "BroadcastGroups.Success": { + "key": "BroadcastGroups.Success", + "value": "Your group can now have more than %@ members." + }, + "CHANNEL_MESSAGES": { + "key": "CHANNEL_MESSAGES", + "value": "%1$@ posted %2$@ messages" + }, + "CHANNEL_MESSAGES_SEPARATED": { + "key": "CHANNEL_MESSAGES_SEPARATED", + "value": "%1$@|posted %2$@ messages" + }, + "CHANNEL_MESSAGE_AUDIO": { + "key": "CHANNEL_MESSAGE_AUDIO", + "value": "%1$@ posted a voice message" + }, + "CHANNEL_MESSAGE_AUDIO_SEPARATED": { + "key": "CHANNEL_MESSAGE_AUDIO_SEPARATED", + "value": "%1$@|posted a voice message" + }, + "CHANNEL_MESSAGE_CONTACT": { + "key": "CHANNEL_MESSAGE_CONTACT", + "value": "%1$@ posted a contact" + }, + "CHANNEL_MESSAGE_CONTACT_SEPARATED": { + "key": "CHANNEL_MESSAGE_CONTACT_SEPARATED", + "value": "%1$@|posted a contact" + }, + "CHANNEL_MESSAGE_DOC": { + "key": "CHANNEL_MESSAGE_DOC", + "value": "%1$@ posted a file" + }, + "CHANNEL_MESSAGE_DOC_SEPARATED": { + "key": "CHANNEL_MESSAGE_DOC_SEPARATED", + "value": "%1$@|posted a file" + }, + "CHANNEL_MESSAGE_FWDS_SEPARATED": { + "key": "CHANNEL_MESSAGE_FWDS_SEPARATED", + "value": "%1$@|posted %2$@ forwarded messages" + }, + "CHANNEL_MESSAGE_GAME": { + "key": "CHANNEL_MESSAGE_GAME", + "value": "%1$@ invited you to play %2$@" + }, + "CHANNEL_MESSAGE_GAME_SEPARATED": { + "key": "CHANNEL_MESSAGE_GAME_SEPARATED", + "value": "%1$@|invited you to play %2$@" + }, + "CHANNEL_MESSAGE_GEO": { + "key": "CHANNEL_MESSAGE_GEO", + "value": "%1$@ posted a map" + }, + "CHANNEL_MESSAGE_GEOLIVE": { + "key": "CHANNEL_MESSAGE_GEOLIVE", + "value": "%1$@ posted a live location" + }, + "CHANNEL_MESSAGE_GEOLIVE_SEPARATED": { + "key": "CHANNEL_MESSAGE_GEOLIVE_SEPARATED", + "value": "%1$@|posted a live location" + }, + "CHANNEL_MESSAGE_GEO_SEPARATED": { + "key": "CHANNEL_MESSAGE_GEO_SEPARATED", + "value": "%1$@|posted a map" + }, + "CHANNEL_MESSAGE_GIF": { + "key": "CHANNEL_MESSAGE_GIF", + "value": "%1$@ posted a GIF" + }, + "CHANNEL_MESSAGE_GIF_SEPARATED": { + "key": "CHANNEL_MESSAGE_GIF_SEPARATED", + "value": "%1$@|posted a GIF" + }, + "CHANNEL_MESSAGE_NOTEXT": { + "key": "CHANNEL_MESSAGE_NOTEXT", + "value": "%1$@ posted a message" + }, + "CHANNEL_MESSAGE_NOTEXT_SEPARATED": { + "key": "CHANNEL_MESSAGE_NOTEXT_SEPARATED", + "value": "%1$@|posted a message" + }, + "CHANNEL_MESSAGE_PHOTO": { + "key": "CHANNEL_MESSAGE_PHOTO", + "value": "%1$@ posted a photo" + }, + "CHANNEL_MESSAGE_PHOTOS": { + "key": "CHANNEL_MESSAGE_PHOTOS", + "value": "%1$@ posted %2$@ photos" + }, + "CHANNEL_MESSAGE_PHOTOS_SEPARATED": { + "key": "CHANNEL_MESSAGE_PHOTOS_SEPARATED", + "value": "%1$@|posted %2$@ photos" + }, + "CHANNEL_MESSAGE_PHOTO_SEPARATED": { + "key": "CHANNEL_MESSAGE_PHOTO_SEPARATED", + "value": "%1$@|posted a photo" + }, + "CHANNEL_MESSAGE_POLL": { + "key": "CHANNEL_MESSAGE_POLL", + "value": "%1$@ posted a poll" + }, + "CHANNEL_MESSAGE_POLL_SEPARATED": { + "key": "CHANNEL_MESSAGE_POLL_SEPARATED", + "value": "%1$@|posted a poll" + }, + "CHANNEL_MESSAGE_ROUND": { + "key": "CHANNEL_MESSAGE_ROUND", + "value": "%1$@ posted a video message" + }, + "CHANNEL_MESSAGE_ROUND_SEPARATED": { + "key": "CHANNEL_MESSAGE_ROUND_SEPARATED", + "value": "%1$@|posted a video message" + }, + "CHANNEL_MESSAGE_STICKER": { + "key": "CHANNEL_MESSAGE_STICKER", + "value": "%1$@ posted a %2$@sticker" + }, + "CHANNEL_MESSAGE_STICKER_SEPARATED": { + "key": "CHANNEL_MESSAGE_STICKER_SEPARATED", + "value": "%1$@|posted a %2$@ sticker" + }, + "CHANNEL_MESSAGE_TEXT": { + "key": "CHANNEL_MESSAGE_TEXT", + "value": "%1$@: %2$@" + }, + "CHANNEL_MESSAGE_TEXT_SEPARATED": { + "key": "CHANNEL_MESSAGE_TEXT_SEPARATED", + "value": "%1$@|%2$@" + }, + "CHANNEL_MESSAGE_VIDEO": { + "key": "CHANNEL_MESSAGE_VIDEO", + "value": "%1$@ posted a video" + }, + "CHANNEL_MESSAGE_VIDEO_SEPARATED": { + "key": "CHANNEL_MESSAGE_VIDEO_SEPARATED", + "value": "%1$@|posted a video" + }, + "CHAT_ADD_MEMBER": { + "key": "CHAT_ADD_MEMBER", + "value": "%1$@ added %3$@ to the group %2$@" + }, + "CHAT_ADD_MEMBER_SEPARATED": { + "key": "CHAT_ADD_MEMBER_SEPARATED", + "value": "%2$@|%1$@ invited %3$@ to the group" + }, + "CHAT_ADD_YOU": { + "key": "CHAT_ADD_YOU", + "value": "%1$@ invited you to the group %2$@" + }, + "CHAT_ADD_YOU_SEPARATED": { + "key": "CHAT_ADD_YOU_SEPARATED", + "value": "%2$@|%1$@ invited you to the group" + }, + "CHAT_CREATED": { + "key": "CHAT_CREATED", + "value": "%1$@ invited you to the group %2$@" + }, + "CHAT_CREATED_SEPARATED": { + "key": "CHAT_CREATED_SEPARATED", + "value": "%2$@|%1$@ invited you to the group" + }, + "CHAT_DELETE_MEMBER": { + "key": "CHAT_DELETE_MEMBER", + "value": "%1$@ removed %3$@ from the group %2$@" + }, + "CHAT_DELETE_MEMBER_SEPARATED": { + "key": "CHAT_DELETE_MEMBER_SEPARATED", + "value": "%2$@|%1$@ kicked %3$@ from the group" + }, + "CHAT_DELETE_YOU": { + "key": "CHAT_DELETE_YOU", + "value": "%1$@ removed you from the group %2$@" + }, + "CHAT_DELETE_YOU_SEPARATED": { + "key": "CHAT_DELETE_YOU_SEPARATED", + "value": "%2$@|%1$@ kicked you from the group " + }, + "CHAT_JOINED_SEPARATED": { + "key": "CHAT_JOINED_SEPARATED", + "value": "%2$@|%1$@ has joined the group" + }, + "CHAT_LEFT": { + "key": "CHAT_LEFT", + "value": "%1$@ left the group %2$@" + }, + "CHAT_LEFT_SEPARATED": { + "key": "CHAT_LEFT_SEPARATED", + "value": "%2$@|%1$@ left the group" + }, + "CHAT_MESSAGES": { + "key": "CHAT_MESSAGES", + "value": "%1$@ sent %3$@ messages to the group %2$@" + }, + "CHAT_MESSAGES_SEPARATED": { + "key": "CHAT_MESSAGES_SEPARATED", + "value": "%2$@|%1$@ sent %3$@ messages" + }, + "CHAT_MESSAGE_AUDIO": { + "key": "CHAT_MESSAGE_AUDIO", + "value": "%1$@ sent a voice message to %2$@" + }, + "CHAT_MESSAGE_AUDIO_SEPARATED": { + "key": "CHAT_MESSAGE_AUDIO_SEPARATED", + "value": "%2$@|%1$@ sent a voice message" + }, + "CHAT_MESSAGE_CONTACT": { + "key": "CHAT_MESSAGE_CONTACT", + "value": "%1$@ shared a contact in the group %2$@" + }, + "CHAT_MESSAGE_CONTACT_SEPARATED": { + "key": "CHAT_MESSAGE_CONTACT_SEPARATED", + "value": "%2$@|%1$@ shared a contact" + }, + "CHAT_MESSAGE_DOC": { + "key": "CHAT_MESSAGE_DOC", + "value": "%1$@ sent a file to the group %2$@" + }, + "CHAT_MESSAGE_DOC_SEPARATED": { + "key": "CHAT_MESSAGE_DOC_SEPARATED", + "value": "%2$@|%1$@ sent a file" + }, + "CHAT_MESSAGE_FWDS": { + "key": "CHAT_MESSAGE_FWDS", + "value": "%1$@ forwarded %3$@ messages to the group %2$@" + }, + "CHAT_MESSAGE_FWDS_SEPARATED": { + "key": "CHAT_MESSAGE_FWDS_SEPARATED", + "value": "%2$@|%1$@ forwarded %3$@ messages" + }, + "CHAT_MESSAGE_GAME": { + "key": "CHAT_MESSAGE_GAME", + "value": "%1$@ invited the group %2$@ to play %3$@" + }, + "CHAT_MESSAGE_GAME_SEPARATED": { + "key": "CHAT_MESSAGE_GAME_SEPARATED", + "value": "%2$@|%1$@ invited the group to play %3$@" + }, + "CHAT_MESSAGE_GEO": { + "key": "CHAT_MESSAGE_GEO", + "value": "%1$@ sent a map to the group %2$@" + }, + "CHAT_MESSAGE_GEOLIVE": { + "key": "CHAT_MESSAGE_GEOLIVE", + "value": "%1$@ started sharing their live location with %2$@" + }, + "CHAT_MESSAGE_GEOLIVE_SEPARATED": { + "key": "CHAT_MESSAGE_GEOLIVE_SEPARATED", + "value": "%2$@|%1$@ started sharing their live location" + }, + "CHAT_MESSAGE_GEO_SEPARATED": { + "key": "CHAT_MESSAGE_GEO_SEPARATED", + "value": "%2$@|%1$@ sent a map" + }, + "CHAT_MESSAGE_GIF": { + "key": "CHAT_MESSAGE_GIF", + "value": "%1$@ sent a GIF to the group %2$@" + }, + "CHAT_MESSAGE_GIF_SEPARATED": { + "key": "CHAT_MESSAGE_GIF_SEPARATED", + "value": "%2$@|%1$@ sent a GIF" + }, + "CHAT_MESSAGE_INVOICE": { + "key": "CHAT_MESSAGE_INVOICE", + "value": "%1$@ sent an invoice for %3$@ to the group %2$@" + }, + "CHAT_MESSAGE_INVOICE_SEPARATED": { + "key": "CHAT_MESSAGE_INVOICE_SEPARATED", + "value": "%2$@|%1$@ sent an invoice for %3$@" + }, + "CHAT_MESSAGE_NOTEXT": { + "key": "CHAT_MESSAGE_NOTEXT", + "value": "%1$@ sent a message to the group %2$@" + }, + "CHAT_MESSAGE_NOTEXT_SEPARATED": { + "key": "CHAT_MESSAGE_NOTEXT_SEPARATED", + "value": "%2$@|%1$@ sent a message" + }, + "CHAT_MESSAGE_PHOTO": { + "key": "CHAT_MESSAGE_PHOTO", + "value": "%1$@ sent a photo to the group %2$@" + }, + "CHAT_MESSAGE_PHOTOS": { + "key": "CHAT_MESSAGE_PHOTOS", + "value": "%1$@ sent %3$@ photos to the group %2$@" + }, + "CHAT_MESSAGE_PHOTOS_SEPARATED": { + "key": "CHAT_MESSAGE_PHOTOS_SEPARATED", + "value": "%2$@|%1$@ sent %3$@ photos" + }, + "CHAT_MESSAGE_PHOTO_SEPARATED": { + "key": "CHAT_MESSAGE_PHOTO_SEPARATED", + "value": "%2$@|%1$@ sent a photo" + }, + "CHAT_MESSAGE_POLL": { + "key": "CHAT_MESSAGE_POLL", + "value": "%1$@ sent a poll to the group %2$@" + }, + "CHAT_MESSAGE_POLL_SEPARATED": { + "key": "CHAT_MESSAGE_POLL_SEPARATED", + "value": "%2$@|%1$@ sent a poll" + }, + "CHAT_MESSAGE_ROUND": { + "key": "CHAT_MESSAGE_ROUND", + "value": "%1$@ sent a video message to the group %2$@" + }, + "CHAT_MESSAGE_ROUND_SEPARATED": { + "key": "CHAT_MESSAGE_ROUND_SEPARATED", + "value": "%2$@|%1$@ sent a video message" + }, + "CHAT_MESSAGE_STICKER": { + "key": "CHAT_MESSAGE_STICKER", + "value": "%1$@ sent a %3$@sticker to the group %2$@" + }, + "CHAT_MESSAGE_STICKER_SEPARATED": { + "key": "CHAT_MESSAGE_STICKER_SEPARATED", + "value": "%2$@|%1$@ sent a %3$@ sticker" + }, + "CHAT_MESSAGE_TEXT": { + "key": "CHAT_MESSAGE_TEXT", + "value": "%1$@@%2$@: %3$@" + }, + "CHAT_MESSAGE_TEXT_SEPARATED": { + "key": "CHAT_MESSAGE_TEXT_SEPARATED", + "value": "%2$@|%1$@:%3$@" + }, + "CHAT_MESSAGE_VIDEO": { + "key": "CHAT_MESSAGE_VIDEO", + "value": "%1$@ sent a video to the group %2$@" + }, + "CHAT_MESSAGE_VIDEO_SEPARATED": { + "key": "CHAT_MESSAGE_VIDEO_SEPARATED", + "value": "%2$@|%1$@ sent a video " + }, + "CHAT_PHOTO_EDITED": { + "key": "CHAT_PHOTO_EDITED", + "value": "%1$@ edited the group's %2$@ photo" + }, + "CHAT_RETURNED": { + "key": "CHAT_RETURNED", + "value": "%1$@ returned to the group %2$@" + }, + "CHAT_RETURNED_SEPARATED": { + "key": "CHAT_RETURNED_SEPARATED", + "value": "%2$@|%1$@ returned to the group" + }, + "CHAT_TITLE_EDITED": { + "key": "CHAT_TITLE_EDITED", + "value": "%1$@ edited the name of the group %2$@" + }, + "CHAT_VOICECHAT_INVITE": { + "key": "CHAT_VOICECHAT_INVITE", + "value": "%1$@ invited %3$@ to a voice chat" + }, + "CHAT_VOICECHAT_INVITE_YOU": { + "key": "CHAT_VOICECHAT_INVITE_YOU", + "value": "%1$@ invited you to a voice chat" + }, + "CHAT_VOICECHAT_START": { + "key": "CHAT_VOICECHAT_START", + "value": "%1$@ started a voice chat" + }, + "CONTACT_JOINED": { + "key": "CONTACT_JOINED", + "value": "%1$@ joined Telegram" + }, + "CONTACT_JOINED_SEPARATED": { + "key": "CONTACT_JOINED_SEPARATED", + "value": "%1$@|joined Telegram!" + }, + "Cache.ByPeerHeader": { + "key": "Cache.ByPeerHeader", + "value": "CHATS" + }, + "Cache.Clear": { + "key": "Cache.Clear", + "value": "Clear (%@)" + }, + "Cache.ClearCache": { + "key": "Cache.ClearCache", + "value": "Clear Cache" + }, + "Cache.ClearEmpty": { + "key": "Cache.ClearEmpty", + "value": "Empty" + }, + "Cache.ClearNone": { + "key": "Cache.ClearNone", + "value": "Clear" + }, + "Cache.ClearProgress": { + "key": "Cache.ClearProgress", + "value": "Please Wait..." + }, + "Cache.Files": { + "key": "Cache.Files", + "value": "Files" + }, + "Cache.Help": { + "key": "Cache.Help", + "value": "Photos, videos and other files from cloud chats that you have **not accessed** during this period will be removed from this device to save disk space.\n\nAll media will stay in the Telegram cloud and can be re-downloaded if you need it again." + }, + "Cache.Indexing": { + "key": "Cache.Indexing", + "value": "Telegram is calculating current cache size.\nThis can take a few minutes." + }, + "Cache.KeepMedia": { + "key": "Cache.KeepMedia", + "value": "Keep Media" + }, + "Cache.KeepMediaHelp": { + "key": "Cache.KeepMediaHelp", + "value": "Photos, videos and other files from cloud chats that you have **not accessed** during this period will be removed from this device to save disk space." + }, + "Cache.LowDiskSpaceText": { + "key": "Cache.LowDiskSpaceText", + "value": "Your phone has run out of available storage. Please free some space to download or upload media." + }, + "Cache.MaximumCacheSize": { + "key": "Cache.MaximumCacheSize", + "value": "Maximum Cache Size" + }, + "Cache.MaximumCacheSizeHelp": { + "key": "Cache.MaximumCacheSizeHelp", + "value": "If your cache size exceeds this limit, the oldest media will be deleted.\n\nAll media will stay in the Telegram cloud and can be re-downloaded if you need it again." + }, + "Cache.Music": { + "key": "Cache.Music", + "value": "Music" + }, + "Cache.NoLimit": { + "key": "Cache.NoLimit", + "value": "No Limit" + }, + "Cache.Photos": { + "key": "Cache.Photos", + "value": "Photos" + }, + "Cache.ServiceFiles": { + "key": "Cache.ServiceFiles", + "value": "Service Files" + }, + "Cache.Title": { + "key": "Cache.Title", + "value": "Storage Usage" + }, + "Cache.Videos": { + "key": "Cache.Videos", + "value": "Videos" + }, + "Call.Accept": { + "key": "Call.Accept", + "value": "Accept" + }, + "Call.AnsweringWithAccount": { + "key": "Call.AnsweringWithAccount", + "value": "Answering as %@" + }, + "Call.Audio": { + "key": "Call.Audio", + "value": "audio" + }, + "Call.AudioRouteHeadphones": { + "key": "Call.AudioRouteHeadphones", + "value": "Headphones" + }, + "Call.AudioRouteHide": { + "key": "Call.AudioRouteHide", + "value": "Hide" + }, + "Call.AudioRouteMute": { + "key": "Call.AudioRouteMute", + "value": "Mute Yourself" + }, + "Call.AudioRouteSpeaker": { + "key": "Call.AudioRouteSpeaker", + "value": "Speaker" + }, + "Call.BatteryLow": { + "key": "Call.BatteryLow", + "value": "%@'s battery level is low" + }, + "Call.CallAgain": { + "key": "Call.CallAgain", + "value": "Call Again" + }, + "Call.CallInProgressMessage": { + "key": "Call.CallInProgressMessage", + "value": "End call with %1$@ and start a new one with %2$@?" + }, + "Call.CallInProgressTitle": { + "key": "Call.CallInProgressTitle", + "value": "Call in Progress" + }, + "Call.CallInProgressVoiceChatMessage": { + "key": "Call.CallInProgressVoiceChatMessage", + "value": "End call with %1$@ and start a voice chat in %2$@?" + }, + "Call.Camera": { + "key": "Call.Camera", + "value": "camera" + }, + "Call.CameraConfirmationConfirm": { + "key": "Call.CameraConfirmationConfirm", + "value": "Switch" + }, + "Call.CameraConfirmationText": { + "key": "Call.CameraConfirmationText", + "value": "Switch to video call?" + }, + "Call.CameraOff": { + "key": "Call.CameraOff", + "value": "%@'s camera is off" + }, + "Call.CameraTooltip": { + "key": "Call.CameraTooltip", + "value": "Tap here to turn on your camera" + }, + "Call.ConnectionErrorMessage": { + "key": "Call.ConnectionErrorMessage", + "value": "Please check your internet connection and try again." + }, + "Call.ConnectionErrorTitle": { + "key": "Call.ConnectionErrorTitle", + "value": "Unable to Call" + }, + "Call.Days": { + "key": "Call.Days", + "zeroValue": null, + "oneValue": "%@ day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ days" + }, + "Call.Decline": { + "key": "Call.Decline", + "value": "Decline" + }, + "Call.EmojiDescription": { + "key": "Call.EmojiDescription", + "value": "If these emoji are the same on %@'s screen, this call is 100%% secure." + }, + "Call.EncryptionKey.Title": { + "key": "Call.EncryptionKey.Title", + "value": "Encryption Key" + }, + "Call.End": { + "key": "Call.End", + "value": "end" + }, + "Call.ExternalCallInProgressMessage": { + "key": "Call.ExternalCallInProgressMessage", + "value": "Please finish the current call first." + }, + "Call.Flip": { + "key": "Call.Flip", + "value": "flip" + }, + "Call.GroupFormat": { + "key": "Call.GroupFormat", + "value": "%1$@ (%2$@)" + }, + "Call.Hours": { + "key": "Call.Hours", + "zeroValue": null, + "oneValue": "%@ hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ hours" + }, + "Call.IncomingVideoCall": { + "key": "Call.IncomingVideoCall", + "value": "Incoming Video Call" + }, + "Call.IncomingVoiceCall": { + "key": "Call.IncomingVoiceCall", + "value": "Incoming Voice Call" + }, + "Call.Message": { + "key": "Call.Message", + "value": "Message" + }, + "Call.MicrophoneOff": { + "key": "Call.MicrophoneOff", + "value": "%@'s microphone is off" + }, + "Call.Minutes": { + "key": "Call.Minutes", + "zeroValue": null, + "oneValue": "%@ minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ minutes" + }, + "Call.Mute": { + "key": "Call.Mute", + "value": "mute" + }, + "Call.ParticipantVersionOutdatedError": { + "key": "Call.ParticipantVersionOutdatedError", + "value": "%@'s app does not support calls. They need to update their app before you can call them." + }, + "Call.ParticipantVideoVersionOutdatedError": { + "key": "Call.ParticipantVideoVersionOutdatedError", + "value": "%@'s app does not support video calls. They need to update their app before you can call them." + }, + "Call.PhoneCallInProgressMessage": { + "key": "Call.PhoneCallInProgressMessage", + "value": "You can't place a Telegram call if you're already on a phone call." + }, + "Call.PrivacyErrorMessage": { + "key": "Call.PrivacyErrorMessage", + "value": "Sorry, you cannot call %@ because of their privacy settings." + }, + "Call.RateCall": { + "key": "Call.RateCall", + "value": "Rate This Call" + }, + "Call.RecordingDisabledMessage": { + "key": "Call.RecordingDisabledMessage", + "value": "Please end your call before recording a voice message." + }, + "Call.RemoteVideoPaused": { + "key": "Call.RemoteVideoPaused", + "value": "%@'s video is paused" + }, + "Call.ReportIncludeLog": { + "key": "Call.ReportIncludeLog", + "value": "Send technical information" + }, + "Call.ReportIncludeLogDescription": { + "key": "Call.ReportIncludeLogDescription", + "value": "Doesn't reveal chat contents and helps us fix the issue sooner." + }, + "Call.ReportPlaceholder": { + "key": "Call.ReportPlaceholder", + "value": "What went wrong?" + }, + "Call.ReportSend": { + "key": "Call.ReportSend", + "value": "Send" + }, + "Call.ReportSkip": { + "key": "Call.ReportSkip", + "value": "Skip" + }, + "Call.Seconds": { + "key": "Call.Seconds", + "zeroValue": null, + "oneValue": "%@ second", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ seconds" + }, + "Call.ShareStats": { + "key": "Call.ShareStats", + "value": "Share Statistics" + }, + "Call.ShortMinutes": { + "key": "Call.ShortMinutes", + "zeroValue": null, + "oneValue": "%@ min", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ min" + }, + "Call.ShortSeconds": { + "key": "Call.ShortSeconds", + "zeroValue": null, + "oneValue": "%@ sec", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ sec" + }, + "Call.Speaker": { + "key": "Call.Speaker", + "value": "speaker" + }, + "Call.StatusBar": { + "key": "Call.StatusBar", + "value": "Touch to return to call %@" + }, + "Call.StatusBusy": { + "key": "Call.StatusBusy", + "value": "Busy" + }, + "Call.StatusConnecting": { + "key": "Call.StatusConnecting", + "value": "Connecting..." + }, + "Call.StatusEnded": { + "key": "Call.StatusEnded", + "value": "Call Ended" + }, + "Call.StatusFailed": { + "key": "Call.StatusFailed", + "value": "Call Failed" + }, + "Call.StatusIncoming": { + "key": "Call.StatusIncoming", + "value": "Telegram Audio..." + }, + "Call.StatusNoAnswer": { + "key": "Call.StatusNoAnswer", + "value": "No Answer" + }, + "Call.StatusOngoing": { + "key": "Call.StatusOngoing", + "value": "Telegram Audio %@" + }, + "Call.StatusRequesting": { + "key": "Call.StatusRequesting", + "value": "Contacting..." + }, + "Call.StatusRinging": { + "key": "Call.StatusRinging", + "value": "Ringing..." + }, + "Call.StatusWaiting": { + "key": "Call.StatusWaiting", + "value": "Waiting..." + }, + "Call.VoiceChatInProgressCallMessage": { + "key": "Call.VoiceChatInProgressCallMessage", + "value": "Leave voice chat in %1$@ and call %2$@?" + }, + "Call.VoiceChatInProgressMessage": { + "key": "Call.VoiceChatInProgressMessage", + "value": "Leave the voice chat in %1$@ and start a new one in %2$@?" + }, + "Call.VoiceChatInProgressMessageCall": { + "key": "Call.VoiceChatInProgressMessageCall", + "value": "Leave voice chat in %1$@ and call %2$@?" + }, + "Call.VoiceChatInProgressTitle": { + "key": "Call.VoiceChatInProgressTitle", + "value": "Voice Chat in Progress" + }, + "Call.VoiceOver.VideoCallCanceled": { + "key": "Call.VoiceOver.VideoCallCanceled", + "value": "Cancelled Video Call" + }, + "Call.VoiceOver.VideoCallIncoming": { + "key": "Call.VoiceOver.VideoCallIncoming", + "value": "Incoming Video Call" + }, + "Call.VoiceOver.VideoCallMissed": { + "key": "Call.VoiceOver.VideoCallMissed", + "value": "Missed Video Call" + }, + "Call.VoiceOver.VideoCallOutgoing": { + "key": "Call.VoiceOver.VideoCallOutgoing", + "value": "Outgoing Video Call" + }, + "Call.VoiceOver.VoiceCallCanceled": { + "key": "Call.VoiceOver.VoiceCallCanceled", + "value": "Cancelled Voice Call" + }, + "Call.VoiceOver.VoiceCallIncoming": { + "key": "Call.VoiceOver.VoiceCallIncoming", + "value": "Incoming Voice Call" + }, + "Call.VoiceOver.VoiceCallMissed": { + "key": "Call.VoiceOver.VoiceCallMissed", + "value": "Missed Voice Call" + }, + "Call.VoiceOver.VoiceCallOutgoing": { + "key": "Call.VoiceOver.VoiceCallOutgoing", + "value": "Outgoing Voice Call" + }, + "Call.YourMicrophoneOff": { + "key": "Call.YourMicrophoneOff", + "value": "Your microphone is off" + }, + "CallFeedback.AddComment": { + "key": "CallFeedback.AddComment", + "value": "Add an optional comment" + }, + "CallFeedback.IncludeLogs": { + "key": "CallFeedback.IncludeLogs", + "value": "Include technical information" + }, + "CallFeedback.IncludeLogsInfo": { + "key": "CallFeedback.IncludeLogsInfo", + "value": "Doesn't reveal chat contents and helps us fix the issue sooner." + }, + "CallFeedback.ReasonDistortedSpeech": { + "key": "CallFeedback.ReasonDistortedSpeech", + "value": "Speech was distorted" + }, + "CallFeedback.ReasonDropped": { + "key": "CallFeedback.ReasonDropped", + "value": "Call ended unexpectedly" + }, + "CallFeedback.ReasonEcho": { + "key": "CallFeedback.ReasonEcho", + "value": "I heard my own voice" + }, + "CallFeedback.ReasonInterruption": { + "key": "CallFeedback.ReasonInterruption", + "value": "The other side kept disappearing" + }, + "CallFeedback.ReasonNoise": { + "key": "CallFeedback.ReasonNoise", + "value": "I heard background noise" + }, + "CallFeedback.ReasonSilentLocal": { + "key": "CallFeedback.ReasonSilentLocal", + "value": "I couldn't hear the other side" + }, + "CallFeedback.ReasonSilentRemote": { + "key": "CallFeedback.ReasonSilentRemote", + "value": "The other side couldn't hear me" + }, + "CallFeedback.Send": { + "key": "CallFeedback.Send", + "value": "Send" + }, + "CallFeedback.Success": { + "key": "CallFeedback.Success", + "value": "Thanks for\nyour feedback" + }, + "CallFeedback.Title": { + "key": "CallFeedback.Title", + "value": "Call Feedback" + }, + "CallFeedback.VideoReasonDistorted": { + "key": "CallFeedback.VideoReasonDistorted", + "value": "Video was distorted" + }, + "CallFeedback.VideoReasonLowQuality": { + "key": "CallFeedback.VideoReasonLowQuality", + "value": "Video was pixelated" + }, + "CallFeedback.WhatWentWrong": { + "key": "CallFeedback.WhatWentWrong", + "value": "WHAT WENT WRONG?" + }, + "CallList.ActiveVoiceChatsHeader": { + "key": "CallList.ActiveVoiceChatsHeader", + "value": "ACTIVE VOICE CHATS" + }, + "CallList.DeleteAllForEveryone": { + "key": "CallList.DeleteAllForEveryone", + "value": "Delete for me and Others" + }, + "CallList.DeleteAllForMe": { + "key": "CallList.DeleteAllForMe", + "value": "Delete for me" + }, + "CallList.RecentCallsHeader": { + "key": "CallList.RecentCallsHeader", + "value": "RECENT CALLS" + }, + "CallSettings.Always": { + "key": "CallSettings.Always", + "value": "Always" + }, + "CallSettings.Never": { + "key": "CallSettings.Never", + "value": "Never" + }, + "CallSettings.OnMobile": { + "key": "CallSettings.OnMobile", + "value": "On Mobile Network" + }, + "CallSettings.RecentCalls": { + "key": "CallSettings.RecentCalls", + "value": "Recent Calls" + }, + "CallSettings.TabIcon": { + "key": "CallSettings.TabIcon", + "value": "Show Calls Tab" + }, + "CallSettings.TabIconDescription": { + "key": "CallSettings.TabIconDescription", + "value": "A call icon will appear in the tab bar." + }, + "CallSettings.Title": { + "key": "CallSettings.Title", + "value": "Calls" + }, + "CallSettings.UseLessData": { + "key": "CallSettings.UseLessData", + "value": "Use Less Data" + }, + "CallSettings.UseLessDataLongDescription": { + "key": "CallSettings.UseLessDataLongDescription", + "value": "Using less data may improve your experience on bad networks, but will slightly decrease audio quality." + }, + "Calls.AddTab": { + "key": "Calls.AddTab", + "value": "Add Tab" + }, + "Calls.All": { + "key": "Calls.All", + "value": "All" + }, + "Calls.CallTabDescription": { + "key": "Calls.CallTabDescription", + "value": "You can add a Calls tab to the tab bar." + }, + "Calls.CallTabTitle": { + "key": "Calls.CallTabTitle", + "value": "Calls Tab" + }, + "Calls.Missed": { + "key": "Calls.Missed", + "value": "Missed" + }, + "Calls.NewCall": { + "key": "Calls.NewCall", + "value": "New Call" + }, + "Calls.NoCallsPlaceholder": { + "key": "Calls.NoCallsPlaceholder", + "value": "Your recent calls will appear here" + }, + "Calls.NoMissedCallsPlacehoder": { + "key": "Calls.NoMissedCallsPlacehoder", + "value": "You have no missed calls" + }, + "Calls.NotNow": { + "key": "Calls.NotNow", + "value": "Not Now" + }, + "Calls.RatingFeedback": { + "key": "Calls.RatingFeedback", + "value": "Write a comment..." + }, + "Calls.RatingTitle": { + "key": "Calls.RatingTitle", + "value": "Please rate the quality\nof your Telegram call" + }, + "Calls.SubmitRating": { + "key": "Calls.SubmitRating", + "value": "Submit" + }, + "Calls.TabTitle": { + "key": "Calls.TabTitle", + "value": "Calls" + }, + "Camera.Discard": { + "key": "Camera.Discard", + "value": "Discard All" + }, + "Camera.FlashAuto": { + "key": "Camera.FlashAuto", + "value": "Auto" + }, + "Camera.FlashOff": { + "key": "Camera.FlashOff", + "value": "Off" + }, + "Camera.FlashOn": { + "key": "Camera.FlashOn", + "value": "On" + }, + "Camera.PhotoMode": { + "key": "Camera.PhotoMode", + "value": "PHOTO" + }, + "Camera.Retake": { + "key": "Camera.Retake", + "value": "Retake" + }, + "Camera.SquareMode": { + "key": "Camera.SquareMode", + "value": "SQUARE" + }, + "Camera.TapAndHoldForVideo": { + "key": "Camera.TapAndHoldForVideo", + "value": "Press and hold for video" + }, + "Camera.Title": { + "key": "Camera.Title", + "value": "Take Photo or Video" + }, + "Camera.VideoMode": { + "key": "Camera.VideoMode", + "value": "VIDEO" + }, + "CancelResetAccount.Success": { + "key": "CancelResetAccount.Success", + "value": "The deletion process was cancelled for your account %@." + }, + "CancelResetAccount.TextSMS": { + "key": "CancelResetAccount.TextSMS", + "value": "Somebody with access to your phone number %@ has requested to delete your Telegram account and reset your 2-Step Verification password.\n\nIf it wasn't you, please enter the code we've just sent you via SMS to your number. You can also cancel this by **changing your phone number** to a number you control." + }, + "CancelResetAccount.Title": { + "key": "CancelResetAccount.Title", + "value": "Cancel Account Reset" + }, + "ChangePhone.ErrorOccupied": { + "key": "ChangePhone.ErrorOccupied", + "value": "The number %@ is already connected to a Telegram account. Please delete that account before migrating to the new number." + }, + "ChangePhoneNumberCode.CallTimer": { + "key": "ChangePhoneNumberCode.CallTimer", + "value": "Telegram will call you in %@" + }, + "ChangePhoneNumberCode.Called": { + "key": "ChangePhoneNumberCode.Called", + "value": "Telegram dialed your number" + }, + "ChangePhoneNumberCode.Code": { + "key": "ChangePhoneNumberCode.Code", + "value": "YOUR CODE" + }, + "ChangePhoneNumberCode.CodePlaceholder": { + "key": "ChangePhoneNumberCode.CodePlaceholder", + "value": "Code" + }, + "ChangePhoneNumberCode.Help": { + "key": "ChangePhoneNumberCode.Help", + "value": "We have sent you an SMS with the code" + }, + "ChangePhoneNumberCode.RequestingACall": { + "key": "ChangePhoneNumberCode.RequestingACall", + "value": "Requesting a call from Telegram..." + }, + "ChangePhoneNumberNumber.Help": { + "key": "ChangePhoneNumberNumber.Help", + "value": "We will send an SMS with a confirmation code to your new number." + }, + "ChangePhoneNumberNumber.NewNumber": { + "key": "ChangePhoneNumberNumber.NewNumber", + "value": "NEW NUMBER" + }, + "ChangePhoneNumberNumber.NumberPlaceholder": { + "key": "ChangePhoneNumberNumber.NumberPlaceholder", + "value": "Enter your new number" + }, + "ChangePhoneNumberNumber.Title": { + "key": "ChangePhoneNumberNumber.Title", + "value": "Change Number" + }, + "Channel.About.Help": { + "key": "Channel.About.Help", + "value": "You can provide an optional description for your channel." + }, + "Channel.About.Placeholder": { + "key": "Channel.About.Placeholder", + "value": "Description" + }, + "Channel.About.Title": { + "key": "Channel.About.Title", + "value": "Description" + }, + "Channel.AboutItem": { + "key": "Channel.AboutItem", + "value": "about" + }, + "Channel.AddBotAsAdmin": { + "key": "Channel.AddBotAsAdmin", + "value": "Make Admin" + }, + "Channel.AddBotErrorHaveRights": { + "key": "Channel.AddBotErrorHaveRights", + "value": "Bots can only be added to channels as administrators." + }, + "Channel.AddBotErrorNoRights": { + "key": "Channel.AddBotErrorNoRights", + "value": "Bots can only be added to channels as admins." + }, + "Channel.AddUserLeftError": { + "key": "Channel.AddUserLeftError", + "value": "Sorry, if a person is no longer part of a channel, you need to be in their Telegram contacts in order to add them back.\n\nNote that they can still join via the channel's invite link as long as they are not in the Removed Users list." + }, + "Channel.AdminLog.AddMembers": { + "key": "Channel.AdminLog.AddMembers", + "value": "Add Members" + }, + "Channel.AdminLog.AllowedNewMembersToSpeak": { + "key": "Channel.AdminLog.AllowedNewMembersToSpeak", + "value": "%1$@ allowed new voice chat participants to speak" + }, + "Channel.AdminLog.BanEmbedLinks": { + "key": "Channel.AdminLog.BanEmbedLinks", + "value": "Embed Links" + }, + "Channel.AdminLog.BanReadMessages": { + "key": "Channel.AdminLog.BanReadMessages", + "value": "Read Messages" + }, + "Channel.AdminLog.BanSendGifs": { + "key": "Channel.AdminLog.BanSendGifs", + "value": "Send GIFs" + }, + "Channel.AdminLog.BanSendMedia": { + "key": "Channel.AdminLog.BanSendMedia", + "value": "Send Media" + }, + "Channel.AdminLog.BanSendMessages": { + "key": "Channel.AdminLog.BanSendMessages", + "value": "Send Messages" + }, + "Channel.AdminLog.BanSendStickers": { + "key": "Channel.AdminLog.BanSendStickers", + "value": "Send Stickers" + }, + "Channel.AdminLog.BanSendStickersAndGifs": { + "key": "Channel.AdminLog.BanSendStickersAndGifs", + "value": "Send Stickers & GIFs" + }, + "Channel.AdminLog.CanAddAdmins": { + "key": "Channel.AdminLog.CanAddAdmins", + "value": "Add New Admins" + }, + "Channel.AdminLog.CanBanUsers": { + "key": "Channel.AdminLog.CanBanUsers", + "value": "Ban Users" + }, + "Channel.AdminLog.CanBeAnonymous": { + "key": "Channel.AdminLog.CanBeAnonymous", + "value": "Remain Anonymous" + }, + "Channel.AdminLog.CanChangeInfo": { + "key": "Channel.AdminLog.CanChangeInfo", + "value": "Change Info" + }, + "Channel.AdminLog.CanChangeInviteLink": { + "key": "Channel.AdminLog.CanChangeInviteLink", + "value": "Invite Users Via Link" + }, + "Channel.AdminLog.CanDeleteMessages": { + "key": "Channel.AdminLog.CanDeleteMessages", + "value": "Delete Messages" + }, + "Channel.AdminLog.CanDeleteMessagesOfOthers": { + "key": "Channel.AdminLog.CanDeleteMessagesOfOthers", + "value": "Delete Messages of Others" + }, + "Channel.AdminLog.CanEditMessages": { + "key": "Channel.AdminLog.CanEditMessages", + "value": "Edit Messages of Others" + }, + "Channel.AdminLog.CanInviteUsers": { + "key": "Channel.AdminLog.CanInviteUsers", + "value": "Add Users" + }, + "Channel.AdminLog.CanInviteUsersViaLink": { + "key": "Channel.AdminLog.CanInviteUsersViaLink", + "value": "Invite Users via Link" + }, + "Channel.AdminLog.CanManageCalls": { + "key": "Channel.AdminLog.CanManageCalls", + "value": "Manage Voice Chats" + }, + "Channel.AdminLog.CanPinMessages": { + "key": "Channel.AdminLog.CanPinMessages", + "value": "Pin Messages" + }, + "Channel.AdminLog.CanSendMessages": { + "key": "Channel.AdminLog.CanSendMessages", + "value": "Post Messages" + }, + "Channel.AdminLog.CaptionEdited": { + "key": "Channel.AdminLog.CaptionEdited", + "value": "%@ edited caption:" + }, + "Channel.AdminLog.ChangeInfo": { + "key": "Channel.AdminLog.ChangeInfo", + "value": "Change Info" + }, + "Channel.AdminLog.ChannelEmptyText": { + "key": "Channel.AdminLog.ChannelEmptyText", + "value": "No service actions were taken by the channel's subscribers and admins in the last 48 hours." + }, + "Channel.AdminLog.CreatedInviteLink": { + "key": "Channel.AdminLog.CreatedInviteLink", + "value": "%1$@ created invite link %2$@" + }, + "Channel.AdminLog.DefaultRestrictionsUpdated": { + "key": "Channel.AdminLog.DefaultRestrictionsUpdated", + "value": "changed default permissions" + }, + "Channel.AdminLog.DeletedInviteLink": { + "key": "Channel.AdminLog.DeletedInviteLink", + "value": "%1$@ deleted invite link %2$@" + }, + "Channel.AdminLog.DisabledSlowmode": { + "key": "Channel.AdminLog.DisabledSlowmode", + "value": "%@ disabled the slow mode" + }, + "Channel.AdminLog.EditedInviteLink": { + "key": "Channel.AdminLog.EditedInviteLink", + "value": "%1$@ edited invite link %2$@" + }, + "Channel.AdminLog.EmptyFilterQueryText": { + "key": "Channel.AdminLog.EmptyFilterQueryText", + "value": "No recent actions that contain '%@' have been found." + }, + "Channel.AdminLog.EmptyFilterText": { + "key": "Channel.AdminLog.EmptyFilterText", + "value": "No recent actions that match your query were found." + }, + "Channel.AdminLog.EmptyFilterTitle": { + "key": "Channel.AdminLog.EmptyFilterTitle", + "value": "No actions found" + }, + "Channel.AdminLog.EmptyMessageText": { + "key": "Channel.AdminLog.EmptyMessageText", + "value": "Empty" + }, + "Channel.AdminLog.EmptyText": { + "key": "Channel.AdminLog.EmptyText", + "value": "No service actions were taken by the group's members and admins in the last 48 hours." + }, + "Channel.AdminLog.EmptyTitle": { + "key": "Channel.AdminLog.EmptyTitle", + "value": "No actions here yet" + }, + "Channel.AdminLog.EndedVoiceChat": { + "key": "Channel.AdminLog.EndedVoiceChat", + "value": "%1$@ ended the voice chat" + }, + "Channel.AdminLog.InfoPanelAlertText": { + "key": "Channel.AdminLog.InfoPanelAlertText", + "value": "This is a list of notable actions by members and admins in the last 48 hours." + }, + "Channel.AdminLog.InfoPanelAlertTitle": { + "key": "Channel.AdminLog.InfoPanelAlertTitle", + "value": "What is the event log?" + }, + "Channel.AdminLog.InfoPanelChannelAlertText": { + "key": "Channel.AdminLog.InfoPanelChannelAlertText", + "value": "This is a list of all service actions taken by the channel's admins in the last 48 hours." + }, + "Channel.AdminLog.InfoPanelTitle": { + "key": "Channel.AdminLog.InfoPanelTitle", + "value": "What Is This?" + }, + "Channel.AdminLog.JoinedViaInviteLink": { + "key": "Channel.AdminLog.JoinedViaInviteLink", + "value": "%1$@ joined via invite link %2$@" + }, + "Channel.AdminLog.MessageAddedAdminName": { + "key": "Channel.AdminLog.MessageAddedAdminName", + "value": "promoted %1$@" + }, + "Channel.AdminLog.MessageAddedAdminNameUsername": { + "key": "Channel.AdminLog.MessageAddedAdminNameUsername", + "value": "promoted %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageAdmin": { + "key": "Channel.AdminLog.MessageAdmin", + "value": "%@ changed privileges for %@ (%@)" + }, + "Channel.AdminLog.MessageChangedAutoremoveTimeoutRemove": { + "key": "Channel.AdminLog.MessageChangedAutoremoveTimeoutRemove", + "value": "%1$@ disabled auto-remove timer" + }, + "Channel.AdminLog.MessageChangedAutoremoveTimeoutSet": { + "key": "Channel.AdminLog.MessageChangedAutoremoveTimeoutSet", + "value": "%1$@ set auto-remove timer to %2$@" + }, + "Channel.AdminLog.MessageChangedChannelAbout": { + "key": "Channel.AdminLog.MessageChangedChannelAbout", + "value": "%@ edited channel description" + }, + "Channel.AdminLog.MessageChangedChannelUsername": { + "key": "Channel.AdminLog.MessageChangedChannelUsername", + "value": "%@ changed channel link:" + }, + "Channel.AdminLog.MessageChangedGroupAbout": { + "key": "Channel.AdminLog.MessageChangedGroupAbout", + "value": "%@ edited group description" + }, + "Channel.AdminLog.MessageChangedGroupGeoLocation": { + "key": "Channel.AdminLog.MessageChangedGroupGeoLocation", + "value": "changed group location to \"%@\"" + }, + "Channel.AdminLog.MessageChangedGroupStickerPack": { + "key": "Channel.AdminLog.MessageChangedGroupStickerPack", + "value": "%@ changed group sticker set" + }, + "Channel.AdminLog.MessageChangedGroupUsername": { + "key": "Channel.AdminLog.MessageChangedGroupUsername", + "value": "%@ changed group link:" + }, + "Channel.AdminLog.MessageChangedLinkedChannel": { + "key": "Channel.AdminLog.MessageChangedLinkedChannel", + "value": "%1$@ linked this group to %2$@" + }, + "Channel.AdminLog.MessageChangedLinkedGroup": { + "key": "Channel.AdminLog.MessageChangedLinkedGroup", + "value": "%1$@ made %2$@ the discussion group for this channel." + }, + "Channel.AdminLog.MessageChangedUnlinkedChannel": { + "key": "Channel.AdminLog.MessageChangedUnlinkedChannel", + "value": "%1$@ unlinked this group from %2$@" + }, + "Channel.AdminLog.MessageChangedUnlinkedGroup": { + "key": "Channel.AdminLog.MessageChangedUnlinkedGroup", + "value": "%1$@ removed the discussion group %2$@" + }, + "Channel.AdminLog.MessageDeleted": { + "key": "Channel.AdminLog.MessageDeleted", + "value": "%@ deleted message:" + }, + "Channel.AdminLog.MessageEdited": { + "key": "Channel.AdminLog.MessageEdited", + "value": "%@ edited message:" + }, + "Channel.AdminLog.MessageGroupPreHistoryHidden": { + "key": "Channel.AdminLog.MessageGroupPreHistoryHidden", + "value": "%@ made the group history hidden from new members" + }, + "Channel.AdminLog.MessageGroupPreHistoryVisible": { + "key": "Channel.AdminLog.MessageGroupPreHistoryVisible", + "value": "%@ made the group history visible for new members" + }, + "Channel.AdminLog.MessageInvitedName": { + "key": "Channel.AdminLog.MessageInvitedName", + "value": "invited %1$@" + }, + "Channel.AdminLog.MessageInvitedNameUsername": { + "key": "Channel.AdminLog.MessageInvitedNameUsername", + "value": "invited %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageKickedName": { + "key": "Channel.AdminLog.MessageKickedName", + "value": "banned %1$@" + }, + "Channel.AdminLog.MessageKickedNameUsername": { + "key": "Channel.AdminLog.MessageKickedNameUsername", + "value": "banned %1$@ (%2$@)" + }, + "Channel.AdminLog.MessagePinned": { + "key": "Channel.AdminLog.MessagePinned", + "value": "%@ pinned message:" + }, + "Channel.AdminLog.MessagePreviousCaption": { + "key": "Channel.AdminLog.MessagePreviousCaption", + "value": "Original caption" + }, + "Channel.AdminLog.MessagePreviousDescription": { + "key": "Channel.AdminLog.MessagePreviousDescription", + "value": "Previous description" + }, + "Channel.AdminLog.MessagePreviousLink": { + "key": "Channel.AdminLog.MessagePreviousLink", + "value": "Previous link" + }, + "Channel.AdminLog.MessagePreviousMessage": { + "key": "Channel.AdminLog.MessagePreviousMessage", + "value": "Original message" + }, + "Channel.AdminLog.MessagePromotedName": { + "key": "Channel.AdminLog.MessagePromotedName", + "value": "changed privileges for %1$@" + }, + "Channel.AdminLog.MessagePromotedNameUsername": { + "key": "Channel.AdminLog.MessagePromotedNameUsername", + "value": "changed privileges for %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRank": { + "key": "Channel.AdminLog.MessageRank", + "value": "changed custom title:\n%1$@" + }, + "Channel.AdminLog.MessageRankName": { + "key": "Channel.AdminLog.MessageRankName", + "value": "changed custom title for %1$@:\n%2$@" + }, + "Channel.AdminLog.MessageRankUsername": { + "key": "Channel.AdminLog.MessageRankUsername", + "value": "changed custom title for %1$@ (%2$@):\n%3$@" + }, + "Channel.AdminLog.MessageRemovedAdminName": { + "key": "Channel.AdminLog.MessageRemovedAdminName", + "value": "demoted %1$@" + }, + "Channel.AdminLog.MessageRemovedAdminNameUsername": { + "key": "Channel.AdminLog.MessageRemovedAdminNameUsername", + "value": "demoted %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRemovedChannelUsername": { + "key": "Channel.AdminLog.MessageRemovedChannelUsername", + "value": "%@ removed channel link" + }, + "Channel.AdminLog.MessageRemovedGroupStickerPack": { + "key": "Channel.AdminLog.MessageRemovedGroupStickerPack", + "value": "%@ removed group sticker set" + }, + "Channel.AdminLog.MessageRemovedGroupUsername": { + "key": "Channel.AdminLog.MessageRemovedGroupUsername", + "value": "%@ removed group link" + }, + "Channel.AdminLog.MessageRestricted": { + "key": "Channel.AdminLog.MessageRestricted", + "value": "%@ changed restrictions for %@ (%@)" + }, + "Channel.AdminLog.MessageRestrictedForever": { + "key": "Channel.AdminLog.MessageRestrictedForever", + "value": "indefinitely" + }, + "Channel.AdminLog.MessageRestrictedName": { + "key": "Channel.AdminLog.MessageRestrictedName", + "value": "changed restrictions for %1$@" + }, + "Channel.AdminLog.MessageRestrictedNameUsername": { + "key": "Channel.AdminLog.MessageRestrictedNameUsername", + "value": "changed restrictions for %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRestrictedNewSetting": { + "key": "Channel.AdminLog.MessageRestrictedNewSetting", + "value": "now: %@" + }, + "Channel.AdminLog.MessageRestrictedUntil": { + "key": "Channel.AdminLog.MessageRestrictedUntil", + "value": "until %@" + }, + "Channel.AdminLog.MessageToggleInvitesOff": { + "key": "Channel.AdminLog.MessageToggleInvitesOff", + "value": "%@ disabled group invites" + }, + "Channel.AdminLog.MessageToggleInvitesOn": { + "key": "Channel.AdminLog.MessageToggleInvitesOn", + "value": "%@ enabled group invites" + }, + "Channel.AdminLog.MessageToggleSignaturesOff": { + "key": "Channel.AdminLog.MessageToggleSignaturesOff", + "value": "%@ disabled signatures" + }, + "Channel.AdminLog.MessageToggleSignaturesOn": { + "key": "Channel.AdminLog.MessageToggleSignaturesOn", + "value": "%@ enabled signatures" + }, + "Channel.AdminLog.MessageTransferedName": { + "key": "Channel.AdminLog.MessageTransferedName", + "value": "transferred ownership to %1$@" + }, + "Channel.AdminLog.MessageTransferedNameUsername": { + "key": "Channel.AdminLog.MessageTransferedNameUsername", + "value": "transferred ownership to %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageUnkickedName": { + "key": "Channel.AdminLog.MessageUnkickedName", + "value": "unbanned %1$@" + }, + "Channel.AdminLog.MessageUnkickedNameUsername": { + "key": "Channel.AdminLog.MessageUnkickedNameUsername", + "value": "unbanned %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageUnpinned": { + "key": "Channel.AdminLog.MessageUnpinned", + "value": "%@ unpinned message" + }, + "Channel.AdminLog.MutedNewMembers": { + "key": "Channel.AdminLog.MutedNewMembers", + "value": "%1$@ muted new voice chat participants" + }, + "Channel.AdminLog.MutedParticipant": { + "key": "Channel.AdminLog.MutedParticipant", + "value": "%1$@ muted %2$@ in a voice chat" + }, + "Channel.AdminLog.PinMessages": { + "key": "Channel.AdminLog.PinMessages", + "value": "Pin Messages" + }, + "Channel.AdminLog.PollStopped": { + "key": "Channel.AdminLog.PollStopped", + "value": "%@ stopped poll" + }, + "Channel.AdminLog.RevokedInviteLink": { + "key": "Channel.AdminLog.RevokedInviteLink", + "value": "%1$@ revoked invite link %2$@" + }, + "Channel.AdminLog.SendPolls": { + "key": "Channel.AdminLog.SendPolls", + "value": "Send Polls" + }, + "Channel.AdminLog.SetSlowmode": { + "key": "Channel.AdminLog.SetSlowmode", + "value": "%1$@ set the slow mode timer to %2$@" + }, + "Channel.AdminLog.StartedVoiceChat": { + "key": "Channel.AdminLog.StartedVoiceChat", + "value": "%1$@ started a voice chat" + }, + "Channel.AdminLog.TitleAllEvents": { + "key": "Channel.AdminLog.TitleAllEvents", + "value": "All Actions" + }, + "Channel.AdminLog.TitleSelectedEvents": { + "key": "Channel.AdminLog.TitleSelectedEvents", + "value": "Selected Actions" + }, + "Channel.AdminLog.UnmutedMutedParticipant": { + "key": "Channel.AdminLog.UnmutedMutedParticipant", + "value": "%1$@ unmuted %2$@ in a voice chat" + }, + "Channel.AdminLog.UpdatedParticipantVolume": { + "key": "Channel.AdminLog.UpdatedParticipantVolume", + "value": "%1$@ changed %2$@ volume to %3$@" + }, + "Channel.AdminLogFilter.AdminsAll": { + "key": "Channel.AdminLogFilter.AdminsAll", + "value": "All Admins" + }, + "Channel.AdminLogFilter.AdminsTitle": { + "key": "Channel.AdminLogFilter.AdminsTitle", + "value": "ADMINS" + }, + "Channel.AdminLogFilter.ChannelEventsInfo": { + "key": "Channel.AdminLogFilter.ChannelEventsInfo", + "value": "Channel Info" + }, + "Channel.AdminLogFilter.EventsAdmins": { + "key": "Channel.AdminLogFilter.EventsAdmins", + "value": "Admin Rights" + }, + "Channel.AdminLogFilter.EventsAll": { + "key": "Channel.AdminLogFilter.EventsAll", + "value": "All Actions" + }, + "Channel.AdminLogFilter.EventsCalls": { + "key": "Channel.AdminLogFilter.EventsCalls", + "value": "Voice Chats" + }, + "Channel.AdminLogFilter.EventsDeletedMessages": { + "key": "Channel.AdminLogFilter.EventsDeletedMessages", + "value": "Deleted Messages" + }, + "Channel.AdminLogFilter.EventsEditedMessages": { + "key": "Channel.AdminLogFilter.EventsEditedMessages", + "value": "Edited Messages" + }, + "Channel.AdminLogFilter.EventsInfo": { + "key": "Channel.AdminLogFilter.EventsInfo", + "value": "Group Info" + }, + "Channel.AdminLogFilter.EventsInviteLinks": { + "key": "Channel.AdminLogFilter.EventsInviteLinks", + "value": "Invite Links" + }, + "Channel.AdminLogFilter.EventsLeaving": { + "key": "Channel.AdminLogFilter.EventsLeaving", + "value": "Leaving Members" + }, + "Channel.AdminLogFilter.EventsLeavingSubscribers": { + "key": "Channel.AdminLogFilter.EventsLeavingSubscribers", + "value": "Subscribers Removed" + }, + "Channel.AdminLogFilter.EventsNewMembers": { + "key": "Channel.AdminLogFilter.EventsNewMembers", + "value": "New Members" + }, + "Channel.AdminLogFilter.EventsNewSubscribers": { + "key": "Channel.AdminLogFilter.EventsNewSubscribers", + "value": "New Subscribers" + }, + "Channel.AdminLogFilter.EventsPinned": { + "key": "Channel.AdminLogFilter.EventsPinned", + "value": "Pinned Messages" + }, + "Channel.AdminLogFilter.EventsRestrictions": { + "key": "Channel.AdminLogFilter.EventsRestrictions", + "value": "New Restrictions" + }, + "Channel.AdminLogFilter.EventsTitle": { + "key": "Channel.AdminLogFilter.EventsTitle", + "value": "ACTIONS" + }, + "Channel.AdminLogFilter.Title": { + "key": "Channel.AdminLogFilter.Title", + "value": "Filter" + }, + "Channel.BanList.BlockedTitle": { + "key": "Channel.BanList.BlockedTitle", + "value": "BANNED" + }, + "Channel.BanList.RestrictedTitle": { + "key": "Channel.BanList.RestrictedTitle", + "value": "RESTRICTED" + }, + "Channel.BanUser.BlockFor": { + "key": "Channel.BanUser.BlockFor", + "value": "Block For" + }, + "Channel.BanUser.PermissionAddMembers": { + "key": "Channel.BanUser.PermissionAddMembers", + "value": "Add Members" + }, + "Channel.BanUser.PermissionChangeGroupInfo": { + "key": "Channel.BanUser.PermissionChangeGroupInfo", + "value": "Change Group Info" + }, + "Channel.BanUser.PermissionEmbedLinks": { + "key": "Channel.BanUser.PermissionEmbedLinks", + "value": "Embed Links" + }, + "Channel.BanUser.PermissionReadMessages": { + "key": "Channel.BanUser.PermissionReadMessages", + "value": "Read Messages" + }, + "Channel.BanUser.PermissionSendMedia": { + "key": "Channel.BanUser.PermissionSendMedia", + "value": "Send Media" + }, + "Channel.BanUser.PermissionSendMessages": { + "key": "Channel.BanUser.PermissionSendMessages", + "value": "Send Messages" + }, + "Channel.BanUser.PermissionSendPolls": { + "key": "Channel.BanUser.PermissionSendPolls", + "value": "Send Polls" + }, + "Channel.BanUser.PermissionSendStickersAndGifs": { + "key": "Channel.BanUser.PermissionSendStickersAndGifs", + "value": "Send Stickers & GIFs" + }, + "Channel.BanUser.PermissionsHeader": { + "key": "Channel.BanUser.PermissionsHeader", + "value": "User Restrictions" + }, + "Channel.BanUser.Title": { + "key": "Channel.BanUser.Title", + "value": "Ban User" + }, + "Channel.BanUser.Unban": { + "key": "Channel.BanUser.Unban", + "value": "Unban" + }, + "Channel.BlackList.Title": { + "key": "Channel.BlackList.Title", + "value": "Banned" + }, + "Channel.BotDoesntSupportGroups": { + "key": "Channel.BotDoesntSupportGroups", + "value": "Sorry, this bot is telling us it doesn't want to be added to groups. You can't add this bot unless its developers change their mind." + }, + "Channel.CommentsGroup.Header": { + "key": "Channel.CommentsGroup.Header", + "value": "Select a group chat that will host comments from your channel." + }, + "Channel.CommentsGroup.HeaderGroupSet": { + "key": "Channel.CommentsGroup.HeaderGroupSet", + "value": "%@ links the group as its discussion board." + }, + "Channel.CommentsGroup.HeaderSet": { + "key": "Channel.CommentsGroup.HeaderSet", + "value": "%@ is selected as the group that will be used to host comments for your channel." + }, + "Channel.DiscussionGroup": { + "key": "Channel.DiscussionGroup", + "value": "Discussion" + }, + "Channel.DiscussionGroup.Create": { + "key": "Channel.DiscussionGroup.Create", + "value": "Create New Group" + }, + "Channel.DiscussionGroup.Header": { + "key": "Channel.DiscussionGroup.Header", + "value": "Select a group chat for discussion that will be displayed in your channel." + }, + "Channel.DiscussionGroup.HeaderGroupSet": { + "key": "Channel.DiscussionGroup.HeaderGroupSet", + "value": "This group is linked as the discussion board for %@." + }, + "Channel.DiscussionGroup.HeaderLabel": { + "key": "Channel.DiscussionGroup.HeaderLabel", + "value": "Discuss" + }, + "Channel.DiscussionGroup.HeaderSet": { + "key": "Channel.DiscussionGroup.HeaderSet", + "value": "A link to %@ is shown to all subscribers in the bottom panel." + }, + "Channel.DiscussionGroup.Info": { + "key": "Channel.DiscussionGroup.Info", + "value": "Everything you post in the channel will be forwarded to this group." + }, + "Channel.DiscussionGroup.LinkGroup": { + "key": "Channel.DiscussionGroup.LinkGroup", + "value": "Link Group" + }, + "Channel.DiscussionGroup.MakeHistoryPublic": { + "key": "Channel.DiscussionGroup.MakeHistoryPublic", + "value": "Warning: If you set this private group as the discussion group for your channel, all channel subscribers will be able to access the group. \"Chat history for new members\" will be switched to Visible." + }, + "Channel.DiscussionGroup.MakeHistoryPublicProceed": { + "key": "Channel.DiscussionGroup.MakeHistoryPublicProceed", + "value": "Proceed" + }, + "Channel.DiscussionGroup.PrivateChannel": { + "key": "Channel.DiscussionGroup.PrivateChannel", + "value": "private channel" + }, + "Channel.DiscussionGroup.PrivateChannelLink": { + "key": "Channel.DiscussionGroup.PrivateChannelLink", + "value": "Do you want to make %1$@ the discussion board for %2$@?\n\nAny member of this group will be able to see messages in the channel." + }, + "Channel.DiscussionGroup.PrivateGroup": { + "key": "Channel.DiscussionGroup.PrivateGroup", + "value": "private group" + }, + "Channel.DiscussionGroup.PublicChannelLink": { + "key": "Channel.DiscussionGroup.PublicChannelLink", + "value": "Make %1$@ the discussion group for %2$@?" + }, + "Channel.DiscussionGroup.SearchPlaceholder": { + "key": "Channel.DiscussionGroup.SearchPlaceholder", + "value": "Search" + }, + "Channel.DiscussionGroup.UnlinkChannel": { + "key": "Channel.DiscussionGroup.UnlinkChannel", + "value": "Unlink Channel" + }, + "Channel.DiscussionGroup.UnlinkGroup": { + "key": "Channel.DiscussionGroup.UnlinkGroup", + "value": "Unlink Group" + }, + "Channel.DiscussionGroupAdd": { + "key": "Channel.DiscussionGroupAdd", + "value": "Add" + }, + "Channel.DiscussionGroupInfo": { + "key": "Channel.DiscussionGroupInfo", + "value": "Add a group chat for comments." + }, + "Channel.DiscussionMessageUnavailable": { + "key": "Channel.DiscussionMessageUnavailable", + "value": "Sorry, this post has been removed from the discussion group." + }, + "Channel.Edit.AboutItem": { + "key": "Channel.Edit.AboutItem", + "value": "Description" + }, + "Channel.Edit.LinkItem": { + "key": "Channel.Edit.LinkItem", + "value": "Link" + }, + "Channel.Edit.PrivatePublicLinkAlert": { + "key": "Channel.Edit.PrivatePublicLinkAlert", + "value": "Please note that if you choose a public link for your channel, anyone will be able to find it in search and join.\n\nDo not create this link if you want your channel to stay private." + }, + "Channel.EditAdmin.CannotEdit": { + "key": "Channel.EditAdmin.CannotEdit", + "value": "You cannot edit the rights of this admin." + }, + "Channel.EditAdmin.PermissinAddAdminOff": { + "key": "Channel.EditAdmin.PermissinAddAdminOff", + "value": "This admin will not be able to add new admins." + }, + "Channel.EditAdmin.PermissinAddAdminOn": { + "key": "Channel.EditAdmin.PermissinAddAdminOn", + "value": "This admin will be able to add new admins with the same (or more limited) permissions." + }, + "Channel.EditAdmin.PermissionAddAdmins": { + "key": "Channel.EditAdmin.PermissionAddAdmins", + "value": "Add New Admins" + }, + "Channel.EditAdmin.PermissionBanUsers": { + "key": "Channel.EditAdmin.PermissionBanUsers", + "value": "Ban Users" + }, + "Channel.EditAdmin.PermissionChangeInfo": { + "key": "Channel.EditAdmin.PermissionChangeInfo", + "value": "Change Channel Info" + }, + "Channel.EditAdmin.PermissionDeleteMessages": { + "key": "Channel.EditAdmin.PermissionDeleteMessages", + "value": "Delete Messages" + }, + "Channel.EditAdmin.PermissionDeleteMessagesOfOthers": { + "key": "Channel.EditAdmin.PermissionDeleteMessagesOfOthers", + "value": "Delete Messages of Others" + }, + "Channel.EditAdmin.PermissionEditMessages": { + "key": "Channel.EditAdmin.PermissionEditMessages", + "value": "Edit Messages of Others" + }, + "Channel.EditAdmin.PermissionEnabledByDefault": { + "key": "Channel.EditAdmin.PermissionEnabledByDefault", + "value": "This option is permitted for all members in Group Permissions." + }, + "Channel.EditAdmin.PermissionInviteMembers": { + "key": "Channel.EditAdmin.PermissionInviteMembers", + "value": "Add Members" + }, + "Channel.EditAdmin.PermissionInviteSubscribers": { + "key": "Channel.EditAdmin.PermissionInviteSubscribers", + "value": "Add Subscribers" + }, + "Channel.EditAdmin.PermissionInviteUsers": { + "key": "Channel.EditAdmin.PermissionInviteUsers", + "value": "Add Users" + }, + "Channel.EditAdmin.PermissionInviteViaLink": { + "key": "Channel.EditAdmin.PermissionInviteViaLink", + "value": "Invite Users via Link" + }, + "Channel.EditAdmin.PermissionPinMessages": { + "key": "Channel.EditAdmin.PermissionPinMessages", + "value": "Pin Messages" + }, + "Channel.EditAdmin.PermissionPostMessages": { + "key": "Channel.EditAdmin.PermissionPostMessages", + "value": "Post Messages" + }, + "Channel.EditAdmin.PermissionsHeader": { + "key": "Channel.EditAdmin.PermissionsHeader", + "value": "WHAT CAN THIS ADMIN DO?" + }, + "Channel.EditAdmin.TransferOwnership": { + "key": "Channel.EditAdmin.TransferOwnership", + "value": "Transfer Channel Ownership" + }, + "Channel.EditMessageErrorGeneric": { + "key": "Channel.EditMessageErrorGeneric", + "value": "Sorry, you can't edit this message." + }, + "Channel.ErrorAccessDenied": { + "key": "Channel.ErrorAccessDenied", + "value": "Sorry, this channel is private." + }, + "Channel.ErrorAddBlocked": { + "key": "Channel.ErrorAddBlocked", + "value": "Sorry, you can't add this user to channels because of user's privacy settings." + }, + "Channel.ErrorAddTooMuch": { + "key": "Channel.ErrorAddTooMuch", + "value": "Sorry, you can only add the first 200 subscribers to a channel. Note that an unlimited number of people may join via the channel's link." + }, + "Channel.ErrorAdminsTooMuch": { + "key": "Channel.ErrorAdminsTooMuch", + "value": "Sorry, too many administrators in this channel." + }, + "Channel.Info.Banned": { + "key": "Channel.Info.Banned", + "value": "Banned" + }, + "Channel.Info.BlackList": { + "key": "Channel.Info.BlackList", + "value": "Removed Users" + }, + "Channel.Info.Description": { + "key": "Channel.Info.Description", + "value": "description" + }, + "Channel.Info.Management": { + "key": "Channel.Info.Management", + "value": "Admins" + }, + "Channel.Info.Members": { + "key": "Channel.Info.Members", + "value": "Members" + }, + "Channel.Info.Stickers": { + "key": "Channel.Info.Stickers", + "value": "Group Sticker Set" + }, + "Channel.Info.Subscribers": { + "key": "Channel.Info.Subscribers", + "value": "Subscribers" + }, + "Channel.JoinChannel": { + "key": "Channel.JoinChannel", + "value": "Join" + }, + "Channel.LeaveChannel": { + "key": "Channel.LeaveChannel", + "value": "Leave Channel" + }, + "Channel.LinkItem": { + "key": "Channel.LinkItem", + "value": "share link" + }, + "Channel.Management.AddModerator": { + "key": "Channel.Management.AddModerator", + "value": "Add Admin" + }, + "Channel.Management.AddModeratorHelp": { + "key": "Channel.Management.AddModeratorHelp", + "value": "You can add admins to help you manage your channel." + }, + "Channel.Management.LabelAdministrator": { + "key": "Channel.Management.LabelAdministrator", + "value": "admin" + }, + "Channel.Management.LabelCreator": { + "key": "Channel.Management.LabelCreator", + "value": "Creator" + }, + "Channel.Management.LabelEditor": { + "key": "Channel.Management.LabelEditor", + "value": "admin" + }, + "Channel.Management.LabelOwner": { + "key": "Channel.Management.LabelOwner", + "value": "owner" + }, + "Channel.Management.PromotedBy": { + "key": "Channel.Management.PromotedBy", + "value": "Promoted by %@" + }, + "Channel.Management.RemovedBy": { + "key": "Channel.Management.RemovedBy", + "value": "Removed by %@" + }, + "Channel.Management.RestrictedBy": { + "key": "Channel.Management.RestrictedBy", + "value": "restricted by %@" + }, + "Channel.Management.Title": { + "key": "Channel.Management.Title", + "value": "Admins" + }, + "Channel.Members.AddAdminErrorBlacklisted": { + "key": "Channel.Members.AddAdminErrorBlacklisted", + "value": "Sorry, you can't add this user as an admin because they are in the Removed Users list and you can't unban them." + }, + "Channel.Members.AddAdminErrorNotAMember": { + "key": "Channel.Members.AddAdminErrorNotAMember", + "value": "Sorry, you can't add this user as an admin because they are not a member of this group and you are not allowed to add them." + }, + "Channel.Members.AddBannedErrorAdmin": { + "key": "Channel.Members.AddBannedErrorAdmin", + "value": "Sorry, you can't ban this user because they are an admin in this group and you are not allowed to demote them." + }, + "Channel.Members.AddMembers": { + "key": "Channel.Members.AddMembers", + "value": "Add Subscribers" + }, + "Channel.Members.AddMembersHelp": { + "key": "Channel.Members.AddMembersHelp", + "value": "Only channel admins can see this list." + }, + "Channel.Members.InviteLink": { + "key": "Channel.Members.InviteLink", + "value": "Invite via Link" + }, + "Channel.Members.Title": { + "key": "Channel.Members.Title", + "value": "Members" + }, + "Channel.MessagePhotoRemoved": { + "key": "Channel.MessagePhotoRemoved", + "value": "Channel photo removed" + }, + "Channel.MessagePhotoUpdated": { + "key": "Channel.MessagePhotoUpdated", + "value": "Channel photo updated" + }, + "Channel.MessageTitleUpdated": { + "key": "Channel.MessageTitleUpdated", + "value": "Channel renamed to \"%@\"" + }, + "Channel.MessageVideoUpdated": { + "key": "Channel.MessageVideoUpdated", + "value": "Channel video updated" + }, + "Channel.Moderator.AccessLevelRevoke": { + "key": "Channel.Moderator.AccessLevelRevoke", + "value": "Dismiss Admin" + }, + "Channel.Moderator.Title": { + "key": "Channel.Moderator.Title", + "value": "Admin" + }, + "Channel.NotificationLoading": { + "key": "Channel.NotificationLoading", + "value": "Loading..." + }, + "Channel.OwnershipTransfer.ChangeOwner": { + "key": "Channel.OwnershipTransfer.ChangeOwner", + "value": "Change Owner" + }, + "Channel.OwnershipTransfer.DescriptionInfo": { + "key": "Channel.OwnershipTransfer.DescriptionInfo", + "value": "This will transfer the full **owner rights** for **%1$@** to **%2$@**.\n\nYou will no longer be considered the creator of the channel. The new owner will be free to remove any of your admin privileges or even ban you." + }, + "Channel.OwnershipTransfer.EnterPassword": { + "key": "Channel.OwnershipTransfer.EnterPassword", + "value": "Enter Password" + }, + "Channel.OwnershipTransfer.EnterPasswordText": { + "key": "Channel.OwnershipTransfer.EnterPasswordText", + "value": "Please enter your 2-Step Verification password to complete the transfer." + }, + "Channel.OwnershipTransfer.ErrorAdminsTooMuch": { + "key": "Channel.OwnershipTransfer.ErrorAdminsTooMuch", + "value": "Sorry, this channel has too many admins and the new owner can't be added. Please remove one of the existing admins first." + }, + "Channel.OwnershipTransfer.ErrorPrivacyRestricted": { + "key": "Channel.OwnershipTransfer.ErrorPrivacyRestricted", + "value": "Sorry, this user is not a member of this channel and their privacy settings prevent you from adding them manually." + }, + "Channel.OwnershipTransfer.ErrorPublicChannelsTooMuch": { + "key": "Channel.OwnershipTransfer.ErrorPublicChannelsTooMuch", + "value": "Sorry, the target user has too many public groups or channels already. Please ask them to make one of their existing groups or channels private first." + }, + "Channel.OwnershipTransfer.PasswordPlaceholder": { + "key": "Channel.OwnershipTransfer.PasswordPlaceholder", + "value": "Password" + }, + "Channel.OwnershipTransfer.Title": { + "key": "Channel.OwnershipTransfer.Title", + "value": "Transfer Channel Ownership" + }, + "Channel.OwnershipTransfer.TransferCompleted": { + "key": "Channel.OwnershipTransfer.TransferCompleted", + "value": "**%1$@** is now the owner of **%2$@**" + }, + "Channel.Setup.LinkTypePrivate": { + "key": "Channel.Setup.LinkTypePrivate", + "value": "Private" + }, + "Channel.Setup.LinkTypePublic": { + "key": "Channel.Setup.LinkTypePublic", + "value": "Public" + }, + "Channel.Setup.PublicNoLink": { + "key": "Channel.Setup.PublicNoLink", + "value": "Please choose a link for your public channel, so that people can find it in search and share with others.\n\nIf you're not interested, we suggest creating a private channel instead." + }, + "Channel.Setup.Title": { + "key": "Channel.Setup.Title", + "value": "Channel" + }, + "Channel.Setup.TypeHeader": { + "key": "Channel.Setup.TypeHeader", + "value": "CHANNEL TYPE" + }, + "Channel.Setup.TypePrivate": { + "key": "Channel.Setup.TypePrivate", + "value": "Private" + }, + "Channel.Setup.TypePrivateHelp": { + "key": "Channel.Setup.TypePrivateHelp", + "value": "Private channels can only be joined via an invite link." + }, + "Channel.Setup.TypePublic": { + "key": "Channel.Setup.TypePublic", + "value": "Public" + }, + "Channel.Setup.TypePublicHelp": { + "key": "Channel.Setup.TypePublicHelp", + "value": "Public channels can be found in search, anyone can join them." + }, + "Channel.SignMessages": { + "key": "Channel.SignMessages", + "value": "Sign Messages" + }, + "Channel.SignMessages.Help": { + "key": "Channel.SignMessages.Help", + "value": "Add names of the admins to the messages they post." + }, + "Channel.Status": { + "key": "Channel.Status", + "value": "channel" + }, + "Channel.Stickers.CreateYourOwn": { + "key": "Channel.Stickers.CreateYourOwn", + "value": "You can create your own custom sticker set using the @stickers bot." + }, + "Channel.Stickers.NotFound": { + "key": "Channel.Stickers.NotFound", + "value": "No such sticker set found" + }, + "Channel.Stickers.NotFoundHelp": { + "key": "Channel.Stickers.NotFoundHelp", + "value": "Try again or choose from the list below" + }, + "Channel.Stickers.Placeholder": { + "key": "Channel.Stickers.Placeholder", + "value": "stickerset" + }, + "Channel.Stickers.Searching": { + "key": "Channel.Stickers.Searching", + "value": "Searching..." + }, + "Channel.Stickers.YourStickers": { + "key": "Channel.Stickers.YourStickers", + "value": "CHOOSE FROM YOUR STICKERS" + }, + "Channel.Subscribers.Title": { + "key": "Channel.Subscribers.Title", + "value": "Subscribers" + }, + "Channel.TitleInfo": { + "key": "Channel.TitleInfo", + "value": "Channel Info" + }, + "Channel.TooMuchBots": { + "key": "Channel.TooMuchBots", + "value": "Sorry, there are already too many bots in this group. Please remove some of the bots you're not using first." + }, + "Channel.TypeSetup.Title": { + "key": "Channel.TypeSetup.Title", + "value": "Channel Type" + }, + "Channel.UpdatePhotoItem": { + "key": "Channel.UpdatePhotoItem", + "value": "Set Channel Photo" + }, + "Channel.Username.CheckingUsername": { + "key": "Channel.Username.CheckingUsername", + "value": "Checking name..." + }, + "Channel.Username.CreatePrivateLinkHelp": { + "key": "Channel.Username.CreatePrivateLinkHelp", + "value": "People can join your channel by following this link. You can revoke the link at any time." + }, + "Channel.Username.CreatePublicLinkHelp": { + "key": "Channel.Username.CreatePublicLinkHelp", + "value": "People can share this link with others and find your channel using Telegram search." + }, + "Channel.Username.Help": { + "key": "Channel.Username.Help", + "value": "You can choose a channel name on **Telegram**. If you do, other people will be able to find your channel by this name.\n\nYou can use **a-z**, **0-9** and underscores. Minimum length is **5** characters." + }, + "Channel.Username.InvalidCharacters": { + "key": "Channel.Username.InvalidCharacters", + "value": "Sorry, this name is invalid." + }, + "Channel.Username.InvalidStartsWithNumber": { + "key": "Channel.Username.InvalidStartsWithNumber", + "value": "Channel names can't start with a number." + }, + "Channel.Username.InvalidTaken": { + "key": "Channel.Username.InvalidTaken", + "value": "Sorry, this name is already taken." + }, + "Channel.Username.InvalidTooShort": { + "key": "Channel.Username.InvalidTooShort", + "value": "Channel names must have at least 5 characters." + }, + "Channel.Username.LinkHint": { + "key": "Channel.Username.LinkHint", + "value": "This link opens your channel:[\nhttps://t.me/%@]" + }, + "Channel.Username.RevokeExistingUsernamesInfo": { + "key": "Channel.Username.RevokeExistingUsernamesInfo", + "value": "You can revoke the link from one of your older groups or channels, or create a private channel instead." + }, + "Channel.Username.Title": { + "key": "Channel.Username.Title", + "value": "Link" + }, + "Channel.Username.UsernameIsAvailable": { + "key": "Channel.Username.UsernameIsAvailable", + "value": "%@ is available." + }, + "ChannelInfo.AddParticipantConfirmation": { + "key": "ChannelInfo.AddParticipantConfirmation", + "value": "Add %@ to the channel?" + }, + "ChannelInfo.ChannelForbidden": { + "key": "ChannelInfo.ChannelForbidden", + "value": "Sorry, the channel \"%@\" is no longer accessible." + }, + "ChannelInfo.ConfirmLeave": { + "key": "ChannelInfo.ConfirmLeave", + "value": "Leave Channel" + }, + "ChannelInfo.CreateVoiceChat": { + "key": "ChannelInfo.CreateVoiceChat", + "value": "Start Voice Chat" + }, + "ChannelInfo.DeleteChannel": { + "key": "ChannelInfo.DeleteChannel", + "value": "Delete Channel" + }, + "ChannelInfo.DeleteChannelConfirmation": { + "key": "ChannelInfo.DeleteChannelConfirmation", + "value": "Wait! Deleting this channel will remove all subscribers and all messages will be lost. Delete the channel anyway?" + }, + "ChannelInfo.DeleteGroup": { + "key": "ChannelInfo.DeleteGroup", + "value": "Delete Group" + }, + "ChannelInfo.DeleteGroupConfirmation": { + "key": "ChannelInfo.DeleteGroupConfirmation", + "value": "Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?" + }, + "ChannelInfo.FakeChannelWarning": { + "key": "ChannelInfo.FakeChannelWarning", + "value": "⚠️ Warning: Many users reported that this account impersonates a famous person or organization." + }, + "ChannelInfo.InviteLink.RevokeAlert.Text": { + "key": "ChannelInfo.InviteLink.RevokeAlert.Text", + "value": "Are you sure you want to revoke this link? Once you do, no one will be able to join the channel using it." + }, + "ChannelInfo.ScamChannelWarning": { + "key": "ChannelInfo.ScamChannelWarning", + "value": "⚠️ Warning: Many users reported this channel as a scam or a fake account. Please be careful, especially if it asks you for money." + }, + "ChannelInfo.Stats": { + "key": "ChannelInfo.Stats", + "value": "Statistics" + }, + "ChannelIntro.CreateChannel": { + "key": "ChannelIntro.CreateChannel", + "value": "Create Channel" + }, + "ChannelIntro.Text": { + "key": "ChannelIntro.Text", + "value": "Channels are a one-to-many tool\nfor broadcasting your messages\nto unlimited audiences." + }, + "ChannelIntro.Title": { + "key": "ChannelIntro.Title", + "value": "What is a Channel?" + }, + "ChannelMembers.ChannelAdminsTitle": { + "key": "ChannelMembers.ChannelAdminsTitle", + "value": "CHANNEL ADMINS" + }, + "ChannelMembers.GroupAdminsTitle": { + "key": "ChannelMembers.GroupAdminsTitle", + "value": "GROUP ADMINS" + }, + "ChannelMembers.WhoCanAddMembers": { + "key": "ChannelMembers.WhoCanAddMembers", + "value": "Who can add members" + }, + "ChannelMembers.WhoCanAddMembers.Admins": { + "key": "ChannelMembers.WhoCanAddMembers.Admins", + "value": "Only Admins" + }, + "ChannelMembers.WhoCanAddMembers.AllMembers": { + "key": "ChannelMembers.WhoCanAddMembers.AllMembers", + "value": "All Members" + }, + "ChannelMembers.WhoCanAddMembersAdminsHelp": { + "key": "ChannelMembers.WhoCanAddMembersAdminsHelp", + "value": "Only admins can add new members." + }, + "ChannelMembers.WhoCanAddMembersAllHelp": { + "key": "ChannelMembers.WhoCanAddMembersAllHelp", + "value": "Everybody can add new members." + }, + "ChannelRemoved.RemoveInfo": { + "key": "ChannelRemoved.RemoveInfo", + "value": "Users removed from the channel by admins cannot rejoin it via invite links." + }, + "Chat.AttachmentLimitExceeded": { + "key": "Chat.AttachmentLimitExceeded", + "value": "Sorry, you can't select more items at once." + }, + "Chat.AttachmentLimitReached": { + "key": "Chat.AttachmentLimitReached", + "value": "You can't select more items." + }, + "Chat.AttachmentMultipleFilesDisabled": { + "key": "Chat.AttachmentMultipleFilesDisabled", + "value": "Slow Mode is enabled. You can't send multiple files at once." + }, + "Chat.AttachmentMultipleForwardDisabled": { + "key": "Chat.AttachmentMultipleForwardDisabled", + "value": "Slow Mode is enabled. You can't forward multiple messages at once." + }, + "Chat.DeleteMessagesConfirmation": { + "key": "Chat.DeleteMessagesConfirmation", + "zeroValue": null, + "oneValue": "Delete message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Delete %@ messages" + }, + "Chat.GenericPsaTooltip": { + "key": "Chat.GenericPsaTooltip", + "value": "This is a public service announcement" + }, + "Chat.Gifs.SavedSectionHeader": { + "key": "Chat.Gifs.SavedSectionHeader", + "value": "MY GIFS" + }, + "Chat.Gifs.TrendingSectionHeader": { + "key": "Chat.Gifs.TrendingSectionHeader", + "value": "TRENDING GIFS" + }, + "Chat.MessagesUnpinned": { + "key": "Chat.MessagesUnpinned", + "zeroValue": null, + "oneValue": "Message Unpinned", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Messages Unpinned" + }, + "Chat.MultipleTextMessagesDisabled": { + "key": "Chat.MultipleTextMessagesDisabled", + "value": "Slow Mode is enabled. You can't send multiple messages at once." + }, + "Chat.PanelHidePinnedMessages": { + "key": "Chat.PanelHidePinnedMessages", + "value": "Don't Show Pinned Messages" + }, + "Chat.PanelUnpinAllMessages": { + "key": "Chat.PanelUnpinAllMessages", + "value": "Unpin All Messages" + }, + "Chat.PinnedListPreview.HidePinnedMessages": { + "key": "Chat.PinnedListPreview.HidePinnedMessages", + "value": "Hide Pinned Messages" + }, + "Chat.PinnedListPreview.ShowAllMessages": { + "key": "Chat.PinnedListPreview.ShowAllMessages", + "value": "Show All Messages" + }, + "Chat.PinnedListPreview.UnpinAllMessages": { + "key": "Chat.PinnedListPreview.UnpinAllMessages", + "value": "Unpin All Messages" + }, + "Chat.PinnedMessagesHiddenText": { + "key": "Chat.PinnedMessagesHiddenText", + "value": "Pinned messages will be shown again if a new message is pinned." + }, + "Chat.PinnedMessagesHiddenTitle": { + "key": "Chat.PinnedMessagesHiddenTitle", + "value": "Pinned Messages Hidden" + }, + "Chat.PsaTooltip.covid": { + "key": "Chat.PsaTooltip.covid", + "value": "This message provides you with a public service announcement in relation to the ongoing COVID-19 pandemic. Learn more about this initiative at https://telegram.org/blog/coronavirus" + }, + "Chat.SlowmodeAttachmentLimitReached": { + "key": "Chat.SlowmodeAttachmentLimitReached", + "value": "Slow Mode is enabled. You can't select more items." + }, + "Chat.SlowmodeSendError": { + "key": "Chat.SlowmodeSendError", + "value": "Slow Mode is enabled." + }, + "Chat.SlowmodeTooltip": { + "key": "Chat.SlowmodeTooltip", + "value": "Slow Mode is enabled. You can send\nyour next message in %@." + }, + "Chat.SlowmodeTooltipPending": { + "key": "Chat.SlowmodeTooltipPending", + "value": "Slow Mode is enabled. You can't send more than one message at once." + }, + "Chat.TitlePinnedMessages": { + "key": "Chat.TitlePinnedMessages", + "zeroValue": null, + "oneValue": "Pinned Message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Pinned Messages" + }, + "Chat.UnsendMyMessages": { + "key": "Chat.UnsendMyMessages", + "value": "Unsend My Messages" + }, + "Chat.UnsendMyMessagesAlertTitle": { + "key": "Chat.UnsendMyMessagesAlertTitle", + "value": "Unsending will also delete messages you sent on %@'s side." + }, + "ChatAdmins.AdminLabel": { + "key": "ChatAdmins.AdminLabel", + "value": "admin" + }, + "ChatAdmins.AllMembersAreAdmins": { + "key": "ChatAdmins.AllMembersAreAdmins", + "value": "All Members Are Admins" + }, + "ChatAdmins.AllMembersAreAdminsOffHelp": { + "key": "ChatAdmins.AllMembersAreAdminsOffHelp", + "value": "Only admins can add and remove members, edit name and photo of the group." + }, + "ChatAdmins.AllMembersAreAdminsOnHelp": { + "key": "ChatAdmins.AllMembersAreAdminsOnHelp", + "value": "All members can add new members, edit name and photo of the group." + }, + "ChatAdmins.Title": { + "key": "ChatAdmins.Title", + "value": "Chat Admins" + }, + "ChatContextMenu.TextSelectionTip": { + "key": "ChatContextMenu.TextSelectionTip", + "value": "Hold a word, then move cursor to select more| text to copy." + }, + "ChatImport.CreateGroupAlertImportAction": { + "key": "ChatImport.CreateGroupAlertImportAction", + "value": "Create and Import" + }, + "ChatImport.CreateGroupAlertText": { + "key": "ChatImport.CreateGroupAlertText", + "value": "Do you want to create the group **%@** and import messages from another messaging app?" + }, + "ChatImport.CreateGroupAlertTitle": { + "key": "ChatImport.CreateGroupAlertTitle", + "value": "Create Group and Import Messages" + }, + "ChatImport.SelectionConfirmationAlertImportAction": { + "key": "ChatImport.SelectionConfirmationAlertImportAction", + "value": "Import" + }, + "ChatImport.SelectionConfirmationAlertTitle": { + "key": "ChatImport.SelectionConfirmationAlertTitle", + "value": "Import Messages" + }, + "ChatImport.SelectionConfirmationGroupWithTitle": { + "key": "ChatImport.SelectionConfirmationGroupWithTitle", + "value": "Do you want to import messages from **%1$@** into **%2$@**?\n\nMessages will be imported into the current day but will also include their original timestamps. All members will see the messages." + }, + "ChatImport.SelectionConfirmationGroupWithoutTitle": { + "key": "ChatImport.SelectionConfirmationGroupWithoutTitle", + "value": "Do you want to import messages into **%@**?\n\nMessages will be imported into the current day but will also include their original timestamps. All members will see the messages." + }, + "ChatImport.SelectionConfirmationUserWithTitle": { + "key": "ChatImport.SelectionConfirmationUserWithTitle", + "value": "Do you want to import messages from **%1$@** into the chat with **%2$@**?\n\nMessages will be imported into the current day but will also include their original timestamps. Both sides will see the messages." + }, + "ChatImport.SelectionConfirmationUserWithoutTitle": { + "key": "ChatImport.SelectionConfirmationUserWithoutTitle", + "value": "Do you want to import messages into the chat with **%@?**\n\nMessages will be imported into the current day but will also include their original timestamps. Both sides will see the messages." + }, + "ChatImport.SelectionErrorGroupGeneric": { + "key": "ChatImport.SelectionErrorGroupGeneric", + "value": "Sorry, you can't import history to this group." + }, + "ChatImport.SelectionErrorNotAdmin": { + "key": "ChatImport.SelectionErrorNotAdmin", + "value": "You must to be an admin in the group to import messages to it." + }, + "ChatImport.Title": { + "key": "ChatImport.Title", + "value": "Select Chat" + }, + "ChatImport.UserErrorNotMutual": { + "key": "ChatImport.UserErrorNotMutual", + "value": "You can only import messages into private chats with users who are mutual contacts." + }, + "ChatImportActivity.ErrorGeneric": { + "key": "ChatImportActivity.ErrorGeneric", + "value": "An error occurred." + }, + "ChatImportActivity.ErrorInvalidChatType": { + "key": "ChatImportActivity.ErrorInvalidChatType", + "value": "Wrong type of chat for the messages you are trying to import." + }, + "ChatImportActivity.ErrorLimitExceeded": { + "key": "ChatImportActivity.ErrorLimitExceeded", + "value": "Daily maximum reached,\nplease come back tomorrow." + }, + "ChatImportActivity.ErrorNotAdmin": { + "key": "ChatImportActivity.ErrorNotAdmin", + "value": "You need to be an admin in the group to import messages." + }, + "ChatImportActivity.ErrorUserBlocked": { + "key": "ChatImportActivity.ErrorUserBlocked", + "value": "Unable to import messages due to privacy settings." + }, + "ChatImportActivity.InProgress": { + "key": "ChatImportActivity.InProgress", + "value": "Please keep this window open\nuntil the import is completed." + }, + "ChatImportActivity.OpenApp": { + "key": "ChatImportActivity.OpenApp", + "value": "Open Telegram" + }, + "ChatImportActivity.Retry": { + "key": "ChatImportActivity.Retry", + "value": "Retry" + }, + "ChatImportActivity.Success": { + "key": "ChatImportActivity.Success", + "value": "Chat imported\nsuccessfully." + }, + "ChatImportActivity.Title": { + "key": "ChatImportActivity.Title", + "value": "Importing Chat" + }, + "ChatList.AddChatsToFolder": { + "key": "ChatList.AddChatsToFolder", + "value": "Add Chats" + }, + "ChatList.AddFolder": { + "key": "ChatList.AddFolder", + "value": "Add Folder" + }, + "ChatList.AddedToFolderTooltip": { + "key": "ChatList.AddedToFolderTooltip", + "value": "%1$@ has been added to %2$@" + }, + "ChatList.ArchiveAction": { + "key": "ChatList.ArchiveAction", + "value": "Archive" + }, + "ChatList.ArchivedChatsTitle": { + "key": "ChatList.ArchivedChatsTitle", + "value": "Archived Chats" + }, + "ChatList.AutoarchiveSuggestion.OpenSettings": { + "key": "ChatList.AutoarchiveSuggestion.OpenSettings", + "value": "Go to Settings" + }, + "ChatList.AutoarchiveSuggestion.Text": { + "key": "ChatList.AutoarchiveSuggestion.Text", + "value": "You are receiving many new chats from users who are not in your Contact List. Do you want to have such chats **automatically muted** and **archived**?" + }, + "ChatList.AutoarchiveSuggestion.Title": { + "key": "ChatList.AutoarchiveSuggestion.Title", + "value": "Hide new chats?" + }, + "ChatList.ChatTypesSection": { + "key": "ChatList.ChatTypesSection", + "value": "CHAT TYPES" + }, + "ChatList.ClearChatConfirmation": { + "key": "ChatList.ClearChatConfirmation", + "value": "Are you sure you want to delete all\nmessages in the chat with %@?" + }, + "ChatList.Context.AddToContacts": { + "key": "ChatList.Context.AddToContacts", + "value": "Add to Contacts" + }, + "ChatList.Context.AddToFolder": { + "key": "ChatList.Context.AddToFolder", + "value": "Add to Folder" + }, + "ChatList.Context.Archive": { + "key": "ChatList.Context.Archive", + "value": "Archive" + }, + "ChatList.Context.Back": { + "key": "ChatList.Context.Back", + "value": "Back" + }, + "ChatList.Context.Delete": { + "key": "ChatList.Context.Delete", + "value": "Delete" + }, + "ChatList.Context.HideArchive": { + "key": "ChatList.Context.HideArchive", + "value": "Hide Above the List" + }, + "ChatList.Context.JoinChannel": { + "key": "ChatList.Context.JoinChannel", + "value": "Join Channel" + }, + "ChatList.Context.MarkAllAsRead": { + "key": "ChatList.Context.MarkAllAsRead", + "value": "Mark All as Read" + }, + "ChatList.Context.MarkAsRead": { + "key": "ChatList.Context.MarkAsRead", + "value": "Mark as Read" + }, + "ChatList.Context.MarkAsUnread": { + "key": "ChatList.Context.MarkAsUnread", + "value": "Mark as Unread" + }, + "ChatList.Context.Mute": { + "key": "ChatList.Context.Mute", + "value": "Mute" + }, + "ChatList.Context.Pin": { + "key": "ChatList.Context.Pin", + "value": "Pin" + }, + "ChatList.Context.RemoveFromFolder": { + "key": "ChatList.Context.RemoveFromFolder", + "value": "Remove from Folder" + }, + "ChatList.Context.RemoveFromRecents": { + "key": "ChatList.Context.RemoveFromRecents", + "value": "Remove from Recent" + }, + "ChatList.Context.Unarchive": { + "key": "ChatList.Context.Unarchive", + "value": "Unarchive" + }, + "ChatList.Context.UnhideArchive": { + "key": "ChatList.Context.UnhideArchive", + "value": "Pin in the list" + }, + "ChatList.Context.Unmute": { + "key": "ChatList.Context.Unmute", + "value": "Unmute" + }, + "ChatList.Context.Unpin": { + "key": "ChatList.Context.Unpin", + "value": "Unpin" + }, + "ChatList.DeleteAndLeaveGroupConfirmation": { + "key": "ChatList.DeleteAndLeaveGroupConfirmation", + "value": "Are you sure you want to leave and delete %@?" + }, + "ChatList.DeleteChat": { + "key": "ChatList.DeleteChat", + "value": "Delete Chat" + }, + "ChatList.DeleteChatConfirmation": { + "key": "ChatList.DeleteChatConfirmation", + "value": "Are you sure you want to delete the chat\nwith %@?" + }, + "ChatList.DeleteConfirmation": { + "key": "ChatList.DeleteConfirmation", + "zeroValue": null, + "oneValue": "Delete", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Delete %@ Chats" + }, + "ChatList.DeleteForAllMembers": { + "key": "ChatList.DeleteForAllMembers", + "value": "Delete for all members" + }, + "ChatList.DeleteForAllMembersConfirmationText": { + "key": "ChatList.DeleteForAllMembersConfirmationText", + "value": "This will **delete all messages** in this chat for **all participants**." + }, + "ChatList.DeleteForAllSubscribers": { + "key": "ChatList.DeleteForAllSubscribers", + "value": "Delete for all subscribers" + }, + "ChatList.DeleteForAllSubscribersConfirmationText": { + "key": "ChatList.DeleteForAllSubscribersConfirmationText", + "value": "This will **delete all messages** in this channel for **all subscribers**." + }, + "ChatList.DeleteForCurrentUser": { + "key": "ChatList.DeleteForCurrentUser", + "value": "Delete just for me" + }, + "ChatList.DeleteForEveryone": { + "key": "ChatList.DeleteForEveryone", + "value": "Delete for me and %@" + }, + "ChatList.DeleteForEveryoneConfirmationAction": { + "key": "ChatList.DeleteForEveryoneConfirmationAction", + "value": "Delete All" + }, + "ChatList.DeleteForEveryoneConfirmationText": { + "key": "ChatList.DeleteForEveryoneConfirmationText", + "value": "This will **delete all messages** in this chat for **both participants**." + }, + "ChatList.DeleteForEveryoneConfirmationTitle": { + "key": "ChatList.DeleteForEveryoneConfirmationTitle", + "value": "Warning!" + }, + "ChatList.DeleteSavedMessagesConfirmation": { + "key": "ChatList.DeleteSavedMessagesConfirmation", + "value": "Are you sure you want to delete\nSaved Messages?" + }, + "ChatList.DeleteSavedMessagesConfirmationAction": { + "key": "ChatList.DeleteSavedMessagesConfirmationAction", + "value": "Delete All" + }, + "ChatList.DeleteSavedMessagesConfirmationText": { + "key": "ChatList.DeleteSavedMessagesConfirmationText", + "value": "This will **delete all messages** in this chat." + }, + "ChatList.DeleteSavedMessagesConfirmationTitle": { + "key": "ChatList.DeleteSavedMessagesConfirmationTitle", + "value": "Warning!" + }, + "ChatList.DeleteSecretChatConfirmation": { + "key": "ChatList.DeleteSecretChatConfirmation", + "value": "Are you sure you want to delete the secret chat\nwith %@?" + }, + "ChatList.DeletedChats": { + "key": "ChatList.DeletedChats", + "zeroValue": null, + "oneValue": "Deleted 1 chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Deleted %@ chats" + }, + "ChatList.EditFolder": { + "key": "ChatList.EditFolder", + "value": "Edit Folder" + }, + "ChatList.EditFolders": { + "key": "ChatList.EditFolders", + "value": "Edit Folders" + }, + "ChatList.EmptyChatFilterList": { + "key": "ChatList.EmptyChatFilterList", + "value": "This folder is empty." + }, + "ChatList.EmptyChatList": { + "key": "ChatList.EmptyChatList", + "value": "You have no\nconversations yet." + }, + "ChatList.EmptyChatListEditFilter": { + "key": "ChatList.EmptyChatListEditFilter", + "value": "Edit Folder" + }, + "ChatList.EmptyChatListFilterText": { + "key": "ChatList.EmptyChatListFilterText", + "value": "No chats currently belong to this folder." + }, + "ChatList.EmptyChatListFilterTitle": { + "key": "ChatList.EmptyChatListFilterTitle", + "value": "Folder is empty." + }, + "ChatList.EmptyChatListNewMessage": { + "key": "ChatList.EmptyChatListNewMessage", + "value": "New Message" + }, + "ChatList.FolderAllChats": { + "key": "ChatList.FolderAllChats", + "value": "All Chats" + }, + "ChatList.GenericPsaAlert": { + "key": "ChatList.GenericPsaAlert", + "value": "This provides public service announcements in your chat list." + }, + "ChatList.GenericPsaLabel": { + "key": "ChatList.GenericPsaLabel", + "value": "PSA" + }, + "ChatList.HeaderImportIntoAnExistingGroup": { + "key": "ChatList.HeaderImportIntoAnExistingGroup", + "value": "SELECT A CHAT TO IMPORT MESSAGES TO" + }, + "ChatList.HideAction": { + "key": "ChatList.HideAction", + "value": "Hide" + }, + "ChatList.LeaveGroupConfirmation": { + "key": "ChatList.LeaveGroupConfirmation", + "value": "Are you sure you want to leave %@?" + }, + "ChatList.MessageFiles": { + "key": "ChatList.MessageFiles", + "zeroValue": null, + "oneValue": "%@ File", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Files" + }, + "ChatList.MessageMusic": { + "key": "ChatList.MessageMusic", + "zeroValue": null, + "oneValue": "%@ Music File", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Music Files" + }, + "ChatList.MessagePhotos": { + "key": "ChatList.MessagePhotos", + "zeroValue": null, + "oneValue": "1 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Photos" + }, + "ChatList.MessageVideos": { + "key": "ChatList.MessageVideos", + "zeroValue": null, + "oneValue": "1 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Videos" + }, + "ChatList.Mute": { + "key": "ChatList.Mute", + "value": "Mute" + }, + "ChatList.PeerTypeBot": { + "key": "ChatList.PeerTypeBot", + "value": "bot" + }, + "ChatList.PeerTypeChannel": { + "key": "ChatList.PeerTypeChannel", + "value": "channel" + }, + "ChatList.PeerTypeContact": { + "key": "ChatList.PeerTypeContact", + "value": "contact" + }, + "ChatList.PeerTypeGroup": { + "key": "ChatList.PeerTypeGroup", + "value": "group" + }, + "ChatList.PeerTypeNonContact": { + "key": "ChatList.PeerTypeNonContact", + "value": "user" + }, + "ChatList.PsaAlert.covid": { + "key": "ChatList.PsaAlert.covid", + "value": "This message provides you with a public service announcement in relation to the ongoing COVID-19 pandemic. Learn more about this initiative at https://telegram.org/blog/coronavirus" + }, + "ChatList.PsaLabel.covid": { + "key": "ChatList.PsaLabel.covid", + "value": "COVID-19" + }, + "ChatList.Read": { + "key": "ChatList.Read", + "value": "Read" + }, + "ChatList.ReadAll": { + "key": "ChatList.ReadAll", + "value": "Read All" + }, + "ChatList.RemoveFolder": { + "key": "ChatList.RemoveFolder", + "value": "Remove" + }, + "ChatList.RemoveFolderAction": { + "key": "ChatList.RemoveFolderAction", + "value": "Remove" + }, + "ChatList.RemoveFolderConfirmation": { + "key": "ChatList.RemoveFolderConfirmation", + "value": "This will remove the folder, your chats will not be deleted." + }, + "ChatList.RemovedFromFolderTooltip": { + "key": "ChatList.RemovedFromFolderTooltip", + "value": "%1$@ has been removed from %2$@" + }, + "ChatList.ReorderTabs": { + "key": "ChatList.ReorderTabs", + "value": "Reorder Tabs" + }, + "ChatList.Search.FilterChats": { + "key": "ChatList.Search.FilterChats", + "value": "Chats" + }, + "ChatList.Search.FilterFiles": { + "key": "ChatList.Search.FilterFiles", + "value": "Files" + }, + "ChatList.Search.FilterLinks": { + "key": "ChatList.Search.FilterLinks", + "value": "Links" + }, + "ChatList.Search.FilterMedia": { + "key": "ChatList.Search.FilterMedia", + "value": "Media" + }, + "ChatList.Search.FilterMusic": { + "key": "ChatList.Search.FilterMusic", + "value": "Music" + }, + "ChatList.Search.FilterVoice": { + "key": "ChatList.Search.FilterVoice", + "value": "Voice" + }, + "ChatList.Search.NoResults": { + "key": "ChatList.Search.NoResults", + "value": "No Results" + }, + "ChatList.Search.NoResultsDescription": { + "key": "ChatList.Search.NoResultsDescription", + "value": "There were no results.\nTry a new search." + }, + "ChatList.Search.NoResultsFilter": { + "key": "ChatList.Search.NoResultsFilter", + "value": "Nothing Yet" + }, + "ChatList.Search.NoResultsFitlerFiles": { + "key": "ChatList.Search.NoResultsFitlerFiles", + "value": "Files from all your chats will be shown here." + }, + "ChatList.Search.NoResultsFitlerLinks": { + "key": "ChatList.Search.NoResultsFitlerLinks", + "value": "Links from all your chats will be shown here." + }, + "ChatList.Search.NoResultsFitlerMedia": { + "key": "ChatList.Search.NoResultsFitlerMedia", + "value": "Photos and videos from all your chats will be shown here." + }, + "ChatList.Search.NoResultsFitlerMusic": { + "key": "ChatList.Search.NoResultsFitlerMusic", + "value": "Music from all your chats will be shown here." + }, + "ChatList.Search.NoResultsFitlerVoice": { + "key": "ChatList.Search.NoResultsFitlerVoice", + "value": "Voice and video messages from all your chats will be shown here." + }, + "ChatList.Search.NoResultsQueryDescription": { + "key": "ChatList.Search.NoResultsQueryDescription", + "value": "There were no results for \"%@\".\nTry a new search." + }, + "ChatList.Search.ShowLess": { + "key": "ChatList.Search.ShowLess", + "value": "Show less" + }, + "ChatList.Search.ShowMore": { + "key": "ChatList.Search.ShowMore", + "value": "Show more" + }, + "ChatList.SelectedChats": { + "key": "ChatList.SelectedChats", + "zeroValue": null, + "oneValue": "%@ Chat Selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Chats Selected" + }, + "ChatList.TabIconFoldersTooltipEmptyFolders": { + "key": "ChatList.TabIconFoldersTooltipEmptyFolders", + "value": "Hold to organize your chats with folders." + }, + "ChatList.TabIconFoldersTooltipNonEmptyFolders": { + "key": "ChatList.TabIconFoldersTooltipNonEmptyFolders", + "value": "Hold on 'Chats' to edit folders and switch between views." + }, + "ChatList.Tabs.All": { + "key": "ChatList.Tabs.All", + "value": "All" + }, + "ChatList.Tabs.AllChats": { + "key": "ChatList.Tabs.AllChats", + "value": "All Chats" + }, + "ChatList.UnarchiveAction": { + "key": "ChatList.UnarchiveAction", + "value": "Unarchive" + }, + "ChatList.UndoArchiveHiddenText": { + "key": "ChatList.UndoArchiveHiddenText", + "value": "Swipe down to see the archive." + }, + "ChatList.UndoArchiveHiddenTitle": { + "key": "ChatList.UndoArchiveHiddenTitle", + "value": "Archive hidden" + }, + "ChatList.UndoArchiveMultipleTitle": { + "key": "ChatList.UndoArchiveMultipleTitle", + "value": "Chats archived" + }, + "ChatList.UndoArchiveRevealedText": { + "key": "ChatList.UndoArchiveRevealedText", + "value": "Swipe left on the archive to hide it." + }, + "ChatList.UndoArchiveRevealedTitle": { + "key": "ChatList.UndoArchiveRevealedTitle", + "value": "Archive pinned" + }, + "ChatList.UndoArchiveText1": { + "key": "ChatList.UndoArchiveText1", + "value": "Swipe left on the archive to hide it." + }, + "ChatList.UndoArchiveTitle": { + "key": "ChatList.UndoArchiveTitle", + "value": "Chat archived" + }, + "ChatList.UnhideAction": { + "key": "ChatList.UnhideAction", + "value": "Pin" + }, + "ChatList.Unmute": { + "key": "ChatList.Unmute", + "value": "Unmute" + }, + "ChatListFilter.AddChatsTitle": { + "key": "ChatListFilter.AddChatsTitle", + "value": "Add Chats..." + }, + "ChatListFilter.ShowMoreChats": { + "key": "ChatListFilter.ShowMoreChats", + "zeroValue": null, + "oneValue": "Show %@ More Chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More Chats" + }, + "ChatListFolder.AddChats": { + "key": "ChatListFolder.AddChats", + "value": "Add Chats" + }, + "ChatListFolder.CategoryArchived": { + "key": "ChatListFolder.CategoryArchived", + "value": "Archived" + }, + "ChatListFolder.CategoryBots": { + "key": "ChatListFolder.CategoryBots", + "value": "Bots" + }, + "ChatListFolder.CategoryChannels": { + "key": "ChatListFolder.CategoryChannels", + "value": "Channels" + }, + "ChatListFolder.CategoryContacts": { + "key": "ChatListFolder.CategoryContacts", + "value": "Contacts" + }, + "ChatListFolder.CategoryGroups": { + "key": "ChatListFolder.CategoryGroups", + "value": "Groups" + }, + "ChatListFolder.CategoryMuted": { + "key": "ChatListFolder.CategoryMuted", + "value": "Muted" + }, + "ChatListFolder.CategoryNonContacts": { + "key": "ChatListFolder.CategoryNonContacts", + "value": "Non-Contacts" + }, + "ChatListFolder.CategoryRead": { + "key": "ChatListFolder.CategoryRead", + "value": "Read" + }, + "ChatListFolder.DiscardCancel": { + "key": "ChatListFolder.DiscardCancel", + "value": "No" + }, + "ChatListFolder.DiscardConfirmation": { + "key": "ChatListFolder.DiscardConfirmation", + "value": "You have changed this folder. Discard changes?" + }, + "ChatListFolder.DiscardDiscard": { + "key": "ChatListFolder.DiscardDiscard", + "value": "Discard" + }, + "ChatListFolder.ExcludeChatsTitle": { + "key": "ChatListFolder.ExcludeChatsTitle", + "value": "Exclude Chats" + }, + "ChatListFolder.ExcludeSectionInfo": { + "key": "ChatListFolder.ExcludeSectionInfo", + "value": "Choose chats and types of chats that will not appear in this folder." + }, + "ChatListFolder.ExcludedSectionHeader": { + "key": "ChatListFolder.ExcludedSectionHeader", + "value": "EXCLUDED CHATS" + }, + "ChatListFolder.IncludeChatsTitle": { + "key": "ChatListFolder.IncludeChatsTitle", + "value": "Include Chats" + }, + "ChatListFolder.IncludeSectionInfo": { + "key": "ChatListFolder.IncludeSectionInfo", + "value": "Choose chats and types of chats that will appear in this folder." + }, + "ChatListFolder.IncludedSectionHeader": { + "key": "ChatListFolder.IncludedSectionHeader", + "value": "INCLUDED CHATS" + }, + "ChatListFolder.NameBots": { + "key": "ChatListFolder.NameBots", + "value": "Bots" + }, + "ChatListFolder.NameChannels": { + "key": "ChatListFolder.NameChannels", + "value": "Channels" + }, + "ChatListFolder.NameContacts": { + "key": "ChatListFolder.NameContacts", + "value": "Contacts" + }, + "ChatListFolder.NameGroups": { + "key": "ChatListFolder.NameGroups", + "value": "Groups" + }, + "ChatListFolder.NameNonContacts": { + "key": "ChatListFolder.NameNonContacts", + "value": "Non-Contacts" + }, + "ChatListFolder.NameNonMuted": { + "key": "ChatListFolder.NameNonMuted", + "value": "Not Muted" + }, + "ChatListFolder.NamePlaceholder": { + "key": "ChatListFolder.NamePlaceholder", + "value": "Folder Name" + }, + "ChatListFolder.NameSectionHeader": { + "key": "ChatListFolder.NameSectionHeader", + "value": "FOLDER NAME" + }, + "ChatListFolder.NameUnread": { + "key": "ChatListFolder.NameUnread", + "value": "Unread" + }, + "ChatListFolder.TitleCreate": { + "key": "ChatListFolder.TitleCreate", + "value": "New Folder" + }, + "ChatListFolder.TitleEdit": { + "key": "ChatListFolder.TitleEdit", + "value": "Edit Folder" + }, + "ChatListFolderSettings.AddRecommended": { + "key": "ChatListFolderSettings.AddRecommended", + "value": "ADD" + }, + "ChatListFolderSettings.EditFoldersInfo": { + "key": "ChatListFolderSettings.EditFoldersInfo", + "value": "Tap 'Edit' to change the order or delete folders." + }, + "ChatListFolderSettings.FoldersSection": { + "key": "ChatListFolderSettings.FoldersSection", + "value": "FOLDERS" + }, + "ChatListFolderSettings.Info": { + "key": "ChatListFolderSettings.Info", + "value": "Create folders for different groups of chats and quickly switch between them." + }, + "ChatListFolderSettings.NewFolder": { + "key": "ChatListFolderSettings.NewFolder", + "value": "Create New Folder" + }, + "ChatListFolderSettings.RecommendedFoldersSection": { + "key": "ChatListFolderSettings.RecommendedFoldersSection", + "value": "RECOMMENDED FOLDERS" + }, + "ChatListFolderSettings.RecommendedNewFolder": { + "key": "ChatListFolderSettings.RecommendedNewFolder", + "value": "Add Custom Folder" + }, + "ChatListFolderSettings.Title": { + "key": "ChatListFolderSettings.Title", + "value": "Folders" + }, + "ChatSearch.ResultsTooltip": { + "key": "ChatSearch.ResultsTooltip", + "value": "Tap to view as a list." + }, + "ChatSearch.SearchPlaceholder": { + "key": "ChatSearch.SearchPlaceholder", + "value": "Search" + }, + "ChatSettings.Appearance": { + "key": "ChatSettings.Appearance", + "value": "APPEARANCE" + }, + "ChatSettings.AutoDownloadDocuments": { + "key": "ChatSettings.AutoDownloadDocuments", + "value": "Files" + }, + "ChatSettings.AutoDownloadEnabled": { + "key": "ChatSettings.AutoDownloadEnabled", + "value": "Auto-Download Media" + }, + "ChatSettings.AutoDownloadPhotos": { + "key": "ChatSettings.AutoDownloadPhotos", + "value": "Photos" + }, + "ChatSettings.AutoDownloadReset": { + "key": "ChatSettings.AutoDownloadReset", + "value": "Reset Auto-Download Settings" + }, + "ChatSettings.AutoDownloadSettings.Delimeter": { + "key": "ChatSettings.AutoDownloadSettings.Delimeter", + "value": ", " + }, + "ChatSettings.AutoDownloadSettings.OffForAll": { + "key": "ChatSettings.AutoDownloadSettings.OffForAll", + "value": "Disabled" + }, + "ChatSettings.AutoDownloadSettings.TypeFile": { + "key": "ChatSettings.AutoDownloadSettings.TypeFile", + "value": "Files (%@)" + }, + "ChatSettings.AutoDownloadSettings.TypePhoto": { + "key": "ChatSettings.AutoDownloadSettings.TypePhoto", + "value": "Photos" + }, + "ChatSettings.AutoDownloadSettings.TypeVideo": { + "key": "ChatSettings.AutoDownloadSettings.TypeVideo", + "value": "Videos (%@)" + }, + "ChatSettings.AutoDownloadTitle": { + "key": "ChatSettings.AutoDownloadTitle", + "value": "AUTOMATIC MEDIA DOWNLOAD" + }, + "ChatSettings.AutoDownloadUsingCellular": { + "key": "ChatSettings.AutoDownloadUsingCellular", + "value": "Using Cellular" + }, + "ChatSettings.AutoDownloadUsingWiFi": { + "key": "ChatSettings.AutoDownloadUsingWiFi", + "value": "Using Wi-Fi" + }, + "ChatSettings.AutoDownloadVideoMessages": { + "key": "ChatSettings.AutoDownloadVideoMessages", + "value": "Video Messages" + }, + "ChatSettings.AutoDownloadVideos": { + "key": "ChatSettings.AutoDownloadVideos", + "value": "Videos" + }, + "ChatSettings.AutoDownloadVoiceMessages": { + "key": "ChatSettings.AutoDownloadVoiceMessages", + "value": "Voice Messages" + }, + "ChatSettings.AutoPlayAnimations": { + "key": "ChatSettings.AutoPlayAnimations", + "value": "Autoplay GIFs" + }, + "ChatSettings.AutoPlayGifs": { + "key": "ChatSettings.AutoPlayGifs", + "value": "GIFs" + }, + "ChatSettings.AutoPlayTitle": { + "key": "ChatSettings.AutoPlayTitle", + "value": "AUTO-PLAY MEDIA" + }, + "ChatSettings.AutoPlayVideos": { + "key": "ChatSettings.AutoPlayVideos", + "value": "Videos" + }, + "ChatSettings.AutomaticAudioDownload": { + "key": "ChatSettings.AutomaticAudioDownload", + "value": "AUTOMATIC AUDIO DOWNLOAD" + }, + "ChatSettings.AutomaticPhotoDownload": { + "key": "ChatSettings.AutomaticPhotoDownload", + "value": "AUTOMATIC PHOTO DOWNLOAD" + }, + "ChatSettings.AutomaticVideoMessageDownload": { + "key": "ChatSettings.AutomaticVideoMessageDownload", + "value": "AUTOMATIC VIDEO MESSAGE DOWNLOAD" + }, + "ChatSettings.Cache": { + "key": "ChatSettings.Cache", + "value": "Storage Usage" + }, + "ChatSettings.ConnectionType.Title": { + "key": "ChatSettings.ConnectionType.Title", + "value": "CONNECTION TYPE" + }, + "ChatSettings.ConnectionType.UseProxy": { + "key": "ChatSettings.ConnectionType.UseProxy", + "value": "Use Proxy" + }, + "ChatSettings.ConnectionType.UseSocks5": { + "key": "ChatSettings.ConnectionType.UseSocks5", + "value": "SOCKS5" + }, + "ChatSettings.DownloadInBackground": { + "key": "ChatSettings.DownloadInBackground", + "value": "Background Download" + }, + "ChatSettings.DownloadInBackgroundInfo": { + "key": "ChatSettings.DownloadInBackgroundInfo", + "value": "The app will continue downloading media files for a limited time." + }, + "ChatSettings.Groups": { + "key": "ChatSettings.Groups", + "value": "Groups" + }, + "ChatSettings.IntentsSettings": { + "key": "ChatSettings.IntentsSettings", + "value": "Share Sheet" + }, + "ChatSettings.OpenLinksIn": { + "key": "ChatSettings.OpenLinksIn", + "value": "Open Links in" + }, + "ChatSettings.Other": { + "key": "ChatSettings.Other", + "value": "OTHER" + }, + "ChatSettings.PrivateChats": { + "key": "ChatSettings.PrivateChats", + "value": "Private Chats" + }, + "ChatSettings.Stickers": { + "key": "ChatSettings.Stickers", + "value": "Stickers" + }, + "ChatSettings.TextSize": { + "key": "ChatSettings.TextSize", + "value": "Text Size" + }, + "ChatSettings.TextSizeUnits": { + "key": "ChatSettings.TextSizeUnits", + "value": "pt" + }, + "ChatSettings.Title": { + "key": "ChatSettings.Title", + "value": "Data and Storage" + }, + "ChatState.Connecting": { + "key": "ChatState.Connecting", + "value": "connecting..." + }, + "ChatState.ConnectingToProxy": { + "key": "ChatState.ConnectingToProxy", + "value": "connecting to proxy..." + }, + "ChatState.Updating": { + "key": "ChatState.Updating", + "value": "updating..." + }, + "ChatState.WaitingForNetwork": { + "key": "ChatState.WaitingForNetwork", + "value": "waiting for network..." + }, + "Checkout.Email": { + "key": "Checkout.Email", + "value": "Email" + }, + "Checkout.EnterPassword": { + "key": "Checkout.EnterPassword", + "value": "Enter Password" + }, + "Checkout.ErrorGeneric": { + "key": "Checkout.ErrorGeneric", + "value": "An error occurred while processing your payment. Your card has not been billed." + }, + "Checkout.ErrorInvoiceAlreadyPaid": { + "key": "Checkout.ErrorInvoiceAlreadyPaid", + "value": "You have already paid for this item." + }, + "Checkout.ErrorPaymentFailed": { + "key": "Checkout.ErrorPaymentFailed", + "value": "Payment failed. Your card has not been billed." + }, + "Checkout.ErrorPrecheckoutFailed": { + "key": "Checkout.ErrorPrecheckoutFailed", + "value": "The bot couldn't process your payment. Your card has not been billed." + }, + "Checkout.ErrorProviderAccountInvalid": { + "key": "Checkout.ErrorProviderAccountInvalid", + "value": "This bot can't accept payments at the moment. Please try again later." + }, + "Checkout.ErrorProviderAccountTimeout": { + "key": "Checkout.ErrorProviderAccountTimeout", + "value": "This bot can't process payments at the moment. Please try again later." + }, + "Checkout.LiabilityAlert": { + "key": "Checkout.LiabilityAlert", + "value": "Neither Telegram, nor %1$@ will have access to your credit card information. Credit card details will be handled only by the payment system, %2$@.\n\nPayments will go directly to the developer of %1$@. Telegram cannot provide any guarantees, so proceed at your own risk. In case of problems, please contact the developer of %1$@ or your bank." + }, + "Checkout.LiabilityAlertTitle": { + "key": "Checkout.LiabilityAlertTitle", + "value": "Warning" + }, + "Checkout.Name": { + "key": "Checkout.Name", + "value": "Name" + }, + "Checkout.NewCard.CardholderNamePlaceholder": { + "key": "Checkout.NewCard.CardholderNamePlaceholder", + "value": "Cardholder Name" + }, + "Checkout.NewCard.CardholderNameTitle": { + "key": "Checkout.NewCard.CardholderNameTitle", + "value": "CARDHOLDER" + }, + "Checkout.NewCard.PaymentCard": { + "key": "Checkout.NewCard.PaymentCard", + "value": "PAYMENT CARD" + }, + "Checkout.NewCard.PostcodePlaceholder": { + "key": "Checkout.NewCard.PostcodePlaceholder", + "value": "Zip Code" + }, + "Checkout.NewCard.PostcodeTitle": { + "key": "Checkout.NewCard.PostcodeTitle", + "value": "BILLING ADDRESS" + }, + "Checkout.NewCard.SaveInfo": { + "key": "Checkout.NewCard.SaveInfo", + "value": "Save Payment Information" + }, + "Checkout.NewCard.SaveInfoEnableHelp": { + "key": "Checkout.NewCard.SaveInfoEnableHelp", + "value": "You can save your payment information for future use.\nPlease [turn on Two-Step Verification] to enable this." + }, + "Checkout.NewCard.SaveInfoHelp": { + "key": "Checkout.NewCard.SaveInfoHelp", + "value": "You can save your payment information for future use." + }, + "Checkout.NewCard.Title": { + "key": "Checkout.NewCard.Title", + "value": "New Card" + }, + "Checkout.PasswordEntry.Pay": { + "key": "Checkout.PasswordEntry.Pay", + "value": "Pay" + }, + "Checkout.PasswordEntry.Text": { + "key": "Checkout.PasswordEntry.Text", + "value": "Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password." + }, + "Checkout.PasswordEntry.Title": { + "key": "Checkout.PasswordEntry.Title", + "value": "Payment Confirmation" + }, + "Checkout.PayNone": { + "key": "Checkout.PayNone", + "value": "Pay" + }, + "Checkout.PayPrice": { + "key": "Checkout.PayPrice", + "value": "Pay %@" + }, + "Checkout.PayWithFaceId": { + "key": "Checkout.PayWithFaceId", + "value": "Pay with Face ID" + }, + "Checkout.PayWithTouchId": { + "key": "Checkout.PayWithTouchId", + "value": "Pay with Touch ID" + }, + "Checkout.PaymentMethod": { + "key": "Checkout.PaymentMethod", + "value": "Payment Method" + }, + "Checkout.PaymentMethod.New": { + "key": "Checkout.PaymentMethod.New", + "value": "New Card..." + }, + "Checkout.PaymentMethod.Title": { + "key": "Checkout.PaymentMethod.Title", + "value": "Payment Method" + }, + "Checkout.Phone": { + "key": "Checkout.Phone", + "value": "Phone" + }, + "Checkout.Receipt.Title": { + "key": "Checkout.Receipt.Title", + "value": "Receipt" + }, + "Checkout.SavePasswordTimeout": { + "key": "Checkout.SavePasswordTimeout", + "value": "Would you like to save your password for %@?" + }, + "Checkout.SavePasswordTimeoutAndFaceId": { + "key": "Checkout.SavePasswordTimeoutAndFaceId", + "value": "Would you like to save your password for %@ and use Face ID instead?" + }, + "Checkout.SavePasswordTimeoutAndTouchId": { + "key": "Checkout.SavePasswordTimeoutAndTouchId", + "value": "Would you like to save your password for %@ and use Touch ID instead?" + }, + "Checkout.ShippingAddress": { + "key": "Checkout.ShippingAddress", + "value": "Shipping Information" + }, + "Checkout.ShippingMethod": { + "key": "Checkout.ShippingMethod", + "value": "Shipping Method" + }, + "Checkout.ShippingOption.Title": { + "key": "Checkout.ShippingOption.Title", + "value": "Shipping Method" + }, + "Checkout.Title": { + "key": "Checkout.Title", + "value": "Checkout" + }, + "Checkout.TotalAmount": { + "key": "Checkout.TotalAmount", + "value": "Total" + }, + "Checkout.TotalPaidAmount": { + "key": "Checkout.TotalPaidAmount", + "value": "Total Paid" + }, + "Checkout.WebConfirmation.Title": { + "key": "Checkout.WebConfirmation.Title", + "value": "Complete Payment" + }, + "CheckoutInfo.ErrorCityInvalid": { + "key": "CheckoutInfo.ErrorCityInvalid", + "value": "Please enter a valid city." + }, + "CheckoutInfo.ErrorEmailInvalid": { + "key": "CheckoutInfo.ErrorEmailInvalid", + "value": "Please enter a valid email address." + }, + "CheckoutInfo.ErrorNameInvalid": { + "key": "CheckoutInfo.ErrorNameInvalid", + "value": "Please enter a valid name." + }, + "CheckoutInfo.ErrorPhoneInvalid": { + "key": "CheckoutInfo.ErrorPhoneInvalid", + "value": "Please enter a valid phone number." + }, + "CheckoutInfo.ErrorPostcodeInvalid": { + "key": "CheckoutInfo.ErrorPostcodeInvalid", + "value": "Please enter a valid postcode." + }, + "CheckoutInfo.ErrorShippingNotAvailable": { + "key": "CheckoutInfo.ErrorShippingNotAvailable", + "value": "Shipping to the selected country is not available." + }, + "CheckoutInfo.ErrorStateInvalid": { + "key": "CheckoutInfo.ErrorStateInvalid", + "value": "Please enter a valid state." + }, + "CheckoutInfo.Pay": { + "key": "CheckoutInfo.Pay", + "value": "Pay" + }, + "CheckoutInfo.ReceiverInfoEmail": { + "key": "CheckoutInfo.ReceiverInfoEmail", + "value": "Email" + }, + "CheckoutInfo.ReceiverInfoEmailPlaceholder": { + "key": "CheckoutInfo.ReceiverInfoEmailPlaceholder", + "value": "Email" + }, + "CheckoutInfo.ReceiverInfoName": { + "key": "CheckoutInfo.ReceiverInfoName", + "value": "Name" + }, + "CheckoutInfo.ReceiverInfoNamePlaceholder": { + "key": "CheckoutInfo.ReceiverInfoNamePlaceholder", + "value": "First and Last Name" + }, + "CheckoutInfo.ReceiverInfoPhone": { + "key": "CheckoutInfo.ReceiverInfoPhone", + "value": "Phone" + }, + "CheckoutInfo.ReceiverInfoTitle": { + "key": "CheckoutInfo.ReceiverInfoTitle", + "value": "RECEIVER" + }, + "CheckoutInfo.SaveInfo": { + "key": "CheckoutInfo.SaveInfo", + "value": "Save Info" + }, + "CheckoutInfo.SaveInfoHelp": { + "key": "CheckoutInfo.SaveInfoHelp", + "value": "You can save your shipping information for future use." + }, + "CheckoutInfo.ShippingInfoAddress1": { + "key": "CheckoutInfo.ShippingInfoAddress1", + "value": "Address 1" + }, + "CheckoutInfo.ShippingInfoAddress1Placeholder": { + "key": "CheckoutInfo.ShippingInfoAddress1Placeholder", + "value": "Address" + }, + "CheckoutInfo.ShippingInfoAddress2": { + "key": "CheckoutInfo.ShippingInfoAddress2", + "value": "Address 2" + }, + "CheckoutInfo.ShippingInfoAddress2Placeholder": { + "key": "CheckoutInfo.ShippingInfoAddress2Placeholder", + "value": "Address" + }, + "CheckoutInfo.ShippingInfoCity": { + "key": "CheckoutInfo.ShippingInfoCity", + "value": "City" + }, + "CheckoutInfo.ShippingInfoCityPlaceholder": { + "key": "CheckoutInfo.ShippingInfoCityPlaceholder", + "value": "City" + }, + "CheckoutInfo.ShippingInfoCountry": { + "key": "CheckoutInfo.ShippingInfoCountry", + "value": "Country" + }, + "CheckoutInfo.ShippingInfoCountryPlaceholder": { + "key": "CheckoutInfo.ShippingInfoCountryPlaceholder", + "value": "Country" + }, + "CheckoutInfo.ShippingInfoPostcode": { + "key": "CheckoutInfo.ShippingInfoPostcode", + "value": "Postcode" + }, + "CheckoutInfo.ShippingInfoPostcodePlaceholder": { + "key": "CheckoutInfo.ShippingInfoPostcodePlaceholder", + "value": "Postcode" + }, + "CheckoutInfo.ShippingInfoState": { + "key": "CheckoutInfo.ShippingInfoState", + "value": "State" + }, + "CheckoutInfo.ShippingInfoStatePlaceholder": { + "key": "CheckoutInfo.ShippingInfoStatePlaceholder", + "value": "State" + }, + "CheckoutInfo.ShippingInfoTitle": { + "key": "CheckoutInfo.ShippingInfoTitle", + "value": "SHIPPING ADDRESS" + }, + "CheckoutInfo.Title": { + "key": "CheckoutInfo.Title", + "value": "Shipping Information" + }, + "ClearCache.Clear": { + "key": "ClearCache.Clear", + "value": "Clear" + }, + "ClearCache.ClearCache": { + "key": "ClearCache.ClearCache", + "value": "Clear Telegram Cache" + }, + "ClearCache.Description": { + "key": "ClearCache.Description", + "value": "Media files will be deleted from your phone, but available for re-downloading when necessary." + }, + "ClearCache.Forever": { + "key": "ClearCache.Forever", + "value": "Forever" + }, + "ClearCache.FreeSpace": { + "key": "ClearCache.FreeSpace", + "value": "Free Space" + }, + "ClearCache.FreeSpaceDescription": { + "key": "ClearCache.FreeSpaceDescription", + "value": "If you want to save space on your device, you don't need to delete anything.\n\nYou can use cache settings to remove unnecessary media — and re-download files if you need them again." + }, + "ClearCache.StorageCache": { + "key": "ClearCache.StorageCache", + "value": "Telegram Cache" + }, + "ClearCache.StorageFree": { + "key": "ClearCache.StorageFree", + "value": "Free" + }, + "ClearCache.StorageOtherApps": { + "key": "ClearCache.StorageOtherApps", + "value": "Other Apps" + }, + "ClearCache.StorageServiceFiles": { + "key": "ClearCache.StorageServiceFiles", + "value": "Telegram Service Files" + }, + "ClearCache.StorageTitle": { + "key": "ClearCache.StorageTitle", + "value": "%@ STORAGE" + }, + "ClearCache.StorageUsage": { + "key": "ClearCache.StorageUsage", + "value": "Storage Usage" + }, + "ClearCache.Success": { + "key": "ClearCache.Success", + "value": "**%@** freed on your %@!" + }, + "Clipboard.SendPhoto": { + "key": "Clipboard.SendPhoto", + "value": "Send Photo" + }, + "CloudStorage.Title": { + "key": "CloudStorage.Title", + "value": "Cloud Storage" + }, + "CommentsGroup.ErrorAccessDenied": { + "key": "CommentsGroup.ErrorAccessDenied", + "value": "Sorry, you can't access this chat because you were banned by an admin." + }, + "Common.ActionNotAllowedError": { + "key": "Common.ActionNotAllowedError", + "value": "Sorry, you are not allowed to do this." + }, + "Common.Back": { + "key": "Common.Back", + "value": "Back" + }, + "Common.Cancel": { + "key": "Common.Cancel", + "value": "Cancel" + }, + "Common.ChoosePhoto": { + "key": "Common.ChoosePhoto", + "value": "Choose Photo" + }, + "Common.Close": { + "key": "Common.Close", + "value": "Close" + }, + "Common.Create": { + "key": "Common.Create", + "value": "Create" + }, + "Common.Delete": { + "key": "Common.Delete", + "value": "Delete" + }, + "Common.Done": { + "key": "Common.Done", + "value": "Done" + }, + "Common.Edit": { + "key": "Common.Edit", + "value": "Edit" + }, + "Common.More": { + "key": "Common.More", + "value": "More" + }, + "Common.Next": { + "key": "Common.Next", + "value": "Next" + }, + "Common.No": { + "key": "Common.No", + "value": "No" + }, + "Common.NotNow": { + "key": "Common.NotNow", + "value": "Not Now" + }, + "Common.OK": { + "key": "Common.OK", + "value": "OK" + }, + "Common.Save": { + "key": "Common.Save", + "value": "Save" + }, + "Common.Search": { + "key": "Common.Search", + "value": "Search" + }, + "Common.Select": { + "key": "Common.Select", + "value": "Select" + }, + "Common.TakePhoto": { + "key": "Common.TakePhoto", + "value": "Take Photo" + }, + "Common.TakePhotoOrVideo": { + "key": "Common.TakePhotoOrVideo", + "value": "Take Photo or Video" + }, + "Common.Yes": { + "key": "Common.Yes", + "value": "Yes" + }, + "Common.edit": { + "key": "Common.edit", + "value": "edit" + }, + "Common.of": { + "key": "Common.of", + "value": "of" + }, + "Compose.ChannelMembers": { + "key": "Compose.ChannelMembers", + "value": "Members" + }, + "Compose.ChannelTokenListPlaceholder": { + "key": "Compose.ChannelTokenListPlaceholder", + "value": "Search for contacts or usernames" + }, + "Compose.Create": { + "key": "Compose.Create", + "value": "Create" + }, + "Compose.GroupTokenListPlaceholder": { + "key": "Compose.GroupTokenListPlaceholder", + "value": "Search for contacts or usernames" + }, + "Compose.NewChannel": { + "key": "Compose.NewChannel", + "value": "New Channel" + }, + "Compose.NewEncryptedChat": { + "key": "Compose.NewEncryptedChat", + "value": "New Secret Chat" + }, + "Compose.NewEncryptedChatTitle": { + "key": "Compose.NewEncryptedChatTitle", + "value": "New Secret Chat" + }, + "Compose.NewGroup": { + "key": "Compose.NewGroup", + "value": "New Group" + }, + "Compose.NewGroupTitle": { + "key": "Compose.NewGroupTitle", + "value": "New Group" + }, + "Compose.NewMessage": { + "key": "Compose.NewMessage", + "value": "New Message" + }, + "Compose.TokenListPlaceholder": { + "key": "Compose.TokenListPlaceholder", + "value": "Who would you like to add?" + }, + "ContactInfo.BirthdayLabel": { + "key": "ContactInfo.BirthdayLabel", + "value": "birthday" + }, + "ContactInfo.Job": { + "key": "ContactInfo.Job", + "value": "job" + }, + "ContactInfo.Note": { + "key": "ContactInfo.Note", + "value": "note" + }, + "ContactInfo.PhoneLabelHome": { + "key": "ContactInfo.PhoneLabelHome", + "value": "home" + }, + "ContactInfo.PhoneLabelHomeFax": { + "key": "ContactInfo.PhoneLabelHomeFax", + "value": "home fax" + }, + "ContactInfo.PhoneLabelMain": { + "key": "ContactInfo.PhoneLabelMain", + "value": "main" + }, + "ContactInfo.PhoneLabelMobile": { + "key": "ContactInfo.PhoneLabelMobile", + "value": "mobile" + }, + "ContactInfo.PhoneLabelOther": { + "key": "ContactInfo.PhoneLabelOther", + "value": "other" + }, + "ContactInfo.PhoneLabelPager": { + "key": "ContactInfo.PhoneLabelPager", + "value": "pager" + }, + "ContactInfo.PhoneLabelWork": { + "key": "ContactInfo.PhoneLabelWork", + "value": "work" + }, + "ContactInfo.PhoneLabelWorkFax": { + "key": "ContactInfo.PhoneLabelWorkFax", + "value": "work fax" + }, + "ContactInfo.PhoneNumberHidden": { + "key": "ContactInfo.PhoneNumberHidden", + "value": "Hidden" + }, + "ContactInfo.Title": { + "key": "ContactInfo.Title", + "value": "Contact Info" + }, + "ContactInfo.URLLabelHomepage": { + "key": "ContactInfo.URLLabelHomepage", + "value": "homepage" + }, + "ContactList.Context.Call": { + "key": "ContactList.Context.Call", + "value": "Call" + }, + "ContactList.Context.SendMessage": { + "key": "ContactList.Context.SendMessage", + "value": "Send Message" + }, + "ContactList.Context.StartSecretChat": { + "key": "ContactList.Context.StartSecretChat", + "value": "Start Secret Chat" + }, + "ContactList.Context.VideoCall": { + "key": "ContactList.Context.VideoCall", + "value": "Video Call" + }, + "Contacts.AccessDeniedError": { + "key": "Contacts.AccessDeniedError", + "value": "Telegram does not have access to your contacts" + }, + "Contacts.AccessDeniedHelpLandscape": { + "key": "Contacts.AccessDeniedHelpLandscape", + "value": "Please go to your %@ Settings > Privacy > Contacts.\nThen select ON for Telegram." + }, + "Contacts.AccessDeniedHelpON": { + "key": "Contacts.AccessDeniedHelpON", + "value": "ON" + }, + "Contacts.AccessDeniedHelpPortrait": { + "key": "Contacts.AccessDeniedHelpPortrait", + "value": "Please go to your %@ Settings > Privacy > Contacts and set Telegram to ON." + }, + "Contacts.AddPeopleNearby": { + "key": "Contacts.AddPeopleNearby", + "value": "Find People Nearby" + }, + "Contacts.AddPhoneNumber": { + "key": "Contacts.AddPhoneNumber", + "value": "Add %@" + }, + "Contacts.DeselectAll": { + "key": "Contacts.DeselectAll", + "value": "Deselect All" + }, + "Contacts.FailedToSendInvitesMessage": { + "key": "Contacts.FailedToSendInvitesMessage", + "value": "An error occurred." + }, + "Contacts.GlobalSearch": { + "key": "Contacts.GlobalSearch", + "value": "Global Search" + }, + "Contacts.ImportersCount": { + "key": "Contacts.ImportersCount", + "zeroValue": null, + "oneValue": "1 contact on Telegram", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ contacts on Telegram" + }, + "Contacts.InviteContacts": { + "key": "Contacts.InviteContacts", + "zeroValue": null, + "oneValue": "Invite %@ Contact", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Invite %@ Contacts" + }, + "Contacts.InviteFriends": { + "key": "Contacts.InviteFriends", + "value": "Invite Friends" + }, + "Contacts.InviteSearchLabel": { + "key": "Contacts.InviteSearchLabel", + "value": "Search contacts" + }, + "Contacts.InviteToTelegram": { + "key": "Contacts.InviteToTelegram", + "value": "Invite to Telegram" + }, + "Contacts.MemberSearchSectionTitleGroup": { + "key": "Contacts.MemberSearchSectionTitleGroup", + "value": "Group Members" + }, + "Contacts.NotRegisteredSection": { + "key": "Contacts.NotRegisteredSection", + "value": "Phonebook" + }, + "Contacts.PermissionsAllow": { + "key": "Contacts.PermissionsAllow", + "value": "Allow Access" + }, + "Contacts.PermissionsAllowInSettings": { + "key": "Contacts.PermissionsAllowInSettings", + "value": "Allow in Settings" + }, + "Contacts.PermissionsEnable": { + "key": "Contacts.PermissionsEnable", + "value": "Enable" + }, + "Contacts.PermissionsKeepDisabled": { + "key": "Contacts.PermissionsKeepDisabled", + "value": "Keep Disabled" + }, + "Contacts.PermissionsSuppressWarningText": { + "key": "Contacts.PermissionsSuppressWarningText", + "value": "You won't know when your friends join Telegram and become available to chat. We recommend enabling access to contacts in Settings." + }, + "Contacts.PermissionsSuppressWarningTitle": { + "key": "Contacts.PermissionsSuppressWarningTitle", + "value": "Keep contacts disabled?" + }, + "Contacts.PermissionsText": { + "key": "Contacts.PermissionsText", + "value": "Please allow Telegram access to your phonebook to seamlessly find all your friends." + }, + "Contacts.PermissionsTitle": { + "key": "Contacts.PermissionsTitle", + "value": "Access to Contacts" + }, + "Contacts.PhoneNumber": { + "key": "Contacts.PhoneNumber", + "value": "Phone Number" + }, + "Contacts.SearchLabel": { + "key": "Contacts.SearchLabel", + "value": "Search for contacts or usernames" + }, + "Contacts.SearchUsersAndGroupsLabel": { + "key": "Contacts.SearchUsersAndGroupsLabel", + "value": "Search for users and groups" + }, + "Contacts.SelectAll": { + "key": "Contacts.SelectAll", + "value": "Select All" + }, + "Contacts.ShareTelegram": { + "key": "Contacts.ShareTelegram", + "value": "Share Telegram" + }, + "Contacts.SortBy": { + "key": "Contacts.SortBy", + "value": "Sort by:" + }, + "Contacts.SortByName": { + "key": "Contacts.SortByName", + "value": "Name" + }, + "Contacts.SortByPresence": { + "key": "Contacts.SortByPresence", + "value": "Last Seen Time" + }, + "Contacts.SortedByName": { + "key": "Contacts.SortedByName", + "value": "Sorted by Name" + }, + "Contacts.SortedByPresence": { + "key": "Contacts.SortedByPresence", + "value": "Sorted by Last Seen Time" + }, + "Contacts.TabTitle": { + "key": "Contacts.TabTitle", + "value": "Contacts" + }, + "Contacts.Title": { + "key": "Contacts.Title", + "value": "Contacts" + }, + "Contacts.TopSection": { + "key": "Contacts.TopSection", + "value": "CONTACTS" + }, + "Contacts.VoiceOver.AddContact": { + "key": "Contacts.VoiceOver.AddContact", + "value": "Add Contact" + }, + "Conversation.AddContact": { + "key": "Conversation.AddContact", + "value": "Add Contact" + }, + "Conversation.AddMembers": { + "key": "Conversation.AddMembers", + "value": "Add Members" + }, + "Conversation.AddNameToContacts": { + "key": "Conversation.AddNameToContacts", + "value": "Add %@ to Contacts" + }, + "Conversation.AddToContacts": { + "key": "Conversation.AddToContacts", + "value": "Add to Contacts" + }, + "Conversation.AddToReadingList": { + "key": "Conversation.AddToReadingList", + "value": "Add to Reading List" + }, + "Conversation.Admin": { + "key": "Conversation.Admin", + "value": "admin" + }, + "Conversation.AlsoClearCacheTitle": { + "key": "Conversation.AlsoClearCacheTitle", + "value": "You can use \"clear cache\" to remove unnecessary media — and re-downloaded files if you need them again." + }, + "Conversation.ApplyLocalization": { + "key": "Conversation.ApplyLocalization", + "value": "Apply Localization" + }, + "Conversation.AudioRateTooltipNormal": { + "key": "Conversation.AudioRateTooltipNormal", + "value": "Audio will play at normal speed." + }, + "Conversation.AudioRateTooltipSpeedUp": { + "key": "Conversation.AudioRateTooltipSpeedUp", + "value": "Audio will play two times faster." + }, + "Conversation.AutoremoveActionEdit": { + "key": "Conversation.AutoremoveActionEdit", + "value": "Edit Auto-Delete Settings" + }, + "Conversation.AutoremoveActionEnable": { + "key": "Conversation.AutoremoveActionEnable", + "value": "Enable Auto-Delete" + }, + "Conversation.AutoremoveChanged": { + "key": "Conversation.AutoremoveChanged", + "value": "Auto-Delete timer set to %@" + }, + "Conversation.AutoremoveOff": { + "key": "Conversation.AutoremoveOff", + "value": "Auto-Delete is now off." + }, + "Conversation.AutoremoveRemainingDays": { + "key": "Conversation.AutoremoveRemainingDays", + "zeroValue": null, + "oneValue": "auto-deletes in %@ day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "auto-deletes in %@ days" + }, + "Conversation.AutoremoveRemainingTime": { + "key": "Conversation.AutoremoveRemainingTime", + "value": "auto-deletes in %@" + }, + "Conversation.AutoremoveTimerRemovedChannel": { + "key": "Conversation.AutoremoveTimerRemovedChannel", + "value": "Messages in this channel will no longer be automatically deleted" + }, + "Conversation.AutoremoveTimerRemovedGroup": { + "key": "Conversation.AutoremoveTimerRemovedGroup", + "value": "A group admin disabled the auto-delete timer" + }, + "Conversation.AutoremoveTimerRemovedUser": { + "key": "Conversation.AutoremoveTimerRemovedUser", + "value": "%1$@ disabled the auto-delete timer" + }, + "Conversation.AutoremoveTimerRemovedUserYou": { + "key": "Conversation.AutoremoveTimerRemovedUserYou", + "value": "You disabled the auto-delete timer" + }, + "Conversation.AutoremoveTimerSetChannel": { + "key": "Conversation.AutoremoveTimerSetChannel", + "value": "Messages in this channel will be automatically deleted after %1$@" + }, + "Conversation.AutoremoveTimerSetGroup": { + "key": "Conversation.AutoremoveTimerSetGroup", + "value": "A group admin set messages to automatically delete after %1$@" + }, + "Conversation.AutoremoveTimerSetToastText": { + "key": "Conversation.AutoremoveTimerSetToastText", + "value": "Messages in this chat are automatically\ndeleted %@ after they have been sent." + }, + "Conversation.AutoremoveTimerSetUser": { + "key": "Conversation.AutoremoveTimerSetUser", + "value": "%1$@ set messages to automatically delete after %2$@" + }, + "Conversation.AutoremoveTimerSetUserYou": { + "key": "Conversation.AutoremoveTimerSetUserYou", + "value": "You set messages to automatically delete after %1$@" + }, + "Conversation.BlockUser": { + "key": "Conversation.BlockUser", + "value": "Block User" + }, + "Conversation.BotInteractiveUrlAlert": { + "key": "Conversation.BotInteractiveUrlAlert", + "value": "Allow %@ to pass your Telegram name and id (not your phone number) to pages you open with this bot?" + }, + "Conversation.Bytes": { + "key": "Conversation.Bytes", + "value": "%d B" + }, + "Conversation.Call": { + "key": "Conversation.Call", + "value": "Call" + }, + "Conversation.ChatBackground": { + "key": "Conversation.ChatBackground", + "value": "Chat Background" + }, + "Conversation.ChecksTooltip.Delivered": { + "key": "Conversation.ChecksTooltip.Delivered", + "value": "Delivered" + }, + "Conversation.ChecksTooltip.Read": { + "key": "Conversation.ChecksTooltip.Read", + "value": "Read" + }, + "Conversation.ClearAll": { + "key": "Conversation.ClearAll", + "value": "Clear Chat" + }, + "Conversation.ClearCache": { + "key": "Conversation.ClearCache", + "value": "Clear Cache" + }, + "Conversation.ClearChannel": { + "key": "Conversation.ClearChannel", + "value": "Clear Channel" + }, + "Conversation.ClearChatConfirmation": { + "key": "Conversation.ClearChatConfirmation", + "value": "Warning, this will delete your **entire chat history** with %@." + }, + "Conversation.ClearGroupHistory": { + "key": "Conversation.ClearGroupHistory", + "value": "This will delete all messages and media in this chat from your Telegram cloud. Other members of the group will still have them." + }, + "Conversation.ClearPrivateHistory": { + "key": "Conversation.ClearPrivateHistory", + "value": "This will delete all messages and media in this chat from your Telegram cloud. Your chat partner will still have them." + }, + "Conversation.ClearSecretHistory": { + "key": "Conversation.ClearSecretHistory", + "value": "This will delete all messages and media in this chat for both you and your chat partner." + }, + "Conversation.ClearSelfHistory": { + "key": "Conversation.ClearSelfHistory", + "value": "This will delete all messages and media in this chat from your Telegram cloud." + }, + "Conversation.CloudStorage.ChatStatus": { + "key": "Conversation.CloudStorage.ChatStatus", + "value": "chat with yourself" + }, + "Conversation.CloudStorageInfo.Title": { + "key": "Conversation.CloudStorageInfo.Title", + "value": "Your Cloud Storage" + }, + "Conversation.ClousStorageInfo.Description1": { + "key": "Conversation.ClousStorageInfo.Description1", + "value": "• Forward messages here to save them" + }, + "Conversation.ClousStorageInfo.Description2": { + "key": "Conversation.ClousStorageInfo.Description2", + "value": "• Send media and files to store them" + }, + "Conversation.ClousStorageInfo.Description3": { + "key": "Conversation.ClousStorageInfo.Description3", + "value": "• Access this chat from any device" + }, + "Conversation.ClousStorageInfo.Description4": { + "key": "Conversation.ClousStorageInfo.Description4", + "value": "• Use search to quickly find things" + }, + "Conversation.Contact": { + "key": "Conversation.Contact", + "value": "Contact" + }, + "Conversation.ContextMenuBan": { + "key": "Conversation.ContextMenuBan", + "value": "Restrict" + }, + "Conversation.ContextMenuBlock": { + "key": "Conversation.ContextMenuBlock", + "value": "Block User" + }, + "Conversation.ContextMenuCancelEditing": { + "key": "Conversation.ContextMenuCancelEditing", + "value": "Cancel Editing" + }, + "Conversation.ContextMenuCancelSending": { + "key": "Conversation.ContextMenuCancelSending", + "value": "Cancel Sending" + }, + "Conversation.ContextMenuCopy": { + "key": "Conversation.ContextMenuCopy", + "value": "Copy" + }, + "Conversation.ContextMenuCopyLink": { + "key": "Conversation.ContextMenuCopyLink", + "value": "Copy Link" + }, + "Conversation.ContextMenuDelete": { + "key": "Conversation.ContextMenuDelete", + "value": "Delete" + }, + "Conversation.ContextMenuDiscuss": { + "key": "Conversation.ContextMenuDiscuss", + "value": "Discuss" + }, + "Conversation.ContextMenuForward": { + "key": "Conversation.ContextMenuForward", + "value": "Forward" + }, + "Conversation.ContextMenuLookUp": { + "key": "Conversation.ContextMenuLookUp", + "value": "Look Up" + }, + "Conversation.ContextMenuMention": { + "key": "Conversation.ContextMenuMention", + "value": "Mention" + }, + "Conversation.ContextMenuMore": { + "key": "Conversation.ContextMenuMore", + "value": "More..." + }, + "Conversation.ContextMenuOpenChannel": { + "key": "Conversation.ContextMenuOpenChannel", + "value": "Open Channel" + }, + "Conversation.ContextMenuOpenChannelProfile": { + "key": "Conversation.ContextMenuOpenChannelProfile", + "value": "Open Profile" + }, + "Conversation.ContextMenuOpenProfile": { + "key": "Conversation.ContextMenuOpenProfile", + "value": "Open Profile" + }, + "Conversation.ContextMenuReply": { + "key": "Conversation.ContextMenuReply", + "value": "Reply" + }, + "Conversation.ContextMenuReport": { + "key": "Conversation.ContextMenuReport", + "value": "Report" + }, + "Conversation.ContextMenuSelect": { + "key": "Conversation.ContextMenuSelect", + "value": "Select" + }, + "Conversation.ContextMenuSelectAll": { + "key": "Conversation.ContextMenuSelectAll", + "zeroValue": null, + "oneValue": "Select All %@ Items", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Select All %@ Items" + }, + "Conversation.ContextMenuSendMessage": { + "key": "Conversation.ContextMenuSendMessage", + "value": "Send Message" + }, + "Conversation.ContextMenuShare": { + "key": "Conversation.ContextMenuShare", + "value": "Share" + }, + "Conversation.ContextMenuSpeak": { + "key": "Conversation.ContextMenuSpeak", + "value": "Speak" + }, + "Conversation.ContextMenuStickerPackAdd": { + "key": "Conversation.ContextMenuStickerPackAdd", + "value": "Add Stickers" + }, + "Conversation.ContextMenuStickerPackInfo": { + "key": "Conversation.ContextMenuStickerPackInfo", + "value": "Info" + }, + "Conversation.ContextViewReplies": { + "key": "Conversation.ContextViewReplies", + "zeroValue": null, + "oneValue": "View %@ Reply", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "View %@ Replies" + }, + "Conversation.ContextViewStats": { + "key": "Conversation.ContextViewStats", + "value": "View Statistics" + }, + "Conversation.ContextViewThread": { + "key": "Conversation.ContextViewThread", + "value": "View Thread" + }, + "Conversation.DefaultRestrictedInline": { + "key": "Conversation.DefaultRestrictedInline", + "value": "Posting inline content isn't allowed in this group." + }, + "Conversation.DefaultRestrictedMedia": { + "key": "Conversation.DefaultRestrictedMedia", + "value": "Posting media content isn't allowed in this group." + }, + "Conversation.DefaultRestrictedStickers": { + "key": "Conversation.DefaultRestrictedStickers", + "value": "Posting stickers isn't allowed in this group." + }, + "Conversation.DefaultRestrictedText": { + "key": "Conversation.DefaultRestrictedText", + "value": "Sending messages is not allowed in this group." + }, + "Conversation.DeleteAllMessagesInChat": { + "key": "Conversation.DeleteAllMessagesInChat", + "value": "Are you sure you want to delete all messages in %@?" + }, + "Conversation.DeleteManyMessages": { + "key": "Conversation.DeleteManyMessages", + "value": "Delete Messages" + }, + "Conversation.DeleteMessagesFor": { + "key": "Conversation.DeleteMessagesFor", + "value": "Delete for me and %@" + }, + "Conversation.DeleteMessagesForEveryone": { + "key": "Conversation.DeleteMessagesForEveryone", + "value": "Delete for everyone" + }, + "Conversation.DeleteMessagesForMe": { + "key": "Conversation.DeleteMessagesForMe", + "value": "Delete for me" + }, + "Conversation.Dice": { + "key": "Conversation.Dice", + "value": "Send a 🎲 emoji to any chat to get a random number from Telegram." + }, + "Conversation.Dice.": { + "key": "Conversation.Dice.", + "value": "Send a dice emoji to any chat to roll a die." + }, + "Conversation.Dice.u1F3AF": { + "key": "Conversation.Dice.u1F3AF", + "value": "Send a dart emoji to try your luck." + }, + "Conversation.Dice.u1F3B0": { + "key": "Conversation.Dice.u1F3B0", + "value": "Send a slot machine emoji to try your luck." + }, + "Conversation.Dice.u1F3B2": { + "key": "Conversation.Dice.u1F3B2", + "value": "Send a dice emoji to any chat to roll a die." + }, + "Conversation.Dice.u1F3B3": { + "key": "Conversation.Dice.u1F3B3", + "value": "Send a bowling emoji to try your luck." + }, + "Conversation.Dice.u1F3C0": { + "key": "Conversation.Dice.u1F3C0", + "value": "Send a basketball emoji to try your luck." + }, + "Conversation.Dice.u26BD": { + "key": "Conversation.Dice.u26BD", + "value": "Send a football emoji to try your luck." + }, + "Conversation.DiscardVoiceMessageAction": { + "key": "Conversation.DiscardVoiceMessageAction", + "value": "Discard" + }, + "Conversation.DiscardVoiceMessageDescription": { + "key": "Conversation.DiscardVoiceMessageDescription", + "value": "Are you sure you want to stop recording and discard\nyour voice message?" + }, + "Conversation.DiscardVoiceMessageTitle": { + "key": "Conversation.DiscardVoiceMessageTitle", + "value": "Discard Voice Message" + }, + "Conversation.DiscussionNotStarted": { + "key": "Conversation.DiscussionNotStarted", + "value": "No comments here yet..." + }, + "Conversation.DiscussionStarted": { + "key": "Conversation.DiscussionStarted", + "value": "Discussion started" + }, + "Conversation.Edit": { + "key": "Conversation.Edit", + "value": "Edit" + }, + "Conversation.EditingCaptionPanelTitle": { + "key": "Conversation.EditingCaptionPanelTitle", + "value": "Edit Caption" + }, + "Conversation.EditingMessageMediaChange": { + "key": "Conversation.EditingMessageMediaChange", + "value": "Change Photo or Video" + }, + "Conversation.EditingMessageMediaEditCurrentPhoto": { + "key": "Conversation.EditingMessageMediaEditCurrentPhoto", + "value": "Edit Current Photo" + }, + "Conversation.EditingMessageMediaEditCurrentVideo": { + "key": "Conversation.EditingMessageMediaEditCurrentVideo", + "value": "Edit Current Video" + }, + "Conversation.EditingMessagePanelMedia": { + "key": "Conversation.EditingMessagePanelMedia", + "value": "Tap to edit media" + }, + "Conversation.EditingMessagePanelTitle": { + "key": "Conversation.EditingMessagePanelTitle", + "value": "Edit Message" + }, + "Conversation.EditingPhotoPanelTitle": { + "key": "Conversation.EditingPhotoPanelTitle", + "value": "Edit Photo" + }, + "Conversation.EmptyGifPanelPlaceholder": { + "key": "Conversation.EmptyGifPanelPlaceholder", + "value": "You have no saved GIFs yet.\nEnter @gif to search." + }, + "Conversation.EmptyPlaceholder": { + "key": "Conversation.EmptyPlaceholder", + "value": "No messages here yet..." + }, + "Conversation.EncryptedDescription1": { + "key": "Conversation.EncryptedDescription1", + "value": "Use end-to-end encryption" + }, + "Conversation.EncryptedDescription2": { + "key": "Conversation.EncryptedDescription2", + "value": "Leave no trace on our servers" + }, + "Conversation.EncryptedDescription3": { + "key": "Conversation.EncryptedDescription3", + "value": "Have a self-destruct timer" + }, + "Conversation.EncryptedDescription4": { + "key": "Conversation.EncryptedDescription4", + "value": "Do not allow forwarding" + }, + "Conversation.EncryptedDescriptionTitle": { + "key": "Conversation.EncryptedDescriptionTitle", + "value": "Secret chats:" + }, + "Conversation.EncryptedPlaceholderTitleIncoming": { + "key": "Conversation.EncryptedPlaceholderTitleIncoming", + "value": "%@ invited you to join a secret chat." + }, + "Conversation.EncryptedPlaceholderTitleOutgoing": { + "key": "Conversation.EncryptedPlaceholderTitleOutgoing", + "value": "You invited %@ to join a secret chat." + }, + "Conversation.EncryptionCanceled": { + "key": "Conversation.EncryptionCanceled", + "value": "Secret chat cancelled" + }, + "Conversation.EncryptionProcessing": { + "key": "Conversation.EncryptionProcessing", + "value": "Exchanging encryption keys..." + }, + "Conversation.EncryptionWaiting": { + "key": "Conversation.EncryptionWaiting", + "value": "Waiting for %@ to get online..." + }, + "Conversation.ErrorInaccessibleMessage": { + "key": "Conversation.ErrorInaccessibleMessage", + "value": "Unfortunately, you can't access this message. You are not a member of the chat where it was posted." + }, + "Conversation.FileDropbox": { + "key": "Conversation.FileDropbox", + "value": "Dropbox" + }, + "Conversation.FileHowToText": { + "key": "Conversation.FileHowToText", + "value": "To share files of any type, open them on your %@ (e.g. in your browser), tap **Open in...** or the action button and choose Telegram." + }, + "Conversation.FileICloudDrive": { + "key": "Conversation.FileICloudDrive", + "value": "iCloud Drive" + }, + "Conversation.FileOpenIn": { + "key": "Conversation.FileOpenIn", + "value": "Open in..." + }, + "Conversation.FilePhotoOrVideo": { + "key": "Conversation.FilePhotoOrVideo", + "value": "Photo or Video" + }, + "Conversation.ForwardAuthorHiddenTooltip": { + "key": "Conversation.ForwardAuthorHiddenTooltip", + "value": "The account was hidden by the user" + }, + "Conversation.ForwardChats": { + "key": "Conversation.ForwardChats", + "value": "Chats" + }, + "Conversation.ForwardContacts": { + "key": "Conversation.ForwardContacts", + "value": "Contacts" + }, + "Conversation.ForwardTitle": { + "key": "Conversation.ForwardTitle", + "value": "Forward" + }, + "Conversation.ForwardTooltip.Chat.Many": { + "key": "Conversation.ForwardTooltip.Chat.Many", + "value": "Messages forwarded to **%@**" + }, + "Conversation.ForwardTooltip.Chat.One": { + "key": "Conversation.ForwardTooltip.Chat.One", + "value": "Message forwarded to **%@**" + }, + "Conversation.ForwardTooltip.ManyChats.Many": { + "key": "Conversation.ForwardTooltip.ManyChats.Many", + "value": "Messages forwarded to **%@** and %@ others" + }, + "Conversation.ForwardTooltip.ManyChats.One": { + "key": "Conversation.ForwardTooltip.ManyChats.One", + "value": "Message forwarded to **%@** and %@ others" + }, + "Conversation.ForwardTooltip.SavedMessages.Many": { + "key": "Conversation.ForwardTooltip.SavedMessages.Many", + "value": "Messages forwarded to **Saved Messages**" + }, + "Conversation.ForwardTooltip.SavedMessages.One": { + "key": "Conversation.ForwardTooltip.SavedMessages.One", + "value": "Message forwarded to **Saved Messages**" + }, + "Conversation.ForwardTooltip.TwoChats.Many": { + "key": "Conversation.ForwardTooltip.TwoChats.Many", + "value": "Messages forwarded to **%@** and **%@**" + }, + "Conversation.ForwardTooltip.TwoChats.One": { + "key": "Conversation.ForwardTooltip.TwoChats.One", + "value": "Message forwarded to **%@** and **%@**" + }, + "Conversation.GifTooltip": { + "key": "Conversation.GifTooltip", + "value": "Tap here to access saved GIFs" + }, + "Conversation.GigagroupDescription": { + "key": "Conversation.GigagroupDescription", + "value": "Only admins can send messages in this group." + }, + "Conversation.GreetingText": { + "key": "Conversation.GreetingText", + "value": "Send a message or tap on the greeting below." + }, + "Conversation.HoldForAudio": { + "key": "Conversation.HoldForAudio", + "value": "Hold to record audio. Tap to switch to video." + }, + "Conversation.HoldForVideo": { + "key": "Conversation.HoldForVideo", + "value": "Hold to record video. Tap to switch to audio." + }, + "Conversation.ImportProgress": { + "key": "Conversation.ImportProgress", + "value": "Importing Messages... %@%" + }, + "Conversation.ImportedMessageHint": { + "key": "Conversation.ImportedMessageHint", + "value": "This message was imported from another app. We can't guarantee it's real." + }, + "Conversation.Info": { + "key": "Conversation.Info", + "value": "Info" + }, + "Conversation.InfoGroup": { + "key": "Conversation.InfoGroup", + "value": "Group" + }, + "Conversation.InputTextAnonymousPlaceholder": { + "key": "Conversation.InputTextAnonymousPlaceholder", + "value": "Send anonymously" + }, + "Conversation.InputTextBroadcastPlaceholder": { + "key": "Conversation.InputTextBroadcastPlaceholder", + "value": "Broadcast" + }, + "Conversation.InputTextCaptionPlaceholder": { + "key": "Conversation.InputTextCaptionPlaceholder", + "value": "Caption" + }, + "Conversation.InputTextPlaceholder": { + "key": "Conversation.InputTextPlaceholder", + "value": "Message" + }, + "Conversation.InputTextPlaceholderComment": { + "key": "Conversation.InputTextPlaceholderComment", + "value": "Comment" + }, + "Conversation.InputTextPlaceholderReply": { + "key": "Conversation.InputTextPlaceholderReply", + "value": "Reply" + }, + "Conversation.InputTextSilentBroadcastPlaceholder": { + "key": "Conversation.InputTextSilentBroadcastPlaceholder", + "value": "Silent Broadcast" + }, + "Conversation.InstantPagePreview": { + "key": "Conversation.InstantPagePreview", + "value": "INSTANT VIEW" + }, + "Conversation.JumpToDate": { + "key": "Conversation.JumpToDate", + "value": "Jump To Date" + }, + "Conversation.Kilobytes": { + "key": "Conversation.Kilobytes", + "value": "%d KB" + }, + "Conversation.LinkDialogCopy": { + "key": "Conversation.LinkDialogCopy", + "value": "Copy" + }, + "Conversation.LinkDialogOpen": { + "key": "Conversation.LinkDialogOpen", + "value": "Open" + }, + "Conversation.LinkDialogSave": { + "key": "Conversation.LinkDialogSave", + "value": "Save" + }, + "Conversation.LiveLocation": { + "key": "Conversation.LiveLocation", + "value": "Live Location" + }, + "Conversation.LiveLocationMembersCount": { + "key": "Conversation.LiveLocationMembersCount", + "zeroValue": null, + "oneValue": "1 member", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ members" + }, + "Conversation.LiveLocationYou": { + "key": "Conversation.LiveLocationYou", + "value": "You" + }, + "Conversation.LiveLocationYouAnd": { + "key": "Conversation.LiveLocationYouAnd", + "value": "*You* and %@" + }, + "Conversation.LiveLocationYouAndOther": { + "key": "Conversation.LiveLocationYouAndOther", + "value": "**You** and %@" + }, + "Conversation.Location": { + "key": "Conversation.Location", + "value": "Location" + }, + "Conversation.Megabytes": { + "key": "Conversation.Megabytes", + "value": "%.1f MB" + }, + "Conversation.MessageDeliveryFailed": { + "key": "Conversation.MessageDeliveryFailed", + "value": "Your message was not sent. Tap \"Resend\" to send this message." + }, + "Conversation.MessageDialogDelete": { + "key": "Conversation.MessageDialogDelete", + "value": "Delete" + }, + "Conversation.MessageDialogEdit": { + "key": "Conversation.MessageDialogEdit", + "value": "Edit" + }, + "Conversation.MessageDialogRetry": { + "key": "Conversation.MessageDialogRetry", + "value": "Resend" + }, + "Conversation.MessageDialogRetryAll": { + "key": "Conversation.MessageDialogRetryAll", + "value": "Resend %1$d Messages" + }, + "Conversation.MessageEditedLabel": { + "key": "Conversation.MessageEditedLabel", + "value": "edited" + }, + "Conversation.MessageLeaveComment": { + "key": "Conversation.MessageLeaveComment", + "value": "Leave a Comment" + }, + "Conversation.MessageLeaveCommentShort": { + "key": "Conversation.MessageLeaveCommentShort", + "value": "Comment" + }, + "Conversation.MessageViaUser": { + "key": "Conversation.MessageViaUser", + "value": "via %@" + }, + "Conversation.MessageViewComments": { + "key": "Conversation.MessageViewComments", + "zeroValue": null, + "oneValue": "[%@]Comment", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "[%@]Comments" + }, + "Conversation.MessageViewCommentsFormat": { + "key": "Conversation.MessageViewCommentsFormat", + "value": "%1$@ %2$@" + }, + "Conversation.Moderate.Ban": { + "key": "Conversation.Moderate.Ban", + "value": "Ban User" + }, + "Conversation.Moderate.Delete": { + "key": "Conversation.Moderate.Delete", + "value": "Delete Message" + }, + "Conversation.Moderate.DeleteAllMessages": { + "key": "Conversation.Moderate.DeleteAllMessages", + "value": "Delete All From %@" + }, + "Conversation.Moderate.Report": { + "key": "Conversation.Moderate.Report", + "value": "Report Spam" + }, + "Conversation.Mute": { + "key": "Conversation.Mute", + "value": "Mute" + }, + "Conversation.NoticeInvitedByInChannel": { + "key": "Conversation.NoticeInvitedByInChannel", + "value": "%@ invited you to this channel" + }, + "Conversation.NoticeInvitedByInGroup": { + "key": "Conversation.NoticeInvitedByInGroup", + "value": "%@ invited you to this group" + }, + "Conversation.OpenBotLinkAllowMessages": { + "key": "Conversation.OpenBotLinkAllowMessages", + "value": "Allow **%@** to send me messages" + }, + "Conversation.OpenBotLinkLogin": { + "key": "Conversation.OpenBotLinkLogin", + "value": "Log in to **%1$@** as %2$@" + }, + "Conversation.OpenBotLinkOpen": { + "key": "Conversation.OpenBotLinkOpen", + "value": "Open" + }, + "Conversation.OpenBotLinkText": { + "key": "Conversation.OpenBotLinkText", + "value": "Do you want to open\n**%@**?" + }, + "Conversation.OpenBotLinkTitle": { + "key": "Conversation.OpenBotLinkTitle", + "value": "Open Link" + }, + "Conversation.OpenFile": { + "key": "Conversation.OpenFile", + "value": "Open File" + }, + "Conversation.Owner": { + "key": "Conversation.Owner", + "value": "owner" + }, + "Conversation.PeerNearbyDistance": { + "key": "Conversation.PeerNearbyDistance", + "value": "%1$@ is %2$@ away" + }, + "Conversation.PeerNearbyText": { + "key": "Conversation.PeerNearbyText", + "value": "Send a message or tap on the greeting below to show that you are ready to chat." + }, + "Conversation.PeerNearbyTitle": { + "key": "Conversation.PeerNearbyTitle", + "value": "%1$@ is %2$@ away" + }, + "Conversation.Pin": { + "key": "Conversation.Pin", + "value": "Pin" + }, + "Conversation.PinMessageAlert.OnlyPin": { + "key": "Conversation.PinMessageAlert.OnlyPin", + "value": "Only Pin" + }, + "Conversation.PinMessageAlert.PinAndNotifyMembers": { + "key": "Conversation.PinMessageAlert.PinAndNotifyMembers", + "value": "Pin and notify all members" + }, + "Conversation.PinMessageAlertGroup": { + "key": "Conversation.PinMessageAlertGroup", + "value": "Pin this message and notify all members of the group?" + }, + "Conversation.PinMessageAlertPin": { + "key": "Conversation.PinMessageAlertPin", + "value": "Pin" + }, + "Conversation.PinMessagesFor": { + "key": "Conversation.PinMessagesFor", + "value": "Pin for me and %@" + }, + "Conversation.PinMessagesForMe": { + "key": "Conversation.PinMessagesForMe", + "value": "Pin for me" + }, + "Conversation.PinOlderMessageAlertText": { + "key": "Conversation.PinOlderMessageAlertText", + "value": "Do you want to pin an older message while leaving a more recent one pinned?" + }, + "Conversation.PinOlderMessageAlertTitle": { + "key": "Conversation.PinOlderMessageAlertTitle", + "value": "Pin Message" + }, + "Conversation.PinnedMessage": { + "key": "Conversation.PinnedMessage", + "value": "Pinned Message" + }, + "Conversation.PinnedPoll": { + "key": "Conversation.PinnedPoll", + "value": "Pinned Poll" + }, + "Conversation.PinnedPreviousMessage": { + "key": "Conversation.PinnedPreviousMessage", + "value": "Previous Message" + }, + "Conversation.PinnedQuiz": { + "key": "Conversation.PinnedQuiz", + "value": "Pinned Quiz" + }, + "Conversation.PressVolumeButtonForSound": { + "key": "Conversation.PressVolumeButtonForSound", + "value": "Press volume button\nto unmute the video" + }, + "Conversation.PrivateChannelTimeLimitedAlertJoin": { + "key": "Conversation.PrivateChannelTimeLimitedAlertJoin", + "value": "Join" + }, + "Conversation.PrivateChannelTimeLimitedAlertText": { + "key": "Conversation.PrivateChannelTimeLimitedAlertText", + "value": "This channel is private. Please join it to continue viewing its content." + }, + "Conversation.PrivateChannelTimeLimitedAlertTitle": { + "key": "Conversation.PrivateChannelTimeLimitedAlertTitle", + "value": "Join Channel" + }, + "Conversation.PrivateChannelTooltip": { + "key": "Conversation.PrivateChannelTooltip", + "value": "This channel is private" + }, + "Conversation.PrivateMessageLinkCopied": { + "key": "Conversation.PrivateMessageLinkCopied", + "value": "This link will only work for chat members" + }, + "Conversation.Processing": { + "key": "Conversation.Processing", + "value": "Processing..." + }, + "Conversation.Report": { + "key": "Conversation.Report", + "value": "Report Spam" + }, + "Conversation.ReportGroupLocation": { + "key": "Conversation.ReportGroupLocation", + "value": "Group unrelated to location?" + }, + "Conversation.ReportMessages": { + "key": "Conversation.ReportMessages", + "value": "Report Messages" + }, + "Conversation.ReportSpam": { + "key": "Conversation.ReportSpam", + "value": "Report Spam" + }, + "Conversation.ReportSpamAndLeave": { + "key": "Conversation.ReportSpamAndLeave", + "value": "Report Spam and Leave" + }, + "Conversation.ReportSpamChannelConfirmation": { + "key": "Conversation.ReportSpamChannelConfirmation", + "value": "Are you sure you want to report spam from this channel?" + }, + "Conversation.ReportSpamConfirmation": { + "key": "Conversation.ReportSpamConfirmation", + "value": "Are you sure you want to report spam from this user?" + }, + "Conversation.ReportSpamGroupConfirmation": { + "key": "Conversation.ReportSpamGroupConfirmation", + "value": "Are you sure you want to report spam from this group?" + }, + "Conversation.RestrictedInline": { + "key": "Conversation.RestrictedInline", + "value": "The admins of this group have restricted you from posting inline content here." + }, + "Conversation.RestrictedInlineTimed": { + "key": "Conversation.RestrictedInlineTimed", + "value": "The admins of this group have restricted you from posting inline content here until %@." + }, + "Conversation.RestrictedMedia": { + "key": "Conversation.RestrictedMedia", + "value": "The admins of this group have restricted you from posting media content here." + }, + "Conversation.RestrictedMediaTimed": { + "key": "Conversation.RestrictedMediaTimed", + "value": "The admins of this group have restricted you from posting media content here until %@." + }, + "Conversation.RestrictedStickers": { + "key": "Conversation.RestrictedStickers", + "value": "The admins of this group have restricted you from sending stickers." + }, + "Conversation.RestrictedStickersTimed": { + "key": "Conversation.RestrictedStickersTimed", + "value": "The admins of this group have restricted you from posting stickers here until %@." + }, + "Conversation.RestrictedText": { + "key": "Conversation.RestrictedText", + "value": "The admins of this group have restricted you from writing messages." + }, + "Conversation.RestrictedTextTimed": { + "key": "Conversation.RestrictedTextTimed", + "value": "The admins of this group have restricted you from writing messages until %@." + }, + "Conversation.SavedMessages": { + "key": "Conversation.SavedMessages", + "value": "Saved Messages" + }, + "Conversation.ScamWarning": { + "key": "Conversation.ScamWarning", + "value": "⚠️ Warning: Many users reported this account as a scam or a fake account. Please be careful, especially if it asks you for money." + }, + "Conversation.ScheduleMessage.SendOn": { + "key": "Conversation.ScheduleMessage.SendOn", + "value": "Send on %@ at %@" + }, + "Conversation.ScheduleMessage.SendToday": { + "key": "Conversation.ScheduleMessage.SendToday", + "value": "Send today at %@" + }, + "Conversation.ScheduleMessage.SendTomorrow": { + "key": "Conversation.ScheduleMessage.SendTomorrow", + "value": "Send tomorrow at %@" + }, + "Conversation.ScheduleMessage.SendWhenOnline": { + "key": "Conversation.ScheduleMessage.SendWhenOnline", + "value": "Send When Online" + }, + "Conversation.ScheduleMessage.Title": { + "key": "Conversation.ScheduleMessage.Title", + "value": "Schedule Message" + }, + "Conversation.Search": { + "key": "Conversation.Search", + "value": "Search" + }, + "Conversation.SearchByName.Placeholder": { + "key": "Conversation.SearchByName.Placeholder", + "value": "Search Members" + }, + "Conversation.SearchByName.Prefix": { + "key": "Conversation.SearchByName.Prefix", + "value": "from: " + }, + "Conversation.SearchNoResults": { + "key": "Conversation.SearchNoResults", + "value": "No Results" + }, + "Conversation.SearchPlaceholder": { + "key": "Conversation.SearchPlaceholder", + "value": "Search this chat" + }, + "Conversation.SecretChatContextBotAlert": { + "key": "Conversation.SecretChatContextBotAlert", + "value": "Please note that inline bots are provided by third-party developers. For the bot to work, the symbols you type after the bot's username are sent to the respective developer." + }, + "Conversation.SecretLinkPreviewAlert": { + "key": "Conversation.SecretLinkPreviewAlert", + "value": "Would you like to enable extended link previews in Secret Chats? Note that link previews are generated on Telegram servers." + }, + "Conversation.SelectMessages": { + "key": "Conversation.SelectMessages", + "value": "Select Messages" + }, + "Conversation.SelectedMessages": { + "key": "Conversation.SelectedMessages", + "zeroValue": null, + "oneValue": "%@ Selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Selected" + }, + "Conversation.SendDice": { + "key": "Conversation.SendDice", + "value": "Send" + }, + "Conversation.SendMessage": { + "key": "Conversation.SendMessage", + "value": "Send Message" + }, + "Conversation.SendMessage.ScheduleMessage": { + "key": "Conversation.SendMessage.ScheduleMessage", + "value": "Schedule Message" + }, + "Conversation.SendMessage.SendSilently": { + "key": "Conversation.SendMessage.SendSilently", + "value": "Send Without Sound" + }, + "Conversation.SendMessage.SetReminder": { + "key": "Conversation.SendMessage.SetReminder", + "value": "Set a Reminder" + }, + "Conversation.SendMessageErrorFlood": { + "key": "Conversation.SendMessageErrorFlood", + "value": "Sorry, you can only send messages to mutual contacts at the moment." + }, + "Conversation.SendMessageErrorGroupRestricted": { + "key": "Conversation.SendMessageErrorGroupRestricted", + "value": "Sorry, you are currently restricted from posting to public groups." + }, + "Conversation.SendMessageErrorTooMuchScheduled": { + "key": "Conversation.SendMessageErrorTooMuchScheduled", + "value": "Sorry, you can not schedule more than 100 messages." + }, + "Conversation.SendingOptionsTooltip": { + "key": "Conversation.SendingOptionsTooltip", + "value": "Hold this button to schedule your message\nor send it without sound." + }, + "Conversation.SetReminder.RemindOn": { + "key": "Conversation.SetReminder.RemindOn", + "value": "Remind on %@ at %@" + }, + "Conversation.SetReminder.RemindToday": { + "key": "Conversation.SetReminder.RemindToday", + "value": "Remind today at %@" + }, + "Conversation.SetReminder.RemindTomorrow": { + "key": "Conversation.SetReminder.RemindTomorrow", + "value": "Remind tomorrow at %@" + }, + "Conversation.SetReminder.Title": { + "key": "Conversation.SetReminder.Title", + "value": "Set a Reminder" + }, + "Conversation.ShareBotContactConfirmation": { + "key": "Conversation.ShareBotContactConfirmation", + "value": "The bot will know your phone number. This can be useful for integration with other services." + }, + "Conversation.ShareBotContactConfirmationTitle": { + "key": "Conversation.ShareBotContactConfirmationTitle", + "value": "Share Your Phone Number?" + }, + "Conversation.ShareBotLocationConfirmation": { + "key": "Conversation.ShareBotLocationConfirmation", + "value": "This will send your current location to the bot." + }, + "Conversation.ShareBotLocationConfirmationTitle": { + "key": "Conversation.ShareBotLocationConfirmationTitle", + "value": "Share Your Location?" + }, + "Conversation.ShareInlineBotLocationConfirmation": { + "key": "Conversation.ShareInlineBotLocationConfirmation", + "value": "This bot would like to know your location each time you send it a request. This can be used to provide location-specific results." + }, + "Conversation.ShareMyContactInfo": { + "key": "Conversation.ShareMyContactInfo", + "value": "Share My Contact Info" + }, + "Conversation.ShareMyPhoneNumber": { + "key": "Conversation.ShareMyPhoneNumber", + "value": "Share My Phone Number" + }, + "Conversation.ShareMyPhoneNumber.StatusSuccess": { + "key": "Conversation.ShareMyPhoneNumber.StatusSuccess", + "value": "%@ can now see your phone number." + }, + "Conversation.ShareMyPhoneNumberConfirmation": { + "key": "Conversation.ShareMyPhoneNumberConfirmation", + "value": "Do you want to share your phone number %1$@ with %2$@?" + }, + "Conversation.SilentBroadcastTooltipOff": { + "key": "Conversation.SilentBroadcastTooltipOff", + "value": "Members will receive a silent notification" + }, + "Conversation.SilentBroadcastTooltipOn": { + "key": "Conversation.SilentBroadcastTooltipOn", + "value": "Members will be notified when you post" + }, + "Conversation.SlideToCancel": { + "key": "Conversation.SlideToCancel", + "value": "Slide to cancel" + }, + "Conversation.StatusKickedFromChannel": { + "key": "Conversation.StatusKickedFromChannel", + "value": "you were removed from the channel" + }, + "Conversation.StatusKickedFromGroup": { + "key": "Conversation.StatusKickedFromGroup", + "value": "you were removed" + }, + "Conversation.StatusLeftGroup": { + "key": "Conversation.StatusLeftGroup", + "value": "you have left the group" + }, + "Conversation.StatusMembers": { + "key": "Conversation.StatusMembers", + "zeroValue": null, + "oneValue": "1 member", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ members" + }, + "Conversation.StatusOnline": { + "key": "Conversation.StatusOnline", + "zeroValue": null, + "oneValue": "1 online", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ online" + }, + "Conversation.StatusSubscribers": { + "key": "Conversation.StatusSubscribers", + "zeroValue": null, + "oneValue": "%@ subscriber", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ subscribers" + }, + "Conversation.StatusTyping": { + "key": "Conversation.StatusTyping", + "value": "typing" + }, + "Conversation.StopLiveLocation": { + "key": "Conversation.StopLiveLocation", + "value": "Stop Sharing" + }, + "Conversation.StopPoll": { + "key": "Conversation.StopPoll", + "value": "Stop Poll" + }, + "Conversation.StopPollConfirmation": { + "key": "Conversation.StopPollConfirmation", + "value": "Stop Poll" + }, + "Conversation.StopPollConfirmationTitle": { + "key": "Conversation.StopPollConfirmationTitle", + "value": "If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone." + }, + "Conversation.StopQuiz": { + "key": "Conversation.StopQuiz", + "value": "Stop Quiz" + }, + "Conversation.StopQuizConfirmation": { + "key": "Conversation.StopQuizConfirmation", + "value": "Stop Quiz" + }, + "Conversation.StopQuizConfirmationTitle": { + "key": "Conversation.StopQuizConfirmationTitle", + "value": "If you stop this quiz now, nobody will be able to submit answers. This action cannot be undone." + }, + "Conversation.SwipeToReplyHintText": { + "key": "Conversation.SwipeToReplyHintText", + "value": "Swipe left on any message to reply to it." + }, + "Conversation.SwipeToReplyHintTitle": { + "key": "Conversation.SwipeToReplyHintTitle", + "value": "Swipe To Reply" + }, + "Conversation.TapAndHoldToRecord": { + "key": "Conversation.TapAndHoldToRecord", + "value": "Tap and hold to record" + }, + "Conversation.TextCopied": { + "key": "Conversation.TextCopied", + "value": "Text copied to clipboard" + }, + "Conversation.Theme": { + "key": "Conversation.Theme", + "value": "Color Theme" + }, + "Conversation.Timer.Send": { + "key": "Conversation.Timer.Send", + "value": "Send With Timer" + }, + "Conversation.Timer.Title": { + "key": "Conversation.Timer.Title", + "value": "Send With Timer" + }, + "Conversation.TitleComments": { + "key": "Conversation.TitleComments", + "zeroValue": null, + "oneValue": "[%@]Comment", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "[%@]Comments" + }, + "Conversation.TitleCommentsEmpty": { + "key": "Conversation.TitleCommentsEmpty", + "value": "Comments" + }, + "Conversation.TitleCommentsFormat": { + "key": "Conversation.TitleCommentsFormat", + "value": "%1$@ %2$@" + }, + "Conversation.TitleMute": { + "key": "Conversation.TitleMute", + "value": "Mute" + }, + "Conversation.TitleNoComments": { + "key": "Conversation.TitleNoComments", + "value": "Comments" + }, + "Conversation.TitleReplies": { + "key": "Conversation.TitleReplies", + "zeroValue": null, + "oneValue": "[%@]Reply", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "[%@]Replies" + }, + "Conversation.TitleRepliesEmpty": { + "key": "Conversation.TitleRepliesEmpty", + "value": "Replies" + }, + "Conversation.TitleRepliesFormat": { + "key": "Conversation.TitleRepliesFormat", + "value": "%1$@ %2$@" + }, + "Conversation.TitleUnmute": { + "key": "Conversation.TitleUnmute", + "value": "Unmute" + }, + "Conversation.Unarchive": { + "key": "Conversation.Unarchive", + "value": "Unarchive" + }, + "Conversation.UnarchiveDone": { + "key": "Conversation.UnarchiveDone", + "value": "The chat was moved to your main list." + }, + "Conversation.Unblock": { + "key": "Conversation.Unblock", + "value": "Unblock" + }, + "Conversation.UnblockUser": { + "key": "Conversation.UnblockUser", + "value": "Unblock User" + }, + "Conversation.Unmute": { + "key": "Conversation.Unmute", + "value": "Unmute" + }, + "Conversation.Unpin": { + "key": "Conversation.Unpin", + "value": "Unpin" + }, + "Conversation.UnpinMessageAlert": { + "key": "Conversation.UnpinMessageAlert", + "value": "Would you like to unpin this message?" + }, + "Conversation.UnreadMessages": { + "key": "Conversation.UnreadMessages", + "value": "Unread Messages" + }, + "Conversation.UnsupportedMedia": { + "key": "Conversation.UnsupportedMedia", + "value": "This message is not supported by your version of Telegram. Update the app to view: https://telegram.org/update" + }, + "Conversation.UnsupportedMediaPlaceholder": { + "key": "Conversation.UnsupportedMediaPlaceholder", + "value": "This message is not supported by your version of Telegram. Please update to the latest version." + }, + "Conversation.UnvotePoll": { + "key": "Conversation.UnvotePoll", + "value": "Retract Vote" + }, + "Conversation.UpdateTelegram": { + "key": "Conversation.UpdateTelegram", + "value": "UPDATE TELEGRAM" + }, + "Conversation.UploadFileTooLarge": { + "key": "Conversation.UploadFileTooLarge", + "value": "File could not be sent, because it is larger than 2 GB.\n\nYou can send as many files as you like, but each must be smaller than 2 GB." + }, + "Conversation.UsersTooMuchError": { + "key": "Conversation.UsersTooMuchError", + "value": "Sorry, this group is full." + }, + "Conversation.ViewBackground": { + "key": "Conversation.ViewBackground", + "value": "VIEW BACKGROUND" + }, + "Conversation.ViewChannel": { + "key": "Conversation.ViewChannel", + "value": "VIEW CHANNEL" + }, + "Conversation.ViewContactDetails": { + "key": "Conversation.ViewContactDetails", + "value": "VIEW CONTACT" + }, + "Conversation.ViewGroup": { + "key": "Conversation.ViewGroup", + "value": "VIEW GROUP" + }, + "Conversation.ViewMessage": { + "key": "Conversation.ViewMessage", + "value": "VIEW MESSAGE" + }, + "Conversation.ViewReply": { + "key": "Conversation.ViewReply", + "value": "View in Chat" + }, + "Conversation.ViewTheme": { + "key": "Conversation.ViewTheme", + "value": "VIEW THEME" + }, + "Conversation.VoiceChatMediaRecordingRestricted": { + "key": "Conversation.VoiceChatMediaRecordingRestricted", + "value": "Sorry, can't record voice and video messages during a voice chat." + }, + "Conversation.typing": { + "key": "Conversation.typing", + "value": "typing" + }, + "ConversationMedia.Title": { + "key": "ConversationMedia.Title", + "value": "Media" + }, + "ConversationProfile.ErrorCreatingConversation": { + "key": "ConversationProfile.ErrorCreatingConversation", + "value": "An error occurred" + }, + "ConversationProfile.LeaveDeleteAndExit": { + "key": "ConversationProfile.LeaveDeleteAndExit", + "value": "Delete and Exit" + }, + "ConversationProfile.UnknownAddMemberError": { + "key": "ConversationProfile.UnknownAddMemberError", + "value": "An unexpected error has occurred. Our wizards have been notified and will fix the problem soon. Sorry." + }, + "ConversationProfile.UsersTooMuchError": { + "key": "ConversationProfile.UsersTooMuchError", + "value": "Sorry, this group is full. You cannot add any more members here." + }, + "ConvertToSupergroup.HelpText": { + "key": "ConvertToSupergroup.HelpText", + "value": "• New members can see the full message history\n• Deleted messages will disappear for all members\n• Admins can add a description to the group\n• Creator can set a public link for the group" + }, + "ConvertToSupergroup.HelpTitle": { + "key": "ConvertToSupergroup.HelpTitle", + "value": "**In supergroups:**" + }, + "ConvertToSupergroup.Note": { + "key": "ConvertToSupergroup.Note", + "value": "**Note**: this action can't be undone." + }, + "ConvertToSupergroup.Title": { + "key": "ConvertToSupergroup.Title", + "value": "Supergroup" + }, + "Core.ServiceUserStatus": { + "key": "Core.ServiceUserStatus", + "value": "service notifications" + }, + "Coub.TapForSound": { + "key": "Coub.TapForSound", + "value": "Tap for sound" + }, + "CreateGroup.ChannelsTooMuch": { + "key": "CreateGroup.ChannelsTooMuch", + "value": "Sorry, you are a member of too many groups and channels. Please leave some before creating a new one." + }, + "CreateGroup.ErrorLocatedGroupsTooMuch": { + "key": "CreateGroup.ErrorLocatedGroupsTooMuch", + "value": "Sorry, you have too many location-based groups already. Please delete one of your existing ones first." + }, + "CreateGroup.SoftUserLimitAlert": { + "key": "CreateGroup.SoftUserLimitAlert", + "value": "You will be able to add more members after you create the group." + }, + "CreatePoll.AddMoreOptions": { + "key": "CreatePoll.AddMoreOptions", + "zeroValue": null, + "oneValue": "You can add 1 more option.", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "You can add %@ more options." + }, + "CreatePoll.AddOption": { + "key": "CreatePoll.AddOption", + "value": "Add an Option" + }, + "CreatePoll.AllOptionsAdded": { + "key": "CreatePoll.AllOptionsAdded", + "value": "You have added the maximum number of options." + }, + "CreatePoll.Anonymous": { + "key": "CreatePoll.Anonymous", + "value": "Anonymous Voting" + }, + "CreatePoll.CancelConfirmation": { + "key": "CreatePoll.CancelConfirmation", + "value": "Do you want to discard this poll?" + }, + "CreatePoll.Create": { + "key": "CreatePoll.Create", + "value": "Send" + }, + "CreatePoll.Explanation": { + "key": "CreatePoll.Explanation", + "value": "Add a Comment (Optional)" + }, + "CreatePoll.ExplanationHeader": { + "key": "CreatePoll.ExplanationHeader", + "value": "EXPLANATION" + }, + "CreatePoll.ExplanationInfo": { + "key": "CreatePoll.ExplanationInfo", + "value": "Users will see this comment after choosing a wrong answer, good for educational purposes." + }, + "CreatePoll.MultipleChoice": { + "key": "CreatePoll.MultipleChoice", + "value": "Multiple Answers" + }, + "CreatePoll.MultipleChoiceQuizAlert": { + "key": "CreatePoll.MultipleChoiceQuizAlert", + "value": "Polls in quiz mode can have only one correct answer." + }, + "CreatePoll.OptionPlaceholder": { + "key": "CreatePoll.OptionPlaceholder", + "value": "Option" + }, + "CreatePoll.OptionsHeader": { + "key": "CreatePoll.OptionsHeader", + "value": "POLL OPTIONS" + }, + "CreatePoll.Quiz": { + "key": "CreatePoll.Quiz", + "value": "Quiz Mode" + }, + "CreatePoll.QuizInfo": { + "key": "CreatePoll.QuizInfo", + "value": "Polls in Quiz Mode have one correct answer. Users can't revoke their answers." + }, + "CreatePoll.QuizOptionsHeader": { + "key": "CreatePoll.QuizOptionsHeader", + "value": "QUIZ OPTIONS" + }, + "CreatePoll.QuizTip": { + "key": "CreatePoll.QuizTip", + "value": "Tap to choose the correct answer" + }, + "CreatePoll.QuizTitle": { + "key": "CreatePoll.QuizTitle", + "value": "New Quiz" + }, + "CreatePoll.TextHeader": { + "key": "CreatePoll.TextHeader", + "value": "QUESTION" + }, + "CreatePoll.TextPlaceholder": { + "key": "CreatePoll.TextPlaceholder", + "value": "Ask a question" + }, + "CreatePoll.Title": { + "key": "CreatePoll.Title", + "value": "New Poll" + }, + "DataUpgrade.Running": { + "key": "DataUpgrade.Running", + "value": "Optimizing..." + }, + "Date.ChatDateHeader": { + "key": "Date.ChatDateHeader", + "value": "%1$@ %2$@" + }, + "Date.ChatDateHeaderYear": { + "key": "Date.ChatDateHeaderYear", + "value": "%1$@ %2$@, %3$@" + }, + "Date.DialogDateFormat": { + "key": "Date.DialogDateFormat", + "value": "{month} {day}" + }, + "DialogList.AdLabel": { + "key": "DialogList.AdLabel", + "value": "Proxy Sponsor" + }, + "DialogList.AdNoticeAlert": { + "key": "DialogList.AdNoticeAlert", + "value": "This channel is shown by your proxy server. To remove this channel from your chat list, disable the proxy in Telegram Settings." + }, + "DialogList.AwaitingEncryption": { + "key": "DialogList.AwaitingEncryption", + "value": "Waiting for %@ to get online..." + }, + "DialogList.ClearHistoryConfirmation": { + "key": "DialogList.ClearHistoryConfirmation", + "value": "Clear History" + }, + "DialogList.DeleteBotConfirmation": { + "key": "DialogList.DeleteBotConfirmation", + "value": "Delete" + }, + "DialogList.DeleteBotConversationConfirmation": { + "key": "DialogList.DeleteBotConversationConfirmation", + "value": "Delete and Stop" + }, + "DialogList.DeleteConversationConfirmation": { + "key": "DialogList.DeleteConversationConfirmation", + "value": "Delete and Exit" + }, + "DialogList.Draft": { + "key": "DialogList.Draft", + "value": "Draft" + }, + "DialogList.EncryptedChatStartedIncoming": { + "key": "DialogList.EncryptedChatStartedIncoming", + "value": "%@ created a secret chat." + }, + "DialogList.EncryptedChatStartedOutgoing": { + "key": "DialogList.EncryptedChatStartedOutgoing", + "value": "%@ joined your secret chat." + }, + "DialogList.EncryptionProcessing": { + "key": "DialogList.EncryptionProcessing", + "value": "Exchanging encryption keys..." + }, + "DialogList.EncryptionRejected": { + "key": "DialogList.EncryptionRejected", + "value": "Secret chat cancelled" + }, + "DialogList.LanguageTooltip": { + "key": "DialogList.LanguageTooltip", + "value": "You can change your language later in Settings" + }, + "DialogList.LiveLocationChatsCount": { + "key": "DialogList.LiveLocationChatsCount", + "zeroValue": null, + "oneValue": "sharing with 1 chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "sharing with %@ chats" + }, + "DialogList.LiveLocationSharingTo": { + "key": "DialogList.LiveLocationSharingTo", + "value": "sharing with %@" + }, + "DialogList.MultipleTyping": { + "key": "DialogList.MultipleTyping", + "value": "%@ and %@" + }, + "DialogList.MultipleTypingPair": { + "key": "DialogList.MultipleTypingPair", + "value": "%@ and %@ are typing" + }, + "DialogList.MultipleTypingSuffix": { + "key": "DialogList.MultipleTypingSuffix", + "value": "%d are typing" + }, + "DialogList.NoMessagesText": { + "key": "DialogList.NoMessagesText", + "value": "Start messaging by tapping the pencil button in the top right corner or go to the Contacts section." + }, + "DialogList.NoMessagesTitle": { + "key": "DialogList.NoMessagesTitle", + "value": "You have no conversations yet" + }, + "DialogList.PasscodeLockHelp": { + "key": "DialogList.PasscodeLockHelp", + "value": "Tap to lock Telegram" + }, + "DialogList.Pin": { + "key": "DialogList.Pin", + "value": "Pin" + }, + "DialogList.PinLimitError": { + "key": "DialogList.PinLimitError", + "value": "Sorry, you can pin no more than %@ chats to the top." + }, + "DialogList.ProxyConnectionIssuesTooltip": { + "key": "DialogList.ProxyConnectionIssuesTooltip", + "value": "Can't connect to your preferred proxy.\nTap to change settings." + }, + "DialogList.Read": { + "key": "DialogList.Read", + "value": "Read" + }, + "DialogList.RecentTitlePeople": { + "key": "DialogList.RecentTitlePeople", + "value": "People" + }, + "DialogList.Replies": { + "key": "DialogList.Replies", + "value": "Replies" + }, + "DialogList.SavedMessages": { + "key": "DialogList.SavedMessages", + "value": "Saved Messages" + }, + "DialogList.SavedMessagesHelp": { + "key": "DialogList.SavedMessagesHelp", + "value": "Forward messages here for quick access" + }, + "DialogList.SavedMessagesTooltip": { + "key": "DialogList.SavedMessagesTooltip", + "value": "You can find your Saved Messages in Settings" + }, + "DialogList.SearchLabel": { + "key": "DialogList.SearchLabel", + "value": "Search for messages or users" + }, + "DialogList.SearchSectionChats": { + "key": "DialogList.SearchSectionChats", + "value": "Chats" + }, + "DialogList.SearchSectionDialogs": { + "key": "DialogList.SearchSectionDialogs", + "value": "Chats and Contacts" + }, + "DialogList.SearchSectionGlobal": { + "key": "DialogList.SearchSectionGlobal", + "value": "Global Search" + }, + "DialogList.SearchSectionMessages": { + "key": "DialogList.SearchSectionMessages", + "value": "Messages" + }, + "DialogList.SearchSectionRecent": { + "key": "DialogList.SearchSectionRecent", + "value": "Recent" + }, + "DialogList.SearchSubtitleFormat": { + "key": "DialogList.SearchSubtitleFormat", + "value": "%1$@, %2$@" + }, + "DialogList.SinglePlayingGameSuffix": { + "key": "DialogList.SinglePlayingGameSuffix", + "value": "%@ is playing a game" + }, + "DialogList.SingleRecordingAudioSuffix": { + "key": "DialogList.SingleRecordingAudioSuffix", + "value": "%@ is recording" + }, + "DialogList.SingleRecordingVideoMessageSuffix": { + "key": "DialogList.SingleRecordingVideoMessageSuffix", + "value": "%@ is recording video" + }, + "DialogList.SingleTypingSuffix": { + "key": "DialogList.SingleTypingSuffix", + "value": "%@ is typing" + }, + "DialogList.SingleUploadingFileSuffix": { + "key": "DialogList.SingleUploadingFileSuffix", + "value": "%@ is sending a file" + }, + "DialogList.SingleUploadingPhotoSuffix": { + "key": "DialogList.SingleUploadingPhotoSuffix", + "value": "%@ is sending a photo" + }, + "DialogList.SingleUploadingVideoSuffix": { + "key": "DialogList.SingleUploadingVideoSuffix", + "value": "%@ is sending video" + }, + "DialogList.TabTitle": { + "key": "DialogList.TabTitle", + "value": "Chats" + }, + "DialogList.Title": { + "key": "DialogList.Title", + "value": "Chats" + }, + "DialogList.Typing": { + "key": "DialogList.Typing", + "value": "typing" + }, + "DialogList.UnknownPinLimitError": { + "key": "DialogList.UnknownPinLimitError", + "value": "Sorry, you can't pin any more chats to the top." + }, + "DialogList.Unpin": { + "key": "DialogList.Unpin", + "value": "Unpin" + }, + "DialogList.Unread": { + "key": "DialogList.Unread", + "value": "Unread" + }, + "DialogList.You": { + "key": "DialogList.You", + "value": "You" + }, + "Document.TargetConfirmationFormat": { + "key": "Document.TargetConfirmationFormat", + "value": "Send file ({size}) to {target}?" + }, + "DownloadingStatus": { + "key": "DownloadingStatus", + "value": "downloading %@ of %@" + }, + "ENCRYPTED_MESSAGE": { + "key": "ENCRYPTED_MESSAGE", + "value": "You have a new message%1$@" + }, + "ENCRYPTION_ACCEPT": { + "key": "ENCRYPTION_ACCEPT", + "value": "Your secret chat was accepted%1$@" + }, + "ENCRYPTION_REQUEST": { + "key": "ENCRYPTION_REQUEST", + "value": "New secret chat request%1$@" + }, + "EditProfile.NameAndPhotoHelp": { + "key": "EditProfile.NameAndPhotoHelp", + "value": "Enter your name and add an optional profile photo." + }, + "EditProfile.NameAndPhotoOrVideoHelp": { + "key": "EditProfile.NameAndPhotoOrVideoHelp", + "value": "Enter your name and add an optional profile photo or video." + }, + "EditProfile.Title": { + "key": "EditProfile.Title", + "value": "Edit Profile" + }, + "EditTheme.ChangeColors": { + "key": "EditTheme.ChangeColors", + "value": "Change Colors" + }, + "EditTheme.Create.BottomInfo": { + "key": "EditTheme.Create.BottomInfo", + "value": "You can also use a manually edited custom theme file." + }, + "EditTheme.Create.Preview.IncomingReplyName": { + "key": "EditTheme.Create.Preview.IncomingReplyName", + "value": "Bob" + }, + "EditTheme.Create.Preview.IncomingReplyText": { + "key": "EditTheme.Create.Preview.IncomingReplyText", + "value": "How does it work?" + }, + "EditTheme.Create.Preview.IncomingText": { + "key": "EditTheme.Create.Preview.IncomingText", + "value": "Use your current colors" + }, + "EditTheme.Create.Preview.OutgoingText": { + "key": "EditTheme.Create.Preview.OutgoingText", + "value": "Or upload a theme file" + }, + "EditTheme.Create.TopInfo": { + "key": "EditTheme.Create.TopInfo", + "value": "The theme will be based on your currently selected colors and wallpaper." + }, + "EditTheme.CreateTitle": { + "key": "EditTheme.CreateTitle", + "value": "Create Theme" + }, + "EditTheme.Edit.BottomInfo": { + "key": "EditTheme.Edit.BottomInfo", + "value": "You can select a new file to update the theme. It will be updated for all users." + }, + "EditTheme.Edit.Preview.IncomingReplyName": { + "key": "EditTheme.Edit.Preview.IncomingReplyName", + "value": "Bob" + }, + "EditTheme.Edit.Preview.IncomingReplyText": { + "key": "EditTheme.Edit.Preview.IncomingReplyText", + "value": "How does it work?" + }, + "EditTheme.Edit.Preview.IncomingText": { + "key": "EditTheme.Edit.Preview.IncomingText", + "value": "Use your current colors" + }, + "EditTheme.Edit.Preview.OutgoingText": { + "key": "EditTheme.Edit.Preview.OutgoingText", + "value": "Or upload a theme file" + }, + "EditTheme.Edit.TopInfo": { + "key": "EditTheme.Edit.TopInfo", + "value": "Your theme will be updated for all users each time you change it. Anyone can install it using this link.\n\nTheme links must be at least **5** characters long and can use **a-z**, **0-9** and underscores." + }, + "EditTheme.EditTitle": { + "key": "EditTheme.EditTitle", + "value": "Edit Theme" + }, + "EditTheme.ErrorInvalidCharacters": { + "key": "EditTheme.ErrorInvalidCharacters", + "value": "Sorry, this link is invalid." + }, + "EditTheme.ErrorLinkTaken": { + "key": "EditTheme.ErrorLinkTaken", + "value": "Sorry, this link is already taken" + }, + "EditTheme.Expand.BottomInfo": { + "key": "EditTheme.Expand.BottomInfo", + "value": "You can also use a manually edited custom theme file." + }, + "EditTheme.Expand.Preview.IncomingReplyName": { + "key": "EditTheme.Expand.Preview.IncomingReplyName", + "value": "Bob" + }, + "EditTheme.Expand.Preview.IncomingReplyText": { + "key": "EditTheme.Expand.Preview.IncomingReplyText", + "value": "How does it work?" + }, + "EditTheme.Expand.Preview.IncomingText": { + "key": "EditTheme.Expand.Preview.IncomingText", + "value": "Use your current colors" + }, + "EditTheme.Expand.Preview.OutgoingText": { + "key": "EditTheme.Expand.Preview.OutgoingText", + "value": "Or upload a theme file" + }, + "EditTheme.Expand.TopInfo": { + "key": "EditTheme.Expand.TopInfo", + "value": "The theme will be based on your currently selected colors and wallpaper." + }, + "EditTheme.FileReadError": { + "key": "EditTheme.FileReadError", + "value": "Invalid theme file" + }, + "EditTheme.Preview": { + "key": "EditTheme.Preview", + "value": "CHAT PREVIEW" + }, + "EditTheme.ShortLink": { + "key": "EditTheme.ShortLink", + "value": "link" + }, + "EditTheme.ShortLinkInfo": { + "key": "EditTheme.ShortLinkInfo", + "value": "Your theme will be updated for all users each time you change it. Anyone can install it using this link.\n\nTheme links must be longer than 5 characters and can use a-z, 0-9 and underscores." + }, + "EditTheme.ThemeTemplateAlert": { + "key": "EditTheme.ThemeTemplateAlert", + "value": "New Theme Added\n\nPress and hold on your theme to edit it or get a sharing link. Users who install your theme will get automatic updates each time you change it.\n\nFor advanced editing purposes, you can find a file with your theme in Saved Messages." + }, + "EditTheme.ThemeTemplateAlertText": { + "key": "EditTheme.ThemeTemplateAlertText", + "value": "Press and hold on your theme to edit it or get a sharing link. Users who install your theme will get automatic updates each time you change it.\n\nFor advanced editing purposes, you can find a file with your theme in Saved Messages." + }, + "EditTheme.ThemeTemplateAlertTitle": { + "key": "EditTheme.ThemeTemplateAlertTitle", + "value": "New Theme Added" + }, + "EditTheme.Title": { + "key": "EditTheme.Title", + "value": "Theme Name" + }, + "EditTheme.UploadEditedInfo": { + "key": "EditTheme.UploadEditedInfo", + "value": "You can update your theme for all users by uploading manual changes from a file." + }, + "EditTheme.UploadEditedTheme": { + "key": "EditTheme.UploadEditedTheme", + "value": "Update from File..." + }, + "EditTheme.UploadNewInfo": { + "key": "EditTheme.UploadNewInfo", + "value": "The theme will be based on your currently selected colors and wallpaper. Alternatively, you can use a manually edited custom theme file." + }, + "EditTheme.UploadNewTheme": { + "key": "EditTheme.UploadNewTheme", + "value": "Create from File..." + }, + "Embed.PlayingInPIP": { + "key": "Embed.PlayingInPIP", + "value": "This video is playing in Picture in Picture" + }, + "EmptyGroupInfo.Line1": { + "key": "EmptyGroupInfo.Line1", + "value": "Up to 200,000 members" + }, + "EmptyGroupInfo.Line2": { + "key": "EmptyGroupInfo.Line2", + "value": "Persistent chat history" + }, + "EmptyGroupInfo.Line3": { + "key": "EmptyGroupInfo.Line3", + "value": "Public links such as t.me/title" + }, + "EmptyGroupInfo.Line4": { + "key": "EmptyGroupInfo.Line4", + "value": "Admins with different rights" + }, + "EmptyGroupInfo.Subtitle": { + "key": "EmptyGroupInfo.Subtitle", + "value": "Groups can have:" + }, + "EmptyGroupInfo.Title": { + "key": "EmptyGroupInfo.Title", + "value": "You have created a group" + }, + "EncryptionKey.Description": { + "key": "EncryptionKey.Description", + "value": "This image and text were derived from the encryption key for this secret chat with %1$@.\n\nIf they look the same on %2$@'s device, end-to-end encryption is guaranteed.\n\nLearn more at telegram.org" + }, + "EncryptionKey.Title": { + "key": "EncryptionKey.Title", + "value": "Encryption Key" + }, + "EnterPasscode.ChangeTitle": { + "key": "EnterPasscode.ChangeTitle", + "value": "Change Passcode" + }, + "EnterPasscode.EnterCurrentPasscode": { + "key": "EnterPasscode.EnterCurrentPasscode", + "value": "Enter your current passcode" + }, + "EnterPasscode.EnterNewPasscodeChange": { + "key": "EnterPasscode.EnterNewPasscodeChange", + "value": "Enter your new passcode" + }, + "EnterPasscode.EnterNewPasscodeNew": { + "key": "EnterPasscode.EnterNewPasscodeNew", + "value": "Enter a passcode" + }, + "EnterPasscode.EnterPasscode": { + "key": "EnterPasscode.EnterPasscode", + "value": "Enter your Telegram Passcode" + }, + "EnterPasscode.EnterTitle": { + "key": "EnterPasscode.EnterTitle", + "value": "Enter your Telegram Passcode" + }, + "EnterPasscode.RepeatNewPasscode": { + "key": "EnterPasscode.RepeatNewPasscode", + "value": "Re-enter your new passcode" + }, + "EnterPasscode.TouchId": { + "key": "EnterPasscode.TouchId", + "value": "Unlock Telegram" + }, + "Exceptions.AddToExceptions": { + "key": "Exceptions.AddToExceptions", + "value": "ADD TO EXCEPTIONS" + }, + "ExplicitContent.AlertChannel": { + "key": "ExplicitContent.AlertChannel", + "value": "You can't access this channel because it violates App Store rules." + }, + "ExplicitContent.AlertTitle": { + "key": "ExplicitContent.AlertTitle", + "value": "Sorry" + }, + "External.OpenIn": { + "key": "External.OpenIn", + "value": "Open in %@" + }, + "FastTwoStepSetup.EmailHelp": { + "key": "FastTwoStepSetup.EmailHelp", + "value": "Please add a valid email address. It is the only way to recover a forgotten password." + }, + "FastTwoStepSetup.EmailPlaceholder": { + "key": "FastTwoStepSetup.EmailPlaceholder", + "value": "Your email" + }, + "FastTwoStepSetup.EmailSection": { + "key": "FastTwoStepSetup.EmailSection", + "value": "RECOVERY EMAIL" + }, + "FastTwoStepSetup.HintHelp": { + "key": "FastTwoStepSetup.HintHelp", + "value": "You can create an optional hint for your password." + }, + "FastTwoStepSetup.HintPlaceholder": { + "key": "FastTwoStepSetup.HintPlaceholder", + "value": "Add a hint" + }, + "FastTwoStepSetup.HintSection": { + "key": "FastTwoStepSetup.HintSection", + "value": "HINT" + }, + "FastTwoStepSetup.PasswordConfirmationPlaceholder": { + "key": "FastTwoStepSetup.PasswordConfirmationPlaceholder", + "value": "Re-enter your password" + }, + "FastTwoStepSetup.PasswordHelp": { + "key": "FastTwoStepSetup.PasswordHelp", + "value": "Please create a password to protect your payment info. You'll be asked to enter it when you log in." + }, + "FastTwoStepSetup.PasswordPlaceholder": { + "key": "FastTwoStepSetup.PasswordPlaceholder", + "value": "Enter a password" + }, + "FastTwoStepSetup.PasswordSection": { + "key": "FastTwoStepSetup.PasswordSection", + "value": "PASSWORD" + }, + "FastTwoStepSetup.Title": { + "key": "FastTwoStepSetup.Title", + "value": "Password & Email" + }, + "FeatureDisabled.Oops": { + "key": "FeatureDisabled.Oops", + "value": "Oops" + }, + "FeaturedStickerPacks.Title": { + "key": "FeaturedStickerPacks.Title", + "value": "Trending Stickers" + }, + "FeaturedStickers.OtherSection": { + "key": "FeaturedStickers.OtherSection", + "value": "OTHER STICKERS" + }, + "FileSize.B": { + "key": "FileSize.B", + "value": "%@ B" + }, + "FileSize.GB": { + "key": "FileSize.GB", + "value": "%@ GB" + }, + "FileSize.KB": { + "key": "FileSize.KB", + "value": "%@ KB" + }, + "FileSize.MB": { + "key": "FileSize.MB", + "value": "%@ MB" + }, + "Forward.ChannelReadOnly": { + "key": "Forward.ChannelReadOnly", + "value": "Sorry, you can't post to this channel." + }, + "Forward.ConfirmMultipleFiles": { + "key": "Forward.ConfirmMultipleFiles", + "zeroValue": null, + "oneValue": "Send 1 file to {target}?", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ files to {target}?" + }, + "Forward.ErrorDisabledForChat": { + "key": "Forward.ErrorDisabledForChat", + "value": "Sorry, you can't forward messages to this chat." + }, + "Forward.ErrorPublicPollDisabledInChannels": { + "key": "Forward.ErrorPublicPollDisabledInChannels", + "value": "Sorry, polls with visible votes can’t be forwarded to channels." + }, + "Forward.ErrorPublicQuizDisabledInChannels": { + "key": "Forward.ErrorPublicQuizDisabledInChannels", + "value": "Sorry, polls with visible votes can’t be forwarded to channels." + }, + "ForwardedAudios": { + "key": "ForwardedAudios", + "zeroValue": null, + "oneValue": "Forwarded voice message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded voice messages" + }, + "ForwardedAuthors2": { + "key": "ForwardedAuthors2", + "value": "%@, %@" + }, + "ForwardedAuthorsOthers": { + "key": "ForwardedAuthorsOthers", + "zeroValue": null, + "oneValue": "%@ and 1 other", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ and %@ others" + }, + "ForwardedContacts": { + "key": "ForwardedContacts", + "zeroValue": null, + "oneValue": "Forwarded contact", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded contacts" + }, + "ForwardedDices": { + "key": "ForwardedDices", + "zeroValue": null, + "oneValue": "Forwarded dice", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded dices" + }, + "ForwardedFiles": { + "key": "ForwardedFiles", + "zeroValue": null, + "oneValue": "Forwarded file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded files" + }, + "ForwardedGifs": { + "key": "ForwardedGifs", + "zeroValue": null, + "oneValue": "Forwarded GIF", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded GIFs" + }, + "ForwardedLocations": { + "key": "ForwardedLocations", + "zeroValue": null, + "oneValue": "Forwarded location", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded locations" + }, + "ForwardedMessages": { + "key": "ForwardedMessages", + "zeroValue": null, + "oneValue": "Forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded messages" + }, + "ForwardedPhotos": { + "key": "ForwardedPhotos", + "zeroValue": null, + "oneValue": "Forwarded photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded photos" + }, + "ForwardedPolls": { + "key": "ForwardedPolls", + "zeroValue": null, + "oneValue": "Forwarded poll", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded polls" + }, + "ForwardedStickers": { + "key": "ForwardedStickers", + "zeroValue": null, + "oneValue": "Forwarded sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded stickers" + }, + "ForwardedVideoMessages": { + "key": "ForwardedVideoMessages", + "zeroValue": null, + "oneValue": "Forwarded video message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded video messages" + }, + "ForwardedVideos": { + "key": "ForwardedVideos", + "zeroValue": null, + "oneValue": "Forwarded video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ forwarded videos" + }, + "Generic.ErrorMoreInfo": { + "key": "Generic.ErrorMoreInfo", + "value": "More Info" + }, + "Generic.OpenHiddenLinkAlert": { + "key": "Generic.OpenHiddenLinkAlert", + "value": "Open %@?" + }, + "Gif.NoGifsFound": { + "key": "Gif.NoGifsFound", + "value": "No GIFs Found" + }, + "Gif.NoGifsPlaceholder": { + "key": "Gif.NoGifsPlaceholder", + "value": "No Saved GIFs" + }, + "Gif.Search": { + "key": "Gif.Search", + "value": "Search GIFs" + }, + "Group.About.Help": { + "key": "Group.About.Help", + "value": "You can provide an optional description for your group." + }, + "Group.AdminLog.EmptyText": { + "key": "Group.AdminLog.EmptyText", + "value": "No service actions were taken by the group's members and admins in the last 48 hours." + }, + "Group.DeleteGroup": { + "key": "Group.DeleteGroup", + "value": "Delete Group" + }, + "Group.EditAdmin.PermissionChangeInfo": { + "key": "Group.EditAdmin.PermissionChangeInfo", + "value": "Change Group Info" + }, + "Group.EditAdmin.RankAdminPlaceholder": { + "key": "Group.EditAdmin.RankAdminPlaceholder", + "value": "admin" + }, + "Group.EditAdmin.RankInfo": { + "key": "Group.EditAdmin.RankInfo", + "value": "A title that will be shown instead of '%@'." + }, + "Group.EditAdmin.RankOwnerPlaceholder": { + "key": "Group.EditAdmin.RankOwnerPlaceholder", + "value": "owner" + }, + "Group.EditAdmin.RankTitle": { + "key": "Group.EditAdmin.RankTitle", + "value": "CUSTOM TITLE" + }, + "Group.EditAdmin.TransferOwnership": { + "key": "Group.EditAdmin.TransferOwnership", + "value": "Transfer Group Ownership" + }, + "Group.ErrorAccessDenied": { + "key": "Group.ErrorAccessDenied", + "value": "Sorry, this group is private." + }, + "Group.ErrorAddBlocked": { + "key": "Group.ErrorAddBlocked", + "value": "Sorry, you can't add this user to groups." + }, + "Group.ErrorAddTooMuchAdmins": { + "key": "Group.ErrorAddTooMuchAdmins", + "value": "Sorry, you've reached the maximum number of admins for this group." + }, + "Group.ErrorAddTooMuchBots": { + "key": "Group.ErrorAddTooMuchBots", + "value": "Sorry, you've reached the maximum number of bots for this group." + }, + "Group.ErrorAdminsTooMuch": { + "key": "Group.ErrorAdminsTooMuch", + "value": "Sorry, too many administrators in this group." + }, + "Group.ErrorNotMutualContact": { + "key": "Group.ErrorNotMutualContact", + "value": "Sorry, you can only add mutual contacts to groups at the moment." + }, + "Group.ErrorSendRestrictedMedia": { + "key": "Group.ErrorSendRestrictedMedia", + "value": "Sorry, the admins of this group have restricted you from sending media." + }, + "Group.ErrorSendRestrictedStickers": { + "key": "Group.ErrorSendRestrictedStickers", + "value": "Sorry, the admins of this group have restricted you from sending stickers." + }, + "Group.ErrorSupergroupConversionNotPossible": { + "key": "Group.ErrorSupergroupConversionNotPossible", + "value": "Sorry, you are a member of too many groups and channels. Please leave some before creating a new one." + }, + "Group.GroupMembersHeader": { + "key": "Group.GroupMembersHeader", + "value": "GROUP MEMBERS" + }, + "Group.Info.AdminLog": { + "key": "Group.Info.AdminLog", + "value": "Recent Actions" + }, + "Group.Info.Members": { + "key": "Group.Info.Members", + "value": "Members" + }, + "Group.LeaveGroup": { + "key": "Group.LeaveGroup", + "value": "Leave Group" + }, + "Group.LinkedChannel": { + "key": "Group.LinkedChannel", + "value": "Linked Channel" + }, + "Group.Location.ChangeLocation": { + "key": "Group.Location.ChangeLocation", + "value": "Change Location" + }, + "Group.Location.CreateInThisPlace": { + "key": "Group.Location.CreateInThisPlace", + "value": "Create a group in this place" + }, + "Group.Location.Info": { + "key": "Group.Location.Info", + "value": "People can find your group using People Nearby section." + }, + "Group.Location.Title": { + "key": "Group.Location.Title", + "value": "Location" + }, + "Group.Management.AddModeratorHelp": { + "key": "Group.Management.AddModeratorHelp", + "value": "You can add admins to help you manage your group." + }, + "Group.Members.AddMemberBotErrorNotAllowed": { + "key": "Group.Members.AddMemberBotErrorNotAllowed", + "value": "Sorry, you don't have the necessary permissions to add bots to this group." + }, + "Group.Members.AddMembers": { + "key": "Group.Members.AddMembers", + "value": "Add Members" + }, + "Group.Members.AddMembersHelp": { + "key": "Group.Members.AddMembersHelp", + "value": "Only group admins can see this list." + }, + "Group.Members.Title": { + "key": "Group.Members.Title", + "value": "Members" + }, + "Group.MessagePhotoRemoved": { + "key": "Group.MessagePhotoRemoved", + "value": "Group photo removed" + }, + "Group.MessagePhotoUpdated": { + "key": "Group.MessagePhotoUpdated", + "value": "Group photo updated" + }, + "Group.MessageVideoUpdated": { + "key": "Group.MessageVideoUpdated", + "value": "Group video updated" + }, + "Group.OwnershipTransfer.DescriptionInfo": { + "key": "Group.OwnershipTransfer.DescriptionInfo", + "value": "This will transfer the full **owner rights** for **%1$@** to **%2$@**.\n\nYou will no longer be considered the creator of the group. The new owner will be free to remove any of your admin privileges or even ban you." + }, + "Group.OwnershipTransfer.ErrorAdminsTooMuch": { + "key": "Group.OwnershipTransfer.ErrorAdminsTooMuch", + "value": "Sorry, this group has too many admins and the new owner can't be added. Please remove one of the existing admins first." + }, + "Group.OwnershipTransfer.ErrorLocatedGroupsTooMuch": { + "key": "Group.OwnershipTransfer.ErrorLocatedGroupsTooMuch", + "value": "Sorry, the target user owns too many location-based groups. Please ask them to delete or transfer an existing one first." + }, + "Group.OwnershipTransfer.ErrorPrivacyRestricted": { + "key": "Group.OwnershipTransfer.ErrorPrivacyRestricted", + "value": "Sorry, this user is not a member of this group and their privacy settings prevent you from adding them manually." + }, + "Group.OwnershipTransfer.Title": { + "key": "Group.OwnershipTransfer.Title", + "value": "Transfer Group Ownership" + }, + "Group.PublicLink.Info": { + "key": "Group.PublicLink.Info", + "value": "People can share this link with others and find your group using Telegram search.\n\nYou can use **a-z**, **0-9** and underscores. Minimum length is **5** characters." + }, + "Group.PublicLink.Placeholder": { + "key": "Group.PublicLink.Placeholder", + "value": "link" + }, + "Group.PublicLink.Title": { + "key": "Group.PublicLink.Title", + "value": "Public Link" + }, + "Group.Setup.BasicHistoryHiddenHelp": { + "key": "Group.Setup.BasicHistoryHiddenHelp", + "value": "New members won't see more than 100 previous messages." + }, + "Group.Setup.HistoryHeader": { + "key": "Group.Setup.HistoryHeader", + "value": "CHAT HISTORY FOR NEW MEMBERS" + }, + "Group.Setup.HistoryHidden": { + "key": "Group.Setup.HistoryHidden", + "value": "Hidden" + }, + "Group.Setup.HistoryHiddenHelp": { + "key": "Group.Setup.HistoryHiddenHelp", + "value": "New members won't see earlier messages." + }, + "Group.Setup.HistoryTitle": { + "key": "Group.Setup.HistoryTitle", + "value": "Chat History Settings" + }, + "Group.Setup.HistoryVisible": { + "key": "Group.Setup.HistoryVisible", + "value": "Visible" + }, + "Group.Setup.HistoryVisibleHelp": { + "key": "Group.Setup.HistoryVisibleHelp", + "value": "New members will see messages that were sent before they joined." + }, + "Group.Setup.TypeHeader": { + "key": "Group.Setup.TypeHeader", + "value": "GROUP TYPE" + }, + "Group.Setup.TypePrivate": { + "key": "Group.Setup.TypePrivate", + "value": "Private" + }, + "Group.Setup.TypePrivateHelp": { + "key": "Group.Setup.TypePrivateHelp", + "value": "Private groups can only be joined if you were invited or have an invite link." + }, + "Group.Setup.TypePublic": { + "key": "Group.Setup.TypePublic", + "value": "Public" + }, + "Group.Setup.TypePublicHelp": { + "key": "Group.Setup.TypePublicHelp", + "value": "Public groups can be found in search, chat history is available to everyone and anyone can join." + }, + "Group.Status": { + "key": "Group.Status", + "value": "group" + }, + "Group.UpgradeConfirmation": { + "key": "Group.UpgradeConfirmation", + "value": "Warning: this action is irreversible. It is not possible to downgrade a supergroup to a regular group." + }, + "Group.UpgradeNoticeHeader": { + "key": "Group.UpgradeNoticeHeader", + "value": "MEMBERS LIMIT REACHED" + }, + "Group.UpgradeNoticeText1": { + "key": "Group.UpgradeNoticeText1", + "value": "To go over the limit and get additional features, upgrade to a supergroup:" + }, + "Group.UpgradeNoticeText2": { + "key": "Group.UpgradeNoticeText2", + "value": "• Supergroups can get up to {supergroup_member_limit} members\n• New members see the entire chat history\n• Admins delete messages for everyone\n• Notifications are muted by default" + }, + "Group.Username.CreatePrivateLinkHelp": { + "key": "Group.Username.CreatePrivateLinkHelp", + "value": "People can join your group by following this link. You can revoke the link at any time." + }, + "Group.Username.CreatePublicLinkHelp": { + "key": "Group.Username.CreatePublicLinkHelp", + "value": "People can share this link with others and find your group using Telegram search." + }, + "Group.Username.InvalidStartsWithNumber": { + "key": "Group.Username.InvalidStartsWithNumber", + "value": "Group names can't start with a number." + }, + "Group.Username.InvalidTooShort": { + "key": "Group.Username.InvalidTooShort", + "value": "Group names must have at least 5 characters." + }, + "Group.Username.RemoveExistingUsernamesInfo": { + "key": "Group.Username.RemoveExistingUsernamesInfo", + "value": "You have reserved too many public links. Try revoking the link from an older group or channel, or create a private one instead." + }, + "Group.Username.RevokeExistingUsernamesInfo": { + "key": "Group.Username.RevokeExistingUsernamesInfo", + "value": "You can revoke the link from one of your older groups or channels, or create a private group instead." + }, + "GroupInfo.ActionPromote": { + "key": "GroupInfo.ActionPromote", + "value": "Promote" + }, + "GroupInfo.ActionRestrict": { + "key": "GroupInfo.ActionRestrict", + "value": "Restrict" + }, + "GroupInfo.AddParticipant": { + "key": "GroupInfo.AddParticipant", + "value": "Add Members" + }, + "GroupInfo.AddParticipantConfirmation": { + "key": "GroupInfo.AddParticipantConfirmation", + "value": "Add %@ to the group?" + }, + "GroupInfo.AddParticipantTitle": { + "key": "GroupInfo.AddParticipantTitle", + "value": "Contacts" + }, + "GroupInfo.AddUserLeftError": { + "key": "GroupInfo.AddUserLeftError", + "value": "Sorry, if a person is no longer part of a group, you need to be in their Telegram contacts in order to add them back.\n\nNote that they can still join via the group's invite link as long as they are not in the Removed Users list." + }, + "GroupInfo.Administrators": { + "key": "GroupInfo.Administrators", + "value": "Administrators" + }, + "GroupInfo.Administrators.Title": { + "key": "GroupInfo.Administrators.Title", + "value": "Administrators" + }, + "GroupInfo.ChannelListNamePlaceholder": { + "key": "GroupInfo.ChannelListNamePlaceholder", + "value": "Channel Name" + }, + "GroupInfo.ChatAdmins": { + "key": "GroupInfo.ChatAdmins", + "value": "Add Admins" + }, + "GroupInfo.ConvertToSupergroup": { + "key": "GroupInfo.ConvertToSupergroup", + "value": "Convert to Supergroup" + }, + "GroupInfo.DeactivatedStatus": { + "key": "GroupInfo.DeactivatedStatus", + "value": "Group Deactivated" + }, + "GroupInfo.DeleteAndExit": { + "key": "GroupInfo.DeleteAndExit", + "value": "Delete and Exit" + }, + "GroupInfo.DeleteAndExitConfirmation": { + "key": "GroupInfo.DeleteAndExitConfirmation", + "value": "You will not be able to return to this group unless added by another member." + }, + "GroupInfo.FakeGroupWarning": { + "key": "GroupInfo.FakeGroupWarning", + "value": "⚠️ Warning: Many users reported that this account impersonates a famous person or organization." + }, + "GroupInfo.GroupHistory": { + "key": "GroupInfo.GroupHistory", + "value": "Chat History For New Members" + }, + "GroupInfo.GroupHistoryHidden": { + "key": "GroupInfo.GroupHistoryHidden", + "value": "Hidden" + }, + "GroupInfo.GroupHistoryShort": { + "key": "GroupInfo.GroupHistoryShort", + "value": "Chat History" + }, + "GroupInfo.GroupHistoryVisible": { + "key": "GroupInfo.GroupHistoryVisible", + "value": "Visible" + }, + "GroupInfo.GroupNamePlaceholder": { + "key": "GroupInfo.GroupNamePlaceholder", + "value": "Group Name" + }, + "GroupInfo.GroupType": { + "key": "GroupInfo.GroupType", + "value": "Group Type" + }, + "GroupInfo.InvitationLinkAcceptChannel": { + "key": "GroupInfo.InvitationLinkAcceptChannel", + "value": "Do you want to join the channel \"%@\"?" + }, + "GroupInfo.InvitationLinkDoesNotExist": { + "key": "GroupInfo.InvitationLinkDoesNotExist", + "value": "Sorry, this group does not seem to exist." + }, + "GroupInfo.InvitationLinkGroupFull": { + "key": "GroupInfo.InvitationLinkGroupFull", + "value": "Sorry, this group is already full." + }, + "GroupInfo.InviteByLink": { + "key": "GroupInfo.InviteByLink", + "value": "Invite to Group via Link" + }, + "GroupInfo.InviteLink.CopyAlert.Success": { + "key": "GroupInfo.InviteLink.CopyAlert.Success", + "value": "Link copied to clipboard." + }, + "GroupInfo.InviteLink.CopyLink": { + "key": "GroupInfo.InviteLink.CopyLink", + "value": "Copy Link" + }, + "GroupInfo.InviteLink.Help": { + "key": "GroupInfo.InviteLink.Help", + "value": "Anyone who has Telegram installed will be able to join your group by following this link." + }, + "GroupInfo.InviteLink.LinkSection": { + "key": "GroupInfo.InviteLink.LinkSection", + "value": "LINK" + }, + "GroupInfo.InviteLink.RevokeAlert.Revoke": { + "key": "GroupInfo.InviteLink.RevokeAlert.Revoke", + "value": "Revoke" + }, + "GroupInfo.InviteLink.RevokeAlert.Success": { + "key": "GroupInfo.InviteLink.RevokeAlert.Success", + "value": "The previous invite link is now inactive. A new invite link has just been generated." + }, + "GroupInfo.InviteLink.RevokeAlert.Text": { + "key": "GroupInfo.InviteLink.RevokeAlert.Text", + "value": "Are you sure you want to revoke this link? Once you do, no one will be able to join the group using it." + }, + "GroupInfo.InviteLink.RevokeLink": { + "key": "GroupInfo.InviteLink.RevokeLink", + "value": "Revoke Link" + }, + "GroupInfo.InviteLink.ShareLink": { + "key": "GroupInfo.InviteLink.ShareLink", + "value": "Share Link" + }, + "GroupInfo.InviteLink.Title": { + "key": "GroupInfo.InviteLink.Title", + "value": "Invite Link" + }, + "GroupInfo.InviteLinks": { + "key": "GroupInfo.InviteLinks", + "value": "Invite Links" + }, + "GroupInfo.LabelAdmin": { + "key": "GroupInfo.LabelAdmin", + "value": "admin" + }, + "GroupInfo.LabelOwner": { + "key": "GroupInfo.LabelOwner", + "value": "owner" + }, + "GroupInfo.LeftStatus": { + "key": "GroupInfo.LeftStatus", + "value": "You have left the group" + }, + "GroupInfo.Location": { + "key": "GroupInfo.Location", + "value": "Location" + }, + "GroupInfo.Notifications": { + "key": "GroupInfo.Notifications", + "value": "Notifications" + }, + "GroupInfo.ParticipantCount": { + "key": "GroupInfo.ParticipantCount", + "zeroValue": null, + "oneValue": "1 member", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ members" + }, + "GroupInfo.Permissions": { + "key": "GroupInfo.Permissions", + "value": "Permissions" + }, + "GroupInfo.Permissions.AddException": { + "key": "GroupInfo.Permissions.AddException", + "value": "Add Exception" + }, + "GroupInfo.Permissions.BroadcastConvert": { + "key": "GroupInfo.Permissions.BroadcastConvert", + "value": "Convert to Broadcast Group" + }, + "GroupInfo.Permissions.BroadcastConvertInfo": { + "key": "GroupInfo.Permissions.BroadcastConvertInfo", + "value": "Broadcast groups can have over %@ members, but only admins can send messages in them." + }, + "GroupInfo.Permissions.BroadcastTitle": { + "key": "GroupInfo.Permissions.BroadcastTitle", + "value": "Broadcast Group" + }, + "GroupInfo.Permissions.EditingDisabled": { + "key": "GroupInfo.Permissions.EditingDisabled", + "value": "You cannot edit this permission." + }, + "GroupInfo.Permissions.Exceptions": { + "key": "GroupInfo.Permissions.Exceptions", + "value": "EXCEPTIONS" + }, + "GroupInfo.Permissions.Removed": { + "key": "GroupInfo.Permissions.Removed", + "value": "Removed Users" + }, + "GroupInfo.Permissions.SearchPlaceholder": { + "key": "GroupInfo.Permissions.SearchPlaceholder", + "value": "Search Exceptions" + }, + "GroupInfo.Permissions.SectionTitle": { + "key": "GroupInfo.Permissions.SectionTitle", + "value": "WHAT CAN MEMBERS OF THIS GROUP DO?" + }, + "GroupInfo.Permissions.SlowmodeHeader": { + "key": "GroupInfo.Permissions.SlowmodeHeader", + "value": "SLOW MODE" + }, + "GroupInfo.Permissions.SlowmodeInfo": { + "key": "GroupInfo.Permissions.SlowmodeInfo", + "value": "Choose how long each member must wait before sending their next message." + }, + "GroupInfo.Permissions.SlowmodeValue.Off": { + "key": "GroupInfo.Permissions.SlowmodeValue.Off", + "value": "Off" + }, + "GroupInfo.Permissions.Title": { + "key": "GroupInfo.Permissions.Title", + "value": "Permissions" + }, + "GroupInfo.PublicLink": { + "key": "GroupInfo.PublicLink", + "value": "Public Link" + }, + "GroupInfo.PublicLinkAdd": { + "key": "GroupInfo.PublicLinkAdd", + "value": "Add" + }, + "GroupInfo.ScamGroupWarning": { + "key": "GroupInfo.ScamGroupWarning", + "value": "⚠️ Warning: Many users reported this group as a scam or a fake account. Please be careful, especially if it asks you for money." + }, + "GroupInfo.SetGroupPhoto": { + "key": "GroupInfo.SetGroupPhoto", + "value": "Set Group Photo" + }, + "GroupInfo.SetGroupPhotoDelete": { + "key": "GroupInfo.SetGroupPhotoDelete", + "value": "Remove Photo" + }, + "GroupInfo.SetGroupPhotoStop": { + "key": "GroupInfo.SetGroupPhotoStop", + "value": "Stop" + }, + "GroupInfo.SetSound": { + "key": "GroupInfo.SetSound", + "value": "Set Sound" + }, + "GroupInfo.SharedMedia": { + "key": "GroupInfo.SharedMedia", + "value": "Shared Media" + }, + "GroupInfo.SharedMediaNone": { + "key": "GroupInfo.SharedMediaNone", + "value": "None" + }, + "GroupInfo.ShowMoreMembers": { + "key": "GroupInfo.ShowMoreMembers", + "zeroValue": null, + "oneValue": "Show %@ More Member", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More Members" + }, + "GroupInfo.Sound": { + "key": "GroupInfo.Sound", + "value": "Sound" + }, + "GroupInfo.Title": { + "key": "GroupInfo.Title", + "value": "Group Info" + }, + "GroupInfo.UpgradeButton": { + "key": "GroupInfo.UpgradeButton", + "value": "Upgrade to supergroup" + }, + "GroupPermission.AddMembersNotAvailable": { + "key": "GroupPermission.AddMembersNotAvailable", + "value": "You don't have permission to add members." + }, + "GroupPermission.AddSuccess": { + "key": "GroupPermission.AddSuccess", + "value": "Exception Added" + }, + "GroupPermission.AddedInfo": { + "key": "GroupPermission.AddedInfo", + "value": "Exception added by %1$@ %2$@" + }, + "GroupPermission.ApplyAlertAction": { + "key": "GroupPermission.ApplyAlertAction", + "value": "Apply" + }, + "GroupPermission.ApplyAlertText": { + "key": "GroupPermission.ApplyAlertText", + "value": "You have changed this user's rights in %@.\nApply Changes?" + }, + "GroupPermission.Delete": { + "key": "GroupPermission.Delete", + "value": "Delete Exception" + }, + "GroupPermission.Duration": { + "key": "GroupPermission.Duration", + "value": "Duration" + }, + "GroupPermission.EditingDisabled": { + "key": "GroupPermission.EditingDisabled", + "value": "You cannot edit restrictions of this user." + }, + "GroupPermission.NewTitle": { + "key": "GroupPermission.NewTitle", + "value": "New Exception" + }, + "GroupPermission.NoAddMembers": { + "key": "GroupPermission.NoAddMembers", + "value": "no add" + }, + "GroupPermission.NoChangeInfo": { + "key": "GroupPermission.NoChangeInfo", + "value": "no info" + }, + "GroupPermission.NoPinMessages": { + "key": "GroupPermission.NoPinMessages", + "value": "no pin" + }, + "GroupPermission.NoSendGifs": { + "key": "GroupPermission.NoSendGifs", + "value": "no GIFs" + }, + "GroupPermission.NoSendLinks": { + "key": "GroupPermission.NoSendLinks", + "value": "no links" + }, + "GroupPermission.NoSendMedia": { + "key": "GroupPermission.NoSendMedia", + "value": "no media" + }, + "GroupPermission.NoSendMessages": { + "key": "GroupPermission.NoSendMessages", + "value": "no messages" + }, + "GroupPermission.NoSendPolls": { + "key": "GroupPermission.NoSendPolls", + "value": "no polls" + }, + "GroupPermission.NotAvailableInPublicGroups": { + "key": "GroupPermission.NotAvailableInPublicGroups", + "value": "This permission is not available in public groups." + }, + "GroupPermission.PermissionDisabledByDefault": { + "key": "GroupPermission.PermissionDisabledByDefault", + "value": "This option is disabled for all members in Group Permissions." + }, + "GroupPermission.PermissionGloballyDisabled": { + "key": "GroupPermission.PermissionGloballyDisabled", + "value": "This permission is disabled in this group." + }, + "GroupPermission.SectionTitle": { + "key": "GroupPermission.SectionTitle", + "value": "WHAT CAN THIS MEMBER DO?" + }, + "GroupPermission.Title": { + "key": "GroupPermission.Title", + "value": "Exception" + }, + "GroupRemoved.AddToGroup": { + "key": "GroupRemoved.AddToGroup", + "value": "Add To Group" + }, + "GroupRemoved.DeleteUser": { + "key": "GroupRemoved.DeleteUser", + "value": "Delete User" + }, + "GroupRemoved.Remove": { + "key": "GroupRemoved.Remove", + "value": "Remove User" + }, + "GroupRemoved.RemoveInfo": { + "key": "GroupRemoved.RemoveInfo", + "value": "Users removed from the group by admins cannot rejoin it via invite links." + }, + "GroupRemoved.Title": { + "key": "GroupRemoved.Title", + "value": "Removed Users" + }, + "GroupRemoved.UsersSectionTitle": { + "key": "GroupRemoved.UsersSectionTitle", + "value": "REMOVED USERS" + }, + "GroupRemoved.ViewUserInfo": { + "key": "GroupRemoved.ViewUserInfo", + "value": "View User Info" + }, + "HashtagSearch.AllChats": { + "key": "HashtagSearch.AllChats", + "value": "All Chats" + }, + "InfoPlist.NSCameraUsageDescription": { + "key": "InfoPlist.NSCameraUsageDescription", + "value": "We need this so that you can take and share photos and videos, as well as make video calls." + }, + "InfoPlist.NSContactsUsageDescription": { + "key": "InfoPlist.NSContactsUsageDescription", + "value": "Telegram will continuously upload your contacts to its heavily encrypted cloud servers to let you connect with your friends across all your devices." + }, + "InfoPlist.NSFaceIDUsageDescription": { + "key": "InfoPlist.NSFaceIDUsageDescription", + "value": "You can use Face ID to unlock the app." + }, + "InfoPlist.NSLocationAlwaysAndWhenInUseUsageDescription": { + "key": "InfoPlist.NSLocationAlwaysAndWhenInUseUsageDescription", + "value": "When you choose to share your Live Location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing." + }, + "InfoPlist.NSLocationAlwaysUsageDescription": { + "key": "InfoPlist.NSLocationAlwaysUsageDescription", + "value": "When you choose to share your live location with friends in a chat, Telegram needs background access to your location to keep them updated for the duration of the live sharing. You also need this to send locations from an Apple Watch." + }, + "InfoPlist.NSLocationWhenInUseUsageDescription": { + "key": "InfoPlist.NSLocationWhenInUseUsageDescription", + "value": "When you send your location to your friends, Telegram needs access to show them a map." + }, + "InfoPlist.NSMicrophoneUsageDescription": { + "key": "InfoPlist.NSMicrophoneUsageDescription", + "value": "We need this so that you can record and share voice messages and videos with sound." + }, + "InfoPlist.NSPhotoLibraryAddUsageDescription": { + "key": "InfoPlist.NSPhotoLibraryAddUsageDescription", + "value": "We need this so that you can save photos and videos to your photo library." + }, + "InfoPlist.NSPhotoLibraryUsageDescription": { + "key": "InfoPlist.NSPhotoLibraryUsageDescription", + "value": "We need this so that you can share photos and videos from your photo library." + }, + "InfoPlist.NSSiriUsageDescription": { + "key": "InfoPlist.NSSiriUsageDescription", + "value": "You can use Siri to send messages." + }, + "InstantPage.AuthorAndDateTitle": { + "key": "InstantPage.AuthorAndDateTitle", + "value": "By %1$@ • %2$@" + }, + "InstantPage.AutoNightTheme": { + "key": "InstantPage.AutoNightTheme", + "value": "Auto-Night Theme" + }, + "InstantPage.FeedbackButton": { + "key": "InstantPage.FeedbackButton", + "value": "Report a bug with this preview" + }, + "InstantPage.FeedbackButtonShort": { + "key": "InstantPage.FeedbackButtonShort", + "value": "Wrong layout?" + }, + "InstantPage.Reference": { + "key": "InstantPage.Reference", + "value": "Reference" + }, + "InstantPage.RelatedArticleAuthorAndDateTitle": { + "key": "InstantPage.RelatedArticleAuthorAndDateTitle", + "value": "%1$@ • %2$@" + }, + "InstantPage.TapToOpenLink": { + "key": "InstantPage.TapToOpenLink", + "value": "Tap to open the link:" + }, + "InstantPage.Views": { + "key": "InstantPage.Views", + "zeroValue": null, + "oneValue": "%@ view", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ views" + }, + "Intents.ErrorLockedText": { + "key": "Intents.ErrorLockedText", + "value": "Open Telegram and enter passcode to edit widget." + }, + "Intents.ErrorLockedTitle": { + "key": "Intents.ErrorLockedTitle", + "value": "Locked" + }, + "IntentsSettings.MainAccount": { + "key": "IntentsSettings.MainAccount", + "value": "Main Account" + }, + "IntentsSettings.MainAccountInfo": { + "key": "IntentsSettings.MainAccountInfo", + "value": "Choose an account for Siri and share suggestions." + }, + "IntentsSettings.Reset": { + "key": "IntentsSettings.Reset", + "value": "Reset" + }, + "IntentsSettings.ResetAll": { + "key": "IntentsSettings.ResetAll", + "value": "Reset All Share Suggestions" + }, + "IntentsSettings.SuggestBy": { + "key": "IntentsSettings.SuggestBy", + "value": "Suggest By" + }, + "IntentsSettings.SuggestByAll": { + "key": "IntentsSettings.SuggestByAll", + "value": "All Sent Messages" + }, + "IntentsSettings.SuggestByShare": { + "key": "IntentsSettings.SuggestByShare", + "value": "Only Shared Messages" + }, + "IntentsSettings.SuggestedAndSpotlightChatsInfo": { + "key": "IntentsSettings.SuggestedAndSpotlightChatsInfo", + "value": "Suggestions will appear in the Share Sheet and Spotlight search results. Archived chats will not be suggested." + }, + "IntentsSettings.SuggestedChats": { + "key": "IntentsSettings.SuggestedChats", + "value": "Suggested Chats" + }, + "IntentsSettings.SuggestedChatsContacts": { + "key": "IntentsSettings.SuggestedChatsContacts", + "value": "Contacts" + }, + "IntentsSettings.SuggestedChatsGroups": { + "key": "IntentsSettings.SuggestedChatsGroups", + "value": "Groups" + }, + "IntentsSettings.SuggestedChatsInfo": { + "key": "IntentsSettings.SuggestedChatsInfo", + "value": "Archived chats will not be suggested." + }, + "IntentsSettings.SuggestedChatsPrivateChats": { + "key": "IntentsSettings.SuggestedChatsPrivateChats", + "value": "Private Chats" + }, + "IntentsSettings.SuggestedChatsSavedMessages": { + "key": "IntentsSettings.SuggestedChatsSavedMessages", + "value": "Saved Messages" + }, + "IntentsSettings.Title": { + "key": "IntentsSettings.Title", + "value": "Share Sheet" + }, + "Invitation.JoinGroup": { + "key": "Invitation.JoinGroup", + "value": "Join Group" + }, + "Invitation.Members": { + "key": "Invitation.Members", + "zeroValue": null, + "oneValue": "1 member:", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ members:" + }, + "Invite.ChannelsTooMuch": { + "key": "Invite.ChannelsTooMuch", + "value": "Sorry, the target user is a member of too many groups and channels. Please ask them to leave some first." + }, + "Invite.LargeRecipientsCountWarning": { + "key": "Invite.LargeRecipientsCountWarning", + "value": "Please note that it may take some time for your device to send all of these invitations" + }, + "InviteLink.AdditionalLinks": { + "key": "InviteLink.AdditionalLinks", + "value": "Additional Links" + }, + "InviteLink.ContextCopy": { + "key": "InviteLink.ContextCopy", + "value": "Copy" + }, + "InviteLink.ContextDelete": { + "key": "InviteLink.ContextDelete", + "value": "Delete" + }, + "InviteLink.ContextEdit": { + "key": "InviteLink.ContextEdit", + "value": "Edit" + }, + "InviteLink.ContextGetQRCode": { + "key": "InviteLink.ContextGetQRCode", + "value": "Get QR Code" + }, + "InviteLink.ContextRevoke": { + "key": "InviteLink.ContextRevoke", + "value": "Revoke" + }, + "InviteLink.ContextShare": { + "key": "InviteLink.ContextShare", + "value": "Share" + }, + "InviteLink.Create": { + "key": "InviteLink.Create", + "value": "Create a New Link" + }, + "InviteLink.Create.EditTitle": { + "key": "InviteLink.Create.EditTitle", + "value": "Edit Link" + }, + "InviteLink.Create.Revoke": { + "key": "InviteLink.Create.Revoke", + "value": "Revoke Link" + }, + "InviteLink.Create.TimeLimit": { + "key": "InviteLink.Create.TimeLimit", + "value": "Limit By Time Period" + }, + "InviteLink.Create.TimeLimitExpiryDate": { + "key": "InviteLink.Create.TimeLimitExpiryDate", + "value": "Expiry Date" + }, + "InviteLink.Create.TimeLimitExpiryDateNever": { + "key": "InviteLink.Create.TimeLimitExpiryDateNever", + "value": "Never" + }, + "InviteLink.Create.TimeLimitExpiryTime": { + "key": "InviteLink.Create.TimeLimitExpiryTime", + "value": "Time" + }, + "InviteLink.Create.TimeLimitInfo": { + "key": "InviteLink.Create.TimeLimitInfo", + "value": "You can make the link expire after a certain time." + }, + "InviteLink.Create.TimeLimitNoLimit": { + "key": "InviteLink.Create.TimeLimitNoLimit", + "value": "No Limit" + }, + "InviteLink.Create.Title": { + "key": "InviteLink.Create.Title", + "value": "New Link" + }, + "InviteLink.Create.UsersLimit": { + "key": "InviteLink.Create.UsersLimit", + "value": "Limit By Number Of Users" + }, + "InviteLink.Create.UsersLimitInfo": { + "key": "InviteLink.Create.UsersLimitInfo", + "value": "You can make the link expire after it has been used for a certain number of times." + }, + "InviteLink.Create.UsersLimitNoLimit": { + "key": "InviteLink.Create.UsersLimitNoLimit", + "value": "No Limit" + }, + "InviteLink.Create.UsersLimitNumberOfUsers": { + "key": "InviteLink.Create.UsersLimitNumberOfUsers", + "value": "Number of Uses" + }, + "InviteLink.Create.UsersLimitNumberOfUsersUnlimited": { + "key": "InviteLink.Create.UsersLimitNumberOfUsersUnlimited", + "value": "Unlimited" + }, + "InviteLink.CreateInfo": { + "key": "InviteLink.CreateInfo", + "value": "You can create additional invite links that have limited time or number of usages." + }, + "InviteLink.CreatePrivateLinkHelp": { + "key": "InviteLink.CreatePrivateLinkHelp", + "value": "Anyone who has Telegram installed will be able to join your group by following this link." + }, + "InviteLink.CreatePrivateLinkHelpChannel": { + "key": "InviteLink.CreatePrivateLinkHelpChannel", + "value": "Anyone who has Telegram installed will be able to join your channel by following this link." + }, + "InviteLink.CreatedBy": { + "key": "InviteLink.CreatedBy", + "value": "Link Created By" + }, + "InviteLink.DeleteAllRevokedLinks": { + "key": "InviteLink.DeleteAllRevokedLinks", + "value": "Delete All Revoked Links" + }, + "InviteLink.DeleteAllRevokedLinksAlert.Action": { + "key": "InviteLink.DeleteAllRevokedLinksAlert.Action", + "value": "Delete All" + }, + "InviteLink.DeleteAllRevokedLinksAlert.Text": { + "key": "InviteLink.DeleteAllRevokedLinksAlert.Text", + "value": "This will delete all revoked links." + }, + "InviteLink.DeleteLinkAlert.Action": { + "key": "InviteLink.DeleteLinkAlert.Action", + "value": "Delete" + }, + "InviteLink.DeleteLinkAlert.Text": { + "key": "InviteLink.DeleteLinkAlert.Text", + "value": "Are you sure you want to delete this link? It will be completely gone." + }, + "InviteLink.Expired": { + "key": "InviteLink.Expired", + "value": "expired" + }, + "InviteLink.ExpiredLink": { + "key": "InviteLink.ExpiredLink", + "value": "Expired Link" + }, + "InviteLink.ExpiredLinkStatus": { + "key": "InviteLink.ExpiredLinkStatus", + "value": "time limit has expired" + }, + "InviteLink.ExpiresIn": { + "key": "InviteLink.ExpiresIn", + "value": "expires in %@" + }, + "InviteLink.InviteLink": { + "key": "InviteLink.InviteLink", + "value": "Invite Link" + }, + "InviteLink.InviteLinkCopiedText": { + "key": "InviteLink.InviteLinkCopiedText", + "value": "Invite link copied to clipboard" + }, + "InviteLink.InviteLinkRevoked": { + "key": "InviteLink.InviteLinkRevoked", + "value": "The invite link has been revoked." + }, + "InviteLink.InviteLinks": { + "key": "InviteLink.InviteLinks", + "zeroValue": null, + "oneValue": "%@ invite link", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ invite links" + }, + "InviteLink.Manage": { + "key": "InviteLink.Manage", + "value": "Manage Invite Links" + }, + "InviteLink.OtherAdminsLinks": { + "key": "InviteLink.OtherAdminsLinks", + "value": "Invite Links Created By Other Admins" + }, + "InviteLink.OtherPermanentLinkInfo": { + "key": "InviteLink.OtherPermanentLinkInfo", + "value": "**%1$@** can see this link and use it to invite new members to **%2$@**." + }, + "InviteLink.PeopleCanJoin": { + "key": "InviteLink.PeopleCanJoin", + "zeroValue": null, + "oneValue": "%@ can join", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ can join" + }, + "InviteLink.PeopleJoined": { + "key": "InviteLink.PeopleJoined", + "zeroValue": null, + "oneValue": "%@ people joined", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ people joined" + }, + "InviteLink.PeopleJoinedNone": { + "key": "InviteLink.PeopleJoinedNone", + "value": "no one joined yet" + }, + "InviteLink.PeopleJoinedShort": { + "key": "InviteLink.PeopleJoinedShort", + "zeroValue": null, + "oneValue": "%@ joined", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ joined" + }, + "InviteLink.PeopleJoinedShortNone": { + "key": "InviteLink.PeopleJoinedShortNone", + "value": "no one joined yet" + }, + "InviteLink.PeopleJoinedShortNoneExpired": { + "key": "InviteLink.PeopleJoinedShortNoneExpired", + "value": "no one joined" + }, + "InviteLink.PeopleRemaining": { + "key": "InviteLink.PeopleRemaining", + "zeroValue": null, + "oneValue": "%@ remaining", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ remaining" + }, + "InviteLink.PermanentLink": { + "key": "InviteLink.PermanentLink", + "value": "Invite Link" + }, + "InviteLink.PublicLink": { + "key": "InviteLink.PublicLink", + "value": "Public Link" + }, + "InviteLink.QRCode.Info": { + "key": "InviteLink.QRCode.Info", + "value": "Everyone on Telegram can scan this code to join your group." + }, + "InviteLink.QRCode.InfoChannel": { + "key": "InviteLink.QRCode.InfoChannel", + "value": "Everyone on Telegram can scan this code to join your channel." + }, + "InviteLink.QRCode.Share": { + "key": "InviteLink.QRCode.Share", + "value": "Share QR Code" + }, + "InviteLink.QRCode.Title": { + "key": "InviteLink.QRCode.Title", + "value": "Invite by QR Code" + }, + "InviteLink.ReactivateLink": { + "key": "InviteLink.ReactivateLink", + "value": "Reactivate Link" + }, + "InviteLink.Revoked": { + "key": "InviteLink.Revoked", + "value": "revoked" + }, + "InviteLink.RevokedLinks": { + "key": "InviteLink.RevokedLinks", + "value": "Revoked Links" + }, + "InviteLink.Share": { + "key": "InviteLink.Share", + "value": "Share Link" + }, + "InviteLink.Title": { + "key": "InviteLink.Title", + "value": "Invite Links" + }, + "InviteLink.UsageLimitReached": { + "key": "InviteLink.UsageLimitReached", + "value": "limit reached" + }, + "InviteLinks.InviteLinkExpired": { + "key": "InviteLinks.InviteLinkExpired", + "value": "This invite link has expired." + }, + "InviteText.ContactsCount": { + "key": "InviteText.ContactsCount", + "zeroValue": null, + "oneValue": "Hey, I'm using Telegram to chat. Join me! Download it here: %@", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Hey, I'm using Telegram to chat – and so are %@ of our other contacts. Join us! Download it here: %@" + }, + "InviteText.ContactsCountText": { + "key": "InviteText.ContactsCountText", + "zeroValue": null, + "oneValue": "Hey, I'm using Telegram to chat. Join me! Download it here: {url}", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Hey, I'm using Telegram to chat – and so are %@ of our other contacts. Join us! Download it here: {url}" + }, + "InviteText.SingleContact": { + "key": "InviteText.SingleContact", + "value": "Hey, I'm using Telegram to chat. Join me! Download it here: %@" + }, + "InviteText.URL": { + "key": "InviteText.URL", + "value": "https://telegram.org/dl" + }, + "Items.NOfM": { + "key": "Items.NOfM", + "value": "%1$@ of %2$@" + }, + "Join.ChannelsTooMuch": { + "key": "Join.ChannelsTooMuch", + "value": "Sorry, you are a member of too many groups and channels. Please leave some before joining one." + }, + "KeyCommand.ChatInfo": { + "key": "KeyCommand.ChatInfo", + "value": "Chat Info" + }, + "KeyCommand.Find": { + "key": "KeyCommand.Find", + "value": "Search" + }, + "KeyCommand.FocusOnInputField": { + "key": "KeyCommand.FocusOnInputField", + "value": "Write Message" + }, + "KeyCommand.JumpToNextChat": { + "key": "KeyCommand.JumpToNextChat", + "value": "Jump to Next Chat" + }, + "KeyCommand.JumpToNextUnreadChat": { + "key": "KeyCommand.JumpToNextUnreadChat", + "value": "Jump to Next Unread Chat" + }, + "KeyCommand.JumpToPreviousChat": { + "key": "KeyCommand.JumpToPreviousChat", + "value": "Jump to Previous Chat" + }, + "KeyCommand.JumpToPreviousUnreadChat": { + "key": "KeyCommand.JumpToPreviousUnreadChat", + "value": "Jump to Previous Unread Chat" + }, + "KeyCommand.NewMessage": { + "key": "KeyCommand.NewMessage", + "value": "New Message" + }, + "KeyCommand.ScrollDown": { + "key": "KeyCommand.ScrollDown", + "value": "Scroll Down" + }, + "KeyCommand.ScrollUp": { + "key": "KeyCommand.ScrollUp", + "value": "Scroll Up" + }, + "KeyCommand.SearchInChat": { + "key": "KeyCommand.SearchInChat", + "value": "Search in Chat" + }, + "KeyCommand.SendMessage": { + "key": "KeyCommand.SendMessage", + "value": "Send Message" + }, + "LOCKED_MESSAGE": { + "key": "LOCKED_MESSAGE", + "value": "You have a new message%1$@" + }, + "LastSeen.ALongTimeAgo": { + "key": "LastSeen.ALongTimeAgo", + "value": "last seen a long time ago" + }, + "LastSeen.AtDate": { + "key": "LastSeen.AtDate", + "value": "last seen %@" + }, + "LastSeen.HoursAgo": { + "key": "LastSeen.HoursAgo", + "zeroValue": null, + "oneValue": "last seen 1 hour ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "last seen %@ hours ago" + }, + "LastSeen.JustNow": { + "key": "LastSeen.JustNow", + "value": "last seen just now" + }, + "LastSeen.Lately": { + "key": "LastSeen.Lately", + "value": "last seen recently" + }, + "LastSeen.MinutesAgo": { + "key": "LastSeen.MinutesAgo", + "zeroValue": null, + "oneValue": "last seen 1 minute ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "last seen %@ minutes ago" + }, + "LastSeen.Offline": { + "key": "LastSeen.Offline", + "value": "last seen a long time ago" + }, + "LastSeen.TodayAt": { + "key": "LastSeen.TodayAt", + "value": "last seen today at %@" + }, + "LastSeen.WithinAMonth": { + "key": "LastSeen.WithinAMonth", + "value": "last seen within a month" + }, + "LastSeen.WithinAWeek": { + "key": "LastSeen.WithinAWeek", + "value": "last seen within a week" + }, + "LastSeen.YesterdayAt": { + "key": "LastSeen.YesterdayAt", + "value": "last seen yesterday at %@" + }, + "LiveLocation.MenuChatsCount": { + "key": "LiveLocation.MenuChatsCount", + "zeroValue": null, + "oneValue": "You are sharing Live Location with 1 chat.", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "You are sharing Live Location with %@ chats." + }, + "LiveLocation.MenuStopAll": { + "key": "LiveLocation.MenuStopAll", + "value": "Stop All" + }, + "LiveLocationUpdated.JustNow": { + "key": "LiveLocationUpdated.JustNow", + "value": "updated just now" + }, + "LiveLocationUpdated.MinutesAgo": { + "key": "LiveLocationUpdated.MinutesAgo", + "zeroValue": null, + "oneValue": "updated 1 minute ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "updated %@ minutes ago" + }, + "LiveLocationUpdated.TodayAt": { + "key": "LiveLocationUpdated.TodayAt", + "value": "updated at %@" + }, + "LocalGroup.ButtonTitle": { + "key": "LocalGroup.ButtonTitle", + "value": "Start Group" + }, + "LocalGroup.IrrelevantWarning": { + "key": "LocalGroup.IrrelevantWarning", + "value": "If you start an unrelated group at this location, you may get restricted in creating new location-based groups." + }, + "LocalGroup.Text": { + "key": "LocalGroup.Text", + "value": "Anyone close to this location (neighbors, co-workers, fellow students, event attendees, visitors of a venue) will see your group in the People Nearby section." + }, + "LocalGroup.Title": { + "key": "LocalGroup.Title", + "value": "Create a Local Group" + }, + "Localization.ChooseLanguage": { + "key": "Localization.ChooseLanguage", + "value": "Choose Your Language" + }, + "Localization.EnglishLanguageName": { + "key": "Localization.EnglishLanguageName", + "value": "English" + }, + "Localization.LanguageCustom": { + "key": "Localization.LanguageCustom", + "value": "Custom" + }, + "Localization.LanguageName": { + "key": "Localization.LanguageName", + "value": "English" + }, + "Localization.LanguageOther": { + "key": "Localization.LanguageOther", + "value": "Other" + }, + "Location.LiveLocationRequired.Description": { + "key": "Location.LiveLocationRequired.Description", + "value": "For the alert to work, please share your live location in this chat." + }, + "Location.LiveLocationRequired.ShareLocation": { + "key": "Location.LiveLocationRequired.ShareLocation", + "value": "Share Location" + }, + "Location.LiveLocationRequired.Title": { + "key": "Location.LiveLocationRequired.Title", + "value": "Share Location" + }, + "Location.ProximityAlertCancelled": { + "key": "Location.ProximityAlertCancelled", + "value": "Proximity alert cancelled" + }, + "Location.ProximityAlertSetText": { + "key": "Location.ProximityAlertSetText", + "value": "We will notify you once %1$@ is within %2$@ from you." + }, + "Location.ProximityAlertSetTextGroup": { + "key": "Location.ProximityAlertSetTextGroup", + "value": "We will notify you once any group member is within %@ from you." + }, + "Location.ProximityAlertSetTitle": { + "key": "Location.ProximityAlertSetTitle", + "value": "Proximity alert set" + }, + "Location.ProximityGroupTip": { + "key": "Location.ProximityGroupTip", + "value": "Alert when any group member is close" + }, + "Location.ProximityNotification.AlreadyClose": { + "key": "Location.ProximityNotification.AlreadyClose", + "value": "You are already closer than %@" + }, + "Location.ProximityNotification.DistanceKM": { + "key": "Location.ProximityNotification.DistanceKM", + "value": "km" + }, + "Location.ProximityNotification.DistanceM": { + "key": "Location.ProximityNotification.DistanceM", + "value": "m" + }, + "Location.ProximityNotification.DistanceMI": { + "key": "Location.ProximityNotification.DistanceMI", + "value": "mi" + }, + "Location.ProximityNotification.Notify": { + "key": "Location.ProximityNotification.Notify", + "value": "Notify me within %@" + }, + "Location.ProximityNotification.NotifyLong": { + "key": "Location.ProximityNotification.NotifyLong", + "value": "Notify when %1$@ is within %2$@" + }, + "Location.ProximityNotification.Title": { + "key": "Location.ProximityNotification.Title", + "value": "Proximity Alert" + }, + "Location.ProximityTip": { + "key": "Location.ProximityTip", + "value": "Alert when %@ is close" + }, + "Login.BannedPhoneBody": { + "key": "Login.BannedPhoneBody", + "value": "I'm trying to use my mobile phone number: %@\nBut Telegram says it's banned. Please help." + }, + "Login.BannedPhoneSubject": { + "key": "Login.BannedPhoneSubject", + "value": "Banned phone number: %@" + }, + "Login.CallRequestState1": { + "key": "Login.CallRequestState1", + "value": "Telegram will call you in %d:%.2d" + }, + "Login.CallRequestState2": { + "key": "Login.CallRequestState2", + "value": "Requesting a call from Telegram..." + }, + "Login.CallRequestState3": { + "key": "Login.CallRequestState3", + "value": "Telegram dialed your number\n[Didn't get the code?]" + }, + "Login.CancelPhoneVerification": { + "key": "Login.CancelPhoneVerification", + "value": "Do you want to stop the verification process?" + }, + "Login.CancelPhoneVerificationContinue": { + "key": "Login.CancelPhoneVerificationContinue", + "value": "Continue" + }, + "Login.CancelPhoneVerificationStop": { + "key": "Login.CancelPhoneVerificationStop", + "value": "Stop" + }, + "Login.CancelSignUpConfirmation": { + "key": "Login.CancelSignUpConfirmation", + "value": "Do you want to stop the registration process?" + }, + "Login.CheckOtherSessionMessages": { + "key": "Login.CheckOtherSessionMessages", + "value": "Check your Telegram messages" + }, + "Login.Code": { + "key": "Login.Code", + "value": "Code" + }, + "Login.CodeExpired": { + "key": "Login.CodeExpired", + "value": "Code expired, please login again." + }, + "Login.CodeExpiredError": { + "key": "Login.CodeExpiredError", + "value": "Code expired. Please try again." + }, + "Login.CodeFloodError": { + "key": "Login.CodeFloodError", + "value": "Limit exceeded. Please try again later." + }, + "Login.CodeSentCall": { + "key": "Login.CodeSentCall", + "value": "We are calling your phone to dictate a code." + }, + "Login.CodeSentInternal": { + "key": "Login.CodeSentInternal", + "value": "We've sent the code to the **Telegram** app on your other device" + }, + "Login.CodeSentSms": { + "key": "Login.CodeSentSms", + "value": "We have sent you an SMS with the code" + }, + "Login.ContinueWithLocalization": { + "key": "Login.ContinueWithLocalization", + "value": "Continue in English" + }, + "Login.CountryCode": { + "key": "Login.CountryCode", + "value": "Country Code" + }, + "Login.EmailCodeBody": { + "key": "Login.EmailCodeBody", + "value": "My phone number is:\n%@\nI can't get an activation code for Telegram." + }, + "Login.EmailCodeSubject": { + "key": "Login.EmailCodeSubject", + "value": "%@, no code" + }, + "Login.EmailNotConfiguredError": { + "key": "Login.EmailNotConfiguredError", + "value": "An email account is required so that you can send us details about the error.\n\nPlease go to your device‘s settings > Passwords & Accounts > Add account and set up an email account." + }, + "Login.EmailPhoneBody": { + "key": "Login.EmailPhoneBody", + "value": "I'm trying to use my mobile phone number: %@\nBut Telegram says it's invalid. Please help.\nAdditional Info: %@, %@." + }, + "Login.EmailPhoneSubject": { + "key": "Login.EmailPhoneSubject", + "value": "Invalid number %@" + }, + "Login.HaveNotReceivedCodeInternal": { + "key": "Login.HaveNotReceivedCodeInternal", + "value": "Haven't received the code?" + }, + "Login.InfoAvatarAdd": { + "key": "Login.InfoAvatarAdd", + "value": "add" + }, + "Login.InfoAvatarPhoto": { + "key": "Login.InfoAvatarPhoto", + "value": "photo" + }, + "Login.InfoDeletePhoto": { + "key": "Login.InfoDeletePhoto", + "value": "Delete Photo" + }, + "Login.InfoFirstNamePlaceholder": { + "key": "Login.InfoFirstNamePlaceholder", + "value": "First Name" + }, + "Login.InfoHelp": { + "key": "Login.InfoHelp", + "value": "Enter your name and add a profile picture." + }, + "Login.InfoLastNamePlaceholder": { + "key": "Login.InfoLastNamePlaceholder", + "value": "Last Name" + }, + "Login.InfoTitle": { + "key": "Login.InfoTitle", + "value": "Your Info" + }, + "Login.InvalidCodeError": { + "key": "Login.InvalidCodeError", + "value": "You have entered an invalid code. Please try again." + }, + "Login.InvalidCountryCode": { + "key": "Login.InvalidCountryCode", + "value": "Invalid Country Code" + }, + "Login.InvalidFirstNameError": { + "key": "Login.InvalidFirstNameError", + "value": "Invalid first name. Please try again." + }, + "Login.InvalidLastNameError": { + "key": "Login.InvalidLastNameError", + "value": "Sorry, this last name can't be used." + }, + "Login.InvalidPhoneEmailBody": { + "key": "Login.InvalidPhoneEmailBody", + "value": "I'm trying to use my mobile phone number: %1$@\nBut Telegram says it's invalid. Please help.\n\nApp version: %2$@\nOS version: %3$@\nLocale: %4$@\nMNC: %5$@" + }, + "Login.InvalidPhoneEmailSubject": { + "key": "Login.InvalidPhoneEmailSubject", + "value": "Invalid phone number: %@" + }, + "Login.InvalidPhoneError": { + "key": "Login.InvalidPhoneError", + "value": "Invalid phone number. Please try again." + }, + "Login.NetworkError": { + "key": "Login.NetworkError", + "value": "Please check your internet connection and try again." + }, + "Login.PRIVACY_URL": { + "key": "Login.PRIVACY_URL", + "value": "https://telegram.org/privacy" + }, + "Login.PadPhoneHelp": { + "key": "Login.PadPhoneHelp", + "value": "You can use your main mobile number to log in to Telegram on all devices.\nDon't use your iPad's SIM number here — we'll need to send you an SMS.\n\nIs this number correct?\n{number}" + }, + "Login.PadPhoneHelpTitle": { + "key": "Login.PadPhoneHelpTitle", + "value": "Your Number" + }, + "Login.PhoneAndCountryHelp": { + "key": "Login.PhoneAndCountryHelp", + "value": "Please confirm your country code and enter your phone number." + }, + "Login.PhoneBannedEmailBody": { + "key": "Login.PhoneBannedEmailBody", + "value": "I'm trying to use my mobile phone number: %1$@\nBut Telegram says it's banned. Please help.\n\nApp version: %2$@\nOS version: %3$@\nLocale: %4$@\nMNC: %5$@" + }, + "Login.PhoneBannedEmailSubject": { + "key": "Login.PhoneBannedEmailSubject", + "value": "Banned phone number: %@" + }, + "Login.PhoneBannedError": { + "key": "Login.PhoneBannedError", + "value": "This phone number is banned." + }, + "Login.PhoneFloodError": { + "key": "Login.PhoneFloodError", + "value": "Sorry, you have deleted and re-created your account too many times recently. Please wait for a few days before signing up again." + }, + "Login.PhoneGenericEmailBody": { + "key": "Login.PhoneGenericEmailBody", + "value": "I'm trying to use my mobile phone number: %1$@\nBut Telegram shows an error. Please help.\n\nError: %2$@\nApp version: %3$@\nOS version: %4$@\nLocale: %5$@\nMNC: %6$@" + }, + "Login.PhoneGenericEmailSubject": { + "key": "Login.PhoneGenericEmailSubject", + "value": "Telegram iOS error: %@" + }, + "Login.PhoneNumberAlreadyAuthorized": { + "key": "Login.PhoneNumberAlreadyAuthorized", + "value": "This account is already logged in from this app." + }, + "Login.PhoneNumberAlreadyAuthorizedSwitch": { + "key": "Login.PhoneNumberAlreadyAuthorizedSwitch", + "value": "Switch" + }, + "Login.PhoneNumberHelp": { + "key": "Login.PhoneNumberHelp", + "value": "Help" + }, + "Login.PhonePlaceholder": { + "key": "Login.PhonePlaceholder", + "value": "Your phone number" + }, + "Login.PhoneTitle": { + "key": "Login.PhoneTitle", + "value": "Your Phone" + }, + "Login.ResetAccountProtected.LimitExceeded": { + "key": "Login.ResetAccountProtected.LimitExceeded", + "value": "Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days." + }, + "Login.ResetAccountProtected.Reset": { + "key": "Login.ResetAccountProtected.Reset", + "value": "Reset" + }, + "Login.ResetAccountProtected.Text": { + "key": "Login.ResetAccountProtected.Text", + "value": "Since the account %@ is active and protected by a password, it will be deleted in 1 week. This delay is required for security purposes.\n\nYou can cancel this process anytime." + }, + "Login.ResetAccountProtected.TimerTitle": { + "key": "Login.ResetAccountProtected.TimerTitle", + "value": "You'll be able to reset your account in:" + }, + "Login.ResetAccountProtected.Title": { + "key": "Login.ResetAccountProtected.Title", + "value": "Reset Account" + }, + "Login.SelectCountry.Title": { + "key": "Login.SelectCountry.Title", + "value": "Country" + }, + "Login.SendCodeViaSms": { + "key": "Login.SendCodeViaSms", + "value": "Send the code as an SMS" + }, + "Login.SmsRequestState1": { + "key": "Login.SmsRequestState1", + "value": "Sending you an SMS in %d:%.2d" + }, + "Login.SmsRequestState2": { + "key": "Login.SmsRequestState2", + "value": "Requesting an SMS from Telegram..." + }, + "Login.SmsRequestState3": { + "key": "Login.SmsRequestState3", + "value": "Telegram sent you an SMS\n[Didn't get the code?]" + }, + "Login.TermsOfService.ProceedBot": { + "key": "Login.TermsOfService.ProceedBot", + "value": "Please agree and proceed to %@." + }, + "Login.TermsOfServiceAgree": { + "key": "Login.TermsOfServiceAgree", + "value": "Agree & Continue" + }, + "Login.TermsOfServiceDecline": { + "key": "Login.TermsOfServiceDecline", + "value": "Decline" + }, + "Login.TermsOfServiceHeader": { + "key": "Login.TermsOfServiceHeader", + "value": "Terms of Service" + }, + "Login.TermsOfServiceLabel": { + "key": "Login.TermsOfServiceLabel", + "value": "By signing up,\nyou agree to the [Terms of Service]." + }, + "Login.TermsOfServiceSignupDecline": { + "key": "Login.TermsOfServiceSignupDecline", + "value": "We're very sorry, but this means you can't sign up for Telegram.\n\nUnlike others, we don't use your data for ad targeting or other commercial purposes. Telegram only stores the information it needs to function as a feature-rich cloud service. You can adjust how we use your data (e.g., delete synced contacts) in Privacy & Security settings.\n\nBut if you're generally not OK with Telegram's modest requirements, it won't be possible for us to provide you with this service." + }, + "Login.UnknownError": { + "key": "Login.UnknownError", + "value": "An error occurred. Please try again later" + }, + "Login.WillCallYou": { + "key": "Login.WillCallYou", + "value": "Telegram will call you in %@" + }, + "Login.WillSendSms": { + "key": "Login.WillSendSms", + "value": "Telegram will send you an SMS in %@" + }, + "LoginPassword.FloodError": { + "key": "LoginPassword.FloodError", + "value": "Limit exceeded. Please try again later." + }, + "LoginPassword.ForgotPassword": { + "key": "LoginPassword.ForgotPassword", + "value": "Forgot password?" + }, + "LoginPassword.InvalidPasswordError": { + "key": "LoginPassword.InvalidPasswordError", + "value": "Invalid password. Please try again." + }, + "LoginPassword.PasswordHelp": { + "key": "LoginPassword.PasswordHelp", + "value": "Two-Step verification enabled. Your account is protected with an additional password." + }, + "LoginPassword.PasswordPlaceholder": { + "key": "LoginPassword.PasswordPlaceholder", + "value": "Password" + }, + "LoginPassword.ResetAccount": { + "key": "LoginPassword.ResetAccount", + "value": "Reset Account" + }, + "LoginPassword.Title": { + "key": "LoginPassword.Title", + "value": "Your Password" + }, + "LogoutOptions.AddAccountText": { + "key": "LogoutOptions.AddAccountText", + "value": "Connect other Telegram accounts and easily switch between them." + }, + "LogoutOptions.AddAccountTitle": { + "key": "LogoutOptions.AddAccountTitle", + "value": "Add another account" + }, + "LogoutOptions.AlternativeOptionsSection": { + "key": "LogoutOptions.AlternativeOptionsSection", + "value": "ALTERNATIVE OPTIONS" + }, + "LogoutOptions.ChangePhoneNumberText": { + "key": "LogoutOptions.ChangePhoneNumberText", + "value": "Move your account, chats and media to a new number." + }, + "LogoutOptions.ChangePhoneNumberTitle": { + "key": "LogoutOptions.ChangePhoneNumberTitle", + "value": "Change Phone Number" + }, + "LogoutOptions.ClearCacheText": { + "key": "LogoutOptions.ClearCacheText", + "value": "Free up disk space on your device; your media will stay in the cloud." + }, + "LogoutOptions.ClearCacheTitle": { + "key": "LogoutOptions.ClearCacheTitle", + "value": "Clear Cache" + }, + "LogoutOptions.ContactSupportText": { + "key": "LogoutOptions.ContactSupportText", + "value": "Tell us about any issues; logging out doesn't usually help." + }, + "LogoutOptions.ContactSupportTitle": { + "key": "LogoutOptions.ContactSupportTitle", + "value": "Contact Support" + }, + "LogoutOptions.LogOut": { + "key": "LogoutOptions.LogOut", + "value": "Log Out" + }, + "LogoutOptions.LogOutInfo": { + "key": "LogoutOptions.LogOutInfo", + "value": "Logging out deactivates all Secret Chats." + }, + "LogoutOptions.SetPasscodeText": { + "key": "LogoutOptions.SetPasscodeText", + "value": "Lock the app with a passcode so that others can't open it." + }, + "LogoutOptions.SetPasscodeTitle": { + "key": "LogoutOptions.SetPasscodeTitle", + "value": "Set a Passcode" + }, + "LogoutOptions.Title": { + "key": "LogoutOptions.Title", + "value": "Log out" + }, + "MESSAGES": { + "key": "MESSAGES", + "value": "%1$@ sent you %2$@ messages" + }, + "MESSAGES_SEPARATED": { + "key": "MESSAGES_SEPARATED", + "value": "%1$@|sent you %2$@ messages" + }, + "MESSAGE_AUDIO": { + "key": "MESSAGE_AUDIO", + "value": "%1$@ sent you a voice message" + }, + "MESSAGE_AUDIO_SEPARATED": { + "key": "MESSAGE_AUDIO_SEPARATED", + "value": "%1$@|sent you a voice message" + }, + "MESSAGE_CONTACT": { + "key": "MESSAGE_CONTACT", + "value": "%1$@ shared a contact with you" + }, + "MESSAGE_CONTACT_SEPARATED": { + "key": "MESSAGE_CONTACT_SEPARATED", + "value": "%1$@|shared a contact with you" + }, + "MESSAGE_DOC": { + "key": "MESSAGE_DOC", + "value": "%1$@ sent you a file" + }, + "MESSAGE_DOC_SEPARATED": { + "key": "MESSAGE_DOC_SEPARATED", + "value": "%1$@|sent you a file" + }, + "MESSAGE_FWDS": { + "key": "MESSAGE_FWDS", + "value": "%1$@ forwarded you %2$@ messages" + }, + "MESSAGE_FWDS_SEPARATED": { + "key": "MESSAGE_FWDS_SEPARATED", + "value": "%1$@|forwarded you %2$@ messages" + }, + "MESSAGE_GAME": { + "key": "MESSAGE_GAME", + "value": "%1$@ invited you to play %2$@" + }, + "MESSAGE_GAME_SEPARATED": { + "key": "MESSAGE_GAME_SEPARATED", + "value": "%1$@|invited you to play %2$@" + }, + "MESSAGE_GEO": { + "key": "MESSAGE_GEO", + "value": "%1$@ sent you a map" + }, + "MESSAGE_GEOLIVE": { + "key": "MESSAGE_GEOLIVE", + "value": "%1$@ started sharing their live location" + }, + "MESSAGE_GEOLIVE_SEPARATED": { + "key": "MESSAGE_GEOLIVE_SEPARATED", + "value": "%1$@|started sharing their live location" + }, + "MESSAGE_GEO_SEPARATED": { + "key": "MESSAGE_GEO_SEPARATED", + "value": "%1$@|sent you a map" + }, + "MESSAGE_GIF": { + "key": "MESSAGE_GIF", + "value": "%1$@ sent you a GIF" + }, + "MESSAGE_GIF_SEPARATED": { + "key": "MESSAGE_GIF_SEPARATED", + "value": "%1$@|sent you a GIF" + }, + "MESSAGE_INVOICE": { + "key": "MESSAGE_INVOICE", + "value": "%1$@ sent you an invoice for %2$@" + }, + "MESSAGE_INVOICE_SEPARATED": { + "key": "MESSAGE_INVOICE_SEPARATED", + "value": "%1$@|sent you an invoice for %2$@" + }, + "MESSAGE_NOTEXT": { + "key": "MESSAGE_NOTEXT", + "value": "%1$@ sent you a message" + }, + "MESSAGE_NOTEXT_SEPARATED": { + "key": "MESSAGE_NOTEXT_SEPARATED", + "value": "%1$@|sent you a message" + }, + "MESSAGE_PHOTO": { + "key": "MESSAGE_PHOTO", + "value": "%1$@ sent you a photo" + }, + "MESSAGE_PHOTOS": { + "key": "MESSAGE_PHOTOS", + "value": "%1$@ sent you %2$@ photos" + }, + "MESSAGE_PHOTOS_SEPARATED": { + "key": "MESSAGE_PHOTOS_SEPARATED", + "value": "%1$@|sent you %2$@ photos" + }, + "MESSAGE_PHOTO_SECRET": { + "key": "MESSAGE_PHOTO_SECRET", + "value": "%1$@ sent you a self-destructing photo" + }, + "MESSAGE_PHOTO_SECRET_SEPARATED": { + "key": "MESSAGE_PHOTO_SECRET_SEPARATED", + "value": "%1$@|sent you a self-destructing photo" + }, + "MESSAGE_PHOTO_SEPARATED": { + "key": "MESSAGE_PHOTO_SEPARATED", + "value": "%1$@|sent you a photo" + }, + "MESSAGE_POLL": { + "key": "MESSAGE_POLL", + "value": "%1$@ sent you a poll" + }, + "MESSAGE_POLL_SEPARATED": { + "key": "MESSAGE_POLL_SEPARATED", + "value": "%1$@|sent you a poll" + }, + "MESSAGE_ROUND": { + "key": "MESSAGE_ROUND", + "value": "%1$@ sent you a video message" + }, + "MESSAGE_ROUND_SEPARATED": { + "key": "MESSAGE_ROUND_SEPARATED", + "value": "%1$@|sent you a video message" + }, + "MESSAGE_SCREENSHOT": { + "key": "MESSAGE_SCREENSHOT", + "value": "%1$@ took a screenshot!" + }, + "MESSAGE_SCREENSHOT_SEPARATED": { + "key": "MESSAGE_SCREENSHOT_SEPARATED", + "value": "%1$@|took a screenshot" + }, + "MESSAGE_STICKER": { + "key": "MESSAGE_STICKER", + "value": "%1$@ sent you a %2$@sticker" + }, + "MESSAGE_STICKER_SEPARATED": { + "key": "MESSAGE_STICKER_SEPARATED", + "value": "%1$@|sent you a %2$@ sticker" + }, + "MESSAGE_TEXT": { + "key": "MESSAGE_TEXT", + "value": "%1$@: %2$@" + }, + "MESSAGE_TEXT_SEPARATED": { + "key": "MESSAGE_TEXT_SEPARATED", + "value": "%1$@|%2$@" + }, + "MESSAGE_VIDEO": { + "key": "MESSAGE_VIDEO", + "value": "%1$@ sent you a video" + }, + "MESSAGE_VIDEO_SECRET": { + "key": "MESSAGE_VIDEO_SECRET", + "value": "%1$@ sent you a self-destructing video" + }, + "MESSAGE_VIDEO_SECRET_SEPARATED": { + "key": "MESSAGE_VIDEO_SECRET_SEPARATED", + "value": "%1$@|sent you a self-destructing video" + }, + "MESSAGE_VIDEO_SEPARATED": { + "key": "MESSAGE_VIDEO_SEPARATED", + "value": "%1$@|sent you a video" + }, + "Map.AccurateTo": { + "key": "Map.AccurateTo", + "value": "Accurate to %@" + }, + "Map.AddressOnMap": { + "key": "Map.AddressOnMap", + "value": "Address On Map" + }, + "Map.ChooseAPlace": { + "key": "Map.ChooseAPlace", + "value": "Or choose a place" + }, + "Map.ChooseLocationTitle": { + "key": "Map.ChooseLocationTitle", + "value": "Location" + }, + "Map.Directions": { + "key": "Map.Directions", + "value": "Directions" + }, + "Map.DirectionsDriveEta": { + "key": "Map.DirectionsDriveEta", + "value": "%@ drive" + }, + "Map.DistanceAway": { + "key": "Map.DistanceAway", + "value": "%@ away" + }, + "Map.ETAHours": { + "key": "Map.ETAHours", + "zeroValue": null, + "oneValue": "%@ h", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ h" + }, + "Map.ETAMinutes": { + "key": "Map.ETAMinutes", + "zeroValue": null, + "oneValue": "%@ min", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ min" + }, + "Map.GetDirections": { + "key": "Map.GetDirections", + "value": "Get Directions" + }, + "Map.Home": { + "key": "Map.Home", + "value": "Home" + }, + "Map.HomeAndWorkInfo": { + "key": "Map.HomeAndWorkInfo", + "value": "Telegram uses the Home and Work addresses from your Contact Card.\n\nKeep your Contact Card up to date for quick access to sending Home and Work addresses." + }, + "Map.HomeAndWorkTitle": { + "key": "Map.HomeAndWorkTitle", + "value": "Home & Work Addresses" + }, + "Map.Hybrid": { + "key": "Map.Hybrid", + "value": "Hybrid" + }, + "Map.LiveLocationFor15Minutes": { + "key": "Map.LiveLocationFor15Minutes", + "value": "for 15 minutes" + }, + "Map.LiveLocationFor1Hour": { + "key": "Map.LiveLocationFor1Hour", + "value": "for 1 hour" + }, + "Map.LiveLocationFor8Hours": { + "key": "Map.LiveLocationFor8Hours", + "value": "for 8 hours" + }, + "Map.LiveLocationGroupDescription": { + "key": "Map.LiveLocationGroupDescription", + "value": "Choose for how long people in this chat will see your live location." + }, + "Map.LiveLocationPrivateDescription": { + "key": "Map.LiveLocationPrivateDescription", + "value": "Choose for how long %@ will see your accurate location." + }, + "Map.LiveLocationShortHour": { + "key": "Map.LiveLocationShortHour", + "value": "%@h" + }, + "Map.LiveLocationShowAll": { + "key": "Map.LiveLocationShowAll", + "value": "Show All" + }, + "Map.LiveLocationTitle": { + "key": "Map.LiveLocationTitle", + "value": "Live Location" + }, + "Map.LoadError": { + "key": "Map.LoadError", + "value": "An error occurred, please try again." + }, + "Map.Locating": { + "key": "Map.Locating", + "value": "Locating..." + }, + "Map.LocatingError": { + "key": "Map.LocatingError", + "value": "Failed to locate" + }, + "Map.Location": { + "key": "Map.Location", + "value": "Location" + }, + "Map.LocationTitle": { + "key": "Map.LocationTitle", + "value": "Location" + }, + "Map.Map": { + "key": "Map.Map", + "value": "Map" + }, + "Map.NoPlacesNearby": { + "key": "Map.NoPlacesNearby", + "value": "There are no known places nearby.\nTry a different location." + }, + "Map.OpenIn": { + "key": "Map.OpenIn", + "value": "Open In" + }, + "Map.OpenInGoogleMaps": { + "key": "Map.OpenInGoogleMaps", + "value": "Open in Google Maps" + }, + "Map.OpenInHereMaps": { + "key": "Map.OpenInHereMaps", + "value": "Open in HERE Maps" + }, + "Map.OpenInMaps": { + "key": "Map.OpenInMaps", + "value": "Open in Maps" + }, + "Map.OpenInWaze": { + "key": "Map.OpenInWaze", + "value": "Open in Waze" + }, + "Map.OpenInYandexMaps": { + "key": "Map.OpenInYandexMaps", + "value": "Open in Yandex Maps" + }, + "Map.OpenInYandexNavigator": { + "key": "Map.OpenInYandexNavigator", + "value": "Open in Yandex Navigator" + }, + "Map.PlacesInThisArea": { + "key": "Map.PlacesInThisArea", + "value": "Places In This Area" + }, + "Map.PlacesNearby": { + "key": "Map.PlacesNearby", + "value": "Places Nearby" + }, + "Map.PullUpForPlaces": { + "key": "Map.PullUpForPlaces", + "value": "PULL UP TO SEE PLACES NEARBY" + }, + "Map.Satellite": { + "key": "Map.Satellite", + "value": "Satellite" + }, + "Map.Search": { + "key": "Map.Search", + "value": "Search places nearby" + }, + "Map.SearchNoResultsDescription": { + "key": "Map.SearchNoResultsDescription", + "value": "There were no results for \"%@\".\nTry a new search." + }, + "Map.SendMyCurrentLocation": { + "key": "Map.SendMyCurrentLocation", + "value": "Send My Current Location" + }, + "Map.SendThisLocation": { + "key": "Map.SendThisLocation", + "value": "Send This Location" + }, + "Map.SendThisPlace": { + "key": "Map.SendThisPlace", + "value": "Send This Place" + }, + "Map.SetThisLocation": { + "key": "Map.SetThisLocation", + "value": "Set This Location" + }, + "Map.SetThisPlace": { + "key": "Map.SetThisPlace", + "value": "Set This Place" + }, + "Map.ShareLiveLocation": { + "key": "Map.ShareLiveLocation", + "value": "Share My Live Location for..." + }, + "Map.ShareLiveLocationHelp": { + "key": "Map.ShareLiveLocationHelp", + "value": "Updated in real time as you move" + }, + "Map.ShowPlaces": { + "key": "Map.ShowPlaces", + "value": "Show places" + }, + "Map.StopLiveLocation": { + "key": "Map.StopLiveLocation", + "value": "Stop Sharing Location" + }, + "Map.Unknown": { + "key": "Map.Unknown", + "value": "Unknown location" + }, + "Map.Work": { + "key": "Map.Work", + "value": "Work" + }, + "Map.YouAreHere": { + "key": "Map.YouAreHere", + "value": "you are here" + }, + "MaskStickerSettings.Info": { + "key": "MaskStickerSettings.Info", + "value": "You can add masks to photos and videos you send. To do this, open the photo editor before sending a photo or video." + }, + "MaskStickerSettings.Title": { + "key": "MaskStickerSettings.Title", + "value": "Masks" + }, + "Media.LimitedAccessChangeSettings": { + "key": "Media.LimitedAccessChangeSettings", + "value": "Change Settings" + }, + "Media.LimitedAccessManage": { + "key": "Media.LimitedAccessManage", + "value": "Manage" + }, + "Media.LimitedAccessSelectMore": { + "key": "Media.LimitedAccessSelectMore", + "value": "Select More Photos..." + }, + "Media.LimitedAccessText": { + "key": "Media.LimitedAccessText", + "value": "You have limited Telegram from accessing all of your photos." + }, + "Media.LimitedAccessTitle": { + "key": "Media.LimitedAccessTitle", + "value": "Limited Access to Media" + }, + "Media.SendWithTimer": { + "key": "Media.SendWithTimer", + "value": "Send With Timer" + }, + "Media.SendingOptionsTooltip": { + "key": "Media.SendingOptionsTooltip", + "value": "Hold this button to send your message with a self-destruct timer." + }, + "Media.ShareItem": { + "key": "Media.ShareItem", + "zeroValue": null, + "oneValue": "1 Item", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "All %@ Items" + }, + "Media.SharePhoto": { + "key": "Media.SharePhoto", + "zeroValue": null, + "oneValue": "1 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "All %@ Photos" + }, + "Media.ShareThisPhoto": { + "key": "Media.ShareThisPhoto", + "value": "This Photo" + }, + "Media.ShareThisVideo": { + "key": "Media.ShareThisVideo", + "value": "This Video" + }, + "Media.ShareVideo": { + "key": "Media.ShareVideo", + "zeroValue": null, + "oneValue": "1 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "All %@ Videos" + }, + "MediaPicker.AddCaption": { + "key": "MediaPicker.AddCaption", + "value": "Add a caption..." + }, + "MediaPicker.CameraRoll": { + "key": "MediaPicker.CameraRoll", + "value": "Camera Roll" + }, + "MediaPicker.GroupDescription": { + "key": "MediaPicker.GroupDescription", + "value": "Group media into one message" + }, + "MediaPicker.LivePhotoDescription": { + "key": "MediaPicker.LivePhotoDescription", + "value": "The live photo will autoplay and loop like a GIF." + }, + "MediaPicker.Send": { + "key": "MediaPicker.Send", + "value": "Send" + }, + "MediaPicker.TapToUngroupDescription": { + "key": "MediaPicker.TapToUngroupDescription", + "value": "Tap to send media separately" + }, + "MediaPicker.TimerTooltip": { + "key": "MediaPicker.TimerTooltip", + "value": "You can now set a self-destruct timer" + }, + "MediaPicker.UngroupDescription": { + "key": "MediaPicker.UngroupDescription", + "value": "Show media as separate messages" + }, + "MediaPicker.VideoMuteDescription": { + "key": "MediaPicker.VideoMuteDescription", + "value": "Sound is now muted, so the video will autoplay and loop like a GIF." + }, + "MediaPicker.Videos": { + "key": "MediaPicker.Videos", + "value": "Videos" + }, + "MediaPlayer.UnknownArtist": { + "key": "MediaPlayer.UnknownArtist", + "value": "Unknown Artist" + }, + "MediaPlayer.UnknownTrack": { + "key": "MediaPlayer.UnknownTrack", + "value": "Unknown Track" + }, + "MemberSearch.BotSection": { + "key": "MemberSearch.BotSection", + "value": "BOTS" + }, + "Message.Animation": { + "key": "Message.Animation", + "value": "GIF" + }, + "Message.Audio": { + "key": "Message.Audio", + "value": "Voice Message" + }, + "Message.AuthorPinnedGame": { + "key": "Message.AuthorPinnedGame", + "value": "%@ pinned a game" + }, + "Message.Contact": { + "key": "Message.Contact", + "value": "Contact" + }, + "Message.FakeAccount": { + "key": "Message.FakeAccount", + "value": "Fake" + }, + "Message.File": { + "key": "Message.File", + "value": "File" + }, + "Message.ForwardedMessage": { + "key": "Message.ForwardedMessage", + "value": "Forwarded Message\nFrom: %@" + }, + "Message.ForwardedMessageShort": { + "key": "Message.ForwardedMessageShort", + "value": "Forwarded From\n%@" + }, + "Message.ForwardedPsa.covid": { + "key": "Message.ForwardedPsa.covid", + "value": "COVID-19 Notification\nFrom: %@" + }, + "Message.Game": { + "key": "Message.Game", + "value": "Game" + }, + "Message.GenericForwardedPsa": { + "key": "Message.GenericForwardedPsa", + "value": "Public Service Announcement\nFrom: %@" + }, + "Message.ImageExpired": { + "key": "Message.ImageExpired", + "value": "Photo has expired" + }, + "Message.ImportedDateFormat": { + "key": "Message.ImportedDateFormat", + "value": "%1$@, %2$@ Imported %3$@" + }, + "Message.InvoiceLabel": { + "key": "Message.InvoiceLabel", + "value": "INVOICE" + }, + "Message.LiveLocation": { + "key": "Message.LiveLocation", + "value": "Live Location" + }, + "Message.Location": { + "key": "Message.Location", + "value": "Location" + }, + "Message.PaymentSent": { + "key": "Message.PaymentSent", + "value": "Payment: %@" + }, + "Message.Photo": { + "key": "Message.Photo", + "value": "Photo" + }, + "Message.PinnedAnimationMessage": { + "key": "Message.PinnedAnimationMessage", + "value": "pinned GIF" + }, + "Message.PinnedAudioMessage": { + "key": "Message.PinnedAudioMessage", + "value": "pinned voice message" + }, + "Message.PinnedContactMessage": { + "key": "Message.PinnedContactMessage", + "value": "pinned contact" + }, + "Message.PinnedDocumentMessage": { + "key": "Message.PinnedDocumentMessage", + "value": "pinned file" + }, + "Message.PinnedGame": { + "key": "Message.PinnedGame", + "value": "pinned a game" + }, + "Message.PinnedGenericMessage": { + "key": "Message.PinnedGenericMessage", + "value": "%@ pinned a message" + }, + "Message.PinnedInvoice": { + "key": "Message.PinnedInvoice", + "value": "pinned an invoice" + }, + "Message.PinnedLiveLocationMessage": { + "key": "Message.PinnedLiveLocationMessage", + "value": "pinned live location" + }, + "Message.PinnedLocationMessage": { + "key": "Message.PinnedLocationMessage", + "value": "pinned location" + }, + "Message.PinnedPhotoMessage": { + "key": "Message.PinnedPhotoMessage", + "value": "pinned photo" + }, + "Message.PinnedPollMessage": { + "key": "Message.PinnedPollMessage", + "value": "pinned poll" + }, + "Message.PinnedStickerMessage": { + "key": "Message.PinnedStickerMessage", + "value": "pinned sticker" + }, + "Message.PinnedTextMessage": { + "key": "Message.PinnedTextMessage", + "value": "pinned \"%@\"" + }, + "Message.PinnedVideoMessage": { + "key": "Message.PinnedVideoMessage", + "value": "pinned video" + }, + "Message.ReplyActionButtonShowReceipt": { + "key": "Message.ReplyActionButtonShowReceipt", + "value": "Show Receipt" + }, + "Message.ScamAccount": { + "key": "Message.ScamAccount", + "value": "Scam" + }, + "Message.Sticker": { + "key": "Message.Sticker", + "value": "Sticker" + }, + "Message.StickerText": { + "key": "Message.StickerText", + "value": "%@ Sticker" + }, + "Message.Theme": { + "key": "Message.Theme", + "value": "Color Theme" + }, + "Message.Video": { + "key": "Message.Video", + "value": "Video" + }, + "Message.VideoExpired": { + "key": "Message.VideoExpired", + "value": "Video has expired" + }, + "Message.VideoMessage": { + "key": "Message.VideoMessage", + "value": "Video Message" + }, + "Message.Wallpaper": { + "key": "Message.Wallpaper", + "value": "Chat Background" + }, + "MessagePoll.LabelAnonymous": { + "key": "MessagePoll.LabelAnonymous", + "value": "Anonymous Poll" + }, + "MessagePoll.LabelAnonymousQuiz": { + "key": "MessagePoll.LabelAnonymousQuiz", + "value": "Anonymous Quiz" + }, + "MessagePoll.LabelClosed": { + "key": "MessagePoll.LabelClosed", + "value": "Final Results" + }, + "MessagePoll.LabelPoll": { + "key": "MessagePoll.LabelPoll", + "value": "Poll" + }, + "MessagePoll.LabelQuiz": { + "key": "MessagePoll.LabelQuiz", + "value": "Quiz" + }, + "MessagePoll.NoVotes": { + "key": "MessagePoll.NoVotes", + "value": "No votes" + }, + "MessagePoll.QuizCount": { + "key": "MessagePoll.QuizCount", + "zeroValue": null, + "oneValue": "1 answered", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ answered" + }, + "MessagePoll.QuizNoUsers": { + "key": "MessagePoll.QuizNoUsers", + "value": "Nobody answered yet" + }, + "MessagePoll.SubmitVote": { + "key": "MessagePoll.SubmitVote", + "value": "Vote" + }, + "MessagePoll.ViewResults": { + "key": "MessagePoll.ViewResults", + "value": "View Results" + }, + "MessagePoll.VotedCount": { + "key": "MessagePoll.VotedCount", + "zeroValue": null, + "oneValue": "1 vote", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ votes" + }, + "MessageTimer.Custom": { + "key": "MessageTimer.Custom", + "value": "Custom" + }, + "MessageTimer.Days": { + "key": "MessageTimer.Days", + "zeroValue": null, + "oneValue": "%@ day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ days" + }, + "MessageTimer.Forever": { + "key": "MessageTimer.Forever", + "value": "Forever" + }, + "MessageTimer.Hours": { + "key": "MessageTimer.Hours", + "zeroValue": null, + "oneValue": "%@ hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ hours" + }, + "MessageTimer.Minutes": { + "key": "MessageTimer.Minutes", + "zeroValue": null, + "oneValue": "%@ minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ minutes" + }, + "MessageTimer.Months": { + "key": "MessageTimer.Months", + "zeroValue": null, + "oneValue": "%@ month", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ months" + }, + "MessageTimer.Seconds": { + "key": "MessageTimer.Seconds", + "zeroValue": null, + "oneValue": "%@ second", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ seconds" + }, + "MessageTimer.ShortDays": { + "key": "MessageTimer.ShortDays", + "zeroValue": null, + "oneValue": "%@d", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@d" + }, + "MessageTimer.ShortHours": { + "key": "MessageTimer.ShortHours", + "zeroValue": null, + "oneValue": "%@h", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@h" + }, + "MessageTimer.ShortMinutes": { + "key": "MessageTimer.ShortMinutes", + "zeroValue": null, + "oneValue": "%@m", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@m" + }, + "MessageTimer.ShortSeconds": { + "key": "MessageTimer.ShortSeconds", + "zeroValue": null, + "oneValue": "%@s", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@s" + }, + "MessageTimer.ShortWeeks": { + "key": "MessageTimer.ShortWeeks", + "zeroValue": null, + "oneValue": "%@w", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@w" + }, + "MessageTimer.Weeks": { + "key": "MessageTimer.Weeks", + "zeroValue": null, + "oneValue": "%@ week", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ weeks" + }, + "Month.GenApril": { + "key": "Month.GenApril", + "value": "April" + }, + "Month.GenAugust": { + "key": "Month.GenAugust", + "value": "August" + }, + "Month.GenDecember": { + "key": "Month.GenDecember", + "value": "December" + }, + "Month.GenFebruary": { + "key": "Month.GenFebruary", + "value": "February" + }, + "Month.GenJanuary": { + "key": "Month.GenJanuary", + "value": "January" + }, + "Month.GenJuly": { + "key": "Month.GenJuly", + "value": "July" + }, + "Month.GenJune": { + "key": "Month.GenJune", + "value": "June" + }, + "Month.GenMarch": { + "key": "Month.GenMarch", + "value": "March" + }, + "Month.GenMay": { + "key": "Month.GenMay", + "value": "May" + }, + "Month.GenNovember": { + "key": "Month.GenNovember", + "value": "November" + }, + "Month.GenOctober": { + "key": "Month.GenOctober", + "value": "October" + }, + "Month.GenSeptember": { + "key": "Month.GenSeptember", + "value": "September" + }, + "Month.ShortApril": { + "key": "Month.ShortApril", + "value": "Apr" + }, + "Month.ShortAugust": { + "key": "Month.ShortAugust", + "value": "Aug" + }, + "Month.ShortDecember": { + "key": "Month.ShortDecember", + "value": "Dec" + }, + "Month.ShortFebruary": { + "key": "Month.ShortFebruary", + "value": "Feb" + }, + "Month.ShortJanuary": { + "key": "Month.ShortJanuary", + "value": "Jan" + }, + "Month.ShortJuly": { + "key": "Month.ShortJuly", + "value": "Jul" + }, + "Month.ShortJune": { + "key": "Month.ShortJune", + "value": "Jun" + }, + "Month.ShortMarch": { + "key": "Month.ShortMarch", + "value": "Mar" + }, + "Month.ShortMay": { + "key": "Month.ShortMay", + "value": "May" + }, + "Month.ShortNovember": { + "key": "Month.ShortNovember", + "value": "Nov" + }, + "Month.ShortOctober": { + "key": "Month.ShortOctober", + "value": "Oct" + }, + "Month.ShortSeptember": { + "key": "Month.ShortSeptember", + "value": "Sep" + }, + "MusicPlayer.VoiceNote": { + "key": "MusicPlayer.VoiceNote", + "value": "Voice Message" + }, + "MuteExpires.Days": { + "key": "MuteExpires.Days", + "zeroValue": null, + "oneValue": "in 1 day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "in %@ days" + }, + "MuteExpires.Hours": { + "key": "MuteExpires.Hours", + "zeroValue": null, + "oneValue": "in 1 hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "in %@ hours" + }, + "MuteExpires.Minutes": { + "key": "MuteExpires.Minutes", + "zeroValue": null, + "oneValue": "in 1 minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "in %@ minutes" + }, + "MuteFor.Days": { + "key": "MuteFor.Days", + "zeroValue": null, + "oneValue": "Mute for 1 day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Mute for %@ days" + }, + "MuteFor.Forever": { + "key": "MuteFor.Forever", + "value": "Mute Forever" + }, + "MuteFor.Hours": { + "key": "MuteFor.Hours", + "zeroValue": null, + "oneValue": "Mute for 1 hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Mute for %@ hours" + }, + "NEW_CHANNEL_MESSAGES_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|posted a message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|posted %2$d messages" + }, + "NEW_CHANNEL_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|posted a forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|posted %2$d forwarded messages" + }, + "NEW_CHANNEL_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|posted a photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|posted %2$d photos" + }, + "NEW_CHAT_MESSAGES_SEPARATED": { + "key": "NEW_CHAT_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%2$@|%1$@ sent a message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@ sent %3$d messages" + }, + "NEW_CHAT_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_CHAT_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%2$@|%1$@ forwarded a message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@ forwarded %3$d messages" + }, + "NEW_CHAT_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_CHAT_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%2$@|%1$@ sent a photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@ sent %3$d photos" + }, + "NEW_MESSAGES_SEPARATED": { + "key": "NEW_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|sent you a message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|sent you %2$d messages" + }, + "NEW_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|forwarded you a message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|forwarded you %2$d messages" + }, + "NEW_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@|sent you a photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|sent you %2$d photos" + }, + "NetworkUsageSettings.BytesReceived": { + "key": "NetworkUsageSettings.BytesReceived", + "value": "Bytes Received" + }, + "NetworkUsageSettings.BytesSent": { + "key": "NetworkUsageSettings.BytesSent", + "value": "Bytes Sent" + }, + "NetworkUsageSettings.CallDataSection": { + "key": "NetworkUsageSettings.CallDataSection", + "value": "CALLS" + }, + "NetworkUsageSettings.Cellular": { + "key": "NetworkUsageSettings.Cellular", + "value": "Cellular" + }, + "NetworkUsageSettings.CellularUsageSince": { + "key": "NetworkUsageSettings.CellularUsageSince", + "value": "Cellular usage since %@" + }, + "NetworkUsageSettings.GeneralDataSection": { + "key": "NetworkUsageSettings.GeneralDataSection", + "value": "MESSAGES" + }, + "NetworkUsageSettings.MediaAudioDataSection": { + "key": "NetworkUsageSettings.MediaAudioDataSection", + "value": "AUDIO" + }, + "NetworkUsageSettings.MediaDocumentDataSection": { + "key": "NetworkUsageSettings.MediaDocumentDataSection", + "value": "FILES" + }, + "NetworkUsageSettings.MediaImageDataSection": { + "key": "NetworkUsageSettings.MediaImageDataSection", + "value": "PHOTOS" + }, + "NetworkUsageSettings.MediaVideoDataSection": { + "key": "NetworkUsageSettings.MediaVideoDataSection", + "value": "VIDEOS" + }, + "NetworkUsageSettings.ResetStats": { + "key": "NetworkUsageSettings.ResetStats", + "value": "Reset Statistics" + }, + "NetworkUsageSettings.ResetStatsConfirmation": { + "key": "NetworkUsageSettings.ResetStatsConfirmation", + "value": "Do you want to reset your usage statistics?" + }, + "NetworkUsageSettings.Title": { + "key": "NetworkUsageSettings.Title", + "value": "Network Usage" + }, + "NetworkUsageSettings.TotalSection": { + "key": "NetworkUsageSettings.TotalSection", + "value": "TOTAL BYTES" + }, + "NetworkUsageSettings.Wifi": { + "key": "NetworkUsageSettings.Wifi", + "value": "Wi-Fi" + }, + "NetworkUsageSettings.WifiUsageSince": { + "key": "NetworkUsageSettings.WifiUsageSince", + "value": "Wi-Fi usage since %@" + }, + "NewContact.Title": { + "key": "NewContact.Title", + "value": "New Contact" + }, + "Notification.CallBack": { + "key": "Notification.CallBack", + "value": "Call Back" + }, + "Notification.CallCanceled": { + "key": "Notification.CallCanceled", + "value": "Cancelled Call" + }, + "Notification.CallCanceledShort": { + "key": "Notification.CallCanceledShort", + "value": "Cancelled" + }, + "Notification.CallFormat": { + "key": "Notification.CallFormat", + "value": "%1$@, %2$@" + }, + "Notification.CallIncoming": { + "key": "Notification.CallIncoming", + "value": "Incoming Call" + }, + "Notification.CallIncomingShort": { + "key": "Notification.CallIncomingShort", + "value": "Incoming" + }, + "Notification.CallMissed": { + "key": "Notification.CallMissed", + "value": "Missed Call" + }, + "Notification.CallMissedShort": { + "key": "Notification.CallMissedShort", + "value": "Missed" + }, + "Notification.CallOutgoing": { + "key": "Notification.CallOutgoing", + "value": "Outgoing Call" + }, + "Notification.CallOutgoingShort": { + "key": "Notification.CallOutgoingShort", + "value": "Outgoing" + }, + "Notification.CallTimeFormat": { + "key": "Notification.CallTimeFormat", + "value": "%1$@ (%2$@)" + }, + "Notification.ChangedGroupName": { + "key": "Notification.ChangedGroupName", + "value": "%@ changed the group name to \"%@\"" + }, + "Notification.ChangedGroupPhoto": { + "key": "Notification.ChangedGroupPhoto", + "value": "%@ changed group photo" + }, + "Notification.ChangedGroupVideo": { + "key": "Notification.ChangedGroupVideo", + "value": "%@ changed group video" + }, + "Notification.ChannelInviter": { + "key": "Notification.ChannelInviter", + "value": "%@ invited you to this channel" + }, + "Notification.ChannelInviterSelf": { + "key": "Notification.ChannelInviterSelf", + "value": "You joined this channel" + }, + "Notification.ChannelMigratedFrom": { + "key": "Notification.ChannelMigratedFrom", + "value": "This group was upgraded to a supergroup" + }, + "Notification.CreatedChannel": { + "key": "Notification.CreatedChannel", + "value": "Channel created" + }, + "Notification.CreatedChat": { + "key": "Notification.CreatedChat", + "value": "%@ created a group" + }, + "Notification.CreatedChatWithTitle": { + "key": "Notification.CreatedChatWithTitle", + "value": "%@ created the group \"%@\"" + }, + "Notification.CreatedGroup": { + "key": "Notification.CreatedGroup", + "value": "Group created" + }, + "Notification.Exceptions.Add": { + "key": "Notification.Exceptions.Add", + "value": "Add" + }, + "Notification.Exceptions.AddException": { + "key": "Notification.Exceptions.AddException", + "value": "Add an Exception" + }, + "Notification.Exceptions.AlwaysOff": { + "key": "Notification.Exceptions.AlwaysOff", + "value": "Always Off" + }, + "Notification.Exceptions.AlwaysOn": { + "key": "Notification.Exceptions.AlwaysOn", + "value": "Always On" + }, + "Notification.Exceptions.DeleteAll": { + "key": "Notification.Exceptions.DeleteAll", + "value": "Delete All" + }, + "Notification.Exceptions.DeleteAllConfirmation": { + "key": "Notification.Exceptions.DeleteAllConfirmation", + "value": "Are you sure you want to delete all exceptions?" + }, + "Notification.Exceptions.MessagePreviewAlwaysOff": { + "key": "Notification.Exceptions.MessagePreviewAlwaysOff", + "value": "Always Off" + }, + "Notification.Exceptions.MessagePreviewAlwaysOn": { + "key": "Notification.Exceptions.MessagePreviewAlwaysOn", + "value": "Always On" + }, + "Notification.Exceptions.MutedUntil": { + "key": "Notification.Exceptions.MutedUntil", + "value": "Muted until %@" + }, + "Notification.Exceptions.NewException": { + "key": "Notification.Exceptions.NewException", + "value": "New Exception" + }, + "Notification.Exceptions.NewException.MessagePreviewHeader": { + "key": "Notification.Exceptions.NewException.MessagePreviewHeader", + "value": "MESSAGE PREVIEW" + }, + "Notification.Exceptions.NewException.NotificationHeader": { + "key": "Notification.Exceptions.NewException.NotificationHeader", + "value": "NOTIFICATIONS" + }, + "Notification.Exceptions.PreviewAlwaysOff": { + "key": "Notification.Exceptions.PreviewAlwaysOff", + "value": "Hide Preview" + }, + "Notification.Exceptions.PreviewAlwaysOn": { + "key": "Notification.Exceptions.PreviewAlwaysOn", + "value": "Show Preview" + }, + "Notification.Exceptions.RemoveFromExceptions": { + "key": "Notification.Exceptions.RemoveFromExceptions", + "value": "Remove from Exceptions" + }, + "Notification.Exceptions.Sound": { + "key": "Notification.Exceptions.Sound", + "value": "Sound: %@" + }, + "Notification.GameScoreExtended": { + "key": "Notification.GameScoreExtended", + "zeroValue": null, + "oneValue": "scored %@ in {game}", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "scored %@ in {game}" + }, + "Notification.GameScoreSelfExtended": { + "key": "Notification.GameScoreSelfExtended", + "zeroValue": null, + "oneValue": "scored %@ in {game}", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "scored %@ in {game}" + }, + "Notification.GameScoreSelfSimple": { + "key": "Notification.GameScoreSelfSimple", + "zeroValue": null, + "oneValue": "scored %@", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "scored %@" + }, + "Notification.GameScoreSimple": { + "key": "Notification.GameScoreSimple", + "zeroValue": null, + "oneValue": "scored %@", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "scored %@" + }, + "Notification.GroupInviter": { + "key": "Notification.GroupInviter", + "value": "%@ invited you to this group" + }, + "Notification.GroupInviterSelf": { + "key": "Notification.GroupInviterSelf", + "value": "You joined this group" + }, + "Notification.Invited": { + "key": "Notification.Invited", + "value": "%@ invited %@" + }, + "Notification.InvitedMultiple": { + "key": "Notification.InvitedMultiple", + "value": "%@ invited %@" + }, + "Notification.Joined": { + "key": "Notification.Joined", + "value": "%@ joined Telegram" + }, + "Notification.JoinedChannel": { + "key": "Notification.JoinedChannel", + "value": "%@ joined the channel" + }, + "Notification.JoinedChat": { + "key": "Notification.JoinedChat", + "value": "%@ joined the group" + }, + "Notification.JoinedGroupByLink": { + "key": "Notification.JoinedGroupByLink", + "value": "%@ joined the group via invite link" + }, + "Notification.Kicked": { + "key": "Notification.Kicked", + "value": "%@ removed %@" + }, + "Notification.LeftChannel": { + "key": "Notification.LeftChannel", + "value": "%@ left the channel" + }, + "Notification.LeftChat": { + "key": "Notification.LeftChat", + "value": "%@ left the group" + }, + "Notification.MessageLifetime1d": { + "key": "Notification.MessageLifetime1d", + "value": "1 day" + }, + "Notification.MessageLifetime1h": { + "key": "Notification.MessageLifetime1h", + "value": "1 hour" + }, + "Notification.MessageLifetime1m": { + "key": "Notification.MessageLifetime1m", + "value": "1 minute" + }, + "Notification.MessageLifetime1w": { + "key": "Notification.MessageLifetime1w", + "value": "1 week" + }, + "Notification.MessageLifetime2s": { + "key": "Notification.MessageLifetime2s", + "value": "2 seconds" + }, + "Notification.MessageLifetime5s": { + "key": "Notification.MessageLifetime5s", + "value": "5 seconds" + }, + "Notification.MessageLifetimeChanged": { + "key": "Notification.MessageLifetimeChanged", + "value": "%1$@ set the self-destruct timer to %2$@" + }, + "Notification.MessageLifetimeChangedOutgoing": { + "key": "Notification.MessageLifetimeChangedOutgoing", + "value": "You set the self-destruct timer to %1$@" + }, + "Notification.MessageLifetimeRemoved": { + "key": "Notification.MessageLifetimeRemoved", + "value": "%1$@ disabled the self-destruct timer" + }, + "Notification.MessageLifetimeRemovedOutgoing": { + "key": "Notification.MessageLifetimeRemovedOutgoing", + "value": "You disabled the self-destruct timer" + }, + "Notification.Mute1h": { + "key": "Notification.Mute1h", + "value": "Mute for 1 hour" + }, + "Notification.Mute1hMin": { + "key": "Notification.Mute1hMin", + "value": "Mute for 1h" + }, + "Notification.NewAuthDetected": { + "key": "Notification.NewAuthDetected", + "value": "%1$@,\nWe detected a login to your account from a new device on %2$@, %3$@ at %4$@.\n\nDevice: %5$@\nLocation: %6$@\n\nIf this wasn't you, you can go to Settings > Devices and terminate that session.\n\nIf you think that somebody logged in to your account against your will, you can enable Two-Step Verification in Privacy and Security settings.\n\nSincerely,\nThe Telegram Team" + }, + "Notification.PassportValueAddress": { + "key": "Notification.PassportValueAddress", + "value": "your address" + }, + "Notification.PassportValueEmail": { + "key": "Notification.PassportValueEmail", + "value": "email address" + }, + "Notification.PassportValuePersonalDetails": { + "key": "Notification.PassportValuePersonalDetails", + "value": "personal details" + }, + "Notification.PassportValuePhone": { + "key": "Notification.PassportValuePhone", + "value": "phone number" + }, + "Notification.PassportValueProofOfAddress": { + "key": "Notification.PassportValueProofOfAddress", + "value": "proof of address" + }, + "Notification.PassportValueProofOfIdentity": { + "key": "Notification.PassportValueProofOfIdentity", + "value": "proof of identity" + }, + "Notification.PassportValuesSentMessage": { + "key": "Notification.PassportValuesSentMessage", + "value": "%1$@ received the following documents: %2$@" + }, + "Notification.PaymentSent": { + "key": "Notification.PaymentSent", + "value": "You successfully transferred {amount} to {name} for {title}" + }, + "Notification.PinnedAnimationMessage": { + "key": "Notification.PinnedAnimationMessage", + "value": "%@ pinned a GIF" + }, + "Notification.PinnedAudioMessage": { + "key": "Notification.PinnedAudioMessage", + "value": "%@ pinned a voice message" + }, + "Notification.PinnedContactMessage": { + "key": "Notification.PinnedContactMessage", + "value": "%@ pinned a contact" + }, + "Notification.PinnedDeletedMessage": { + "key": "Notification.PinnedDeletedMessage", + "value": "%@ pinned deleted message" + }, + "Notification.PinnedDocumentMessage": { + "key": "Notification.PinnedDocumentMessage", + "value": "%@ pinned a file" + }, + "Notification.PinnedLiveLocationMessage": { + "key": "Notification.PinnedLiveLocationMessage", + "value": "%@ pinned a live location" + }, + "Notification.PinnedLocationMessage": { + "key": "Notification.PinnedLocationMessage", + "value": "%@ pinned a map" + }, + "Notification.PinnedMessage": { + "key": "Notification.PinnedMessage", + "value": "pinned message" + }, + "Notification.PinnedPhotoMessage": { + "key": "Notification.PinnedPhotoMessage", + "value": "%@ pinned a photo" + }, + "Notification.PinnedPollMessage": { + "key": "Notification.PinnedPollMessage", + "value": "%@ pinned a poll" + }, + "Notification.PinnedQuizMessage": { + "key": "Notification.PinnedQuizMessage", + "value": "%@ pinned a quiz" + }, + "Notification.PinnedRoundMessage": { + "key": "Notification.PinnedRoundMessage", + "value": "%@ pinned a video message" + }, + "Notification.PinnedStickerMessage": { + "key": "Notification.PinnedStickerMessage", + "value": "%@ pinned a sticker" + }, + "Notification.PinnedTextMessage": { + "key": "Notification.PinnedTextMessage", + "value": "%@ pinned \"%@\"" + }, + "Notification.PinnedVideoMessage": { + "key": "Notification.PinnedVideoMessage", + "value": "%@ pinned a video" + }, + "Notification.ProximityReached": { + "key": "Notification.ProximityReached", + "value": "%1$@ is now within %2$@ from %3$@" + }, + "Notification.ProximityReachedYou": { + "key": "Notification.ProximityReachedYou", + "value": "%1$@ is now within %2$@ from you" + }, + "Notification.ProximityYouReached": { + "key": "Notification.ProximityYouReached", + "value": "You are now within %1$@ from %2$@" + }, + "Notification.RemovedGroupPhoto": { + "key": "Notification.RemovedGroupPhoto", + "value": "%@ removed group photo" + }, + "Notification.RenamedChannel": { + "key": "Notification.RenamedChannel", + "value": "Channel renamed" + }, + "Notification.RenamedChat": { + "key": "Notification.RenamedChat", + "value": "%@ renamed group" + }, + "Notification.RenamedGroup": { + "key": "Notification.RenamedGroup", + "value": "Group renamed" + }, + "Notification.Reply": { + "key": "Notification.Reply", + "value": "Reply" + }, + "Notification.SecretChatMessageScreenshot": { + "key": "Notification.SecretChatMessageScreenshot", + "value": "%@ took a screenshot!" + }, + "Notification.SecretChatMessageScreenshotSelf": { + "key": "Notification.SecretChatMessageScreenshotSelf", + "value": "You took a screenshot!" + }, + "Notification.SecretChatScreenshot": { + "key": "Notification.SecretChatScreenshot", + "value": "Screenshot taken!" + }, + "Notification.VideoCallCanceled": { + "key": "Notification.VideoCallCanceled", + "value": "Cancelled Video Call" + }, + "Notification.VideoCallIncoming": { + "key": "Notification.VideoCallIncoming", + "value": "Incoming Video Call" + }, + "Notification.VideoCallMissed": { + "key": "Notification.VideoCallMissed", + "value": "Missed Video Call" + }, + "Notification.VideoCallOutgoing": { + "key": "Notification.VideoCallOutgoing", + "value": "Outgoing Video Call" + }, + "Notification.VoiceChatEnded": { + "key": "Notification.VoiceChatEnded", + "value": "Voice chat ended (%@)" + }, + "Notification.VoiceChatInvitation": { + "key": "Notification.VoiceChatInvitation", + "value": "%1$@ invited %2$@ to the voice chat" + }, + "Notification.VoiceChatInvitationForYou": { + "key": "Notification.VoiceChatInvitationForYou", + "value": "%1$@ invited you to the voice chat" + }, + "Notification.VoiceChatStarted": { + "key": "Notification.VoiceChatStarted", + "value": "%1$@ started a voice chat" + }, + "NotificationSettings.ContactJoined": { + "key": "NotificationSettings.ContactJoined", + "value": "New Contacts" + }, + "NotificationSettings.ContactJoinedInfo": { + "key": "NotificationSettings.ContactJoinedInfo", + "value": "Receive push notifications when one of your contacts becomes available on Telegram." + }, + "NotificationSettings.ShowNotificationsAllAccounts": { + "key": "NotificationSettings.ShowNotificationsAllAccounts", + "value": "All Accounts" + }, + "NotificationSettings.ShowNotificationsAllAccountsInfoOff": { + "key": "NotificationSettings.ShowNotificationsAllAccountsInfoOff", + "value": "Turn this on if you want to receive notifications from all your accounts." + }, + "NotificationSettings.ShowNotificationsAllAccountsInfoOn": { + "key": "NotificationSettings.ShowNotificationsAllAccountsInfoOn", + "value": "Turn this off if you want to receive notifications only from the account you are currently using." + }, + "NotificationSettings.ShowNotificationsFromAccountsSection": { + "key": "NotificationSettings.ShowNotificationsFromAccountsSection", + "value": "SHOW NOTIFICATIONS FROM" + }, + "Notifications.AddExceptionTitle": { + "key": "Notifications.AddExceptionTitle", + "value": "Add Exception" + }, + "Notifications.AlertTones": { + "key": "Notifications.AlertTones", + "value": "ALERT TONES" + }, + "Notifications.Badge": { + "key": "Notifications.Badge", + "value": "BADGE COUNTER" + }, + "Notifications.Badge.CountUnreadMessages": { + "key": "Notifications.Badge.CountUnreadMessages", + "value": "Count Unread Messages" + }, + "Notifications.Badge.CountUnreadMessages.InfoOff": { + "key": "Notifications.Badge.CountUnreadMessages.InfoOff", + "value": "Switch on to show the number of unread messages instead of chats." + }, + "Notifications.Badge.CountUnreadMessages.InfoOn": { + "key": "Notifications.Badge.CountUnreadMessages.InfoOn", + "value": "Switch off to show the number of unread chats instead of messages." + }, + "Notifications.Badge.IncludeChannels": { + "key": "Notifications.Badge.IncludeChannels", + "value": "Include Channels" + }, + "Notifications.Badge.IncludeMutedChats": { + "key": "Notifications.Badge.IncludeMutedChats", + "value": "Include Muted Chats" + }, + "Notifications.Badge.IncludePublicGroups": { + "key": "Notifications.Badge.IncludePublicGroups", + "value": "Include Public Groups" + }, + "Notifications.ChannelNotifications": { + "key": "Notifications.ChannelNotifications", + "value": "CHANNEL NOTIFICATIONS" + }, + "Notifications.ChannelNotificationsAlert": { + "key": "Notifications.ChannelNotificationsAlert", + "value": "Show Notifications" + }, + "Notifications.ChannelNotificationsExceptionsHelp": { + "key": "Notifications.ChannelNotificationsExceptionsHelp", + "value": "Set custom notifications for specific channels." + }, + "Notifications.ChannelNotificationsHelp": { + "key": "Notifications.ChannelNotificationsHelp", + "value": "You can set custom notifications for specific channels on the Channel Info page." + }, + "Notifications.ChannelNotificationsPreview": { + "key": "Notifications.ChannelNotificationsPreview", + "value": "Message Preview" + }, + "Notifications.ChannelNotificationsSound": { + "key": "Notifications.ChannelNotificationsSound", + "value": "Sound" + }, + "Notifications.ClassicTones": { + "key": "Notifications.ClassicTones", + "value": "CLASSIC" + }, + "Notifications.DisplayNamesOnLockScreen": { + "key": "Notifications.DisplayNamesOnLockScreen", + "value": "Names on Lock Screen" + }, + "Notifications.DisplayNamesOnLockScreenInfo": { + "key": "Notifications.DisplayNamesOnLockScreenInfo", + "value": "Display names in notifications when the device is locked. To disable, open iOS Settings > Telegram > Notifications, and set \"Show Previews\" to \"When Unlocked\" or \"Never\"." + }, + "Notifications.DisplayNamesOnLockScreenInfoWithLink": { + "key": "Notifications.DisplayNamesOnLockScreenInfoWithLink", + "value": "Display names in notifications when the device is locked. To disable, make sure that \"Show Previews\" is also set to \"When Unlocked\" or \"Never\" in [iOS Settings > Notifications]." + }, + "Notifications.ExceptionMuteExpires.Days": { + "key": "Notifications.ExceptionMuteExpires.Days", + "zeroValue": null, + "oneValue": "In 1 day", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "In %@ days" + }, + "Notifications.ExceptionMuteExpires.Hours": { + "key": "Notifications.ExceptionMuteExpires.Hours", + "zeroValue": null, + "oneValue": "In 1 hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "In %@ hours" + }, + "Notifications.ExceptionMuteExpires.Minutes": { + "key": "Notifications.ExceptionMuteExpires.Minutes", + "zeroValue": null, + "oneValue": "In 1 minute", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "In %@ minutes" + }, + "Notifications.Exceptions": { + "key": "Notifications.Exceptions", + "zeroValue": null, + "oneValue": "%@ chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ chats" + }, + "Notifications.ExceptionsChangeSound": { + "key": "Notifications.ExceptionsChangeSound", + "value": "Change Sound (%@)" + }, + "Notifications.ExceptionsDefaultSound": { + "key": "Notifications.ExceptionsDefaultSound", + "value": "Default" + }, + "Notifications.ExceptionsGroupPlaceholder": { + "key": "Notifications.ExceptionsGroupPlaceholder", + "value": "This section will list all groups and channels with non-default notification settings" + }, + "Notifications.ExceptionsMessagePlaceholder": { + "key": "Notifications.ExceptionsMessagePlaceholder", + "value": "This section will list all private chats with non-default notification settings" + }, + "Notifications.ExceptionsMuted": { + "key": "Notifications.ExceptionsMuted", + "value": "Muted" + }, + "Notifications.ExceptionsNone": { + "key": "Notifications.ExceptionsNone", + "value": "None" + }, + "Notifications.ExceptionsTitle": { + "key": "Notifications.ExceptionsTitle", + "value": "Exceptions" + }, + "Notifications.ExceptionsUnmuted": { + "key": "Notifications.ExceptionsUnmuted", + "value": "Unmuted" + }, + "Notifications.GroupNotifications": { + "key": "Notifications.GroupNotifications", + "value": "GROUP NOTIFICATIONS" + }, + "Notifications.GroupNotificationsAlert": { + "key": "Notifications.GroupNotificationsAlert", + "value": "Show Notifications" + }, + "Notifications.GroupNotificationsExceptions": { + "key": "Notifications.GroupNotificationsExceptions", + "value": "Exceptions" + }, + "Notifications.GroupNotificationsExceptionsHelp": { + "key": "Notifications.GroupNotificationsExceptionsHelp", + "value": "Set custom notifications for specific groups." + }, + "Notifications.GroupNotificationsHelp": { + "key": "Notifications.GroupNotificationsHelp", + "value": "You can set custom notifications for specific groups on the Group Info page." + }, + "Notifications.GroupNotificationsPreview": { + "key": "Notifications.GroupNotificationsPreview", + "value": "Message Preview" + }, + "Notifications.GroupNotificationsSound": { + "key": "Notifications.GroupNotificationsSound", + "value": "Sound" + }, + "Notifications.InAppNotifications": { + "key": "Notifications.InAppNotifications", + "value": "IN-APP NOTIFICATIONS" + }, + "Notifications.InAppNotificationsPreview": { + "key": "Notifications.InAppNotificationsPreview", + "value": "In-App Preview" + }, + "Notifications.InAppNotificationsSounds": { + "key": "Notifications.InAppNotificationsSounds", + "value": "In-App Sounds" + }, + "Notifications.InAppNotificationsVibrate": { + "key": "Notifications.InAppNotificationsVibrate", + "value": "In-App Vibrate" + }, + "Notifications.MessageNotifications": { + "key": "Notifications.MessageNotifications", + "value": "MESSAGE NOTIFICATIONS" + }, + "Notifications.MessageNotificationsAlert": { + "key": "Notifications.MessageNotificationsAlert", + "value": "Show Notifications" + }, + "Notifications.MessageNotificationsExceptions": { + "key": "Notifications.MessageNotificationsExceptions", + "value": "Exceptions" + }, + "Notifications.MessageNotificationsExceptionsHelp": { + "key": "Notifications.MessageNotificationsExceptionsHelp", + "value": "Set custom notifications for specific users." + }, + "Notifications.MessageNotificationsHelp": { + "key": "Notifications.MessageNotificationsHelp", + "value": "You can set custom notifications for specific users on their profile page." + }, + "Notifications.MessageNotificationsPreview": { + "key": "Notifications.MessageNotificationsPreview", + "value": "Message Preview" + }, + "Notifications.MessageNotificationsSound": { + "key": "Notifications.MessageNotificationsSound", + "value": "Sound" + }, + "Notifications.PermissionsAllow": { + "key": "Notifications.PermissionsAllow", + "value": "Turn Notifications ON" + }, + "Notifications.PermissionsAllowInSettings": { + "key": "Notifications.PermissionsAllowInSettings", + "value": "Turn ON in Settings" + }, + "Notifications.PermissionsEnable": { + "key": "Notifications.PermissionsEnable", + "value": "Enable" + }, + "Notifications.PermissionsKeepDisabled": { + "key": "Notifications.PermissionsKeepDisabled", + "value": "Keep Disabled" + }, + "Notifications.PermissionsOpenSettings": { + "key": "Notifications.PermissionsOpenSettings", + "value": "Open Settings" + }, + "Notifications.PermissionsSuppressWarningText": { + "key": "Notifications.PermissionsSuppressWarningText", + "value": "You may miss important messages on Telegram due to your current settings.\n\nFor better results, enable alerts or banners and try muting certain chats or chat types in Telegram settings." + }, + "Notifications.PermissionsSuppressWarningTitle": { + "key": "Notifications.PermissionsSuppressWarningTitle", + "value": "Keep notifications disabled?" + }, + "Notifications.PermissionsText": { + "key": "Notifications.PermissionsText", + "value": "Don't miss important messages from your friends and coworkers." + }, + "Notifications.PermissionsTitle": { + "key": "Notifications.PermissionsTitle", + "value": "Turn ON Notifications" + }, + "Notifications.PermissionsUnreachableText": { + "key": "Notifications.PermissionsUnreachableText", + "value": "Please note that you partly disabled message notifications in your Settings." + }, + "Notifications.PermissionsUnreachableTitle": { + "key": "Notifications.PermissionsUnreachableTitle", + "value": "Check Notification Settings" + }, + "Notifications.Reset": { + "key": "Notifications.Reset", + "value": "Reset" + }, + "Notifications.ResetAllNotifications": { + "key": "Notifications.ResetAllNotifications", + "value": "Reset All Notifications" + }, + "Notifications.ResetAllNotificationsHelp": { + "key": "Notifications.ResetAllNotificationsHelp", + "value": "Undo all custom notification settings for all your contacts, groups and channels." + }, + "Notifications.TextTone": { + "key": "Notifications.TextTone", + "value": "Text Tone" + }, + "Notifications.Title": { + "key": "Notifications.Title", + "value": "Notifications" + }, + "NotificationsSound.Alert": { + "key": "NotificationsSound.Alert", + "value": "Alert" + }, + "NotificationsSound.Aurora": { + "key": "NotificationsSound.Aurora", + "value": "Aurora" + }, + "NotificationsSound.Bamboo": { + "key": "NotificationsSound.Bamboo", + "value": "Bamboo" + }, + "NotificationsSound.Bell": { + "key": "NotificationsSound.Bell", + "value": "Bell" + }, + "NotificationsSound.Calypso": { + "key": "NotificationsSound.Calypso", + "value": "Calypso" + }, + "NotificationsSound.Chime": { + "key": "NotificationsSound.Chime", + "value": "Chime" + }, + "NotificationsSound.Chord": { + "key": "NotificationsSound.Chord", + "value": "Chord" + }, + "NotificationsSound.Circles": { + "key": "NotificationsSound.Circles", + "value": "Circles" + }, + "NotificationsSound.Complete": { + "key": "NotificationsSound.Complete", + "value": "Complete" + }, + "NotificationsSound.Glass": { + "key": "NotificationsSound.Glass", + "value": "Glass" + }, + "NotificationsSound.Hello": { + "key": "NotificationsSound.Hello", + "value": "Hello" + }, + "NotificationsSound.Input": { + "key": "NotificationsSound.Input", + "value": "Input" + }, + "NotificationsSound.Keys": { + "key": "NotificationsSound.Keys", + "value": "Keys" + }, + "NotificationsSound.None": { + "key": "NotificationsSound.None", + "value": "None" + }, + "NotificationsSound.Note": { + "key": "NotificationsSound.Note", + "value": "Note" + }, + "NotificationsSound.Popcorn": { + "key": "NotificationsSound.Popcorn", + "value": "Popcorn" + }, + "NotificationsSound.Pulse": { + "key": "NotificationsSound.Pulse", + "value": "Pulse" + }, + "NotificationsSound.Synth": { + "key": "NotificationsSound.Synth", + "value": "Synth" + }, + "NotificationsSound.Telegraph": { + "key": "NotificationsSound.Telegraph", + "value": "Telegraph" + }, + "NotificationsSound.Tremolo": { + "key": "NotificationsSound.Tremolo", + "value": "Tremolo" + }, + "NotificationsSound.Tritone": { + "key": "NotificationsSound.Tritone", + "value": "Tri-tone" + }, + "OldChannels.ChannelFormat": { + "key": "OldChannels.ChannelFormat", + "value": "channel, " + }, + "OldChannels.ChannelsHeader": { + "key": "OldChannels.ChannelsHeader", + "value": "LEAST ACTIVE" + }, + "OldChannels.GroupEmptyFormat": { + "key": "OldChannels.GroupEmptyFormat", + "value": "group, " + }, + "OldChannels.GroupFormat": { + "key": "OldChannels.GroupFormat", + "zeroValue": null, + "oneValue": "%@ member ", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ members " + }, + "OldChannels.InactiveMonth": { + "key": "OldChannels.InactiveMonth", + "zeroValue": null, + "oneValue": "inactive %@ month", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "inactive %@ months" + }, + "OldChannels.InactiveWeek": { + "key": "OldChannels.InactiveWeek", + "zeroValue": null, + "oneValue": "inactive %@ week", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "inactive %@ weeks" + }, + "OldChannels.InactiveYear": { + "key": "OldChannels.InactiveYear", + "zeroValue": null, + "oneValue": "inactive %@ year", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "inactive %@ years" + }, + "OldChannels.Leave": { + "key": "OldChannels.Leave", + "zeroValue": null, + "oneValue": "Leave %@ Chat", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Leave %@ Chats" + }, + "OldChannels.NoticeCreateText": { + "key": "OldChannels.NoticeCreateText", + "value": "Sorry, you are member of too many groups and channels.\nPlease leave some before creating a new one." + }, + "OldChannels.NoticeText": { + "key": "OldChannels.NoticeText", + "value": "Sorry, you are member of too many groups and channels.\nPlease leave some before joining new one." + }, + "OldChannels.NoticeTitle": { + "key": "OldChannels.NoticeTitle", + "value": "Too Many Groups and Channels" + }, + "OldChannels.NoticeUpgradeText": { + "key": "OldChannels.NoticeUpgradeText", + "value": "Sorry, you are a member of too many groups and channels.\nFor technical reasons, you need to leave some first before changing this setting in your groups." + }, + "OldChannels.Title": { + "key": "OldChannels.Title", + "value": "Limit Reached" + }, + "OpenFile.PotentiallyDangerousContentAlert": { + "key": "OpenFile.PotentiallyDangerousContentAlert", + "value": "Previewing this file can potentially expose your IP address to its sender. Continue?" + }, + "OpenFile.Proceed": { + "key": "OpenFile.Proceed", + "value": "Proceed" + }, + "OwnershipTransfer.ComeBackLater": { + "key": "OwnershipTransfer.ComeBackLater", + "value": "\n\nPlease come back later." + }, + "OwnershipTransfer.SecurityCheck": { + "key": "OwnershipTransfer.SecurityCheck", + "value": "Security Check" + }, + "OwnershipTransfer.SecurityRequirements": { + "key": "OwnershipTransfer.SecurityRequirements", + "value": "Ownership transfers are available if:\n\n• 2-Step verification was enabled for your account more than **7 days** ago.\n\n• You have logged in on this device more than **24 hours** ago." + }, + "OwnershipTransfer.SetupTwoStepAuth": { + "key": "OwnershipTransfer.SetupTwoStepAuth", + "value": "Enable 2-Step Verification" + }, + "OwnershipTransfer.Transfer": { + "key": "OwnershipTransfer.Transfer", + "value": "Transfer" + }, + "PHONE_CALL_MISSED": { + "key": "PHONE_CALL_MISSED", + "value": "You missed a call from %1$@" + }, + "PHONE_CALL_MISSED_SEPARATED": { + "key": "PHONE_CALL_MISSED_SEPARATED", + "value": "%1$@|You missed a call" + }, + "PHONE_CALL_REQUEST": { + "key": "PHONE_CALL_REQUEST", + "value": "%1$@ is calling you" + }, + "PHONE_CALL_REQUEST_SEPARATED": { + "key": "PHONE_CALL_REQUEST_SEPARATED", + "value": "%1$@|is calling you!" + }, + "PINNED_AUDIO": { + "key": "PINNED_AUDIO", + "value": "%1$@ pinned a voice message" + }, + "PINNED_AUDIO_SEPARATED": { + "key": "PINNED_AUDIO_SEPARATED", + "value": "%1$@|pinned a voice message" + }, + "PINNED_CONTACT": { + "key": "PINNED_CONTACT", + "value": "%1$@ pinned a contact" + }, + "PINNED_CONTACT_SEPARATED": { + "key": "PINNED_CONTACT_SEPARATED", + "value": "%1$@|pinned a contact" + }, + "PINNED_DOC": { + "key": "PINNED_DOC", + "value": "%1$@ pinned a file" + }, + "PINNED_DOC_SEPARATED": { + "key": "PINNED_DOC_SEPARATED", + "value": "%1$@|pinned a file" + }, + "PINNED_GAME": { + "key": "PINNED_GAME", + "value": "%1$@ pinned a game" + }, + "PINNED_GAME_SEPARATED": { + "key": "PINNED_GAME_SEPARATED", + "value": "%1$@|pinned a game" + }, + "PINNED_GEO": { + "key": "PINNED_GEO", + "value": "%1$@ pinned a map" + }, + "PINNED_GEOLIVE": { + "key": "PINNED_GEOLIVE", + "value": "%1$@ pinned a live location" + }, + "PINNED_GEOLIVE_SEPARATED": { + "key": "PINNED_GEOLIVE_SEPARATED", + "value": "%1$@|pinned a live location" + }, + "PINNED_GEO_SEPARATED": { + "key": "PINNED_GEO_SEPARATED", + "value": "%1$@|pinned a map" + }, + "PINNED_GIF": { + "key": "PINNED_GIF", + "value": "%1$@ pinned a GIF" + }, + "PINNED_GIF_SEPARATED": { + "key": "PINNED_GIF_SEPARATED", + "value": "%1$@|pinned a GIF" + }, + "PINNED_INVOICE": { + "key": "PINNED_INVOICE", + "value": "%1$@ pinned an invoice" + }, + "PINNED_INVOICE_SEPARATED": { + "key": "PINNED_INVOICE_SEPARATED", + "value": "%1$@|pinned an invoice" + }, + "PINNED_NOTEXT": { + "key": "PINNED_NOTEXT", + "value": "%1$@ pinned a message" + }, + "PINNED_NOTEXT_SEPARATED": { + "key": "PINNED_NOTEXT_SEPARATED", + "value": "%1$@|pinned a message" + }, + "PINNED_PHOTO": { + "key": "PINNED_PHOTO", + "value": "%1$@ pinned a photo" + }, + "PINNED_PHOTO_SEPARATED": { + "key": "PINNED_PHOTO_SEPARATED", + "value": "%1$@|pinned a photo" + }, + "PINNED_POLL": { + "key": "PINNED_POLL", + "value": "%1$@ pinned a poll" + }, + "PINNED_POLL_SEPARATED": { + "key": "PINNED_POLL_SEPARATED", + "value": "%1$@|pinned a poll" + }, + "PINNED_ROUND": { + "key": "PINNED_ROUND", + "value": "%1$@ pinned a video message" + }, + "PINNED_ROUND_SEPARATED": { + "key": "PINNED_ROUND_SEPARATED", + "value": "%1$@|pinned a video message" + }, + "PINNED_STICKER": { + "key": "PINNED_STICKER", + "value": "%1$@ pinned a %2$@ sticker" + }, + "PINNED_STICKER_SEPARATED": { + "key": "PINNED_STICKER_SEPARATED", + "value": "%1$@|pinned a %2$@ sticker" + }, + "PINNED_TEXT": { + "key": "PINNED_TEXT", + "value": "%1$@ pinned \"%2$@\"" + }, + "PINNED_TEXT_SEPARATED": { + "key": "PINNED_TEXT_SEPARATED", + "value": "%1$@|pinned \"%2$@\"" + }, + "PINNED_VIDEO": { + "key": "PINNED_VIDEO", + "value": "%1$@ pinned a video" + }, + "PINNED_VIDEO_SEPARATED": { + "key": "PINNED_VIDEO_SEPARATED", + "value": "%1$@|pinned a video" + }, + "PUSH_ALBUM": { + "key": "PUSH_ALBUM", + "value": "%1$@|📷📹 Album" + }, + "PUSH_AUTH_REGION": { + "key": "PUSH_AUTH_REGION", + "value": "New login|Device: %1$@. Location: %2$@" + }, + "PUSH_AUTH_UNKNOWN": { + "key": "PUSH_AUTH_UNKNOWN", + "value": "New login|from %1$@" + }, + "PUSH_CHANNEL_ALBUM": { + "key": "PUSH_CHANNEL_ALBUM", + "value": "%1$@|📷📹 Album" + }, + "PUSH_CHANNEL_MESSAGE": { + "key": "PUSH_CHANNEL_MESSAGE", + "value": "%1$@|New message" + }, + "PUSH_CHANNEL_MESSAGES": { + "key": "PUSH_CHANNEL_MESSAGES", + "zeroValue": null, + "oneValue": "%1$@|📷 Album", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📷 Album" + }, + "PUSH_CHANNEL_MESSAGE_AUDIO": { + "key": "PUSH_CHANNEL_MESSAGE_AUDIO", + "value": "%1$@|🎤 Voice message" + }, + "PUSH_CHANNEL_MESSAGE_CONTACT": { + "key": "PUSH_CHANNEL_MESSAGE_CONTACT", + "value": "%1$@|👤 %2$@" + }, + "PUSH_CHANNEL_MESSAGE_DOC": { + "key": "PUSH_CHANNEL_MESSAGE_DOC", + "value": "%1$@|📎 Document" + }, + "PUSH_CHANNEL_MESSAGE_DOCS": { + "key": "PUSH_CHANNEL_MESSAGE_DOCS", + "value": "%1$@|posted %2$d files" + }, + "PUSH_CHANNEL_MESSAGE_FWD": { + "key": "PUSH_CHANNEL_MESSAGE_FWD", + "value": "%1$@|Forwarded message" + }, + "PUSH_CHANNEL_MESSAGE_FWDS": { + "key": "PUSH_CHANNEL_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%1$@|Forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|%2$d forwarded messages" + }, + "PUSH_CHANNEL_MESSAGE_GAME": { + "key": "PUSH_CHANNEL_MESSAGE_GAME", + "value": "%1$@|🎮 Play %2$@" + }, + "PUSH_CHANNEL_MESSAGE_GEO": { + "key": "PUSH_CHANNEL_MESSAGE_GEO", + "value": "%1$@|📍 Location" + }, + "PUSH_CHANNEL_MESSAGE_GEOLIVE": { + "key": "PUSH_CHANNEL_MESSAGE_GEOLIVE", + "value": "%1$@|Live location" + }, + "PUSH_CHANNEL_MESSAGE_GIF": { + "key": "PUSH_CHANNEL_MESSAGE_GIF", + "value": "%1$@|📹 GIF" + }, + "PUSH_CHANNEL_MESSAGE_NOTEXT": { + "key": "PUSH_CHANNEL_MESSAGE_NOTEXT", + "value": "%1$@|New message" + }, + "PUSH_CHANNEL_MESSAGE_PHOTO": { + "key": "PUSH_CHANNEL_MESSAGE_PHOTO", + "value": "%1$@|📷 Photo" + }, + "PUSH_CHANNEL_MESSAGE_PHOTOS": { + "key": "PUSH_CHANNEL_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%1$@|📷 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📷 %2$d photos" + }, + "PUSH_CHANNEL_MESSAGE_POLL": { + "key": "PUSH_CHANNEL_MESSAGE_POLL", + "value": "%1$@|📊 Poll \"%2$@\"" + }, + "PUSH_CHANNEL_MESSAGE_QUIZ": { + "key": "PUSH_CHANNEL_MESSAGE_QUIZ", + "value": "%1$@|posted the quiz \"%2$@\"" + }, + "PUSH_CHANNEL_MESSAGE_ROUND": { + "key": "PUSH_CHANNEL_MESSAGE_ROUND", + "value": "%1$@|📺 Video message" + }, + "PUSH_CHANNEL_MESSAGE_ROUNDS": { + "key": "PUSH_CHANNEL_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%1$@|📺 Video message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📺 %2$d video messages" + }, + "PUSH_CHANNEL_MESSAGE_STICKER": { + "key": "PUSH_CHANNEL_MESSAGE_STICKER", + "value": "%1$@|%2$@ Sticker" + }, + "PUSH_CHANNEL_MESSAGE_TEXT": { + "key": "PUSH_CHANNEL_MESSAGE_TEXT", + "value": "%1$@|%2$@" + }, + "PUSH_CHANNEL_MESSAGE_VIDEO": { + "key": "PUSH_CHANNEL_MESSAGE_VIDEO", + "value": "%1$@|📹 Video" + }, + "PUSH_CHANNEL_MESSAGE_VIDEOS": { + "key": "PUSH_CHANNEL_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%1$@|📹 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📹 %2$d videos" + }, + "PUSH_CHAT_ADD_MEMBER": { + "key": "PUSH_CHAT_ADD_MEMBER", + "value": "%2$@|%1$@ invited %3$@ to the group" + }, + "PUSH_CHAT_ADD_YOU": { + "key": "PUSH_CHAT_ADD_YOU", + "value": "%2$@|%1$@ invited you to the group" + }, + "PUSH_CHAT_ALBUM": { + "key": "PUSH_CHAT_ALBUM", + "value": "%2$@|%1$@: 📷📹 Album" + }, + "PUSH_CHAT_CREATED": { + "key": "PUSH_CHAT_CREATED", + "value": "%2$@|%1$@ invited you to the group" + }, + "PUSH_CHAT_DELETE_MEMBER": { + "key": "PUSH_CHAT_DELETE_MEMBER", + "value": "%2$@|%1$@ removed %3$@ from the group" + }, + "PUSH_CHAT_DELETE_YOU": { + "key": "PUSH_CHAT_DELETE_YOU", + "value": "%2$@|%1$@ removed you from the group" + }, + "PUSH_CHAT_JOINED": { + "key": "PUSH_CHAT_JOINED", + "value": "%2$@|%1$@ joined the group" + }, + "PUSH_CHAT_LEFT": { + "key": "PUSH_CHAT_LEFT", + "value": "%2$@|%1$@ left the group" + }, + "PUSH_CHAT_MESSAGE": { + "key": "PUSH_CHAT_MESSAGE", + "value": "%2$@|%1$@: Message" + }, + "PUSH_CHAT_MESSAGES": { + "key": "PUSH_CHAT_MESSAGES", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📷 Album", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@: 📷 Album" + }, + "PUSH_CHAT_MESSAGE_AUDIO": { + "key": "PUSH_CHAT_MESSAGE_AUDIO", + "value": "%2$@|%1$@: 🎤 Voice message" + }, + "PUSH_CHAT_MESSAGE_CONTACT": { + "key": "PUSH_CHAT_MESSAGE_CONTACT", + "value": "%2$@|%1$@: 👤 %3$@" + }, + "PUSH_CHAT_MESSAGE_DOC": { + "key": "PUSH_CHAT_MESSAGE_DOC", + "value": "%2$@|%1$@: 📎 Document" + }, + "PUSH_CHAT_MESSAGE_DOCS": { + "key": "PUSH_CHAT_MESSAGE_DOCS", + "value": "%2$@|%1$@ sent %3$d files" + }, + "PUSH_CHAT_MESSAGE_DOCS_FIX1": { + "key": "PUSH_CHAT_MESSAGE_DOCS_FIX1", + "zeroValue": null, + "oneValue": "%2$@|%1$@ sent a file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@ sent %3$d files" + }, + "PUSH_CHAT_MESSAGE_FWD": { + "key": "PUSH_CHAT_MESSAGE_FWD", + "value": "%2$@|%1$@: Forwarded message" + }, + "PUSH_CHAT_MESSAGE_FWDS": { + "key": "PUSH_CHAT_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: Forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@: %3$d forwarded messages" + }, + "PUSH_CHAT_MESSAGE_GAME": { + "key": "PUSH_CHAT_MESSAGE_GAME", + "value": "%2$@|🎮 %1$@ invited the group to play %3$@" + }, + "PUSH_CHAT_MESSAGE_GAME_SCORE": { + "key": "PUSH_CHAT_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ scored %4$@ in %3$@ " + }, + "PUSH_CHAT_MESSAGE_GEO": { + "key": "PUSH_CHAT_MESSAGE_GEO", + "value": "%2$@|%1$@: 📍 Location" + }, + "PUSH_CHAT_MESSAGE_GEOLIVE": { + "key": "PUSH_CHAT_MESSAGE_GEOLIVE", + "value": "%2$@|%1$@: Live location" + }, + "PUSH_CHAT_MESSAGE_GIF": { + "key": "PUSH_CHAT_MESSAGE_GIF", + "value": "%2$@|%1$@: 📹 GIF" + }, + "PUSH_CHAT_MESSAGE_INVOICE": { + "key": "PUSH_CHAT_MESSAGE_INVOICE", + "value": "%2$@|%1$@: Invoice for %3$@" + }, + "PUSH_CHAT_MESSAGE_NOTEXT": { + "key": "PUSH_CHAT_MESSAGE_NOTEXT", + "value": " %2$@|%1$@: New message" + }, + "PUSH_CHAT_MESSAGE_PHOTO": { + "key": "PUSH_CHAT_MESSAGE_PHOTO", + "value": "%2$@|%1$@: 📷 Photo" + }, + "PUSH_CHAT_MESSAGE_PHOTOS": { + "key": "PUSH_CHAT_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📷 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@: 📷 %3$d photos" + }, + "PUSH_CHAT_MESSAGE_POLL": { + "key": "PUSH_CHAT_MESSAGE_POLL", + "value": "%2$@|%1$@: 📊 Poll \"%3$@\"" + }, + "PUSH_CHAT_MESSAGE_QUIZ": { + "key": "PUSH_CHAT_MESSAGE_QUIZ", + "value": "%2$@|%1$@ sent the quiz \"%3$@\" to the group" + }, + "PUSH_CHAT_MESSAGE_ROUND": { + "key": "PUSH_CHAT_MESSAGE_ROUND", + "value": "%2$@|%1$@: 📺 Video message" + }, + "PUSH_CHAT_MESSAGE_ROUNDS": { + "key": "PUSH_CHAT_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📺 Video message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@: 📺 %3$d video messages" + }, + "PUSH_CHAT_MESSAGE_STICKER": { + "key": "PUSH_CHAT_MESSAGE_STICKER", + "value": "%2$@|%1$@: %3$@ Sticker" + }, + "PUSH_CHAT_MESSAGE_TEXT": { + "key": "PUSH_CHAT_MESSAGE_TEXT", + "value": "%2$@|%1$@: %3$@" + }, + "PUSH_CHAT_MESSAGE_VIDEO": { + "key": "PUSH_CHAT_MESSAGE_VIDEO", + "value": "%2$@|%1$@: 📹 Video" + }, + "PUSH_CHAT_MESSAGE_VIDEOS": { + "key": "PUSH_CHAT_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📹 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%2$@|%1$@: 📹 %3$d videos" + }, + "PUSH_CHAT_PHOTO_EDITED": { + "key": "PUSH_CHAT_PHOTO_EDITED", + "value": "%2$@|%1$@ edited the group photo" + }, + "PUSH_CHAT_RETURNED": { + "key": "PUSH_CHAT_RETURNED", + "value": "%2$@|%1$@ returned to the group" + }, + "PUSH_CHAT_TITLE_EDITED": { + "key": "PUSH_CHAT_TITLE_EDITED", + "value": "%2$@|%1$@ edited the group name" + }, + "PUSH_CHAT_VOICECHAT_INVITE": { + "key": "PUSH_CHAT_VOICECHAT_INVITE", + "value": "%2$@|%1$@ invited %3$@ to the voice chat" + }, + "PUSH_CHAT_VOICECHAT_INVITE_YOU": { + "key": "PUSH_CHAT_VOICECHAT_INVITE_YOU", + "value": "%2$@|%1$@ invited you to the voice chat" + }, + "PUSH_CHAT_VOICECHAT_START": { + "key": "PUSH_CHAT_VOICECHAT_START", + "value": "%2$@|%1$@ started a voice chat" + }, + "PUSH_CONTACT_JOINED": { + "key": "PUSH_CONTACT_JOINED", + "value": "%1$@|joined Telegram!" + }, + "PUSH_ENCRYPTED_MESSAGE": { + "key": "PUSH_ENCRYPTED_MESSAGE", + "value": "You have a new message%1$@" + }, + "PUSH_ENCRYPTION_ACCEPT": { + "key": "PUSH_ENCRYPTION_ACCEPT", + "value": "Your secret chat was accepted%1$@" + }, + "PUSH_ENCRYPTION_REQUEST": { + "key": "PUSH_ENCRYPTION_REQUEST", + "value": "New secret chat request%1$@" + }, + "PUSH_LOCKED_MESSAGE": { + "key": "PUSH_LOCKED_MESSAGE", + "value": "You have a new message%1$@" + }, + "PUSH_MESSAGE": { + "key": "PUSH_MESSAGE", + "value": "%1$@|New message" + }, + "PUSH_MESSAGES": { + "key": "PUSH_MESSAGES", + "zeroValue": null, + "oneValue": "%1$@|📷📹 Album", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📷📹 Albums" + }, + "PUSH_MESSAGE_ALBUM": { + "key": "PUSH_MESSAGE_ALBUM", + "value": "%1$@|📷 Album" + }, + "PUSH_MESSAGE_AUDIO": { + "key": "PUSH_MESSAGE_AUDIO", + "value": "%1$@|🎤 Voice message" + }, + "PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE": { + "key": "PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ scored %3$@ in %2$@" + }, + "PUSH_MESSAGE_CONTACT": { + "key": "PUSH_MESSAGE_CONTACT", + "value": "%1$@|👤 %2$@" + }, + "PUSH_MESSAGE_DOC": { + "key": "PUSH_MESSAGE_DOC", + "value": "%1$@|📎 Document" + }, + "PUSH_MESSAGE_DOCS": { + "key": "PUSH_MESSAGE_DOCS", + "value": "%1$@|sent you %2$d files" + }, + "PUSH_MESSAGE_FWD": { + "key": "PUSH_MESSAGE_FWD", + "value": "%1$@|Forwarded message" + }, + "PUSH_MESSAGE_FWDS": { + "key": "PUSH_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%1$@|Forwarded message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|%2$d forwarded messages" + }, + "PUSH_MESSAGE_GAME": { + "key": "PUSH_MESSAGE_GAME", + "value": "%1$@|🎮 Play %2$@" + }, + "PUSH_MESSAGE_GAME_SCORE": { + "key": "PUSH_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ scored %3$@ in %2$@" + }, + "PUSH_MESSAGE_GEO": { + "key": "PUSH_MESSAGE_GEO", + "value": "%1$@|📍 Location" + }, + "PUSH_MESSAGE_GEOLIVE": { + "key": "PUSH_MESSAGE_GEOLIVE", + "value": "%1$@|Live location" + }, + "PUSH_MESSAGE_GIF": { + "key": "PUSH_MESSAGE_GIF", + "value": "%1$@|📹 GIF" + }, + "PUSH_MESSAGE_INVOICE": { + "key": "PUSH_MESSAGE_INVOICE", + "value": "%1$@|Invoice for %2$@" + }, + "PUSH_MESSAGE_NOTEXT": { + "key": "PUSH_MESSAGE_NOTEXT", + "value": "%1$@|New message" + }, + "PUSH_MESSAGE_PHOTO": { + "key": "PUSH_MESSAGE_PHOTO", + "value": "%1$@|📷 Photo" + }, + "PUSH_MESSAGE_PHOTOS": { + "key": "PUSH_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%1$@|📷 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📷 %2$d photos" + }, + "PUSH_MESSAGE_PHOTO_SECRET": { + "key": "PUSH_MESSAGE_PHOTO_SECRET", + "value": "%1$@|🔥 Self-destructing photo" + }, + "PUSH_MESSAGE_POLL": { + "key": "PUSH_MESSAGE_POLL", + "value": "%1$@|📊 Poll \"%2$@\"" + }, + "PUSH_MESSAGE_QUIZ": { + "key": "PUSH_MESSAGE_QUIZ", + "value": "%1$@|sent you the quiz \"%2$@\"" + }, + "PUSH_MESSAGE_ROUND": { + "key": "PUSH_MESSAGE_ROUND", + "value": "%1$@|📺 Video message" + }, + "PUSH_MESSAGE_ROUNDS": { + "key": "PUSH_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%1$@|📺 Video message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📺 %2$d video messages" + }, + "PUSH_MESSAGE_SCREENSHOT": { + "key": "PUSH_MESSAGE_SCREENSHOT", + "value": "%1$@|took a screenshot!" + }, + "PUSH_MESSAGE_STICKER": { + "key": "PUSH_MESSAGE_STICKER", + "value": "%1$@|%2$@ Sticker" + }, + "PUSH_MESSAGE_TEXT": { + "key": "PUSH_MESSAGE_TEXT", + "value": "%1$@|%2$@" + }, + "PUSH_MESSAGE_VIDEO": { + "key": "PUSH_MESSAGE_VIDEO", + "value": "%1$@|📹 Video" + }, + "PUSH_MESSAGE_VIDEOS": { + "key": "PUSH_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%1$@|📹 Video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%1$@|📹 %2$d videos" + }, + "PUSH_MESSAGE_VIDEO_SECRET": { + "key": "PUSH_MESSAGE_VIDEO_SECRET", + "value": "%1$@|🔥 Self-destructing video" + }, + "PUSH_PHONE_CALL_MISSED": { + "key": "PUSH_PHONE_CALL_MISSED", + "value": "%1$@|☎️ Missed call" + }, + "PUSH_PHONE_CALL_REQUEST": { + "key": "PUSH_PHONE_CALL_REQUEST", + "value": "%1$@|Incoming call!" + }, + "PUSH_PINNED_AUDIO": { + "key": "PUSH_PINNED_AUDIO", + "value": "%1$@|📌 Pinned a voice message" + }, + "PUSH_PINNED_CONTACT": { + "key": "PUSH_PINNED_CONTACT", + "value": "%1$@|📌 Pinned contact: %2$@" + }, + "PUSH_PINNED_DOC": { + "key": "PUSH_PINNED_DOC", + "value": "%1$@|📌 Pinned a document" + }, + "PUSH_PINNED_GAME": { + "key": "PUSH_PINNED_GAME", + "value": "%1$@|📌 Pinned a game" + }, + "PUSH_PINNED_GAME_SCORE": { + "key": "PUSH_PINNED_GAME_SCORE", + "value": "%1$@ pinned a game score" + }, + "PUSH_PINNED_GEO": { + "key": "PUSH_PINNED_GEO", + "value": "%1$@|📌 Pinned a location" + }, + "PUSH_PINNED_GEOLIVE": { + "key": "PUSH_PINNED_GEOLIVE", + "value": "%1$@|📌 Pinned a live location" + }, + "PUSH_PINNED_GIF": { + "key": "PUSH_PINNED_GIF", + "value": "%1$@|📌 Pinned a GIF" + }, + "PUSH_PINNED_INVOICE": { + "key": "PUSH_PINNED_INVOICE", + "value": "%1$@|📌 Pinned an invoice" + }, + "PUSH_PINNED_NOTEXT": { + "key": "PUSH_PINNED_NOTEXT", + "value": "%1$@|📌 Pinned a message" + }, + "PUSH_PINNED_PHOTO": { + "key": "PUSH_PINNED_PHOTO", + "value": "%1$@|📌 Pinned a photo" + }, + "PUSH_PINNED_POLL": { + "key": "PUSH_PINNED_POLL", + "value": "%1$@|📌 Pinned a poll" + }, + "PUSH_PINNED_QUIZ": { + "key": "PUSH_PINNED_QUIZ", + "value": "%1$@|pinned a quiz" + }, + "PUSH_PINNED_ROUND": { + "key": "PUSH_PINNED_ROUND", + "value": "%1$@|📌 Pinned a video message" + }, + "PUSH_PINNED_STICKER": { + "key": "PUSH_PINNED_STICKER", + "value": "%1$@|📌 Pinned a %2$@ sticker" + }, + "PUSH_PINNED_TEXT": { + "key": "PUSH_PINNED_TEXT", + "value": "%1$@|📌 Pinned \"%2$@\"" + }, + "PUSH_PINNED_VIDEO": { + "key": "PUSH_PINNED_VIDEO", + "value": "%1$@|📌 Pinned a video" + }, + "PUSH_REMINDER_TITLE": { + "key": "PUSH_REMINDER_TITLE", + "value": "🗓 Reminder" + }, + "PUSH_SENDER_YOU": { + "key": "PUSH_SENDER_YOU", + "value": "📅 You" + }, + "PUSH_VIDEO_CALL_MISSED": { + "key": "PUSH_VIDEO_CALL_MISSED", + "value": "%1$@|You missed a video call" + }, + "PUSH_VIDEO_CALL_REQUEST": { + "key": "PUSH_VIDEO_CALL_REQUEST", + "value": "%1$@|is calling you!" + }, + "Paint.Arrow": { + "key": "Paint.Arrow", + "value": "Arrow" + }, + "Paint.Clear": { + "key": "Paint.Clear", + "value": "Clear All" + }, + "Paint.ClearConfirm": { + "key": "Paint.ClearConfirm", + "value": "Clear Painting" + }, + "Paint.Delete": { + "key": "Paint.Delete", + "value": "Delete" + }, + "Paint.Duplicate": { + "key": "Paint.Duplicate", + "value": "Duplicate" + }, + "Paint.Edit": { + "key": "Paint.Edit", + "value": "Edit" + }, + "Paint.Framed": { + "key": "Paint.Framed", + "value": "Framed" + }, + "Paint.Marker": { + "key": "Paint.Marker", + "value": "Marker" + }, + "Paint.Masks": { + "key": "Paint.Masks", + "value": "Masks" + }, + "Paint.Neon": { + "key": "Paint.Neon", + "value": "Neon" + }, + "Paint.Outlined": { + "key": "Paint.Outlined", + "value": "Outlined" + }, + "Paint.Pen": { + "key": "Paint.Pen", + "value": "Pen" + }, + "Paint.RecentStickers": { + "key": "Paint.RecentStickers", + "value": "Recent" + }, + "Paint.Regular": { + "key": "Paint.Regular", + "value": "Regular" + }, + "Paint.Stickers": { + "key": "Paint.Stickers", + "value": "Stickers" + }, + "Passcode.AppLockedAlert": { + "key": "Passcode.AppLockedAlert", + "value": "Telegram\nLocked" + }, + "PasscodeSettings.4DigitCode": { + "key": "PasscodeSettings.4DigitCode", + "value": "4-Digit Numeric Code" + }, + "PasscodeSettings.6DigitCode": { + "key": "PasscodeSettings.6DigitCode", + "value": "6-Digit Numeric Code" + }, + "PasscodeSettings.AlphanumericCode": { + "key": "PasscodeSettings.AlphanumericCode", + "value": "Custom Alphanumeric Code" + }, + "PasscodeSettings.AutoLock": { + "key": "PasscodeSettings.AutoLock", + "value": "Auto-Lock" + }, + "PasscodeSettings.AutoLock.Disabled": { + "key": "PasscodeSettings.AutoLock.Disabled", + "value": "Disabled" + }, + "PasscodeSettings.AutoLock.IfAwayFor_1hour": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_1hour", + "value": "If away for 1 hour" + }, + "PasscodeSettings.AutoLock.IfAwayFor_1minute": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_1minute", + "value": "If away for 1 min" + }, + "PasscodeSettings.AutoLock.IfAwayFor_5hours": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_5hours", + "value": "If away for 5 hours" + }, + "PasscodeSettings.AutoLock.IfAwayFor_5minutes": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_5minutes", + "value": "If away for 5 min" + }, + "PasscodeSettings.ChangePasscode": { + "key": "PasscodeSettings.ChangePasscode", + "value": "Change Passcode" + }, + "PasscodeSettings.DoNotMatch": { + "key": "PasscodeSettings.DoNotMatch", + "value": "Passcodes don't match. Please try again." + }, + "PasscodeSettings.EncryptData": { + "key": "PasscodeSettings.EncryptData", + "value": "Encrypt Local Database" + }, + "PasscodeSettings.EncryptDataHelp": { + "key": "PasscodeSettings.EncryptDataHelp", + "value": "Experimental feature, use with caution. Encrypt your local Telegram data, using a derivative of your passcode as the key." + }, + "PasscodeSettings.FailedAttempts": { + "key": "PasscodeSettings.FailedAttempts", + "zeroValue": null, + "oneValue": "%@ Failed Passcode Attempt", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ Failed Passcode Attempts" + }, + "PasscodeSettings.Help": { + "key": "PasscodeSettings.Help", + "value": "When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock the app.\n\nNote: if you forget the passcode, you'll need to delete and reinstall the app. All secret chats will be lost." + }, + "PasscodeSettings.HelpBottom": { + "key": "PasscodeSettings.HelpBottom", + "value": "Note: if you forget the passcode, you'll need to delete and reinstall the app. All secret chats will be lost." + }, + "PasscodeSettings.HelpTop": { + "key": "PasscodeSettings.HelpTop", + "value": "When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock the app." + }, + "PasscodeSettings.PasscodeOptions": { + "key": "PasscodeSettings.PasscodeOptions", + "value": "Passcode Options" + }, + "PasscodeSettings.SimplePasscode": { + "key": "PasscodeSettings.SimplePasscode", + "value": "Simple Passcode" + }, + "PasscodeSettings.SimplePasscodeHelp": { + "key": "PasscodeSettings.SimplePasscodeHelp", + "value": "A simple passcode is a 4 digit number." + }, + "PasscodeSettings.Title": { + "key": "PasscodeSettings.Title", + "value": "Passcode Lock" + }, + "PasscodeSettings.TryAgainIn1Minute": { + "key": "PasscodeSettings.TryAgainIn1Minute", + "value": "Try again in 1 minute" + }, + "PasscodeSettings.TurnPasscodeOff": { + "key": "PasscodeSettings.TurnPasscodeOff", + "value": "Turn Passcode Off" + }, + "PasscodeSettings.TurnPasscodeOn": { + "key": "PasscodeSettings.TurnPasscodeOn", + "value": "Turn Passcode On" + }, + "PasscodeSettings.UnlockWithFaceId": { + "key": "PasscodeSettings.UnlockWithFaceId", + "value": "Unlock with Face ID" + }, + "PasscodeSettings.UnlockWithTouchId": { + "key": "PasscodeSettings.UnlockWithTouchId", + "value": "Unlock with Touch ID" + }, + "Passport.AcceptHelp": { + "key": "Passport.AcceptHelp", + "value": "You are sending your documents directly to %1$@ and allowing their @%2$@ to send you messages." + }, + "Passport.Address.AddBankStatement": { + "key": "Passport.Address.AddBankStatement", + "value": "Add Bank Statement" + }, + "Passport.Address.AddPassportRegistration": { + "key": "Passport.Address.AddPassportRegistration", + "value": "Add Passport Registration" + }, + "Passport.Address.AddRentalAgreement": { + "key": "Passport.Address.AddRentalAgreement", + "value": "Add Tenancy Agreement" + }, + "Passport.Address.AddResidentialAddress": { + "key": "Passport.Address.AddResidentialAddress", + "value": "Add Residential Address" + }, + "Passport.Address.AddTemporaryRegistration": { + "key": "Passport.Address.AddTemporaryRegistration", + "value": "Add Temporary Registration" + }, + "Passport.Address.AddUtilityBill": { + "key": "Passport.Address.AddUtilityBill", + "value": "Add Utility Bill" + }, + "Passport.Address.Address": { + "key": "Passport.Address.Address", + "value": "ADDRESS" + }, + "Passport.Address.City": { + "key": "Passport.Address.City", + "value": "City" + }, + "Passport.Address.CityPlaceholder": { + "key": "Passport.Address.CityPlaceholder", + "value": "City" + }, + "Passport.Address.Country": { + "key": "Passport.Address.Country", + "value": "Country" + }, + "Passport.Address.CountryPlaceholder": { + "key": "Passport.Address.CountryPlaceholder", + "value": "Country" + }, + "Passport.Address.EditBankStatement": { + "key": "Passport.Address.EditBankStatement", + "value": "Edit Bank Statement" + }, + "Passport.Address.EditPassportRegistration": { + "key": "Passport.Address.EditPassportRegistration", + "value": "Edit Passport Registration" + }, + "Passport.Address.EditRentalAgreement": { + "key": "Passport.Address.EditRentalAgreement", + "value": "Edit Tenancy Agreement" + }, + "Passport.Address.EditResidentialAddress": { + "key": "Passport.Address.EditResidentialAddress", + "value": "Edit Residential Address" + }, + "Passport.Address.EditTemporaryRegistration": { + "key": "Passport.Address.EditTemporaryRegistration", + "value": "Edit Temporary Registration" + }, + "Passport.Address.EditUtilityBill": { + "key": "Passport.Address.EditUtilityBill", + "value": "Edit Utility Bill" + }, + "Passport.Address.OneOfTypeBankStatement": { + "key": "Passport.Address.OneOfTypeBankStatement", + "value": "bank statement" + }, + "Passport.Address.OneOfTypePassportRegistration": { + "key": "Passport.Address.OneOfTypePassportRegistration", + "value": "passport registration" + }, + "Passport.Address.OneOfTypeRentalAgreement": { + "key": "Passport.Address.OneOfTypeRentalAgreement", + "value": "tenancy agreement" + }, + "Passport.Address.OneOfTypeTemporaryRegistration": { + "key": "Passport.Address.OneOfTypeTemporaryRegistration", + "value": "temporary registration" + }, + "Passport.Address.OneOfTypeUtilityBill": { + "key": "Passport.Address.OneOfTypeUtilityBill", + "value": "utility bill" + }, + "Passport.Address.Postcode": { + "key": "Passport.Address.Postcode", + "value": "Postcode" + }, + "Passport.Address.PostcodePlaceholder": { + "key": "Passport.Address.PostcodePlaceholder", + "value": "Postcode" + }, + "Passport.Address.Region": { + "key": "Passport.Address.Region", + "value": "Region" + }, + "Passport.Address.RegionPlaceholder": { + "key": "Passport.Address.RegionPlaceholder", + "value": "State / Province / Region" + }, + "Passport.Address.ScansHelp": { + "key": "Passport.Address.ScansHelp", + "value": "The document must contain your first and last name, your residential address, a stamp / barcode / QR code / logo, and issue date, no more than 3 months ago." + }, + "Passport.Address.Street": { + "key": "Passport.Address.Street", + "value": "Street" + }, + "Passport.Address.Street1Placeholder": { + "key": "Passport.Address.Street1Placeholder", + "value": "Street and number, P.O. box" + }, + "Passport.Address.Street2Placeholder": { + "key": "Passport.Address.Street2Placeholder", + "value": "Apt., suite, unit, building, floor" + }, + "Passport.Address.TypeBankStatement": { + "key": "Passport.Address.TypeBankStatement", + "value": "Bank Statement" + }, + "Passport.Address.TypeBankStatementUploadScan": { + "key": "Passport.Address.TypeBankStatementUploadScan", + "value": "Upload a scan of your bank statement" + }, + "Passport.Address.TypePassportRegistration": { + "key": "Passport.Address.TypePassportRegistration", + "value": "Passport Registration" + }, + "Passport.Address.TypePassportRegistrationUploadScan": { + "key": "Passport.Address.TypePassportRegistrationUploadScan", + "value": "Upload a scan of your passport registration" + }, + "Passport.Address.TypeRentalAgreement": { + "key": "Passport.Address.TypeRentalAgreement", + "value": "Rental Agreement" + }, + "Passport.Address.TypeRentalAgreementUploadScan": { + "key": "Passport.Address.TypeRentalAgreementUploadScan", + "value": "Upload a scan of your tenancy agreement" + }, + "Passport.Address.TypeResidentialAddress": { + "key": "Passport.Address.TypeResidentialAddress", + "value": "Residential Address" + }, + "Passport.Address.TypeTemporaryRegistration": { + "key": "Passport.Address.TypeTemporaryRegistration", + "value": "Temporary Registration" + }, + "Passport.Address.TypeTemporaryRegistrationUploadScan": { + "key": "Passport.Address.TypeTemporaryRegistrationUploadScan", + "value": "Upload a scan of your temporary registration" + }, + "Passport.Address.TypeUtilityBill": { + "key": "Passport.Address.TypeUtilityBill", + "value": "Utility Bill" + }, + "Passport.Address.TypeUtilityBillUploadScan": { + "key": "Passport.Address.TypeUtilityBillUploadScan", + "value": "Upload a scan of your utility bill" + }, + "Passport.Address.UploadOneOfScan": { + "key": "Passport.Address.UploadOneOfScan", + "value": "Upload a scan of your %@" + }, + "Passport.Authorize": { + "key": "Passport.Authorize", + "value": "Authorize" + }, + "Passport.CorrectErrors": { + "key": "Passport.CorrectErrors", + "value": "Tap to correct errors" + }, + "Passport.DeleteAddress": { + "key": "Passport.DeleteAddress", + "value": "Delete Address" + }, + "Passport.DeleteAddressConfirmation": { + "key": "Passport.DeleteAddressConfirmation", + "value": "Are you sure you want to delete your address?" + }, + "Passport.DeleteDocument": { + "key": "Passport.DeleteDocument", + "value": "Delete Document" + }, + "Passport.DeleteDocumentConfirmation": { + "key": "Passport.DeleteDocumentConfirmation", + "value": "Are you sure you want to delete this document? All details will be lost." + }, + "Passport.DeletePassport": { + "key": "Passport.DeletePassport", + "value": "Delete Telegram Passport" + }, + "Passport.DeletePassportConfirmation": { + "key": "Passport.DeletePassportConfirmation", + "value": "Are you sure you want to delete your Telegram Passport? All data will be lost." + }, + "Passport.DeletePersonalDetails": { + "key": "Passport.DeletePersonalDetails", + "value": "Delete Personal Details" + }, + "Passport.DeletePersonalDetailsConfirmation": { + "key": "Passport.DeletePersonalDetailsConfirmation", + "value": "Are you sure you want to delete personal details?" + }, + "Passport.DiscardMessageAction": { + "key": "Passport.DiscardMessageAction", + "value": "Discard" + }, + "Passport.DiscardMessageDescription": { + "key": "Passport.DiscardMessageDescription", + "value": "Are you sure you want to discard all changes?" + }, + "Passport.DiscardMessageTitle": { + "key": "Passport.DiscardMessageTitle", + "value": "Discard Changes" + }, + "Passport.Email.CodeHelp": { + "key": "Passport.Email.CodeHelp", + "value": "Please enter the confirmation code we've just sent to %@" + }, + "Passport.Email.Delete": { + "key": "Passport.Email.Delete", + "value": "Delete Email Address" + }, + "Passport.Email.EmailPlaceholder": { + "key": "Passport.Email.EmailPlaceholder", + "value": "Enter your email address" + }, + "Passport.Email.EnterOtherEmail": { + "key": "Passport.Email.EnterOtherEmail", + "value": "OR ENTER A NEW EMAIL ADDRESS" + }, + "Passport.Email.Help": { + "key": "Passport.Email.Help", + "value": "A confirmation code will be sent to the email you provide." + }, + "Passport.Email.Title": { + "key": "Passport.Email.Title", + "value": "Email" + }, + "Passport.Email.UseTelegramEmail": { + "key": "Passport.Email.UseTelegramEmail", + "value": "Use %@" + }, + "Passport.Email.UseTelegramEmailHelp": { + "key": "Passport.Email.UseTelegramEmailHelp", + "value": "Use the same address as on Telegram." + }, + "Passport.FieldAddress": { + "key": "Passport.FieldAddress", + "value": "Residential Address" + }, + "Passport.FieldAddressHelp": { + "key": "Passport.FieldAddressHelp", + "value": "Provide your address" + }, + "Passport.FieldAddressTranslationHelp": { + "key": "Passport.FieldAddressTranslationHelp", + "value": "Add an English translation of your document" + }, + "Passport.FieldAddressUploadHelp": { + "key": "Passport.FieldAddressUploadHelp", + "value": "Upload proof of your address" + }, + "Passport.FieldEmail": { + "key": "Passport.FieldEmail", + "value": "Email Address" + }, + "Passport.FieldEmailHelp": { + "key": "Passport.FieldEmailHelp", + "value": "Provide your contact email address" + }, + "Passport.FieldIdentity": { + "key": "Passport.FieldIdentity", + "value": "Identity Document" + }, + "Passport.FieldIdentityDetailsHelp": { + "key": "Passport.FieldIdentityDetailsHelp", + "value": "Fill in your personal details" + }, + "Passport.FieldIdentitySelfieHelp": { + "key": "Passport.FieldIdentitySelfieHelp", + "value": "Take a selfie with your document" + }, + "Passport.FieldIdentityTranslationHelp": { + "key": "Passport.FieldIdentityTranslationHelp", + "value": "Add an English translation of your document" + }, + "Passport.FieldIdentityUploadHelp": { + "key": "Passport.FieldIdentityUploadHelp", + "value": "Upload proof of your identity" + }, + "Passport.FieldOneOf.Delimeter": { + "key": "Passport.FieldOneOf.Delimeter", + "value": ", " + }, + "Passport.FieldOneOf.FinalDelimeter": { + "key": "Passport.FieldOneOf.FinalDelimeter", + "value": " or " + }, + "Passport.FieldOneOf.Or": { + "key": "Passport.FieldOneOf.Or", + "value": "%1$@ or %2$@" + }, + "Passport.FieldPhone": { + "key": "Passport.FieldPhone", + "value": "Phone Number" + }, + "Passport.FieldPhoneHelp": { + "key": "Passport.FieldPhoneHelp", + "value": "Provide your contact phone number" + }, + "Passport.FloodError": { + "key": "Passport.FloodError", + "value": "Limit exceeded. Please try again later." + }, + "Passport.ForgottenPassword": { + "key": "Passport.ForgottenPassword", + "value": "Forgotten Password" + }, + "Passport.Identity.AddDriversLicense": { + "key": "Passport.Identity.AddDriversLicense", + "value": "Add Driver's License" + }, + "Passport.Identity.AddIdentityCard": { + "key": "Passport.Identity.AddIdentityCard", + "value": "Add Identity Card" + }, + "Passport.Identity.AddInternalPassport": { + "key": "Passport.Identity.AddInternalPassport", + "value": "Add Internal Passport" + }, + "Passport.Identity.AddPassport": { + "key": "Passport.Identity.AddPassport", + "value": "Add Passport" + }, + "Passport.Identity.AddPersonalDetails": { + "key": "Passport.Identity.AddPersonalDetails", + "value": "Add Personal Details" + }, + "Passport.Identity.Country": { + "key": "Passport.Identity.Country", + "value": "Citizenship" + }, + "Passport.Identity.CountryPlaceholder": { + "key": "Passport.Identity.CountryPlaceholder", + "value": "Citizenship" + }, + "Passport.Identity.DateOfBirth": { + "key": "Passport.Identity.DateOfBirth", + "value": "Date of Birth" + }, + "Passport.Identity.DateOfBirthPlaceholder": { + "key": "Passport.Identity.DateOfBirthPlaceholder", + "value": "Date of Birth" + }, + "Passport.Identity.DocumentDetails": { + "key": "Passport.Identity.DocumentDetails", + "value": "DOCUMENT DETAILS" + }, + "Passport.Identity.DocumentNumber": { + "key": "Passport.Identity.DocumentNumber", + "value": "Document #" + }, + "Passport.Identity.DocumentNumberPlaceholder": { + "key": "Passport.Identity.DocumentNumberPlaceholder", + "value": "Document Number" + }, + "Passport.Identity.DoesNotExpire": { + "key": "Passport.Identity.DoesNotExpire", + "value": "Does Not Expire" + }, + "Passport.Identity.EditDriversLicense": { + "key": "Passport.Identity.EditDriversLicense", + "value": "Edit Driver's License" + }, + "Passport.Identity.EditIdentityCard": { + "key": "Passport.Identity.EditIdentityCard", + "value": "Edit Identity Card" + }, + "Passport.Identity.EditInternalPassport": { + "key": "Passport.Identity.EditInternalPassport", + "value": "Edit Internal Passport" + }, + "Passport.Identity.EditPassport": { + "key": "Passport.Identity.EditPassport", + "value": "Edit Passport" + }, + "Passport.Identity.EditPersonalDetails": { + "key": "Passport.Identity.EditPersonalDetails", + "value": "Edit Personal Details" + }, + "Passport.Identity.ExpiryDate": { + "key": "Passport.Identity.ExpiryDate", + "value": "Expiry Date" + }, + "Passport.Identity.ExpiryDateNone": { + "key": "Passport.Identity.ExpiryDateNone", + "value": "None" + }, + "Passport.Identity.ExpiryDatePlaceholder": { + "key": "Passport.Identity.ExpiryDatePlaceholder", + "value": "Expiry Date" + }, + "Passport.Identity.FilesTitle": { + "key": "Passport.Identity.FilesTitle", + "value": "REQUESTED FILES" + }, + "Passport.Identity.FilesUploadNew": { + "key": "Passport.Identity.FilesUploadNew", + "value": "Upload New" + }, + "Passport.Identity.FilesView": { + "key": "Passport.Identity.FilesView", + "value": "View" + }, + "Passport.Identity.FrontSide": { + "key": "Passport.Identity.FrontSide", + "value": "Front Side" + }, + "Passport.Identity.FrontSideHelp": { + "key": "Passport.Identity.FrontSideHelp", + "value": "Upload a photo of the front side of the document" + }, + "Passport.Identity.Gender": { + "key": "Passport.Identity.Gender", + "value": "Gender" + }, + "Passport.Identity.GenderFemale": { + "key": "Passport.Identity.GenderFemale", + "value": "Female" + }, + "Passport.Identity.GenderMale": { + "key": "Passport.Identity.GenderMale", + "value": "Male" + }, + "Passport.Identity.GenderPlaceholder": { + "key": "Passport.Identity.GenderPlaceholder", + "value": "Gender" + }, + "Passport.Identity.IssueDate": { + "key": "Passport.Identity.IssueDate", + "value": "Issue Date" + }, + "Passport.Identity.IssueDatePlaceholder": { + "key": "Passport.Identity.IssueDatePlaceholder", + "value": "Issue Date" + }, + "Passport.Identity.LatinNameHelp": { + "key": "Passport.Identity.LatinNameHelp", + "value": "Enter your name using Latin characters." + }, + "Passport.Identity.MainPage": { + "key": "Passport.Identity.MainPage", + "value": "Main Page" + }, + "Passport.Identity.MainPageHelp": { + "key": "Passport.Identity.MainPageHelp", + "value": "Upload a photo of the main page of the document" + }, + "Passport.Identity.MiddleName": { + "key": "Passport.Identity.MiddleName", + "value": "Middle Name" + }, + "Passport.Identity.MiddleNamePlaceholder": { + "key": "Passport.Identity.MiddleNamePlaceholder", + "value": "Middle Name" + }, + "Passport.Identity.Name": { + "key": "Passport.Identity.Name", + "value": "First Name" + }, + "Passport.Identity.NamePlaceholder": { + "key": "Passport.Identity.NamePlaceholder", + "value": "First Name" + }, + "Passport.Identity.NativeNameGenericHelp": { + "key": "Passport.Identity.NativeNameGenericHelp", + "value": "Your name in the language of your country of residence (%@)." + }, + "Passport.Identity.NativeNameGenericTitle": { + "key": "Passport.Identity.NativeNameGenericTitle", + "value": "NAME IN COUNTRY OF RESIDENCE" + }, + "Passport.Identity.NativeNameHelp": { + "key": "Passport.Identity.NativeNameHelp", + "value": "Your name in the language of your country of residence." + }, + "Passport.Identity.NativeNameTitle": { + "key": "Passport.Identity.NativeNameTitle", + "value": "YOUR NAME IN %@" + }, + "Passport.Identity.OneOfTypeDriversLicense": { + "key": "Passport.Identity.OneOfTypeDriversLicense", + "value": "driver's license" + }, + "Passport.Identity.OneOfTypeIdentityCard": { + "key": "Passport.Identity.OneOfTypeIdentityCard", + "value": "identity card" + }, + "Passport.Identity.OneOfTypeInternalPassport": { + "key": "Passport.Identity.OneOfTypeInternalPassport", + "value": "internal passport" + }, + "Passport.Identity.OneOfTypePassport": { + "key": "Passport.Identity.OneOfTypePassport", + "value": "passport" + }, + "Passport.Identity.ResidenceCountry": { + "key": "Passport.Identity.ResidenceCountry", + "value": "Residence" + }, + "Passport.Identity.ResidenceCountryPlaceholder": { + "key": "Passport.Identity.ResidenceCountryPlaceholder", + "value": "Residence" + }, + "Passport.Identity.ReverseSide": { + "key": "Passport.Identity.ReverseSide", + "value": "Reverse Side" + }, + "Passport.Identity.ReverseSideHelp": { + "key": "Passport.Identity.ReverseSideHelp", + "value": "Upload a photo of the reverse side of the document" + }, + "Passport.Identity.ScansHelp": { + "key": "Passport.Identity.ScansHelp", + "value": "The document must contain your photograph, first and last name, date of birth, document number, country of issue, and expiry date." + }, + "Passport.Identity.Selfie": { + "key": "Passport.Identity.Selfie", + "value": "Selfie" + }, + "Passport.Identity.SelfieHelp": { + "key": "Passport.Identity.SelfieHelp", + "value": "Upload a selfie holding this document" + }, + "Passport.Identity.Surname": { + "key": "Passport.Identity.Surname", + "value": "Last Name" + }, + "Passport.Identity.SurnamePlaceholder": { + "key": "Passport.Identity.SurnamePlaceholder", + "value": "Last Name" + }, + "Passport.Identity.Translation": { + "key": "Passport.Identity.Translation", + "value": "Translation" + }, + "Passport.Identity.TranslationHelp": { + "key": "Passport.Identity.TranslationHelp", + "value": "Upload a translation of this document" + }, + "Passport.Identity.Translations": { + "key": "Passport.Identity.Translations", + "value": "TRANSLATION" + }, + "Passport.Identity.TranslationsHelp": { + "key": "Passport.Identity.TranslationsHelp", + "value": "Upload scans of a certified English translation of the document." + }, + "Passport.Identity.TypeDriversLicense": { + "key": "Passport.Identity.TypeDriversLicense", + "value": "Driver's License" + }, + "Passport.Identity.TypeDriversLicenseUploadScan": { + "key": "Passport.Identity.TypeDriversLicenseUploadScan", + "value": "Upload a scan of your driver's license" + }, + "Passport.Identity.TypeIdentityCard": { + "key": "Passport.Identity.TypeIdentityCard", + "value": "Identity Card" + }, + "Passport.Identity.TypeIdentityCardUploadScan": { + "key": "Passport.Identity.TypeIdentityCardUploadScan", + "value": "Upload a scan of your identity card" + }, + "Passport.Identity.TypeInternalPassport": { + "key": "Passport.Identity.TypeInternalPassport", + "value": "Internal Passport" + }, + "Passport.Identity.TypeInternalPassportUploadScan": { + "key": "Passport.Identity.TypeInternalPassportUploadScan", + "value": "Upload a scan of your internal passport" + }, + "Passport.Identity.TypePassport": { + "key": "Passport.Identity.TypePassport", + "value": "Passport" + }, + "Passport.Identity.TypePassportUploadScan": { + "key": "Passport.Identity.TypePassportUploadScan", + "value": "Upload a scan of your passport" + }, + "Passport.Identity.TypePersonalDetails": { + "key": "Passport.Identity.TypePersonalDetails", + "value": "Personal Details" + }, + "Passport.Identity.UploadOneOfScan": { + "key": "Passport.Identity.UploadOneOfScan", + "value": "Upload a scan of your %@" + }, + "Passport.InfoFAQ_URL": { + "key": "Passport.InfoFAQ_URL", + "value": "https://telegram.org/faq#passport" + }, + "Passport.InfoLearnMore": { + "key": "Passport.InfoLearnMore", + "value": "Learn More" + }, + "Passport.InfoText": { + "key": "Passport.InfoText", + "value": "With **Telegram Passport** you can easily sign up for websites and services that require identity verification.\n\nYour information, personal data, and documents are protected by end-to-end encryption. Nobody, including Telegram, can access them without your permission." + }, + "Passport.InfoTitle": { + "key": "Passport.InfoTitle", + "value": "What is Telegram Passport?" + }, + "Passport.InvalidPasswordError": { + "key": "Passport.InvalidPasswordError", + "value": "Invalid password. Please try again." + }, + "Passport.Language.ar": { + "key": "Passport.Language.ar", + "value": "Arabic" + }, + "Passport.Language.az": { + "key": "Passport.Language.az", + "value": "Azerbaijani" + }, + "Passport.Language.bg": { + "key": "Passport.Language.bg", + "value": "Bulgarian" + }, + "Passport.Language.bn": { + "key": "Passport.Language.bn", + "value": "Bangla" + }, + "Passport.Language.cs": { + "key": "Passport.Language.cs", + "value": "Czech" + }, + "Passport.Language.da": { + "key": "Passport.Language.da", + "value": "Danish" + }, + "Passport.Language.de": { + "key": "Passport.Language.de", + "value": "German" + }, + "Passport.Language.dv": { + "key": "Passport.Language.dv", + "value": "Divehi" + }, + "Passport.Language.dz": { + "key": "Passport.Language.dz", + "value": "Dzongkha" + }, + "Passport.Language.el": { + "key": "Passport.Language.el", + "value": "Greek" + }, + "Passport.Language.en": { + "key": "Passport.Language.en", + "value": "English" + }, + "Passport.Language.es": { + "key": "Passport.Language.es", + "value": "Spanish" + }, + "Passport.Language.et": { + "key": "Passport.Language.et", + "value": "Estonian" + }, + "Passport.Language.fa": { + "key": "Passport.Language.fa", + "value": "Persian" + }, + "Passport.Language.fr": { + "key": "Passport.Language.fr", + "value": "French" + }, + "Passport.Language.he": { + "key": "Passport.Language.he", + "value": "Hebrew" + }, + "Passport.Language.hr": { + "key": "Passport.Language.hr", + "value": "Croatian" + }, + "Passport.Language.hu": { + "key": "Passport.Language.hu", + "value": "Hungarian" + }, + "Passport.Language.hy": { + "key": "Passport.Language.hy", + "value": "Armenian" + }, + "Passport.Language.id": { + "key": "Passport.Language.id", + "value": "Indonesian" + }, + "Passport.Language.is": { + "key": "Passport.Language.is", + "value": "Icelandic" + }, + "Passport.Language.it": { + "key": "Passport.Language.it", + "value": "Italian" + }, + "Passport.Language.ja": { + "key": "Passport.Language.ja", + "value": "Japanese" + }, + "Passport.Language.ka": { + "key": "Passport.Language.ka", + "value": "Georgian" + }, + "Passport.Language.km": { + "key": "Passport.Language.km", + "value": "Khmer" + }, + "Passport.Language.ko": { + "key": "Passport.Language.ko", + "value": "Korean" + }, + "Passport.Language.lo": { + "key": "Passport.Language.lo", + "value": "Lao" + }, + "Passport.Language.lt": { + "key": "Passport.Language.lt", + "value": "Lithuanian" + }, + "Passport.Language.lv": { + "key": "Passport.Language.lv", + "value": "Latvian" + }, + "Passport.Language.mk": { + "key": "Passport.Language.mk", + "value": "Macedonian" + }, + "Passport.Language.mn": { + "key": "Passport.Language.mn", + "value": "Mongolian" + }, + "Passport.Language.ms": { + "key": "Passport.Language.ms", + "value": "Malay" + }, + "Passport.Language.my": { + "key": "Passport.Language.my", + "value": "Burmese" + }, + "Passport.Language.ne": { + "key": "Passport.Language.ne", + "value": "Nepali" + }, + "Passport.Language.nl": { + "key": "Passport.Language.nl", + "value": "Dutch" + }, + "Passport.Language.pl": { + "key": "Passport.Language.pl", + "value": "Polish" + }, + "Passport.Language.pt": { + "key": "Passport.Language.pt", + "value": "Portuguese" + }, + "Passport.Language.ro": { + "key": "Passport.Language.ro", + "value": "Romanian" + }, + "Passport.Language.ru": { + "key": "Passport.Language.ru", + "value": "Russian" + }, + "Passport.Language.sk": { + "key": "Passport.Language.sk", + "value": "Slovak" + }, + "Passport.Language.sl": { + "key": "Passport.Language.sl", + "value": "Slovenian" + }, + "Passport.Language.th": { + "key": "Passport.Language.th", + "value": "Thai" + }, + "Passport.Language.tk": { + "key": "Passport.Language.tk", + "value": "Turkmen" + }, + "Passport.Language.tr": { + "key": "Passport.Language.tr", + "value": "Turkish" + }, + "Passport.Language.uk": { + "key": "Passport.Language.uk", + "value": "Ukrainian" + }, + "Passport.Language.uz": { + "key": "Passport.Language.uz", + "value": "Uzbek" + }, + "Passport.Language.vi": { + "key": "Passport.Language.vi", + "value": "Vietnamese" + }, + "Passport.NotLoggedInMessage": { + "key": "Passport.NotLoggedInMessage", + "value": "Please log in to your account to use Telegram Passport" + }, + "Passport.PassportInformation": { + "key": "Passport.PassportInformation", + "value": "PASSPORT INFORMATION" + }, + "Passport.PasswordCompleteSetup": { + "key": "Passport.PasswordCompleteSetup", + "value": "Complete Password Setup" + }, + "Passport.PasswordCreate": { + "key": "Passport.PasswordCreate", + "value": "Create a Password" + }, + "Passport.PasswordDescription": { + "key": "Passport.PasswordDescription", + "value": "Please create a password to secure your personal data with end-to-end encryption.\n\nThis password will also be required whenever you log in to Telegram on a new device." + }, + "Passport.PasswordHelp": { + "key": "Passport.PasswordHelp", + "value": "Enter your Telegram Password\nto decrypt your data" + }, + "Passport.PasswordNext": { + "key": "Passport.PasswordNext", + "value": "Next" + }, + "Passport.PasswordPlaceholder": { + "key": "Passport.PasswordPlaceholder", + "value": "Enter your password" + }, + "Passport.PasswordReset": { + "key": "Passport.PasswordReset", + "value": "All documents uploaded to your Telegram Passport will be lost. You will be able to upload new documents." + }, + "Passport.Phone.Delete": { + "key": "Passport.Phone.Delete", + "value": "Delete Phone Number" + }, + "Passport.Phone.EnterOtherNumber": { + "key": "Passport.Phone.EnterOtherNumber", + "value": "OR ENTER NEW PHONE NUMBER" + }, + "Passport.Phone.Help": { + "key": "Passport.Phone.Help", + "value": "Note: You will receive a confirmation code on the phone number you provide." + }, + "Passport.Phone.Title": { + "key": "Passport.Phone.Title", + "value": "Phone Number" + }, + "Passport.Phone.UseTelegramNumber": { + "key": "Passport.Phone.UseTelegramNumber", + "value": "Use %@" + }, + "Passport.Phone.UseTelegramNumberHelp": { + "key": "Passport.Phone.UseTelegramNumberHelp", + "value": "Use the same phone number as on Telegram." + }, + "Passport.PrivacyPolicy": { + "key": "Passport.PrivacyPolicy", + "value": "You accept the [%1$@ Privacy Policy] and allow their @%2$@ to send you messages." + }, + "Passport.RequestHeader": { + "key": "Passport.RequestHeader", + "value": "%@ requests access to your personal data to sign you up for their services." + }, + "Passport.RequestedInformation": { + "key": "Passport.RequestedInformation", + "value": "REQUESTED INFORMATION" + }, + "Passport.ScanPassport": { + "key": "Passport.ScanPassport", + "value": "Scan Your Passport" + }, + "Passport.ScanPassportHelp": { + "key": "Passport.ScanPassportHelp", + "value": "Scan your passport or identity card with machine-readable zone to fill personal details automatically." + }, + "Passport.Scans": { + "key": "Passport.Scans", + "value": "SCANS" + }, + "Passport.Scans.ScanIndex": { + "key": "Passport.Scans.ScanIndex", + "value": "Scan %@" + }, + "Passport.Scans.Upload": { + "key": "Passport.Scans.Upload", + "value": "Upload Scan" + }, + "Passport.Scans.UploadNew": { + "key": "Passport.Scans.UploadNew", + "value": "Upload Additional Scan" + }, + "Passport.Title": { + "key": "Passport.Title", + "value": "Passport" + }, + "Passport.UpdateRequiredError": { + "key": "Passport.UpdateRequiredError", + "value": "Sorry, your Telegram app is out of date and can't handle this request. Please update Telegram." + }, + "PassportKit.Button.GetTelegramAlertInstall": { + "key": "PassportKit.Button.GetTelegramAlertInstall", + "value": "Install" + }, + "PassportKit.Button.GetTelegramAlertMessage": { + "key": "PassportKit.Button.GetTelegramAlertMessage", + "value": "You need to have Telegram Messenger installed to use Telegram Passport" + }, + "PassportKit.Button.GetTelegramAlertNotNow": { + "key": "PassportKit.Button.GetTelegramAlertNotNow", + "value": "Not Now" + }, + "PassportKit.Button.GetTelegramAlertTitle": { + "key": "PassportKit.Button.GetTelegramAlertTitle", + "value": "Get Telegram Messenger" + }, + "PassportKit.Button.Title": { + "key": "PassportKit.Button.Title", + "value": "Log in with Telegram" + }, + "Peer.DeletedUser": { + "key": "Peer.DeletedUser", + "value": "Deleted User" + }, + "PeerInfo.AddToContacts": { + "key": "PeerInfo.AddToContacts", + "value": "Add to Contacts" + }, + "PeerInfo.AutoremoveMessages": { + "key": "PeerInfo.AutoremoveMessages", + "value": "Auto-Delete Messages" + }, + "PeerInfo.AutoremoveMessagesDisabled": { + "key": "PeerInfo.AutoremoveMessagesDisabled", + "value": "Never" + }, + "PeerInfo.BioExpand": { + "key": "PeerInfo.BioExpand", + "value": "more" + }, + "PeerInfo.ButtonAddMember": { + "key": "PeerInfo.ButtonAddMember", + "value": "Add Members" + }, + "PeerInfo.ButtonCall": { + "key": "PeerInfo.ButtonCall", + "value": "Call" + }, + "PeerInfo.ButtonDiscuss": { + "key": "PeerInfo.ButtonDiscuss", + "value": "Discuss" + }, + "PeerInfo.ButtonLeave": { + "key": "PeerInfo.ButtonLeave", + "value": "Leave" + }, + "PeerInfo.ButtonMessage": { + "key": "PeerInfo.ButtonMessage", + "value": "Message" + }, + "PeerInfo.ButtonMore": { + "key": "PeerInfo.ButtonMore", + "value": "More" + }, + "PeerInfo.ButtonMute": { + "key": "PeerInfo.ButtonMute", + "value": "Mute" + }, + "PeerInfo.ButtonSearch": { + "key": "PeerInfo.ButtonSearch", + "value": "Search" + }, + "PeerInfo.ButtonUnmute": { + "key": "PeerInfo.ButtonUnmute", + "value": "Unmute" + }, + "PeerInfo.ButtonVideoCall": { + "key": "PeerInfo.ButtonVideoCall", + "value": "Video" + }, + "PeerInfo.ButtonVoiceChat": { + "key": "PeerInfo.ButtonVoiceChat", + "value": "Voice Chat" + }, + "PeerInfo.CustomizeNotifications": { + "key": "PeerInfo.CustomizeNotifications", + "value": "Customize" + }, + "PeerInfo.GroupAboutItem": { + "key": "PeerInfo.GroupAboutItem", + "value": "about" + }, + "PeerInfo.PaneAudio": { + "key": "PeerInfo.PaneAudio", + "value": "Music" + }, + "PeerInfo.PaneFiles": { + "key": "PeerInfo.PaneFiles", + "value": "Files" + }, + "PeerInfo.PaneGifs": { + "key": "PeerInfo.PaneGifs", + "value": "GIFs" + }, + "PeerInfo.PaneGroups": { + "key": "PeerInfo.PaneGroups", + "value": "Groups" + }, + "PeerInfo.PaneLinks": { + "key": "PeerInfo.PaneLinks", + "value": "Links" + }, + "PeerInfo.PaneMedia": { + "key": "PeerInfo.PaneMedia", + "value": "Media" + }, + "PeerInfo.PaneMembers": { + "key": "PeerInfo.PaneMembers", + "value": "Members" + }, + "PeerInfo.PaneVoice": { + "key": "PeerInfo.PaneVoice", + "value": "Voice Messages" + }, + "PeerInfo.PaneVoiceAndVideo": { + "key": "PeerInfo.PaneVoiceAndVideo", + "value": "Voice" + }, + "PeerInfo.ReportProfilePhoto": { + "key": "PeerInfo.ReportProfilePhoto", + "value": "Report Profile Photo" + }, + "PeerInfo.ReportProfileVideo": { + "key": "PeerInfo.ReportProfileVideo", + "value": "Report Profile Video" + }, + "PeerSelection.ImportIntoNewGroup": { + "key": "PeerSelection.ImportIntoNewGroup", + "value": "Import to a New Group" + }, + "PeopleNearby.CreateGroup": { + "key": "PeopleNearby.CreateGroup", + "value": "Create a Local Group" + }, + "PeopleNearby.Description": { + "key": "PeopleNearby.Description", + "value": "Ask your friend nearby to open this page to exchange phone numbers." + }, + "PeopleNearby.DiscoverDescription": { + "key": "PeopleNearby.DiscoverDescription", + "value": "Exchange contact info with people nearby\nand find new friends." + }, + "PeopleNearby.Groups": { + "key": "PeopleNearby.Groups", + "value": "Groups Nearby" + }, + "PeopleNearby.MakeInvisible": { + "key": "PeopleNearby.MakeInvisible", + "value": "Stop Showing Me" + }, + "PeopleNearby.MakeVisible": { + "key": "PeopleNearby.MakeVisible", + "value": "Make Myself Visible" + }, + "PeopleNearby.MakeVisibleDescription": { + "key": "PeopleNearby.MakeVisibleDescription", + "value": "Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden." + }, + "PeopleNearby.MakeVisibleTitle": { + "key": "PeopleNearby.MakeVisibleTitle", + "value": "Show Your Profile" + }, + "PeopleNearby.NoMembers": { + "key": "PeopleNearby.NoMembers", + "value": "no members" + }, + "PeopleNearby.ShowMorePeople": { + "key": "PeopleNearby.ShowMorePeople", + "zeroValue": null, + "oneValue": "Show %@ More People", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More People" + }, + "PeopleNearby.Title": { + "key": "PeopleNearby.Title", + "value": "People Nearby" + }, + "PeopleNearby.Users": { + "key": "PeopleNearby.Users", + "value": "People Nearby" + }, + "PeopleNearby.UsersEmpty": { + "key": "PeopleNearby.UsersEmpty", + "value": "Looking for users around you..." + }, + "PeopleNearby.VisibleUntil": { + "key": "PeopleNearby.VisibleUntil", + "value": "visible until %@" + }, + "Permissions.CellularDataAllowInSettings.v0": { + "key": "Permissions.CellularDataAllowInSettings.v0", + "value": "Turn ON in Settings" + }, + "Permissions.CellularDataText.v0": { + "key": "Permissions.CellularDataText.v0", + "value": "Don't worry, Telegram keeps network usage to a minimum. You can further control this in Settings > Data and Storage." + }, + "Permissions.CellularDataTitle.v0": { + "key": "Permissions.CellularDataTitle.v0", + "value": "Enable Cellular Data" + }, + "Permissions.ContactsAllow.v0": { + "key": "Permissions.ContactsAllow.v0", + "value": "Allow Access" + }, + "Permissions.ContactsAllowInSettings.v0": { + "key": "Permissions.ContactsAllowInSettings.v0", + "value": "Allow in Settings" + }, + "Permissions.ContactsText.v0": { + "key": "Permissions.ContactsText.v0", + "value": "See who's on Telegram and switch seamlessly, without having to \"add\" your friends." + }, + "Permissions.ContactsTitle.v0": { + "key": "Permissions.ContactsTitle.v0", + "value": "Sync Your Contacts" + }, + "Permissions.NotificationsAllow.v0": { + "key": "Permissions.NotificationsAllow.v0", + "value": "Turn Notifications ON" + }, + "Permissions.NotificationsAllowInSettings.v0": { + "key": "Permissions.NotificationsAllowInSettings.v0", + "value": "Turn ON in Settings" + }, + "Permissions.NotificationsText.v0": { + "key": "Permissions.NotificationsText.v0", + "value": "Don't miss important messages from your friends and coworkers." + }, + "Permissions.NotificationsTitle.v0": { + "key": "Permissions.NotificationsTitle.v0", + "value": "Turn ON Notifications" + }, + "Permissions.NotificationsUnreachableText.v0": { + "key": "Permissions.NotificationsUnreachableText.v0", + "value": "Please note that you partly disabled message notifications in your Settings." + }, + "Permissions.PeopleNearbyAllow.v0": { + "key": "Permissions.PeopleNearbyAllow.v0", + "value": "Allow Access" + }, + "Permissions.PeopleNearbyAllowInSettings.v0": { + "key": "Permissions.PeopleNearbyAllowInSettings.v0", + "value": "Allow in Settings" + }, + "Permissions.PeopleNearbyText.v0": { + "key": "Permissions.PeopleNearbyText.v0", + "value": "Quickly add people nearby who are also viewing this section and discover local group chats.\n\nPlease allow on location access to enable this feature." + }, + "Permissions.PeopleNearbyTitle.v0": { + "key": "Permissions.PeopleNearbyTitle.v0", + "value": "People Nearby" + }, + "Permissions.PrivacyPolicy": { + "key": "Permissions.PrivacyPolicy", + "value": "Privacy Policy" + }, + "Permissions.SiriAllow.v0": { + "key": "Permissions.SiriAllow.v0", + "value": "Turn Siri ON" + }, + "Permissions.SiriAllowInSettings.v0": { + "key": "Permissions.SiriAllowInSettings.v0", + "value": "Turn ON in Settings" + }, + "Permissions.SiriText.v0": { + "key": "Permissions.SiriText.v0", + "value": "Use Siri to send messages and make calls." + }, + "Permissions.SiriTitle.v0": { + "key": "Permissions.SiriTitle.v0", + "value": "Turn ON Siri" + }, + "Permissions.Skip": { + "key": "Permissions.Skip", + "value": "Skip" + }, + "PhoneLabel.Title": { + "key": "PhoneLabel.Title", + "value": "Label" + }, + "PhoneNumberHelp.Alert": { + "key": "PhoneNumberHelp.Alert", + "value": "Users will see your new number if they have it in their address book or your privacy settings allow them to see it. You can modify this in Settings > Privacy and Security > Phone number." + }, + "PhoneNumberHelp.ChangeNumber": { + "key": "PhoneNumberHelp.ChangeNumber", + "value": "Change Number" + }, + "PhoneNumberHelp.Help": { + "key": "PhoneNumberHelp.Help", + "value": "You can change your Telegram number here. Your account and all your cloud data — messages, media, contacts, etc. will be moved to the new number." + }, + "PhotoEditor.BlurToolLinear": { + "key": "PhotoEditor.BlurToolLinear", + "value": "Linear" + }, + "PhotoEditor.BlurToolOff": { + "key": "PhotoEditor.BlurToolOff", + "value": "Off" + }, + "PhotoEditor.BlurToolPortrait": { + "key": "PhotoEditor.BlurToolPortrait", + "value": "Portrait" + }, + "PhotoEditor.BlurToolRadial": { + "key": "PhotoEditor.BlurToolRadial", + "value": "Radial" + }, + "PhotoEditor.ContrastTool": { + "key": "PhotoEditor.ContrastTool", + "value": "Contrast" + }, + "PhotoEditor.CropAspectRatioOriginal": { + "key": "PhotoEditor.CropAspectRatioOriginal", + "value": "Original" + }, + "PhotoEditor.CropAspectRatioSquare": { + "key": "PhotoEditor.CropAspectRatioSquare", + "value": "Square" + }, + "PhotoEditor.CropAuto": { + "key": "PhotoEditor.CropAuto", + "value": "AUTO" + }, + "PhotoEditor.CropReset": { + "key": "PhotoEditor.CropReset", + "value": "RESET" + }, + "PhotoEditor.CurvesAll": { + "key": "PhotoEditor.CurvesAll", + "value": "All" + }, + "PhotoEditor.CurvesBlue": { + "key": "PhotoEditor.CurvesBlue", + "value": "Blue" + }, + "PhotoEditor.CurvesGreen": { + "key": "PhotoEditor.CurvesGreen", + "value": "Green" + }, + "PhotoEditor.CurvesRed": { + "key": "PhotoEditor.CurvesRed", + "value": "Red" + }, + "PhotoEditor.DiscardChanges": { + "key": "PhotoEditor.DiscardChanges", + "value": "Discard Changes" + }, + "PhotoEditor.EnhanceTool": { + "key": "PhotoEditor.EnhanceTool", + "value": "Enhance" + }, + "PhotoEditor.ExposureTool": { + "key": "PhotoEditor.ExposureTool", + "value": "Brightness" + }, + "PhotoEditor.FadeTool": { + "key": "PhotoEditor.FadeTool", + "value": "Fade" + }, + "PhotoEditor.GrainTool": { + "key": "PhotoEditor.GrainTool", + "value": "Grain" + }, + "PhotoEditor.HighlightsTint": { + "key": "PhotoEditor.HighlightsTint", + "value": "Highlights" + }, + "PhotoEditor.HighlightsTool": { + "key": "PhotoEditor.HighlightsTool", + "value": "Highlights" + }, + "PhotoEditor.Original": { + "key": "PhotoEditor.Original", + "value": "Original" + }, + "PhotoEditor.QualityTool": { + "key": "PhotoEditor.QualityTool", + "value": "Quality" + }, + "PhotoEditor.SaturationTool": { + "key": "PhotoEditor.SaturationTool", + "value": "Saturation" + }, + "PhotoEditor.SelectCoverFrame": { + "key": "PhotoEditor.SelectCoverFrame", + "value": "Choose a cover for your profile video" + }, + "PhotoEditor.ShadowsTint": { + "key": "PhotoEditor.ShadowsTint", + "value": "Shadows" + }, + "PhotoEditor.ShadowsTool": { + "key": "PhotoEditor.ShadowsTool", + "value": "Shadows" + }, + "PhotoEditor.SharpenTool": { + "key": "PhotoEditor.SharpenTool", + "value": "Sharpen" + }, + "PhotoEditor.SkinTool": { + "key": "PhotoEditor.SkinTool", + "value": "Soften Skin" + }, + "PhotoEditor.TiltShift": { + "key": "PhotoEditor.TiltShift", + "value": "Tilt Shift" + }, + "PhotoEditor.VignetteTool": { + "key": "PhotoEditor.VignetteTool", + "value": "Vignette" + }, + "PhotoEditor.WarmthTool": { + "key": "PhotoEditor.WarmthTool", + "value": "Warmth" + }, + "PollResults.Collapse": { + "key": "PollResults.Collapse", + "value": "COLLAPSE" + }, + "PollResults.ShowMore": { + "key": "PollResults.ShowMore", + "zeroValue": null, + "oneValue": "Show More (%@)", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show More (%@)" + }, + "PollResults.Title": { + "key": "PollResults.Title", + "value": "Poll Results" + }, + "Presence.online": { + "key": "Presence.online", + "value": "online" + }, + "Preview.CopyAddress": { + "key": "Preview.CopyAddress", + "value": "Copy Address" + }, + "Preview.DeleteGif": { + "key": "Preview.DeleteGif", + "value": "Delete GIF" + }, + "Preview.DeletePhoto": { + "key": "Preview.DeletePhoto", + "value": "Delete Photo" + }, + "Preview.OpenInInstagram": { + "key": "Preview.OpenInInstagram", + "value": "Open in Instagram" + }, + "Preview.SaveGif": { + "key": "Preview.SaveGif", + "value": "Save GIF" + }, + "Preview.SaveToCameraRoll": { + "key": "Preview.SaveToCameraRoll", + "value": "Save to Camera Roll" + }, + "Privacy.AddNewPeer": { + "key": "Privacy.AddNewPeer", + "value": "Add Users or Groups" + }, + "Privacy.Calls": { + "key": "Privacy.Calls", + "value": "Calls" + }, + "Privacy.Calls.AlwaysAllow": { + "key": "Privacy.Calls.AlwaysAllow", + "value": "Always Allow" + }, + "Privacy.Calls.AlwaysAllow.Placeholder": { + "key": "Privacy.Calls.AlwaysAllow.Placeholder", + "value": "Always allow..." + }, + "Privacy.Calls.AlwaysAllow.Title": { + "key": "Privacy.Calls.AlwaysAllow.Title", + "value": "Always Allow" + }, + "Privacy.Calls.CustomHelp": { + "key": "Privacy.Calls.CustomHelp", + "value": "Choose exactly who can and can't call you." + }, + "Privacy.Calls.CustomShareHelp": { + "key": "Privacy.Calls.CustomShareHelp", + "value": "These users will or will not be able to call you regardless of the settings above." + }, + "Privacy.Calls.Integration": { + "key": "Privacy.Calls.Integration", + "value": "iOS Call Integration" + }, + "Privacy.Calls.IntegrationHelp": { + "key": "Privacy.Calls.IntegrationHelp", + "value": "iOS Call Integration shows Telegram calls on the lock screen and in the system's call history. If iCloud sync is enabled, your call history is shared with Apple." + }, + "Privacy.Calls.NeverAllow": { + "key": "Privacy.Calls.NeverAllow", + "value": "Never Allow" + }, + "Privacy.Calls.NeverAllow.Placeholder": { + "key": "Privacy.Calls.NeverAllow.Placeholder", + "value": "Never allow..." + }, + "Privacy.Calls.NeverAllow.Title": { + "key": "Privacy.Calls.NeverAllow.Title", + "value": "Never Allow" + }, + "Privacy.Calls.P2P": { + "key": "Privacy.Calls.P2P", + "value": "Peer-to-Peer" + }, + "Privacy.Calls.P2PAlways": { + "key": "Privacy.Calls.P2PAlways", + "value": "Always" + }, + "Privacy.Calls.P2PContacts": { + "key": "Privacy.Calls.P2PContacts", + "value": "My Contacts" + }, + "Privacy.Calls.P2PHelp": { + "key": "Privacy.Calls.P2PHelp", + "value": "Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may decrease audio and video quality." + }, + "Privacy.Calls.P2PNever": { + "key": "Privacy.Calls.P2PNever", + "value": "Never" + }, + "Privacy.Calls.WhoCanCallMe": { + "key": "Privacy.Calls.WhoCanCallMe", + "value": "WHO CAN CALL ME" + }, + "Privacy.ChatsTitle": { + "key": "Privacy.ChatsTitle", + "value": "CHATS" + }, + "Privacy.ContactsReset": { + "key": "Privacy.ContactsReset", + "value": "Delete Synced Contacts" + }, + "Privacy.ContactsResetConfirmation": { + "key": "Privacy.ContactsResetConfirmation", + "value": "This will remove your contacts from the Telegram servers.\nIf 'Sync Contacts' is enabled, contacts will be re-synced." + }, + "Privacy.ContactsSync": { + "key": "Privacy.ContactsSync", + "value": "Sync Contacts" + }, + "Privacy.ContactsSyncHelp": { + "key": "Privacy.ContactsSyncHelp", + "value": "Turn on to continuously sync contacts from this device with your account." + }, + "Privacy.ContactsTitle": { + "key": "Privacy.ContactsTitle", + "value": "CONTACTS" + }, + "Privacy.DeleteDrafts": { + "key": "Privacy.DeleteDrafts", + "value": "Delete All Cloud Drafts" + }, + "Privacy.Forwards": { + "key": "Privacy.Forwards", + "value": "Forwarded Messages" + }, + "Privacy.Forwards.AlwaysAllow.Title": { + "key": "Privacy.Forwards.AlwaysAllow.Title", + "value": "Always Allow" + }, + "Privacy.Forwards.AlwaysLink": { + "key": "Privacy.Forwards.AlwaysLink", + "value": "Link to your account" + }, + "Privacy.Forwards.CustomHelp": { + "key": "Privacy.Forwards.CustomHelp", + "value": "Messages you send will not link back to your account when forwarded by other users." + }, + "Privacy.Forwards.LinkIfAllowed": { + "key": "Privacy.Forwards.LinkIfAllowed", + "value": "Link if allowed by settings below" + }, + "Privacy.Forwards.NeverAllow.Title": { + "key": "Privacy.Forwards.NeverAllow.Title", + "value": "Never Allow" + }, + "Privacy.Forwards.NeverLink": { + "key": "Privacy.Forwards.NeverLink", + "value": "Not a link to your account" + }, + "Privacy.Forwards.Preview": { + "key": "Privacy.Forwards.Preview", + "value": "SAMPLE MESSAGE" + }, + "Privacy.Forwards.PreviewMessageText": { + "key": "Privacy.Forwards.PreviewMessageText", + "value": "Reinhardt, we need to find you some new tunes." + }, + "Privacy.Forwards.WhoCanForward": { + "key": "Privacy.Forwards.WhoCanForward", + "value": "WHO CAN ADD A LINK TO MY ACCOUNT WHEN FORWARDING MY MESSAGES" + }, + "Privacy.GroupsAndChannels": { + "key": "Privacy.GroupsAndChannels", + "value": "Groups & Channels" + }, + "Privacy.GroupsAndChannels.AlwaysAllow": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow", + "value": "Always Allow" + }, + "Privacy.GroupsAndChannels.AlwaysAllow.Placeholder": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow.Placeholder", + "value": "Always allow..." + }, + "Privacy.GroupsAndChannels.AlwaysAllow.Title": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow.Title", + "value": "Always Allow" + }, + "Privacy.GroupsAndChannels.CustomHelp": { + "key": "Privacy.GroupsAndChannels.CustomHelp", + "value": "You can restrict who can add you to groups and channels with granular precision." + }, + "Privacy.GroupsAndChannels.CustomShareHelp": { + "key": "Privacy.GroupsAndChannels.CustomShareHelp", + "value": "These users will or will not be able to add you to groups and channels regardless of the settings above." + }, + "Privacy.GroupsAndChannels.InviteToChannelError": { + "key": "Privacy.GroupsAndChannels.InviteToChannelError", + "value": "Sorry, you cannot add %@ to channels because of %@'s privacy settings." + }, + "Privacy.GroupsAndChannels.InviteToChannelMultipleError": { + "key": "Privacy.GroupsAndChannels.InviteToChannelMultipleError", + "value": "Sorry, you can't create a group with these users due to their privacy settings." + }, + "Privacy.GroupsAndChannels.InviteToGroupError": { + "key": "Privacy.GroupsAndChannels.InviteToGroupError", + "value": "Sorry, you cannot add %@ to groups because of %@'s privacy settings." + }, + "Privacy.GroupsAndChannels.NeverAllow": { + "key": "Privacy.GroupsAndChannels.NeverAllow", + "value": "Never Allow" + }, + "Privacy.GroupsAndChannels.NeverAllow.Placeholder": { + "key": "Privacy.GroupsAndChannels.NeverAllow.Placeholder", + "value": "Never allow..." + }, + "Privacy.GroupsAndChannels.NeverAllow.Title": { + "key": "Privacy.GroupsAndChannels.NeverAllow.Title", + "value": "Never Allow" + }, + "Privacy.GroupsAndChannels.WhoCanAddMe": { + "key": "Privacy.GroupsAndChannels.WhoCanAddMe", + "value": "WHO CAN ADD ME" + }, + "Privacy.PaymentsClear.PaymentInfo": { + "key": "Privacy.PaymentsClear.PaymentInfo", + "value": "Payment Info" + }, + "Privacy.PaymentsClear.ShippingInfo": { + "key": "Privacy.PaymentsClear.ShippingInfo", + "value": "Shipping Info" + }, + "Privacy.PaymentsClearInfo": { + "key": "Privacy.PaymentsClearInfo", + "value": "Clear Payment and Shipping Info" + }, + "Privacy.PaymentsClearInfoDoneHelp": { + "key": "Privacy.PaymentsClearInfoDoneHelp", + "value": "Payment & shipping info cleared." + }, + "Privacy.PaymentsClearInfoHelp": { + "key": "Privacy.PaymentsClearInfoHelp", + "value": "You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data." + }, + "Privacy.PaymentsTitle": { + "key": "Privacy.PaymentsTitle", + "value": "PAYMENTS" + }, + "Privacy.PhoneNumber": { + "key": "Privacy.PhoneNumber", + "value": "Phone Number" + }, + "Privacy.ProfilePhoto": { + "key": "Privacy.ProfilePhoto", + "value": "Profile Photo" + }, + "Privacy.ProfilePhoto.AlwaysShareWith.Title": { + "key": "Privacy.ProfilePhoto.AlwaysShareWith.Title", + "value": "Always Share With" + }, + "Privacy.ProfilePhoto.CustomHelp": { + "key": "Privacy.ProfilePhoto.CustomHelp", + "value": "You can restrict who can see your profile photo with granular precision." + }, + "Privacy.ProfilePhoto.NeverShareWith.Title": { + "key": "Privacy.ProfilePhoto.NeverShareWith.Title", + "value": "Never Share With" + }, + "Privacy.ProfilePhoto.WhoCanSeeMyPhoto": { + "key": "Privacy.ProfilePhoto.WhoCanSeeMyPhoto", + "value": "WHO CAN SEE MY PROFILE PHOTO" + }, + "Privacy.SecretChatsLinkPreviews": { + "key": "Privacy.SecretChatsLinkPreviews", + "value": "Link Previews" + }, + "Privacy.SecretChatsLinkPreviewsHelp": { + "key": "Privacy.SecretChatsLinkPreviewsHelp", + "value": "Link previews will be generated on Telegram servers. We do not store data about the links you send." + }, + "Privacy.SecretChatsTitle": { + "key": "Privacy.SecretChatsTitle", + "value": "SECRET CHATS" + }, + "Privacy.TopPeers": { + "key": "Privacy.TopPeers", + "value": "Suggest Frequent Contacts" + }, + "Privacy.TopPeersDelete": { + "key": "Privacy.TopPeersDelete", + "value": "Delete" + }, + "Privacy.TopPeersHelp": { + "key": "Privacy.TopPeersHelp", + "value": "Display people you message frequently at the top of the search section for quick access." + }, + "Privacy.TopPeersWarning": { + "key": "Privacy.TopPeersWarning", + "value": "This will delete all data about the people you message frequently as well as the inline bots you are likely to use." + }, + "PrivacyLastSeenSettings.AddUsers": { + "key": "PrivacyLastSeenSettings.AddUsers", + "zeroValue": null, + "oneValue": "Add 1 user to this list?", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Add %@ users to this list?" + }, + "PrivacyLastSeenSettings.AlwaysShareWith": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith", + "value": "Always Share With" + }, + "PrivacyLastSeenSettings.AlwaysShareWith.Placeholder": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith.Placeholder", + "value": "Always share with users..." + }, + "PrivacyLastSeenSettings.AlwaysShareWith.Title": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith.Title", + "value": "Always Share" + }, + "PrivacyLastSeenSettings.CustomHelp": { + "key": "PrivacyLastSeenSettings.CustomHelp", + "value": "You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month)." + }, + "PrivacyLastSeenSettings.CustomShareSettings.Delete": { + "key": "PrivacyLastSeenSettings.CustomShareSettings.Delete", + "value": "Delete" + }, + "PrivacyLastSeenSettings.CustomShareSettingsHelp": { + "key": "PrivacyLastSeenSettings.CustomShareSettingsHelp", + "value": "You can add users or entire groups as exceptions that will override the settings above." + }, + "PrivacyLastSeenSettings.EmpryUsersPlaceholder": { + "key": "PrivacyLastSeenSettings.EmpryUsersPlaceholder", + "value": "Add Users" + }, + "PrivacyLastSeenSettings.GroupsAndChannelsHelp": { + "key": "PrivacyLastSeenSettings.GroupsAndChannelsHelp", + "value": "Change who can add you to groups and channels." + }, + "PrivacyLastSeenSettings.NeverShareWith": { + "key": "PrivacyLastSeenSettings.NeverShareWith", + "value": "Never Share With" + }, + "PrivacyLastSeenSettings.NeverShareWith.Placeholder": { + "key": "PrivacyLastSeenSettings.NeverShareWith.Placeholder", + "value": "Never share with users..." + }, + "PrivacyLastSeenSettings.NeverShareWith.Title": { + "key": "PrivacyLastSeenSettings.NeverShareWith.Title", + "value": "Never Share" + }, + "PrivacyLastSeenSettings.Title": { + "key": "PrivacyLastSeenSettings.Title", + "value": "Last Seen & Online" + }, + "PrivacyLastSeenSettings.WhoCanSeeMyTimestamp": { + "key": "PrivacyLastSeenSettings.WhoCanSeeMyTimestamp", + "value": "WHO CAN SEE MY TIMESTAMP" + }, + "PrivacyPhoneNumberSettings.CustomDisabledHelp": { + "key": "PrivacyPhoneNumberSettings.CustomDisabledHelp", + "value": "Users who add your number to their contacts will see it on Telegram only if they are your contacts." + }, + "PrivacyPhoneNumberSettings.CustomHelp": { + "key": "PrivacyPhoneNumberSettings.CustomHelp", + "value": "Users who have your number saved in their contacts will also see it on Telegram." + }, + "PrivacyPhoneNumberSettings.DiscoveryHeader": { + "key": "PrivacyPhoneNumberSettings.DiscoveryHeader", + "value": "WHO CAN FIND ME BY MY NUMBER" + }, + "PrivacyPhoneNumberSettings.WhoCanSeeMyPhoneNumber": { + "key": "PrivacyPhoneNumberSettings.WhoCanSeeMyPhoneNumber", + "value": "WHO CAN SEE MY PHONE NUMBER" + }, + "PrivacyPolicy.Accept": { + "key": "PrivacyPolicy.Accept", + "value": "Accept & Continue" + }, + "PrivacyPolicy.AgeVerificationAgree": { + "key": "PrivacyPolicy.AgeVerificationAgree", + "value": "Agree" + }, + "PrivacyPolicy.AgeVerificationMessage": { + "key": "PrivacyPolicy.AgeVerificationMessage", + "value": "Tap Agree to confirm that you are %@ or older." + }, + "PrivacyPolicy.AgeVerificationTitle": { + "key": "PrivacyPolicy.AgeVerificationTitle", + "value": "Age Verification" + }, + "PrivacyPolicy.Decline": { + "key": "PrivacyPolicy.Decline", + "value": "Decline" + }, + "PrivacyPolicy.DeclineDeclineAndDelete": { + "key": "PrivacyPolicy.DeclineDeclineAndDelete", + "value": "Decline and Delete" + }, + "PrivacyPolicy.DeclineDeleteNow": { + "key": "PrivacyPolicy.DeclineDeleteNow", + "value": "Delete Now" + }, + "PrivacyPolicy.DeclineLastWarning": { + "key": "PrivacyPolicy.DeclineLastWarning", + "value": "Warning, this will irreversibly delete your Telegram account along with all the data you store in the Telegram cloud.\n\nImportant: You can cancel now and export your data before deleting your account instead of losing it all. (To do this, open the latest version of Telegram Desktop and go to Settings > Advanced > Export Telegram data.)" + }, + "PrivacyPolicy.DeclineMessage": { + "key": "PrivacyPolicy.DeclineMessage", + "value": "We're very sorry, but this means we must part ways here. Unlike others, we don't use your data for ad targeting or other commercial purposes. Telegram only stores the information it needs to function as a feature-rich cloud service. You can adjust how we use your data (e.g., delete synced contacts) in Privacy & Security settings.\n\nBut if you're generally not OK with Telegram's modest requirements, it won't be possible for us to provide you with this service." + }, + "PrivacyPolicy.DeclineTitle": { + "key": "PrivacyPolicy.DeclineTitle", + "value": "Decline" + }, + "PrivacyPolicy.Title": { + "key": "PrivacyPolicy.Title", + "value": "Privacy Policy and Terms of Service" + }, + "PrivacySettings.AuthSessions": { + "key": "PrivacySettings.AuthSessions", + "value": "Active Sessions" + }, + "PrivacySettings.AutoArchive": { + "key": "PrivacySettings.AutoArchive", + "value": "Archive and Mute" + }, + "PrivacySettings.AutoArchiveInfo": { + "key": "PrivacySettings.AutoArchiveInfo", + "value": "Automatically archive and mute new chats, groups and channels from non-contacts." + }, + "PrivacySettings.AutoArchiveTitle": { + "key": "PrivacySettings.AutoArchiveTitle", + "value": "NEW CHATS FROM UNKNOWN USERS" + }, + "PrivacySettings.BlockedPeersEmpty": { + "key": "PrivacySettings.BlockedPeersEmpty", + "value": "None" + }, + "PrivacySettings.DataSettings": { + "key": "PrivacySettings.DataSettings", + "value": "Data Settings" + }, + "PrivacySettings.DataSettingsHelp": { + "key": "PrivacySettings.DataSettingsHelp", + "value": "Control which of your data is stored in the cloud and used by Telegram to enable advanced features." + }, + "PrivacySettings.DeleteAccountHelp": { + "key": "PrivacySettings.DeleteAccountHelp", + "value": "If you do not come online at least once within this period, your account will be deleted along with all messages and contacts." + }, + "PrivacySettings.DeleteAccountIfAwayFor": { + "key": "PrivacySettings.DeleteAccountIfAwayFor", + "value": "If Away For" + }, + "PrivacySettings.DeleteAccountTitle": { + "key": "PrivacySettings.DeleteAccountTitle", + "value": "AUTOMATICALLY DELETE MY ACCOUNT" + }, + "PrivacySettings.LastSeen": { + "key": "PrivacySettings.LastSeen", + "value": "Last Seen & Online" + }, + "PrivacySettings.LastSeenContacts": { + "key": "PrivacySettings.LastSeenContacts", + "value": "My Contacts" + }, + "PrivacySettings.LastSeenContactsMinus": { + "key": "PrivacySettings.LastSeenContactsMinus", + "value": "My Contacts (-%@)" + }, + "PrivacySettings.LastSeenContactsMinusPlus": { + "key": "PrivacySettings.LastSeenContactsMinusPlus", + "value": "My Contacts (-%@, +%@)" + }, + "PrivacySettings.LastSeenContactsPlus": { + "key": "PrivacySettings.LastSeenContactsPlus", + "value": "My Contacts (+%@)" + }, + "PrivacySettings.LastSeenEverybody": { + "key": "PrivacySettings.LastSeenEverybody", + "value": "Everybody" + }, + "PrivacySettings.LastSeenEverybodyMinus": { + "key": "PrivacySettings.LastSeenEverybodyMinus", + "value": "Everybody (-%@)" + }, + "PrivacySettings.LastSeenNobody": { + "key": "PrivacySettings.LastSeenNobody", + "value": "Nobody" + }, + "PrivacySettings.LastSeenNobodyPlus": { + "key": "PrivacySettings.LastSeenNobodyPlus", + "value": "Nobody (+%@)" + }, + "PrivacySettings.LastSeenTitle": { + "key": "PrivacySettings.LastSeenTitle", + "value": "Last Seen & Online" + }, + "PrivacySettings.Passcode": { + "key": "PrivacySettings.Passcode", + "value": "Passcode Lock" + }, + "PrivacySettings.PasscodeAndFaceId": { + "key": "PrivacySettings.PasscodeAndFaceId", + "value": "Passcode & Face ID" + }, + "PrivacySettings.PasscodeAndTouchId": { + "key": "PrivacySettings.PasscodeAndTouchId", + "value": "Passcode & Touch ID" + }, + "PrivacySettings.PasscodeOff": { + "key": "PrivacySettings.PasscodeOff", + "value": "Off" + }, + "PrivacySettings.PasscodeOn": { + "key": "PrivacySettings.PasscodeOn", + "value": "On" + }, + "PrivacySettings.PhoneNumber": { + "key": "PrivacySettings.PhoneNumber", + "value": "Phone Number" + }, + "PrivacySettings.PrivacyTitle": { + "key": "PrivacySettings.PrivacyTitle", + "value": "PRIVACY" + }, + "PrivacySettings.SecurityTitle": { + "key": "PrivacySettings.SecurityTitle", + "value": "SECURITY" + }, + "PrivacySettings.Title": { + "key": "PrivacySettings.Title", + "value": "Privacy and Security" + }, + "PrivacySettings.TwoStepAuth": { + "key": "PrivacySettings.TwoStepAuth", + "value": "Two-Step Verification" + }, + "PrivacySettings.WebSessions": { + "key": "PrivacySettings.WebSessions", + "value": "Active Websites" + }, + "PrivateDataSettings.Title": { + "key": "PrivateDataSettings.Title", + "value": "Data Settings" + }, + "Profile.About": { + "key": "Profile.About", + "value": "bio" + }, + "Profile.AddToExisting": { + "key": "Profile.AddToExisting", + "value": "Add to Existing Contact" + }, + "Profile.BotInfo": { + "key": "Profile.BotInfo", + "value": "about" + }, + "Profile.CreateEncryptedChatError": { + "key": "Profile.CreateEncryptedChatError", + "value": "An error occurred." + }, + "Profile.CreateNewContact": { + "key": "Profile.CreateNewContact", + "value": "Create New Contact" + }, + "Profile.EncryptionKey": { + "key": "Profile.EncryptionKey", + "value": "Encryption Key" + }, + "Profile.MessageLifetime1d": { + "key": "Profile.MessageLifetime1d", + "value": "1d" + }, + "Profile.MessageLifetime1h": { + "key": "Profile.MessageLifetime1h", + "value": "1h" + }, + "Profile.MessageLifetime1m": { + "key": "Profile.MessageLifetime1m", + "value": "1m" + }, + "Profile.MessageLifetime1w": { + "key": "Profile.MessageLifetime1w", + "value": "1w" + }, + "Profile.MessageLifetime2s": { + "key": "Profile.MessageLifetime2s", + "value": "2s" + }, + "Profile.MessageLifetime5s": { + "key": "Profile.MessageLifetime5s", + "value": "5s" + }, + "Profile.MessageLifetimeForever": { + "key": "Profile.MessageLifetimeForever", + "value": "Off" + }, + "Profile.ShareContactButton": { + "key": "Profile.ShareContactButton", + "value": "Share Contact" + }, + "Profile.Username": { + "key": "Profile.Username", + "value": "username" + }, + "ProfilePhoto.MainPhoto": { + "key": "ProfilePhoto.MainPhoto", + "value": "Main Photo" + }, + "ProfilePhoto.MainVideo": { + "key": "ProfilePhoto.MainVideo", + "value": "Main Video" + }, + "ProfilePhoto.OpenGallery": { + "key": "ProfilePhoto.OpenGallery", + "value": "Open Gallery" + }, + "ProfilePhoto.OpenInEditor": { + "key": "ProfilePhoto.OpenInEditor", + "value": "Open in Editor" + }, + "ProfilePhoto.SearchWeb": { + "key": "ProfilePhoto.SearchWeb", + "value": "Search Web" + }, + "ProfilePhoto.SetMainPhoto": { + "key": "ProfilePhoto.SetMainPhoto", + "value": "Set as Main Photo" + }, + "ProfilePhoto.SetMainVideo": { + "key": "ProfilePhoto.SetMainVideo", + "value": "Set as Main Video" + }, + "Proxy.TooltipUnavailable": { + "key": "Proxy.TooltipUnavailable", + "value": "The proxy may be unavailable. Try selecting another one." + }, + "ProxyServer.VoiceOver.Active": { + "key": "ProxyServer.VoiceOver.Active", + "value": "Active" + }, + "QuickSend.Photos": { + "key": "QuickSend.Photos", + "zeroValue": null, + "oneValue": "Send 1 Photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Send %@ Photos" + }, + "Replies.BlockAndDeleteRepliesActionTitle": { + "key": "Replies.BlockAndDeleteRepliesActionTitle", + "value": "Block and Delete Replies" + }, + "RepliesChat.DescriptionText": { + "key": "RepliesChat.DescriptionText", + "value": "This chat helps you keep track of replies to your comments in Channels." + }, + "Report.AdditionalDetailsPlaceholder": { + "key": "Report.AdditionalDetailsPlaceholder", + "value": "Additional details..." + }, + "Report.AdditionalDetailsText": { + "key": "Report.AdditionalDetailsText", + "value": "Please enter any additional details relevant for your report." + }, + "Report.Report": { + "key": "Report.Report", + "value": "Report" + }, + "Report.Succeed": { + "key": "Report.Succeed", + "value": "Telegram moderators will study your report. Thank you!" + }, + "ReportGroupLocation.Report": { + "key": "ReportGroupLocation.Report", + "value": "Report" + }, + "ReportGroupLocation.Text": { + "key": "ReportGroupLocation.Text", + "value": "Please tell us if this group is not related to this location." + }, + "ReportGroupLocation.Title": { + "key": "ReportGroupLocation.Title", + "value": "Report Unrelated Group" + }, + "ReportPeer.AlertSuccess": { + "key": "ReportPeer.AlertSuccess", + "value": "Thank you!\nYour report will be reviewed by our team." + }, + "ReportPeer.ReasonChildAbuse": { + "key": "ReportPeer.ReasonChildAbuse", + "value": "Child Abuse" + }, + "ReportPeer.ReasonCopyright": { + "key": "ReportPeer.ReasonCopyright", + "value": "Copyright" + }, + "ReportPeer.ReasonFake": { + "key": "ReportPeer.ReasonFake", + "value": "Fake Account" + }, + "ReportPeer.ReasonOther": { + "key": "ReportPeer.ReasonOther", + "value": "Other" + }, + "ReportPeer.ReasonOther.Placeholder": { + "key": "ReportPeer.ReasonOther.Placeholder", + "value": "Description" + }, + "ReportPeer.ReasonOther.Send": { + "key": "ReportPeer.ReasonOther.Send", + "value": "Send" + }, + "ReportPeer.ReasonOther.Title": { + "key": "ReportPeer.ReasonOther.Title", + "value": "Report" + }, + "ReportPeer.ReasonPornography": { + "key": "ReportPeer.ReasonPornography", + "value": "Pornography" + }, + "ReportPeer.ReasonSpam": { + "key": "ReportPeer.ReasonSpam", + "value": "Spam" + }, + "ReportPeer.ReasonViolence": { + "key": "ReportPeer.ReasonViolence", + "value": "Violence" + }, + "ReportPeer.Report": { + "key": "ReportPeer.Report", + "value": "Report" + }, + "ReportSpam.DeleteThisChat": { + "key": "ReportSpam.DeleteThisChat", + "value": "Delete this Chat" + }, + "Resolve.ErrorNotFound": { + "key": "Resolve.ErrorNotFound", + "value": "Sorry, this user doesn't seem to exist." + }, + "SaveIncomingPhotosSettings.From": { + "key": "SaveIncomingPhotosSettings.From", + "value": "SAVE INCOMING PHOTOS FROM" + }, + "SaveIncomingPhotosSettings.Title": { + "key": "SaveIncomingPhotosSettings.Title", + "value": "Save Incoming Photos" + }, + "ScheduledMessages.BotActionUnavailable": { + "key": "ScheduledMessages.BotActionUnavailable", + "value": "This action will become available after the message is published." + }, + "ScheduledMessages.ClearAll": { + "key": "ScheduledMessages.ClearAll", + "value": "Clear All" + }, + "ScheduledMessages.ClearAllConfirmation": { + "key": "ScheduledMessages.ClearAllConfirmation", + "value": "Clear Scheduled Messages" + }, + "ScheduledMessages.Delete": { + "key": "ScheduledMessages.Delete", + "value": "Delete Scheduled Message" + }, + "ScheduledMessages.DeleteMany": { + "key": "ScheduledMessages.DeleteMany", + "value": "Delete Scheduled Messages" + }, + "ScheduledMessages.EditTime": { + "key": "ScheduledMessages.EditTime", + "value": "Reschedule" + }, + "ScheduledMessages.EmptyPlaceholder": { + "key": "ScheduledMessages.EmptyPlaceholder", + "value": "No scheduled messages here yet..." + }, + "ScheduledMessages.PollUnavailable": { + "key": "ScheduledMessages.PollUnavailable", + "value": "Voting will become available after the message is published." + }, + "ScheduledMessages.ReminderNotification": { + "key": "ScheduledMessages.ReminderNotification", + "value": "📅 Reminder" + }, + "ScheduledMessages.RemindersTitle": { + "key": "ScheduledMessages.RemindersTitle", + "value": "Reminders" + }, + "ScheduledMessages.ScheduledDate": { + "key": "ScheduledMessages.ScheduledDate", + "value": "Scheduled for %@" + }, + "ScheduledMessages.ScheduledOnline": { + "key": "ScheduledMessages.ScheduledOnline", + "value": "Scheduled until online" + }, + "ScheduledMessages.ScheduledToday": { + "key": "ScheduledMessages.ScheduledToday", + "value": "Scheduled for today" + }, + "ScheduledMessages.SendNow": { + "key": "ScheduledMessages.SendNow", + "value": "Send Now" + }, + "ScheduledMessages.Title": { + "key": "ScheduledMessages.Title", + "value": "Scheduled Messages" + }, + "SearchImages.NoImagesFound": { + "key": "SearchImages.NoImagesFound", + "value": "No images found" + }, + "SearchImages.Title": { + "key": "SearchImages.Title", + "value": "Albums" + }, + "SecretChat.Title": { + "key": "SecretChat.Title", + "value": "Secret Chat" + }, + "SecretGIF.NotViewedYet": { + "key": "SecretGIF.NotViewedYet", + "value": "%@ hasn't played this GIF yet" + }, + "SecretGif.Title": { + "key": "SecretGif.Title", + "value": "Disappearing GIF" + }, + "SecretImage.NotViewedYet": { + "key": "SecretImage.NotViewedYet", + "value": "%@ hasn't opened this photo yet" + }, + "SecretImage.Title": { + "key": "SecretImage.Title", + "value": "Disappearing Photo" + }, + "SecretTimer.ImageDescription": { + "key": "SecretTimer.ImageDescription", + "value": "If you set a timer, the photo will self-destruct after it was viewed." + }, + "SecretTimer.VideoDescription": { + "key": "SecretTimer.VideoDescription", + "value": "If you set a timer, the video will self-destruct after it was viewed." + }, + "SecretVideo.NotViewedYet": { + "key": "SecretVideo.NotViewedYet", + "value": "%@ hasn't played this video yet" + }, + "SecretVideo.Title": { + "key": "SecretVideo.Title", + "value": "Disappearing Video" + }, + "ServiceMessage.GameScoreExtended": { + "key": "ServiceMessage.GameScoreExtended", + "zeroValue": null, + "oneValue": "{name} scored %@ in {game}", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "{name} scored %@ in {game}" + }, + "ServiceMessage.GameScoreSelfExtended": { + "key": "ServiceMessage.GameScoreSelfExtended", + "zeroValue": null, + "oneValue": "You scored %@ in {game}", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "You scored %@ in {game}" + }, + "ServiceMessage.GameScoreSelfSimple": { + "key": "ServiceMessage.GameScoreSelfSimple", + "zeroValue": null, + "oneValue": "You scored %@", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "You scored %@" + }, + "ServiceMessage.GameScoreSimple": { + "key": "ServiceMessage.GameScoreSimple", + "zeroValue": null, + "oneValue": "{name} scored %@", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "{name} scored %@" + }, + "Settings.About": { + "key": "Settings.About", + "value": "Bio" + }, + "Settings.About.Help": { + "key": "Settings.About.Help", + "value": "Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco." + }, + "Settings.About.Title": { + "key": "Settings.About.Title", + "value": "Bio" + }, + "Settings.AboutEmpty": { + "key": "Settings.AboutEmpty", + "value": "Add" + }, + "Settings.AddAccount": { + "key": "Settings.AddAccount", + "value": "Add Account" + }, + "Settings.AddAnotherAccount": { + "key": "Settings.AddAnotherAccount", + "value": "Add Another Account" + }, + "Settings.AddAnotherAccount.Help": { + "key": "Settings.AddAnotherAccount.Help", + "value": "You can add up to three accounts with different phone numbers." + }, + "Settings.AddDevice": { + "key": "Settings.AddDevice", + "value": "Scan QR" + }, + "Settings.AppLanguage": { + "key": "Settings.AppLanguage", + "value": "Language" + }, + "Settings.AppLanguage.Unofficial": { + "key": "Settings.AppLanguage.Unofficial", + "value": "UNOFFICIAL" + }, + "Settings.Appearance": { + "key": "Settings.Appearance", + "value": "Appearance" + }, + "Settings.AppleWatch": { + "key": "Settings.AppleWatch", + "value": "Apple Watch" + }, + "Settings.ApplyProxyAlert": { + "key": "Settings.ApplyProxyAlert", + "value": "Are you sure you want to enable this proxy?\nServer: %1$@\nPort: %2$@\n\nYou can change your proxy server later in Settings > Data and Storage." + }, + "Settings.ApplyProxyAlertCredentials": { + "key": "Settings.ApplyProxyAlertCredentials", + "value": "Are you sure you want to enable this proxy?\nServer: %1$@\nPort: %2$@\nUsername: %3$@\nPassword: %4$@\n\nYou can change your proxy server later in Settings > Data and Storage." + }, + "Settings.ApplyProxyAlertEnable": { + "key": "Settings.ApplyProxyAlertEnable", + "value": "Enable" + }, + "Settings.BlockedUsers": { + "key": "Settings.BlockedUsers", + "value": "Blocked Users" + }, + "Settings.CallSettings": { + "key": "Settings.CallSettings", + "value": "Calls" + }, + "Settings.CancelUpload": { + "key": "Settings.CancelUpload", + "value": "Cancel Upload" + }, + "Settings.ChangePhoneNumber": { + "key": "Settings.ChangePhoneNumber", + "value": "Change Number" + }, + "Settings.ChatBackground": { + "key": "Settings.ChatBackground", + "value": "Chat Background" + }, + "Settings.ChatFolders": { + "key": "Settings.ChatFolders", + "value": "Chat Folders" + }, + "Settings.ChatSettings": { + "key": "Settings.ChatSettings", + "value": "Data and Storage" + }, + "Settings.CheckPhoneNumberText": { + "key": "Settings.CheckPhoneNumberText", + "value": "Keep your number up to date to ensure you can always log in to Telegram. [Learn more]()" + }, + "Settings.CheckPhoneNumberTitle": { + "key": "Settings.CheckPhoneNumberTitle", + "value": "Is %@ still your number?" + }, + "Settings.Context.Logout": { + "key": "Settings.Context.Logout", + "value": "Log Out" + }, + "Settings.CopyPhoneNumber": { + "key": "Settings.CopyPhoneNumber", + "value": "Copy Phone Number" + }, + "Settings.CopyUsername": { + "key": "Settings.CopyUsername", + "value": "Copy Username" + }, + "Settings.Devices": { + "key": "Settings.Devices", + "value": "Devices" + }, + "Settings.EditAccount": { + "key": "Settings.EditAccount", + "value": "Edit Account" + }, + "Settings.EditPhoto": { + "key": "Settings.EditPhoto", + "value": "Edit" + }, + "Settings.EditProfileMedia": { + "key": "Settings.EditProfileMedia", + "value": "Edit" + }, + "Settings.EditVideo": { + "key": "Settings.EditVideo", + "value": "Edit" + }, + "Settings.FAQ": { + "key": "Settings.FAQ", + "value": "Telegram FAQ" + }, + "Settings.FAQ_Button": { + "key": "Settings.FAQ_Button", + "value": "FAQ" + }, + "Settings.FAQ_Intro": { + "key": "Settings.FAQ_Intro", + "value": "Please note that Telegram Support is done by volunteers. We try to respond as quickly as possible, but it may take a while.\n\nPlease take a look at the Telegram FAQ: it has important troubleshooting tips and answers to most questions." + }, + "Settings.FAQ_URL": { + "key": "Settings.FAQ_URL", + "value": "https://telegram.org/faq#general-questions" + }, + "Settings.FrequentlyAskedQuestions": { + "key": "Settings.FrequentlyAskedQuestions", + "value": "Frequently Asked Questions" + }, + "Settings.KeepPhoneNumber": { + "key": "Settings.KeepPhoneNumber", + "value": "Keep %@" + }, + "Settings.Logout": { + "key": "Settings.Logout", + "value": "Log Out" + }, + "Settings.LogoutConfirmationText": { + "key": "Settings.LogoutConfirmationText", + "value": "\nNote that you can seamlessly use Telegram on all your devices at once.\n\nRemember, logging out kills all your Secret Chats." + }, + "Settings.LogoutConfirmationTitle": { + "key": "Settings.LogoutConfirmationTitle", + "value": "Log out?" + }, + "Settings.NotificationsAndSounds": { + "key": "Settings.NotificationsAndSounds", + "value": "Notifications and Sounds" + }, + "Settings.Passport": { + "key": "Settings.Passport", + "value": "Telegram Passport" + }, + "Settings.PhoneNumber": { + "key": "Settings.PhoneNumber", + "value": "Change Number" + }, + "Settings.PrivacySettings": { + "key": "Settings.PrivacySettings", + "value": "Privacy and Security" + }, + "Settings.Proxy": { + "key": "Settings.Proxy", + "value": "Proxy" + }, + "Settings.ProxyConnected": { + "key": "Settings.ProxyConnected", + "value": "Connected" + }, + "Settings.ProxyConnecting": { + "key": "Settings.ProxyConnecting", + "value": "Connecting..." + }, + "Settings.ProxyDisabled": { + "key": "Settings.ProxyDisabled", + "value": "Disabled" + }, + "Settings.RemoveConfirmation": { + "key": "Settings.RemoveConfirmation", + "value": "Remove" + }, + "Settings.RemoveVideo": { + "key": "Settings.RemoveVideo", + "value": "Remove Video" + }, + "Settings.SaveEditedPhotos": { + "key": "Settings.SaveEditedPhotos", + "value": "Save Edited Photos" + }, + "Settings.SaveIncomingPhotos": { + "key": "Settings.SaveIncomingPhotos", + "value": "Save Incoming Photos" + }, + "Settings.SavedMessages": { + "key": "Settings.SavedMessages", + "value": "Saved Messages" + }, + "Settings.Search": { + "key": "Settings.Search", + "value": "Search" + }, + "Settings.SetNewProfilePhotoOrVideo": { + "key": "Settings.SetNewProfilePhotoOrVideo", + "value": "Set New Photo or Video" + }, + "Settings.SetProfilePhoto": { + "key": "Settings.SetProfilePhoto", + "value": "Set Profile Photo" + }, + "Settings.SetProfilePhotoOrVideo": { + "key": "Settings.SetProfilePhotoOrVideo", + "value": "Set Photo or Video" + }, + "Settings.SetUsername": { + "key": "Settings.SetUsername", + "value": "Set Username" + }, + "Settings.Support": { + "key": "Settings.Support", + "value": "Ask a Question" + }, + "Settings.Title": { + "key": "Settings.Title", + "value": "Settings" + }, + "Settings.Username": { + "key": "Settings.Username", + "value": "Username" + }, + "Settings.UsernameEmpty": { + "key": "Settings.UsernameEmpty", + "value": "Add" + }, + "Settings.ViewPhoto": { + "key": "Settings.ViewPhoto", + "value": "View Photo" + }, + "Settings.ViewVideo": { + "key": "Settings.ViewVideo", + "value": "View Video" + }, + "SettingsSearch.FAQ": { + "key": "SettingsSearch.FAQ", + "value": "FAQ" + }, + "SettingsSearch.Synonyms.AppLanguage": { + "key": "SettingsSearch.Synonyms.AppLanguage", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.Animations": { + "key": "SettingsSearch.Synonyms.Appearance.Animations", + "value": "Animations" + }, + "SettingsSearch.Synonyms.Appearance.AutoNightTheme": { + "key": "SettingsSearch.Synonyms.Appearance.AutoNightTheme", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground", + "value": "Wallpaper" + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground.Custom": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground.Custom", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground.SetColor": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground.SetColor", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.ColorTheme": { + "key": "SettingsSearch.Synonyms.Appearance.ColorTheme", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.LargeEmoji": { + "key": "SettingsSearch.Synonyms.Appearance.LargeEmoji", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.TextSize": { + "key": "SettingsSearch.Synonyms.Appearance.TextSize", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.Title": { + "key": "SettingsSearch.Synonyms.Appearance.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Calls.CallTab": { + "key": "SettingsSearch.Synonyms.Calls.CallTab", + "value": " " + }, + "SettingsSearch.Synonyms.Calls.Title": { + "key": "SettingsSearch.Synonyms.Calls.Title", + "value": " " + }, + "SettingsSearch.Synonyms.ChatSettings.IntentsSettings": { + "key": "SettingsSearch.Synonyms.ChatSettings.IntentsSettings", + "value": "Siri Suggestions" + }, + "SettingsSearch.Synonyms.ChatSettings.OpenLinksIn": { + "key": "SettingsSearch.Synonyms.ChatSettings.OpenLinksIn", + "value": "Browser" + }, + "SettingsSearch.Synonyms.Data.AutoDownloadReset": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadReset", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoDownloadUsingCellular": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadUsingCellular", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoDownloadUsingWifi": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadUsingWifi", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoplayGifs": { + "key": "SettingsSearch.Synonyms.Data.AutoplayGifs", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoplayVideos": { + "key": "SettingsSearch.Synonyms.Data.AutoplayVideos", + "value": " " + }, + "SettingsSearch.Synonyms.Data.CallsUseLessData": { + "key": "SettingsSearch.Synonyms.Data.CallsUseLessData", + "value": " " + }, + "SettingsSearch.Synonyms.Data.DownloadInBackground": { + "key": "SettingsSearch.Synonyms.Data.DownloadInBackground", + "value": " " + }, + "SettingsSearch.Synonyms.Data.NetworkUsage": { + "key": "SettingsSearch.Synonyms.Data.NetworkUsage", + "value": " " + }, + "SettingsSearch.Synonyms.Data.SaveEditedPhotos": { + "key": "SettingsSearch.Synonyms.Data.SaveEditedPhotos", + "value": " " + }, + "SettingsSearch.Synonyms.Data.SaveIncomingPhotos": { + "key": "SettingsSearch.Synonyms.Data.SaveIncomingPhotos", + "value": " " + }, + "SettingsSearch.Synonyms.Data.Storage.ClearCache": { + "key": "SettingsSearch.Synonyms.Data.Storage.ClearCache", + "value": " " + }, + "SettingsSearch.Synonyms.Data.Storage.KeepMedia": { + "key": "SettingsSearch.Synonyms.Data.Storage.KeepMedia", + "value": " " + }, + "SettingsSearch.Synonyms.Data.Storage.Title": { + "key": "SettingsSearch.Synonyms.Data.Storage.Title", + "value": "Cache" + }, + "SettingsSearch.Synonyms.Data.Title": { + "key": "SettingsSearch.Synonyms.Data.Title", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.AddAccount": { + "key": "SettingsSearch.Synonyms.EditProfile.AddAccount", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Bio": { + "key": "SettingsSearch.Synonyms.EditProfile.Bio", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Logout": { + "key": "SettingsSearch.Synonyms.EditProfile.Logout", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.PhoneNumber": { + "key": "SettingsSearch.Synonyms.EditProfile.PhoneNumber", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Title": { + "key": "SettingsSearch.Synonyms.EditProfile.Title", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Username": { + "key": "SettingsSearch.Synonyms.EditProfile.Username", + "value": " " + }, + "SettingsSearch.Synonyms.FAQ": { + "key": "SettingsSearch.Synonyms.FAQ", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.BadgeCountUnreadMessages": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeCountUnreadMessages", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChannels": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChannels", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChats": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChats", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedPublicGroups": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedPublicGroups", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsAlert", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsExceptions", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ContactJoined": { + "key": "SettingsSearch.Synonyms.Notifications.ContactJoined", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.DisplayNamesOnLockScreen": { + "key": "SettingsSearch.Synonyms.Notifications.DisplayNamesOnLockScreen", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsAlert", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsExceptions", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsVibrate": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsVibrate", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsAlert", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsExceptions", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ResetAllNotifications": { + "key": "SettingsSearch.Synonyms.Notifications.ResetAllNotifications", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.Title": { + "key": "SettingsSearch.Synonyms.Notifications.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Passport": { + "key": "SettingsSearch.Synonyms.Passport", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.AuthSessions": { + "key": "SettingsSearch.Synonyms.Privacy.AuthSessions", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.BlockedUsers": { + "key": "SettingsSearch.Synonyms.Privacy.BlockedUsers", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Calls": { + "key": "SettingsSearch.Synonyms.Privacy.Calls", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.ClearPaymentsInfo": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ClearPaymentsInfo", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.ContactsReset": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ContactsReset", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.ContactsSync": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ContactsSync", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.DeleteDrafts": { + "key": "SettingsSearch.Synonyms.Privacy.Data.DeleteDrafts", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.SecretChatLinkPreview": { + "key": "SettingsSearch.Synonyms.Privacy.Data.SecretChatLinkPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.Title": { + "key": "SettingsSearch.Synonyms.Privacy.Data.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.TopPeers": { + "key": "SettingsSearch.Synonyms.Privacy.Data.TopPeers", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.DeleteAccountIfAwayFor": { + "key": "SettingsSearch.Synonyms.Privacy.DeleteAccountIfAwayFor", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Forwards": { + "key": "SettingsSearch.Synonyms.Privacy.Forwards", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.GroupsAndChannels": { + "key": "SettingsSearch.Synonyms.Privacy.GroupsAndChannels", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.LastSeen": { + "key": "SettingsSearch.Synonyms.Privacy.LastSeen", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Passcode": { + "key": "SettingsSearch.Synonyms.Privacy.Passcode", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.PasscodeAndFaceId": { + "key": "SettingsSearch.Synonyms.Privacy.PasscodeAndFaceId", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.PasscodeAndTouchId": { + "key": "SettingsSearch.Synonyms.Privacy.PasscodeAndTouchId", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.ProfilePhoto": { + "key": "SettingsSearch.Synonyms.Privacy.ProfilePhoto", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Title": { + "key": "SettingsSearch.Synonyms.Privacy.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.TwoStepAuth": { + "key": "SettingsSearch.Synonyms.Privacy.TwoStepAuth", + "value": "Password" + }, + "SettingsSearch.Synonyms.Proxy.AddProxy": { + "key": "SettingsSearch.Synonyms.Proxy.AddProxy", + "value": " " + }, + "SettingsSearch.Synonyms.Proxy.Title": { + "key": "SettingsSearch.Synonyms.Proxy.Title", + "value": "SOCKS5\nMTProto" + }, + "SettingsSearch.Synonyms.Proxy.UseForCalls": { + "key": "SettingsSearch.Synonyms.Proxy.UseForCalls", + "value": " " + }, + "SettingsSearch.Synonyms.SavedMessages": { + "key": "SettingsSearch.Synonyms.SavedMessages", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.ArchivedPacks": { + "key": "SettingsSearch.Synonyms.Stickers.ArchivedPacks", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.FeaturedPacks": { + "key": "SettingsSearch.Synonyms.Stickers.FeaturedPacks", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.Masks": { + "key": "SettingsSearch.Synonyms.Stickers.Masks", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.SuggestStickers": { + "key": "SettingsSearch.Synonyms.Stickers.SuggestStickers", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.Title": { + "key": "SettingsSearch.Synonyms.Stickers.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Support": { + "key": "SettingsSearch.Synonyms.Support", + "value": "Support" + }, + "SettingsSearch.Synonyms.Watch": { + "key": "SettingsSearch.Synonyms.Watch", + "value": "Apple Watch" + }, + "Share.AuthDescription": { + "key": "Share.AuthDescription", + "value": "Open Telegram and log in to share." + }, + "Share.AuthTitle": { + "key": "Share.AuthTitle", + "value": "Log in to Telegram" + }, + "Share.MultipleMessagesDisabled": { + "key": "Share.MultipleMessagesDisabled", + "value": "Slow Mode is enabled. You can't send multiple messages at once." + }, + "Share.Title": { + "key": "Share.Title", + "value": "Share" + }, + "ShareFileTip.CloseTip": { + "key": "ShareFileTip.CloseTip", + "value": "Close Tip" + }, + "ShareFileTip.Text": { + "key": "ShareFileTip.Text", + "value": "You can share **uncompressed** media files from your Camera Roll here.\n\nTo share files of any other type, open them on your %@ (e.g. in your browser), tap **Open in...** or the action button and choose Telegram." + }, + "ShareFileTip.Title": { + "key": "ShareFileTip.Title", + "value": "Sharing Files" + }, + "ShareMenu.Comment": { + "key": "ShareMenu.Comment", + "value": "Add a comment..." + }, + "ShareMenu.CopyShareLink": { + "key": "ShareMenu.CopyShareLink", + "value": "Copy Link" + }, + "ShareMenu.CopyShareLinkGame": { + "key": "ShareMenu.CopyShareLinkGame", + "value": "Copy link to game" + }, + "ShareMenu.SelectChats": { + "key": "ShareMenu.SelectChats", + "value": "Select chats" + }, + "ShareMenu.Send": { + "key": "ShareMenu.Send", + "value": "Send" + }, + "ShareMenu.ShareTo": { + "key": "ShareMenu.ShareTo", + "value": "Share with" + }, + "SharedMedia.CategoryDocs": { + "key": "SharedMedia.CategoryDocs", + "value": "Docs" + }, + "SharedMedia.CategoryLinks": { + "key": "SharedMedia.CategoryLinks", + "value": "Links" + }, + "SharedMedia.CategoryMedia": { + "key": "SharedMedia.CategoryMedia", + "value": "Media" + }, + "SharedMedia.CategoryOther": { + "key": "SharedMedia.CategoryOther", + "value": "Music" + }, + "SharedMedia.DeleteItemsConfirmation": { + "key": "SharedMedia.DeleteItemsConfirmation", + "zeroValue": null, + "oneValue": "Delete media file?", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Delete %@ media files?" + }, + "SharedMedia.EmptyFilesText": { + "key": "SharedMedia.EmptyFilesText", + "value": "You can send and receive\nfiles of any type up to 2 GB each\nand access them anywhere." + }, + "SharedMedia.EmptyLinksText": { + "key": "SharedMedia.EmptyLinksText", + "value": "All links shared in this chat will appear here" + }, + "SharedMedia.EmptyMusicText": { + "key": "SharedMedia.EmptyMusicText", + "value": "All music shared in this chat will appear here." + }, + "SharedMedia.EmptyText": { + "key": "SharedMedia.EmptyText", + "value": "Share photos and videos in this chat\n— or this paperclip stays unhappy." + }, + "SharedMedia.EmptyTitle": { + "key": "SharedMedia.EmptyTitle", + "value": "No media files yet" + }, + "SharedMedia.File": { + "key": "SharedMedia.File", + "zeroValue": null, + "oneValue": "1 file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ files" + }, + "SharedMedia.Generic": { + "key": "SharedMedia.Generic", + "zeroValue": null, + "oneValue": "1 media file", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ media files" + }, + "SharedMedia.Link": { + "key": "SharedMedia.Link", + "zeroValue": null, + "oneValue": "1 link", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ links" + }, + "SharedMedia.Photo": { + "key": "SharedMedia.Photo", + "zeroValue": null, + "oneValue": "1 photo", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ photos" + }, + "SharedMedia.SearchNoResults": { + "key": "SharedMedia.SearchNoResults", + "value": "No Results" + }, + "SharedMedia.SearchNoResultsDescription": { + "key": "SharedMedia.SearchNoResultsDescription", + "value": "There were no results for \"%@\".\nTry a new search." + }, + "SharedMedia.TitleAll": { + "key": "SharedMedia.TitleAll", + "value": "Shared Media" + }, + "SharedMedia.Video": { + "key": "SharedMedia.Video", + "zeroValue": null, + "oneValue": "1 video", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ videos" + }, + "SharedMedia.ViewInChat": { + "key": "SharedMedia.ViewInChat", + "value": "View in Chat" + }, + "Shortcut.SwitchAccount": { + "key": "Shortcut.SwitchAccount", + "value": "Switch Account" + }, + "SocksProxySetup.AdNoticeHelp": { + "key": "SocksProxySetup.AdNoticeHelp", + "value": "This proxy may display a sponsored channel in your chat list. This doesn't reveal your Telegram traffic." + }, + "SocksProxySetup.AddProxy": { + "key": "SocksProxySetup.AddProxy", + "value": "Add Proxy" + }, + "SocksProxySetup.AddProxyTitle": { + "key": "SocksProxySetup.AddProxyTitle", + "value": "Add Proxy" + }, + "SocksProxySetup.ConnectAndSave": { + "key": "SocksProxySetup.ConnectAndSave", + "value": "Connect Proxy" + }, + "SocksProxySetup.Connecting": { + "key": "SocksProxySetup.Connecting", + "value": "Connecting..." + }, + "SocksProxySetup.Connection": { + "key": "SocksProxySetup.Connection", + "value": "CONNECTION" + }, + "SocksProxySetup.Credentials": { + "key": "SocksProxySetup.Credentials", + "value": "CREDENTIALS (OPTIONAL)" + }, + "SocksProxySetup.FailedToConnect": { + "key": "SocksProxySetup.FailedToConnect", + "value": "Failed to connect" + }, + "SocksProxySetup.Hostname": { + "key": "SocksProxySetup.Hostname", + "value": "Server" + }, + "SocksProxySetup.HostnamePlaceholder": { + "key": "SocksProxySetup.HostnamePlaceholder", + "value": "Server" + }, + "SocksProxySetup.Password": { + "key": "SocksProxySetup.Password", + "value": "Password" + }, + "SocksProxySetup.PasswordPlaceholder": { + "key": "SocksProxySetup.PasswordPlaceholder", + "value": "Password" + }, + "SocksProxySetup.PasteFromClipboard": { + "key": "SocksProxySetup.PasteFromClipboard", + "value": "Paste From Clipboard" + }, + "SocksProxySetup.Port": { + "key": "SocksProxySetup.Port", + "value": "Port" + }, + "SocksProxySetup.PortPlaceholder": { + "key": "SocksProxySetup.PortPlaceholder", + "value": "Port" + }, + "SocksProxySetup.ProxyDetailsTitle": { + "key": "SocksProxySetup.ProxyDetailsTitle", + "value": "Proxy Details" + }, + "SocksProxySetup.ProxyEnabled": { + "key": "SocksProxySetup.ProxyEnabled", + "value": "Proxy\nEnabled" + }, + "SocksProxySetup.ProxySocks5": { + "key": "SocksProxySetup.ProxySocks5", + "value": "SOCKS5" + }, + "SocksProxySetup.ProxyStatusChecking": { + "key": "SocksProxySetup.ProxyStatusChecking", + "value": "checking..." + }, + "SocksProxySetup.ProxyStatusConnected": { + "key": "SocksProxySetup.ProxyStatusConnected", + "value": "connected" + }, + "SocksProxySetup.ProxyStatusConnecting": { + "key": "SocksProxySetup.ProxyStatusConnecting", + "value": "connecting" + }, + "SocksProxySetup.ProxyStatusPing": { + "key": "SocksProxySetup.ProxyStatusPing", + "value": "%@ ms ping" + }, + "SocksProxySetup.ProxyStatusUnavailable": { + "key": "SocksProxySetup.ProxyStatusUnavailable", + "value": "unavailable" + }, + "SocksProxySetup.ProxyTelegram": { + "key": "SocksProxySetup.ProxyTelegram", + "value": "MTProto" + }, + "SocksProxySetup.ProxyType": { + "key": "SocksProxySetup.ProxyType", + "value": "TYPE" + }, + "SocksProxySetup.RequiredCredentials": { + "key": "SocksProxySetup.RequiredCredentials", + "value": "CREDENTIALS" + }, + "SocksProxySetup.SaveProxy": { + "key": "SocksProxySetup.SaveProxy", + "value": "Save Proxy" + }, + "SocksProxySetup.SavedProxies": { + "key": "SocksProxySetup.SavedProxies", + "value": "SAVED PROXIES" + }, + "SocksProxySetup.Secret": { + "key": "SocksProxySetup.Secret", + "value": "Secret" + }, + "SocksProxySetup.SecretPlaceholder": { + "key": "SocksProxySetup.SecretPlaceholder", + "value": "Secret" + }, + "SocksProxySetup.ShareLink": { + "key": "SocksProxySetup.ShareLink", + "value": "Share Link" + }, + "SocksProxySetup.ShareProxyList": { + "key": "SocksProxySetup.ShareProxyList", + "value": "Share Proxy List" + }, + "SocksProxySetup.ShareQRCode": { + "key": "SocksProxySetup.ShareQRCode", + "value": "Share QR Code" + }, + "SocksProxySetup.ShareQRCodeInfo": { + "key": "SocksProxySetup.ShareQRCodeInfo", + "value": "Your friends can add this proxy by scanning this code with phone or in-app camera." + }, + "SocksProxySetup.Status": { + "key": "SocksProxySetup.Status", + "value": "Status" + }, + "SocksProxySetup.Title": { + "key": "SocksProxySetup.Title", + "value": "Proxy" + }, + "SocksProxySetup.TypeNone": { + "key": "SocksProxySetup.TypeNone", + "value": "Disabled" + }, + "SocksProxySetup.TypeSocks": { + "key": "SocksProxySetup.TypeSocks", + "value": "SOCKS5" + }, + "SocksProxySetup.UseForCalls": { + "key": "SocksProxySetup.UseForCalls", + "value": "Use for calls" + }, + "SocksProxySetup.UseForCallsHelp": { + "key": "SocksProxySetup.UseForCallsHelp", + "value": "Proxy servers may degrade the quality of your calls." + }, + "SocksProxySetup.UseProxy": { + "key": "SocksProxySetup.UseProxy", + "value": "Use Proxy" + }, + "SocksProxySetup.UseSocks5": { + "key": "SocksProxySetup.UseSocks5", + "value": "Use SOCKS5 Proxy" + }, + "SocksProxySetup.Username": { + "key": "SocksProxySetup.Username", + "value": "Username" + }, + "SocksProxySetup.UsernamePlaceholder": { + "key": "SocksProxySetup.UsernamePlaceholder", + "value": "Username" + }, + "State.Connecting": { + "key": "State.Connecting", + "value": "Connecting..." + }, + "State.ConnectingToProxy": { + "key": "State.ConnectingToProxy", + "value": "Connecting to Proxy..." + }, + "State.ConnectingToProxyInfo": { + "key": "State.ConnectingToProxyInfo", + "value": "tap here for settings" + }, + "State.Updating": { + "key": "State.Updating", + "value": "Updating..." + }, + "State.WaitingForNetwork": { + "key": "State.WaitingForNetwork", + "value": "Waiting for network" + }, + "State.connecting": { + "key": "State.connecting", + "value": "connecting" + }, + "Stats.EnabledNotifications": { + "key": "Stats.EnabledNotifications", + "value": "Enabled Notifications" + }, + "Stats.Followers": { + "key": "Stats.Followers", + "value": "Followers" + }, + "Stats.FollowersBySourceTitle": { + "key": "Stats.FollowersBySourceTitle", + "value": "FOLLOWERS BY SOURCE" + }, + "Stats.FollowersTitle": { + "key": "Stats.FollowersTitle", + "value": "FOLLOWERS" + }, + "Stats.GroupActionsTitle": { + "key": "Stats.GroupActionsTitle", + "value": "ACTIONS" + }, + "Stats.GroupGrowthTitle": { + "key": "Stats.GroupGrowthTitle", + "value": "GROWTH" + }, + "Stats.GroupLanguagesTitle": { + "key": "Stats.GroupLanguagesTitle", + "value": "MEMBERS' PRIMARY LANGUAGE" + }, + "Stats.GroupMembers": { + "key": "Stats.GroupMembers", + "value": "Members" + }, + "Stats.GroupMembersTitle": { + "key": "Stats.GroupMembersTitle", + "value": "GROUP MEMBERS" + }, + "Stats.GroupMessages": { + "key": "Stats.GroupMessages", + "value": "Messages" + }, + "Stats.GroupMessagesTitle": { + "key": "Stats.GroupMessagesTitle", + "value": "MESSAGES" + }, + "Stats.GroupNewMembersBySourceTitle": { + "key": "Stats.GroupNewMembersBySourceTitle", + "value": "NEW MEMBERS BY SOURCE" + }, + "Stats.GroupOverview": { + "key": "Stats.GroupOverview", + "value": "OVERVIEW" + }, + "Stats.GroupPosters": { + "key": "Stats.GroupPosters", + "value": "Posting Members" + }, + "Stats.GroupShowMoreTopAdmins": { + "key": "Stats.GroupShowMoreTopAdmins", + "zeroValue": null, + "oneValue": "Show %@ More", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More" + }, + "Stats.GroupShowMoreTopInviters": { + "key": "Stats.GroupShowMoreTopInviters", + "zeroValue": null, + "oneValue": "Show %@ More", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More" + }, + "Stats.GroupShowMoreTopPosters": { + "key": "Stats.GroupShowMoreTopPosters", + "zeroValue": null, + "oneValue": "Show %@ More", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Show %@ More" + }, + "Stats.GroupTopAdmin.Actions": { + "key": "Stats.GroupTopAdmin.Actions", + "value": "Actions" + }, + "Stats.GroupTopAdmin.Promote": { + "key": "Stats.GroupTopAdmin.Promote", + "value": "Promote" + }, + "Stats.GroupTopAdminBans": { + "key": "Stats.GroupTopAdminBans", + "zeroValue": null, + "oneValue": "%@ restriction", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ restrictions" + }, + "Stats.GroupTopAdminDeletions": { + "key": "Stats.GroupTopAdminDeletions", + "zeroValue": null, + "oneValue": "%@ deletion", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ deletions" + }, + "Stats.GroupTopAdminKicks": { + "key": "Stats.GroupTopAdminKicks", + "zeroValue": null, + "oneValue": "%@ ban", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ bans" + }, + "Stats.GroupTopAdminsTitle": { + "key": "Stats.GroupTopAdminsTitle", + "value": "TOP ADMINS" + }, + "Stats.GroupTopHoursTitle": { + "key": "Stats.GroupTopHoursTitle", + "value": "TOP HOURS" + }, + "Stats.GroupTopInviter.History": { + "key": "Stats.GroupTopInviter.History", + "value": "History" + }, + "Stats.GroupTopInviter.Promote": { + "key": "Stats.GroupTopInviter.Promote", + "value": "Promote" + }, + "Stats.GroupTopInviterInvites": { + "key": "Stats.GroupTopInviterInvites", + "zeroValue": null, + "oneValue": "%@ invitation", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ invitations" + }, + "Stats.GroupTopInvitersTitle": { + "key": "Stats.GroupTopInvitersTitle", + "value": "TOP INVITERS" + }, + "Stats.GroupTopPoster.History": { + "key": "Stats.GroupTopPoster.History", + "value": "History" + }, + "Stats.GroupTopPoster.Promote": { + "key": "Stats.GroupTopPoster.Promote", + "value": "Promote" + }, + "Stats.GroupTopPosterChars": { + "key": "Stats.GroupTopPosterChars", + "zeroValue": null, + "oneValue": "%@ character per message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ characters per message" + }, + "Stats.GroupTopPosterMessages": { + "key": "Stats.GroupTopPosterMessages", + "zeroValue": null, + "oneValue": "%@ message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ messages" + }, + "Stats.GroupTopPostersTitle": { + "key": "Stats.GroupTopPostersTitle", + "value": "TOP MEMBERS" + }, + "Stats.GroupTopWeekdaysTitle": { + "key": "Stats.GroupTopWeekdaysTitle", + "value": "TOP DAYS OF WEEK" + }, + "Stats.GroupViewers": { + "key": "Stats.GroupViewers", + "value": "Viewing Members" + }, + "Stats.GrowthTitle": { + "key": "Stats.GrowthTitle", + "value": "GROWTH" + }, + "Stats.InstantViewInteractionsTitle": { + "key": "Stats.InstantViewInteractionsTitle", + "value": "INSTANT VIEW INTERACTIONS" + }, + "Stats.InteractionsTitle": { + "key": "Stats.InteractionsTitle", + "value": "INTERACTIONS" + }, + "Stats.LanguagesTitle": { + "key": "Stats.LanguagesTitle", + "value": "LANGUAGES" + }, + "Stats.LoadingText": { + "key": "Stats.LoadingText", + "value": "Please wait a few moments while\nwe generate your stats" + }, + "Stats.LoadingTitle": { + "key": "Stats.LoadingTitle", + "value": "Preparing stats" + }, + "Stats.Message.PrivateShares": { + "key": "Stats.Message.PrivateShares", + "value": "Private Shares" + }, + "Stats.Message.PublicShares": { + "key": "Stats.Message.PublicShares", + "value": "Public Shares" + }, + "Stats.Message.Views": { + "key": "Stats.Message.Views", + "value": "Views" + }, + "Stats.MessageForwards": { + "key": "Stats.MessageForwards", + "zeroValue": null, + "oneValue": "%@ shared", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ shared" + }, + "Stats.MessageInteractionsTitle": { + "key": "Stats.MessageInteractionsTitle", + "value": "Interactions" + }, + "Stats.MessageOverview": { + "key": "Stats.MessageOverview", + "value": "Overview" + }, + "Stats.MessagePublicForwardsTitle": { + "key": "Stats.MessagePublicForwardsTitle", + "value": "Public Shares" + }, + "Stats.MessageTitle": { + "key": "Stats.MessageTitle", + "value": "Message Statistics" + }, + "Stats.MessageViews": { + "key": "Stats.MessageViews", + "zeroValue": null, + "oneValue": "%@ view", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ views" + }, + "Stats.NotificationsTitle": { + "key": "Stats.NotificationsTitle", + "value": "NOTIFICATIONS" + }, + "Stats.Overview": { + "key": "Stats.Overview", + "value": "OVERVIEW" + }, + "Stats.PostsTitle": { + "key": "Stats.PostsTitle", + "value": "RECENT POSTS" + }, + "Stats.SharesPerPost": { + "key": "Stats.SharesPerPost", + "value": "Shares Per Post" + }, + "Stats.Total": { + "key": "Stats.Total", + "value": "Total" + }, + "Stats.ViewsByHoursTitle": { + "key": "Stats.ViewsByHoursTitle", + "value": "VIEWS BY HOURS (UTC)" + }, + "Stats.ViewsBySourceTitle": { + "key": "Stats.ViewsBySourceTitle", + "value": "VIEWS BY SOURCE" + }, + "Stats.ViewsPerPost": { + "key": "Stats.ViewsPerPost", + "value": "Views Per Post" + }, + "Stats.ZoomOut": { + "key": "Stats.ZoomOut", + "value": "Zoom Out" + }, + "StickerPack.Add": { + "key": "StickerPack.Add", + "value": "Add" + }, + "StickerPack.AddMaskCount": { + "key": "StickerPack.AddMaskCount", + "zeroValue": null, + "oneValue": "Add 1 Mask", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Add %@ Masks" + }, + "StickerPack.AddStickerCount": { + "key": "StickerPack.AddStickerCount", + "zeroValue": null, + "oneValue": "Add 1 Sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Add %@ Stickers" + }, + "StickerPack.BuiltinPackName": { + "key": "StickerPack.BuiltinPackName", + "value": "Great Minds" + }, + "StickerPack.ErrorNotFound": { + "key": "StickerPack.ErrorNotFound", + "value": "Sorry, this sticker set doesn't seem to exist." + }, + "StickerPack.HideStickers": { + "key": "StickerPack.HideStickers", + "value": "Hide Stickers" + }, + "StickerPack.RemoveMaskCount": { + "key": "StickerPack.RemoveMaskCount", + "zeroValue": null, + "oneValue": "Remove 1 Mask", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Remove %@ Masks" + }, + "StickerPack.RemoveStickerCount": { + "key": "StickerPack.RemoveStickerCount", + "zeroValue": null, + "oneValue": "Remove 1 Sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Remove %@ Stickers" + }, + "StickerPack.Send": { + "key": "StickerPack.Send", + "value": "Send Sticker" + }, + "StickerPack.Share": { + "key": "StickerPack.Share", + "value": "Share" + }, + "StickerPack.ShowStickers": { + "key": "StickerPack.ShowStickers", + "value": "Show Stickers" + }, + "StickerPack.StickerCount": { + "key": "StickerPack.StickerCount", + "zeroValue": null, + "oneValue": "1 sticker", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ stickers" + }, + "StickerPack.ViewPack": { + "key": "StickerPack.ViewPack", + "value": "View Sticker Set" + }, + "StickerPackActionInfo.AddedText": { + "key": "StickerPackActionInfo.AddedText", + "value": "%@ has been added to your stickers." + }, + "StickerPackActionInfo.AddedTitle": { + "key": "StickerPackActionInfo.AddedTitle", + "value": "Stickers Added" + }, + "StickerPackActionInfo.ArchivedTitle": { + "key": "StickerPackActionInfo.ArchivedTitle", + "value": "Stickers Archived" + }, + "StickerPackActionInfo.RemovedText": { + "key": "StickerPackActionInfo.RemovedText", + "value": "%@ is no longer in your stickers." + }, + "StickerPackActionInfo.RemovedTitle": { + "key": "StickerPackActionInfo.RemovedTitle", + "value": "Stickers Removed" + }, + "StickerPacksSettings.AnimatedStickers": { + "key": "StickerPacksSettings.AnimatedStickers", + "value": "Loop Animated Stickers" + }, + "StickerPacksSettings.AnimatedStickersInfo": { + "key": "StickerPacksSettings.AnimatedStickersInfo", + "value": "Animated stickers will play continuously in chats." + }, + "StickerPacksSettings.ArchivedMasks": { + "key": "StickerPacksSettings.ArchivedMasks", + "value": "Archived Masks" + }, + "StickerPacksSettings.ArchivedMasks.Info": { + "key": "StickerPacksSettings.ArchivedMasks.Info", + "value": "You can have up to 200 sets of masks.\nUnused sets are archived when you add more." + }, + "StickerPacksSettings.ArchivedPacks": { + "key": "StickerPacksSettings.ArchivedPacks", + "value": "Archived Stickers" + }, + "StickerPacksSettings.ArchivedPacks.Info": { + "key": "StickerPacksSettings.ArchivedPacks.Info", + "value": "You can have 200 active sticker sets.\nUnused sets are archived when you add more." + }, + "StickerPacksSettings.FeaturedPacks": { + "key": "StickerPacksSettings.FeaturedPacks", + "value": "Trending Stickers" + }, + "StickerPacksSettings.ManagingHelp": { + "key": "StickerPacksSettings.ManagingHelp", + "value": "Artists are welcome to add their own sticker sets using our @stickers bot.\n\nTap on a sticker to view and add the whole set." + }, + "StickerPacksSettings.ShowStickersButton": { + "key": "StickerPacksSettings.ShowStickersButton", + "value": "Show Stickers Tab" + }, + "StickerPacksSettings.ShowStickersButtonHelp": { + "key": "StickerPacksSettings.ShowStickersButtonHelp", + "value": "A sticker icon will appear in the input field." + }, + "StickerPacksSettings.StickerPacksSection": { + "key": "StickerPacksSettings.StickerPacksSection", + "value": "STICKER SETS" + }, + "StickerPacksSettings.Title": { + "key": "StickerPacksSettings.Title", + "value": "Stickers" + }, + "StickerSettings.ContextHide": { + "key": "StickerSettings.ContextHide", + "value": "Archive" + }, + "StickerSettings.ContextInfo": { + "key": "StickerSettings.ContextInfo", + "value": "If you archive a sticker set, you can quickly restore it later from the Archived Stickers section." + }, + "StickerSettings.MaskContextInfo": { + "key": "StickerSettings.MaskContextInfo", + "value": "If you archive a set of masks, you can quickly restore it later from the Archived Masks section." + }, + "Stickers.AddToFavorites": { + "key": "Stickers.AddToFavorites", + "value": "Add to Favorites" + }, + "Stickers.ClearRecent": { + "key": "Stickers.ClearRecent", + "value": "Clear Recent Stickers" + }, + "Stickers.FavoriteStickers": { + "key": "Stickers.FavoriteStickers", + "value": "Favorite Stickers" + }, + "Stickers.FrequentlyUsed": { + "key": "Stickers.FrequentlyUsed", + "value": "Recently Used" + }, + "Stickers.GroupChooseStickerPack": { + "key": "Stickers.GroupChooseStickerPack", + "value": "CHOOSE STICKER SET" + }, + "Stickers.GroupStickers": { + "key": "Stickers.GroupStickers", + "value": "Group Stickers" + }, + "Stickers.GroupStickersHelp": { + "key": "Stickers.GroupStickersHelp", + "value": "You can choose a set that will be available to all group members when they are chatting in this group." + }, + "Stickers.Install": { + "key": "Stickers.Install", + "value": "ADD" + }, + "Stickers.Installed": { + "key": "Stickers.Installed", + "value": "ADDED" + }, + "Stickers.NoStickersFound": { + "key": "Stickers.NoStickersFound", + "value": "No Stickers Found" + }, + "Stickers.RemoveFromFavorites": { + "key": "Stickers.RemoveFromFavorites", + "value": "Remove from Favorites" + }, + "Stickers.Search": { + "key": "Stickers.Search", + "value": "Search for stickers" + }, + "Stickers.SuggestAdded": { + "key": "Stickers.SuggestAdded", + "value": "My Sets" + }, + "Stickers.SuggestAll": { + "key": "Stickers.SuggestAll", + "value": "All Sets" + }, + "Stickers.SuggestNone": { + "key": "Stickers.SuggestNone", + "value": "None" + }, + "Stickers.SuggestStickers": { + "key": "Stickers.SuggestStickers", + "value": "Suggest by Emoji" + }, + "Target.InviteToGroupConfirmation": { + "key": "Target.InviteToGroupConfirmation", + "value": "Add the bot to \"%@\"?" + }, + "Target.InviteToGroupErrorAlreadyInvited": { + "key": "Target.InviteToGroupErrorAlreadyInvited", + "value": "The bot is already a member of the group." + }, + "Target.SelectGroup": { + "key": "Target.SelectGroup", + "value": "Choose Group" + }, + "Target.ShareGameConfirmationGroup": { + "key": "Target.ShareGameConfirmationGroup", + "value": "Share the game with \"%@\"?" + }, + "Target.ShareGameConfirmationPrivate": { + "key": "Target.ShareGameConfirmationPrivate", + "value": "Share the game with %@?" + }, + "TextFormat.AddLinkPlaceholder": { + "key": "TextFormat.AddLinkPlaceholder", + "value": "URL" + }, + "TextFormat.AddLinkText": { + "key": "TextFormat.AddLinkText", + "value": "The link will be displayed as \"%@\"." + }, + "TextFormat.AddLinkTitle": { + "key": "TextFormat.AddLinkTitle", + "value": "Add Link" + }, + "TextFormat.Bold": { + "key": "TextFormat.Bold", + "value": "Bold" + }, + "TextFormat.Italic": { + "key": "TextFormat.Italic", + "value": "Italic" + }, + "TextFormat.Link": { + "key": "TextFormat.Link", + "value": "Link" + }, + "TextFormat.Monospace": { + "key": "TextFormat.Monospace", + "value": "Monospace" + }, + "TextFormat.Strikethrough": { + "key": "TextFormat.Strikethrough", + "value": "Strikethrough" + }, + "TextFormat.Underline": { + "key": "TextFormat.Underline", + "value": "Underline" + }, + "Theme.Colors.Accent": { + "key": "Theme.Colors.Accent", + "value": "Accent" + }, + "Theme.Colors.Background": { + "key": "Theme.Colors.Background", + "value": "Background" + }, + "Theme.Colors.ColorWallpaperWarning": { + "key": "Theme.Colors.ColorWallpaperWarning", + "value": "Are you sure you want to change your chat wallpaper to a color?" + }, + "Theme.Colors.ColorWallpaperWarningProceed": { + "key": "Theme.Colors.ColorWallpaperWarningProceed", + "value": "Proceed" + }, + "Theme.Colors.Messages": { + "key": "Theme.Colors.Messages", + "value": "Messages" + }, + "Theme.Colors.Proceed": { + "key": "Theme.Colors.Proceed", + "value": "Proceed" + }, + "Theme.Context.Apply": { + "key": "Theme.Context.Apply", + "value": "Apply" + }, + "Theme.Context.ChangeColors": { + "key": "Theme.Context.ChangeColors", + "value": "Change Colors" + }, + "Theme.ErrorNotFound": { + "key": "Theme.ErrorNotFound", + "value": "Sorry, this color theme doesn't seem to exist." + }, + "Theme.ThemeChanged": { + "key": "Theme.ThemeChanged", + "value": "Color Theme Changed" + }, + "Theme.ThemeChangedText": { + "key": "Theme.ThemeChangedText", + "value": "You can change it back in\n[Settings > Appearance]()." + }, + "Theme.Unsupported": { + "key": "Theme.Unsupported", + "value": "Sorry, this color theme doesn't support your device yet." + }, + "Theme.UsersCount": { + "key": "Theme.UsersCount", + "zeroValue": null, + "oneValue": "%@ person is using this theme", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ people are using this theme" + }, + "Time.MediumDate": { + "key": "Time.MediumDate", + "value": "%1$@ at %2$@" + }, + "Time.MonthOfYear_m1": { + "key": "Time.MonthOfYear_m1", + "value": "January %@" + }, + "Time.MonthOfYear_m10": { + "key": "Time.MonthOfYear_m10", + "value": "October %@" + }, + "Time.MonthOfYear_m11": { + "key": "Time.MonthOfYear_m11", + "value": "November %@" + }, + "Time.MonthOfYear_m12": { + "key": "Time.MonthOfYear_m12", + "value": "December %@" + }, + "Time.MonthOfYear_m2": { + "key": "Time.MonthOfYear_m2", + "value": "February %@" + }, + "Time.MonthOfYear_m3": { + "key": "Time.MonthOfYear_m3", + "value": "March %@" + }, + "Time.MonthOfYear_m4": { + "key": "Time.MonthOfYear_m4", + "value": "April %@" + }, + "Time.MonthOfYear_m5": { + "key": "Time.MonthOfYear_m5", + "value": "May %@" + }, + "Time.MonthOfYear_m6": { + "key": "Time.MonthOfYear_m6", + "value": "June %@" + }, + "Time.MonthOfYear_m7": { + "key": "Time.MonthOfYear_m7", + "value": "July %@" + }, + "Time.MonthOfYear_m8": { + "key": "Time.MonthOfYear_m8", + "value": "August %@" + }, + "Time.MonthOfYear_m9": { + "key": "Time.MonthOfYear_m9", + "value": "September %@" + }, + "Time.PreciseDate_m1": { + "key": "Time.PreciseDate_m1", + "value": "Jan %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m10": { + "key": "Time.PreciseDate_m10", + "value": "Oct %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m11": { + "key": "Time.PreciseDate_m11", + "value": "Nov %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m12": { + "key": "Time.PreciseDate_m12", + "value": "Dec %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m2": { + "key": "Time.PreciseDate_m2", + "value": "Feb %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m3": { + "key": "Time.PreciseDate_m3", + "value": "Mar %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m4": { + "key": "Time.PreciseDate_m4", + "value": "Apr %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m5": { + "key": "Time.PreciseDate_m5", + "value": "May %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m6": { + "key": "Time.PreciseDate_m6", + "value": "Jun %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m7": { + "key": "Time.PreciseDate_m7", + "value": "Jul %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m8": { + "key": "Time.PreciseDate_m8", + "value": "Aug %1$@, %2$@ at %3$@" + }, + "Time.PreciseDate_m9": { + "key": "Time.PreciseDate_m9", + "value": "Sep %1$@, %2$@ at %3$@" + }, + "Time.TodayAt": { + "key": "Time.TodayAt", + "value": "today at %@" + }, + "Time.TomorrowAt": { + "key": "Time.TomorrowAt", + "value": "tomorrow at %@" + }, + "Time.YesterdayAt": { + "key": "Time.YesterdayAt", + "value": "yesterday at %@" + }, + "Tour.StartButton": { + "key": "Tour.StartButton", + "value": "Start Messaging" + }, + "Tour.Text1": { + "key": "Tour.Text1", + "value": "The world's **fastest** messaging app.\nIt is **free** and **secure**." + }, + "Tour.Text2": { + "key": "Tour.Text2", + "value": "**Telegram** delivers messages\nfaster than any other application." + }, + "Tour.Text3": { + "key": "Tour.Text3", + "value": "**Telegram** has no limits on\nthe size of your media and chats." + }, + "Tour.Text4": { + "key": "Tour.Text4", + "value": "**Telegram** keeps your messages\nsafe from hacker attacks." + }, + "Tour.Text5": { + "key": "Tour.Text5", + "value": "**Telegram** lets you access your\nmessages from multiple devices." + }, + "Tour.Text6": { + "key": "Tour.Text6", + "value": "**Telegram** is free forever. No ads.\nNo subscription fees." + }, + "Tour.Title1": { + "key": "Tour.Title1", + "value": "Telegram" + }, + "Tour.Title2": { + "key": "Tour.Title2", + "value": "Fast" + }, + "Tour.Title3": { + "key": "Tour.Title3", + "value": "Powerful" + }, + "Tour.Title4": { + "key": "Tour.Title4", + "value": "Secure" + }, + "Tour.Title5": { + "key": "Tour.Title5", + "value": "Cloud-Based" + }, + "Tour.Title6": { + "key": "Tour.Title6", + "value": "Free" + }, + "TwoFactorSetup.Done.Action": { + "key": "TwoFactorSetup.Done.Action", + "value": "Return to Settings" + }, + "TwoFactorSetup.Done.Text": { + "key": "TwoFactorSetup.Done.Text", + "value": "This password will be required when you log in on a new device in addition to the code you get via SMS." + }, + "TwoFactorSetup.Done.Title": { + "key": "TwoFactorSetup.Done.Title", + "value": "Password Set!" + }, + "TwoFactorSetup.Email.Action": { + "key": "TwoFactorSetup.Email.Action", + "value": "Continue" + }, + "TwoFactorSetup.Email.Placeholder": { + "key": "TwoFactorSetup.Email.Placeholder", + "value": "Your email address" + }, + "TwoFactorSetup.Email.SkipAction": { + "key": "TwoFactorSetup.Email.SkipAction", + "value": "Skip setting email" + }, + "TwoFactorSetup.Email.SkipConfirmationSkip": { + "key": "TwoFactorSetup.Email.SkipConfirmationSkip", + "value": "Skip" + }, + "TwoFactorSetup.Email.SkipConfirmationText": { + "key": "TwoFactorSetup.Email.SkipConfirmationText", + "value": "If you forget your password, you will lose access to your Telegram account. There will be no way to restore it." + }, + "TwoFactorSetup.Email.SkipConfirmationTitle": { + "key": "TwoFactorSetup.Email.SkipConfirmationTitle", + "value": "No, seriously." + }, + "TwoFactorSetup.Email.Text": { + "key": "TwoFactorSetup.Email.Text", + "value": "You can set a recovery email to be able to reset your password and restore access to your Telegram account." + }, + "TwoFactorSetup.Email.Title": { + "key": "TwoFactorSetup.Email.Title", + "value": "Recovery Email" + }, + "TwoFactorSetup.EmailVerification.Action": { + "key": "TwoFactorSetup.EmailVerification.Action", + "value": "Continue" + }, + "TwoFactorSetup.EmailVerification.ChangeAction": { + "key": "TwoFactorSetup.EmailVerification.ChangeAction", + "value": "Change Email" + }, + "TwoFactorSetup.EmailVerification.Placeholder": { + "key": "TwoFactorSetup.EmailVerification.Placeholder", + "value": "Code" + }, + "TwoFactorSetup.EmailVerification.ResendAction": { + "key": "TwoFactorSetup.EmailVerification.ResendAction", + "value": "Re-send Code" + }, + "TwoFactorSetup.EmailVerification.Text": { + "key": "TwoFactorSetup.EmailVerification.Text", + "value": "Please enter code we've just emailed at %@" + }, + "TwoFactorSetup.EmailVerification.Title": { + "key": "TwoFactorSetup.EmailVerification.Title", + "value": "Recovery Email" + }, + "TwoFactorSetup.Hint.Action": { + "key": "TwoFactorSetup.Hint.Action", + "value": "Continue" + }, + "TwoFactorSetup.Hint.Placeholder": { + "key": "TwoFactorSetup.Hint.Placeholder", + "value": "Hint (optional)" + }, + "TwoFactorSetup.Hint.SkipAction": { + "key": "TwoFactorSetup.Hint.SkipAction", + "value": "Skip setting hint" + }, + "TwoFactorSetup.Hint.Text": { + "key": "TwoFactorSetup.Hint.Text", + "value": "You can create an optional hint for\nyour password." + }, + "TwoFactorSetup.Hint.Title": { + "key": "TwoFactorSetup.Hint.Title", + "value": "Hint" + }, + "TwoFactorSetup.Intro.Action": { + "key": "TwoFactorSetup.Intro.Action", + "value": "Set Additional Password" + }, + "TwoFactorSetup.Intro.Text": { + "key": "TwoFactorSetup.Intro.Text", + "value": "You can set a password that will be\nrequired when you log in on a new device in addition to the code you get via SMS." + }, + "TwoFactorSetup.Intro.Title": { + "key": "TwoFactorSetup.Intro.Title", + "value": "Additional Password" + }, + "TwoFactorSetup.Password.Action": { + "key": "TwoFactorSetup.Password.Action", + "value": "Create Password" + }, + "TwoFactorSetup.Password.PlaceholderConfirmPassword": { + "key": "TwoFactorSetup.Password.PlaceholderConfirmPassword", + "value": "Re-enter Password" + }, + "TwoFactorSetup.Password.PlaceholderPassword": { + "key": "TwoFactorSetup.Password.PlaceholderPassword", + "value": "Password" + }, + "TwoFactorSetup.Password.Title": { + "key": "TwoFactorSetup.Password.Title", + "value": "Create Password" + }, + "TwoStepAuth.AddHintDescription": { + "key": "TwoStepAuth.AddHintDescription", + "value": "You can create an optional hint for your password." + }, + "TwoStepAuth.AddHintTitle": { + "key": "TwoStepAuth.AddHintTitle", + "value": "Add a Hint" + }, + "TwoStepAuth.AdditionalPassword": { + "key": "TwoStepAuth.AdditionalPassword", + "value": "Additional Password" + }, + "TwoStepAuth.ChangeEmail": { + "key": "TwoStepAuth.ChangeEmail", + "value": "Change Recovery Email" + }, + "TwoStepAuth.ChangePassword": { + "key": "TwoStepAuth.ChangePassword", + "value": "Change Password" + }, + "TwoStepAuth.ChangePasswordDescription": { + "key": "TwoStepAuth.ChangePasswordDescription", + "value": "Please enter a new password which will be used to protect your data." + }, + "TwoStepAuth.ConfirmEmailCodePlaceholder": { + "key": "TwoStepAuth.ConfirmEmailCodePlaceholder", + "value": "Code" + }, + "TwoStepAuth.ConfirmEmailDescription": { + "key": "TwoStepAuth.ConfirmEmailDescription", + "value": "Please enter the code we've just emailed at %1$@." + }, + "TwoStepAuth.ConfirmEmailResendCode": { + "key": "TwoStepAuth.ConfirmEmailResendCode", + "value": "Resend Code" + }, + "TwoStepAuth.ConfirmationAbort": { + "key": "TwoStepAuth.ConfirmationAbort", + "value": "Abort Two-Step Verification Setup" + }, + "TwoStepAuth.ConfirmationText": { + "key": "TwoStepAuth.ConfirmationText", + "value": "Please check your email and click on the validation link to complete Two-Step Verification setup. Be sure to check the spam folder as well." + }, + "TwoStepAuth.ConfirmationTitle": { + "key": "TwoStepAuth.ConfirmationTitle", + "value": "Two-Step Verification" + }, + "TwoStepAuth.Disable": { + "key": "TwoStepAuth.Disable", + "value": "Disable" + }, + "TwoStepAuth.DisableSuccess": { + "key": "TwoStepAuth.DisableSuccess", + "value": "Two-Step verification\nis disabled." + }, + "TwoStepAuth.Email": { + "key": "TwoStepAuth.Email", + "value": "Email" + }, + "TwoStepAuth.EmailAddSuccess": { + "key": "TwoStepAuth.EmailAddSuccess", + "value": "Recovery Email Added" + }, + "TwoStepAuth.EmailChangeSuccess": { + "key": "TwoStepAuth.EmailChangeSuccess", + "value": "Your recovery email\nhas been changed." + }, + "TwoStepAuth.EmailCodeExpired": { + "key": "TwoStepAuth.EmailCodeExpired", + "value": "This confirmation code has expired. Please try again." + }, + "TwoStepAuth.EmailHelp": { + "key": "TwoStepAuth.EmailHelp", + "value": "Please add your valid email. It is the only way to recover a forgotten password." + }, + "TwoStepAuth.EmailInvalid": { + "key": "TwoStepAuth.EmailInvalid", + "value": "Invalid email address. Please try again." + }, + "TwoStepAuth.EmailPlaceholder": { + "key": "TwoStepAuth.EmailPlaceholder", + "value": "Your email" + }, + "TwoStepAuth.EmailSent": { + "key": "TwoStepAuth.EmailSent", + "value": "We have sent you an email to confirm your address." + }, + "TwoStepAuth.EmailSkip": { + "key": "TwoStepAuth.EmailSkip", + "value": "Skip" + }, + "TwoStepAuth.EmailSkipAlert": { + "key": "TwoStepAuth.EmailSkipAlert", + "value": "No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it." + }, + "TwoStepAuth.EmailTitle": { + "key": "TwoStepAuth.EmailTitle", + "value": "Recovery Email" + }, + "TwoStepAuth.EnabledSuccess": { + "key": "TwoStepAuth.EnabledSuccess", + "value": "Two-Step Verification Enabled" + }, + "TwoStepAuth.EnterEmailCode": { + "key": "TwoStepAuth.EnterEmailCode", + "value": "Enter Code" + }, + "TwoStepAuth.EnterPasswordForgot": { + "key": "TwoStepAuth.EnterPasswordForgot", + "value": "Forgot password?" + }, + "TwoStepAuth.EnterPasswordHelp": { + "key": "TwoStepAuth.EnterPasswordHelp", + "value": "You have Two-Step Verification enabled, so your account is protected with an additional password." + }, + "TwoStepAuth.EnterPasswordHint": { + "key": "TwoStepAuth.EnterPasswordHint", + "value": "Hint: %@" + }, + "TwoStepAuth.EnterPasswordInvalid": { + "key": "TwoStepAuth.EnterPasswordInvalid", + "value": "Invalid password. Please try again." + }, + "TwoStepAuth.EnterPasswordPassword": { + "key": "TwoStepAuth.EnterPasswordPassword", + "value": "Password" + }, + "TwoStepAuth.EnterPasswordTitle": { + "key": "TwoStepAuth.EnterPasswordTitle", + "value": "Password" + }, + "TwoStepAuth.FloodError": { + "key": "TwoStepAuth.FloodError", + "value": "Limit exceeded. Please try again later." + }, + "TwoStepAuth.GenericHelp": { + "key": "TwoStepAuth.GenericHelp", + "value": "You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account." + }, + "TwoStepAuth.HintPlaceholder": { + "key": "TwoStepAuth.HintPlaceholder", + "value": "Hint" + }, + "TwoStepAuth.PasswordChangeSuccess": { + "key": "TwoStepAuth.PasswordChangeSuccess", + "value": "Your password\nhas been changed." + }, + "TwoStepAuth.PasswordRemoveConfirmation": { + "key": "TwoStepAuth.PasswordRemoveConfirmation", + "value": "Are you sure you want to disable your password?" + }, + "TwoStepAuth.PasswordRemovePassportConfirmation": { + "key": "TwoStepAuth.PasswordRemovePassportConfirmation", + "value": "Are you sure you want to disable your password?\n\nWarning! All data saved in your Telegram Passport will be lost." + }, + "TwoStepAuth.PasswordSet": { + "key": "TwoStepAuth.PasswordSet", + "value": "Your password for Two-Step Verification is now active." + }, + "TwoStepAuth.PendingEmailHelp": { + "key": "TwoStepAuth.PendingEmailHelp", + "value": "Your recovery email %@ is not yet active and pending confirmation." + }, + "TwoStepAuth.ReEnterPasswordDescription": { + "key": "TwoStepAuth.ReEnterPasswordDescription", + "value": "Please confirm your password." + }, + "TwoStepAuth.ReEnterPasswordTitle": { + "key": "TwoStepAuth.ReEnterPasswordTitle", + "value": "Re-enter your Password" + }, + "TwoStepAuth.RecoveryCode": { + "key": "TwoStepAuth.RecoveryCode", + "value": "Code" + }, + "TwoStepAuth.RecoveryCodeExpired": { + "key": "TwoStepAuth.RecoveryCodeExpired", + "value": "We have sent you a new 6-digit code." + }, + "TwoStepAuth.RecoveryCodeHelp": { + "key": "TwoStepAuth.RecoveryCodeHelp", + "value": "Please check your email and enter the 6-digit code we've sent there to deactivate your cloud password." + }, + "TwoStepAuth.RecoveryCodeInvalid": { + "key": "TwoStepAuth.RecoveryCodeInvalid", + "value": "Invalid code. Please try again." + }, + "TwoStepAuth.RecoveryEmailAddDescription": { + "key": "TwoStepAuth.RecoveryEmailAddDescription", + "value": "Please add your valid email. It is the only way to recover a forgotten password." + }, + "TwoStepAuth.RecoveryEmailChangeDescription": { + "key": "TwoStepAuth.RecoveryEmailChangeDescription", + "value": "Please enter your new recovery email. It is the only way to recover a forgotten password." + }, + "TwoStepAuth.RecoveryEmailTitle": { + "key": "TwoStepAuth.RecoveryEmailTitle", + "value": "Recovery Email" + }, + "TwoStepAuth.RecoveryEmailUnavailable": { + "key": "TwoStepAuth.RecoveryEmailUnavailable", + "value": "Unable to access %@?" + }, + "TwoStepAuth.RecoveryFailed": { + "key": "TwoStepAuth.RecoveryFailed", + "value": "Your remaining options are either to remember your password or to reset your account." + }, + "TwoStepAuth.RecoveryTitle": { + "key": "TwoStepAuth.RecoveryTitle", + "value": "Email Code" + }, + "TwoStepAuth.RecoveryUnavailable": { + "key": "TwoStepAuth.RecoveryUnavailable", + "value": "Since you didn't provide a recovery email when setting up your password, your remaining options are either to remember your password or to reset your account." + }, + "TwoStepAuth.RemovePassword": { + "key": "TwoStepAuth.RemovePassword", + "value": "Turn Password Off" + }, + "TwoStepAuth.ResetAccountConfirmation": { + "key": "TwoStepAuth.ResetAccountConfirmation", + "value": "You will lose all your chats and messages, along with any media and files you've shared, if you proceed with resetting your account." + }, + "TwoStepAuth.ResetAccountHelp": { + "key": "TwoStepAuth.ResetAccountHelp", + "value": "You will lose all your chats and messages, along with any media and files you've shared, if you proceed with resetting your account." + }, + "TwoStepAuth.SetPassword": { + "key": "TwoStepAuth.SetPassword", + "value": "Set Additional Password" + }, + "TwoStepAuth.SetPasswordHelp": { + "key": "TwoStepAuth.SetPasswordHelp", + "value": "You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS." + }, + "TwoStepAuth.SetupEmail": { + "key": "TwoStepAuth.SetupEmail", + "value": "Set Recovery Email" + }, + "TwoStepAuth.SetupHint": { + "key": "TwoStepAuth.SetupHint", + "value": "Please create a hint for your password:" + }, + "TwoStepAuth.SetupHintTitle": { + "key": "TwoStepAuth.SetupHintTitle", + "value": "Password Hint" + }, + "TwoStepAuth.SetupPasswordConfirmFailed": { + "key": "TwoStepAuth.SetupPasswordConfirmFailed", + "value": "Passwords don't match. Please try again." + }, + "TwoStepAuth.SetupPasswordConfirmPassword": { + "key": "TwoStepAuth.SetupPasswordConfirmPassword", + "value": "Please re-enter your password:" + }, + "TwoStepAuth.SetupPasswordDescription": { + "key": "TwoStepAuth.SetupPasswordDescription", + "value": "Please create a password which will be used to protect your data." + }, + "TwoStepAuth.SetupPasswordEnterPasswordChange": { + "key": "TwoStepAuth.SetupPasswordEnterPasswordChange", + "value": "Please enter your new password:" + }, + "TwoStepAuth.SetupPasswordEnterPasswordNew": { + "key": "TwoStepAuth.SetupPasswordEnterPasswordNew", + "value": "Enter a password:" + }, + "TwoStepAuth.SetupPasswordTitle": { + "key": "TwoStepAuth.SetupPasswordTitle", + "value": "Your Password" + }, + "TwoStepAuth.SetupPendingEmail": { + "key": "TwoStepAuth.SetupPendingEmail", + "value": "Your recovery email %@ needs to be confirmed and is not yet active.\n\nPlease check your email and enter the confirmation code to complete Two-Step Verification setup. Be sure to check the spam folder as well." + }, + "TwoStepAuth.SetupResendEmailCode": { + "key": "TwoStepAuth.SetupResendEmailCode", + "value": "Resend Code" + }, + "TwoStepAuth.SetupResendEmailCodeAlert": { + "key": "TwoStepAuth.SetupResendEmailCodeAlert", + "value": "The code has been sent. Please check your email. Be sure to check the spam folder as well." + }, + "TwoStepAuth.Title": { + "key": "TwoStepAuth.Title", + "value": "Two-Step Verification" + }, + "Undo.ChatCleared": { + "key": "Undo.ChatCleared", + "value": "Chat cleared" + }, + "Undo.ChatClearedForBothSides": { + "key": "Undo.ChatClearedForBothSides", + "value": "Chat cleared for both sides" + }, + "Undo.ChatDeleted": { + "key": "Undo.ChatDeleted", + "value": "Chat deleted" + }, + "Undo.ChatDeletedForBothSides": { + "key": "Undo.ChatDeletedForBothSides", + "value": "Chat deleted for both sides" + }, + "Undo.DeletedChannel": { + "key": "Undo.DeletedChannel", + "value": "Channel deleted" + }, + "Undo.DeletedGroup": { + "key": "Undo.DeletedGroup", + "value": "Group deleted" + }, + "Undo.LeftChannel": { + "key": "Undo.LeftChannel", + "value": "Left the channel" + }, + "Undo.LeftGroup": { + "key": "Undo.LeftGroup", + "value": "Left the group" + }, + "Undo.MessagesDeleted": { + "key": "Undo.MessagesDeleted", + "value": "Messages deleted" + }, + "Undo.ScheduledMessagesCleared": { + "key": "Undo.ScheduledMessagesCleared", + "value": "Scheduled messages cleared" + }, + "Undo.SecretChatDeleted": { + "key": "Undo.SecretChatDeleted", + "value": "Secret Chat deleted" + }, + "Undo.Undo": { + "key": "Undo.Undo", + "value": "Undo" + }, + "Update.AppVersion": { + "key": "Update.AppVersion", + "value": "Telegram %@" + }, + "Update.Skip": { + "key": "Update.Skip", + "value": "Skip" + }, + "Update.Title": { + "key": "Update.Title", + "value": "Telegram Update" + }, + "Update.UpdateApp": { + "key": "Update.UpdateApp", + "value": "Update Telegram" + }, + "Updated.AtDate": { + "key": "Updated.AtDate", + "value": "%@" + }, + "Updated.HoursAgo": { + "key": "Updated.HoursAgo", + "zeroValue": null, + "oneValue": "1 hour ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ hours ago" + }, + "Updated.JustNow": { + "key": "Updated.JustNow", + "value": "just now" + }, + "Updated.MinutesAgo": { + "key": "Updated.MinutesAgo", + "zeroValue": null, + "oneValue": "1 minute ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ minutes ago" + }, + "Updated.TodayAt": { + "key": "Updated.TodayAt", + "value": "today at %@" + }, + "Updated.YesterdayAt": { + "key": "Updated.YesterdayAt", + "value": "yesterday at %@" + }, + "User.DeletedAccount": { + "key": "User.DeletedAccount", + "value": "Deleted Account" + }, + "UserCount": { + "key": "UserCount", + "zeroValue": null, + "oneValue": "1 user", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ users" + }, + "UserInfo.About.Placeholder": { + "key": "UserInfo.About.Placeholder", + "value": "Bio" + }, + "UserInfo.AddContact": { + "key": "UserInfo.AddContact", + "value": "Add to Contacts" + }, + "UserInfo.AddPhone": { + "key": "UserInfo.AddPhone", + "value": "add phone" + }, + "UserInfo.AddToExisting": { + "key": "UserInfo.AddToExisting", + "value": "Add to Existing" + }, + "UserInfo.BlockActionTitle": { + "key": "UserInfo.BlockActionTitle", + "value": "Block %@" + }, + "UserInfo.BlockConfirmation": { + "key": "UserInfo.BlockConfirmation", + "value": "Block %@?" + }, + "UserInfo.BlockConfirmationTitle": { + "key": "UserInfo.BlockConfirmationTitle", + "value": "Do you want to block %@ from messaging and calling you on Telegram?" + }, + "UserInfo.BotHelp": { + "key": "UserInfo.BotHelp", + "value": "Help" + }, + "UserInfo.BotPrivacy": { + "key": "UserInfo.BotPrivacy", + "value": "Privacy Policy" + }, + "UserInfo.BotSettings": { + "key": "UserInfo.BotSettings", + "value": "Settings" + }, + "UserInfo.CreateNewContact": { + "key": "UserInfo.CreateNewContact", + "value": "Create New Contact" + }, + "UserInfo.DeleteContact": { + "key": "UserInfo.DeleteContact", + "value": "Delete Contact" + }, + "UserInfo.FakeBotWarning": { + "key": "UserInfo.FakeBotWarning", + "value": "⚠️ Warning: Many users reported that this account impersonates a famous person or organization." + }, + "UserInfo.FakeUserWarning": { + "key": "UserInfo.FakeUserWarning", + "value": "⚠️ Warning: Many users reported that this account impersonates a famous person or organization." + }, + "UserInfo.FirstNamePlaceholder": { + "key": "UserInfo.FirstNamePlaceholder", + "value": "First Name" + }, + "UserInfo.GenericPhoneLabel": { + "key": "UserInfo.GenericPhoneLabel", + "value": "mobile" + }, + "UserInfo.GroupsInCommon": { + "key": "UserInfo.GroupsInCommon", + "value": "Groups In Common" + }, + "UserInfo.Invite": { + "key": "UserInfo.Invite", + "value": "Invite to Telegram" + }, + "UserInfo.InviteBotToGroup": { + "key": "UserInfo.InviteBotToGroup", + "value": "Add To Group" + }, + "UserInfo.LastNamePlaceholder": { + "key": "UserInfo.LastNamePlaceholder", + "value": "Last Name" + }, + "UserInfo.NotificationsDefault": { + "key": "UserInfo.NotificationsDefault", + "value": "Default" + }, + "UserInfo.NotificationsDefaultDisabled": { + "key": "UserInfo.NotificationsDefaultDisabled", + "value": "Default (Disabled)" + }, + "UserInfo.NotificationsDefaultEnabled": { + "key": "UserInfo.NotificationsDefaultEnabled", + "value": "Default (Enabled)" + }, + "UserInfo.NotificationsDefaultSound": { + "key": "UserInfo.NotificationsDefaultSound", + "value": "Default (%@)" + }, + "UserInfo.NotificationsDisable": { + "key": "UserInfo.NotificationsDisable", + "value": "Disable" + }, + "UserInfo.NotificationsDisabled": { + "key": "UserInfo.NotificationsDisabled", + "value": "Disabled" + }, + "UserInfo.NotificationsEnable": { + "key": "UserInfo.NotificationsEnable", + "value": "Enable" + }, + "UserInfo.NotificationsEnabled": { + "key": "UserInfo.NotificationsEnabled", + "value": "Enabled" + }, + "UserInfo.PhoneCall": { + "key": "UserInfo.PhoneCall", + "value": "Phone Call" + }, + "UserInfo.ScamBotWarning": { + "key": "UserInfo.ScamBotWarning", + "value": "⚠️ Warning: Many users reported this account as a scam or a fake account. Please be careful, especially if it asks you for money." + }, + "UserInfo.ScamUserWarning": { + "key": "UserInfo.ScamUserWarning", + "value": "⚠️ Warning: Many users reported this account as a scam or a fake account. Please be careful, especially if it asks you for money." + }, + "UserInfo.SendMessage": { + "key": "UserInfo.SendMessage", + "value": "Send Message" + }, + "UserInfo.ShareBot": { + "key": "UserInfo.ShareBot", + "value": "Share" + }, + "UserInfo.ShareContact": { + "key": "UserInfo.ShareContact", + "value": "Share Contact" + }, + "UserInfo.ShareMyContactInfo": { + "key": "UserInfo.ShareMyContactInfo", + "value": "Share My Contact Info" + }, + "UserInfo.StartSecretChat": { + "key": "UserInfo.StartSecretChat", + "value": "Start Secret Chat" + }, + "UserInfo.StartSecretChatConfirmation": { + "key": "UserInfo.StartSecretChatConfirmation", + "value": "Are you sure you want to start a secret chat with\n%@?" + }, + "UserInfo.StartSecretChatStart": { + "key": "UserInfo.StartSecretChatStart", + "value": "Start" + }, + "UserInfo.TapToCall": { + "key": "UserInfo.TapToCall", + "value": "Tap to make an end-to-end encrypted call" + }, + "UserInfo.TelegramCall": { + "key": "UserInfo.TelegramCall", + "value": "Telegram Call" + }, + "UserInfo.Title": { + "key": "UserInfo.Title", + "value": "Info" + }, + "UserInfo.UnblockConfirmation": { + "key": "UserInfo.UnblockConfirmation", + "value": "Unblock %@?" + }, + "Username.CheckingUsername": { + "key": "Username.CheckingUsername", + "value": "Checking username..." + }, + "Username.Help": { + "key": "Username.Help", + "value": "You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters." + }, + "Username.InvalidCharacters": { + "key": "Username.InvalidCharacters", + "value": "Only a-z, 0-9, and underscores allowed." + }, + "Username.InvalidStartsWithNumber": { + "key": "Username.InvalidStartsWithNumber", + "value": "Usernames can't start with a number." + }, + "Username.InvalidTaken": { + "key": "Username.InvalidTaken", + "value": "Sorry, this username is already taken." + }, + "Username.InvalidTooShort": { + "key": "Username.InvalidTooShort", + "value": "A username must have at least 5 characters." + }, + "Username.LinkCopied": { + "key": "Username.LinkCopied", + "value": "Link copied to clipboard" + }, + "Username.LinkHint": { + "key": "Username.LinkHint", + "value": "This link opens a chat with you:[\nhttps://t.me/%@]" + }, + "Username.Placeholder": { + "key": "Username.Placeholder", + "value": "Your Username" + }, + "Username.Title": { + "key": "Username.Title", + "value": "Username" + }, + "Username.TooManyPublicUsernamesError": { + "key": "Username.TooManyPublicUsernamesError", + "value": "Sorry, you have reserved too many public usernames." + }, + "Username.UsernameIsAvailable": { + "key": "Username.UsernameIsAvailable", + "value": "%@ is available." + }, + "VoiceChat.AnonymousDisabledAlertText": { + "key": "VoiceChat.AnonymousDisabledAlertText", + "value": "Sorry, you can't join voice chats as an anonymous admin." + }, + "VoiceChat.Audio": { + "key": "VoiceChat.Audio", + "value": "audio" + }, + "VoiceChat.ChatFullAlertText": { + "key": "VoiceChat.ChatFullAlertText", + "value": "Sorry, this voice chat has too many participants at the moment." + }, + "VoiceChat.Connecting": { + "key": "VoiceChat.Connecting", + "value": "Connecting..." + }, + "VoiceChat.CopyInviteLink": { + "key": "VoiceChat.CopyInviteLink", + "value": "Copy Invite Link" + }, + "VoiceChat.CreateNewVoiceChatStart": { + "key": "VoiceChat.CreateNewVoiceChatStart", + "value": "Start" + }, + "VoiceChat.CreateNewVoiceChatText": { + "key": "VoiceChat.CreateNewVoiceChatText", + "value": "Voice chat ended. Start a new one?" + }, + "VoiceChat.EndConfirmationEnd": { + "key": "VoiceChat.EndConfirmationEnd", + "value": "End" + }, + "VoiceChat.EndConfirmationText": { + "key": "VoiceChat.EndConfirmationText", + "value": "Are you sure you want to end this voice chat?" + }, + "VoiceChat.EndConfirmationTitle": { + "key": "VoiceChat.EndConfirmationTitle", + "value": "End voice chat" + }, + "VoiceChat.EndVoiceChat": { + "key": "VoiceChat.EndVoiceChat", + "value": "End Voice Chat" + }, + "VoiceChat.InviteLinkCopiedText": { + "key": "VoiceChat.InviteLinkCopiedText", + "value": "Invite link copied to clipboard" + }, + "VoiceChat.InviteMember": { + "key": "VoiceChat.InviteMember", + "value": "Invite Members" + }, + "VoiceChat.InviteMemberToGroupFirstAdd": { + "key": "VoiceChat.InviteMemberToGroupFirstAdd", + "value": "Add" + }, + "VoiceChat.InviteMemberToGroupFirstText": { + "key": "VoiceChat.InviteMemberToGroupFirstText", + "value": "%1$@ isn't a member of \"%2$@\". Add them to the group?" + }, + "VoiceChat.InvitePeer": { + "key": "VoiceChat.InvitePeer", + "value": "Invite" + }, + "VoiceChat.InvitedPeerText": { + "key": "VoiceChat.InvitedPeerText", + "value": "You invited %@ to the voice chat" + }, + "VoiceChat.Leave": { + "key": "VoiceChat.Leave", + "value": "leave" + }, + "VoiceChat.Live": { + "key": "VoiceChat.Live", + "value": "You're Live" + }, + "VoiceChat.Mute": { + "key": "VoiceChat.Mute", + "value": "Tap to Mute" + }, + "VoiceChat.MuteForMe": { + "key": "VoiceChat.MuteForMe", + "value": "Mute for Me" + }, + "VoiceChat.MutePeer": { + "key": "VoiceChat.MutePeer", + "value": "Mute" + }, + "VoiceChat.Muted": { + "key": "VoiceChat.Muted", + "value": "Muted" + }, + "VoiceChat.MutedHelp": { + "key": "VoiceChat.MutedHelp", + "value": "You are in Listen Only mode" + }, + "VoiceChat.OpenChat": { + "key": "VoiceChat.OpenChat", + "value": "Open Chat" + }, + "VoiceChat.Panel.Members": { + "key": "VoiceChat.Panel.Members", + "zeroValue": null, + "oneValue": "%@ participant", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ participants" + }, + "VoiceChat.Panel.MembersSpeaking": { + "key": "VoiceChat.Panel.MembersSpeaking", + "zeroValue": null, + "oneValue": "%@ participant speaking", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ participants talking" + }, + "VoiceChat.Panel.TapToJoin": { + "key": "VoiceChat.Panel.TapToJoin", + "value": "Tap to join" + }, + "VoiceChat.PanelJoin": { + "key": "VoiceChat.PanelJoin", + "value": "Join" + }, + "VoiceChat.PeerJoinedText": { + "key": "VoiceChat.PeerJoinedText", + "value": "%@ joined the voice chat" + }, + "VoiceChat.Reconnecting": { + "key": "VoiceChat.Reconnecting", + "value": "Reconnecting..." + }, + "VoiceChat.RemovePeer": { + "key": "VoiceChat.RemovePeer", + "value": "Remove" + }, + "VoiceChat.RemovePeerConfirmation": { + "key": "VoiceChat.RemovePeerConfirmation", + "value": "Are you sure you want to remove %@ from the group?" + }, + "VoiceChat.RemovePeerRemove": { + "key": "VoiceChat.RemovePeerRemove", + "value": "Remove" + }, + "VoiceChat.RemovedPeerText": { + "key": "VoiceChat.RemovedPeerText", + "value": "You removed %@ from the group" + }, + "VoiceChat.Share": { + "key": "VoiceChat.Share", + "value": "Share Invite Link" + }, + "VoiceChat.SpeakPermissionAdmin": { + "key": "VoiceChat.SpeakPermissionAdmin", + "value": "New Participants Are Muted" + }, + "VoiceChat.SpeakPermissionEveryone": { + "key": "VoiceChat.SpeakPermissionEveryone", + "value": "New Participants Can Speak" + }, + "VoiceChat.Status.Members": { + "key": "VoiceChat.Status.Members", + "zeroValue": null, + "oneValue": "[%@]participant", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "[%@]participants" + }, + "VoiceChat.Status.MembersFormat": { + "key": "VoiceChat.Status.MembersFormat", + "value": "%1$@ %2$@" + }, + "VoiceChat.StatusInvited": { + "key": "VoiceChat.StatusInvited", + "value": "invited" + }, + "VoiceChat.StatusListening": { + "key": "VoiceChat.StatusListening", + "value": "listening" + }, + "VoiceChat.StatusMutedForYou": { + "key": "VoiceChat.StatusMutedForYou", + "value": "muted for you" + }, + "VoiceChat.StatusMutedYou": { + "key": "VoiceChat.StatusMutedYou", + "value": "put you on mute" + }, + "VoiceChat.StatusSpeaking": { + "key": "VoiceChat.StatusSpeaking", + "value": "speaking" + }, + "VoiceChat.Title": { + "key": "VoiceChat.Title", + "value": "Voice Chat" + }, + "VoiceChat.Unmute": { + "key": "VoiceChat.Unmute", + "value": "Unmute" + }, + "VoiceChat.UnmuteForMe": { + "key": "VoiceChat.UnmuteForMe", + "value": "Unmute for Me" + }, + "VoiceChat.UnmuteHelp": { + "key": "VoiceChat.UnmuteHelp", + "value": "or hold and speak" + }, + "VoiceChat.UnmutePeer": { + "key": "VoiceChat.UnmutePeer", + "value": "Allow to Speak" + }, + "VoiceChat.UserInvited": { + "key": "VoiceChat.UserInvited", + "value": "You invited **%@** to the voice chat" + }, + "VoiceOver.AttachMedia": { + "key": "VoiceOver.AttachMedia", + "value": "Send media" + }, + "VoiceOver.AuthSessions.CurrentSession": { + "key": "VoiceOver.AuthSessions.CurrentSession", + "value": "Current Session" + }, + "VoiceOver.Chat.AnimatedSticker": { + "key": "VoiceOver.Chat.AnimatedSticker", + "value": "Animated sticker" + }, + "VoiceOver.Chat.AnimatedStickerFrom": { + "key": "VoiceOver.Chat.AnimatedStickerFrom", + "value": "Animated sticker, from: %@" + }, + "VoiceOver.Chat.AnonymousPoll": { + "key": "VoiceOver.Chat.AnonymousPoll", + "value": "Anonymous poll" + }, + "VoiceOver.Chat.AnonymousPollFrom": { + "key": "VoiceOver.Chat.AnonymousPollFrom", + "value": "Anonymous poll, from: %@" + }, + "VoiceOver.Chat.Caption": { + "key": "VoiceOver.Chat.Caption", + "value": "Caption: %@" + }, + "VoiceOver.Chat.ChannelInfo": { + "key": "VoiceOver.Chat.ChannelInfo", + "value": "Channel Info" + }, + "VoiceOver.Chat.Contact": { + "key": "VoiceOver.Chat.Contact", + "value": "Shared contact" + }, + "VoiceOver.Chat.ContactEmail": { + "key": "VoiceOver.Chat.ContactEmail", + "value": "Email" + }, + "VoiceOver.Chat.ContactEmailCount": { + "key": "VoiceOver.Chat.ContactEmailCount", + "zeroValue": null, + "oneValue": "%@ email address", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ email addresses" + }, + "VoiceOver.Chat.ContactFrom": { + "key": "VoiceOver.Chat.ContactFrom", + "value": "Shared contact, from: %@" + }, + "VoiceOver.Chat.ContactOrganization": { + "key": "VoiceOver.Chat.ContactOrganization", + "value": "Organization: %@" + }, + "VoiceOver.Chat.ContactPhoneNumber": { + "key": "VoiceOver.Chat.ContactPhoneNumber", + "value": "Phone number" + }, + "VoiceOver.Chat.ContactPhoneNumberCount": { + "key": "VoiceOver.Chat.ContactPhoneNumberCount", + "zeroValue": null, + "oneValue": "%@ phone number", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ phone numbers" + }, + "VoiceOver.Chat.Duration": { + "key": "VoiceOver.Chat.Duration", + "value": "Duration: %@" + }, + "VoiceOver.Chat.File": { + "key": "VoiceOver.Chat.File", + "value": "File" + }, + "VoiceOver.Chat.FileFrom": { + "key": "VoiceOver.Chat.FileFrom", + "value": "File, from: %@" + }, + "VoiceOver.Chat.ForwardedFrom": { + "key": "VoiceOver.Chat.ForwardedFrom", + "value": "Forwarded from: %@" + }, + "VoiceOver.Chat.ForwardedFromYou": { + "key": "VoiceOver.Chat.ForwardedFromYou", + "value": "Forwarded from you" + }, + "VoiceOver.Chat.GoToOriginalMessage": { + "key": "VoiceOver.Chat.GoToOriginalMessage", + "value": "Go to message" + }, + "VoiceOver.Chat.GroupInfo": { + "key": "VoiceOver.Chat.GroupInfo", + "value": "Group Info" + }, + "VoiceOver.Chat.Message": { + "key": "VoiceOver.Chat.Message", + "value": "Message" + }, + "VoiceOver.Chat.MessagesSelected": { + "key": "VoiceOver.Chat.MessagesSelected", + "zeroValue": null, + "oneValue": "%@ message selected", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ messages selected" + }, + "VoiceOver.Chat.Music": { + "key": "VoiceOver.Chat.Music", + "value": "Music message" + }, + "VoiceOver.Chat.MusicFrom": { + "key": "VoiceOver.Chat.MusicFrom", + "value": "Music file, from: %@" + }, + "VoiceOver.Chat.MusicTitle": { + "key": "VoiceOver.Chat.MusicTitle", + "value": "%1$@, by %2$@" + }, + "VoiceOver.Chat.OpenHint": { + "key": "VoiceOver.Chat.OpenHint", + "value": "Double tap to open" + }, + "VoiceOver.Chat.OpenLinkHint": { + "key": "VoiceOver.Chat.OpenLinkHint", + "value": "Double tap to open link" + }, + "VoiceOver.Chat.OptionSelected": { + "key": "VoiceOver.Chat.OptionSelected", + "value": "selected" + }, + "VoiceOver.Chat.PagePreview": { + "key": "VoiceOver.Chat.PagePreview", + "value": "Page preview" + }, + "VoiceOver.Chat.Photo": { + "key": "VoiceOver.Chat.Photo", + "value": "Photo" + }, + "VoiceOver.Chat.PhotoFrom": { + "key": "VoiceOver.Chat.PhotoFrom", + "value": "Photo, from: %@" + }, + "VoiceOver.Chat.PlayHint": { + "key": "VoiceOver.Chat.PlayHint", + "value": "Double tap to play" + }, + "VoiceOver.Chat.PollFinalResults": { + "key": "VoiceOver.Chat.PollFinalResults", + "value": "Final results" + }, + "VoiceOver.Chat.PollNoVotes": { + "key": "VoiceOver.Chat.PollNoVotes", + "value": "No votes" + }, + "VoiceOver.Chat.PollOptionCount": { + "key": "VoiceOver.Chat.PollOptionCount", + "zeroValue": null, + "oneValue": "%@ option:", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ options:" + }, + "VoiceOver.Chat.PollVotes": { + "key": "VoiceOver.Chat.PollVotes", + "zeroValue": null, + "oneValue": "%@ vote", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ votes" + }, + "VoiceOver.Chat.Profile": { + "key": "VoiceOver.Chat.Profile", + "value": "Profile" + }, + "VoiceOver.Chat.RecordModeVideoMessage": { + "key": "VoiceOver.Chat.RecordModeVideoMessage", + "value": "Video message" + }, + "VoiceOver.Chat.RecordModeVideoMessageInfo": { + "key": "VoiceOver.Chat.RecordModeVideoMessageInfo", + "value": "Double tap and hold to record video message. Slide up to lock recording, slide left to cancel. Double tap to switch to audio." + }, + "VoiceOver.Chat.RecordModeVoiceMessage": { + "key": "VoiceOver.Chat.RecordModeVoiceMessage", + "value": "Voice message" + }, + "VoiceOver.Chat.RecordModeVoiceMessageInfo": { + "key": "VoiceOver.Chat.RecordModeVoiceMessageInfo", + "value": "Double tap and hold to record voice message. Slide up to lock recording, slide left to cancel. Double tap to switch to video." + }, + "VoiceOver.Chat.RecordPreviewVoiceMessage": { + "key": "VoiceOver.Chat.RecordPreviewVoiceMessage", + "value": "Preview voice message" + }, + "VoiceOver.Chat.Reply": { + "key": "VoiceOver.Chat.Reply", + "value": "Reply to message" + }, + "VoiceOver.Chat.ReplyFrom": { + "key": "VoiceOver.Chat.ReplyFrom", + "value": "Reply to message from: %@" + }, + "VoiceOver.Chat.ReplyToYourMessage": { + "key": "VoiceOver.Chat.ReplyToYourMessage", + "value": "Reply to your message" + }, + "VoiceOver.Chat.SeenByRecipient": { + "key": "VoiceOver.Chat.SeenByRecipient", + "value": "Seen by recipient" + }, + "VoiceOver.Chat.SeenByRecipients": { + "key": "VoiceOver.Chat.SeenByRecipients", + "value": "Seen by recipients" + }, + "VoiceOver.Chat.Selected": { + "key": "VoiceOver.Chat.Selected", + "value": "Selected" + }, + "VoiceOver.Chat.Size": { + "key": "VoiceOver.Chat.Size", + "value": "Size: %@" + }, + "VoiceOver.Chat.Sticker": { + "key": "VoiceOver.Chat.Sticker", + "value": "Sticker" + }, + "VoiceOver.Chat.StickerFrom": { + "key": "VoiceOver.Chat.StickerFrom", + "value": "Sticker, from: %@" + }, + "VoiceOver.Chat.Title": { + "key": "VoiceOver.Chat.Title", + "value": "Title: %@" + }, + "VoiceOver.Chat.UnreadMessages": { + "key": "VoiceOver.Chat.UnreadMessages", + "zeroValue": null, + "oneValue": "%@ unread message", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ unread messages" + }, + "VoiceOver.Chat.Video": { + "key": "VoiceOver.Chat.Video", + "value": "Video" + }, + "VoiceOver.Chat.VideoFrom": { + "key": "VoiceOver.Chat.VideoFrom", + "value": "Video, from: %@" + }, + "VoiceOver.Chat.VideoMessage": { + "key": "VoiceOver.Chat.VideoMessage", + "value": "Video message" + }, + "VoiceOver.Chat.VideoMessageFrom": { + "key": "VoiceOver.Chat.VideoMessageFrom", + "value": "Video message, from: %@" + }, + "VoiceOver.Chat.VoiceMessage": { + "key": "VoiceOver.Chat.VoiceMessage", + "value": "Voice message" + }, + "VoiceOver.Chat.VoiceMessageFrom": { + "key": "VoiceOver.Chat.VoiceMessageFrom", + "value": "Voice message, from: %@" + }, + "VoiceOver.Chat.YourAnimatedSticker": { + "key": "VoiceOver.Chat.YourAnimatedSticker", + "value": "Your animated sticker" + }, + "VoiceOver.Chat.YourAnonymousPoll": { + "key": "VoiceOver.Chat.YourAnonymousPoll", + "value": "Your Anonymous poll" + }, + "VoiceOver.Chat.YourContact": { + "key": "VoiceOver.Chat.YourContact", + "value": "Your shared contact" + }, + "VoiceOver.Chat.YourFile": { + "key": "VoiceOver.Chat.YourFile", + "value": "Your file" + }, + "VoiceOver.Chat.YourMessage": { + "key": "VoiceOver.Chat.YourMessage", + "value": "Your message" + }, + "VoiceOver.Chat.YourMusic": { + "key": "VoiceOver.Chat.YourMusic", + "value": "Your music message" + }, + "VoiceOver.Chat.YourPhoto": { + "key": "VoiceOver.Chat.YourPhoto", + "value": "Your photo" + }, + "VoiceOver.Chat.YourSticker": { + "key": "VoiceOver.Chat.YourSticker", + "value": "Your sticker" + }, + "VoiceOver.Chat.YourVideo": { + "key": "VoiceOver.Chat.YourVideo", + "value": "Your video" + }, + "VoiceOver.Chat.YourVideoMessage": { + "key": "VoiceOver.Chat.YourVideoMessage", + "value": "Your video message" + }, + "VoiceOver.Chat.YourVoiceMessage": { + "key": "VoiceOver.Chat.YourVoiceMessage", + "value": "Your voice message" + }, + "VoiceOver.ChatList.Message": { + "key": "VoiceOver.ChatList.Message", + "value": "Message" + }, + "VoiceOver.ChatList.MessageEmpty": { + "key": "VoiceOver.ChatList.MessageEmpty", + "value": "Empty" + }, + "VoiceOver.ChatList.MessageFrom": { + "key": "VoiceOver.ChatList.MessageFrom", + "value": "From: %@" + }, + "VoiceOver.ChatList.MessageRead": { + "key": "VoiceOver.ChatList.MessageRead", + "value": "Read" + }, + "VoiceOver.ChatList.OutgoingMessage": { + "key": "VoiceOver.ChatList.OutgoingMessage", + "value": "Outgoing Message" + }, + "VoiceOver.Common.Off": { + "key": "VoiceOver.Common.Off", + "value": "Off" + }, + "VoiceOver.Common.On": { + "key": "VoiceOver.Common.On", + "value": "On" + }, + "VoiceOver.Common.SwitchHint": { + "key": "VoiceOver.Common.SwitchHint", + "value": "Double Tap To Toggle" + }, + "VoiceOver.DiscardPreparedContent": { + "key": "VoiceOver.DiscardPreparedContent", + "value": "Discard" + }, + "VoiceOver.DismissContextMenu": { + "key": "VoiceOver.DismissContextMenu", + "value": "Dismiss Context Menu" + }, + "VoiceOver.Editing.ClearText": { + "key": "VoiceOver.Editing.ClearText", + "value": "Clear text" + }, + "VoiceOver.Media.PlaybackPause": { + "key": "VoiceOver.Media.PlaybackPause", + "value": "Pause" + }, + "VoiceOver.Media.PlaybackPlay": { + "key": "VoiceOver.Media.PlaybackPlay", + "value": "Play" + }, + "VoiceOver.Media.PlaybackRate": { + "key": "VoiceOver.Media.PlaybackRate", + "value": "Playback speed" + }, + "VoiceOver.Media.PlaybackRateChange": { + "key": "VoiceOver.Media.PlaybackRateChange", + "value": "Double tap to change" + }, + "VoiceOver.Media.PlaybackRateFast": { + "key": "VoiceOver.Media.PlaybackRateFast", + "value": "Fast" + }, + "VoiceOver.Media.PlaybackRateNormal": { + "key": "VoiceOver.Media.PlaybackRateNormal", + "value": "Normal" + }, + "VoiceOver.Media.PlaybackStop": { + "key": "VoiceOver.Media.PlaybackStop", + "value": "Stop playback" + }, + "VoiceOver.MessageContextDelete": { + "key": "VoiceOver.MessageContextDelete", + "value": "Delete" + }, + "VoiceOver.MessageContextForward": { + "key": "VoiceOver.MessageContextForward", + "value": "Forward" + }, + "VoiceOver.MessageContextOpenMessageMenu": { + "key": "VoiceOver.MessageContextOpenMessageMenu", + "value": "Open message menu" + }, + "VoiceOver.MessageContextReply": { + "key": "VoiceOver.MessageContextReply", + "value": "Reply" + }, + "VoiceOver.MessageContextReport": { + "key": "VoiceOver.MessageContextReport", + "value": "Report" + }, + "VoiceOver.MessageContextSend": { + "key": "VoiceOver.MessageContextSend", + "value": "Send" + }, + "VoiceOver.MessageContextShare": { + "key": "VoiceOver.MessageContextShare", + "value": "Share" + }, + "VoiceOver.Navigation.Compose": { + "key": "VoiceOver.Navigation.Compose", + "value": "Compose" + }, + "VoiceOver.Navigation.ProxySettings": { + "key": "VoiceOver.Navigation.ProxySettings", + "value": "Proxy settings" + }, + "VoiceOver.Navigation.Search": { + "key": "VoiceOver.Navigation.Search", + "value": "Search" + }, + "VoiceOver.Recording.StopAndPreview": { + "key": "VoiceOver.Recording.StopAndPreview", + "value": "Stop and preview" + }, + "VoiceOver.ScrollStatus": { + "key": "VoiceOver.ScrollStatus", + "value": "Row %1$@ of %2$@" + }, + "Wallpaper.DeleteConfirmation": { + "key": "Wallpaper.DeleteConfirmation", + "zeroValue": null, + "oneValue": "Delete Background", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Delete %@ Backgrounds" + }, + "Wallpaper.ErrorNotFound": { + "key": "Wallpaper.ErrorNotFound", + "value": "Sorry, this chat background doesn't seem to exist." + }, + "Wallpaper.PhotoLibrary": { + "key": "Wallpaper.PhotoLibrary", + "value": "Photo Library" + }, + "Wallpaper.ResetWallpapers": { + "key": "Wallpaper.ResetWallpapers", + "value": "Reset Chat Backgrounds" + }, + "Wallpaper.ResetWallpapersConfirmation": { + "key": "Wallpaper.ResetWallpapersConfirmation", + "value": "Reset Chat Backgrounds" + }, + "Wallpaper.ResetWallpapersInfo": { + "key": "Wallpaper.ResetWallpapersInfo", + "value": "Remove all uploaded chat backgrounds and restore pre-installed backgrounds for all themes." + }, + "Wallpaper.Search": { + "key": "Wallpaper.Search", + "value": "Search for images" + }, + "Wallpaper.SearchShort": { + "key": "Wallpaper.SearchShort", + "value": "Search" + }, + "Wallpaper.Set": { + "key": "Wallpaper.Set", + "value": "Set" + }, + "Wallpaper.SetColor": { + "key": "Wallpaper.SetColor", + "value": "Set a Color" + }, + "Wallpaper.SetCustomBackground": { + "key": "Wallpaper.SetCustomBackground", + "value": "Choose from Photos" + }, + "Wallpaper.SetCustomBackgroundInfo": { + "key": "Wallpaper.SetCustomBackgroundInfo", + "value": "You can set a custom background image and share it with your friends." + }, + "Wallpaper.Title": { + "key": "Wallpaper.Title", + "value": "Chat Background" + }, + "Wallpaper.Wallpaper": { + "key": "Wallpaper.Wallpaper", + "value": "Wallpaper" + }, + "WallpaperColors.SetCustomColor": { + "key": "WallpaperColors.SetCustomColor", + "value": "Set Custom Color" + }, + "WallpaperColors.Title": { + "key": "WallpaperColors.Title", + "value": "Set a Color" + }, + "WallpaperPreview.Blurred": { + "key": "WallpaperPreview.Blurred", + "value": "Blurred" + }, + "WallpaperPreview.CropBottomText": { + "key": "WallpaperPreview.CropBottomText", + "value": "Get a sharing link for your background when you're done" + }, + "WallpaperPreview.CropTopText": { + "key": "WallpaperPreview.CropTopText", + "value": "Pinch and pan to adjust background" + }, + "WallpaperPreview.CustomColorBottomText": { + "key": "WallpaperPreview.CustomColorBottomText", + "value": "Something to match your curtains" + }, + "WallpaperPreview.CustomColorTopText": { + "key": "WallpaperPreview.CustomColorTopText", + "value": "Use sliders to adjust color" + }, + "WallpaperPreview.Motion": { + "key": "WallpaperPreview.Motion", + "value": "Motion" + }, + "WallpaperPreview.Pattern": { + "key": "WallpaperPreview.Pattern", + "value": "Pattern" + }, + "WallpaperPreview.PatternIntensity": { + "key": "WallpaperPreview.PatternIntensity", + "value": "Pattern Intensity" + }, + "WallpaperPreview.PatternPaternApply": { + "key": "WallpaperPreview.PatternPaternApply", + "value": "Apply" + }, + "WallpaperPreview.PatternPaternDiscard": { + "key": "WallpaperPreview.PatternPaternDiscard", + "value": "Discard" + }, + "WallpaperPreview.PatternTitle": { + "key": "WallpaperPreview.PatternTitle", + "value": "Choose Pattern" + }, + "WallpaperPreview.PreviewBottomText": { + "key": "WallpaperPreview.PreviewBottomText", + "value": "Enjoy the view" + }, + "WallpaperPreview.PreviewTopText": { + "key": "WallpaperPreview.PreviewTopText", + "value": "Tap Set to apply the background" + }, + "WallpaperPreview.SwipeBottomText": { + "key": "WallpaperPreview.SwipeBottomText", + "value": "Tap 'Motion' and try tilting your device" + }, + "WallpaperPreview.SwipeColorsBottomText": { + "key": "WallpaperPreview.SwipeColorsBottomText", + "value": "Salmon is a fish, not a color" + }, + "WallpaperPreview.SwipeColorsTopText": { + "key": "WallpaperPreview.SwipeColorsTopText", + "value": "Swipe left or right to see more colors" + }, + "WallpaperPreview.SwipeTopText": { + "key": "WallpaperPreview.SwipeTopText", + "value": "Swipe left or right to preview more backgrounds" + }, + "WallpaperPreview.Title": { + "key": "WallpaperPreview.Title", + "value": "Background Preview" + }, + "WallpaperSearch.ColorBlack": { + "key": "WallpaperSearch.ColorBlack", + "value": "Black" + }, + "WallpaperSearch.ColorBlue": { + "key": "WallpaperSearch.ColorBlue", + "value": "Blue" + }, + "WallpaperSearch.ColorBrown": { + "key": "WallpaperSearch.ColorBrown", + "value": "Brown" + }, + "WallpaperSearch.ColorGray": { + "key": "WallpaperSearch.ColorGray", + "value": "Gray" + }, + "WallpaperSearch.ColorGreen": { + "key": "WallpaperSearch.ColorGreen", + "value": "Green" + }, + "WallpaperSearch.ColorOrange": { + "key": "WallpaperSearch.ColorOrange", + "value": "Orange" + }, + "WallpaperSearch.ColorPink": { + "key": "WallpaperSearch.ColorPink", + "value": "Pink" + }, + "WallpaperSearch.ColorPrefix": { + "key": "WallpaperSearch.ColorPrefix", + "value": "color: " + }, + "WallpaperSearch.ColorPurple": { + "key": "WallpaperSearch.ColorPurple", + "value": "Purple" + }, + "WallpaperSearch.ColorRed": { + "key": "WallpaperSearch.ColorRed", + "value": "Red" + }, + "WallpaperSearch.ColorTeal": { + "key": "WallpaperSearch.ColorTeal", + "value": "Teal" + }, + "WallpaperSearch.ColorTitle": { + "key": "WallpaperSearch.ColorTitle", + "value": "SEARCH BY COLOR" + }, + "WallpaperSearch.ColorWhite": { + "key": "WallpaperSearch.ColorWhite", + "value": "White" + }, + "WallpaperSearch.ColorYellow": { + "key": "WallpaperSearch.ColorYellow", + "value": "Yellow" + }, + "WallpaperSearch.Recent": { + "key": "WallpaperSearch.Recent", + "value": "RECENT" + }, + "Watch.AppName": { + "key": "Watch.AppName", + "value": "Telegram" + }, + "Watch.AuthRequired": { + "key": "Watch.AuthRequired", + "value": "Log in to Telegram on your phone to get started" + }, + "Watch.Bot.Restart": { + "key": "Watch.Bot.Restart", + "value": "Restart" + }, + "Watch.ChannelInfo.Title": { + "key": "Watch.ChannelInfo.Title", + "value": "Channel Info" + }, + "Watch.ChatList.Compose": { + "key": "Watch.ChatList.Compose", + "value": "New Message" + }, + "Watch.ChatList.NoConversationsText": { + "key": "Watch.ChatList.NoConversationsText", + "value": "To start messaging,\npress firmly, then tap\nNew Message" + }, + "Watch.ChatList.NoConversationsTitle": { + "key": "Watch.ChatList.NoConversationsTitle", + "value": "No Conversations" + }, + "Watch.Compose.AddContact": { + "key": "Watch.Compose.AddContact", + "value": "Choose Contact" + }, + "Watch.Compose.CreateMessage": { + "key": "Watch.Compose.CreateMessage", + "value": "Create Message" + }, + "Watch.Compose.CurrentLocation": { + "key": "Watch.Compose.CurrentLocation", + "value": "Current Location" + }, + "Watch.Compose.Send": { + "key": "Watch.Compose.Send", + "value": "Send" + }, + "Watch.ConnectionDescription": { + "key": "Watch.ConnectionDescription", + "value": "Your Watch needs to be connected for the app to work" + }, + "Watch.Contacts.NoResults": { + "key": "Watch.Contacts.NoResults", + "value": "No matching\ncontacts found" + }, + "Watch.Conversation.GroupInfo": { + "key": "Watch.Conversation.GroupInfo", + "value": "Group Info" + }, + "Watch.Conversation.Reply": { + "key": "Watch.Conversation.Reply", + "value": "Reply" + }, + "Watch.Conversation.Unblock": { + "key": "Watch.Conversation.Unblock", + "value": "Unblock" + }, + "Watch.Conversation.UserInfo": { + "key": "Watch.Conversation.UserInfo", + "value": "Info" + }, + "Watch.GroupInfo.Title": { + "key": "Watch.GroupInfo.Title", + "value": "Group Info" + }, + "Watch.LastSeen.ALongTimeAgo": { + "key": "Watch.LastSeen.ALongTimeAgo", + "value": "a long time ago" + }, + "Watch.LastSeen.AtDate": { + "key": "Watch.LastSeen.AtDate", + "value": "%@" + }, + "Watch.LastSeen.HoursAgo": { + "key": "Watch.LastSeen.HoursAgo", + "zeroValue": null, + "oneValue": "1 hour ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ hours ago" + }, + "Watch.LastSeen.JustNow": { + "key": "Watch.LastSeen.JustNow", + "value": "just now" + }, + "Watch.LastSeen.Lately": { + "key": "Watch.LastSeen.Lately", + "value": "recently" + }, + "Watch.LastSeen.MinutesAgo": { + "key": "Watch.LastSeen.MinutesAgo", + "zeroValue": null, + "oneValue": "1 minute ago", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "%@ minutes ago" + }, + "Watch.LastSeen.WithinAMonth": { + "key": "Watch.LastSeen.WithinAMonth", + "value": "within a month" + }, + "Watch.LastSeen.WithinAWeek": { + "key": "Watch.LastSeen.WithinAWeek", + "value": "within a week" + }, + "Watch.LastSeen.YesterdayAt": { + "key": "Watch.LastSeen.YesterdayAt", + "value": "yesterday at %@" + }, + "Watch.Location.Access": { + "key": "Watch.Location.Access", + "value": "Allow Telegram to access location on your phone" + }, + "Watch.Location.Current": { + "key": "Watch.Location.Current", + "value": "Current Location" + }, + "Watch.Message.Call": { + "key": "Watch.Message.Call", + "value": "Call" + }, + "Watch.Message.ForwardedFrom": { + "key": "Watch.Message.ForwardedFrom", + "value": "Forwarded from" + }, + "Watch.Message.Game": { + "key": "Watch.Message.Game", + "value": "Game" + }, + "Watch.Message.Invoice": { + "key": "Watch.Message.Invoice", + "value": "Invoice" + }, + "Watch.Message.Poll": { + "key": "Watch.Message.Poll", + "value": "Poll" + }, + "Watch.Message.Unsupported": { + "key": "Watch.Message.Unsupported", + "value": "Unsupported Message" + }, + "Watch.MessageView.Forward": { + "key": "Watch.MessageView.Forward", + "value": "Forward" + }, + "Watch.MessageView.Reply": { + "key": "Watch.MessageView.Reply", + "value": "Reply" + }, + "Watch.MessageView.Title": { + "key": "Watch.MessageView.Title", + "value": "Message" + }, + "Watch.MessageView.ViewOnPhone": { + "key": "Watch.MessageView.ViewOnPhone", + "value": "View On Phone" + }, + "Watch.Microphone.Access": { + "key": "Watch.Microphone.Access", + "value": "Allow Telegram to access the microphone on your phone" + }, + "Watch.NoConnection": { + "key": "Watch.NoConnection", + "value": "No Connection" + }, + "Watch.Notification.Joined": { + "key": "Watch.Notification.Joined", + "value": "Joined Telegram" + }, + "Watch.PhotoView.Title": { + "key": "Watch.PhotoView.Title", + "value": "Photo" + }, + "Watch.Stickers.RecentPlaceholder": { + "key": "Watch.Stickers.RecentPlaceholder", + "value": "Your most frequently used stickers will appear here" + }, + "Watch.Stickers.Recents": { + "key": "Watch.Stickers.Recents", + "value": "Recents" + }, + "Watch.Stickers.StickerPacks": { + "key": "Watch.Stickers.StickerPacks", + "value": "Sticker Sets" + }, + "Watch.Suggestion.BRB": { + "key": "Watch.Suggestion.BRB", + "value": "BRB" + }, + "Watch.Suggestion.CantTalk": { + "key": "Watch.Suggestion.CantTalk", + "value": "Can't talk now..." + }, + "Watch.Suggestion.HoldOn": { + "key": "Watch.Suggestion.HoldOn", + "value": "Hold on a sec..." + }, + "Watch.Suggestion.OK": { + "key": "Watch.Suggestion.OK", + "value": "OK" + }, + "Watch.Suggestion.OnMyWay": { + "key": "Watch.Suggestion.OnMyWay", + "value": "I'm on my way." + }, + "Watch.Suggestion.TalkLater": { + "key": "Watch.Suggestion.TalkLater", + "value": "Talk later?" + }, + "Watch.Suggestion.Thanks": { + "key": "Watch.Suggestion.Thanks", + "value": "Thanks!" + }, + "Watch.Suggestion.WhatsUp": { + "key": "Watch.Suggestion.WhatsUp", + "value": "What's up?" + }, + "Watch.Time.ShortFullAt": { + "key": "Watch.Time.ShortFullAt", + "value": "%1$@ %2$@" + }, + "Watch.Time.ShortTodayAt": { + "key": "Watch.Time.ShortTodayAt", + "value": "Today %@" + }, + "Watch.Time.ShortWeekdayAt": { + "key": "Watch.Time.ShortWeekdayAt", + "value": "%1$@ %2$@" + }, + "Watch.Time.ShortYesterdayAt": { + "key": "Watch.Time.ShortYesterdayAt", + "value": "Yesterday %@" + }, + "Watch.UserInfo.Block": { + "key": "Watch.UserInfo.Block", + "value": "Block" + }, + "Watch.UserInfo.Mute": { + "key": "Watch.UserInfo.Mute", + "zeroValue": null, + "oneValue": "Mute for 1 hour", + "twoValue": null, + "fewValue": null, + "manyValue": null, + "otherValue": "Mute for %@ hours" + }, + "Watch.UserInfo.MuteTitle": { + "key": "Watch.UserInfo.MuteTitle", + "value": "Mute" + }, + "Watch.UserInfo.Service": { + "key": "Watch.UserInfo.Service", + "value": "service notifications" + }, + "Watch.UserInfo.Title": { + "key": "Watch.UserInfo.Title", + "value": "Info" + }, + "Watch.UserInfo.Unblock": { + "key": "Watch.UserInfo.Unblock", + "value": "Unblock" + }, + "Watch.UserInfo.Unmute": { + "key": "Watch.UserInfo.Unmute", + "value": "Unmute" + }, + "WatchRemote.AlertOpen": { + "key": "WatchRemote.AlertOpen", + "value": "Open" + }, + "WatchRemote.AlertText": { + "key": "WatchRemote.AlertText", + "value": "Open the message here?" + }, + "WatchRemote.AlertTitle": { + "key": "WatchRemote.AlertTitle", + "value": "Message from your Apple Watch" + }, + "WatchRemote.NotificationText": { + "key": "WatchRemote.NotificationText", + "value": "Open this notification on your phone to view the message from your Apple Watch" + }, + "Web.Error": { + "key": "Web.Error", + "value": "Couldn't load page" + }, + "Web.OpenExternal": { + "key": "Web.OpenExternal", + "value": "Open in Safari" + }, + "WebBrowser.DefaultBrowser": { + "key": "WebBrowser.DefaultBrowser", + "value": "DEFAULT WEB BROWSER" + }, + "WebBrowser.InAppSafari": { + "key": "WebBrowser.InAppSafari", + "value": "In-App Safari" + }, + "WebBrowser.Title": { + "key": "WebBrowser.Title", + "value": "Web Browser" + }, + "WebPreview.GettingLinkInfo": { + "key": "WebPreview.GettingLinkInfo", + "value": "Getting Link Info..." + }, + "WebSearch.GIFs": { + "key": "WebSearch.GIFs", + "value": "GIFs" + }, + "WebSearch.Images": { + "key": "WebSearch.Images", + "value": "Images" + }, + "WebSearch.RecentClearConfirmation": { + "key": "WebSearch.RecentClearConfirmation", + "value": "Are you sure you want to clear recent images?" + }, + "WebSearch.RecentSectionClear": { + "key": "WebSearch.RecentSectionClear", + "value": "Clear" + }, + "WebSearch.RecentSectionTitle": { + "key": "WebSearch.RecentSectionTitle", + "value": "Recent" + }, + "WebSearch.SearchNoResults": { + "key": "WebSearch.SearchNoResults", + "value": "No Results" + }, + "WebSearch.SearchNoResultsDescription": { + "key": "WebSearch.SearchNoResultsDescription", + "value": "There were no results for \"%@\".\nTry a new search." + }, + "Weekday.Friday": { + "key": "Weekday.Friday", + "value": "Friday" + }, + "Weekday.Monday": { + "key": "Weekday.Monday", + "value": "Monday" + }, + "Weekday.Saturday": { + "key": "Weekday.Saturday", + "value": "Saturday" + }, + "Weekday.ShortFriday": { + "key": "Weekday.ShortFriday", + "value": "Fri" + }, + "Weekday.ShortMonday": { + "key": "Weekday.ShortMonday", + "value": "Mon" + }, + "Weekday.ShortSaturday": { + "key": "Weekday.ShortSaturday", + "value": "Sat" + }, + "Weekday.ShortSunday": { + "key": "Weekday.ShortSunday", + "value": "Sun" + }, + "Weekday.ShortThursday": { + "key": "Weekday.ShortThursday", + "value": "Thu" + }, + "Weekday.ShortTuesday": { + "key": "Weekday.ShortTuesday", + "value": "Tue" + }, + "Weekday.ShortWednesday": { + "key": "Weekday.ShortWednesday", + "value": "Wed" + }, + "Weekday.Sunday": { + "key": "Weekday.Sunday", + "value": "Sunday" + }, + "Weekday.Thursday": { + "key": "Weekday.Thursday", + "value": "Thursday" + }, + "Weekday.Today": { + "key": "Weekday.Today", + "value": "Today" + }, + "Weekday.Tuesday": { + "key": "Weekday.Tuesday", + "value": "Tuesday" + }, + "Weekday.Wednesday": { + "key": "Weekday.Wednesday", + "value": "Wednesday" + }, + "Weekday.Yesterday": { + "key": "Weekday.Yesterday", + "value": "Yesterday" + }, + "Widget.ApplicationLocked": { + "key": "Widget.ApplicationLocked", + "value": "Unlock the app to use the widget" + }, + "Widget.ApplicationStartRequired": { + "key": "Widget.ApplicationStartRequired", + "value": "Open the app to use the widget" + }, + "Widget.AuthRequired": { + "key": "Widget.AuthRequired", + "value": "Log In to Telegram" + }, + "Widget.ChatsGalleryDescription": { + "key": "Widget.ChatsGalleryDescription", + "value": "Display the latest message from the most important chats." + }, + "Widget.ChatsGalleryTitle": { + "key": "Widget.ChatsGalleryTitle", + "value": "Chats" + }, + "Widget.LongTapToEdit": { + "key": "Widget.LongTapToEdit", + "value": "Tap or hold to edit widget." + }, + "Widget.MessageAutoremoveTimerRemoved": { + "key": "Widget.MessageAutoremoveTimerRemoved", + "value": "Auto-delete timer disabled" + }, + "Widget.MessageAutoremoveTimerUpdated": { + "key": "Widget.MessageAutoremoveTimerUpdated", + "value": "Auto-delete timer updated" + }, + "Widget.NoUsers": { + "key": "Widget.NoUsers", + "value": "Start messaging to see your friends here" + }, + "Widget.ShortcutsGalleryDescription": { + "key": "Widget.ShortcutsGalleryDescription", + "value": "Display shortcuts of your most important chats to always have quick access to them." + }, + "Widget.ShortcutsGalleryTitle": { + "key": "Widget.ShortcutsGalleryTitle", + "value": "Shortcuts" + }, + "Widget.UpdatedAt": { + "key": "Widget.UpdatedAt", + "value": "Updated {}" + }, + "Widget.UpdatedTodayAt": { + "key": "Widget.UpdatedTodayAt", + "value": "Updated at {}" + }, + "Your_card_has_expired": { + "key": "Your_card_has_expired", + "value": "Your card has expired." + }, + "Your_card_was_declined": { + "key": "Your_card_was_declined", + "value": "Your card was declined." + }, + "Your_cards_expiration_month_is_invalid": { + "key": "Your_cards_expiration_month_is_invalid", + "value": "You've entered an invalid expiration month." + }, + "Your_cards_expiration_year_is_invalid": { + "key": "Your_cards_expiration_year_is_invalid", + "value": "You've entered an invalid expiration year." + }, + "Your_cards_number_is_invalid": { + "key": "Your_cards_number_is_invalid", + "value": "You've entered an invalid card number." + }, + "Your_cards_security_code_is_invalid": { + "key": "Your_cards_security_code_is_invalid", + "value": "You've entered an invalid security code." + } +} diff --git a/dev/localize/ru-ios.json b/dev/localize/ru-ios.json new file mode 100644 index 000000000..41a925e5e --- /dev/null +++ b/dev/localize/ru-ios.json @@ -0,0 +1,34246 @@ +{ + "AUTH_REGION": { + "key": "AUTH_REGION", + "value": "Вход с нового устройства: %1$@; местоположение: %2$@" + }, + "AUTH_REGION_SEPARATED": { + "key": "AUTH_REGION_SEPARATED", + "value": "Вход в аккаунт|с незнакомого устройства %1$@, место: %2$@" + }, + "AUTH_UNKNOWN_SEPARATED": { + "key": "AUTH_UNKNOWN_SEPARATED", + "value": "Вход в аккаунт|с незнакомого устройства %1$@" + }, + "AccentColor.Title": { + "key": "AccentColor.Title", + "value": "Акцентный цвет" + }, + "AccessDenied.CallMicrophone": { + "key": "AccessDenied.CallMicrophone", + "value": "Чтобы Вы могли пользоваться звонками, Telegram требуется доступ к микрофону.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Микрофон." + }, + "AccessDenied.Camera": { + "key": "AccessDenied.Camera", + "value": "Чтобы Вы могли снимать фотографии и видео, Telegram нужен доступ к камере.\n\nПожалуйста, разрешите доступ для Telegram в настройках устройства > Конфиденциальность > Камера." + }, + "AccessDenied.CameraDisabled": { + "key": "AccessDenied.CameraDisabled", + "value": "На Вашем устройстве отключен доступ к камере.\n\nПожалуйста, разрешите его в настройках устройства > Основные > Ограничения > Камера." + }, + "AccessDenied.CameraRestricted": { + "key": "AccessDenied.CameraRestricted", + "value": "Нет доступа к камере.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Камера." + }, + "AccessDenied.Contacts": { + "key": "AccessDenied.Contacts", + "value": "Для переписки через Telegram используется Ваш список контактов.\n\nПожалуйста, разрешите доступ для Telegram в настройках устройства > Конфиденциальность > Контакты." + }, + "AccessDenied.LocationAlwaysDenied": { + "key": "AccessDenied.LocationAlwaysDenied", + "value": "Если Вы хотите транслировать свою геопозицию в чаты, у Telegram должен быть к ней доступ при работе в фоновом режиме.\n\nЗайдите в Настройки > Конфиденциальность > Службы геолокации и выберите для Telegram пункт «Всегда»" + }, + "AccessDenied.LocationDenied": { + "key": "AccessDenied.LocationDenied", + "value": "Для отправки Вашего местоположения Telegram нужен доступ к геолокации.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Службы геолокации." + }, + "AccessDenied.LocationDisabled": { + "key": "AccessDenied.LocationDisabled", + "value": "Для отправки вашего местоположения Telegram нужен доступ к геолокации.\n\nПожалуйста, включите его в настройках устройства > Конфиденциальность > Службы геолокации." + }, + "AccessDenied.LocationTracking": { + "key": "AccessDenied.LocationTracking", + "value": "Чтобы Вы могли отправлять свои координаты друзьям, Telegram нужен доступ к геолокации.\n\nПожалуйста, включите его в настройках устройства > Конфиденциальность > Службы геолокации." + }, + "AccessDenied.MicrophoneRestricted": { + "key": "AccessDenied.MicrophoneRestricted", + "value": "Нет доступа к микрофону.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Микрофон." + }, + "AccessDenied.PhotosAndVideos": { + "key": "AccessDenied.PhotosAndVideos", + "value": "Чтобы Вы могли отправлять фотографии и видео, Telegram нужен доступ к галерее.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Фотографии." + }, + "AccessDenied.PhotosRestricted": { + "key": "AccessDenied.PhotosRestricted", + "value": "Нет доступа к фотографиям.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Основные > Ограничения > Фотографии." + }, + "AccessDenied.SaveMedia": { + "key": "AccessDenied.SaveMedia", + "value": "Чтобы Вы могли сохранять фотографии и видео, Telegram нужен доступ к галерее.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Фотографии." + }, + "AccessDenied.Settings": { + "key": "AccessDenied.Settings", + "value": "Настройки" + }, + "AccessDenied.Title": { + "key": "AccessDenied.Title", + "value": "Разрешите доступ" + }, + "AccessDenied.VideoCallCamera": { + "key": "AccessDenied.VideoCallCamera", + "value": "Чтобы Вы могли совершать видеозвонки, Telegram нужен доступ к камере.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Камера." + }, + "AccessDenied.VideoMessageCamera": { + "key": "AccessDenied.VideoMessageCamera", + "value": "Чтобы Вы могли отправлять видеосообщения, Telegram нужен доступ к камере.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Камера." + }, + "AccessDenied.VideoMessageMicrophone": { + "key": "AccessDenied.VideoMessageMicrophone", + "value": "Чтобы Вы могли отправлять видеосообщения, Telegram нужен доступ к микрофону.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Камера." + }, + "AccessDenied.VideoMicrophone": { + "key": "AccessDenied.VideoMicrophone", + "value": "Чтобы Вы могли записывать видео со звуком, Telegram нужен доступ к микрофону.\n\nПожалуйста, разрешите доступ для Telegram в настройках устройства > Конфиденциальность > Микрофон." + }, + "AccessDenied.VoiceMicrophone": { + "key": "AccessDenied.VoiceMicrophone", + "value": "Чтобы Вы могли отправлять голосовые сообщения, Telegram нужен доступ к микрофону.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Микрофон." + }, + "AccessDenied.Wallpapers": { + "key": "AccessDenied.Wallpapers", + "value": "Приложению требуется доступ к галерее, чтобы установить обои.\n\nПожалуйста, включите доступ для Telegram в настройках устройства > Конфиденциальность > Фото." + }, + "Activity.PlayingGame": { + "key": "Activity.PlayingGame", + "value": "играет" + }, + "Activity.RecordingAudio": { + "key": "Activity.RecordingAudio", + "value": "записывает аудио" + }, + "Activity.RecordingVideoMessage": { + "key": "Activity.RecordingVideoMessage", + "value": "записывает видео" + }, + "Activity.UploadingDocument": { + "key": "Activity.UploadingDocument", + "value": "отправляет файл" + }, + "Activity.UploadingPhoto": { + "key": "Activity.UploadingPhoto", + "value": "отправляет фото" + }, + "Activity.UploadingVideo": { + "key": "Activity.UploadingVideo", + "value": "отправляет видео" + }, + "Activity.UploadingVideoMessage": { + "key": "Activity.UploadingVideoMessage", + "value": "отправляет видео" + }, + "AddContact.ContactWillBeSharedAfterMutual": { + "key": "AddContact.ContactWillBeSharedAfterMutual", + "value": "Номер телефона будет виден, когда %1$@ добавит Вас в контакты." + }, + "AddContact.SharedContactException": { + "key": "AddContact.SharedContactException", + "value": "Показать номер телефона" + }, + "AddContact.SharedContactExceptionInfo": { + "key": "AddContact.SharedContactExceptionInfo", + "value": "Вы можете разрешить %@ видеть Ваш номер телефона." + }, + "AddContact.StatusSuccess": { + "key": "AddContact.StatusSuccess", + "value": "%@ теперь в списке Ваших контактов." + }, + "Appearance.AccentColor": { + "key": "Appearance.AccentColor", + "value": "Акцентный цвет" + }, + "Appearance.Animations": { + "key": "Appearance.Animations", + "value": "АНИМАЦИИ" + }, + "Appearance.AppIcon": { + "key": "Appearance.AppIcon", + "value": "Иконка приложения" + }, + "Appearance.AppIconClassic": { + "key": "Appearance.AppIconClassic", + "value": "Классика" + }, + "Appearance.AppIconClassicX": { + "key": "Appearance.AppIconClassicX", + "value": "Классика X" + }, + "Appearance.AppIconDefault": { + "key": "Appearance.AppIconDefault", + "value": "Основная" + }, + "Appearance.AppIconDefaultX": { + "key": "Appearance.AppIconDefaultX", + "value": "Основная X" + }, + "Appearance.AppIconFilled": { + "key": "Appearance.AppIconFilled", + "value": "Заливка" + }, + "Appearance.AppIconFilledX": { + "key": "Appearance.AppIconFilledX", + "value": "Заливка X" + }, + "Appearance.AutoNightTheme": { + "key": "Appearance.AutoNightTheme", + "value": "Настроить ночную тему" + }, + "Appearance.AutoNightThemeDisabled": { + "key": "Appearance.AutoNightThemeDisabled", + "value": "Не использовать" + }, + "Appearance.BubbleCorners.AdjustAdjacent": { + "key": "Appearance.BubbleCorners.AdjustAdjacent", + "value": "Группировать блоки сообщений" + }, + "Appearance.BubbleCorners.Apply": { + "key": "Appearance.BubbleCorners.Apply", + "value": "Применить" + }, + "Appearance.BubbleCorners.Title": { + "key": "Appearance.BubbleCorners.Title", + "value": "Углы блоков с сообщениями" + }, + "Appearance.BubbleCornersSetting": { + "key": "Appearance.BubbleCornersSetting", + "value": "Углы блоков с сообщениями" + }, + "Appearance.ColorTheme": { + "key": "Appearance.ColorTheme", + "value": "ЦВЕТОВАЯ ТЕМА" + }, + "Appearance.ColorThemeNight": { + "key": "Appearance.ColorThemeNight", + "value": "ЦВЕТОВАЯ ТЕМА — НОЧНОЙ РЕЖИМ" + }, + "Appearance.CreateTheme": { + "key": "Appearance.CreateTheme", + "value": "Создать новую тему" + }, + "Appearance.CreateThemeInfo": { + "key": "Appearance.CreateThemeInfo", + "value": "Шаблон новой темы создан на основе текущей темы и добавлен в Ваш чат «Избранное»." + }, + "Appearance.EditTheme": { + "key": "Appearance.EditTheme", + "value": "Изменить тему" + }, + "Appearance.LargeEmoji": { + "key": "Appearance.LargeEmoji", + "value": "Крупные эмодзи" + }, + "Appearance.Other": { + "key": "Appearance.Other", + "value": "Другое" + }, + "Appearance.PickAccentColor": { + "key": "Appearance.PickAccentColor", + "value": "Выберите цвет" + }, + "Appearance.Preview": { + "key": "Appearance.Preview", + "value": "ПРЕДПРОСМОТР" + }, + "Appearance.PreviewIncomingText": { + "key": "Appearance.PreviewIncomingText", + "value": "Знаешь, который час?" + }, + "Appearance.PreviewOutgoingText": { + "key": "Appearance.PreviewOutgoingText", + "value": "В Токио утро 😎" + }, + "Appearance.PreviewReplyAuthor": { + "key": "Appearance.PreviewReplyAuthor", + "value": "Боб Харрис" + }, + "Appearance.PreviewReplyText": { + "key": "Appearance.PreviewReplyText", + "value": "Доброе утро! 👋" + }, + "Appearance.Publish": { + "key": "Appearance.Publish", + "value": "Опубликовать" + }, + "Appearance.ReduceMotion": { + "key": "Appearance.ReduceMotion", + "value": "Уменьшение движения" + }, + "Appearance.ReduceMotionInfo": { + "key": "Appearance.ReduceMotionInfo", + "value": "Отключить анимации в списке чатов и блоках сообщений" + }, + "Appearance.RemoveTheme": { + "key": "Appearance.RemoveTheme", + "value": "Удалить" + }, + "Appearance.RemoveThemeColor": { + "key": "Appearance.RemoveThemeColor", + "value": "Убрать" + }, + "Appearance.RemoveThemeColorConfirmation": { + "key": "Appearance.RemoveThemeColorConfirmation", + "value": "Убрать цвет" + }, + "Appearance.RemoveThemeConfirmation": { + "key": "Appearance.RemoveThemeConfirmation", + "value": "Удалить тему" + }, + "Appearance.ShareTheme": { + "key": "Appearance.ShareTheme", + "value": "Поделиться" + }, + "Appearance.ShareThemeColor": { + "key": "Appearance.ShareThemeColor", + "value": "Поделиться" + }, + "Appearance.TextSize": { + "key": "Appearance.TextSize", + "value": "РАЗМЕР ТЕКСТА" + }, + "Appearance.TextSize.Apply": { + "key": "Appearance.TextSize.Apply", + "value": "Применить" + }, + "Appearance.TextSize.Automatic": { + "key": "Appearance.TextSize.Automatic", + "value": "Системный" + }, + "Appearance.TextSize.Title": { + "key": "Appearance.TextSize.Title", + "value": "Размер текста" + }, + "Appearance.TextSize.UseSystem": { + "key": "Appearance.TextSize.UseSystem", + "value": "Системный размер текста" + }, + "Appearance.TextSizeSetting": { + "key": "Appearance.TextSizeSetting", + "value": "Размер текста" + }, + "Appearance.ThemeCarouselClassic": { + "key": "Appearance.ThemeCarouselClassic", + "value": "Классическая" + }, + "Appearance.ThemeCarouselDay": { + "key": "Appearance.ThemeCarouselDay", + "value": "Дневная" + }, + "Appearance.ThemeCarouselNewNight": { + "key": "Appearance.ThemeCarouselNewNight", + "value": "Ночная" + }, + "Appearance.ThemeCarouselNight": { + "key": "Appearance.ThemeCarouselNight", + "value": "Монохромная" + }, + "Appearance.ThemeCarouselNightBlue": { + "key": "Appearance.ThemeCarouselNightBlue", + "value": "Тёмно-синяя" + }, + "Appearance.ThemeCarouselTintedNight": { + "key": "Appearance.ThemeCarouselTintedNight", + "value": "Цветная ночная" + }, + "Appearance.ThemeDay": { + "key": "Appearance.ThemeDay", + "value": "Дневная" + }, + "Appearance.ThemeDayClassic": { + "key": "Appearance.ThemeDayClassic", + "value": "Классическая" + }, + "Appearance.ThemeNight": { + "key": "Appearance.ThemeNight", + "value": "Монохромная" + }, + "Appearance.ThemeNightBlue": { + "key": "Appearance.ThemeNightBlue", + "value": "Темно-синяя" + }, + "Appearance.ThemePreview.Chat.1.Text": { + "key": "Appearance.ThemePreview.Chat.1.Text", + "value": "Он хочет, чтобы я повернулся направо? Или налево? 🤔" + }, + "Appearance.ThemePreview.Chat.2.ReplyName": { + "key": "Appearance.ThemePreview.Chat.2.ReplyName", + "value": "Боб Харрис" + }, + "Appearance.ThemePreview.Chat.2.Text": { + "key": "Appearance.ThemePreview.Chat.2.Text", + "value": "Голову направо и выразительно." + }, + "Appearance.ThemePreview.Chat.3.Text": { + "key": "Appearance.ThemePreview.Chat.3.Text", + "value": "И это всё? Мне кажется, он сказал намного больше. 😯" + }, + "Appearance.ThemePreview.Chat.3.TextWithLink": { + "key": "Appearance.ThemePreview.Chat.3.TextWithLink", + "value": "И это всё? Мне кажется, он сказал [намного] больше. 😯" + }, + "Appearance.ThemePreview.Chat.4.Text": { + "key": "Appearance.ThemePreview.Chat.4.Text", + "value": "Чтобы расслабиться, пейте Сантори. 😎" + }, + "Appearance.ThemePreview.Chat.5.Text": { + "key": "Appearance.ThemePreview.Chat.5.Text", + "value": "Он хочет, чтобы вы смотрели в камеру. Хорошо?" + }, + "Appearance.ThemePreview.Chat.6.Text": { + "key": "Appearance.ThemePreview.Chat.6.Text", + "value": "И это всё?" + }, + "Appearance.ThemePreview.Chat.7.Text": { + "key": "Appearance.ThemePreview.Chat.7.Text", + "value": "Да, повернитесь к камере." + }, + "Appearance.ThemePreview.ChatList.1.Name": { + "key": "Appearance.ThemePreview.ChatList.1.Name", + "value": "Алиса" + }, + "Appearance.ThemePreview.ChatList.1.Text": { + "key": "Appearance.ThemePreview.ChatList.1.Text", + "value": "Привет от Боба. 😊 ❤️ 😱" + }, + "Appearance.ThemePreview.ChatList.2.Name": { + "key": "Appearance.ThemePreview.ChatList.2.Name", + "value": "Роберт" + }, + "Appearance.ThemePreview.ChatList.2.Text": { + "key": "Appearance.ThemePreview.ChatList.2.Text", + "value": "Передавай привет Алисе 👋" + }, + "Appearance.ThemePreview.ChatList.3.AuthorName": { + "key": "Appearance.ThemePreview.ChatList.3.AuthorName", + "value": "Ева" + }, + "Appearance.ThemePreview.ChatList.3.Name": { + "key": "Appearance.ThemePreview.ChatList.3.Name", + "value": "Университетский чат" + }, + "Appearance.ThemePreview.ChatList.3.Text": { + "key": "Appearance.ThemePreview.ChatList.3.Text", + "value": "Ого, у нас уже 2500 участников." + }, + "Appearance.ThemePreview.ChatList.4.Name": { + "key": "Appearance.ThemePreview.ChatList.4.Name", + "value": "Вероника" + }, + "Appearance.ThemePreview.ChatList.4.Text": { + "key": "Appearance.ThemePreview.ChatList.4.Text", + "value": "Столик на четверых, в два часа. Не опаздывать." + }, + "Appearance.ThemePreview.ChatList.5.Name": { + "key": "Appearance.ThemePreview.ChatList.5.Name", + "value": "Гифки с животными" + }, + "Appearance.ThemePreview.ChatList.5.Text": { + "key": "Appearance.ThemePreview.ChatList.5.Text", + "value": "Публиковать больше котов? Голосуем!" + }, + "Appearance.ThemePreview.ChatList.6.Name": { + "key": "Appearance.ThemePreview.ChatList.6.Name", + "value": "Сестра" + }, + "Appearance.ThemePreview.ChatList.6.Text": { + "key": "Appearance.ThemePreview.ChatList.6.Text", + "value": "Это пока секрет, но я получила ту работу! Поеду в Рим!" + }, + "Appearance.ThemePreview.ChatList.7.Name": { + "key": "Appearance.ThemePreview.ChatList.7.Name", + "value": "Ева" + }, + "Appearance.ThemePreview.ChatList.7.Text": { + "key": "Appearance.ThemePreview.ChatList.7.Text", + "value": "🖼 Как тебе?" + }, + "Appearance.Title": { + "key": "Appearance.Title", + "value": "Оформление" + }, + "AppleWatch.ReplyPresets": { + "key": "AppleWatch.ReplyPresets", + "value": "ШАБЛОНЫ ОТВЕТОВ" + }, + "AppleWatch.ReplyPresetsHelp": { + "key": "AppleWatch.ReplyPresetsHelp", + "value": "Вы можете выбрать для сообщений с часов готовый шаблон или создать свой." + }, + "AppleWatch.Title": { + "key": "AppleWatch.Title", + "value": "Apple Watch" + }, + "Application.Name": { + "key": "Application.Name", + "value": "Telegram" + }, + "Application.Update": { + "key": "Application.Update", + "value": "Обновить" + }, + "ApplyLanguage.ApplyLanguageAction": { + "key": "ApplyLanguage.ApplyLanguageAction", + "value": "Изменить" + }, + "ApplyLanguage.ApplySuccess": { + "key": "ApplyLanguage.ApplySuccess", + "value": "Язык изменён" + }, + "ApplyLanguage.ChangeLanguageAction": { + "key": "ApplyLanguage.ChangeLanguageAction", + "value": "Изменить" + }, + "ApplyLanguage.ChangeLanguageAlreadyActive": { + "key": "ApplyLanguage.ChangeLanguageAlreadyActive", + "value": "Этот язык (%1$@) уже используется." + }, + "ApplyLanguage.ChangeLanguageOfficialText": { + "key": "ApplyLanguage.ChangeLanguageOfficialText", + "value": "Вы действительно хотите использовать этот перевод (**%1$@**)?\n\nЭто изменит язык всего интерфейса. Предложить свою версию перевода можно через [платформу переводов]().\n\nВы можете в любой момент изменить язык в настройках приложения." + }, + "ApplyLanguage.ChangeLanguageTitle": { + "key": "ApplyLanguage.ChangeLanguageTitle", + "value": "Изменить язык?" + }, + "ApplyLanguage.ChangeLanguageUnofficialText": { + "key": "ApplyLanguage.ChangeLanguageUnofficialText", + "value": "Сторонний перевод (**%1$@**), который Вы собираетесь использовать, закончен на %2$@%.\n\nЭто изменит язык всего интерфейса. Предложить свою версию перевода можно через [платформу переводов]().\n\nВы можете в любой момент изменить язык в настройках приложения." + }, + "ApplyLanguage.LanguageNotSupportedError": { + "key": "ApplyLanguage.LanguageNotSupportedError", + "value": "Похоже, выбранного языка не существует." + }, + "ApplyLanguage.UnsufficientDataText": { + "key": "ApplyLanguage.UnsufficientDataText", + "value": "К сожалению, в этом неофициальном переводе (%1$@) нет текстов приложения Telegram для iOS. Вы можете использовать [платформу переводов](), чтобы помочь с переводом приложения." + }, + "ApplyLanguage.UnsufficientDataTitle": { + "key": "ApplyLanguage.UnsufficientDataTitle", + "value": "Недостаточно данных" + }, + "Appstore.Cloud": { + "key": "Appstore.Cloud", + "value": "**Облачное хранилище**\nНет ограничений на размер\nчатов, мультимедиа и файлов." + }, + "Appstore.Cloud.Profile": { + "key": "Appstore.Cloud.Profile", + "value": "**София**\n23 года, дизайнер из Санкт-Петербурга." + }, + "Appstore.Creative": { + "key": "Appstore.Creative", + "value": "**Самовыражение**\nЦветовые темы, стикеры, GIF,\nвидеосообщения и многое другое." + }, + "Appstore.Creative.Chat": { + "key": "Appstore.Creative.Chat", + "value": "**Вы**\nОтправь эмодзи кубика, чтобы сделать бросок\n**Вы**\nПередвинься ещё на два квартала. Бонус: возьми кофе.\n**Алина**\nЯ на финише!\n**Вы**\nОтлично\nСкоро буду." + }, + "Appstore.Creative.Chat.Name": { + "key": "Appstore.Creative.Chat.Name", + "value": "**Алина**" + }, + "Appstore.Fast": { + "key": "Appstore.Fast", + "value": "**Скорость**\nПереписка синхронизируется\nна всех Ваших устройствах." + }, + "Appstore.Fast.Chat1": { + "key": "Appstore.Fast.Chat1", + "value": "**Алиса**\nМакс передаёт привет!" + }, + "Appstore.Fast.Chat2": { + "key": "Appstore.Fast.Chat2", + "value": "**Максим**\nПередавай привет Алисе." + }, + "Appstore.Fast.Chat3": { + "key": "Appstore.Fast.Chat3", + "value": "**Цифровые кочевники**\nДиана\nОго, в нашем чате уже 2500 участников!" + }, + "Appstore.Fast.Chat4": { + "key": "Appstore.Fast.Chat4", + "value": "**Вероника**\nСтолик на четверых, в 2 часа. До встречи." + }, + "Appstore.Fast.Chat5": { + "key": "Appstore.Fast.Chat5", + "value": "**Видео с животными**\nПубликовать больше котиков? Ваш голос важен!" + }, + "Appstore.Fast.Chat6": { + "key": "Appstore.Fast.Chat6", + "value": "**Сестрёнка**\nПока что не говори маме, но я получила работу! Я еду в Рим!" + }, + "Appstore.Fast.Chat7": { + "key": "Appstore.Fast.Chat7", + "value": "**Виктор**\nКак тебе?" + }, + "Appstore.Fast.Chat8": { + "key": "Appstore.Fast.Chat8", + "value": "**Универ**\nЭмма\nСтикер" + }, + "Appstore.Fast.Chat9": { + "key": "Appstore.Fast.Chat9", + "value": "**Цифровые кочевники**" + }, + "Appstore.Free.Chat": { + "key": "Appstore.Free.Chat", + "value": "**Анна**\nБумажный самолет поднимают...\nКрылья\nПропеллер\n**Вы**\nЭто из завтрашнего экзамена?\n**Марк**\nОнлайнВечеринка.ppd\nВернемся к обсуждению планов!\n**Вы**\nСерьёзно, 550 Мб?\n**Ева**\nТам видео с фейерверками" + }, + "Appstore.Free.Chat.Name": { + "key": "Appstore.Free.Chat.Name", + "value": "**Универ**" + }, + "Appstore.Open": { + "key": "Appstore.Open", + "value": "**Открытость**\nБесплатно для всех.\nОткрытый исходный код." + }, + "Appstore.Powerful": { + "key": "Appstore.Powerful", + "value": "**Мощность**\nТрансляция сообщений\nна неограниченную аудиторию." + }, + "Appstore.Powerful.Chat": { + "key": "Appstore.Powerful.Chat", + "value": "**Виктор**\nДоброе утро!\n\nАлекс вступил(а) в группу\n\n**Я**\nЗнаешь, который час?\n**Оксана**\nЕщё утро?\nАнонимный опрос\nКонечно!\nСомневаюсь\n**Эмма**\nГолосовое сообщение" + }, + "Appstore.Private": { + "key": "Appstore.Private", + "value": "**Надёжность**\nВаши данные защищены\nи никогда не разглашаются." + }, + "Appstore.Private.Chat": { + "key": "Appstore.Private.Chat", + "value": "**Вы**\nКартинки с котами любого размера." + }, + "Appstore.Private.Chat.Name": { + "key": "Appstore.Private.Chat.Name", + "value": "**Маргарита**" + }, + "Appstore.Public": { + "key": "Appstore.Public", + "value": "**Социальность**\nПубличные каналы, группы,\nботы для самых разных задач." + }, + "Appstore.Public.Chat1": { + "key": "Appstore.Public.Chat1", + "value": "**Новости бизнеса**\nИстина как солнце. От неё можно закрыться на время, но она никуда не исчезнет." + }, + "Appstore.Public.Chat2": { + "key": "Appstore.Public.Chat2", + "value": "**BBC*\nМы будем дважды в день публиковать подборку важных новостей и самых интересных материалов..." + }, + "Appstore.Public.Chat3": { + "key": "Appstore.Public.Chat3", + "value": "**Здоровье и безопасность**\nАктуальная информация о COVID-19 и другие новости о здравоохранении" + }, + "Appstore.Public.IV": { + "key": "Appstore.Public.IV", + "value": "Накопленных данных достаточно, чтобы оценить эффективность мер против глобального потепления. Этот симулятор позволяет увидеть, какие решения работают лучше.\n\nBloomberg\n\nКак замедлить глобальное потепление? Выяснить это поможет новый симулятор.\nВ 2016 году в День Земли более 170 стран подписали Парижское соглашение, цель которого — удержать глобальное потепление «значительно ниже 2°C»." + }, + "Appstore.Secure": { + "key": "Appstore.Secure", + "value": "**Шифрование**\nКонфиденциальность\nи удаление данных по таймеру." + }, + "Appstore.Secure.Chat": { + "key": "Appstore.Secure.Chat", + "value": "**Сестрёнка**\nЕсть идеи подарка для мамы?\n**Вы** Может, приготовим что-нибудь?\n**Вы** Хм, есть другая идея. Давай подарим ей щенка.\n**Вы**\nЯ всё вижу!\n**Сестрёнка**\nМне понадобятся доказательства, что это была твоя идея!" + }, + "Appstore.Secure.Chat.Name": { + "key": "Appstore.Secure.Chat.Name", + "value": "**Сестрёнка**" + }, + "ArchivedChats.IntroText1": { + "key": "ArchivedChats.IntroText1", + "value": "Чаты со включенными уведомлениями покидают архив, когда приходят новые сообщения." + }, + "ArchivedChats.IntroText2": { + "key": "ArchivedChats.IntroText2", + "value": "Чаты с выключенными уведомлениями остаются в архиве, когда приходят новые сообщения." + }, + "ArchivedChats.IntroText3": { + "key": "ArchivedChats.IntroText3", + "value": "Вы можете закрепить неограниченное количество чатов наверху архива." + }, + "ArchivedChats.IntroTitle1": { + "key": "ArchivedChats.IntroTitle1", + "value": "Это Ваш архив" + }, + "ArchivedChats.IntroTitle2": { + "key": "ArchivedChats.IntroTitle2", + "value": "Чаты без уведомлений" + }, + "ArchivedChats.IntroTitle3": { + "key": "ArchivedChats.IntroTitle3", + "value": "Закрепленные чаты" + }, + "ArchivedPacksAlert.Title": { + "key": "ArchivedPacksAlert.Title", + "value": "Некоторые из старых наборов стикеров были архивированы. Вы можете снова активировать их в настройках стикеров." + }, + "AttachmentMenu.File": { + "key": "AttachmentMenu.File", + "value": "Файл" + }, + "AttachmentMenu.PhotoOrVideo": { + "key": "AttachmentMenu.PhotoOrVideo", + "value": "Фото или видео" + }, + "AttachmentMenu.Poll": { + "key": "AttachmentMenu.Poll", + "value": "Опрос" + }, + "AttachmentMenu.SendAsFile": { + "key": "AttachmentMenu.SendAsFile", + "value": "Отправить как файл" + }, + "AttachmentMenu.SendAsFiles": { + "key": "AttachmentMenu.SendAsFiles", + "value": "Отправить как файлы" + }, + "AttachmentMenu.SendGif": { + "key": "AttachmentMenu.SendGif", + "zeroValue": null, + "oneValue": "Отправить %@ GIF", + "twoValue": null, + "fewValue": "Отправить %@ GIF", + "manyValue": "Отправить %@ GIF", + "otherValue": "Отправить %@ GIF" + }, + "AttachmentMenu.SendItem": { + "key": "AttachmentMenu.SendItem", + "zeroValue": null, + "oneValue": "Отправить %@ сообщение", + "twoValue": null, + "fewValue": "Отправить %@ сообщения", + "manyValue": "Отправить %@ сообщений", + "otherValue": "Отправить %@ сообщений" + }, + "AttachmentMenu.SendPhoto": { + "key": "AttachmentMenu.SendPhoto", + "zeroValue": null, + "oneValue": "Отправить %@ фото", + "twoValue": null, + "fewValue": "Отправить %@ фото", + "manyValue": "Отправить %@ фото", + "otherValue": "Отправить %@ фото" + }, + "AttachmentMenu.SendVideo": { + "key": "AttachmentMenu.SendVideo", + "zeroValue": null, + "oneValue": "Отправить %@ видео", + "twoValue": null, + "fewValue": "Отправить %@ видео", + "manyValue": "Отправить %@ фото", + "otherValue": "Отправить %@ видео" + }, + "AttachmentMenu.WebSearch": { + "key": "AttachmentMenu.WebSearch", + "value": "Поиск в сети" + }, + "AuthCode.Alert": { + "key": "AuthCode.Alert", + "value": "Ваш код для входа: %@. Укажите его в приложении Telegram, в котором хотите зайти в свой аккаунт.\n\nНикому не передавайте этот код." + }, + "AuthSessions.AddDevice": { + "key": "AuthSessions.AddDevice", + "value": "Сканировать QR-код" + }, + "AuthSessions.AddDevice.InvalidQRCode": { + "key": "AuthSessions.AddDevice.InvalidQRCode", + "value": "Неверный QR-код" + }, + "AuthSessions.AddDevice.ScanInfo": { + "key": "AuthSessions.AddDevice.ScanInfo", + "value": "Для входа с нового устройства\nсканируйте QR-код." + }, + "AuthSessions.AddDevice.ScanTitle": { + "key": "AuthSessions.AddDevice.ScanTitle", + "value": "Сканировать QR-код" + }, + "AuthSessions.AddDevice.UrlLoginHint": { + "key": "AuthSessions.AddDevice.UrlLoginHint", + "value": "Этот код можно использовать для входа в Ваш аккаунт в Telegram.\n\nДля подтверждения входа перейдите в Настройки > Устройства > Сканировать QR и отсканируйте этот код." + }, + "AuthSessions.AddDeviceIntro.Action": { + "key": "AuthSessions.AddDeviceIntro.Action", + "value": "Сканировать QR-код" + }, + "AuthSessions.AddDeviceIntro.Text1": { + "key": "AuthSessions.AddDeviceIntro.Text1", + "value": "Установите Telegram для компьютера по ссылке [desktop.telegram.org]()" + }, + "AuthSessions.AddDeviceIntro.Text2": { + "key": "AuthSessions.AddDeviceIntro.Text2", + "value": "Запустите Telegram на компьютере, чтобы получить QR-код" + }, + "AuthSessions.AddDeviceIntro.Text3": { + "key": "AuthSessions.AddDeviceIntro.Text3", + "value": "Сканируйте этот QR-код для входа в аккаунт" + }, + "AuthSessions.AddDeviceIntro.Title": { + "key": "AuthSessions.AddDeviceIntro.Title", + "value": "Вход по QR-коду" + }, + "AuthSessions.AddedDeviceTerminate": { + "key": "AuthSessions.AddedDeviceTerminate", + "value": "Завершить" + }, + "AuthSessions.AddedDeviceTitle": { + "key": "AuthSessions.AddedDeviceTitle", + "value": "Успешный вход" + }, + "AuthSessions.AppUnofficial": { + "key": "AuthSessions.AppUnofficial", + "value": "(ID: %@)" + }, + "AuthSessions.CurrentSession": { + "key": "AuthSessions.CurrentSession", + "value": "ТЕКУЩИЙ СЕАНС" + }, + "AuthSessions.DevicesTitle": { + "key": "AuthSessions.DevicesTitle", + "value": "Устройства" + }, + "AuthSessions.EmptyText": { + "key": "AuthSessions.EmptyText", + "value": "Вы можете войти в Telegram с другого смартфона, планшета или компьютера, используя тот же номер телефона. Все Ваши данные будут мгновенно синхронизированы." + }, + "AuthSessions.EmptyTitle": { + "key": "AuthSessions.EmptyTitle", + "value": "Нет других сеансов" + }, + "AuthSessions.IncompleteAttempts": { + "key": "AuthSessions.IncompleteAttempts", + "value": "НЕЗАВЕРШЕННЫЕ ПОПЫТКИ ВХОДА" + }, + "AuthSessions.IncompleteAttemptsInfo": { + "key": "AuthSessions.IncompleteAttemptsInfo", + "value": "С этих устройств нет доступа к Вашему аккаунту. Код для входа был введён верно, но правильный пароль указан не был." + }, + "AuthSessions.LogOut": { + "key": "AuthSessions.LogOut", + "value": "Выйти" + }, + "AuthSessions.LogOutApplications": { + "key": "AuthSessions.LogOutApplications", + "value": "Отключить все сайты" + }, + "AuthSessions.LogOutApplicationsHelp": { + "key": "AuthSessions.LogOutApplicationsHelp", + "value": "Вы можете использовать свой аккаунт для авторизации на сайтах, которые поддерживают вход через Telegram." + }, + "AuthSessions.LoggedIn": { + "key": "AuthSessions.LoggedIn", + "value": "Сайты" + }, + "AuthSessions.LoggedInWithTelegram": { + "key": "AuthSessions.LoggedInWithTelegram", + "value": "АВТОРИЗОВАННЫЕ САЙТЫ" + }, + "AuthSessions.Message": { + "key": "AuthSessions.Message", + "value": "Вы разрешили этому боту писать Вам, когда авторизовались на %@." + }, + "AuthSessions.OtherDevices": { + "key": "AuthSessions.OtherDevices", + "value": "Официальные приложения Telegram доступны для iPhone, iPad, Android, macOS, Windows и Linux. [Подробнее]()" + }, + "AuthSessions.OtherSessions": { + "key": "AuthSessions.OtherSessions", + "value": "АКТИВНЫЕ СЕАНСЫ" + }, + "AuthSessions.Sessions": { + "key": "AuthSessions.Sessions", + "value": "Сеансы" + }, + "AuthSessions.Terminate": { + "key": "AuthSessions.Terminate", + "value": "Завершить" + }, + "AuthSessions.TerminateOtherSessions": { + "key": "AuthSessions.TerminateOtherSessions", + "value": "Завершить другие сеансы" + }, + "AuthSessions.TerminateOtherSessionsHelp": { + "key": "AuthSessions.TerminateOtherSessionsHelp", + "value": "Выйти на всех устройствах, кроме текущего." + }, + "AuthSessions.TerminateSession": { + "key": "AuthSessions.TerminateSession", + "value": "Завершить сеанс" + }, + "AuthSessions.Title": { + "key": "AuthSessions.Title", + "value": "Активные сеансы" + }, + "AutoDownloadSettings.AutoDownload": { + "key": "AutoDownloadSettings.AutoDownload", + "value": "Загружать автоматически" + }, + "AutoDownloadSettings.AutodownloadFiles": { + "key": "AutoDownloadSettings.AutodownloadFiles", + "value": "АВТОЗАГРУЗКА ФАЙЛОВ И МУЗЫКИ" + }, + "AutoDownloadSettings.AutodownloadPhotos": { + "key": "AutoDownloadSettings.AutodownloadPhotos", + "value": "АВТОЗАГРУЗКА ФОТОГРАФИЙ" + }, + "AutoDownloadSettings.AutodownloadVideos": { + "key": "AutoDownloadSettings.AutodownloadVideos", + "value": "АВТОЗАГРУЗКА ВИДЕО И GIF" + }, + "AutoDownloadSettings.Cellular": { + "key": "AutoDownloadSettings.Cellular", + "value": "Мобильная сеть" + }, + "AutoDownloadSettings.CellularTitle": { + "key": "AutoDownloadSettings.CellularTitle", + "value": "Через моб. сеть" + }, + "AutoDownloadSettings.Channels": { + "key": "AutoDownloadSettings.Channels", + "value": "Каналы" + }, + "AutoDownloadSettings.Contacts": { + "key": "AutoDownloadSettings.Contacts", + "value": "Контакты" + }, + "AutoDownloadSettings.DataUsage": { + "key": "AutoDownloadSettings.DataUsage", + "value": "РАСХОД ТРАФИКА" + }, + "AutoDownloadSettings.DataUsageCustom": { + "key": "AutoDownloadSettings.DataUsageCustom", + "value": "Другой" + }, + "AutoDownloadSettings.DataUsageHigh": { + "key": "AutoDownloadSettings.DataUsageHigh", + "value": "Высокий" + }, + "AutoDownloadSettings.DataUsageLow": { + "key": "AutoDownloadSettings.DataUsageLow", + "value": "Низкий" + }, + "AutoDownloadSettings.DataUsageMedium": { + "key": "AutoDownloadSettings.DataUsageMedium", + "value": "Средний" + }, + "AutoDownloadSettings.Delimeter": { + "key": "AutoDownloadSettings.Delimeter", + "value": ", " + }, + "AutoDownloadSettings.DocumentsTitle": { + "key": "AutoDownloadSettings.DocumentsTitle", + "value": "Файлы" + }, + "AutoDownloadSettings.Files": { + "key": "AutoDownloadSettings.Files", + "value": "Файлы" + }, + "AutoDownloadSettings.GroupChats": { + "key": "AutoDownloadSettings.GroupChats", + "value": "Группы" + }, + "AutoDownloadSettings.LastDelimeter": { + "key": "AutoDownloadSettings.LastDelimeter", + "value": " и " + }, + "AutoDownloadSettings.LimitBySize": { + "key": "AutoDownloadSettings.LimitBySize", + "value": "ПО РАЗМЕРУ" + }, + "AutoDownloadSettings.MaxFileSize": { + "key": "AutoDownloadSettings.MaxFileSize", + "value": "МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛА" + }, + "AutoDownloadSettings.MaxVideoSize": { + "key": "AutoDownloadSettings.MaxVideoSize", + "value": "МАКСИМАЛЬНЫЙ РАЗМЕР ВИДЕО" + }, + "AutoDownloadSettings.MediaTypes": { + "key": "AutoDownloadSettings.MediaTypes", + "value": "ЗАГРУЖАТЬ МУЛЬТИМЕДИА" + }, + "AutoDownloadSettings.OffForAll": { + "key": "AutoDownloadSettings.OffForAll", + "value": "Отключено для всех чатов" + }, + "AutoDownloadSettings.OnFor": { + "key": "AutoDownloadSettings.OnFor", + "value": "%@" + }, + "AutoDownloadSettings.OnForAll": { + "key": "AutoDownloadSettings.OnForAll", + "value": "Включено для всех чатов" + }, + "AutoDownloadSettings.Photos": { + "key": "AutoDownloadSettings.Photos", + "value": "Фотографии" + }, + "AutoDownloadSettings.PhotosTitle": { + "key": "AutoDownloadSettings.PhotosTitle", + "value": "Фотографии" + }, + "AutoDownloadSettings.PreloadVideo": { + "key": "AutoDownloadSettings.PreloadVideo", + "value": "Предзагрузка длинных видео" + }, + "AutoDownloadSettings.PreloadVideoInfo": { + "key": "AutoDownloadSettings.PreloadVideoInfo", + "value": "Подгружать первые секунды для видеозаписей больше %@, чтобы воспроизводить их без задержки." + }, + "AutoDownloadSettings.PrivateChats": { + "key": "AutoDownloadSettings.PrivateChats", + "value": "Другие личные чаты" + }, + "AutoDownloadSettings.Reset": { + "key": "AutoDownloadSettings.Reset", + "value": "Сбросить" + }, + "AutoDownloadSettings.ResetHelp": { + "key": "AutoDownloadSettings.ResetHelp", + "value": "Сбросить особые настройки автозагрузки." + }, + "AutoDownloadSettings.ResetSettings": { + "key": "AutoDownloadSettings.ResetSettings", + "value": "Сбросить настройки автозагрузки" + }, + "AutoDownloadSettings.Title": { + "key": "AutoDownloadSettings.Title", + "value": "Автозагрузка" + }, + "AutoDownloadSettings.TypeChannels": { + "key": "AutoDownloadSettings.TypeChannels", + "value": "каналы" + }, + "AutoDownloadSettings.TypeContacts": { + "key": "AutoDownloadSettings.TypeContacts", + "value": "контакты" + }, + "AutoDownloadSettings.TypeGroupChats": { + "key": "AutoDownloadSettings.TypeGroupChats", + "value": "группы" + }, + "AutoDownloadSettings.TypePrivateChats": { + "key": "AutoDownloadSettings.TypePrivateChats", + "value": "личные чаты" + }, + "AutoDownloadSettings.Unlimited": { + "key": "AutoDownloadSettings.Unlimited", + "value": "без ограничений" + }, + "AutoDownloadSettings.UpTo": { + "key": "AutoDownloadSettings.UpTo", + "value": "до %@" + }, + "AutoDownloadSettings.UpToFor": { + "key": "AutoDownloadSettings.UpToFor", + "value": "До %@: %@" + }, + "AutoDownloadSettings.UpToForAll": { + "key": "AutoDownloadSettings.UpToForAll", + "value": "До %@ для всех чатов" + }, + "AutoDownloadSettings.VideoMessagesTitle": { + "key": "AutoDownloadSettings.VideoMessagesTitle", + "value": "Видеосообщения" + }, + "AutoDownloadSettings.Videos": { + "key": "AutoDownloadSettings.Videos", + "value": "Видео" + }, + "AutoDownloadSettings.VideosTitle": { + "key": "AutoDownloadSettings.VideosTitle", + "value": "Видео" + }, + "AutoDownloadSettings.VoiceMessagesInfo": { + "key": "AutoDownloadSettings.VoiceMessagesInfo", + "value": "Голосовые сообщения имеют небольшой размер и всегда загружаются автоматически." + }, + "AutoDownloadSettings.VoiceMessagesTitle": { + "key": "AutoDownloadSettings.VoiceMessagesTitle", + "value": "Голосовые сообщения" + }, + "AutoDownloadSettings.WiFi": { + "key": "AutoDownloadSettings.WiFi", + "value": "WI-FI" + }, + "AutoDownloadSettings.WifiTitle": { + "key": "AutoDownloadSettings.WifiTitle", + "value": "Через Wi-Fi" + }, + "AutoNightTheme.Automatic": { + "key": "AutoNightTheme.Automatic", + "value": "Автоматически" + }, + "AutoNightTheme.AutomaticHelp": { + "key": "AutoNightTheme.AutomaticHelp", + "value": "Переключать на выбранную ночную тему, если яркость внешнего освещения меньше %@. Для этого в настройках Вашего телефона должна быть включена автояркость." + }, + "AutoNightTheme.AutomaticSection": { + "key": "AutoNightTheme.AutomaticSection", + "value": "ПОРОГ ЯРКОСТИ" + }, + "AutoNightTheme.Disabled": { + "key": "AutoNightTheme.Disabled", + "value": "Не использовать" + }, + "AutoNightTheme.LocationHelp": { + "key": "AutoNightTheme.LocationHelp", + "value": "Чтобы определить время захода и восхода солнца, необходимо разово получить данные о Вашем примерном местоположении. Эта информация будет храниться только на данном устройстве.\n\nЗакат: %@\nРассвет: %@" + }, + "AutoNightTheme.NotAvailable": { + "key": "AutoNightTheme.NotAvailable", + "value": "Нет" + }, + "AutoNightTheme.PreferredTheme": { + "key": "AutoNightTheme.PreferredTheme", + "value": "ВЫБРАННАЯ НОЧНАЯ ТЕМА" + }, + "AutoNightTheme.ScheduleSection": { + "key": "AutoNightTheme.ScheduleSection", + "value": "ВРЕМЯ ИСПОЛЬЗОВАНИЯ" + }, + "AutoNightTheme.Scheduled": { + "key": "AutoNightTheme.Scheduled", + "value": "По расписанию" + }, + "AutoNightTheme.ScheduledFrom": { + "key": "AutoNightTheme.ScheduledFrom", + "value": "Начало" + }, + "AutoNightTheme.ScheduledTo": { + "key": "AutoNightTheme.ScheduledTo", + "value": "Конец" + }, + "AutoNightTheme.System": { + "key": "AutoNightTheme.System", + "value": "Системная" + }, + "AutoNightTheme.Title": { + "key": "AutoNightTheme.Title", + "value": "Смена темы ночью" + }, + "AutoNightTheme.UpdateLocation": { + "key": "AutoNightTheme.UpdateLocation", + "value": "Обновить геопозицию" + }, + "AutoNightTheme.UseSunsetSunrise": { + "key": "AutoNightTheme.UseSunsetSunrise", + "value": "От заката до восхода солнца" + }, + "AutoremoveSetup.TimeSectionHeader": { + "key": "AutoremoveSetup.TimeSectionHeader", + "value": "АВТОУДАЛЕНИЕ СООБЩЕНИЙ" + }, + "AutoremoveSetup.TimerInfoChannel": { + "key": "AutoremoveSetup.TimerInfoChannel", + "value": "Сообщения, отправленные в этот канал, будут удалены через выбранное Вами время." + }, + "AutoremoveSetup.TimerInfoChat": { + "key": "AutoremoveSetup.TimerInfoChat", + "value": "Сообщения, отправленные в этот чат, будут удалены через выбранное Вами время." + }, + "AutoremoveSetup.TimerValueAfter": { + "key": "AutoremoveSetup.TimerValueAfter", + "value": "%@" + }, + "AutoremoveSetup.TimerValueNever": { + "key": "AutoremoveSetup.TimerValueNever", + "value": "Никогда" + }, + "AutoremoveSetup.Title": { + "key": "AutoremoveSetup.Title", + "value": "Автоудаление" + }, + "BlockedUsers.AddNew": { + "key": "BlockedUsers.AddNew", + "value": "Добавить…" + }, + "BlockedUsers.BlockTitle": { + "key": "BlockedUsers.BlockTitle", + "value": "Заблокировать" + }, + "BlockedUsers.BlockUser": { + "key": "BlockedUsers.BlockUser", + "value": "Заблокировать пользователя..." + }, + "BlockedUsers.Info": { + "key": "BlockedUsers.Info", + "value": "Заблокированные пользователи не могут писать Вам и приглашать Вас в группы. Они также не видят Ваше фото и время последней активности." + }, + "BlockedUsers.LeavePrefix": { + "key": "BlockedUsers.LeavePrefix", + "value": "Покинуть" + }, + "BlockedUsers.SelectUserTitle": { + "key": "BlockedUsers.SelectUserTitle", + "value": "Заблокировать" + }, + "BlockedUsers.Title": { + "key": "BlockedUsers.Title", + "value": "Чёрный список" + }, + "BlockedUsers.Unblock": { + "key": "BlockedUsers.Unblock", + "value": "Разблок." + }, + "Bot.DescriptionTitle": { + "key": "Bot.DescriptionTitle", + "value": "Что умеет этот бот?" + }, + "Bot.GenericBotStatus": { + "key": "Bot.GenericBotStatus", + "value": "бот" + }, + "Bot.GenericSupportStatus": { + "key": "Bot.GenericSupportStatus", + "value": "поддержка" + }, + "Bot.GroupStatusDoesNotReadHistory": { + "key": "Bot.GroupStatusDoesNotReadHistory", + "value": "не имеет доступа к сообщениям" + }, + "Bot.GroupStatusReadsHistory": { + "key": "Bot.GroupStatusReadsHistory", + "value": "имеет доступ к сообщениям" + }, + "Bot.Start": { + "key": "Bot.Start", + "value": "Начать" + }, + "Bot.Stop": { + "key": "Bot.Stop", + "value": "Остановить бота" + }, + "Bot.Unblock": { + "key": "Bot.Unblock", + "value": "Перезапустить бота" + }, + "Broadcast.AdminLog.EmptyText": { + "key": "Broadcast.AdminLog.EmptyText", + "value": "За последние 48 часов администраторы не совершали служебных действий." + }, + "BroadcastGroups.Cancel": { + "key": "BroadcastGroups.Cancel", + "value": "Оставить обычной группой" + }, + "BroadcastGroups.ConfirmationAlert.Convert": { + "key": "BroadcastGroups.ConfirmationAlert.Convert", + "value": "Да" + }, + "BroadcastGroups.ConfirmationAlert.Text": { + "key": "BroadcastGroups.ConfirmationAlert.Text", + "value": "Обычные участники (не администраторы) **навсегда** потеряют возможность писать сообщения в группе.\n\nЭто **нельзя** будет отменить." + }, + "BroadcastGroups.ConfirmationAlert.Title": { + "key": "BroadcastGroups.ConfirmationAlert.Title", + "value": "Вы уверены?" + }, + "BroadcastGroups.Convert": { + "key": "BroadcastGroups.Convert", + "value": "Сделать группой для трансляций" + }, + "BroadcastGroups.IntroText": { + "key": "BroadcastGroups.IntroText", + "value": "• Сколько угодно участников.\n\n• Пишут только администраторы.\n\n• Нельзя сделать обычной группой." + }, + "BroadcastGroups.IntroTitle": { + "key": "BroadcastGroups.IntroTitle", + "value": "Группы для трансляций" + }, + "BroadcastGroups.LimitAlert.LearnMore": { + "key": "BroadcastGroups.LimitAlert.LearnMore", + "value": "Подробнее" + }, + "BroadcastGroups.LimitAlert.SettingsTip": { + "key": "BroadcastGroups.LimitAlert.SettingsTip", + "value": "Если Вы передумаете, перейдите в настройки группы > Разрешения." + }, + "BroadcastGroups.LimitAlert.Text": { + "key": "BroadcastGroups.LimitAlert.Text", + "value": "Ваша группа достигла лимита в **%@** участников.\n\nВы можете повысить лимит, сделав её **группой для трансляций**, в которой только администраторы могут отправлять сообщения. Продолжить?" + }, + "BroadcastGroups.LimitAlert.Title": { + "key": "BroadcastGroups.LimitAlert.Title", + "value": "Достигнут лимит" + }, + "BroadcastGroups.Success": { + "key": "BroadcastGroups.Success", + "value": "Теперь в Вашей группе может быть больше %@ участников." + }, + "CHANNEL_MESSAGES": { + "key": "CHANNEL_MESSAGES", + "value": "Сообщения в «%1$@»: %2$@" + }, + "CHANNEL_MESSAGES_SEPARATED": { + "key": "CHANNEL_MESSAGES_SEPARATED", + "value": "%1$@:|сообщения (%2$@)" + }, + "CHANNEL_MESSAGE_AUDIO": { + "key": "CHANNEL_MESSAGE_AUDIO", + "value": "В канале «%1$@» новое голосовое сообщение" + }, + "CHANNEL_MESSAGE_AUDIO_SEPARATED": { + "key": "CHANNEL_MESSAGE_AUDIO_SEPARATED", + "value": "%1$@:|голосовое сообщение" + }, + "CHANNEL_MESSAGE_CONTACT": { + "key": "CHANNEL_MESSAGE_CONTACT", + "value": "В канал %1$@ отправили контакт" + }, + "CHANNEL_MESSAGE_CONTACT_SEPARATED": { + "key": "CHANNEL_MESSAGE_CONTACT_SEPARATED", + "value": "%1$@:|контакт" + }, + "CHANNEL_MESSAGE_DOC": { + "key": "CHANNEL_MESSAGE_DOC", + "value": "В канале «%1$@» новый файл" + }, + "CHANNEL_MESSAGE_DOC_SEPARATED": { + "key": "CHANNEL_MESSAGE_DOC_SEPARATED", + "value": "%1$@:|файл" + }, + "CHANNEL_MESSAGE_FWDS_SEPARATED": { + "key": "CHANNEL_MESSAGE_FWDS_SEPARATED", + "value": "%1$@:|пересланные сообщения (%2$@)" + }, + "CHANNEL_MESSAGE_GAME": { + "key": "CHANNEL_MESSAGE_GAME", + "value": "%1$@ приглашает сыграть в «%2$@»" + }, + "CHANNEL_MESSAGE_GAME_SEPARATED": { + "key": "CHANNEL_MESSAGE_GAME_SEPARATED", + "value": "%1$@|приглашает сыграть в «%2$@»" + }, + "CHANNEL_MESSAGE_GEO": { + "key": "CHANNEL_MESSAGE_GEO", + "value": "В канал «%1$@» отправили карту" + }, + "CHANNEL_MESSAGE_GEOLIVE": { + "key": "CHANNEL_MESSAGE_GEOLIVE", + "value": "%1$@ начал(а) транслировать геопозицию" + }, + "CHANNEL_MESSAGE_GEOLIVE_SEPARATED": { + "key": "CHANNEL_MESSAGE_GEOLIVE_SEPARATED", + "value": "%1$@:|трансляция геопозиции" + }, + "CHANNEL_MESSAGE_GEO_SEPARATED": { + "key": "CHANNEL_MESSAGE_GEO_SEPARATED", + "value": "%1$@:|карта" + }, + "CHANNEL_MESSAGE_GIF": { + "key": "CHANNEL_MESSAGE_GIF", + "value": "В канале «%1$@» новый GIF" + }, + "CHANNEL_MESSAGE_GIF_SEPARATED": { + "key": "CHANNEL_MESSAGE_GIF_SEPARATED", + "value": "%1$@:|GIF" + }, + "CHANNEL_MESSAGE_NOTEXT": { + "key": "CHANNEL_MESSAGE_NOTEXT", + "value": "В канале «%1$@» новая публикация" + }, + "CHANNEL_MESSAGE_NOTEXT_SEPARATED": { + "key": "CHANNEL_MESSAGE_NOTEXT_SEPARATED", + "value": "%1$@:|новая публикация" + }, + "CHANNEL_MESSAGE_PHOTO": { + "key": "CHANNEL_MESSAGE_PHOTO", + "value": "В канале «%1$@» новая фотография" + }, + "CHANNEL_MESSAGE_PHOTOS": { + "key": "CHANNEL_MESSAGE_PHOTOS", + "value": "%2$@ фото в «%1$@»" + }, + "CHANNEL_MESSAGE_PHOTOS_SEPARATED": { + "key": "CHANNEL_MESSAGE_PHOTOS_SEPARATED", + "value": "%1$@:|фотографии (%2$@)" + }, + "CHANNEL_MESSAGE_PHOTO_SEPARATED": { + "key": "CHANNEL_MESSAGE_PHOTO_SEPARATED", + "value": "%1$@:|фотография" + }, + "CHANNEL_MESSAGE_POLL": { + "key": "CHANNEL_MESSAGE_POLL", + "value": "В канале «%1$@» новый опрос" + }, + "CHANNEL_MESSAGE_POLL_SEPARATED": { + "key": "CHANNEL_MESSAGE_POLL_SEPARATED", + "value": "%1$@:|опрос" + }, + "CHANNEL_MESSAGE_ROUND": { + "key": "CHANNEL_MESSAGE_ROUND", + "value": "В канале «%1$@» новое видеосообщение" + }, + "CHANNEL_MESSAGE_ROUND_SEPARATED": { + "key": "CHANNEL_MESSAGE_ROUND_SEPARATED", + "value": "%1$@:|видеосообщение" + }, + "CHANNEL_MESSAGE_STICKER": { + "key": "CHANNEL_MESSAGE_STICKER", + "value": "В канал «%1$@» отправили стикер %2$@" + }, + "CHANNEL_MESSAGE_STICKER_SEPARATED": { + "key": "CHANNEL_MESSAGE_STICKER_SEPARATED", + "value": "%1$@:|стикер %2$@" + }, + "CHANNEL_MESSAGE_TEXT": { + "key": "CHANNEL_MESSAGE_TEXT", + "value": "%1$@: %2$@" + }, + "CHANNEL_MESSAGE_TEXT_SEPARATED": { + "key": "CHANNEL_MESSAGE_TEXT_SEPARATED", + "value": "%1$@|%2$@" + }, + "CHANNEL_MESSAGE_VIDEO": { + "key": "CHANNEL_MESSAGE_VIDEO", + "value": "В канале «%1$@» новое видео" + }, + "CHANNEL_MESSAGE_VIDEO_SEPARATED": { + "key": "CHANNEL_MESSAGE_VIDEO_SEPARATED", + "value": "%1$@:|видео" + }, + "CHAT_ADD_MEMBER": { + "key": "CHAT_ADD_MEMBER", + "value": "%1$@ пригласил(а) %3$@ в «%2$@»" + }, + "CHAT_ADD_MEMBER_SEPARATED": { + "key": "CHAT_ADD_MEMBER_SEPARATED", + "value": "%2$@:|%1$@ добавил(а) %3$@ в группу" + }, + "CHAT_ADD_YOU": { + "key": "CHAT_ADD_YOU", + "value": "%1$@ пригласил(а) Вас в группу «%2$@»" + }, + "CHAT_ADD_YOU_SEPARATED": { + "key": "CHAT_ADD_YOU_SEPARATED", + "value": "%2$@:|%1$@ добавил(а) Вас в группу" + }, + "CHAT_CREATED": { + "key": "CHAT_CREATED", + "value": "%1$@ пригласил(а) Вас в группу «%2$@»" + }, + "CHAT_CREATED_SEPARATED": { + "key": "CHAT_CREATED_SEPARATED", + "value": "%2$@:|%1$@ добавил(а) Вас в группу" + }, + "CHAT_DELETE_MEMBER": { + "key": "CHAT_DELETE_MEMBER", + "value": "%1$@ исключил(а) %3$@ из «%2$@»" + }, + "CHAT_DELETE_MEMBER_SEPARATED": { + "key": "CHAT_DELETE_MEMBER_SEPARATED", + "value": "%2$@|%1$@ удалил(а) %3$@ из группы" + }, + "CHAT_DELETE_YOU": { + "key": "CHAT_DELETE_YOU", + "value": "%1$@ исключил(а) Вас из группы «%2$@»" + }, + "CHAT_DELETE_YOU_SEPARATED": { + "key": "CHAT_DELETE_YOU_SEPARATED", + "value": "%2$@:|%1$@ удалил(а) Вас из группы" + }, + "CHAT_JOINED_SEPARATED": { + "key": "CHAT_JOINED_SEPARATED", + "value": "%2$@:|%1$@ теперь в группе" + }, + "CHAT_LEFT": { + "key": "CHAT_LEFT", + "value": "%1$@ покинул(а) группу «%2$@»" + }, + "CHAT_LEFT_SEPARATED": { + "key": "CHAT_LEFT_SEPARATED", + "value": "%2$@:|%1$@ больше не в группе" + }, + "CHAT_MESSAGES": { + "key": "CHAT_MESSAGES", + "value": "Сообщения от %1$@ в «%2$@»: %3$@" + }, + "CHAT_MESSAGES_SEPARATED": { + "key": "CHAT_MESSAGES_SEPARATED", + "value": "%2$@|Сообщения от %1$@ (%3$@)" + }, + "CHAT_MESSAGE_AUDIO": { + "key": "CHAT_MESSAGE_AUDIO", + "value": "%1$@ отправил(а) голосовое сообщение в «%2$@»" + }, + "CHAT_MESSAGE_AUDIO_SEPARATED": { + "key": "CHAT_MESSAGE_AUDIO_SEPARATED", + "value": "%2$@|Голосовое сообщение от %1$@" + }, + "CHAT_MESSAGE_CONTACT": { + "key": "CHAT_MESSAGE_CONTACT", + "value": "%1$@ отправил(а) контакт в группу «%2$@»" + }, + "CHAT_MESSAGE_CONTACT_SEPARATED": { + "key": "CHAT_MESSAGE_CONTACT_SEPARATED", + "value": "%2$@|Контакт от %1$@" + }, + "CHAT_MESSAGE_DOC": { + "key": "CHAT_MESSAGE_DOC", + "value": "%1$@ отправил(а) файл в группу «%2$@»" + }, + "CHAT_MESSAGE_DOC_SEPARATED": { + "key": "CHAT_MESSAGE_DOC_SEPARATED", + "value": "%2$@|Файл от %1$@" + }, + "CHAT_MESSAGE_FWDS": { + "key": "CHAT_MESSAGE_FWDS", + "value": "%1$@ переслал(а) сообщения (%3$@) в группу «%2$@»" + }, + "CHAT_MESSAGE_FWDS_SEPARATED": { + "key": "CHAT_MESSAGE_FWDS_SEPARATED", + "value": "%2$@|Пересланные сообщения от %1$@ (%3$@)" + }, + "CHAT_MESSAGE_GAME": { + "key": "CHAT_MESSAGE_GAME", + "value": "%1$@ пригласил(а) группу «%2$@» сыграть в %3$@" + }, + "CHAT_MESSAGE_GAME_SEPARATED": { + "key": "CHAT_MESSAGE_GAME_SEPARATED", + "value": "%2$@:|%1$@ приглашает сыграть в «%3$@»" + }, + "CHAT_MESSAGE_GEO": { + "key": "CHAT_MESSAGE_GEO", + "value": "%1$@ отправил(а) карту в группу «%2$@»" + }, + "CHAT_MESSAGE_GEOLIVE": { + "key": "CHAT_MESSAGE_GEOLIVE", + "value": "%1$@ начал(а) транслировать геопозицию в группе «%2$@»" + }, + "CHAT_MESSAGE_GEOLIVE_SEPARATED": { + "key": "CHAT_MESSAGE_GEOLIVE_SEPARATED", + "value": "%2$@|Трансляция геопозиции от %1$@" + }, + "CHAT_MESSAGE_GEO_SEPARATED": { + "key": "CHAT_MESSAGE_GEO_SEPARATED", + "value": "%2$@|Карта от %1$@" + }, + "CHAT_MESSAGE_GIF": { + "key": "CHAT_MESSAGE_GIF", + "value": "%1$@ отправил(а) GIF в группу «%2$@»" + }, + "CHAT_MESSAGE_GIF_SEPARATED": { + "key": "CHAT_MESSAGE_GIF_SEPARATED", + "value": "%2$@|GIF от %1$@" + }, + "CHAT_MESSAGE_INVOICE": { + "key": "CHAT_MESSAGE_INVOICE", + "value": "%1$@ отправил(а) счёт на %3$@ в группу «%2$@»" + }, + "CHAT_MESSAGE_INVOICE_SEPARATED": { + "key": "CHAT_MESSAGE_INVOICE_SEPARATED", + "value": "%2$@|Счёт на %3$@ от %1$@" + }, + "CHAT_MESSAGE_NOTEXT": { + "key": "CHAT_MESSAGE_NOTEXT", + "value": "%1$@ отправил(а) сообщение в группу «%2$@»" + }, + "CHAT_MESSAGE_NOTEXT_SEPARATED": { + "key": "CHAT_MESSAGE_NOTEXT_SEPARATED", + "value": "%2$@|Сообщение от %1$@" + }, + "CHAT_MESSAGE_PHOTO": { + "key": "CHAT_MESSAGE_PHOTO", + "value": "%1$@ отправил(а) фото в группу «%2$@»" + }, + "CHAT_MESSAGE_PHOTOS": { + "key": "CHAT_MESSAGE_PHOTOS", + "value": "%3$@ фото от %1$@ в «%2$@»" + }, + "CHAT_MESSAGE_PHOTOS_SEPARATED": { + "key": "CHAT_MESSAGE_PHOTOS_SEPARATED", + "value": "%2$@|Фотографии от %1$@ (%3$@)" + }, + "CHAT_MESSAGE_PHOTO_SEPARATED": { + "key": "CHAT_MESSAGE_PHOTO_SEPARATED", + "value": "%2$@|Фотография от %1$@" + }, + "CHAT_MESSAGE_POLL": { + "key": "CHAT_MESSAGE_POLL", + "value": "%1$@ отправил(а) опрос в группу «%2$@»" + }, + "CHAT_MESSAGE_POLL_SEPARATED": { + "key": "CHAT_MESSAGE_POLL_SEPARATED", + "value": "%2$@|Опрос от %1$@" + }, + "CHAT_MESSAGE_ROUND": { + "key": "CHAT_MESSAGE_ROUND", + "value": "%1$@ отправил(а) видеосообщение в группу «%2$@»" + }, + "CHAT_MESSAGE_ROUND_SEPARATED": { + "key": "CHAT_MESSAGE_ROUND_SEPARATED", + "value": "%2$@|Видеосообщение от %1$@" + }, + "CHAT_MESSAGE_STICKER": { + "key": "CHAT_MESSAGE_STICKER", + "value": "%1$@ прислал(а) стикер %3$@ в группу «%2$@»" + }, + "CHAT_MESSAGE_STICKER_SEPARATED": { + "key": "CHAT_MESSAGE_STICKER_SEPARATED", + "value": "%2$@|Стикер %3$@ от %1$@" + }, + "CHAT_MESSAGE_TEXT": { + "key": "CHAT_MESSAGE_TEXT", + "value": "%1$@@%2$@: %3$@" + }, + "CHAT_MESSAGE_TEXT_SEPARATED": { + "key": "CHAT_MESSAGE_TEXT_SEPARATED", + "value": "%2$@|%1$@:%3$@" + }, + "CHAT_MESSAGE_VIDEO": { + "key": "CHAT_MESSAGE_VIDEO", + "value": "%1$@ отправил(а) видео в группу «%2$@»" + }, + "CHAT_MESSAGE_VIDEO_SEPARATED": { + "key": "CHAT_MESSAGE_VIDEO_SEPARATED", + "value": "%2$@|Видео от %1$@" + }, + "CHAT_PHOTO_EDITED": { + "key": "CHAT_PHOTO_EDITED", + "value": "%1$@ изменил(а) фото группы «%2$@»" + }, + "CHAT_RETURNED": { + "key": "CHAT_RETURNED", + "value": "%1$@ снова в «%2$@»" + }, + "CHAT_RETURNED_SEPARATED": { + "key": "CHAT_RETURNED_SEPARATED", + "value": "%2$@:|%1$@ снова в группе" + }, + "CHAT_TITLE_EDITED": { + "key": "CHAT_TITLE_EDITED", + "value": "%1$@ изменил(а) название группы «%2$@»" + }, + "CHAT_VOICECHAT_INVITE": { + "key": "CHAT_VOICECHAT_INVITE", + "value": "%1$@ пригласил(а) %3$@ в голосовой чат" + }, + "CHAT_VOICECHAT_INVITE_YOU": { + "key": "CHAT_VOICECHAT_INVITE_YOU", + "value": "%1$@ пригласил(а) Вас в голосовой чат" + }, + "CHAT_VOICECHAT_START": { + "key": "CHAT_VOICECHAT_START", + "value": "%1$@ начал(а) голосовой чат" + }, + "CONTACT_JOINED": { + "key": "CONTACT_JOINED", + "value": "%1$@ теперь в Telegram" + }, + "CONTACT_JOINED_SEPARATED": { + "key": "CONTACT_JOINED_SEPARATED", + "value": "%1$@|теперь в Telegram!" + }, + "Cache.ByPeerHeader": { + "key": "Cache.ByPeerHeader", + "value": "ЧАТЫ" + }, + "Cache.Clear": { + "key": "Cache.Clear", + "value": "Очистить (%@)" + }, + "Cache.ClearCache": { + "key": "Cache.ClearCache", + "value": "Очистить кэш" + }, + "Cache.ClearEmpty": { + "key": "Cache.ClearEmpty", + "value": "Пусто" + }, + "Cache.ClearNone": { + "key": "Cache.ClearNone", + "value": "Очистить" + }, + "Cache.ClearProgress": { + "key": "Cache.ClearProgress", + "value": "Пожалуйста, подождите..." + }, + "Cache.Files": { + "key": "Cache.Files", + "value": "Файлы" + }, + "Cache.Help": { + "key": "Cache.Help", + "value": "Фото, видео и другие файлы, к которым Вы не обращались в течение этого срока, будут удалены из кэша для экономии места на телефоне.\n\nВсе медиа останутся в облаке Telegram, при необходимости Вы сможете загрузить их снова." + }, + "Cache.Indexing": { + "key": "Cache.Indexing", + "value": "Telegram считает размер кэша.\nЭто может занять пару минут." + }, + "Cache.KeepMedia": { + "key": "Cache.KeepMedia", + "value": "Хранить файлы" + }, + "Cache.KeepMediaHelp": { + "key": "Cache.KeepMediaHelp", + "value": "Фото, видео и другие файлы, которые Вы **не смотрели** в течение этого срока, будут удалены с устройства для экономии места на телефоне." + }, + "Cache.LowDiskSpaceText": { + "key": "Cache.LowDiskSpaceText", + "value": "В памяти телефона недостаточно места. Чтобы загружать или скачивать материалы, требуется освободить память." + }, + "Cache.MaximumCacheSize": { + "key": "Cache.MaximumCacheSize", + "value": "Максимальный размер кэша" + }, + "Cache.MaximumCacheSizeHelp": { + "key": "Cache.MaximumCacheSizeHelp", + "value": "Если размер кэша превысит этот лимит, самые старые медиа будут удалены из него.\n\nВсе медиа останутся в облаке Telegram, при необходимости Вы сможете загрузить их снова." + }, + "Cache.Music": { + "key": "Cache.Music", + "value": "Музыка" + }, + "Cache.NoLimit": { + "key": "Cache.NoLimit", + "value": "Нет" + }, + "Cache.Photos": { + "key": "Cache.Photos", + "value": "Фотографии" + }, + "Cache.ServiceFiles": { + "key": "Cache.ServiceFiles", + "value": "Служебные файлы" + }, + "Cache.Title": { + "key": "Cache.Title", + "value": "Использование памяти" + }, + "Cache.Videos": { + "key": "Cache.Videos", + "value": "Видео" + }, + "Call.Accept": { + "key": "Call.Accept", + "value": "Принять" + }, + "Call.AnsweringWithAccount": { + "key": "Call.AnsweringWithAccount", + "value": "Ответить как %@" + }, + "Call.Audio": { + "key": "Call.Audio", + "value": "аудио" + }, + "Call.AudioRouteHeadphones": { + "key": "Call.AudioRouteHeadphones", + "value": "Наушники" + }, + "Call.AudioRouteHide": { + "key": "Call.AudioRouteHide", + "value": "Скрыть" + }, + "Call.AudioRouteMute": { + "key": "Call.AudioRouteMute", + "value": "Без звука" + }, + "Call.AudioRouteSpeaker": { + "key": "Call.AudioRouteSpeaker", + "value": "Динамик" + }, + "Call.BatteryLow": { + "key": "Call.BatteryLow", + "value": "У %@ низкий заряд батареи" + }, + "Call.CallAgain": { + "key": "Call.CallAgain", + "value": "Позвонить снова" + }, + "Call.CallInProgressMessage": { + "key": "Call.CallInProgressMessage", + "value": "Закончить разговор с %1$@ и начать новый с %2$@?" + }, + "Call.CallInProgressTitle": { + "key": "Call.CallInProgressTitle", + "value": "Идёт разговор" + }, + "Call.CallInProgressVoiceChatMessage": { + "key": "Call.CallInProgressVoiceChatMessage", + "value": "Закончить разговор с %1$@ и начать голосовой чат с %2$@?" + }, + "Call.Camera": { + "key": "Call.Camera", + "value": "камера" + }, + "Call.CameraConfirmationConfirm": { + "key": "Call.CameraConfirmationConfirm", + "value": "Переключиться" + }, + "Call.CameraConfirmationText": { + "key": "Call.CameraConfirmationText", + "value": "Переключиться на видеозвонок?" + }, + "Call.CameraOff": { + "key": "Call.CameraOff", + "value": "%@ выключил(а) камеру" + }, + "Call.CameraTooltip": { + "key": "Call.CameraTooltip", + "value": "Нажмите здесь, чтобы включить камеру" + }, + "Call.ConnectionErrorMessage": { + "key": "Call.ConnectionErrorMessage", + "value": "Пожалуйста, проверьте соединение с интернетом и попробуйте ещё раз." + }, + "Call.ConnectionErrorTitle": { + "key": "Call.ConnectionErrorTitle", + "value": "Не удалось позвонить" + }, + "Call.Days": { + "key": "Call.Days", + "zeroValue": null, + "oneValue": "%@ день", + "twoValue": null, + "fewValue": "%@ дня", + "manyValue": "%@ дней", + "otherValue": "%@ дня" + }, + "Call.Decline": { + "key": "Call.Decline", + "value": "Отклонить" + }, + "Call.EmojiDescription": { + "key": "Call.EmojiDescription", + "value": "Если %@ видит те же эмодзи, что и Вы, звонок на 100%% защищён." + }, + "Call.EncryptionKey.Title": { + "key": "Call.EncryptionKey.Title", + "value": "Ключ шифрования" + }, + "Call.End": { + "key": "Call.End", + "value": "завершить" + }, + "Call.ExternalCallInProgressMessage": { + "key": "Call.ExternalCallInProgressMessage", + "value": "Сперва необходимо закончить текущий звонок." + }, + "Call.Flip": { + "key": "Call.Flip", + "value": "повернуть" + }, + "Call.GroupFormat": { + "key": "Call.GroupFormat", + "value": "%1$@ (%2$@)" + }, + "Call.Hours": { + "key": "Call.Hours", + "zeroValue": null, + "oneValue": "%@ час", + "twoValue": null, + "fewValue": "%@ часа", + "manyValue": "%@ часов", + "otherValue": "%@ часа" + }, + "Call.IncomingVideoCall": { + "key": "Call.IncomingVideoCall", + "value": "Входящий видеозвонок" + }, + "Call.IncomingVoiceCall": { + "key": "Call.IncomingVoiceCall", + "value": "Входящий голосовой звонок" + }, + "Call.Message": { + "key": "Call.Message", + "value": "Сообщение" + }, + "Call.MicrophoneOff": { + "key": "Call.MicrophoneOff", + "value": "%@ выключил(а) микрофон" + }, + "Call.Minutes": { + "key": "Call.Minutes", + "zeroValue": null, + "oneValue": "%@ минута", + "twoValue": null, + "fewValue": "%@ минуты", + "manyValue": "%@ минут", + "otherValue": "%@ минут" + }, + "Call.Mute": { + "key": "Call.Mute", + "value": "убрать звук" + }, + "Call.ParticipantVersionOutdatedError": { + "key": "Call.ParticipantVersionOutdatedError", + "value": "Приложение %@ не поддерживает звонки. Пользователь должен обновить приложение, чтобы Вы могли ему позвонить." + }, + "Call.ParticipantVideoVersionOutdatedError": { + "key": "Call.ParticipantVideoVersionOutdatedError", + "value": "Приложение %@ не поддерживает видеозвонки. Пользователь должен обновить приложение, чтобы Вы могли ему позвонить." + }, + "Call.PhoneCallInProgressMessage": { + "key": "Call.PhoneCallInProgressMessage", + "value": "Вы не можете начать новый звонок Telegram, пока идёт другой телефонный разговор." + }, + "Call.PrivacyErrorMessage": { + "key": "Call.PrivacyErrorMessage", + "value": "Извините, %@ не принимает звонки." + }, + "Call.RateCall": { + "key": "Call.RateCall", + "value": "Оценить звонок" + }, + "Call.RecordingDisabledMessage": { + "key": "Call.RecordingDisabledMessage", + "value": "Для отправки голосового сообщения необходимо сначала завершить разговор." + }, + "Call.RemoteVideoPaused": { + "key": "Call.RemoteVideoPaused", + "value": "%@ поставил(а) видео на паузу" + }, + "Call.ReportIncludeLog": { + "key": "Call.ReportIncludeLog", + "value": "Техническая информация" + }, + "Call.ReportIncludeLogDescription": { + "key": "Call.ReportIncludeLogDescription", + "value": "Это не раскроет содержимое Вашего разговора и поможет решить проблему." + }, + "Call.ReportPlaceholder": { + "key": "Call.ReportPlaceholder", + "value": "Что пошло не так?" + }, + "Call.ReportSend": { + "key": "Call.ReportSend", + "value": "Отправить" + }, + "Call.ReportSkip": { + "key": "Call.ReportSkip", + "value": "Пропустить" + }, + "Call.Seconds": { + "key": "Call.Seconds", + "zeroValue": null, + "oneValue": "%@ секунда", + "twoValue": null, + "fewValue": "%@ секунды", + "manyValue": "%@ секунд", + "otherValue": "%@ секунд" + }, + "Call.ShareStats": { + "key": "Call.ShareStats", + "value": "Отправить статистику" + }, + "Call.ShortMinutes": { + "key": "Call.ShortMinutes", + "zeroValue": null, + "oneValue": "%@ мин.", + "twoValue": null, + "fewValue": "%@ мин.", + "manyValue": "%@ мин.", + "otherValue": "%@ мин." + }, + "Call.ShortSeconds": { + "key": "Call.ShortSeconds", + "zeroValue": null, + "oneValue": "%@ сек.", + "twoValue": null, + "fewValue": "%@ сек.", + "manyValue": "%@ сек.", + "otherValue": "%@ сек." + }, + "Call.Speaker": { + "key": "Call.Speaker", + "value": "динамик" + }, + "Call.StatusBar": { + "key": "Call.StatusBar", + "value": "Вернуться к разговору с %@" + }, + "Call.StatusBusy": { + "key": "Call.StatusBusy", + "value": "Занято" + }, + "Call.StatusConnecting": { + "key": "Call.StatusConnecting", + "value": "Соединение..." + }, + "Call.StatusEnded": { + "key": "Call.StatusEnded", + "value": "Звонок завершён" + }, + "Call.StatusFailed": { + "key": "Call.StatusFailed", + "value": "Не удалось позвонить" + }, + "Call.StatusIncoming": { + "key": "Call.StatusIncoming", + "value": "Звонок через Telegram..." + }, + "Call.StatusNoAnswer": { + "key": "Call.StatusNoAnswer", + "value": "Нет ответа" + }, + "Call.StatusOngoing": { + "key": "Call.StatusOngoing", + "value": "Звонок Telegram %@" + }, + "Call.StatusRequesting": { + "key": "Call.StatusRequesting", + "value": "Установка соединения..." + }, + "Call.StatusRinging": { + "key": "Call.StatusRinging", + "value": "Вызов..." + }, + "Call.StatusWaiting": { + "key": "Call.StatusWaiting", + "value": "Ожидание..." + }, + "Call.VoiceChatInProgressCallMessage": { + "key": "Call.VoiceChatInProgressCallMessage", + "value": "Покинуть голосовой чат в %1$@ и начать разговор с %2$@?" + }, + "Call.VoiceChatInProgressMessage": { + "key": "Call.VoiceChatInProgressMessage", + "value": "Покинуть голосовой чат в %1$@ и начать новый в %2$@?" + }, + "Call.VoiceChatInProgressMessageCall": { + "key": "Call.VoiceChatInProgressMessageCall", + "value": "Покинуть голосовой чат в %1$@ и позвонить %2$@?" + }, + "Call.VoiceChatInProgressTitle": { + "key": "Call.VoiceChatInProgressTitle", + "value": "Идёт другой голосовой чат" + }, + "Call.VoiceOver.VideoCallCanceled": { + "key": "Call.VoiceOver.VideoCallCanceled", + "value": "Отменённый видеозвонок" + }, + "Call.VoiceOver.VideoCallIncoming": { + "key": "Call.VoiceOver.VideoCallIncoming", + "value": "Входящий видеозвонок" + }, + "Call.VoiceOver.VideoCallMissed": { + "key": "Call.VoiceOver.VideoCallMissed", + "value": "Пропущенный видеозвонок" + }, + "Call.VoiceOver.VideoCallOutgoing": { + "key": "Call.VoiceOver.VideoCallOutgoing", + "value": "Исходящий видеозвонок" + }, + "Call.VoiceOver.VoiceCallCanceled": { + "key": "Call.VoiceOver.VoiceCallCanceled", + "value": "Отменённый голосовой звонок" + }, + "Call.VoiceOver.VoiceCallIncoming": { + "key": "Call.VoiceOver.VoiceCallIncoming", + "value": "Входящий голосовой звонок" + }, + "Call.VoiceOver.VoiceCallMissed": { + "key": "Call.VoiceOver.VoiceCallMissed", + "value": "Пропущенный голосовой звонок" + }, + "Call.VoiceOver.VoiceCallOutgoing": { + "key": "Call.VoiceOver.VoiceCallOutgoing", + "value": "Исходящий голосовой звонок" + }, + "Call.YourMicrophoneOff": { + "key": "Call.YourMicrophoneOff", + "value": "Вы выключили микрофон" + }, + "CallFeedback.AddComment": { + "key": "CallFeedback.AddComment", + "value": "Ваш комментарий (необязательно)" + }, + "CallFeedback.IncludeLogs": { + "key": "CallFeedback.IncludeLogs", + "value": "Техническая информация" + }, + "CallFeedback.IncludeLogsInfo": { + "key": "CallFeedback.IncludeLogsInfo", + "value": "Это не раскроет содержимое Вашего разговора, но поможет решить проблему быстрее. " + }, + "CallFeedback.ReasonDistortedSpeech": { + "key": "CallFeedback.ReasonDistortedSpeech", + "value": "Звук был искажён" + }, + "CallFeedback.ReasonDropped": { + "key": "CallFeedback.ReasonDropped", + "value": "Звонок оборвался" + }, + "CallFeedback.ReasonEcho": { + "key": "CallFeedback.ReasonEcho", + "value": "Слышно свой голос" + }, + "CallFeedback.ReasonInterruption": { + "key": "CallFeedback.ReasonInterruption", + "value": "Голос собеседника пропадал" + }, + "CallFeedback.ReasonNoise": { + "key": "CallFeedback.ReasonNoise", + "value": "Шум на заднем фоне" + }, + "CallFeedback.ReasonSilentLocal": { + "key": "CallFeedback.ReasonSilentLocal", + "value": "Собеседника не слышно" + }, + "CallFeedback.ReasonSilentRemote": { + "key": "CallFeedback.ReasonSilentRemote", + "value": "Собеседник не слышал меня" + }, + "CallFeedback.Send": { + "key": "CallFeedback.Send", + "value": "Отправить" + }, + "CallFeedback.Success": { + "key": "CallFeedback.Success", + "value": "Спасибо\nза отзыв" + }, + "CallFeedback.Title": { + "key": "CallFeedback.Title", + "value": "О звонке" + }, + "CallFeedback.VideoReasonDistorted": { + "key": "CallFeedback.VideoReasonDistorted", + "value": "Видео было искажено" + }, + "CallFeedback.VideoReasonLowQuality": { + "key": "CallFeedback.VideoReasonLowQuality", + "value": "Видео низкого качества" + }, + "CallFeedback.WhatWentWrong": { + "key": "CallFeedback.WhatWentWrong", + "value": "УКАЖИТЕ ПРОБЛЕМУ" + }, + "CallList.ActiveVoiceChatsHeader": { + "key": "CallList.ActiveVoiceChatsHeader", + "value": "ГОЛОСОВЫЕ ЧАТЫ" + }, + "CallList.DeleteAllForEveryone": { + "key": "CallList.DeleteAllForEveryone", + "value": "Удалить для меня и остальных" + }, + "CallList.DeleteAllForMe": { + "key": "CallList.DeleteAllForMe", + "value": "Удалить для меня" + }, + "CallList.RecentCallsHeader": { + "key": "CallList.RecentCallsHeader", + "value": "НЕДАВНИЕ ЗВОНКИ" + }, + "CallSettings.Always": { + "key": "CallSettings.Always", + "value": "Всегда" + }, + "CallSettings.Never": { + "key": "CallSettings.Never", + "value": "Никогда" + }, + "CallSettings.OnMobile": { + "key": "CallSettings.OnMobile", + "value": "Через мобильную сеть" + }, + "CallSettings.RecentCalls": { + "key": "CallSettings.RecentCalls", + "value": "Недавние звонки" + }, + "CallSettings.TabIcon": { + "key": "CallSettings.TabIcon", + "value": "Вкладка «Звонки»" + }, + "CallSettings.TabIconDescription": { + "key": "CallSettings.TabIconDescription", + "value": "Для перехода к звонкам из главного меню." + }, + "CallSettings.Title": { + "key": "CallSettings.Title", + "value": "Звонки" + }, + "CallSettings.UseLessData": { + "key": "CallSettings.UseLessData", + "value": "Экономить трафик" + }, + "CallSettings.UseLessDataLongDescription": { + "key": "CallSettings.UseLessDataLongDescription", + "value": "Экономия трафика может помочь при плохом соединении, но немного ухудшит качество звука." + }, + "Calls.AddTab": { + "key": "Calls.AddTab", + "value": "Добавить" + }, + "Calls.All": { + "key": "Calls.All", + "value": "Все" + }, + "Calls.CallTabDescription": { + "key": "Calls.CallTabDescription", + "value": "Вы можете добавить вкладку «Звонки» в меню для быстрого перехода." + }, + "Calls.CallTabTitle": { + "key": "Calls.CallTabTitle", + "value": "Вкладка «Звонки»" + }, + "Calls.Missed": { + "key": "Calls.Missed", + "value": "Пропущ." + }, + "Calls.NewCall": { + "key": "Calls.NewCall", + "value": "Новый звонок" + }, + "Calls.NoCallsPlaceholder": { + "key": "Calls.NoCallsPlaceholder", + "value": "Здесь будут Ваши недавние звонки" + }, + "Calls.NoMissedCallsPlacehoder": { + "key": "Calls.NoMissedCallsPlacehoder", + "value": "Нет пропущенных звонков" + }, + "Calls.NotNow": { + "key": "Calls.NotNow", + "value": "Не сейчас" + }, + "Calls.RatingFeedback": { + "key": "Calls.RatingFeedback", + "value": "Оставьте комментарий..." + }, + "Calls.RatingTitle": { + "key": "Calls.RatingTitle", + "value": "Оцените качество звонка" + }, + "Calls.SubmitRating": { + "key": "Calls.SubmitRating", + "value": "Отправить" + }, + "Calls.TabTitle": { + "key": "Calls.TabTitle", + "value": "Звонки" + }, + "Camera.Discard": { + "key": "Camera.Discard", + "value": "Отменить все" + }, + "Camera.FlashAuto": { + "key": "Camera.FlashAuto", + "value": "Авто" + }, + "Camera.FlashOff": { + "key": "Camera.FlashOff", + "value": "Выкл." + }, + "Camera.FlashOn": { + "key": "Camera.FlashOn", + "value": "Вкл." + }, + "Camera.PhotoMode": { + "key": "Camera.PhotoMode", + "value": "ФОТО" + }, + "Camera.Retake": { + "key": "Camera.Retake", + "value": "Переснять" + }, + "Camera.SquareMode": { + "key": "Camera.SquareMode", + "value": "КВАДРАТ" + }, + "Camera.TapAndHoldForVideo": { + "key": "Camera.TapAndHoldForVideo", + "value": "Нажмите и удерживайте для записи видео" + }, + "Camera.Title": { + "key": "Camera.Title", + "value": "Снять фото или видео" + }, + "Camera.VideoMode": { + "key": "Camera.VideoMode", + "value": "ВИДЕО" + }, + "CancelResetAccount.Success": { + "key": "CancelResetAccount.Success", + "value": "Отменено удаление аккаунта %@." + }, + "CancelResetAccount.TextSMS": { + "key": "CancelResetAccount.TextSMS", + "value": "Кто-то с доступом к %@ запросил удаление Вашего аккаунта Telegram и сброс пароля двухэтапной аутентификации.\n\nЕсли это были не Вы, пожалуйста, введите код из SMS, только что отправленного на Ваш номер. Чтобы отменить удаление, Вы также можете **изменить номер телефона** на актуальный." + }, + "CancelResetAccount.Title": { + "key": "CancelResetAccount.Title", + "value": "Отменить сброс" + }, + "ChangePhone.ErrorOccupied": { + "key": "ChangePhone.ErrorOccupied", + "value": "Номер %@ уже привязан к аккаунту в Telegram. Удалите тот аккаунт, прежде чем перейти на новый номер." + }, + "ChangePhoneNumberCode.CallTimer": { + "key": "ChangePhoneNumberCode.CallTimer", + "value": "Telegram позвонит Вам через %@" + }, + "ChangePhoneNumberCode.Called": { + "key": "ChangePhoneNumberCode.Called", + "value": "Telegram набирает Ваш номер" + }, + "ChangePhoneNumberCode.Code": { + "key": "ChangePhoneNumberCode.Code", + "value": "ВАШ КОД" + }, + "ChangePhoneNumberCode.CodePlaceholder": { + "key": "ChangePhoneNumberCode.CodePlaceholder", + "value": "Код проверки" + }, + "ChangePhoneNumberCode.Help": { + "key": "ChangePhoneNumberCode.Help", + "value": "Мы отправили Вам SMS с кодом проверки" + }, + "ChangePhoneNumberCode.RequestingACall": { + "key": "ChangePhoneNumberCode.RequestingACall", + "value": "Запрос звонка от Telegram…" + }, + "ChangePhoneNumberNumber.Help": { + "key": "ChangePhoneNumberNumber.Help", + "value": "Мы отправим SMS с кодом подтверждения на Ваш новый номер." + }, + "ChangePhoneNumberNumber.NewNumber": { + "key": "ChangePhoneNumberNumber.NewNumber", + "value": "НОВЫЙ НОМЕР" + }, + "ChangePhoneNumberNumber.NumberPlaceholder": { + "key": "ChangePhoneNumberNumber.NumberPlaceholder", + "value": "Введите новый номер" + }, + "ChangePhoneNumberNumber.Title": { + "key": "ChangePhoneNumberNumber.Title", + "value": "Смена номера" + }, + "Channel.About.Help": { + "key": "Channel.About.Help", + "value": "Можете указать дополнительное описание для Вашего канала." + }, + "Channel.About.Placeholder": { + "key": "Channel.About.Placeholder", + "value": "Описание" + }, + "Channel.About.Title": { + "key": "Channel.About.Title", + "value": "Описание" + }, + "Channel.AboutItem": { + "key": "Channel.AboutItem", + "value": "описание" + }, + "Channel.AddBotAsAdmin": { + "key": "Channel.AddBotAsAdmin", + "value": "Назначить" + }, + "Channel.AddBotErrorHaveRights": { + "key": "Channel.AddBotErrorHaveRights", + "value": "Бота можно добавить только как администратора." + }, + "Channel.AddBotErrorNoRights": { + "key": "Channel.AddBotErrorNoRights", + "value": "Ботов можно добавлять в каналы только как администраторов." + }, + "Channel.AddUserLeftError": { + "key": "Channel.AddUserLeftError", + "value": "Поскольку пользователь был подписан на канал прежде, Вы не можете пригласить его обратно. Для этого требуется, чтобы Вы были друг у друга в списке контактов.\n\nЕсли пользователя нет в чёрном списке канала, он может присоединиться с помощью ссылки-приглашения." + }, + "Channel.AdminLog.AddMembers": { + "key": "Channel.AdminLog.AddMembers", + "value": "Добавлять участников" + }, + "Channel.AdminLog.AllowedNewMembersToSpeak": { + "key": "Channel.AdminLog.AllowedNewMembersToSpeak", + "value": "%1$@ разрешил(а) микрофон для новых участников" + }, + "Channel.AdminLog.BanEmbedLinks": { + "key": "Channel.AdminLog.BanEmbedLinks", + "value": "Предпросмотр для ссылок" + }, + "Channel.AdminLog.BanReadMessages": { + "key": "Channel.AdminLog.BanReadMessages", + "value": "Читать сообщения" + }, + "Channel.AdminLog.BanSendGifs": { + "key": "Channel.AdminLog.BanSendGifs", + "value": "Отправлять GIF" + }, + "Channel.AdminLog.BanSendMedia": { + "key": "Channel.AdminLog.BanSendMedia", + "value": "Отправлять медиафайлы" + }, + "Channel.AdminLog.BanSendMessages": { + "key": "Channel.AdminLog.BanSendMessages", + "value": "Отправлять сообщения" + }, + "Channel.AdminLog.BanSendStickers": { + "key": "Channel.AdminLog.BanSendStickers", + "value": "Отправлять стикеры" + }, + "Channel.AdminLog.BanSendStickersAndGifs": { + "key": "Channel.AdminLog.BanSendStickersAndGifs", + "value": "Отправлять стикеры и GIF" + }, + "Channel.AdminLog.CanAddAdmins": { + "key": "Channel.AdminLog.CanAddAdmins", + "value": "Добавлять администраторов" + }, + "Channel.AdminLog.CanBanUsers": { + "key": "Channel.AdminLog.CanBanUsers", + "value": "Блокировать пользователей" + }, + "Channel.AdminLog.CanBeAnonymous": { + "key": "Channel.AdminLog.CanBeAnonymous", + "value": "Анонимность" + }, + "Channel.AdminLog.CanChangeInfo": { + "key": "Channel.AdminLog.CanChangeInfo", + "value": "Редактировать описание" + }, + "Channel.AdminLog.CanChangeInviteLink": { + "key": "Channel.AdminLog.CanChangeInviteLink", + "value": "Приглашать пользователей по ссылке" + }, + "Channel.AdminLog.CanDeleteMessages": { + "key": "Channel.AdminLog.CanDeleteMessages", + "value": "Удалять сообщения" + }, + "Channel.AdminLog.CanDeleteMessagesOfOthers": { + "key": "Channel.AdminLog.CanDeleteMessagesOfOthers", + "value": "Удалять чужие сообщения" + }, + "Channel.AdminLog.CanEditMessages": { + "key": "Channel.AdminLog.CanEditMessages", + "value": "Редактировать чужие посты" + }, + "Channel.AdminLog.CanInviteUsers": { + "key": "Channel.AdminLog.CanInviteUsers", + "value": "Добавлять пользователей" + }, + "Channel.AdminLog.CanInviteUsersViaLink": { + "key": "Channel.AdminLog.CanInviteUsersViaLink", + "value": "Пригласительные ссылки" + }, + "Channel.AdminLog.CanManageCalls": { + "key": "Channel.AdminLog.CanManageCalls", + "value": "Управление голосовыми чатами" + }, + "Channel.AdminLog.CanPinMessages": { + "key": "Channel.AdminLog.CanPinMessages", + "value": "Закреплять сообщения" + }, + "Channel.AdminLog.CanSendMessages": { + "key": "Channel.AdminLog.CanSendMessages", + "value": "Отправлять сообщения" + }, + "Channel.AdminLog.CaptionEdited": { + "key": "Channel.AdminLog.CaptionEdited", + "value": "%@ отредактировал(а) подпись:" + }, + "Channel.AdminLog.ChangeInfo": { + "key": "Channel.AdminLog.ChangeInfo", + "value": "Изменять профиль" + }, + "Channel.AdminLog.ChannelEmptyText": { + "key": "Channel.AdminLog.ChannelEmptyText", + "value": "За последние 48 часов подписчики и администраторы канала не совершали служебных действий." + }, + "Channel.AdminLog.CreatedInviteLink": { + "key": "Channel.AdminLog.CreatedInviteLink", + "value": "%1$@ создал(а) ссылку-приглашение %2$@" + }, + "Channel.AdminLog.DefaultRestrictionsUpdated": { + "key": "Channel.AdminLog.DefaultRestrictionsUpdated", + "value": "изменил(а) права по умолчанию" + }, + "Channel.AdminLog.DeletedInviteLink": { + "key": "Channel.AdminLog.DeletedInviteLink", + "value": "%1$@ удалил(а) ссылку-приглашение %2$@" + }, + "Channel.AdminLog.DisabledSlowmode": { + "key": "Channel.AdminLog.DisabledSlowmode", + "value": "%@ отключил(а) медленный режим" + }, + "Channel.AdminLog.EditedInviteLink": { + "key": "Channel.AdminLog.EditedInviteLink", + "value": "%1$@ изменил(а) ссылку-приглашение %2$@" + }, + "Channel.AdminLog.EmptyFilterQueryText": { + "key": "Channel.AdminLog.EmptyFilterQueryText", + "value": "Не удалось найти недавние действия, содержащие '%@'." + }, + "Channel.AdminLog.EmptyFilterText": { + "key": "Channel.AdminLog.EmptyFilterText", + "value": "По Вашему запросу не удалось найти недавних действий." + }, + "Channel.AdminLog.EmptyFilterTitle": { + "key": "Channel.AdminLog.EmptyFilterTitle", + "value": "Действий не найдено" + }, + "Channel.AdminLog.EmptyMessageText": { + "key": "Channel.AdminLog.EmptyMessageText", + "value": "Пусто" + }, + "Channel.AdminLog.EmptyText": { + "key": "Channel.AdminLog.EmptyText", + "value": "За последние 48 часов участники и администраторы не совершали служебных действий." + }, + "Channel.AdminLog.EmptyTitle": { + "key": "Channel.AdminLog.EmptyTitle", + "value": "Действий пока не было" + }, + "Channel.AdminLog.EndedVoiceChat": { + "key": "Channel.AdminLog.EndedVoiceChat", + "value": "%1$@ закончил(а) голосовой чат" + }, + "Channel.AdminLog.InfoPanelAlertText": { + "key": "Channel.AdminLog.InfoPanelAlertText", + "value": "Это список важных действий, совершённых участниками и администраторами группы за последние 48 часов." + }, + "Channel.AdminLog.InfoPanelAlertTitle": { + "key": "Channel.AdminLog.InfoPanelAlertTitle", + "value": "Что такое журнал действий?" + }, + "Channel.AdminLog.InfoPanelChannelAlertText": { + "key": "Channel.AdminLog.InfoPanelChannelAlertText", + "value": "Это список всех служебных действий, совершённых администраторами канала за последние 48 часов." + }, + "Channel.AdminLog.InfoPanelTitle": { + "key": "Channel.AdminLog.InfoPanelTitle", + "value": "Что это?" + }, + "Channel.AdminLog.JoinedViaInviteLink": { + "key": "Channel.AdminLog.JoinedViaInviteLink", + "value": "%1$@ вступил(а) по ссылке-приглашению %2$@" + }, + "Channel.AdminLog.MessageAddedAdminName": { + "key": "Channel.AdminLog.MessageAddedAdminName", + "value": "назначил(а) %1$@" + }, + "Channel.AdminLog.MessageAddedAdminNameUsername": { + "key": "Channel.AdminLog.MessageAddedAdminNameUsername", + "value": "назначил(а) %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageAdmin": { + "key": "Channel.AdminLog.MessageAdmin", + "value": "%@ изменил(а) права %@ (%@)" + }, + "Channel.AdminLog.MessageChangedAutoremoveTimeoutRemove": { + "key": "Channel.AdminLog.MessageChangedAutoremoveTimeoutRemove", + "value": "%1$@ выключил(а) удаление по таймеру" + }, + "Channel.AdminLog.MessageChangedAutoremoveTimeoutSet": { + "key": "Channel.AdminLog.MessageChangedAutoremoveTimeoutSet", + "value": "%1$@ включил(а) удаление по таймеру через %2$@" + }, + "Channel.AdminLog.MessageChangedChannelAbout": { + "key": "Channel.AdminLog.MessageChangedChannelAbout", + "value": "%@ изменил(а) описание канала" + }, + "Channel.AdminLog.MessageChangedChannelUsername": { + "key": "Channel.AdminLog.MessageChangedChannelUsername", + "value": "%@ изменил(а) ссылку канала:" + }, + "Channel.AdminLog.MessageChangedGroupAbout": { + "key": "Channel.AdminLog.MessageChangedGroupAbout", + "value": "%@ изменил(а) описание группы" + }, + "Channel.AdminLog.MessageChangedGroupGeoLocation": { + "key": "Channel.AdminLog.MessageChangedGroupGeoLocation", + "value": "изменил(а) геопозицию группы на \"%@\"" + }, + "Channel.AdminLog.MessageChangedGroupStickerPack": { + "key": "Channel.AdminLog.MessageChangedGroupStickerPack", + "value": "%@ изменил(а) групповой набор стикеров" + }, + "Channel.AdminLog.MessageChangedGroupUsername": { + "key": "Channel.AdminLog.MessageChangedGroupUsername", + "value": "%@ изменил(а) ссылку группы:" + }, + "Channel.AdminLog.MessageChangedLinkedChannel": { + "key": "Channel.AdminLog.MessageChangedLinkedChannel", + "value": "%1$@ привязал(а) группу к %2$@" + }, + "Channel.AdminLog.MessageChangedLinkedGroup": { + "key": "Channel.AdminLog.MessageChangedLinkedGroup", + "value": "%1$@ сделал(а) %2$@ группой для обсуждения публикацией в этом канале." + }, + "Channel.AdminLog.MessageChangedUnlinkedChannel": { + "key": "Channel.AdminLog.MessageChangedUnlinkedChannel", + "value": "%1$@ отвязал(а) группу от %2$@" + }, + "Channel.AdminLog.MessageChangedUnlinkedGroup": { + "key": "Channel.AdminLog.MessageChangedUnlinkedGroup", + "value": "%1$@ убрал(а) группу для обсуждения %2$@" + }, + "Channel.AdminLog.MessageDeleted": { + "key": "Channel.AdminLog.MessageDeleted", + "value": "%@ удалил(а) сообщение:" + }, + "Channel.AdminLog.MessageEdited": { + "key": "Channel.AdminLog.MessageEdited", + "value": "%@ отредактировал(а) сообщение:" + }, + "Channel.AdminLog.MessageGroupPreHistoryHidden": { + "key": "Channel.AdminLog.MessageGroupPreHistoryHidden", + "value": "%@ выключил(а) доступ к истории сообщений для новых участников" + }, + "Channel.AdminLog.MessageGroupPreHistoryVisible": { + "key": "Channel.AdminLog.MessageGroupPreHistoryVisible", + "value": "%@ включил(а) доступ к истории сообщений для новых участников." + }, + "Channel.AdminLog.MessageInvitedName": { + "key": "Channel.AdminLog.MessageInvitedName", + "value": "пригласил(а) %1$@" + }, + "Channel.AdminLog.MessageInvitedNameUsername": { + "key": "Channel.AdminLog.MessageInvitedNameUsername", + "value": "пригласил(а) %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageKickedName": { + "key": "Channel.AdminLog.MessageKickedName", + "value": "заблокировал(а) %1$@" + }, + "Channel.AdminLog.MessageKickedNameUsername": { + "key": "Channel.AdminLog.MessageKickedNameUsername", + "value": "заблокировал(а) %1$@ (%2$@)" + }, + "Channel.AdminLog.MessagePinned": { + "key": "Channel.AdminLog.MessagePinned", + "value": "%@ закрепил(а) сообщение:" + }, + "Channel.AdminLog.MessagePreviousCaption": { + "key": "Channel.AdminLog.MessagePreviousCaption", + "value": "Исходная подпись" + }, + "Channel.AdminLog.MessagePreviousDescription": { + "key": "Channel.AdminLog.MessagePreviousDescription", + "value": "Прошлое описание" + }, + "Channel.AdminLog.MessagePreviousLink": { + "key": "Channel.AdminLog.MessagePreviousLink", + "value": "Прошлая ссылка" + }, + "Channel.AdminLog.MessagePreviousMessage": { + "key": "Channel.AdminLog.MessagePreviousMessage", + "value": "Исходное сообщение" + }, + "Channel.AdminLog.MessagePromotedName": { + "key": "Channel.AdminLog.MessagePromotedName", + "value": "изменил(а) права администратора %1$@" + }, + "Channel.AdminLog.MessagePromotedNameUsername": { + "key": "Channel.AdminLog.MessagePromotedNameUsername", + "value": "изменил(а) права администратора %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRank": { + "key": "Channel.AdminLog.MessageRank", + "value": "изменил(а) должность:\n%1$@" + }, + "Channel.AdminLog.MessageRankName": { + "key": "Channel.AdminLog.MessageRankName", + "value": "изменил(а) должность %1$@:\n%2$@" + }, + "Channel.AdminLog.MessageRankUsername": { + "key": "Channel.AdminLog.MessageRankUsername", + "value": "изменил(а) должность %1$@ (%2$@):\n%3$@" + }, + "Channel.AdminLog.MessageRemovedAdminName": { + "key": "Channel.AdminLog.MessageRemovedAdminName", + "value": "разжаловал(а) %1$@" + }, + "Channel.AdminLog.MessageRemovedAdminNameUsername": { + "key": "Channel.AdminLog.MessageRemovedAdminNameUsername", + "value": "разжаловал(а) %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRemovedChannelUsername": { + "key": "Channel.AdminLog.MessageRemovedChannelUsername", + "value": "%@ удалил(а) ссылку канала" + }, + "Channel.AdminLog.MessageRemovedGroupStickerPack": { + "key": "Channel.AdminLog.MessageRemovedGroupStickerPack", + "value": "%@ удалил(а) групповой набор стикеров" + }, + "Channel.AdminLog.MessageRemovedGroupUsername": { + "key": "Channel.AdminLog.MessageRemovedGroupUsername", + "value": "%@ удалил(а) ссылку группы" + }, + "Channel.AdminLog.MessageRestricted": { + "key": "Channel.AdminLog.MessageRestricted", + "value": "%@ сменил(а) ограничения для %@ (%@)" + }, + "Channel.AdminLog.MessageRestrictedForever": { + "key": "Channel.AdminLog.MessageRestrictedForever", + "value": "навсегда" + }, + "Channel.AdminLog.MessageRestrictedName": { + "key": "Channel.AdminLog.MessageRestrictedName", + "value": "изменил(а) ограничения для %1$@" + }, + "Channel.AdminLog.MessageRestrictedNameUsername": { + "key": "Channel.AdminLog.MessageRestrictedNameUsername", + "value": "изменил(а) ограничения для %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageRestrictedNewSetting": { + "key": "Channel.AdminLog.MessageRestrictedNewSetting", + "value": "сейчас: %@" + }, + "Channel.AdminLog.MessageRestrictedUntil": { + "key": "Channel.AdminLog.MessageRestrictedUntil", + "value": "до %@" + }, + "Channel.AdminLog.MessageToggleInvitesOff": { + "key": "Channel.AdminLog.MessageToggleInvitesOff", + "value": "%@ запретил(а) приглашения в группу" + }, + "Channel.AdminLog.MessageToggleInvitesOn": { + "key": "Channel.AdminLog.MessageToggleInvitesOn", + "value": "%@ разрешил(а) приглашения в группу" + }, + "Channel.AdminLog.MessageToggleSignaturesOff": { + "key": "Channel.AdminLog.MessageToggleSignaturesOff", + "value": "%@ отключил(а) подписи сообщений" + }, + "Channel.AdminLog.MessageToggleSignaturesOn": { + "key": "Channel.AdminLog.MessageToggleSignaturesOn", + "value": "%@ включил(а) подписи к сообщениям " + }, + "Channel.AdminLog.MessageTransferedName": { + "key": "Channel.AdminLog.MessageTransferedName", + "value": "права переданы %1$@" + }, + "Channel.AdminLog.MessageTransferedNameUsername": { + "key": "Channel.AdminLog.MessageTransferedNameUsername", + "value": "права переданы %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageUnkickedName": { + "key": "Channel.AdminLog.MessageUnkickedName", + "value": "разблокировал(а) %1$@" + }, + "Channel.AdminLog.MessageUnkickedNameUsername": { + "key": "Channel.AdminLog.MessageUnkickedNameUsername", + "value": "разблокировал(а) %1$@ (%2$@)" + }, + "Channel.AdminLog.MessageUnpinned": { + "key": "Channel.AdminLog.MessageUnpinned", + "value": "%@ открепил(а) сообщение" + }, + "Channel.AdminLog.MutedNewMembers": { + "key": "Channel.AdminLog.MutedNewMembers", + "value": "%1$@ выключил(а) микрофон для новых участников" + }, + "Channel.AdminLog.MutedParticipant": { + "key": "Channel.AdminLog.MutedParticipant", + "value": "%1$@ выключил(а) микрофон для %2$@" + }, + "Channel.AdminLog.PinMessages": { + "key": "Channel.AdminLog.PinMessages", + "value": "Закреплять сообщения" + }, + "Channel.AdminLog.PollStopped": { + "key": "Channel.AdminLog.PollStopped", + "value": "%@ остановил(а) опрос" + }, + "Channel.AdminLog.RevokedInviteLink": { + "key": "Channel.AdminLog.RevokedInviteLink", + "value": "%1$@ сбросил(а) ссылку-приглашение %2$@" + }, + "Channel.AdminLog.SendPolls": { + "key": "Channel.AdminLog.SendPolls", + "value": "Отправлять опросы" + }, + "Channel.AdminLog.SetSlowmode": { + "key": "Channel.AdminLog.SetSlowmode", + "value": "%1$@ установил(а) таймер медленного режима на %2$@" + }, + "Channel.AdminLog.StartedVoiceChat": { + "key": "Channel.AdminLog.StartedVoiceChat", + "value": "%1$@ начал(а) голосовой чат" + }, + "Channel.AdminLog.TitleAllEvents": { + "key": "Channel.AdminLog.TitleAllEvents", + "value": "Все действия" + }, + "Channel.AdminLog.TitleSelectedEvents": { + "key": "Channel.AdminLog.TitleSelectedEvents", + "value": "Выбранные действия" + }, + "Channel.AdminLog.UnmutedMutedParticipant": { + "key": "Channel.AdminLog.UnmutedMutedParticipant", + "value": "%1$@ разрешил(а) микрофон для %2$@" + }, + "Channel.AdminLog.UpdatedParticipantVolume": { + "key": "Channel.AdminLog.UpdatedParticipantVolume", + "value": "%1$@ изменил(а) громкость %2$@ до %3$@" + }, + "Channel.AdminLogFilter.AdminsAll": { + "key": "Channel.AdminLogFilter.AdminsAll", + "value": "Все администраторы" + }, + "Channel.AdminLogFilter.AdminsTitle": { + "key": "Channel.AdminLogFilter.AdminsTitle", + "value": "АДМИНИСТРАТОРЫ" + }, + "Channel.AdminLogFilter.ChannelEventsInfo": { + "key": "Channel.AdminLogFilter.ChannelEventsInfo", + "value": "Описание канала" + }, + "Channel.AdminLogFilter.EventsAdmins": { + "key": "Channel.AdminLogFilter.EventsAdmins", + "value": "Права админов" + }, + "Channel.AdminLogFilter.EventsAll": { + "key": "Channel.AdminLogFilter.EventsAll", + "value": "Все действия" + }, + "Channel.AdminLogFilter.EventsCalls": { + "key": "Channel.AdminLogFilter.EventsCalls", + "value": "Голосовые чаты" + }, + "Channel.AdminLogFilter.EventsDeletedMessages": { + "key": "Channel.AdminLogFilter.EventsDeletedMessages", + "value": "Удалённые сообщения" + }, + "Channel.AdminLogFilter.EventsEditedMessages": { + "key": "Channel.AdminLogFilter.EventsEditedMessages", + "value": "Отредактированные сообщения" + }, + "Channel.AdminLogFilter.EventsInfo": { + "key": "Channel.AdminLogFilter.EventsInfo", + "value": "Информация о группе" + }, + "Channel.AdminLogFilter.EventsInviteLinks": { + "key": "Channel.AdminLogFilter.EventsInviteLinks", + "value": "Пригласительные ссылки" + }, + "Channel.AdminLogFilter.EventsLeaving": { + "key": "Channel.AdminLogFilter.EventsLeaving", + "value": "Выход участников" + }, + "Channel.AdminLogFilter.EventsLeavingSubscribers": { + "key": "Channel.AdminLogFilter.EventsLeavingSubscribers", + "value": "Удаленные подписчики" + }, + "Channel.AdminLogFilter.EventsNewMembers": { + "key": "Channel.AdminLogFilter.EventsNewMembers", + "value": "Новые участники" + }, + "Channel.AdminLogFilter.EventsNewSubscribers": { + "key": "Channel.AdminLogFilter.EventsNewSubscribers", + "value": "Новые подписчики" + }, + "Channel.AdminLogFilter.EventsPinned": { + "key": "Channel.AdminLogFilter.EventsPinned", + "value": "Закреплённые сообщения" + }, + "Channel.AdminLogFilter.EventsRestrictions": { + "key": "Channel.AdminLogFilter.EventsRestrictions", + "value": "Участники с ограничениями" + }, + "Channel.AdminLogFilter.EventsTitle": { + "key": "Channel.AdminLogFilter.EventsTitle", + "value": "ДЕЙСТВИЯ" + }, + "Channel.AdminLogFilter.Title": { + "key": "Channel.AdminLogFilter.Title", + "value": "Фильтр" + }, + "Channel.BanList.BlockedTitle": { + "key": "Channel.BanList.BlockedTitle", + "value": "ЗАБЛОКИРОВАННЫЕ" + }, + "Channel.BanList.RestrictedTitle": { + "key": "Channel.BanList.RestrictedTitle", + "value": "ОГРАНИЧЕННЫЕ" + }, + "Channel.BanUser.BlockFor": { + "key": "Channel.BanUser.BlockFor", + "value": "Срок блокировки" + }, + "Channel.BanUser.PermissionAddMembers": { + "key": "Channel.BanUser.PermissionAddMembers", + "value": "Добавление участников" + }, + "Channel.BanUser.PermissionChangeGroupInfo": { + "key": "Channel.BanUser.PermissionChangeGroupInfo", + "value": "Изменение профиля группы" + }, + "Channel.BanUser.PermissionEmbedLinks": { + "key": "Channel.BanUser.PermissionEmbedLinks", + "value": "Предпросмотр для ссылок" + }, + "Channel.BanUser.PermissionReadMessages": { + "key": "Channel.BanUser.PermissionReadMessages", + "value": "Просмотр сообщений" + }, + "Channel.BanUser.PermissionSendMedia": { + "key": "Channel.BanUser.PermissionSendMedia", + "value": "Отправка фото и видео" + }, + "Channel.BanUser.PermissionSendMessages": { + "key": "Channel.BanUser.PermissionSendMessages", + "value": "Отправка сообщений" + }, + "Channel.BanUser.PermissionSendPolls": { + "key": "Channel.BanUser.PermissionSendPolls", + "value": "Отправка опросов" + }, + "Channel.BanUser.PermissionSendStickersAndGifs": { + "key": "Channel.BanUser.PermissionSendStickersAndGifs", + "value": "Отправка стикеров и GIF" + }, + "Channel.BanUser.PermissionsHeader": { + "key": "Channel.BanUser.PermissionsHeader", + "value": "Ограничения пользователя" + }, + "Channel.BanUser.Title": { + "key": "Channel.BanUser.Title", + "value": "Блокировка" + }, + "Channel.BanUser.Unban": { + "key": "Channel.BanUser.Unban", + "value": "Разблокировать" + }, + "Channel.BlackList.Title": { + "key": "Channel.BlackList.Title", + "value": "Чёрный список" + }, + "Channel.BotDoesntSupportGroups": { + "key": "Channel.BotDoesntSupportGroups", + "value": "К сожалению, разработчики бота запретили добавлять его в группы. Вы не сможете добавить его, пока они не решат изменить настройки." + }, + "Channel.CommentsGroup.Header": { + "key": "Channel.CommentsGroup.Header", + "value": "Выберите группу, где будут появляться комментарии к публикациям канала." + }, + "Channel.CommentsGroup.HeaderGroupSet": { + "key": "Channel.CommentsGroup.HeaderGroupSet", + "value": "Группа используется для обсуждения публикаций «%@»." + }, + "Channel.CommentsGroup.HeaderSet": { + "key": "Channel.CommentsGroup.HeaderSet", + "value": "В группе «%@» будут появляться комментарии к публикациям канала." + }, + "Channel.DiscussionGroup": { + "key": "Channel.DiscussionGroup", + "value": "Обсуждение" + }, + "Channel.DiscussionGroup.Create": { + "key": "Channel.DiscussionGroup.Create", + "value": "Создать группу" + }, + "Channel.DiscussionGroup.Header": { + "key": "Channel.DiscussionGroup.Header", + "value": "Подписчики смогут перейти в группу, нажав на кнопку «Обсудить»." + }, + "Channel.DiscussionGroup.HeaderGroupSet": { + "key": "Channel.DiscussionGroup.HeaderGroupSet", + "value": "Группа привязана к %@ как площадка для обсуждения публикаций." + }, + "Channel.DiscussionGroup.HeaderLabel": { + "key": "Channel.DiscussionGroup.HeaderLabel", + "value": "Обсудить" + }, + "Channel.DiscussionGroup.HeaderSet": { + "key": "Channel.DiscussionGroup.HeaderSet", + "value": "Подписчики смогут перейти в %@, нажав на кнопку «Обсудить»." + }, + "Channel.DiscussionGroup.Info": { + "key": "Channel.DiscussionGroup.Info", + "value": "Всё, что Вы публикуете в канале, будет автоматически пересылаться в группу." + }, + "Channel.DiscussionGroup.LinkGroup": { + "key": "Channel.DiscussionGroup.LinkGroup", + "value": "Привязать группу" + }, + "Channel.DiscussionGroup.MakeHistoryPublic": { + "key": "Channel.DiscussionGroup.MakeHistoryPublic", + "value": "Внимание: если Вы привяжете эту частную группу к каналу, чтобы подписчики могли обсуждать там публикации, то любой подписчик канала сможет вступить в неё. Новые участники группы будут видеть всю историю чата." + }, + "Channel.DiscussionGroup.MakeHistoryPublicProceed": { + "key": "Channel.DiscussionGroup.MakeHistoryPublicProceed", + "value": "Продолжить" + }, + "Channel.DiscussionGroup.PrivateChannel": { + "key": "Channel.DiscussionGroup.PrivateChannel", + "value": "частный канал" + }, + "Channel.DiscussionGroup.PrivateChannelLink": { + "key": "Channel.DiscussionGroup.PrivateChannelLink", + "value": "Назначить %1$@ группой для обсуждения %2$@?\n\nВсе участники группы смогут видеть публикации канала." + }, + "Channel.DiscussionGroup.PrivateGroup": { + "key": "Channel.DiscussionGroup.PrivateGroup", + "value": "частная группа" + }, + "Channel.DiscussionGroup.PublicChannelLink": { + "key": "Channel.DiscussionGroup.PublicChannelLink", + "value": "Назначить %1$@ группой для обсуждения публикаций %2$@?" + }, + "Channel.DiscussionGroup.SearchPlaceholder": { + "key": "Channel.DiscussionGroup.SearchPlaceholder", + "value": "Поиск" + }, + "Channel.DiscussionGroup.UnlinkChannel": { + "key": "Channel.DiscussionGroup.UnlinkChannel", + "value": "Отвязать канал" + }, + "Channel.DiscussionGroup.UnlinkGroup": { + "key": "Channel.DiscussionGroup.UnlinkGroup", + "value": "Отвязать группу" + }, + "Channel.DiscussionGroupAdd": { + "key": "Channel.DiscussionGroupAdd", + "value": "Добавить" + }, + "Channel.DiscussionGroupInfo": { + "key": "Channel.DiscussionGroupInfo", + "value": "Добавьте группу для комментариев." + }, + "Channel.DiscussionMessageUnavailable": { + "key": "Channel.DiscussionMessageUnavailable", + "value": "Этот пост был удален из группы для обсуждения." + }, + "Channel.Edit.AboutItem": { + "key": "Channel.Edit.AboutItem", + "value": "Описание" + }, + "Channel.Edit.LinkItem": { + "key": "Channel.Edit.LinkItem", + "value": "Ссылка" + }, + "Channel.Edit.PrivatePublicLinkAlert": { + "key": "Channel.Edit.PrivatePublicLinkAlert", + "value": "Внимание! Если Вы создадите публичную ссылку на канал, любой желающий сможет найти его через поиск и присоединиться.\n\nНе создавайте ссылку, если хотите, чтобы канал оставался частным." + }, + "Channel.EditAdmin.CannotEdit": { + "key": "Channel.EditAdmin.CannotEdit", + "value": "Вы не можете редактировать права этого администратора." + }, + "Channel.EditAdmin.PermissinAddAdminOff": { + "key": "Channel.EditAdmin.PermissinAddAdminOff", + "value": "Этот администратор не сможет добавлять новых администраторов." + }, + "Channel.EditAdmin.PermissinAddAdminOn": { + "key": "Channel.EditAdmin.PermissinAddAdminOn", + "value": "Этот администратор сможет добавлять других администраторов с такими же или более ограниченными правами." + }, + "Channel.EditAdmin.PermissionAddAdmins": { + "key": "Channel.EditAdmin.PermissionAddAdmins", + "value": "Назначение администраторов" + }, + "Channel.EditAdmin.PermissionBanUsers": { + "key": "Channel.EditAdmin.PermissionBanUsers", + "value": "Блокировка пользователей" + }, + "Channel.EditAdmin.PermissionChangeInfo": { + "key": "Channel.EditAdmin.PermissionChangeInfo", + "value": "Изменение профиля канала" + }, + "Channel.EditAdmin.PermissionDeleteMessages": { + "key": "Channel.EditAdmin.PermissionDeleteMessages", + "value": "Удаление сообщений" + }, + "Channel.EditAdmin.PermissionDeleteMessagesOfOthers": { + "key": "Channel.EditAdmin.PermissionDeleteMessagesOfOthers", + "value": "Удаление чужих сообщений" + }, + "Channel.EditAdmin.PermissionEditMessages": { + "key": "Channel.EditAdmin.PermissionEditMessages", + "value": "Редактирование всех постов" + }, + "Channel.EditAdmin.PermissionEnabledByDefault": { + "key": "Channel.EditAdmin.PermissionEnabledByDefault", + "value": "Это действие разрешено для всех участников в настройках группы." + }, + "Channel.EditAdmin.PermissionInviteMembers": { + "key": "Channel.EditAdmin.PermissionInviteMembers", + "value": "Добавление участников" + }, + "Channel.EditAdmin.PermissionInviteSubscribers": { + "key": "Channel.EditAdmin.PermissionInviteSubscribers", + "value": "Добавление подписчиков" + }, + "Channel.EditAdmin.PermissionInviteUsers": { + "key": "Channel.EditAdmin.PermissionInviteUsers", + "value": "Добавлять пользователей" + }, + "Channel.EditAdmin.PermissionInviteViaLink": { + "key": "Channel.EditAdmin.PermissionInviteViaLink", + "value": "Пригласительные ссылки" + }, + "Channel.EditAdmin.PermissionPinMessages": { + "key": "Channel.EditAdmin.PermissionPinMessages", + "value": "Закрепление сообщений" + }, + "Channel.EditAdmin.PermissionPostMessages": { + "key": "Channel.EditAdmin.PermissionPostMessages", + "value": "Отправка сообщений" + }, + "Channel.EditAdmin.PermissionsHeader": { + "key": "Channel.EditAdmin.PermissionsHeader", + "value": "ВОЗМОЖНОСТИ АДМИНИСТРАТОРА:" + }, + "Channel.EditAdmin.TransferOwnership": { + "key": "Channel.EditAdmin.TransferOwnership", + "value": "Передать права на канал" + }, + "Channel.EditMessageErrorGeneric": { + "key": "Channel.EditMessageErrorGeneric", + "value": "К сожалению, Вы не можете изменить это сообщение." + }, + "Channel.ErrorAccessDenied": { + "key": "Channel.ErrorAccessDenied", + "value": "Извините, это частный канал." + }, + "Channel.ErrorAddBlocked": { + "key": "Channel.ErrorAddBlocked", + "value": "Вы не можете приглашать этого пользователя в каналы из-за его настроек приватности." + }, + "Channel.ErrorAddTooMuch": { + "key": "Channel.ErrorAddTooMuch", + "value": "Вы можете добавить в канал только первых 200 подписчиков. А вот по пригласительной ссылке на канал может подписаться неограниченное количество человек." + }, + "Channel.ErrorAdminsTooMuch": { + "key": "Channel.ErrorAdminsTooMuch", + "value": "В канале слишком много администраторов." + }, + "Channel.Info.Banned": { + "key": "Channel.Info.Banned", + "value": "Чёрный список" + }, + "Channel.Info.BlackList": { + "key": "Channel.Info.BlackList", + "value": "Чёрный список" + }, + "Channel.Info.Description": { + "key": "Channel.Info.Description", + "value": "описание" + }, + "Channel.Info.Management": { + "key": "Channel.Info.Management", + "value": "Администраторы" + }, + "Channel.Info.Members": { + "key": "Channel.Info.Members", + "value": "Участники" + }, + "Channel.Info.Stickers": { + "key": "Channel.Info.Stickers", + "value": "Групповой набор стикеров" + }, + "Channel.Info.Subscribers": { + "key": "Channel.Info.Subscribers", + "value": "Подписчики" + }, + "Channel.JoinChannel": { + "key": "Channel.JoinChannel", + "value": "Подписаться" + }, + "Channel.LeaveChannel": { + "key": "Channel.LeaveChannel", + "value": "Покинуть канал" + }, + "Channel.LinkItem": { + "key": "Channel.LinkItem", + "value": "ссылка" + }, + "Channel.Management.AddModerator": { + "key": "Channel.Management.AddModerator", + "value": "Добавить администратора" + }, + "Channel.Management.AddModeratorHelp": { + "key": "Channel.Management.AddModeratorHelp", + "value": "Вы можете добавлять администраторов, чтобы они помогали Вам управлять каналом." + }, + "Channel.Management.LabelAdministrator": { + "key": "Channel.Management.LabelAdministrator", + "value": "админ" + }, + "Channel.Management.LabelCreator": { + "key": "Channel.Management.LabelCreator", + "value": "Создатель" + }, + "Channel.Management.LabelEditor": { + "key": "Channel.Management.LabelEditor", + "value": "админ" + }, + "Channel.Management.LabelOwner": { + "key": "Channel.Management.LabelOwner", + "value": "владелец" + }, + "Channel.Management.PromotedBy": { + "key": "Channel.Management.PromotedBy", + "value": "Назначил(а) %@" + }, + "Channel.Management.RemovedBy": { + "key": "Channel.Management.RemovedBy", + "value": "Исключил(а) %@" + }, + "Channel.Management.RestrictedBy": { + "key": "Channel.Management.RestrictedBy", + "value": "Ограничил(а): %@" + }, + "Channel.Management.Title": { + "key": "Channel.Management.Title", + "value": "Управление" + }, + "Channel.Members.AddAdminErrorBlacklisted": { + "key": "Channel.Members.AddAdminErrorBlacklisted", + "value": "Извините, но Вы не можете добавить этого пользователя в администраторы, поскольку он находится в чёрном списке, а Вы не имеете прав, чтобы убирать людей из чёрного списка." + }, + "Channel.Members.AddAdminErrorNotAMember": { + "key": "Channel.Members.AddAdminErrorNotAMember", + "value": "Вы не можете добавить этого пользователя в администраторы, так как он не состоит в группе, а Вы не можете приглашать новых пользователей." + }, + "Channel.Members.AddBannedErrorAdmin": { + "key": "Channel.Members.AddBannedErrorAdmin", + "value": "Вы не можете заблокировать этого пользователя, так как он админ этой группы, а у Вас нет прав, чтобы его разжаловать." + }, + "Channel.Members.AddMembers": { + "key": "Channel.Members.AddMembers", + "value": "Добавить подписчиков" + }, + "Channel.Members.AddMembersHelp": { + "key": "Channel.Members.AddMembersHelp", + "value": "Этот список видят только администраторы канала." + }, + "Channel.Members.InviteLink": { + "key": "Channel.Members.InviteLink", + "value": "Пригласить по ссылке" + }, + "Channel.Members.Title": { + "key": "Channel.Members.Title", + "value": "Участники" + }, + "Channel.MessagePhotoRemoved": { + "key": "Channel.MessagePhotoRemoved", + "value": "Фото канала удалено" + }, + "Channel.MessagePhotoUpdated": { + "key": "Channel.MessagePhotoUpdated", + "value": "Фото канала обновлено" + }, + "Channel.MessageTitleUpdated": { + "key": "Channel.MessageTitleUpdated", + "value": "Название канала изменено на \"%@\"" + }, + "Channel.MessageVideoUpdated": { + "key": "Channel.MessageVideoUpdated", + "value": "Видео канала обновлено" + }, + "Channel.Moderator.AccessLevelRevoke": { + "key": "Channel.Moderator.AccessLevelRevoke", + "value": "Убрать из администраторов" + }, + "Channel.Moderator.Title": { + "key": "Channel.Moderator.Title", + "value": "Администратор" + }, + "Channel.NotificationLoading": { + "key": "Channel.NotificationLoading", + "value": "Загрузка..." + }, + "Channel.OwnershipTransfer.ChangeOwner": { + "key": "Channel.OwnershipTransfer.ChangeOwner", + "value": "Сменить владельца" + }, + "Channel.OwnershipTransfer.DescriptionInfo": { + "key": "Channel.OwnershipTransfer.DescriptionInfo", + "value": "В этом случае **права** на канал **%1$@** будут полностью переданы **%2$@**.\n\nВы больше не будете считаться создателем канала. Новый владелец сможет разжаловать Вас из администраторов или даже заблокировать." + }, + "Channel.OwnershipTransfer.EnterPassword": { + "key": "Channel.OwnershipTransfer.EnterPassword", + "value": "Введите пароль" + }, + "Channel.OwnershipTransfer.EnterPasswordText": { + "key": "Channel.OwnershipTransfer.EnterPasswordText", + "value": "Введите облачный пароль, чтобы подтвердить передачу прав." + }, + "Channel.OwnershipTransfer.ErrorAdminsTooMuch": { + "key": "Channel.OwnershipTransfer.ErrorAdminsTooMuch", + "value": "В канале максимальное число администраторов, поэтому нельзя назначить выбранного пользователя. Пожалуйста, сперва удалите кого-то из других администраторов." + }, + "Channel.OwnershipTransfer.ErrorPrivacyRestricted": { + "key": "Channel.OwnershipTransfer.ErrorPrivacyRestricted", + "value": "Пользователь не подписан на канал, а Вы не можете пригласить его из-за его настроек конфиденциальности." + }, + "Channel.OwnershipTransfer.ErrorPublicChannelsTooMuch": { + "key": "Channel.OwnershipTransfer.ErrorPublicChannelsTooMuch", + "value": "У этого пользователя максимальное число публичных групп и каналов. Пожалуйста, предложите ему сперва удалить одну из публичных ссылок на его группу или канал." + }, + "Channel.OwnershipTransfer.PasswordPlaceholder": { + "key": "Channel.OwnershipTransfer.PasswordPlaceholder", + "value": "Пароль" + }, + "Channel.OwnershipTransfer.Title": { + "key": "Channel.OwnershipTransfer.Title", + "value": "Передать права на канал" + }, + "Channel.OwnershipTransfer.TransferCompleted": { + "key": "Channel.OwnershipTransfer.TransferCompleted", + "value": "Права на **%2$@** теперь у **%1$@**" + }, + "Channel.Setup.LinkTypePrivate": { + "key": "Channel.Setup.LinkTypePrivate", + "value": "Частная" + }, + "Channel.Setup.LinkTypePublic": { + "key": "Channel.Setup.LinkTypePublic", + "value": "Публичная" + }, + "Channel.Setup.PublicNoLink": { + "key": "Channel.Setup.PublicNoLink", + "value": "Выберите публичную ссылку для канала, чтобы пользователи могли отправлять её друг другу, а канал можно было найти через поиск.\n\nЕсли Вы в этом не заинтересованы, предлагаем создать частный канал." + }, + "Channel.Setup.Title": { + "key": "Channel.Setup.Title", + "value": "Канал" + }, + "Channel.Setup.TypeHeader": { + "key": "Channel.Setup.TypeHeader", + "value": "ТИП КАНАЛА" + }, + "Channel.Setup.TypePrivate": { + "key": "Channel.Setup.TypePrivate", + "value": "Частный" + }, + "Channel.Setup.TypePrivateHelp": { + "key": "Channel.Setup.TypePrivateHelp", + "value": "На частные каналы можно подписаться только по ссылке-приглашению." + }, + "Channel.Setup.TypePublic": { + "key": "Channel.Setup.TypePublic", + "value": "Публичный" + }, + "Channel.Setup.TypePublicHelp": { + "key": "Channel.Setup.TypePublicHelp", + "value": "Публичные каналы можно найти через поиск, подписаться на них может любой пользователь." + }, + "Channel.SignMessages": { + "key": "Channel.SignMessages", + "value": "Подписывать сообщения" + }, + "Channel.SignMessages.Help": { + "key": "Channel.SignMessages.Help", + "value": "Добавлять к сообщениям имя автора записи." + }, + "Channel.Status": { + "key": "Channel.Status", + "value": "канал" + }, + "Channel.Stickers.CreateYourOwn": { + "key": "Channel.Stickers.CreateYourOwn", + "value": "Вы можете создать собственные наборы стикеров с помощью бота @stickers." + }, + "Channel.Stickers.NotFound": { + "key": "Channel.Stickers.NotFound", + "value": "Набор стикеров не найден" + }, + "Channel.Stickers.NotFoundHelp": { + "key": "Channel.Stickers.NotFoundHelp", + "value": "Попробуйте ещё раз или выберите из списка ниже" + }, + "Channel.Stickers.Placeholder": { + "key": "Channel.Stickers.Placeholder", + "value": "набор стикеров" + }, + "Channel.Stickers.Searching": { + "key": "Channel.Stickers.Searching", + "value": "Поиск..." + }, + "Channel.Stickers.YourStickers": { + "key": "Channel.Stickers.YourStickers", + "value": "ВЫБЕРИТЕ ИЗ СВОИХ НАБОРОВ" + }, + "Channel.Subscribers.Title": { + "key": "Channel.Subscribers.Title", + "value": "Подписчики" + }, + "Channel.TitleInfo": { + "key": "Channel.TitleInfo", + "value": "О канале" + }, + "Channel.TooMuchBots": { + "key": "Channel.TooMuchBots", + "value": "В этой группе максимальное число ботов. Пожалуйста, сперва исключите неактуальных ботов." + }, + "Channel.TypeSetup.Title": { + "key": "Channel.TypeSetup.Title", + "value": "Тип канала" + }, + "Channel.UpdatePhotoItem": { + "key": "Channel.UpdatePhotoItem", + "value": "Загрузить фото канала" + }, + "Channel.Username.CheckingUsername": { + "key": "Channel.Username.CheckingUsername", + "value": "Проверка имени…" + }, + "Channel.Username.CreatePrivateLinkHelp": { + "key": "Channel.Username.CreatePrivateLinkHelp", + "value": "На Ваш канал можно будет подписаться, перейдя по этой ссылке. Вы можете сбросить эту ссылку в любое время." + }, + "Channel.Username.CreatePublicLinkHelp": { + "key": "Channel.Username.CreatePublicLinkHelp", + "value": "Люди смогут делиться этой ссылкой с другими и находить Ваш канал через поиск в Telegram." + }, + "Channel.Username.Help": { + "key": "Channel.Username.Help", + "value": "Вы можете выбрать публичную ссылку для Вашего канала, в этом случае пользователи смогут найти канал через поиск.\n\nСсылка может содержать только **a-z**, **0-9** и _. Минимальная длина — **5** символов." + }, + "Channel.Username.InvalidCharacters": { + "key": "Channel.Username.InvalidCharacters", + "value": "Некорректное имя." + }, + "Channel.Username.InvalidStartsWithNumber": { + "key": "Channel.Username.InvalidStartsWithNumber", + "value": "Короткие имена не могут начинаться с цифр." + }, + "Channel.Username.InvalidTaken": { + "key": "Channel.Username.InvalidTaken", + "value": "Имя уже занято." + }, + "Channel.Username.InvalidTooShort": { + "key": "Channel.Username.InvalidTooShort", + "value": "Имя канала должно быть не короче 5 символов" + }, + "Channel.Username.LinkHint": { + "key": "Channel.Username.LinkHint", + "value": "Эта ссылка откроет Ваш канал в Telegram:[\nhttps://t.me/%@]" + }, + "Channel.Username.RevokeExistingUsernamesInfo": { + "key": "Channel.Username.RevokeExistingUsernamesInfo", + "value": "Вы можете создать частный канал или сбросить одну из уже занятых ссылок на свои группы или каналы." + }, + "Channel.Username.Title": { + "key": "Channel.Username.Title", + "value": "Ссылка" + }, + "Channel.Username.UsernameIsAvailable": { + "key": "Channel.Username.UsernameIsAvailable", + "value": "Имя %@ свободно." + }, + "ChannelInfo.AddParticipantConfirmation": { + "key": "ChannelInfo.AddParticipantConfirmation", + "value": "Пригласить %@ в канал?" + }, + "ChannelInfo.ChannelForbidden": { + "key": "ChannelInfo.ChannelForbidden", + "value": "Канал \"%@\" больше недоступен." + }, + "ChannelInfo.ConfirmLeave": { + "key": "ChannelInfo.ConfirmLeave", + "value": "Покинуть канал" + }, + "ChannelInfo.CreateVoiceChat": { + "key": "ChannelInfo.CreateVoiceChat", + "value": "Голосовой чат" + }, + "ChannelInfo.DeleteChannel": { + "key": "ChannelInfo.DeleteChannel", + "value": "Удалить канал" + }, + "ChannelInfo.DeleteChannelConfirmation": { + "key": "ChannelInfo.DeleteChannelConfirmation", + "value": "Внимание! Если удалить этот канал, все подписчики и сообщения будут потеряны. Вы точно хотите его удалить?" + }, + "ChannelInfo.DeleteGroup": { + "key": "ChannelInfo.DeleteGroup", + "value": "Удалить группу" + }, + "ChannelInfo.DeleteGroupConfirmation": { + "key": "ChannelInfo.DeleteGroupConfirmation", + "value": "Внимание! Удаление этой группы приведёт к исключению всех участников и потере всех сообщений. Вы точно хотите её удалить?" + }, + "ChannelInfo.FakeChannelWarning": { + "key": "ChannelInfo.FakeChannelWarning", + "value": "⚠️ Внимание: многие жаловались, что этот канал выдают за официальный." + }, + "ChannelInfo.InviteLink.RevokeAlert.Text": { + "key": "ChannelInfo.InviteLink.RevokeAlert.Text", + "value": "Вы точно хотите сбросить эту ссылку? Её нельзя будет использовать, чтобы подписаться на канал." + }, + "ChannelInfo.ScamChannelWarning": { + "key": "ChannelInfo.ScamChannelWarning", + "value": "⚠️ Внимание: на этот канал много жалоб в связи с мошенничеством или попытками выдать себя за официальный аккаунт. Будьте осторожны, особенно если у Вас попросят денег." + }, + "ChannelInfo.Stats": { + "key": "ChannelInfo.Stats", + "value": "Статистика" + }, + "ChannelIntro.CreateChannel": { + "key": "ChannelIntro.CreateChannel", + "value": "Создать канал" + }, + "ChannelIntro.Text": { + "key": "ChannelIntro.Text", + "value": "Каналы — инструмент, который\nпозволяет транслировать сообщения\nна большую аудиторию." + }, + "ChannelIntro.Title": { + "key": "ChannelIntro.Title", + "value": "Что такое канал?" + }, + "ChannelMembers.ChannelAdminsTitle": { + "key": "ChannelMembers.ChannelAdminsTitle", + "value": "АДМИНИСТРАТОРЫ КАНАЛА" + }, + "ChannelMembers.GroupAdminsTitle": { + "key": "ChannelMembers.GroupAdminsTitle", + "value": "АДМИНИСТРАТОРЫ ГРУППЫ" + }, + "ChannelMembers.WhoCanAddMembers": { + "key": "ChannelMembers.WhoCanAddMembers", + "value": "Могут приглашать" + }, + "ChannelMembers.WhoCanAddMembers.Admins": { + "key": "ChannelMembers.WhoCanAddMembers.Admins", + "value": "Только администраторы" + }, + "ChannelMembers.WhoCanAddMembers.AllMembers": { + "key": "ChannelMembers.WhoCanAddMembers.AllMembers", + "value": "Все участники" + }, + "ChannelMembers.WhoCanAddMembersAdminsHelp": { + "key": "ChannelMembers.WhoCanAddMembersAdminsHelp", + "value": "Только администраторы могут добавлять участников." + }, + "ChannelMembers.WhoCanAddMembersAllHelp": { + "key": "ChannelMembers.WhoCanAddMembersAllHelp", + "value": "Все могут добавлять участников." + }, + "ChannelRemoved.RemoveInfo": { + "key": "ChannelRemoved.RemoveInfo", + "value": "Пользователи, которых исключили администраторы канала, не смогут присоединиться снова с помощью ссылки-приглашения." + }, + "Chat.AttachmentLimitExceeded": { + "key": "Chat.AttachmentLimitExceeded", + "value": "Вы не можете выбрать больше элементов." + }, + "Chat.AttachmentLimitReached": { + "key": "Chat.AttachmentLimitReached", + "value": "Вы не можете выбрать больше элементов." + }, + "Chat.AttachmentMultipleFilesDisabled": { + "key": "Chat.AttachmentMultipleFilesDisabled", + "value": "Включён медленный режим. Вы не можете отправить несколько файлов за раз." + }, + "Chat.AttachmentMultipleForwardDisabled": { + "key": "Chat.AttachmentMultipleForwardDisabled", + "value": "Включён медленный режим. Вы не можете переслать несколько сообщений за раз." + }, + "Chat.DeleteMessagesConfirmation": { + "key": "Chat.DeleteMessagesConfirmation", + "zeroValue": null, + "oneValue": "Удалить %@ сообщение", + "twoValue": null, + "fewValue": "Удалить %@ сообщения", + "manyValue": "Удалить %@ сообщений", + "otherValue": "Удалить %@ сообщений" + }, + "Chat.GenericPsaTooltip": { + "key": "Chat.GenericPsaTooltip", + "value": "Это экстренное оповещение" + }, + "Chat.Gifs.SavedSectionHeader": { + "key": "Chat.Gifs.SavedSectionHeader", + "value": "МОИ GIF" + }, + "Chat.Gifs.TrendingSectionHeader": { + "key": "Chat.Gifs.TrendingSectionHeader", + "value": "ПОПУЛЯРНЫЕ GIF" + }, + "Chat.MessagesUnpinned": { + "key": "Chat.MessagesUnpinned", + "zeroValue": null, + "oneValue": "%@ сообщение откреплено", + "twoValue": null, + "fewValue": "%@ сообщения откреплено", + "manyValue": "%@ сообщений откреплено", + "otherValue": "%@ сообщения откреплено" + }, + "Chat.MultipleTextMessagesDisabled": { + "key": "Chat.MultipleTextMessagesDisabled", + "value": "Включён медленный режим. Вы не можете отправить несколько сообщений за раз." + }, + "Chat.PanelHidePinnedMessages": { + "key": "Chat.PanelHidePinnedMessages", + "value": "Скрыть закреплённые сообщения" + }, + "Chat.PanelUnpinAllMessages": { + "key": "Chat.PanelUnpinAllMessages", + "value": "Открепить все сообщения" + }, + "Chat.PinnedListPreview.HidePinnedMessages": { + "key": "Chat.PinnedListPreview.HidePinnedMessages", + "value": "Скрыть закрепленные сообщения" + }, + "Chat.PinnedListPreview.ShowAllMessages": { + "key": "Chat.PinnedListPreview.ShowAllMessages", + "value": "Показать все сообщения" + }, + "Chat.PinnedListPreview.UnpinAllMessages": { + "key": "Chat.PinnedListPreview.UnpinAllMessages", + "value": "Открепить все сообщения" + }, + "Chat.PinnedMessagesHiddenText": { + "key": "Chat.PinnedMessagesHiddenText", + "value": "Вы снова увидите её, если будет закреплено новое сообщение." + }, + "Chat.PinnedMessagesHiddenTitle": { + "key": "Chat.PinnedMessagesHiddenTitle", + "value": "Панель скрыта" + }, + "Chat.PsaTooltip.covid": { + "key": "Chat.PsaTooltip.covid", + "value": "Это экстренная новость о пандемии COVID-19. Подробнее об этой инициативе: https://telegram.org/blog/coronavirus" + }, + "Chat.SlowmodeAttachmentLimitReached": { + "key": "Chat.SlowmodeAttachmentLimitReached", + "value": "Включён медленный режим. Вы не можете выбрать больше элементов." + }, + "Chat.SlowmodeSendError": { + "key": "Chat.SlowmodeSendError", + "value": "Включён медленный режим." + }, + "Chat.SlowmodeTooltip": { + "key": "Chat.SlowmodeTooltip", + "value": "Включён медленный режим. Вы сможете отправить новое сообщение через %@." + }, + "Chat.SlowmodeTooltipPending": { + "key": "Chat.SlowmodeTooltipPending", + "value": "Включён медленный режим. Вы не можете отправить несколько сообщений за раз." + }, + "Chat.TitlePinnedMessages": { + "key": "Chat.TitlePinnedMessages", + "zeroValue": null, + "oneValue": "%@ закреплённое сообщение", + "twoValue": null, + "fewValue": "%@ закреплённых сообщения", + "manyValue": "%@ закреплённых сообщений", + "otherValue": "%@ закреплённых сообщения" + }, + "Chat.UnsendMyMessages": { + "key": "Chat.UnsendMyMessages", + "value": "Отозвать мои сообщения" + }, + "Chat.UnsendMyMessagesAlertTitle": { + "key": "Chat.UnsendMyMessagesAlertTitle", + "value": "Это действие удалит отправленные Вами сообщения и для Вас, и для %@." + }, + "ChatAdmins.AdminLabel": { + "key": "ChatAdmins.AdminLabel", + "value": "администратор" + }, + "ChatAdmins.AllMembersAreAdmins": { + "key": "ChatAdmins.AllMembersAreAdmins", + "value": "Права администратора у всех" + }, + "ChatAdmins.AllMembersAreAdminsOffHelp": { + "key": "ChatAdmins.AllMembersAreAdminsOffHelp", + "value": "Только админы могут добавлять и удалять участников, менять название и фото группы." + }, + "ChatAdmins.AllMembersAreAdminsOnHelp": { + "key": "ChatAdmins.AllMembersAreAdminsOnHelp", + "value": "Все участники могут добавлять новых участников, изменять имя и фото группы." + }, + "ChatAdmins.Title": { + "key": "ChatAdmins.Title", + "value": "Управление" + }, + "ChatContextMenu.TextSelectionTip": { + "key": "ChatContextMenu.TextSelectionTip", + "value": "Чтобы копировать нужный текст, выделите слово| и перемещайте курсор." + }, + "ChatImport.CreateGroupAlertImportAction": { + "key": "ChatImport.CreateGroupAlertImportAction", + "value": "Создать и импортировать" + }, + "ChatImport.CreateGroupAlertText": { + "key": "ChatImport.CreateGroupAlertText", + "value": "Создать группу **%@** и импортировать сообщения из другого мессенджера?" + }, + "ChatImport.CreateGroupAlertTitle": { + "key": "ChatImport.CreateGroupAlertTitle", + "value": "Создать группу и импортировать сообщения" + }, + "ChatImport.SelectionConfirmationAlertImportAction": { + "key": "ChatImport.SelectionConfirmationAlertImportAction", + "value": "Импорт" + }, + "ChatImport.SelectionConfirmationAlertTitle": { + "key": "ChatImport.SelectionConfirmationAlertTitle", + "value": "Импорт сообщений" + }, + "ChatImport.SelectionConfirmationGroupWithTitle": { + "key": "ChatImport.SelectionConfirmationGroupWithTitle", + "value": "Импортировать сообщения от **%1$@** в **%2$@**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их будете увидят все участники группы." + }, + "ChatImport.SelectionConfirmationGroupWithoutTitle": { + "key": "ChatImport.SelectionConfirmationGroupWithoutTitle", + "value": "Импортировать сообщения в **%@**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидят все участники группы." + }, + "ChatImport.SelectionConfirmationUserWithTitle": { + "key": "ChatImport.SelectionConfirmationUserWithTitle", + "value": "Импортировать сообщения от **%1$@** в чат с **%2$@**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидите и Вы, и собеседник." + }, + "ChatImport.SelectionConfirmationUserWithoutTitle": { + "key": "ChatImport.SelectionConfirmationUserWithoutTitle", + "value": "Импортировать сообщения в чат с **%@?**\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидите и Вы, и собеседник." + }, + "ChatImport.SelectionErrorGroupGeneric": { + "key": "ChatImport.SelectionErrorGroupGeneric", + "value": "Вы не можете импортировать историю в эту группу." + }, + "ChatImport.SelectionErrorNotAdmin": { + "key": "ChatImport.SelectionErrorNotAdmin", + "value": "Импортировать сообщения в группу могут только её администраторы." + }, + "ChatImport.Title": { + "key": "ChatImport.Title", + "value": "Выбор чата" + }, + "ChatImport.UserErrorNotMutual": { + "key": "ChatImport.UserErrorNotMutual", + "value": "Чтобы импортировать сообщения в личный чат, необходимо, чтобы Вы и собеседник были в списке контактов друг у друга." + }, + "ChatImportActivity.ErrorGeneric": { + "key": "ChatImportActivity.ErrorGeneric", + "value": "Произошла ошибка." + }, + "ChatImportActivity.ErrorInvalidChatType": { + "key": "ChatImportActivity.ErrorInvalidChatType", + "value": "Неправильный тип чата для сообщений, которые Вы попытались импортировать." + }, + "ChatImportActivity.ErrorLimitExceeded": { + "key": "ChatImportActivity.ErrorLimitExceeded", + "value": "Превышен дневной лимит,\nпопробуйте завтра." + }, + "ChatImportActivity.ErrorNotAdmin": { + "key": "ChatImportActivity.ErrorNotAdmin", + "value": "Для импорта сообщений необходимо быть админом группы." + }, + "ChatImportActivity.ErrorUserBlocked": { + "key": "ChatImportActivity.ErrorUserBlocked", + "value": "Невозможно импортировать сообщения из-за настроек конфиденциальности." + }, + "ChatImportActivity.InProgress": { + "key": "ChatImportActivity.InProgress", + "value": "Пожалуйста, не закрывайте это окно \nдо завершения импорта." + }, + "ChatImportActivity.OpenApp": { + "key": "ChatImportActivity.OpenApp", + "value": "Открыть Telegram" + }, + "ChatImportActivity.Retry": { + "key": "ChatImportActivity.Retry", + "value": "Повторить" + }, + "ChatImportActivity.Success": { + "key": "ChatImportActivity.Success", + "value": "Чат успешно\nимпортирован." + }, + "ChatImportActivity.Title": { + "key": "ChatImportActivity.Title", + "value": "Импорт чата" + }, + "ChatList.AddChatsToFolder": { + "key": "ChatList.AddChatsToFolder", + "value": "Добавить чаты" + }, + "ChatList.AddFolder": { + "key": "ChatList.AddFolder", + "value": "Добавить папку" + }, + "ChatList.AddedToFolderTooltip": { + "key": "ChatList.AddedToFolderTooltip", + "value": "Чат с %1$@ добавлен в папку «%2$@»" + }, + "ChatList.ArchiveAction": { + "key": "ChatList.ArchiveAction", + "value": "В архив" + }, + "ChatList.ArchivedChatsTitle": { + "key": "ChatList.ArchivedChatsTitle", + "value": "Архив" + }, + "ChatList.AutoarchiveSuggestion.OpenSettings": { + "key": "ChatList.AutoarchiveSuggestion.OpenSettings", + "value": "В настройки" + }, + "ChatList.AutoarchiveSuggestion.Text": { + "key": "ChatList.AutoarchiveSuggestion.Text", + "value": "Вам часто пишут пользователи не из списка контактов. Хотите, чтобы новые чаты с ними **автоматически** помещались в **Архив**, а **уведомления** о них были **выключены**?" + }, + "ChatList.AutoarchiveSuggestion.Title": { + "key": "ChatList.AutoarchiveSuggestion.Title", + "value": "Скрывать новые чаты?" + }, + "ChatList.ChatTypesSection": { + "key": "ChatList.ChatTypesSection", + "value": "ТИПЫ ЧАТОВ" + }, + "ChatList.ClearChatConfirmation": { + "key": "ChatList.ClearChatConfirmation", + "value": "Вы точно хотите удалить все сообщения в чате с %@?" + }, + "ChatList.Context.AddToContacts": { + "key": "ChatList.Context.AddToContacts", + "value": "Добавить в контакты" + }, + "ChatList.Context.AddToFolder": { + "key": "ChatList.Context.AddToFolder", + "value": "Добавить в папку" + }, + "ChatList.Context.Archive": { + "key": "ChatList.Context.Archive", + "value": "Архивировать" + }, + "ChatList.Context.Back": { + "key": "ChatList.Context.Back", + "value": "Назад" + }, + "ChatList.Context.Delete": { + "key": "ChatList.Context.Delete", + "value": "Удалить" + }, + "ChatList.Context.HideArchive": { + "key": "ChatList.Context.HideArchive", + "value": "Скрыть над списком чатов" + }, + "ChatList.Context.JoinChannel": { + "key": "ChatList.Context.JoinChannel", + "value": "Присоединиться" + }, + "ChatList.Context.MarkAllAsRead": { + "key": "ChatList.Context.MarkAllAsRead", + "value": "Прочитать все" + }, + "ChatList.Context.MarkAsRead": { + "key": "ChatList.Context.MarkAsRead", + "value": "Пометить как прочитанное" + }, + "ChatList.Context.MarkAsUnread": { + "key": "ChatList.Context.MarkAsUnread", + "value": "Пометить как новое" + }, + "ChatList.Context.Mute": { + "key": "ChatList.Context.Mute", + "value": "Выключить уведомления" + }, + "ChatList.Context.Pin": { + "key": "ChatList.Context.Pin", + "value": "Закрепить" + }, + "ChatList.Context.RemoveFromFolder": { + "key": "ChatList.Context.RemoveFromFolder", + "value": "Убрать из папки" + }, + "ChatList.Context.RemoveFromRecents": { + "key": "ChatList.Context.RemoveFromRecents", + "value": "Убрать из недавних" + }, + "ChatList.Context.Unarchive": { + "key": "ChatList.Context.Unarchive", + "value": "Вернуть из архива" + }, + "ChatList.Context.UnhideArchive": { + "key": "ChatList.Context.UnhideArchive", + "value": "Закрепить в списке чатов" + }, + "ChatList.Context.Unmute": { + "key": "ChatList.Context.Unmute", + "value": "Включить уведомления" + }, + "ChatList.Context.Unpin": { + "key": "ChatList.Context.Unpin", + "value": "Открепить" + }, + "ChatList.DeleteAndLeaveGroupConfirmation": { + "key": "ChatList.DeleteAndLeaveGroupConfirmation", + "value": "Вы точно хотите покинуть и удалить %@?" + }, + "ChatList.DeleteChat": { + "key": "ChatList.DeleteChat", + "value": "Удалить чат" + }, + "ChatList.DeleteChatConfirmation": { + "key": "ChatList.DeleteChatConfirmation", + "value": "Вы точно хотите удалить чат\nс %@?" + }, + "ChatList.DeleteConfirmation": { + "key": "ChatList.DeleteConfirmation", + "zeroValue": null, + "oneValue": "Удалить %@ чат", + "twoValue": null, + "fewValue": "Удалить %@ чата", + "manyValue": "Удалить %@ чатов", + "otherValue": "Удалить %@ чатов" + }, + "ChatList.DeleteForAllMembers": { + "key": "ChatList.DeleteForAllMembers", + "value": "Удалить для всех" + }, + "ChatList.DeleteForAllMembersConfirmationText": { + "key": "ChatList.DeleteForAllMembersConfirmationText", + "value": "Это **удалит все сообщения** в этом чате для **всех участников**." + }, + "ChatList.DeleteForAllSubscribers": { + "key": "ChatList.DeleteForAllSubscribers", + "value": "Удалить для всех" + }, + "ChatList.DeleteForAllSubscribersConfirmationText": { + "key": "ChatList.DeleteForAllSubscribersConfirmationText", + "value": "Это **удалит все сообщения** в этом канале для **всех участников**." + }, + "ChatList.DeleteForCurrentUser": { + "key": "ChatList.DeleteForCurrentUser", + "value": "Удалить только у себя" + }, + "ChatList.DeleteForEveryone": { + "key": "ChatList.DeleteForEveryone", + "value": "Удалить у меня и %@" + }, + "ChatList.DeleteForEveryoneConfirmationAction": { + "key": "ChatList.DeleteForEveryoneConfirmationAction", + "value": "Удалить всё" + }, + "ChatList.DeleteForEveryoneConfirmationText": { + "key": "ChatList.DeleteForEveryoneConfirmationText", + "value": "Это **удалит все сообщения** в чате для **обоих участников**." + }, + "ChatList.DeleteForEveryoneConfirmationTitle": { + "key": "ChatList.DeleteForEveryoneConfirmationTitle", + "value": "Внимание!" + }, + "ChatList.DeleteSavedMessagesConfirmation": { + "key": "ChatList.DeleteSavedMessagesConfirmation", + "value": "Вы точно хотите удалить\nчат «Избранное»?" + }, + "ChatList.DeleteSavedMessagesConfirmationAction": { + "key": "ChatList.DeleteSavedMessagesConfirmationAction", + "value": "Удалить всё" + }, + "ChatList.DeleteSavedMessagesConfirmationText": { + "key": "ChatList.DeleteSavedMessagesConfirmationText", + "value": "Это **удалит все сообщения** в чате." + }, + "ChatList.DeleteSavedMessagesConfirmationTitle": { + "key": "ChatList.DeleteSavedMessagesConfirmationTitle", + "value": "Внимание!" + }, + "ChatList.DeleteSecretChatConfirmation": { + "key": "ChatList.DeleteSecretChatConfirmation", + "value": "Вы точно хотите удалить секретный чат\nс %@?" + }, + "ChatList.DeletedChats": { + "key": "ChatList.DeletedChats", + "zeroValue": null, + "oneValue": "Удален %@ чат", + "twoValue": null, + "fewValue": "Удалено %@ чата", + "manyValue": "Удалено %@ чатов", + "otherValue": "Удалено %@ чатов" + }, + "ChatList.EditFolder": { + "key": "ChatList.EditFolder", + "value": "Настроить папку" + }, + "ChatList.EditFolders": { + "key": "ChatList.EditFolders", + "value": "Настроить папки" + }, + "ChatList.EmptyChatFilterList": { + "key": "ChatList.EmptyChatFilterList", + "value": "Эта папка пуста." + }, + "ChatList.EmptyChatList": { + "key": "ChatList.EmptyChatList", + "value": "Чатов пока нет." + }, + "ChatList.EmptyChatListEditFilter": { + "key": "ChatList.EmptyChatListEditFilter", + "value": "Настроить папку" + }, + "ChatList.EmptyChatListFilterText": { + "key": "ChatList.EmptyChatListFilterText", + "value": "В этой папке пока нет чатов." + }, + "ChatList.EmptyChatListFilterTitle": { + "key": "ChatList.EmptyChatListFilterTitle", + "value": "Папка пуста." + }, + "ChatList.EmptyChatListNewMessage": { + "key": "ChatList.EmptyChatListNewMessage", + "value": "Новое сообщение" + }, + "ChatList.FolderAllChats": { + "key": "ChatList.FolderAllChats", + "value": "Все чаты" + }, + "ChatList.GenericPsaAlert": { + "key": "ChatList.GenericPsaAlert", + "value": "Это канал для экстренных оповещений." + }, + "ChatList.GenericPsaLabel": { + "key": "ChatList.GenericPsaLabel", + "value": "PSA" + }, + "ChatList.HeaderImportIntoAnExistingGroup": { + "key": "ChatList.HeaderImportIntoAnExistingGroup", + "value": "ВЫБЕРИТЕ ЧАТ ДЛЯ ИМПОРТА СООБЩЕНИЙ" + }, + "ChatList.HideAction": { + "key": "ChatList.HideAction", + "value": "Скрыть" + }, + "ChatList.LeaveGroupConfirmation": { + "key": "ChatList.LeaveGroupConfirmation", + "value": "Вы точно хотите покинуть %@?" + }, + "ChatList.MessageFiles": { + "key": "ChatList.MessageFiles", + "zeroValue": null, + "oneValue": "%@ файл", + "twoValue": null, + "fewValue": "%@ файла", + "manyValue": "%@ файлов", + "otherValue": "%@ файла" + }, + "ChatList.MessageMusic": { + "key": "ChatList.MessageMusic", + "zeroValue": null, + "oneValue": "%@ файл с музыкой", + "twoValue": null, + "fewValue": "%@ файла с музыкой", + "manyValue": "%@ файлов с музыкой", + "otherValue": "%@ файла с музыкой" + }, + "ChatList.MessagePhotos": { + "key": "ChatList.MessagePhotos", + "zeroValue": null, + "oneValue": "%@ фото", + "twoValue": null, + "fewValue": "%@ фото", + "manyValue": "%@ фото", + "otherValue": "%@ фото" + }, + "ChatList.MessageVideos": { + "key": "ChatList.MessageVideos", + "zeroValue": null, + "oneValue": "%@ видео", + "twoValue": null, + "fewValue": "%@ видео", + "manyValue": "%@ видео", + "otherValue": "%@ видео" + }, + "ChatList.Mute": { + "key": "ChatList.Mute", + "value": "Убрать звук" + }, + "ChatList.PeerTypeBot": { + "key": "ChatList.PeerTypeBot", + "value": "бот" + }, + "ChatList.PeerTypeChannel": { + "key": "ChatList.PeerTypeChannel", + "value": "канал" + }, + "ChatList.PeerTypeContact": { + "key": "ChatList.PeerTypeContact", + "value": "контакт" + }, + "ChatList.PeerTypeGroup": { + "key": "ChatList.PeerTypeGroup", + "value": "группа" + }, + "ChatList.PeerTypeNonContact": { + "key": "ChatList.PeerTypeNonContact", + "value": "не контакт" + }, + "ChatList.PsaAlert.covid": { + "key": "ChatList.PsaAlert.covid", + "value": "Это экстренная новость о пандемии COVID-19. Подробнее об этой инициативе: https://telegram.org/blog/coronavirus" + }, + "ChatList.PsaLabel.covid": { + "key": "ChatList.PsaLabel.covid", + "value": "COVID-19" + }, + "ChatList.Read": { + "key": "ChatList.Read", + "value": "Прочитать" + }, + "ChatList.ReadAll": { + "key": "ChatList.ReadAll", + "value": "Прочит. все" + }, + "ChatList.RemoveFolder": { + "key": "ChatList.RemoveFolder", + "value": "Убрать" + }, + "ChatList.RemoveFolderAction": { + "key": "ChatList.RemoveFolderAction", + "value": "Удалить" + }, + "ChatList.RemoveFolderConfirmation": { + "key": "ChatList.RemoveFolderConfirmation", + "value": "Папка будет удалена из списка. Это не затронет чаты, которые в ней находятся." + }, + "ChatList.RemovedFromFolderTooltip": { + "key": "ChatList.RemovedFromFolderTooltip", + "value": "Чат с %1$@ удален из папки «%2$@»" + }, + "ChatList.ReorderTabs": { + "key": "ChatList.ReorderTabs", + "value": "Изменить порядок" + }, + "ChatList.Search.FilterChats": { + "key": "ChatList.Search.FilterChats", + "value": "Чаты" + }, + "ChatList.Search.FilterFiles": { + "key": "ChatList.Search.FilterFiles", + "value": "Файлы" + }, + "ChatList.Search.FilterLinks": { + "key": "ChatList.Search.FilterLinks", + "value": "Ссылки" + }, + "ChatList.Search.FilterMedia": { + "key": "ChatList.Search.FilterMedia", + "value": "Медиа" + }, + "ChatList.Search.FilterMusic": { + "key": "ChatList.Search.FilterMusic", + "value": "Музыка" + }, + "ChatList.Search.FilterVoice": { + "key": "ChatList.Search.FilterVoice", + "value": "Голосовые" + }, + "ChatList.Search.NoResults": { + "key": "ChatList.Search.NoResults", + "value": "Нет результатов" + }, + "ChatList.Search.NoResultsDescription": { + "key": "ChatList.Search.NoResultsDescription", + "value": "Ничего не найдено.\nПопробуйте снова." + }, + "ChatList.Search.NoResultsFilter": { + "key": "ChatList.Search.NoResultsFilter", + "value": "Сообщений пока нет" + }, + "ChatList.Search.NoResultsFitlerFiles": { + "key": "ChatList.Search.NoResultsFitlerFiles", + "value": "Здесь будут показаны все файлы из Ваших чатов." + }, + "ChatList.Search.NoResultsFitlerLinks": { + "key": "ChatList.Search.NoResultsFitlerLinks", + "value": "Здесь будут показаны все ссылки из Ваших чатов." + }, + "ChatList.Search.NoResultsFitlerMedia": { + "key": "ChatList.Search.NoResultsFitlerMedia", + "value": "Здесь будут показаны фотографии и видео из Ваших чатов." + }, + "ChatList.Search.NoResultsFitlerMusic": { + "key": "ChatList.Search.NoResultsFitlerMusic", + "value": "Здесь будут показана вся музыка из Ваших чатов." + }, + "ChatList.Search.NoResultsFitlerVoice": { + "key": "ChatList.Search.NoResultsFitlerVoice", + "value": "Здесь будут показаны голосовые сообщения и видеосообщения из Ваших чатов." + }, + "ChatList.Search.NoResultsQueryDescription": { + "key": "ChatList.Search.NoResultsQueryDescription", + "value": "По запросу «%@» ничего не найдено.\nПопробуйте снова." + }, + "ChatList.Search.ShowLess": { + "key": "ChatList.Search.ShowLess", + "value": "Показать меньше" + }, + "ChatList.Search.ShowMore": { + "key": "ChatList.Search.ShowMore", + "value": "Показать больше" + }, + "ChatList.SelectedChats": { + "key": "ChatList.SelectedChats", + "zeroValue": null, + "oneValue": "Выбран %@ чат", + "twoValue": null, + "fewValue": "Выбрано %@ чата", + "manyValue": "Выбрано %@ чатов", + "otherValue": "Выбрано %@ чатов" + }, + "ChatList.TabIconFoldersTooltipEmptyFolders": { + "key": "ChatList.TabIconFoldersTooltipEmptyFolders", + "value": "Нажмите и удерживайте, чтобы создать папки для чатов." + }, + "ChatList.TabIconFoldersTooltipNonEmptyFolders": { + "key": "ChatList.TabIconFoldersTooltipNonEmptyFolders", + "value": "Удерживайте кнопку 'Чаты', чтобы настроить или выбрать папки." + }, + "ChatList.Tabs.All": { + "key": "ChatList.Tabs.All", + "value": "Все" + }, + "ChatList.Tabs.AllChats": { + "key": "ChatList.Tabs.AllChats", + "value": "Все чаты" + }, + "ChatList.UnarchiveAction": { + "key": "ChatList.UnarchiveAction", + "value": "Вернуть" + }, + "ChatList.UndoArchiveHiddenText": { + "key": "ChatList.UndoArchiveHiddenText", + "value": "Потяните вниз, чтобы увидеть архив." + }, + "ChatList.UndoArchiveHiddenTitle": { + "key": "ChatList.UndoArchiveHiddenTitle", + "value": "Архив скрыт" + }, + "ChatList.UndoArchiveMultipleTitle": { + "key": "ChatList.UndoArchiveMultipleTitle", + "value": "Чаты перенесены в архив" + }, + "ChatList.UndoArchiveRevealedText": { + "key": "ChatList.UndoArchiveRevealedText", + "value": "Смахните влево, чтобы скрыть архив." + }, + "ChatList.UndoArchiveRevealedTitle": { + "key": "ChatList.UndoArchiveRevealedTitle", + "value": "Архив закреплён" + }, + "ChatList.UndoArchiveText1": { + "key": "ChatList.UndoArchiveText1", + "value": "Смахните влево, чтобы скрыть архив." + }, + "ChatList.UndoArchiveTitle": { + "key": "ChatList.UndoArchiveTitle", + "value": "Чат перенесён в архив" + }, + "ChatList.UnhideAction": { + "key": "ChatList.UnhideAction", + "value": "Закрепить" + }, + "ChatList.Unmute": { + "key": "ChatList.Unmute", + "value": "Вкл. звук" + }, + "ChatListFilter.AddChatsTitle": { + "key": "ChatListFilter.AddChatsTitle", + "value": "Найти чат..." + }, + "ChatListFilter.ShowMoreChats": { + "key": "ChatListFilter.ShowMoreChats", + "zeroValue": null, + "oneValue": "Показать ещё %@", + "twoValue": null, + "fewValue": "Показать ещё %@", + "manyValue": "Показать ещё %@", + "otherValue": "Показать ещё %@" + }, + "ChatListFolder.AddChats": { + "key": "ChatListFolder.AddChats", + "value": "Добавить чаты" + }, + "ChatListFolder.CategoryArchived": { + "key": "ChatListFolder.CategoryArchived", + "value": "Архивированные" + }, + "ChatListFolder.CategoryBots": { + "key": "ChatListFolder.CategoryBots", + "value": "Боты" + }, + "ChatListFolder.CategoryChannels": { + "key": "ChatListFolder.CategoryChannels", + "value": "Каналы" + }, + "ChatListFolder.CategoryContacts": { + "key": "ChatListFolder.CategoryContacts", + "value": "Контакты" + }, + "ChatListFolder.CategoryGroups": { + "key": "ChatListFolder.CategoryGroups", + "value": "Группы" + }, + "ChatListFolder.CategoryMuted": { + "key": "ChatListFolder.CategoryMuted", + "value": "Без уведомлений" + }, + "ChatListFolder.CategoryNonContacts": { + "key": "ChatListFolder.CategoryNonContacts", + "value": "Не контакты" + }, + "ChatListFolder.CategoryRead": { + "key": "ChatListFolder.CategoryRead", + "value": "Прочитанные" + }, + "ChatListFolder.DiscardCancel": { + "key": "ChatListFolder.DiscardCancel", + "value": "Нет" + }, + "ChatListFolder.DiscardConfirmation": { + "key": "ChatListFolder.DiscardConfirmation", + "value": "Вы редактировали эту папку. Сбросить изменения?" + }, + "ChatListFolder.DiscardDiscard": { + "key": "ChatListFolder.DiscardDiscard", + "value": "Сбросить" + }, + "ChatListFolder.ExcludeChatsTitle": { + "key": "ChatListFolder.ExcludeChatsTitle", + "value": "Чаты не в папке" + }, + "ChatListFolder.ExcludeSectionInfo": { + "key": "ChatListFolder.ExcludeSectionInfo", + "value": "Выберите чаты или типы чатов, которые не нужно показывать в этой папке." + }, + "ChatListFolder.ExcludedSectionHeader": { + "key": "ChatListFolder.ExcludedSectionHeader", + "value": "ИСКЛЮЧЁННЫЕ ЧАТЫ" + }, + "ChatListFolder.IncludeChatsTitle": { + "key": "ChatListFolder.IncludeChatsTitle", + "value": "Чаты в папке" + }, + "ChatListFolder.IncludeSectionInfo": { + "key": "ChatListFolder.IncludeSectionInfo", + "value": "Выберите чаты или типы чатов, которые нужно показывать в этой папке." + }, + "ChatListFolder.IncludedSectionHeader": { + "key": "ChatListFolder.IncludedSectionHeader", + "value": "ВЫБРАННЫЕ ЧАТЫ" + }, + "ChatListFolder.NameBots": { + "key": "ChatListFolder.NameBots", + "value": "Боты" + }, + "ChatListFolder.NameChannels": { + "key": "ChatListFolder.NameChannels", + "value": "Каналы" + }, + "ChatListFolder.NameContacts": { + "key": "ChatListFolder.NameContacts", + "value": "Контакты" + }, + "ChatListFolder.NameGroups": { + "key": "ChatListFolder.NameGroups", + "value": "Группы" + }, + "ChatListFolder.NameNonContacts": { + "key": "ChatListFolder.NameNonContacts", + "value": "Не контакты" + }, + "ChatListFolder.NameNonMuted": { + "key": "ChatListFolder.NameNonMuted", + "value": "Важные" + }, + "ChatListFolder.NamePlaceholder": { + "key": "ChatListFolder.NamePlaceholder", + "value": "Название папки" + }, + "ChatListFolder.NameSectionHeader": { + "key": "ChatListFolder.NameSectionHeader", + "value": "НАЗВАНИЕ ПАПКИ" + }, + "ChatListFolder.NameUnread": { + "key": "ChatListFolder.NameUnread", + "value": "Новые" + }, + "ChatListFolder.TitleCreate": { + "key": "ChatListFolder.TitleCreate", + "value": "Новая папка" + }, + "ChatListFolder.TitleEdit": { + "key": "ChatListFolder.TitleEdit", + "value": "Настройки папки" + }, + "ChatListFolderSettings.AddRecommended": { + "key": "ChatListFolderSettings.AddRecommended", + "value": "СОЗДАТЬ" + }, + "ChatListFolderSettings.EditFoldersInfo": { + "key": "ChatListFolderSettings.EditFoldersInfo", + "value": "Чтобы удалить папку или изменить порядок, нажмите \"Изм\"." + }, + "ChatListFolderSettings.FoldersSection": { + "key": "ChatListFolderSettings.FoldersSection", + "value": "ПАПКИ" + }, + "ChatListFolderSettings.Info": { + "key": "ChatListFolderSettings.Info", + "value": "Вы можете создать папки с нужными чатами и переключаться между ними." + }, + "ChatListFolderSettings.NewFolder": { + "key": "ChatListFolderSettings.NewFolder", + "value": "Создать новую папку" + }, + "ChatListFolderSettings.RecommendedFoldersSection": { + "key": "ChatListFolderSettings.RecommendedFoldersSection", + "value": "РЕКОМЕНДОВАННЫЕ ПАПКИ" + }, + "ChatListFolderSettings.RecommendedNewFolder": { + "key": "ChatListFolderSettings.RecommendedNewFolder", + "value": "Создать свою папку" + }, + "ChatListFolderSettings.Title": { + "key": "ChatListFolderSettings.Title", + "value": "Папки" + }, + "ChatSearch.ResultsTooltip": { + "key": "ChatSearch.ResultsTooltip", + "value": "Перейти к списку" + }, + "ChatSearch.SearchPlaceholder": { + "key": "ChatSearch.SearchPlaceholder", + "value": "Поиск" + }, + "ChatSettings.Appearance": { + "key": "ChatSettings.Appearance", + "value": "ВНЕШНИЙ ВИД" + }, + "ChatSettings.AutoDownloadDocuments": { + "key": "ChatSettings.AutoDownloadDocuments", + "value": "Файлы" + }, + "ChatSettings.AutoDownloadEnabled": { + "key": "ChatSettings.AutoDownloadEnabled", + "value": "Загружать автоматически" + }, + "ChatSettings.AutoDownloadPhotos": { + "key": "ChatSettings.AutoDownloadPhotos", + "value": "Фотографии" + }, + "ChatSettings.AutoDownloadReset": { + "key": "ChatSettings.AutoDownloadReset", + "value": "Сбросить настройки автозагрузки" + }, + "ChatSettings.AutoDownloadSettings.Delimeter": { + "key": "ChatSettings.AutoDownloadSettings.Delimeter", + "value": ", " + }, + "ChatSettings.AutoDownloadSettings.OffForAll": { + "key": "ChatSettings.AutoDownloadSettings.OffForAll", + "value": "выключена" + }, + "ChatSettings.AutoDownloadSettings.TypeFile": { + "key": "ChatSettings.AutoDownloadSettings.TypeFile", + "value": "файлы (%@)" + }, + "ChatSettings.AutoDownloadSettings.TypePhoto": { + "key": "ChatSettings.AutoDownloadSettings.TypePhoto", + "value": "фото" + }, + "ChatSettings.AutoDownloadSettings.TypeVideo": { + "key": "ChatSettings.AutoDownloadSettings.TypeVideo", + "value": "видео (%@)" + }, + "ChatSettings.AutoDownloadTitle": { + "key": "ChatSettings.AutoDownloadTitle", + "value": "АВТОЗАГРУЗКА МЕДИА" + }, + "ChatSettings.AutoDownloadUsingCellular": { + "key": "ChatSettings.AutoDownloadUsingCellular", + "value": "Через мобильную сеть" + }, + "ChatSettings.AutoDownloadUsingWiFi": { + "key": "ChatSettings.AutoDownloadUsingWiFi", + "value": "Через Wi-Fi" + }, + "ChatSettings.AutoDownloadVideoMessages": { + "key": "ChatSettings.AutoDownloadVideoMessages", + "value": "Видеосообщения" + }, + "ChatSettings.AutoDownloadVideos": { + "key": "ChatSettings.AutoDownloadVideos", + "value": "Видео" + }, + "ChatSettings.AutoDownloadVoiceMessages": { + "key": "ChatSettings.AutoDownloadVoiceMessages", + "value": "Голосовые сообщения" + }, + "ChatSettings.AutoPlayAnimations": { + "key": "ChatSettings.AutoPlayAnimations", + "value": "Автозапуск GIF" + }, + "ChatSettings.AutoPlayGifs": { + "key": "ChatSettings.AutoPlayGifs", + "value": "GIF" + }, + "ChatSettings.AutoPlayTitle": { + "key": "ChatSettings.AutoPlayTitle", + "value": "АВТОВОСПРОИЗВЕДЕНИЕ" + }, + "ChatSettings.AutoPlayVideos": { + "key": "ChatSettings.AutoPlayVideos", + "value": "Видео" + }, + "ChatSettings.AutomaticAudioDownload": { + "key": "ChatSettings.AutomaticAudioDownload", + "value": "АВТОЗАГРУЗКА АУДИО" + }, + "ChatSettings.AutomaticPhotoDownload": { + "key": "ChatSettings.AutomaticPhotoDownload", + "value": "АВТОЗАГРУЗКА ФОТО" + }, + "ChatSettings.AutomaticVideoMessageDownload": { + "key": "ChatSettings.AutomaticVideoMessageDownload", + "value": "АВТОЗАГРУЗКА ВИДЕОСООБЩЕНИЙ" + }, + "ChatSettings.Cache": { + "key": "ChatSettings.Cache", + "value": "Использование памяти" + }, + "ChatSettings.ConnectionType.Title": { + "key": "ChatSettings.ConnectionType.Title", + "value": "ТИП СОЕДИНЕНИЯ" + }, + "ChatSettings.ConnectionType.UseProxy": { + "key": "ChatSettings.ConnectionType.UseProxy", + "value": "Использовать прокси" + }, + "ChatSettings.ConnectionType.UseSocks5": { + "key": "ChatSettings.ConnectionType.UseSocks5", + "value": "SOCKS5" + }, + "ChatSettings.DownloadInBackground": { + "key": "ChatSettings.DownloadInBackground", + "value": "Фоновая загрузка" + }, + "ChatSettings.DownloadInBackgroundInfo": { + "key": "ChatSettings.DownloadInBackgroundInfo", + "value": "Когда Вы закрываете приложение, уже начатая загрузка мультимедиа будет продолжаться некоторое время." + }, + "ChatSettings.Groups": { + "key": "ChatSettings.Groups", + "value": "В групповых чатах" + }, + "ChatSettings.IntentsSettings": { + "key": "ChatSettings.IntentsSettings", + "value": "Меню «Поделиться»" + }, + "ChatSettings.OpenLinksIn": { + "key": "ChatSettings.OpenLinksIn", + "value": "Браузер" + }, + "ChatSettings.Other": { + "key": "ChatSettings.Other", + "value": "ДРУГИЕ" + }, + "ChatSettings.PrivateChats": { + "key": "ChatSettings.PrivateChats", + "value": "В личных чатах" + }, + "ChatSettings.Stickers": { + "key": "ChatSettings.Stickers", + "value": "Стикеры" + }, + "ChatSettings.TextSize": { + "key": "ChatSettings.TextSize", + "value": "Размер текста" + }, + "ChatSettings.TextSizeUnits": { + "key": "ChatSettings.TextSizeUnits", + "value": "пт" + }, + "ChatSettings.Title": { + "key": "ChatSettings.Title", + "value": "Данные и память" + }, + "ChatState.Connecting": { + "key": "ChatState.Connecting", + "value": "соединение..." + }, + "ChatState.ConnectingToProxy": { + "key": "ChatState.ConnectingToProxy", + "value": "подключение к прокси..." + }, + "ChatState.Updating": { + "key": "ChatState.Updating", + "value": "обновление..." + }, + "ChatState.WaitingForNetwork": { + "key": "ChatState.WaitingForNetwork", + "value": "ожидание сети..." + }, + "Checkout.Email": { + "key": "Checkout.Email", + "value": "Электронная почта" + }, + "Checkout.EnterPassword": { + "key": "Checkout.EnterPassword", + "value": "Введите пароль" + }, + "Checkout.ErrorGeneric": { + "key": "Checkout.ErrorGeneric", + "value": "При обработке платежа произошла ошибка. Деньги с карты не были списаны." + }, + "Checkout.ErrorInvoiceAlreadyPaid": { + "key": "Checkout.ErrorInvoiceAlreadyPaid", + "value": "Вы уже оплатили этот товар." + }, + "Checkout.ErrorPaymentFailed": { + "key": "Checkout.ErrorPaymentFailed", + "value": "Платёж проведён неуспешно. Счёт не был выставлен." + }, + "Checkout.ErrorPrecheckoutFailed": { + "key": "Checkout.ErrorPrecheckoutFailed", + "value": "Бот не смог провести Ваш платёж. С карты не были списаны деньги." + }, + "Checkout.ErrorProviderAccountInvalid": { + "key": "Checkout.ErrorProviderAccountInvalid", + "value": "Этот бот сейчас не может принимать платежи. Пожалуйста, попробуйте позднее." + }, + "Checkout.ErrorProviderAccountTimeout": { + "key": "Checkout.ErrorProviderAccountTimeout", + "value": "В данный момент этот бот не может провести платеж. Пожалуйста, попробуйте позже." + }, + "Checkout.LiabilityAlert": { + "key": "Checkout.LiabilityAlert", + "value": "Ни Telegram, ни %1$@ не будут иметь доступа к Вашей платёжной информации. Все реквизиты карт обрабатываются только платёжной системой, %2$@.\n\nОплата осуществляется напрямую разработчику %1$@. Telegram не может предоставить никаких гарантий. В случае любых проблем, пожалуйста, свяжитесь с разработчиком %1$@ или своим банком." + }, + "Checkout.LiabilityAlertTitle": { + "key": "Checkout.LiabilityAlertTitle", + "value": "Внимание" + }, + "Checkout.Name": { + "key": "Checkout.Name", + "value": "Имя" + }, + "Checkout.NewCard.CardholderNamePlaceholder": { + "key": "Checkout.NewCard.CardholderNamePlaceholder", + "value": "Имя держателя карты" + }, + "Checkout.NewCard.CardholderNameTitle": { + "key": "Checkout.NewCard.CardholderNameTitle", + "value": "ДЕРЖАТЕЛЬ КАРТЫ" + }, + "Checkout.NewCard.PaymentCard": { + "key": "Checkout.NewCard.PaymentCard", + "value": "ПЛАТЁЖНАЯ КАРТА" + }, + "Checkout.NewCard.PostcodePlaceholder": { + "key": "Checkout.NewCard.PostcodePlaceholder", + "value": "Индекс" + }, + "Checkout.NewCard.PostcodeTitle": { + "key": "Checkout.NewCard.PostcodeTitle", + "value": "ПЛАТЁЖНЫЙ АДРЕС" + }, + "Checkout.NewCard.SaveInfo": { + "key": "Checkout.NewCard.SaveInfo", + "value": "Сохранить платёжную информацию" + }, + "Checkout.NewCard.SaveInfoEnableHelp": { + "key": "Checkout.NewCard.SaveInfoEnableHelp", + "value": "Вы можете сохранить реквизиты, чтобы использовать их в будущем. Для этого, пожалуйста, [настройте двухэтапную аутентификацию]." + }, + "Checkout.NewCard.SaveInfoHelp": { + "key": "Checkout.NewCard.SaveInfoHelp", + "value": "Вы можете сохранить платежные данные, чтобы использовать их в будущем." + }, + "Checkout.NewCard.Title": { + "key": "Checkout.NewCard.Title", + "value": "Новая карта" + }, + "Checkout.PasswordEntry.Pay": { + "key": "Checkout.PasswordEntry.Pay", + "value": "Оплатить" + }, + "Checkout.PasswordEntry.Text": { + "key": "Checkout.PasswordEntry.Text", + "value": "У Вас сохранена карта %@. Чтобы оплатить этой картой, пожалуйста, введите пароль двухэтапной аутентификации." + }, + "Checkout.PasswordEntry.Title": { + "key": "Checkout.PasswordEntry.Title", + "value": "Подтверждение оплаты" + }, + "Checkout.PayNone": { + "key": "Checkout.PayNone", + "value": "Оплатить" + }, + "Checkout.PayPrice": { + "key": "Checkout.PayPrice", + "value": "Оплатить %@" + }, + "Checkout.PayWithFaceId": { + "key": "Checkout.PayWithFaceId", + "value": "Оплатить при помощи Face ID" + }, + "Checkout.PayWithTouchId": { + "key": "Checkout.PayWithTouchId", + "value": "Оплатить при помощи Touch ID" + }, + "Checkout.PaymentMethod": { + "key": "Checkout.PaymentMethod", + "value": "Способ оплаты" + }, + "Checkout.PaymentMethod.New": { + "key": "Checkout.PaymentMethod.New", + "value": "Новая карта..." + }, + "Checkout.PaymentMethod.Title": { + "key": "Checkout.PaymentMethod.Title", + "value": "Способ оплаты" + }, + "Checkout.Phone": { + "key": "Checkout.Phone", + "value": "Номер телефона" + }, + "Checkout.Receipt.Title": { + "key": "Checkout.Receipt.Title", + "value": "Чек" + }, + "Checkout.SavePasswordTimeout": { + "key": "Checkout.SavePasswordTimeout", + "value": "Хотите сохранить пароль для %@?" + }, + "Checkout.SavePasswordTimeoutAndFaceId": { + "key": "Checkout.SavePasswordTimeoutAndFaceId", + "value": "Хотите сохранить пароль на %@ и вместо этого использовать Face ID?" + }, + "Checkout.SavePasswordTimeoutAndTouchId": { + "key": "Checkout.SavePasswordTimeoutAndTouchId", + "value": "Хотите сохранить пароль на %@ и вместо этого использовать Touch ID?" + }, + "Checkout.ShippingAddress": { + "key": "Checkout.ShippingAddress", + "value": "Информация о доставке" + }, + "Checkout.ShippingMethod": { + "key": "Checkout.ShippingMethod", + "value": "Способ доставки" + }, + "Checkout.ShippingOption.Title": { + "key": "Checkout.ShippingOption.Title", + "value": "Способ доставки" + }, + "Checkout.Title": { + "key": "Checkout.Title", + "value": "Оплатить" + }, + "Checkout.TotalAmount": { + "key": "Checkout.TotalAmount", + "value": "Итого" + }, + "Checkout.TotalPaidAmount": { + "key": "Checkout.TotalPaidAmount", + "value": "Всего оплачено" + }, + "Checkout.WebConfirmation.Title": { + "key": "Checkout.WebConfirmation.Title", + "value": "Завершить оплату" + }, + "CheckoutInfo.ErrorCityInvalid": { + "key": "CheckoutInfo.ErrorCityInvalid", + "value": "Пожалуйста, введите существующий город." + }, + "CheckoutInfo.ErrorEmailInvalid": { + "key": "CheckoutInfo.ErrorEmailInvalid", + "value": "Введите корректный адрес электронной почты." + }, + "CheckoutInfo.ErrorNameInvalid": { + "key": "CheckoutInfo.ErrorNameInvalid", + "value": "Пожалуйста, введите корректное имя." + }, + "CheckoutInfo.ErrorPhoneInvalid": { + "key": "CheckoutInfo.ErrorPhoneInvalid", + "value": "Введите корректный номер телефона." + }, + "CheckoutInfo.ErrorPostcodeInvalid": { + "key": "CheckoutInfo.ErrorPostcodeInvalid", + "value": "Введите корректный почтовый индекс." + }, + "CheckoutInfo.ErrorShippingNotAvailable": { + "key": "CheckoutInfo.ErrorShippingNotAvailable", + "value": "Доставка в выбранную страну невозможна." + }, + "CheckoutInfo.ErrorStateInvalid": { + "key": "CheckoutInfo.ErrorStateInvalid", + "value": "Пожалуйста, введите существующую область." + }, + "CheckoutInfo.Pay": { + "key": "CheckoutInfo.Pay", + "value": "Оплатить" + }, + "CheckoutInfo.ReceiverInfoEmail": { + "key": "CheckoutInfo.ReceiverInfoEmail", + "value": "Email" + }, + "CheckoutInfo.ReceiverInfoEmailPlaceholder": { + "key": "CheckoutInfo.ReceiverInfoEmailPlaceholder", + "value": "Email" + }, + "CheckoutInfo.ReceiverInfoName": { + "key": "CheckoutInfo.ReceiverInfoName", + "value": "Имя" + }, + "CheckoutInfo.ReceiverInfoNamePlaceholder": { + "key": "CheckoutInfo.ReceiverInfoNamePlaceholder", + "value": "Имя и фамилия" + }, + "CheckoutInfo.ReceiverInfoPhone": { + "key": "CheckoutInfo.ReceiverInfoPhone", + "value": "Телефон" + }, + "CheckoutInfo.ReceiverInfoTitle": { + "key": "CheckoutInfo.ReceiverInfoTitle", + "value": "ПОЛУЧАТЕЛЬ" + }, + "CheckoutInfo.SaveInfo": { + "key": "CheckoutInfo.SaveInfo", + "value": "Сохранить информацию" + }, + "CheckoutInfo.SaveInfoHelp": { + "key": "CheckoutInfo.SaveInfoHelp", + "value": "Вы можете сохранить адрес доставки, чтобы использовать его в будущем." + }, + "CheckoutInfo.ShippingInfoAddress1": { + "key": "CheckoutInfo.ShippingInfoAddress1", + "value": "Адрес 1" + }, + "CheckoutInfo.ShippingInfoAddress1Placeholder": { + "key": "CheckoutInfo.ShippingInfoAddress1Placeholder", + "value": "Адрес" + }, + "CheckoutInfo.ShippingInfoAddress2": { + "key": "CheckoutInfo.ShippingInfoAddress2", + "value": "Адрес 2" + }, + "CheckoutInfo.ShippingInfoAddress2Placeholder": { + "key": "CheckoutInfo.ShippingInfoAddress2Placeholder", + "value": "Адрес" + }, + "CheckoutInfo.ShippingInfoCity": { + "key": "CheckoutInfo.ShippingInfoCity", + "value": "Город" + }, + "CheckoutInfo.ShippingInfoCityPlaceholder": { + "key": "CheckoutInfo.ShippingInfoCityPlaceholder", + "value": "Город" + }, + "CheckoutInfo.ShippingInfoCountry": { + "key": "CheckoutInfo.ShippingInfoCountry", + "value": "Страна" + }, + "CheckoutInfo.ShippingInfoCountryPlaceholder": { + "key": "CheckoutInfo.ShippingInfoCountryPlaceholder", + "value": "Страна" + }, + "CheckoutInfo.ShippingInfoPostcode": { + "key": "CheckoutInfo.ShippingInfoPostcode", + "value": "Индекс" + }, + "CheckoutInfo.ShippingInfoPostcodePlaceholder": { + "key": "CheckoutInfo.ShippingInfoPostcodePlaceholder", + "value": "Индекс" + }, + "CheckoutInfo.ShippingInfoState": { + "key": "CheckoutInfo.ShippingInfoState", + "value": "Область" + }, + "CheckoutInfo.ShippingInfoStatePlaceholder": { + "key": "CheckoutInfo.ShippingInfoStatePlaceholder", + "value": "Область" + }, + "CheckoutInfo.ShippingInfoTitle": { + "key": "CheckoutInfo.ShippingInfoTitle", + "value": "АДРЕС ДОСТАВКИ" + }, + "CheckoutInfo.Title": { + "key": "CheckoutInfo.Title", + "value": "Информация о доставке" + }, + "ClearCache.Clear": { + "key": "ClearCache.Clear", + "value": "Очистить" + }, + "ClearCache.ClearCache": { + "key": "ClearCache.ClearCache", + "value": "Очистить кэш Telegram" + }, + "ClearCache.Description": { + "key": "ClearCache.Description", + "value": "Файлы будут удалены с Вашего устройства, но при необходимости их можно будет скачать снова." + }, + "ClearCache.Forever": { + "key": "ClearCache.Forever", + "value": "Всегда" + }, + "ClearCache.FreeSpace": { + "key": "ClearCache.FreeSpace", + "value": "Освободить место" + }, + "ClearCache.FreeSpaceDescription": { + "key": "ClearCache.FreeSpaceDescription", + "value": "Если Вы хотели бы освободить место на устройстве, удалять переписку не требуется.\n\nВ настройках кэша Вы можете удалить ненужные медиафайлы — и их можно будет снова скачать, если понадобится." + }, + "ClearCache.StorageCache": { + "key": "ClearCache.StorageCache", + "value": "Кэш Telegram" + }, + "ClearCache.StorageFree": { + "key": "ClearCache.StorageFree", + "value": "Свободно" + }, + "ClearCache.StorageOtherApps": { + "key": "ClearCache.StorageOtherApps", + "value": "Другие приложения" + }, + "ClearCache.StorageServiceFiles": { + "key": "ClearCache.StorageServiceFiles", + "value": "Служебные файлы Telegram" + }, + "ClearCache.StorageTitle": { + "key": "ClearCache.StorageTitle", + "value": "ХРАНИЛИЩЕ %@" + }, + "ClearCache.StorageUsage": { + "key": "ClearCache.StorageUsage", + "value": "Использование памяти" + }, + "ClearCache.Success": { + "key": "ClearCache.Success", + "value": "**%@** на %@ освободилось" + }, + "Clipboard.SendPhoto": { + "key": "Clipboard.SendPhoto", + "value": "Отправить фото" + }, + "CloudStorage.Title": { + "key": "CloudStorage.Title", + "value": "Облачное хранилище" + }, + "CommentsGroup.ErrorAccessDenied": { + "key": "CommentsGroup.ErrorAccessDenied", + "value": "У Вас нет доступа к этому чату, так как Вас заблокировал его администратор." + }, + "Common.ActionNotAllowedError": { + "key": "Common.ActionNotAllowedError", + "value": "К сожалению, Вам запрещено это действие." + }, + "Common.Back": { + "key": "Common.Back", + "value": "Назад" + }, + "Common.Cancel": { + "key": "Common.Cancel", + "value": "Отмена" + }, + "Common.ChoosePhoto": { + "key": "Common.ChoosePhoto", + "value": "Выбрать фото" + }, + "Common.Close": { + "key": "Common.Close", + "value": "Закрыть" + }, + "Common.Create": { + "key": "Common.Create", + "value": "Создать" + }, + "Common.Delete": { + "key": "Common.Delete", + "value": "Удалить" + }, + "Common.Done": { + "key": "Common.Done", + "value": "Готово" + }, + "Common.Edit": { + "key": "Common.Edit", + "value": "Изм." + }, + "Common.More": { + "key": "Common.More", + "value": "Ещё" + }, + "Common.Next": { + "key": "Common.Next", + "value": "Далее" + }, + "Common.No": { + "key": "Common.No", + "value": "Нет" + }, + "Common.NotNow": { + "key": "Common.NotNow", + "value": "Не сейчас" + }, + "Common.OK": { + "key": "Common.OK", + "value": "ОК" + }, + "Common.Save": { + "key": "Common.Save", + "value": "Сохранить" + }, + "Common.Search": { + "key": "Common.Search", + "value": "Поиск" + }, + "Common.Select": { + "key": "Common.Select", + "value": "Выбрать" + }, + "Common.TakePhoto": { + "key": "Common.TakePhoto", + "value": "Сделать снимок" + }, + "Common.TakePhotoOrVideo": { + "key": "Common.TakePhotoOrVideo", + "value": "Снять фото или видео" + }, + "Common.Yes": { + "key": "Common.Yes", + "value": "Да" + }, + "Common.edit": { + "key": "Common.edit", + "value": "Изменить" + }, + "Common.of": { + "key": "Common.of", + "value": "из" + }, + "Compose.ChannelMembers": { + "key": "Compose.ChannelMembers", + "value": "Участники" + }, + "Compose.ChannelTokenListPlaceholder": { + "key": "Compose.ChannelTokenListPlaceholder", + "value": "Поиск контактов или пользователей" + }, + "Compose.Create": { + "key": "Compose.Create", + "value": "Создать" + }, + "Compose.GroupTokenListPlaceholder": { + "key": "Compose.GroupTokenListPlaceholder", + "value": "Поиск контактов или пользователей" + }, + "Compose.NewChannel": { + "key": "Compose.NewChannel", + "value": "Создать канал" + }, + "Compose.NewEncryptedChat": { + "key": "Compose.NewEncryptedChat", + "value": "Создать секретный чат" + }, + "Compose.NewEncryptedChatTitle": { + "key": "Compose.NewEncryptedChatTitle", + "value": "Секретный чат" + }, + "Compose.NewGroup": { + "key": "Compose.NewGroup", + "value": "Создать группу" + }, + "Compose.NewGroupTitle": { + "key": "Compose.NewGroupTitle", + "value": "Группа" + }, + "Compose.NewMessage": { + "key": "Compose.NewMessage", + "value": "Написать сообщение" + }, + "Compose.TokenListPlaceholder": { + "key": "Compose.TokenListPlaceholder", + "value": "Кого бы Вы хотели пригласить?" + }, + "ContactInfo.BirthdayLabel": { + "key": "ContactInfo.BirthdayLabel", + "value": "день рождения" + }, + "ContactInfo.Job": { + "key": "ContactInfo.Job", + "value": "работа" + }, + "ContactInfo.Note": { + "key": "ContactInfo.Note", + "value": "заметка" + }, + "ContactInfo.PhoneLabelHome": { + "key": "ContactInfo.PhoneLabelHome", + "value": "дом" + }, + "ContactInfo.PhoneLabelHomeFax": { + "key": "ContactInfo.PhoneLabelHomeFax", + "value": "домашний факс" + }, + "ContactInfo.PhoneLabelMain": { + "key": "ContactInfo.PhoneLabelMain", + "value": "главный" + }, + "ContactInfo.PhoneLabelMobile": { + "key": "ContactInfo.PhoneLabelMobile", + "value": "мобильный" + }, + "ContactInfo.PhoneLabelOther": { + "key": "ContactInfo.PhoneLabelOther", + "value": "другой" + }, + "ContactInfo.PhoneLabelPager": { + "key": "ContactInfo.PhoneLabelPager", + "value": "пейджер" + }, + "ContactInfo.PhoneLabelWork": { + "key": "ContactInfo.PhoneLabelWork", + "value": "рабочий" + }, + "ContactInfo.PhoneLabelWorkFax": { + "key": "ContactInfo.PhoneLabelWorkFax", + "value": "рабочий факс" + }, + "ContactInfo.PhoneNumberHidden": { + "key": "ContactInfo.PhoneNumberHidden", + "value": "Скрыт" + }, + "ContactInfo.Title": { + "key": "ContactInfo.Title", + "value": "Контактная информация" + }, + "ContactInfo.URLLabelHomepage": { + "key": "ContactInfo.URLLabelHomepage", + "value": "на главную" + }, + "ContactList.Context.Call": { + "key": "ContactList.Context.Call", + "value": "Позвонить" + }, + "ContactList.Context.SendMessage": { + "key": "ContactList.Context.SendMessage", + "value": "Отправить сообщение" + }, + "ContactList.Context.StartSecretChat": { + "key": "ContactList.Context.StartSecretChat", + "value": "Начать секретный чат" + }, + "ContactList.Context.VideoCall": { + "key": "ContactList.Context.VideoCall", + "value": "Видеозвонок" + }, + "Contacts.AccessDeniedError": { + "key": "Contacts.AccessDeniedError", + "value": "Требуется доступ к контактам" + }, + "Contacts.AccessDeniedHelpLandscape": { + "key": "Contacts.AccessDeniedHelpLandscape", + "value": "Пожалуйста, зайдите в настройки %@ > Конфиденциальность > Контакты и разрешите доступ для Telegram." + }, + "Contacts.AccessDeniedHelpON": { + "key": "Contacts.AccessDeniedHelpON", + "value": "ВКЛ" + }, + "Contacts.AccessDeniedHelpPortrait": { + "key": "Contacts.AccessDeniedHelpPortrait", + "value": "Пожалуйста, перейдите в настройки %@ > Конфиденциальность > Контакты и разрешите доступ для Telegram." + }, + "Contacts.AddPeopleNearby": { + "key": "Contacts.AddPeopleNearby", + "value": "Найти людей рядом" + }, + "Contacts.AddPhoneNumber": { + "key": "Contacts.AddPhoneNumber", + "value": "Добавить %@" + }, + "Contacts.DeselectAll": { + "key": "Contacts.DeselectAll", + "value": "Снять выделение" + }, + "Contacts.FailedToSendInvitesMessage": { + "key": "Contacts.FailedToSendInvitesMessage", + "value": "Произошла ошибка." + }, + "Contacts.GlobalSearch": { + "key": "Contacts.GlobalSearch", + "value": "Глобальный поиск" + }, + "Contacts.ImportersCount": { + "key": "Contacts.ImportersCount", + "zeroValue": null, + "oneValue": "%@ контакт в Telegram", + "twoValue": null, + "fewValue": "%@ контакта в Telegram", + "manyValue": "%@ контактов в Telegram", + "otherValue": "%@ контактов в Telegram" + }, + "Contacts.InviteContacts": { + "key": "Contacts.InviteContacts", + "zeroValue": null, + "oneValue": "Пригласить %@ контакт", + "twoValue": null, + "fewValue": "Пригласить %@ контакта", + "manyValue": "Пригласить %@ контактов", + "otherValue": "Пригласить %@ контактов" + }, + "Contacts.InviteFriends": { + "key": "Contacts.InviteFriends", + "value": "Пригласить" + }, + "Contacts.InviteSearchLabel": { + "key": "Contacts.InviteSearchLabel", + "value": "Поиск контактов" + }, + "Contacts.InviteToTelegram": { + "key": "Contacts.InviteToTelegram", + "value": "Пригласить в Telegram" + }, + "Contacts.MemberSearchSectionTitleGroup": { + "key": "Contacts.MemberSearchSectionTitleGroup", + "value": "Участники группы" + }, + "Contacts.NotRegisteredSection": { + "key": "Contacts.NotRegisteredSection", + "value": "Телефонная книга" + }, + "Contacts.PermissionsAllow": { + "key": "Contacts.PermissionsAllow", + "value": "Разрешить доступ" + }, + "Contacts.PermissionsAllowInSettings": { + "key": "Contacts.PermissionsAllowInSettings", + "value": "Разрешить в настройках" + }, + "Contacts.PermissionsEnable": { + "key": "Contacts.PermissionsEnable", + "value": "Включить" + }, + "Contacts.PermissionsKeepDisabled": { + "key": "Contacts.PermissionsKeepDisabled", + "value": "Не включать" + }, + "Contacts.PermissionsSuppressWarningText": { + "key": "Contacts.PermissionsSuppressWarningText", + "value": "Вы не увидите, что кто-то из друзей начал пользоваться Telegram и теперь ему можно написать. Рекомендуем разрешить доступ к контактам в системных настройках." + }, + "Contacts.PermissionsSuppressWarningTitle": { + "key": "Contacts.PermissionsSuppressWarningTitle", + "value": "Оставить контакты выключенными?" + }, + "Contacts.PermissionsText": { + "key": "Contacts.PermissionsText", + "value": "Разрешите приложению доступ к контактам, чтобы сразу видеть в нём Ваших друзей." + }, + "Contacts.PermissionsTitle": { + "key": "Contacts.PermissionsTitle", + "value": "Доступ к контактам" + }, + "Contacts.PhoneNumber": { + "key": "Contacts.PhoneNumber", + "value": "Номер телефона" + }, + "Contacts.SearchLabel": { + "key": "Contacts.SearchLabel", + "value": "Поиск по контактам и людям" + }, + "Contacts.SearchUsersAndGroupsLabel": { + "key": "Contacts.SearchUsersAndGroupsLabel", + "value": "Поиск пользователей и групп" + }, + "Contacts.SelectAll": { + "key": "Contacts.SelectAll", + "value": "Выбрать всех" + }, + "Contacts.ShareTelegram": { + "key": "Contacts.ShareTelegram", + "value": "Пригласить в Telegram" + }, + "Contacts.SortBy": { + "key": "Contacts.SortBy", + "value": "Сортировать:" + }, + "Contacts.SortByName": { + "key": "Contacts.SortByName", + "value": "По имени" + }, + "Contacts.SortByPresence": { + "key": "Contacts.SortByPresence", + "value": "По времени входа" + }, + "Contacts.SortedByName": { + "key": "Contacts.SortedByName", + "value": "Сортировка по имени" + }, + "Contacts.SortedByPresence": { + "key": "Contacts.SortedByPresence", + "value": "Сортировка по времени входа" + }, + "Contacts.TabTitle": { + "key": "Contacts.TabTitle", + "value": "Контакты" + }, + "Contacts.Title": { + "key": "Contacts.Title", + "value": "Контакты" + }, + "Contacts.TopSection": { + "key": "Contacts.TopSection", + "value": "КОНТАКТЫ" + }, + "Conversation.AddContact": { + "key": "Conversation.AddContact", + "value": "Добавить" + }, + "Conversation.AddMembers": { + "key": "Conversation.AddMembers", + "value": "Добавить участников" + }, + "Conversation.AddNameToContacts": { + "key": "Conversation.AddNameToContacts", + "value": "Добавить %@ в контакты" + }, + "Conversation.AddToContacts": { + "key": "Conversation.AddToContacts", + "value": "Добавить" + }, + "Conversation.AddToReadingList": { + "key": "Conversation.AddToReadingList", + "value": "Добавить в список для чтения" + }, + "Conversation.Admin": { + "key": "Conversation.Admin", + "value": "админ" + }, + "Conversation.AlsoClearCacheTitle": { + "key": "Conversation.AlsoClearCacheTitle", + "value": "Для удаления ненужных файлов можно использовать опцию \"Очистить кэш\". Если файлы понадобятся снова, их можно будет загрузить в любой момент." + }, + "Conversation.ApplyLocalization": { + "key": "Conversation.ApplyLocalization", + "value": "Применить локализацию" + }, + "Conversation.AudioRateTooltipNormal": { + "key": "Conversation.AudioRateTooltipNormal", + "value": "Аудио будет играть с обычной скоростью." + }, + "Conversation.AudioRateTooltipSpeedUp": { + "key": "Conversation.AudioRateTooltipSpeedUp", + "value": "Аудио будет играть в два раза быстрее." + }, + "Conversation.AutoremoveActionEdit": { + "key": "Conversation.AutoremoveActionEdit", + "value": "Изменить настройки автоудаления" + }, + "Conversation.AutoremoveActionEnable": { + "key": "Conversation.AutoremoveActionEnable", + "value": "Настроить автоудаление" + }, + "Conversation.AutoremoveChanged": { + "key": "Conversation.AutoremoveChanged", + "value": "Установлен таймер для удаления: %@" + }, + "Conversation.AutoremoveOff": { + "key": "Conversation.AutoremoveOff", + "value": "Автоудаление выключено." + }, + "Conversation.AutoremoveRemainingDays": { + "key": "Conversation.AutoremoveRemainingDays", + "zeroValue": null, + "oneValue": "автоудаление через %@ день", + "twoValue": null, + "fewValue": "автоудаление через %@ дня", + "manyValue": "автоудаление через %@ дней", + "otherValue": "автоудаление через %@ дня" + }, + "Conversation.AutoremoveRemainingTime": { + "key": "Conversation.AutoremoveRemainingTime", + "value": "автоудаление через %@" + }, + "Conversation.AutoremoveTimerRemovedChannel": { + "key": "Conversation.AutoremoveTimerRemovedChannel", + "value": "Сообщения в этом канале больше не будут автоматически удаляться" + }, + "Conversation.AutoremoveTimerRemovedGroup": { + "key": "Conversation.AutoremoveTimerRemovedGroup", + "value": "Администраторы группы отключили удаление по таймеру" + }, + "Conversation.AutoremoveTimerRemovedUser": { + "key": "Conversation.AutoremoveTimerRemovedUser", + "value": "%1$@ отключил(а) удаление по таймеру" + }, + "Conversation.AutoremoveTimerRemovedUserYou": { + "key": "Conversation.AutoremoveTimerRemovedUserYou", + "value": "Вы отключили удаление по таймеру" + }, + "Conversation.AutoremoveTimerSetChannel": { + "key": "Conversation.AutoremoveTimerSetChannel", + "value": "Сообщения в этом канале будут автоматически удаляться через %1$@" + }, + "Conversation.AutoremoveTimerSetGroup": { + "key": "Conversation.AutoremoveTimerSetGroup", + "value": "Администратор группы включил автоудаление сообщений через %1$@ после отправки" + }, + "Conversation.AutoremoveTimerSetToastText": { + "key": "Conversation.AutoremoveTimerSetToastText", + "value": "Сообщения в этом чате автоматически\nудаляются через %@ после отправки." + }, + "Conversation.AutoremoveTimerSetUser": { + "key": "Conversation.AutoremoveTimerSetUser", + "value": "%1$@ включил(а) автоудаление сообщений через %2$@ после отправки" + }, + "Conversation.AutoremoveTimerSetUserYou": { + "key": "Conversation.AutoremoveTimerSetUserYou", + "value": "Вы включили автоудаление сообщений через %1$@ после отправки" + }, + "Conversation.BlockUser": { + "key": "Conversation.BlockUser", + "value": "Заблокировать" + }, + "Conversation.BotInteractiveUrlAlert": { + "key": "Conversation.BotInteractiveUrlAlert", + "value": "Разрешить боту %@ передавать Ваше имя и id в Telegram (не номер телефона) сайтам, которые Вы откроете с его помощью?" + }, + "Conversation.Bytes": { + "key": "Conversation.Bytes", + "value": "%d Б" + }, + "Conversation.Call": { + "key": "Conversation.Call", + "value": "Позвонить" + }, + "Conversation.ChatBackground": { + "key": "Conversation.ChatBackground", + "value": "Фон для чатов" + }, + "Conversation.ChecksTooltip.Delivered": { + "key": "Conversation.ChecksTooltip.Delivered", + "value": "Доставлено" + }, + "Conversation.ChecksTooltip.Read": { + "key": "Conversation.ChecksTooltip.Read", + "value": "Прочитано" + }, + "Conversation.ClearAll": { + "key": "Conversation.ClearAll", + "value": "Удалить чат" + }, + "Conversation.ClearCache": { + "key": "Conversation.ClearCache", + "value": "Очистить кэш" + }, + "Conversation.ClearChannel": { + "key": "Conversation.ClearChannel", + "value": "Очистить канал" + }, + "Conversation.ClearChatConfirmation": { + "key": "Conversation.ClearChatConfirmation", + "value": "Внимание, Вы собираетесь удалить **всю переписку** с %@." + }, + "Conversation.ClearGroupHistory": { + "key": "Conversation.ClearGroupHistory", + "value": "Все сообщения и материалы в этом чате будут удалены для Вас из облака Telegram. Они будут по-прежнему доступны другим участникам группы." + }, + "Conversation.ClearPrivateHistory": { + "key": "Conversation.ClearPrivateHistory", + "value": "Все сообщения и материалы в этом чате будут удалены для Вас из облака Telegram. У Вашего собеседника останется копия." + }, + "Conversation.ClearSecretHistory": { + "key": "Conversation.ClearSecretHistory", + "value": "Все сообщения и материалы в этом чате будут удалены для Вас и Вашего собеседника." + }, + "Conversation.ClearSelfHistory": { + "key": "Conversation.ClearSelfHistory", + "value": "Все сообщения и материалы в этом чате будут удалены из Вашего облака Telegram." + }, + "Conversation.CloudStorage.ChatStatus": { + "key": "Conversation.CloudStorage.ChatStatus", + "value": "Ваш личный чат" + }, + "Conversation.CloudStorageInfo.Title": { + "key": "Conversation.CloudStorageInfo.Title", + "value": "Ваше облачное хранилище" + }, + "Conversation.ClousStorageInfo.Description1": { + "key": "Conversation.ClousStorageInfo.Description1", + "value": "• Пересылайте сюда сообщения" + }, + "Conversation.ClousStorageInfo.Description2": { + "key": "Conversation.ClousStorageInfo.Description2", + "value": "• Храните фотографии и видео" + }, + "Conversation.ClousStorageInfo.Description3": { + "key": "Conversation.ClousStorageInfo.Description3", + "value": "• Чат доступен с любого устройства" + }, + "Conversation.ClousStorageInfo.Description4": { + "key": "Conversation.ClousStorageInfo.Description4", + "value": "• Находите нужное в поиске" + }, + "Conversation.Contact": { + "key": "Conversation.Contact", + "value": "Контакт" + }, + "Conversation.ContextMenuBan": { + "key": "Conversation.ContextMenuBan", + "value": "Ограничить права" + }, + "Conversation.ContextMenuBlock": { + "key": "Conversation.ContextMenuBlock", + "value": "Заблокировать" + }, + "Conversation.ContextMenuCancelEditing": { + "key": "Conversation.ContextMenuCancelEditing", + "value": "Отменить редактирование" + }, + "Conversation.ContextMenuCancelSending": { + "key": "Conversation.ContextMenuCancelSending", + "value": "Отменить отправку" + }, + "Conversation.ContextMenuCopy": { + "key": "Conversation.ContextMenuCopy", + "value": "Скопировать" + }, + "Conversation.ContextMenuCopyLink": { + "key": "Conversation.ContextMenuCopyLink", + "value": "Копировать ссылку" + }, + "Conversation.ContextMenuDelete": { + "key": "Conversation.ContextMenuDelete", + "value": "Удалить" + }, + "Conversation.ContextMenuDiscuss": { + "key": "Conversation.ContextMenuDiscuss", + "value": "Обсудить" + }, + "Conversation.ContextMenuForward": { + "key": "Conversation.ContextMenuForward", + "value": "Переслать" + }, + "Conversation.ContextMenuLookUp": { + "key": "Conversation.ContextMenuLookUp", + "value": "Поиск" + }, + "Conversation.ContextMenuMention": { + "key": "Conversation.ContextMenuMention", + "value": "Упомянуть" + }, + "Conversation.ContextMenuMore": { + "key": "Conversation.ContextMenuMore", + "value": "Ещё…" + }, + "Conversation.ContextMenuOpenChannel": { + "key": "Conversation.ContextMenuOpenChannel", + "value": "Открыть канал" + }, + "Conversation.ContextMenuOpenChannelProfile": { + "key": "Conversation.ContextMenuOpenChannelProfile", + "value": "Открыть профиль" + }, + "Conversation.ContextMenuOpenProfile": { + "key": "Conversation.ContextMenuOpenProfile", + "value": "Открыть профиль" + }, + "Conversation.ContextMenuReply": { + "key": "Conversation.ContextMenuReply", + "value": "Ответить" + }, + "Conversation.ContextMenuReport": { + "key": "Conversation.ContextMenuReport", + "value": "Пожаловаться" + }, + "Conversation.ContextMenuSelect": { + "key": "Conversation.ContextMenuSelect", + "value": "Выбрать" + }, + "Conversation.ContextMenuSelectAll": { + "key": "Conversation.ContextMenuSelectAll", + "zeroValue": null, + "oneValue": "Выбрать все %@ элемент", + "twoValue": null, + "fewValue": "Выбрать все %@ элемента", + "manyValue": "Выбрать все %@ элементов", + "otherValue": "Выбрать все %@ элемента" + }, + "Conversation.ContextMenuSendMessage": { + "key": "Conversation.ContextMenuSendMessage", + "value": "Написать" + }, + "Conversation.ContextMenuShare": { + "key": "Conversation.ContextMenuShare", + "value": "Поделиться" + }, + "Conversation.ContextMenuSpeak": { + "key": "Conversation.ContextMenuSpeak", + "value": "Проговорить" + }, + "Conversation.ContextMenuStickerPackAdd": { + "key": "Conversation.ContextMenuStickerPackAdd", + "value": "Добавить стикеры" + }, + "Conversation.ContextMenuStickerPackInfo": { + "key": "Conversation.ContextMenuStickerPackInfo", + "value": "Подробнее" + }, + "Conversation.ContextViewReplies": { + "key": "Conversation.ContextViewReplies", + "zeroValue": null, + "oneValue": "Просмотреть %@ ответ", + "twoValue": null, + "fewValue": "Просмотреть %@ ответа", + "manyValue": "Просмотреть %@ ответов", + "otherValue": "Просмотреть %@ ответа" + }, + "Conversation.ContextViewStats": { + "key": "Conversation.ContextViewStats", + "value": "Статистика" + }, + "Conversation.ContextViewThread": { + "key": "Conversation.ContextViewThread", + "value": "Просмотреть ответы" + }, + "Conversation.DefaultRestrictedInline": { + "key": "Conversation.DefaultRestrictedInline", + "value": "В этой группе запрещено публиковать материалы с помощью ботов." + }, + "Conversation.DefaultRestrictedMedia": { + "key": "Conversation.DefaultRestrictedMedia", + "value": "В этой группе запрещено публиковать мультимедиа." + }, + "Conversation.DefaultRestrictedStickers": { + "key": "Conversation.DefaultRestrictedStickers", + "value": "В этой группе запрещено отправлять стикеры." + }, + "Conversation.DefaultRestrictedText": { + "key": "Conversation.DefaultRestrictedText", + "value": "В этой группе запрещено писать сообщения." + }, + "Conversation.DeleteAllMessagesInChat": { + "key": "Conversation.DeleteAllMessagesInChat", + "value": "Вы точно хотите удалить все сообщения в %@?" + }, + "Conversation.DeleteManyMessages": { + "key": "Conversation.DeleteManyMessages", + "value": "Удалить сообщения" + }, + "Conversation.DeleteMessagesFor": { + "key": "Conversation.DeleteMessagesFor", + "value": "Удалить у меня и у %@" + }, + "Conversation.DeleteMessagesForEveryone": { + "key": "Conversation.DeleteMessagesForEveryone", + "value": "Удалить у всех" + }, + "Conversation.DeleteMessagesForMe": { + "key": "Conversation.DeleteMessagesForMe", + "value": "Удалить у меня" + }, + "Conversation.Dice": { + "key": "Conversation.Dice", + "value": "Отправьте эмодзи 🎲 в любой чат, чтобы получить случайное число." + }, + "Conversation.Dice.": { + "key": "Conversation.Dice.", + "value": "Чтобы сделать бросок, отправьте эмодзи кубика." + }, + "Conversation.Dice.u1F3AF": { + "key": "Conversation.Dice.u1F3AF", + "value": "Чтобы испытать удачу, отправьте эмодзи дартс." + }, + "Conversation.Dice.u1F3B0": { + "key": "Conversation.Dice.u1F3B0", + "value": "Чтобы испытать удачу, отправьте игровой автомат." + }, + "Conversation.Dice.u1F3B2": { + "key": "Conversation.Dice.u1F3B2", + "value": "Чтобы сделать бросок, отправьте эмодзи кубика." + }, + "Conversation.Dice.u1F3B3": { + "key": "Conversation.Dice.u1F3B3", + "value": "Чтобы испытать удачу, отправьте эмодзи с боулингом." + }, + "Conversation.Dice.u1F3C0": { + "key": "Conversation.Dice.u1F3C0", + "value": "Чтобы испытать удачу, отправьте баскетбольный мяч." + }, + "Conversation.Dice.u26BD": { + "key": "Conversation.Dice.u26BD", + "value": "Чтобы испытать удачу, отправьте футбольный мяч." + }, + "Conversation.DiscardVoiceMessageAction": { + "key": "Conversation.DiscardVoiceMessageAction", + "value": "Да" + }, + "Conversation.DiscardVoiceMessageDescription": { + "key": "Conversation.DiscardVoiceMessageDescription", + "value": "Вы точно хотите прекратить запись и удалить голосовое сообщение?" + }, + "Conversation.DiscardVoiceMessageTitle": { + "key": "Conversation.DiscardVoiceMessageTitle", + "value": "Отменить запись голоса" + }, + "Conversation.DiscussionNotStarted": { + "key": "Conversation.DiscussionNotStarted", + "value": "Комментариев пока нет..." + }, + "Conversation.DiscussionStarted": { + "key": "Conversation.DiscussionStarted", + "value": "Начало обсуждения" + }, + "Conversation.Edit": { + "key": "Conversation.Edit", + "value": "Изменить" + }, + "Conversation.EditingCaptionPanelTitle": { + "key": "Conversation.EditingCaptionPanelTitle", + "value": "Изменить подпись" + }, + "Conversation.EditingMessageMediaChange": { + "key": "Conversation.EditingMessageMediaChange", + "value": "Выбрать другое" + }, + "Conversation.EditingMessageMediaEditCurrentPhoto": { + "key": "Conversation.EditingMessageMediaEditCurrentPhoto", + "value": "Фоторедактор" + }, + "Conversation.EditingMessageMediaEditCurrentVideo": { + "key": "Conversation.EditingMessageMediaEditCurrentVideo", + "value": "Редактор видео" + }, + "Conversation.EditingMessagePanelMedia": { + "key": "Conversation.EditingMessagePanelMedia", + "value": "Изменить медиа" + }, + "Conversation.EditingMessagePanelTitle": { + "key": "Conversation.EditingMessagePanelTitle", + "value": "Редактирование" + }, + "Conversation.EditingPhotoPanelTitle": { + "key": "Conversation.EditingPhotoPanelTitle", + "value": "Редактировать" + }, + "Conversation.EmptyGifPanelPlaceholder": { + "key": "Conversation.EmptyGifPanelPlaceholder", + "value": "У Вас пока нет сохранённых GIF.\nДля поиска наберите @gif." + }, + "Conversation.EmptyPlaceholder": { + "key": "Conversation.EmptyPlaceholder", + "value": "Сообщений пока нет..." + }, + "Conversation.EncryptedDescription1": { + "key": "Conversation.EncryptedDescription1", + "value": "Оконечное шифрование " + }, + "Conversation.EncryptedDescription2": { + "key": "Conversation.EncryptedDescription2", + "value": "Никаких следов на серверах" + }, + "Conversation.EncryptedDescription3": { + "key": "Conversation.EncryptedDescription3", + "value": "Удаление по таймеру" + }, + "Conversation.EncryptedDescription4": { + "key": "Conversation.EncryptedDescription4", + "value": "Запрет на пересылку" + }, + "Conversation.EncryptedDescriptionTitle": { + "key": "Conversation.EncryptedDescriptionTitle", + "value": "Секретные чаты — это:" + }, + "Conversation.EncryptedPlaceholderTitleIncoming": { + "key": "Conversation.EncryptedPlaceholderTitleIncoming", + "value": "Вы присоединились к секретному чату с %@." + }, + "Conversation.EncryptedPlaceholderTitleOutgoing": { + "key": "Conversation.EncryptedPlaceholderTitleOutgoing", + "value": "Вы пригласили %@ в секретный чат." + }, + "Conversation.EncryptionCanceled": { + "key": "Conversation.EncryptionCanceled", + "value": "Секретный чат отменен" + }, + "Conversation.EncryptionProcessing": { + "key": "Conversation.EncryptionProcessing", + "value": "Обмен ключами шифрования…" + }, + "Conversation.EncryptionWaiting": { + "key": "Conversation.EncryptionWaiting", + "value": "Ожидаем появления %@ в сети…" + }, + "Conversation.ErrorInaccessibleMessage": { + "key": "Conversation.ErrorInaccessibleMessage", + "value": "К сожалению, Вы не состоите в чате, где было опубликовано это сообщение." + }, + "Conversation.FileDropbox": { + "key": "Conversation.FileDropbox", + "value": "Dropbox" + }, + "Conversation.FileHowToText": { + "key": "Conversation.FileHowToText", + "value": "Чтобы отправить файл любого типа, откройте его на своём %@ (например, в браузере), нажмите **«Открыть в…»** или иконку действий и выберите Telegram." + }, + "Conversation.FileICloudDrive": { + "key": "Conversation.FileICloudDrive", + "value": "iCloud" + }, + "Conversation.FileOpenIn": { + "key": "Conversation.FileOpenIn", + "value": "Открыть в…" + }, + "Conversation.FilePhotoOrVideo": { + "key": "Conversation.FilePhotoOrVideo", + "value": "Фото или видео" + }, + "Conversation.ForwardAuthorHiddenTooltip": { + "key": "Conversation.ForwardAuthorHiddenTooltip", + "value": "Аккаунт скрыт пользователем" + }, + "Conversation.ForwardChats": { + "key": "Conversation.ForwardChats", + "value": "Чаты" + }, + "Conversation.ForwardContacts": { + "key": "Conversation.ForwardContacts", + "value": "Контакты" + }, + "Conversation.ForwardTitle": { + "key": "Conversation.ForwardTitle", + "value": "Переслать" + }, + "Conversation.ForwardTooltip.Chat.Many": { + "key": "Conversation.ForwardTooltip.Chat.Many", + "value": "Сообщения пересланы в чат с **%@**" + }, + "Conversation.ForwardTooltip.Chat.One": { + "key": "Conversation.ForwardTooltip.Chat.One", + "value": "Сообщение переслано в чат с **%@**" + }, + "Conversation.ForwardTooltip.ManyChats.Many": { + "key": "Conversation.ForwardTooltip.ManyChats.Many", + "value": "Сообщения пересланы в чат с **%@** и ещё %@" + }, + "Conversation.ForwardTooltip.ManyChats.One": { + "key": "Conversation.ForwardTooltip.ManyChats.One", + "value": "Сообщение переслано в чат с **%@** и ещё %@" + }, + "Conversation.ForwardTooltip.SavedMessages.Many": { + "key": "Conversation.ForwardTooltip.SavedMessages.Many", + "value": "Сообщения пересланы в **Избранное**" + }, + "Conversation.ForwardTooltip.SavedMessages.One": { + "key": "Conversation.ForwardTooltip.SavedMessages.One", + "value": "Сообщение переслано в **Избранное**" + }, + "Conversation.ForwardTooltip.TwoChats.Many": { + "key": "Conversation.ForwardTooltip.TwoChats.Many", + "value": "Сообщения пересланы в чаты с **%@** и **%@**" + }, + "Conversation.ForwardTooltip.TwoChats.One": { + "key": "Conversation.ForwardTooltip.TwoChats.One", + "value": "Сообщение пересланы в чаты с **%@** и **%@**" + }, + "Conversation.GifTooltip": { + "key": "Conversation.GifTooltip", + "value": "Нажмите для доступа к своим GIF" + }, + "Conversation.GigagroupDescription": { + "key": "Conversation.GigagroupDescription", + "value": "Только администраторы могут писать в этой группе." + }, + "Conversation.GreetingText": { + "key": "Conversation.GreetingText", + "value": "Отправьте сообщение или нажмите на приветствие ниже." + }, + "Conversation.HoldForAudio": { + "key": "Conversation.HoldForAudio", + "value": "Аудио — удерживайте. Видео — нажмите." + }, + "Conversation.HoldForVideo": { + "key": "Conversation.HoldForVideo", + "value": "Видео — удерживайте. Аудио — нажмите." + }, + "Conversation.ImportProgress": { + "key": "Conversation.ImportProgress", + "value": "Импорт сообщений... %@%" + }, + "Conversation.ImportedMessageHint": { + "key": "Conversation.ImportedMessageHint", + "value": "Это сообщение было импортировано из другого приложения. Мы не можем гарантировать, что оно настоящее." + }, + "Conversation.Info": { + "key": "Conversation.Info", + "value": "Подробнее" + }, + "Conversation.InfoGroup": { + "key": "Conversation.InfoGroup", + "value": "Группа" + }, + "Conversation.InputTextAnonymousPlaceholder": { + "key": "Conversation.InputTextAnonymousPlaceholder", + "value": "Анонимное сообщение" + }, + "Conversation.InputTextBroadcastPlaceholder": { + "key": "Conversation.InputTextBroadcastPlaceholder", + "value": "Публикация" + }, + "Conversation.InputTextCaptionPlaceholder": { + "key": "Conversation.InputTextCaptionPlaceholder", + "value": "Подпись" + }, + "Conversation.InputTextPlaceholder": { + "key": "Conversation.InputTextPlaceholder", + "value": "Сообщение…" + }, + "Conversation.InputTextPlaceholderComment": { + "key": "Conversation.InputTextPlaceholderComment", + "value": "Комментарий" + }, + "Conversation.InputTextPlaceholderReply": { + "key": "Conversation.InputTextPlaceholderReply", + "value": "Ответ" + }, + "Conversation.InputTextSilentBroadcastPlaceholder": { + "key": "Conversation.InputTextSilentBroadcastPlaceholder", + "value": "Тихая публикация" + }, + "Conversation.InstantPagePreview": { + "key": "Conversation.InstantPagePreview", + "value": "ПОСМОТРЕТЬ" + }, + "Conversation.JumpToDate": { + "key": "Conversation.JumpToDate", + "value": "Перейти" + }, + "Conversation.Kilobytes": { + "key": "Conversation.Kilobytes", + "value": "%d Кб" + }, + "Conversation.LinkDialogCopy": { + "key": "Conversation.LinkDialogCopy", + "value": "Скопировать" + }, + "Conversation.LinkDialogOpen": { + "key": "Conversation.LinkDialogOpen", + "value": "Открыть" + }, + "Conversation.LinkDialogSave": { + "key": "Conversation.LinkDialogSave", + "value": "Сохранить" + }, + "Conversation.LiveLocation": { + "key": "Conversation.LiveLocation", + "value": "Трансляция геопозиции" + }, + "Conversation.LiveLocationMembersCount": { + "key": "Conversation.LiveLocationMembersCount", + "zeroValue": null, + "oneValue": "%@ участник", + "twoValue": null, + "fewValue": "%@ участника", + "manyValue": "%@ участников", + "otherValue": "%@ участников" + }, + "Conversation.LiveLocationYou": { + "key": "Conversation.LiveLocationYou", + "value": "Вы" + }, + "Conversation.LiveLocationYouAnd": { + "key": "Conversation.LiveLocationYouAnd", + "value": "*Вы* и %@" + }, + "Conversation.LiveLocationYouAndOther": { + "key": "Conversation.LiveLocationYouAndOther", + "value": "**Вы** и %@" + }, + "Conversation.Location": { + "key": "Conversation.Location", + "value": "Геопозиция" + }, + "Conversation.Megabytes": { + "key": "Conversation.Megabytes", + "value": "%.1f Мб" + }, + "Conversation.MessageDeliveryFailed": { + "key": "Conversation.MessageDeliveryFailed", + "value": "Сообщение не было отправлено. Нажмите «Повторить» для отправки." + }, + "Conversation.MessageDialogDelete": { + "key": "Conversation.MessageDialogDelete", + "value": "Удалить" + }, + "Conversation.MessageDialogEdit": { + "key": "Conversation.MessageDialogEdit", + "value": "Изменить" + }, + "Conversation.MessageDialogRetry": { + "key": "Conversation.MessageDialogRetry", + "value": "Повторить" + }, + "Conversation.MessageDialogRetryAll": { + "key": "Conversation.MessageDialogRetryAll", + "value": "Повторить (%1$d)" + }, + "Conversation.MessageEditedLabel": { + "key": "Conversation.MessageEditedLabel", + "value": "изменено" + }, + "Conversation.MessageLeaveComment": { + "key": "Conversation.MessageLeaveComment", + "value": "Прокомментировать" + }, + "Conversation.MessageLeaveCommentShort": { + "key": "Conversation.MessageLeaveCommentShort", + "value": "Комментировать" + }, + "Conversation.MessageViaUser": { + "key": "Conversation.MessageViaUser", + "value": "с помощью %@" + }, + "Conversation.MessageViewComments": { + "key": "Conversation.MessageViewComments", + "zeroValue": null, + "oneValue": "[%@]комментарий", + "twoValue": null, + "fewValue": "[%@]комментария", + "manyValue": "[%@]комментариев", + "otherValue": "[%@]комментария" + }, + "Conversation.MessageViewCommentsFormat": { + "key": "Conversation.MessageViewCommentsFormat", + "value": "%1$@ %2$@" + }, + "Conversation.Moderate.Ban": { + "key": "Conversation.Moderate.Ban", + "value": "Забанить пользователя" + }, + "Conversation.Moderate.Delete": { + "key": "Conversation.Moderate.Delete", + "value": "Удалить сообщение" + }, + "Conversation.Moderate.DeleteAllMessages": { + "key": "Conversation.Moderate.DeleteAllMessages", + "value": "Удалить всё от %@" + }, + "Conversation.Moderate.Report": { + "key": "Conversation.Moderate.Report", + "value": "Это спам" + }, + "Conversation.Mute": { + "key": "Conversation.Mute", + "value": "Убрать звук" + }, + "Conversation.NoticeInvitedByInChannel": { + "key": "Conversation.NoticeInvitedByInChannel", + "value": "%@ пригласил(а) вас в этот канал" + }, + "Conversation.NoticeInvitedByInGroup": { + "key": "Conversation.NoticeInvitedByInGroup", + "value": "%@ пригласил(а) вас в эту группу" + }, + "Conversation.OpenBotLinkAllowMessages": { + "key": "Conversation.OpenBotLinkAllowMessages", + "value": "Разрешить **%@** писать мне сообщения" + }, + "Conversation.OpenBotLinkLogin": { + "key": "Conversation.OpenBotLinkLogin", + "value": "Авторизоваться на **%1$@** как %2$@" + }, + "Conversation.OpenBotLinkOpen": { + "key": "Conversation.OpenBotLinkOpen", + "value": "Открыть" + }, + "Conversation.OpenBotLinkText": { + "key": "Conversation.OpenBotLinkText", + "value": "Перейти по ссылке\n**%@**?" + }, + "Conversation.OpenBotLinkTitle": { + "key": "Conversation.OpenBotLinkTitle", + "value": "Открыть ссылку" + }, + "Conversation.OpenFile": { + "key": "Conversation.OpenFile", + "value": "Открыть файл" + }, + "Conversation.Owner": { + "key": "Conversation.Owner", + "value": "владелец" + }, + "Conversation.PeerNearbyDistance": { + "key": "Conversation.PeerNearbyDistance", + "value": "%1$@ в %2$@ от Вас" + }, + "Conversation.PeerNearbyText": { + "key": "Conversation.PeerNearbyText", + "value": "Отправьте сообщение или нажмите на приветствие ниже, чтобы начать общение." + }, + "Conversation.PeerNearbyTitle": { + "key": "Conversation.PeerNearbyTitle", + "value": "%1$@ в %2$@ от Вас" + }, + "Conversation.Pin": { + "key": "Conversation.Pin", + "value": "Закрепить" + }, + "Conversation.PinMessageAlert.OnlyPin": { + "key": "Conversation.PinMessageAlert.OnlyPin", + "value": "Только закрепить" + }, + "Conversation.PinMessageAlert.PinAndNotifyMembers": { + "key": "Conversation.PinMessageAlert.PinAndNotifyMembers", + "value": "Закрепить и оповестить участников" + }, + "Conversation.PinMessageAlertGroup": { + "key": "Conversation.PinMessageAlertGroup", + "value": "Закрепить это сообщение и оповестить всех участников группы?" + }, + "Conversation.PinMessageAlertPin": { + "key": "Conversation.PinMessageAlertPin", + "value": "Закрепить" + }, + "Conversation.PinMessagesFor": { + "key": "Conversation.PinMessagesFor", + "value": "Закрепить у меня и %@" + }, + "Conversation.PinMessagesForMe": { + "key": "Conversation.PinMessagesForMe", + "value": "Закрепить у меня" + }, + "Conversation.PinOlderMessageAlertText": { + "key": "Conversation.PinOlderMessageAlertText", + "value": "Закрепить более старое сообщение, сохранив закрепленным более новое?" + }, + "Conversation.PinOlderMessageAlertTitle": { + "key": "Conversation.PinOlderMessageAlertTitle", + "value": "Закрепить сообщение" + }, + "Conversation.PinnedMessage": { + "key": "Conversation.PinnedMessage", + "value": "Закреплённое сообщение" + }, + "Conversation.PinnedPoll": { + "key": "Conversation.PinnedPoll", + "value": "Закреплённый опрос" + }, + "Conversation.PinnedPreviousMessage": { + "key": "Conversation.PinnedPreviousMessage", + "value": "Предыдущее сообщение" + }, + "Conversation.PinnedQuiz": { + "key": "Conversation.PinnedQuiz", + "value": "Закреплённая викторина" + }, + "Conversation.PressVolumeButtonForSound": { + "key": "Conversation.PressVolumeButtonForSound", + "value": "Звук можно включить\nкнопками громкости" + }, + "Conversation.PrivateChannelTimeLimitedAlertJoin": { + "key": "Conversation.PrivateChannelTimeLimitedAlertJoin", + "value": "Подписаться" + }, + "Conversation.PrivateChannelTimeLimitedAlertText": { + "key": "Conversation.PrivateChannelTimeLimitedAlertText", + "value": "Этот частный канал. Чтобы видеть материалы в дальнейшем, необходимо подписаться на него." + }, + "Conversation.PrivateChannelTimeLimitedAlertTitle": { + "key": "Conversation.PrivateChannelTimeLimitedAlertTitle", + "value": "Подписаться" + }, + "Conversation.PrivateChannelTooltip": { + "key": "Conversation.PrivateChannelTooltip", + "value": "Это приватный канал" + }, + "Conversation.PrivateMessageLinkCopied": { + "key": "Conversation.PrivateMessageLinkCopied", + "value": "Ссылка будет работать только для участников чата" + }, + "Conversation.Processing": { + "key": "Conversation.Processing", + "value": "Обработка..." + }, + "Conversation.Report": { + "key": "Conversation.Report", + "value": "Это спам" + }, + "Conversation.ReportGroupLocation": { + "key": "Conversation.ReportGroupLocation", + "value": "Группа не связана с местом?" + }, + "Conversation.ReportMessages": { + "key": "Conversation.ReportMessages", + "value": "Пожаловаться на сообщения" + }, + "Conversation.ReportSpam": { + "key": "Conversation.ReportSpam", + "value": "Это спам" + }, + "Conversation.ReportSpamAndLeave": { + "key": "Conversation.ReportSpamAndLeave", + "value": "Сообщить о спаме и выйти" + }, + "Conversation.ReportSpamChannelConfirmation": { + "key": "Conversation.ReportSpamChannelConfirmation", + "value": "Хотите сообщить о спаме из этого канала?" + }, + "Conversation.ReportSpamConfirmation": { + "key": "Conversation.ReportSpamConfirmation", + "value": "Хотите пожаловаться на спам от этого пользователя?" + }, + "Conversation.ReportSpamGroupConfirmation": { + "key": "Conversation.ReportSpamGroupConfirmation", + "value": "Хотите сообщить о спаме от этой группы?" + }, + "Conversation.RestrictedInline": { + "key": "Conversation.RestrictedInline", + "value": "Администраторы группы запретили Вам публиковать контент с помощью ботов." + }, + "Conversation.RestrictedInlineTimed": { + "key": "Conversation.RestrictedInlineTimed", + "value": "Администраторы группы запретили Вам публиковать контент с помощью ботов до %@." + }, + "Conversation.RestrictedMedia": { + "key": "Conversation.RestrictedMedia", + "value": "Администраторы этой группы запретили Вам публиковать здесь фото и видео." + }, + "Conversation.RestrictedMediaTimed": { + "key": "Conversation.RestrictedMediaTimed", + "value": "Администраторы группы запретили Вам публиковать здесь фото и видео до %@." + }, + "Conversation.RestrictedStickers": { + "key": "Conversation.RestrictedStickers", + "value": "Администраторы группы запретили Вам отправлять стикеры." + }, + "Conversation.RestrictedStickersTimed": { + "key": "Conversation.RestrictedStickersTimed", + "value": "Администраторы группы запретили Вам отправлять сюда стикеры до %@." + }, + "Conversation.RestrictedText": { + "key": "Conversation.RestrictedText", + "value": "Администраторы группы запретили Вам писать в ней." + }, + "Conversation.RestrictedTextTimed": { + "key": "Conversation.RestrictedTextTimed", + "value": "Администраторы группы запретили Вам писать здесь до %@." + }, + "Conversation.SavedMessages": { + "key": "Conversation.SavedMessages", + "value": "Избранное" + }, + "Conversation.ScamWarning": { + "key": "Conversation.ScamWarning", + "value": "⚠️ Внимание: на этот аккаунт много жаловались в связи с мошенничеством или попытками выдать себя за официальный аккаунт. Будьте осторожны, особенно если у Вас попросят денег." + }, + "Conversation.ScheduleMessage.SendOn": { + "key": "Conversation.ScheduleMessage.SendOn", + "value": "Отправить %@ в %@" + }, + "Conversation.ScheduleMessage.SendToday": { + "key": "Conversation.ScheduleMessage.SendToday", + "value": "Отправить сегодня в %@" + }, + "Conversation.ScheduleMessage.SendTomorrow": { + "key": "Conversation.ScheduleMessage.SendTomorrow", + "value": "Отправить завтра в %@" + }, + "Conversation.ScheduleMessage.SendWhenOnline": { + "key": "Conversation.ScheduleMessage.SendWhenOnline", + "value": "Когда будет в сети" + }, + "Conversation.ScheduleMessage.Title": { + "key": "Conversation.ScheduleMessage.Title", + "value": "Время отправки" + }, + "Conversation.Search": { + "key": "Conversation.Search", + "value": "Поиск" + }, + "Conversation.SearchByName.Placeholder": { + "key": "Conversation.SearchByName.Placeholder", + "value": "Поиск участников" + }, + "Conversation.SearchByName.Prefix": { + "key": "Conversation.SearchByName.Prefix", + "value": "от:" + }, + "Conversation.SearchNoResults": { + "key": "Conversation.SearchNoResults", + "value": "Нет результатов" + }, + "Conversation.SearchPlaceholder": { + "key": "Conversation.SearchPlaceholder", + "value": "Искать в чате" + }, + "Conversation.SecretChatContextBotAlert": { + "key": "Conversation.SecretChatContextBotAlert", + "value": "Учтите, что боты создаются сторонними разработчиками. Всё, что Вы введёте после имени бота, будет отправлено его разработчику." + }, + "Conversation.SecretLinkPreviewAlert": { + "key": "Conversation.SecretLinkPreviewAlert", + "value": "Вы хотите включить предпросмотр ссылок в секретных чатах? Учтите, что предпросмотр создается на серверах Telegram." + }, + "Conversation.SelectMessages": { + "key": "Conversation.SelectMessages", + "value": "Выберите сообщения" + }, + "Conversation.SelectedMessages": { + "key": "Conversation.SelectedMessages", + "zeroValue": null, + "oneValue": "Выбрано %@", + "twoValue": null, + "fewValue": "Выбрано %@", + "manyValue": "Выбрано %@", + "otherValue": "Выбрано %@" + }, + "Conversation.SendDice": { + "key": "Conversation.SendDice", + "value": "Отправить" + }, + "Conversation.SendMessage": { + "key": "Conversation.SendMessage", + "value": "Отправить сообщение" + }, + "Conversation.SendMessage.ScheduleMessage": { + "key": "Conversation.SendMessage.ScheduleMessage", + "value": "Отправить позже" + }, + "Conversation.SendMessage.SendSilently": { + "key": "Conversation.SendMessage.SendSilently", + "value": "Отправить без звука" + }, + "Conversation.SendMessage.SetReminder": { + "key": "Conversation.SendMessage.SetReminder", + "value": "Задать напоминание" + }, + "Conversation.SendMessageErrorFlood": { + "key": "Conversation.SendMessageErrorFlood", + "value": "К сожалению, в данный момент Вы можете отправлять сообщения только взаимным контактам." + }, + "Conversation.SendMessageErrorGroupRestricted": { + "key": "Conversation.SendMessageErrorGroupRestricted", + "value": "К сожалению, в данный момент Вы не можете отправлять сообщения в публичные группы." + }, + "Conversation.SendMessageErrorTooMuchScheduled": { + "key": "Conversation.SendMessageErrorTooMuchScheduled", + "value": "Вы не можете добавить больше 100 отложенных сообщений." + }, + "Conversation.SendingOptionsTooltip": { + "key": "Conversation.SendingOptionsTooltip", + "value": "Удерживайте эту кнопку, чтобы отправить \nсообщение позже или без звука." + }, + "Conversation.SetReminder.RemindOn": { + "key": "Conversation.SetReminder.RemindOn", + "value": "Напомнить %@ в %@" + }, + "Conversation.SetReminder.RemindToday": { + "key": "Conversation.SetReminder.RemindToday", + "value": "Напомнить сегодня в %@" + }, + "Conversation.SetReminder.RemindTomorrow": { + "key": "Conversation.SetReminder.RemindTomorrow", + "value": "Напомнить завтра в %@" + }, + "Conversation.SetReminder.Title": { + "key": "Conversation.SetReminder.Title", + "value": "Напоминание" + }, + "Conversation.ShareBotContactConfirmation": { + "key": "Conversation.ShareBotContactConfirmation", + "value": "Бот будет знать номер Вашего телефона. Это может быть полезно для интеграции с другими сервисами." + }, + "Conversation.ShareBotContactConfirmationTitle": { + "key": "Conversation.ShareBotContactConfirmationTitle", + "value": "Отправить Ваш номер телефона?" + }, + "Conversation.ShareBotLocationConfirmation": { + "key": "Conversation.ShareBotLocationConfirmation", + "value": "Это отправит боту Вашу текущую геопозицию." + }, + "Conversation.ShareBotLocationConfirmationTitle": { + "key": "Conversation.ShareBotLocationConfirmationTitle", + "value": "Поделиться геопозицией?" + }, + "Conversation.ShareInlineBotLocationConfirmation": { + "key": "Conversation.ShareInlineBotLocationConfirmation", + "value": "Бот хочет получать Вашу геопозицию каждый раз, когда Вы отправляете ему запрос. Это может использоваться, чтобы показывать нужную выдачу в зависимости от того, где Вы." + }, + "Conversation.ShareMyContactInfo": { + "key": "Conversation.ShareMyContactInfo", + "value": "Отправить мой контакт" + }, + "Conversation.ShareMyPhoneNumber": { + "key": "Conversation.ShareMyPhoneNumber", + "value": "Поделиться номером телефона" + }, + "Conversation.ShareMyPhoneNumber.StatusSuccess": { + "key": "Conversation.ShareMyPhoneNumber.StatusSuccess", + "value": "%@ теперь видит Ваш номер телефона." + }, + "Conversation.ShareMyPhoneNumberConfirmation": { + "key": "Conversation.ShareMyPhoneNumberConfirmation", + "value": "Хотите поделиться своим номером телефона %1$@ с %2$@? " + }, + "Conversation.SilentBroadcastTooltipOff": { + "key": "Conversation.SilentBroadcastTooltipOff", + "value": "Участники получат уведомление без звука" + }, + "Conversation.SilentBroadcastTooltipOn": { + "key": "Conversation.SilentBroadcastTooltipOn", + "value": "Участники получают уведомления" + }, + "Conversation.SlideToCancel": { + "key": "Conversation.SlideToCancel", + "value": "Влево — отмена" + }, + "Conversation.StatusKickedFromChannel": { + "key": "Conversation.StatusKickedFromChannel", + "value": "Вы были исключены из канала" + }, + "Conversation.StatusKickedFromGroup": { + "key": "Conversation.StatusKickedFromGroup", + "value": "Вы больше не в группе" + }, + "Conversation.StatusLeftGroup": { + "key": "Conversation.StatusLeftGroup", + "value": "Вы покинули группу" + }, + "Conversation.StatusMembers": { + "key": "Conversation.StatusMembers", + "zeroValue": null, + "oneValue": "%@ участник", + "twoValue": null, + "fewValue": "%@ участника", + "manyValue": "%@ участников", + "otherValue": "%@ участников" + }, + "Conversation.StatusOnline": { + "key": "Conversation.StatusOnline", + "zeroValue": null, + "oneValue": "%@ в сети", + "twoValue": null, + "fewValue": "%@ в сети", + "manyValue": "%@ в сети", + "otherValue": "%@ в сети" + }, + "Conversation.StatusSubscribers": { + "key": "Conversation.StatusSubscribers", + "zeroValue": null, + "oneValue": "%@ подписчик", + "twoValue": null, + "fewValue": "%@ подписчика", + "manyValue": "%@ подписчиков", + "otherValue": "%@ подписчиков" + }, + "Conversation.StatusTyping": { + "key": "Conversation.StatusTyping", + "value": "печатает" + }, + "Conversation.StopLiveLocation": { + "key": "Conversation.StopLiveLocation", + "value": "Остановить трансляцию" + }, + "Conversation.StopPoll": { + "key": "Conversation.StopPoll", + "value": "Остановить опрос" + }, + "Conversation.StopPollConfirmation": { + "key": "Conversation.StopPollConfirmation", + "value": "Остановить опрос" + }, + "Conversation.StopPollConfirmationTitle": { + "key": "Conversation.StopPollConfirmationTitle", + "value": "Если остановить опрос, никто больше не сможет проголосовать в нём. Это действие нельзя будет отменить." + }, + "Conversation.StopQuiz": { + "key": "Conversation.StopQuiz", + "value": "Остановить викторину" + }, + "Conversation.StopQuizConfirmation": { + "key": "Conversation.StopQuizConfirmation", + "value": "Остановить викторину" + }, + "Conversation.StopQuizConfirmationTitle": { + "key": "Conversation.StopQuizConfirmationTitle", + "value": "Если остановить викторину, никто больше не сможет ответить в ней. Это действие нельзя будет отменить." + }, + "Conversation.SwipeToReplyHintText": { + "key": "Conversation.SwipeToReplyHintText", + "value": "Проведите по сообщению влево, чтобы ответить на него." + }, + "Conversation.SwipeToReplyHintTitle": { + "key": "Conversation.SwipeToReplyHintTitle", + "value": "Проведите для ответа" + }, + "Conversation.TapAndHoldToRecord": { + "key": "Conversation.TapAndHoldToRecord", + "value": "Нажмите и удерживайте для записи" + }, + "Conversation.TextCopied": { + "key": "Conversation.TextCopied", + "value": "Текст скопирован в буфер обмена" + }, + "Conversation.Theme": { + "key": "Conversation.Theme", + "value": "Цветовая тема" + }, + "Conversation.Timer.Send": { + "key": "Conversation.Timer.Send", + "value": "Задать таймер" + }, + "Conversation.Timer.Title": { + "key": "Conversation.Timer.Title", + "value": "Задать таймер" + }, + "Conversation.TitleComments": { + "key": "Conversation.TitleComments", + "zeroValue": null, + "oneValue": "[%@]комментарий", + "twoValue": null, + "fewValue": "[%@]комментария", + "manyValue": "[%@]комментариев", + "otherValue": "[%@]комментария" + }, + "Conversation.TitleCommentsEmpty": { + "key": "Conversation.TitleCommentsEmpty", + "value": "Комментарии " + }, + "Conversation.TitleCommentsFormat": { + "key": "Conversation.TitleCommentsFormat", + "value": "%1$@ %2$@" + }, + "Conversation.TitleMute": { + "key": "Conversation.TitleMute", + "value": "Убрать звук" + }, + "Conversation.TitleNoComments": { + "key": "Conversation.TitleNoComments", + "value": "Комментарии" + }, + "Conversation.TitleReplies": { + "key": "Conversation.TitleReplies", + "zeroValue": null, + "oneValue": "[%@] ответ", + "twoValue": null, + "fewValue": "[%@] ответа", + "manyValue": "[%@] ответов", + "otherValue": "[%@] ответа" + }, + "Conversation.TitleRepliesEmpty": { + "key": "Conversation.TitleRepliesEmpty", + "value": "Ответы" + }, + "Conversation.TitleRepliesFormat": { + "key": "Conversation.TitleRepliesFormat", + "value": "%1$@ %2$@" + }, + "Conversation.TitleUnmute": { + "key": "Conversation.TitleUnmute", + "value": "Вкл. звук" + }, + "Conversation.Unarchive": { + "key": "Conversation.Unarchive", + "value": "Вернуть" + }, + "Conversation.UnarchiveDone": { + "key": "Conversation.UnarchiveDone", + "value": "Чат перенесен в основной список." + }, + "Conversation.Unblock": { + "key": "Conversation.Unblock", + "value": "Разблокировать" + }, + "Conversation.UnblockUser": { + "key": "Conversation.UnblockUser", + "value": "Разблокировать пользователя" + }, + "Conversation.Unmute": { + "key": "Conversation.Unmute", + "value": "Вкл. звук" + }, + "Conversation.Unpin": { + "key": "Conversation.Unpin", + "value": "Открепить" + }, + "Conversation.UnpinMessageAlert": { + "key": "Conversation.UnpinMessageAlert", + "value": "Хотите открепить это сообщение?" + }, + "Conversation.UnreadMessages": { + "key": "Conversation.UnreadMessages", + "value": "Непрочитанные сообщения" + }, + "Conversation.UnsupportedMedia": { + "key": "Conversation.UnsupportedMedia", + "value": "Это сообщение не поддерживается вашей версией Telegram. Пожалуйста, обновите приложение, чтобы его увидеть: https://telegram.org/update" + }, + "Conversation.UnsupportedMediaPlaceholder": { + "key": "Conversation.UnsupportedMediaPlaceholder", + "value": "Сообщение не поддерживается в Вашей версии Telegram. Пожалуйста, обновитесь до последней версии." + }, + "Conversation.UnvotePoll": { + "key": "Conversation.UnvotePoll", + "value": "Отменить голос" + }, + "Conversation.UpdateTelegram": { + "key": "Conversation.UpdateTelegram", + "value": "ОБНОВИТЬ TELEGRAM" + }, + "Conversation.UploadFileTooLarge": { + "key": "Conversation.UploadFileTooLarge", + "value": "Не удалось отправить файл, так как он больше 2 Гб.\n\nВы можете отправить сколько угодно файлов, но размер каждого не должен превышать 2 Гб." + }, + "Conversation.UsersTooMuchError": { + "key": "Conversation.UsersTooMuchError", + "value": "К сожалению, группа переполнена." + }, + "Conversation.ViewBackground": { + "key": "Conversation.ViewBackground", + "value": "ПОСМОТРЕТЬ ФОН" + }, + "Conversation.ViewChannel": { + "key": "Conversation.ViewChannel", + "value": "ПЕРЕЙТИ В КАНАЛ" + }, + "Conversation.ViewContactDetails": { + "key": "Conversation.ViewContactDetails", + "value": "ПРОСМОТР КОНТАКТА" + }, + "Conversation.ViewGroup": { + "key": "Conversation.ViewGroup", + "value": "ПЕРЕЙТИ В ГРУППУ" + }, + "Conversation.ViewMessage": { + "key": "Conversation.ViewMessage", + "value": "К СООБЩЕНИЮ" + }, + "Conversation.ViewReply": { + "key": "Conversation.ViewReply", + "value": "Просмотреть в чате" + }, + "Conversation.ViewTheme": { + "key": "Conversation.ViewTheme", + "value": "ПРОСМОТР ТЕМЫ" + }, + "Conversation.VoiceChatMediaRecordingRestricted": { + "key": "Conversation.VoiceChatMediaRecordingRestricted", + "value": "Во время голосового чата нельзя записывать голосовые сообщения и видеосообщения." + }, + "Conversation.typing": { + "key": "Conversation.typing", + "value": "печатает" + }, + "ConversationMedia.Title": { + "key": "ConversationMedia.Title", + "value": "Материалы" + }, + "ConversationProfile.ErrorCreatingConversation": { + "key": "ConversationProfile.ErrorCreatingConversation", + "value": "Произошла ошибка" + }, + "ConversationProfile.LeaveDeleteAndExit": { + "key": "ConversationProfile.LeaveDeleteAndExit", + "value": "Удалить и выйти" + }, + "ConversationProfile.UnknownAddMemberError": { + "key": "ConversationProfile.UnknownAddMemberError", + "value": "Произошла непредвиденная ошибка. Наши специалисты уже уведомлены и решат её в ближайшее время. Приносим свои извинения." + }, + "ConversationProfile.UsersTooMuchError": { + "key": "ConversationProfile.UsersTooMuchError", + "value": "Группа переполнена. Вы не можете приглашать в неё новых участников." + }, + "ConvertToSupergroup.HelpText": { + "key": "ConvertToSupergroup.HelpText", + "value": "• Новые участники могут видеть всю историю сообщений\n• Удалённые сообщения исчезают для всех участников\n• Администраторы могут указать описание группы\n• Создатель может выбрать для группы публичную ссылку" + }, + "ConvertToSupergroup.HelpTitle": { + "key": "ConvertToSupergroup.HelpTitle", + "value": "**В супергруппах:**" + }, + "ConvertToSupergroup.Note": { + "key": "ConvertToSupergroup.Note", + "value": "**Внимание:** это действие не может быть отменено." + }, + "ConvertToSupergroup.Title": { + "key": "ConvertToSupergroup.Title", + "value": "Супергруппа" + }, + "Core.ServiceUserStatus": { + "key": "Core.ServiceUserStatus", + "value": "служебные уведомления" + }, + "Coub.TapForSound": { + "key": "Coub.TapForSound", + "value": "Включить звук" + }, + "CreateGroup.ChannelsTooMuch": { + "key": "CreateGroup.ChannelsTooMuch", + "value": "У Вас максимальное число групп и каналов. Пожалуйста, покиньте какую-нибудь группу или канал, прежде чем создавать новые." + }, + "CreateGroup.ErrorLocatedGroupsTooMuch": { + "key": "CreateGroup.ErrorLocatedGroupsTooMuch", + "value": "Вы создали максимальное число групп с геопозицией. Пожалуйста, сперва удалите одну из уже созданных групп." + }, + "CreateGroup.SoftUserLimitAlert": { + "key": "CreateGroup.SoftUserLimitAlert", + "value": "Вы сможете добавить больше участников после создания группы." + }, + "CreatePoll.AddMoreOptions": { + "key": "CreatePoll.AddMoreOptions", + "zeroValue": null, + "oneValue": "Можно добавить ещё %@ вариант ответа.", + "twoValue": null, + "fewValue": "Можно добавить ещё %@ варианта ответа.", + "manyValue": "Можно добавить ещё %@ вариантов ответа.", + "otherValue": "Можно добавить ещё %@ вариантов ответа." + }, + "CreatePoll.AddOption": { + "key": "CreatePoll.AddOption", + "value": "Добавить ответ" + }, + "CreatePoll.AllOptionsAdded": { + "key": "CreatePoll.AllOptionsAdded", + "value": "Вы указали максимальное количество вариантов ответа." + }, + "CreatePoll.Anonymous": { + "key": "CreatePoll.Anonymous", + "value": "Анонимное голосование" + }, + "CreatePoll.CancelConfirmation": { + "key": "CreatePoll.CancelConfirmation", + "value": "Вы точно хотите удалить этот опрос?" + }, + "CreatePoll.Create": { + "key": "CreatePoll.Create", + "value": "Создать" + }, + "CreatePoll.Explanation": { + "key": "CreatePoll.Explanation", + "value": "Добавить комментарий (необязательно)" + }, + "CreatePoll.ExplanationHeader": { + "key": "CreatePoll.ExplanationHeader", + "value": "ОБЪЯСНЕНИЕ" + }, + "CreatePoll.ExplanationInfo": { + "key": "CreatePoll.ExplanationInfo", + "value": "Участники увидят этот текст, если выберут неправильный ответ (полезно для образовательных тестов)." + }, + "CreatePoll.MultipleChoice": { + "key": "CreatePoll.MultipleChoice", + "value": "Выбор нескольких ответов" + }, + "CreatePoll.MultipleChoiceQuizAlert": { + "key": "CreatePoll.MultipleChoiceQuizAlert", + "value": "В викторинах только один правильный ответ." + }, + "CreatePoll.OptionPlaceholder": { + "key": "CreatePoll.OptionPlaceholder", + "value": "Ответ" + }, + "CreatePoll.OptionsHeader": { + "key": "CreatePoll.OptionsHeader", + "value": "ВАРИАНТЫ ОТВЕТА" + }, + "CreatePoll.Quiz": { + "key": "CreatePoll.Quiz", + "value": "Режим викторины" + }, + "CreatePoll.QuizInfo": { + "key": "CreatePoll.QuizInfo", + "value": "В викторинах есть правильный вариант ответа, а пользователям недоступна возможность переголосовать." + }, + "CreatePoll.QuizOptionsHeader": { + "key": "CreatePoll.QuizOptionsHeader", + "value": "ВАРИАНТЫ ОТВЕТА" + }, + "CreatePoll.QuizTip": { + "key": "CreatePoll.QuizTip", + "value": "Выберите правильный ответ" + }, + "CreatePoll.QuizTitle": { + "key": "CreatePoll.QuizTitle", + "value": "Новая викторина" + }, + "CreatePoll.TextHeader": { + "key": "CreatePoll.TextHeader", + "value": "ВОПРОС" + }, + "CreatePoll.TextPlaceholder": { + "key": "CreatePoll.TextPlaceholder", + "value": "Задайте вопрос" + }, + "CreatePoll.Title": { + "key": "CreatePoll.Title", + "value": "Новый опрос" + }, + "DataUpgrade.Running": { + "key": "DataUpgrade.Running", + "value": "Оптимизация..." + }, + "Date.ChatDateHeader": { + "key": "Date.ChatDateHeader", + "value": "%2$@ %1$@" + }, + "Date.ChatDateHeaderYear": { + "key": "Date.ChatDateHeaderYear", + "value": "%2$@ %1$@ %3$@" + }, + "Date.DialogDateFormat": { + "key": "Date.DialogDateFormat", + "value": "{day} {month} " + }, + "DialogList.AdLabel": { + "key": "DialogList.AdLabel", + "value": "Спонсор прокси" + }, + "DialogList.AdNoticeAlert": { + "key": "DialogList.AdNoticeAlert", + "value": "Этот канал показан прокси-сервером. Чтобы убрать канал из списка чатов, отключите прокси в настройках Telegram." + }, + "DialogList.AwaitingEncryption": { + "key": "DialogList.AwaitingEncryption", + "value": "Ждём, когда %@ появится в сети…" + }, + "DialogList.ClearHistoryConfirmation": { + "key": "DialogList.ClearHistoryConfirmation", + "value": "Очистить историю" + }, + "DialogList.DeleteBotConfirmation": { + "key": "DialogList.DeleteBotConfirmation", + "value": "Удалить" + }, + "DialogList.DeleteBotConversationConfirmation": { + "key": "DialogList.DeleteBotConversationConfirmation", + "value": "Удалить и остановить" + }, + "DialogList.DeleteConversationConfirmation": { + "key": "DialogList.DeleteConversationConfirmation", + "value": "Удалить и выйти" + }, + "DialogList.Draft": { + "key": "DialogList.Draft", + "value": "Черновик" + }, + "DialogList.EncryptedChatStartedIncoming": { + "key": "DialogList.EncryptedChatStartedIncoming", + "value": "%@ создал(а) секретный чат." + }, + "DialogList.EncryptedChatStartedOutgoing": { + "key": "DialogList.EncryptedChatStartedOutgoing", + "value": " Вы создали секретный чат с %@." + }, + "DialogList.EncryptionProcessing": { + "key": "DialogList.EncryptionProcessing", + "value": "Обмен ключами шифрования…" + }, + "DialogList.EncryptionRejected": { + "key": "DialogList.EncryptionRejected", + "value": "Секретный чат отменен" + }, + "DialogList.LanguageTooltip": { + "key": "DialogList.LanguageTooltip", + "value": "Вы всегда можете изменить язык в настройках" + }, + "DialogList.LiveLocationChatsCount": { + "key": "DialogList.LiveLocationChatsCount", + "zeroValue": null, + "oneValue": "транслируется в %@ чат", + "twoValue": null, + "fewValue": "транслируется в %@ чата", + "manyValue": "транслируется в %@ чатов", + "otherValue": "транслируется в %@ чатов" + }, + "DialogList.LiveLocationSharingTo": { + "key": "DialogList.LiveLocationSharingTo", + "value": "доступна для %@" + }, + "DialogList.MultipleTyping": { + "key": "DialogList.MultipleTyping", + "value": "%@ и %@" + }, + "DialogList.MultipleTypingPair": { + "key": "DialogList.MultipleTypingPair", + "value": "%@ и %@ печатают" + }, + "DialogList.MultipleTypingSuffix": { + "key": "DialogList.MultipleTypingSuffix", + "value": "%d набирают текст" + }, + "DialogList.NoMessagesText": { + "key": "DialogList.NoMessagesText", + "value": "Чтобы написать кому-нибудь сообщение, нажмите на иконку карандаша в правом верхнем углу или зайдите в «Контакты»." + }, + "DialogList.NoMessagesTitle": { + "key": "DialogList.NoMessagesTitle", + "value": "У Вас пока нет сообщений" + }, + "DialogList.PasscodeLockHelp": { + "key": "DialogList.PasscodeLockHelp", + "value": "Нажмите для блокировки приложения" + }, + "DialogList.Pin": { + "key": "DialogList.Pin", + "value": "Закрепить" + }, + "DialogList.PinLimitError": { + "key": "DialogList.PinLimitError", + "value": "К сожалению, закрепить можно не больше %@ чатов." + }, + "DialogList.ProxyConnectionIssuesTooltip": { + "key": "DialogList.ProxyConnectionIssuesTooltip", + "value": "Не удалось подключиться к прокси.\nНажмите для настройки." + }, + "DialogList.Read": { + "key": "DialogList.Read", + "value": "Прочитать" + }, + "DialogList.RecentTitlePeople": { + "key": "DialogList.RecentTitlePeople", + "value": "Люди" + }, + "DialogList.Replies": { + "key": "DialogList.Replies", + "value": "Ответы" + }, + "DialogList.SavedMessages": { + "key": "DialogList.SavedMessages", + "value": "Избранное" + }, + "DialogList.SavedMessagesHelp": { + "key": "DialogList.SavedMessagesHelp", + "value": "Перешлите сообщение сюда, чтобы сохранить его" + }, + "DialogList.SavedMessagesTooltip": { + "key": "DialogList.SavedMessagesTooltip", + "value": "Найти избранные сообщения можно в Настройках" + }, + "DialogList.SearchLabel": { + "key": "DialogList.SearchLabel", + "value": "Поиск по чатам и людям" + }, + "DialogList.SearchSectionChats": { + "key": "DialogList.SearchSectionChats", + "value": "Чаты" + }, + "DialogList.SearchSectionDialogs": { + "key": "DialogList.SearchSectionDialogs", + "value": "Чаты и контакты" + }, + "DialogList.SearchSectionGlobal": { + "key": "DialogList.SearchSectionGlobal", + "value": "Глобальный поиск" + }, + "DialogList.SearchSectionMessages": { + "key": "DialogList.SearchSectionMessages", + "value": "Сообщения" + }, + "DialogList.SearchSectionRecent": { + "key": "DialogList.SearchSectionRecent", + "value": "Недавние" + }, + "DialogList.SearchSubtitleFormat": { + "key": "DialogList.SearchSubtitleFormat", + "value": "%1$@, %2$@" + }, + "DialogList.SinglePlayingGameSuffix": { + "key": "DialogList.SinglePlayingGameSuffix", + "value": "%@ сейчас играет" + }, + "DialogList.SingleRecordingAudioSuffix": { + "key": "DialogList.SingleRecordingAudioSuffix", + "value": "%@ записывает аудио" + }, + "DialogList.SingleRecordingVideoMessageSuffix": { + "key": "DialogList.SingleRecordingVideoMessageSuffix", + "value": "%@ записывает видео" + }, + "DialogList.SingleTypingSuffix": { + "key": "DialogList.SingleTypingSuffix", + "value": "%@ печатает" + }, + "DialogList.SingleUploadingFileSuffix": { + "key": "DialogList.SingleUploadingFileSuffix", + "value": "%@ отправляет файл" + }, + "DialogList.SingleUploadingPhotoSuffix": { + "key": "DialogList.SingleUploadingPhotoSuffix", + "value": "%@ отправляет фото" + }, + "DialogList.SingleUploadingVideoSuffix": { + "key": "DialogList.SingleUploadingVideoSuffix", + "value": "%@ отправляет видео" + }, + "DialogList.TabTitle": { + "key": "DialogList.TabTitle", + "value": "Чаты" + }, + "DialogList.Title": { + "key": "DialogList.Title", + "value": "Чаты" + }, + "DialogList.Typing": { + "key": "DialogList.Typing", + "value": "печатает" + }, + "DialogList.UnknownPinLimitError": { + "key": "DialogList.UnknownPinLimitError", + "value": "У Вас закреплено максимальное число чатов." + }, + "DialogList.Unpin": { + "key": "DialogList.Unpin", + "value": "Открепить" + }, + "DialogList.Unread": { + "key": "DialogList.Unread", + "value": "Не прочитан" + }, + "DialogList.You": { + "key": "DialogList.You", + "value": "Вы" + }, + "Document.TargetConfirmationFormat": { + "key": "Document.TargetConfirmationFormat", + "value": "Отправить файл ({size}) пользователю {target}?" + }, + "DownloadingStatus": { + "key": "DownloadingStatus", + "value": "загружено %@ из %@" + }, + "ENCRYPTED_MESSAGE": { + "key": "ENCRYPTED_MESSAGE", + "value": "Вам пришло сообщение%1$@" + }, + "ENCRYPTION_ACCEPT": { + "key": "ENCRYPTION_ACCEPT", + "value": "Ваш секретный чат принят%1$@" + }, + "ENCRYPTION_REQUEST": { + "key": "ENCRYPTION_REQUEST", + "value": "Новый секретный чат%1$@" + }, + "EditProfile.NameAndPhotoHelp": { + "key": "EditProfile.NameAndPhotoHelp", + "value": "Укажите имя и, если хотите, добавьте фотографию для Вашего профиля." + }, + "EditProfile.NameAndPhotoOrVideoHelp": { + "key": "EditProfile.NameAndPhotoOrVideoHelp", + "value": "Укажите свое имя и загрузите фотографию или видео профиля." + }, + "EditProfile.Title": { + "key": "EditProfile.Title", + "value": "Изменить профиль" + }, + "EditTheme.ChangeColors": { + "key": "EditTheme.ChangeColors", + "value": "Изменить цвета" + }, + "EditTheme.Create.BottomInfo": { + "key": "EditTheme.Create.BottomInfo", + "value": "Вы также можете загрузить файл с нужной темой." + }, + "EditTheme.Create.Preview.IncomingReplyName": { + "key": "EditTheme.Create.Preview.IncomingReplyName", + "value": "Боб" + }, + "EditTheme.Create.Preview.IncomingReplyText": { + "key": "EditTheme.Create.Preview.IncomingReplyText", + "value": "Как это работает?" + }, + "EditTheme.Create.Preview.IncomingText": { + "key": "EditTheme.Create.Preview.IncomingText", + "value": "На основе выбранных цветов" + }, + "EditTheme.Create.Preview.OutgoingText": { + "key": "EditTheme.Create.Preview.OutgoingText", + "value": "Или готового файла с темой" + }, + "EditTheme.Create.TopInfo": { + "key": "EditTheme.Create.TopInfo", + "value": "Тема будет создана на основе цветов и фона, которые Вы сейчас используете." + }, + "EditTheme.CreateTitle": { + "key": "EditTheme.CreateTitle", + "value": "Создать тему" + }, + "EditTheme.Edit.BottomInfo": { + "key": "EditTheme.Edit.BottomInfo", + "value": "Вы можете загрузить новый файл с изменениями. Тема обновится у всех пользователей." + }, + "EditTheme.Edit.Preview.IncomingReplyName": { + "key": "EditTheme.Edit.Preview.IncomingReplyName", + "value": "Боб" + }, + "EditTheme.Edit.Preview.IncomingReplyText": { + "key": "EditTheme.Edit.Preview.IncomingReplyText", + "value": "Как это работает?" + }, + "EditTheme.Edit.Preview.IncomingText": { + "key": "EditTheme.Edit.Preview.IncomingText", + "value": "На основе выбранных цветов" + }, + "EditTheme.Edit.Preview.OutgoingText": { + "key": "EditTheme.Edit.Preview.OutgoingText", + "value": "Или готового файла с темой" + }, + "EditTheme.Edit.TopInfo": { + "key": "EditTheme.Edit.TopInfo", + "value": "По этой ссылке можно установить Вашу тему. Когда Вы редактируете тему, она будет обновляться у всех, кто её использует.\n\nМинимальная длина ссылки — **5** символов. Можно использовать символы **a-z, 0-9** и подчёркивание." + }, + "EditTheme.EditTitle": { + "key": "EditTheme.EditTitle", + "value": "Изменить тему" + }, + "EditTheme.ErrorInvalidCharacters": { + "key": "EditTheme.ErrorInvalidCharacters", + "value": "Эта ссылка некорректна." + }, + "EditTheme.ErrorLinkTaken": { + "key": "EditTheme.ErrorLinkTaken", + "value": "К сожалению, ссылка уже занята." + }, + "EditTheme.Expand.BottomInfo": { + "key": "EditTheme.Expand.BottomInfo", + "value": "Вы также можете загрузить файл с нужной темой." + }, + "EditTheme.Expand.Preview.IncomingReplyName": { + "key": "EditTheme.Expand.Preview.IncomingReplyName", + "value": "Боб" + }, + "EditTheme.Expand.Preview.IncomingReplyText": { + "key": "EditTheme.Expand.Preview.IncomingReplyText", + "value": "Как это работает?" + }, + "EditTheme.Expand.Preview.IncomingText": { + "key": "EditTheme.Expand.Preview.IncomingText", + "value": "На основе выбранных цветов" + }, + "EditTheme.Expand.Preview.OutgoingText": { + "key": "EditTheme.Expand.Preview.OutgoingText", + "value": "Или готового файла с темой" + }, + "EditTheme.Expand.TopInfo": { + "key": "EditTheme.Expand.TopInfo", + "value": "Тема будет создана на основе цветов и фона, которые Вы сейчас используете." + }, + "EditTheme.FileReadError": { + "key": "EditTheme.FileReadError", + "value": "Некорректный файл темы" + }, + "EditTheme.Preview": { + "key": "EditTheme.Preview", + "value": "ПРЕДПРОСМОТР" + }, + "EditTheme.ShortLink": { + "key": "EditTheme.ShortLink", + "value": "ссылка" + }, + "EditTheme.ShortLinkInfo": { + "key": "EditTheme.ShortLinkInfo", + "value": "По ссылке можно установить Вашу тему. Когда Вы редактируете тему, она будет обновляться у всех, кто её использует.\n\nМинимальная длина ссылки — 5 символов. Можно использовать a-z, 0-9 и _." + }, + "EditTheme.ThemeTemplateAlert": { + "key": "EditTheme.ThemeTemplateAlert", + "value": "Тема добавлена\n\nНажмите на тему и удерживайте, чтобы отредактировать её или задать короткую ссылку. При изменениях тема будет обновляться у тех, кто её установил.\n\nДля тонкой настройки можно использовать файл с темой, который доступен в Вашем чате «Избранное»." + }, + "EditTheme.ThemeTemplateAlertText": { + "key": "EditTheme.ThemeTemplateAlertText", + "value": "Нажмите на тему и удерживайте, чтобы отредактировать её или задать короткую ссылку. При изменениях тема будет обновляться у тех, кто её установил.\n\nДля тонкой настройки можно использовать файл с темой, который доступен в Вашем чате «Избранное»." + }, + "EditTheme.ThemeTemplateAlertTitle": { + "key": "EditTheme.ThemeTemplateAlertTitle", + "value": "Тема добавлена" + }, + "EditTheme.Title": { + "key": "EditTheme.Title", + "value": "Название темы" + }, + "EditTheme.UploadEditedInfo": { + "key": "EditTheme.UploadEditedInfo", + "value": "Загрузите файл с изменениями, и тема обновится у всех пользователей." + }, + "EditTheme.UploadEditedTheme": { + "key": "EditTheme.UploadEditedTheme", + "value": "Загрузить из файла..." + }, + "EditTheme.UploadNewInfo": { + "key": "EditTheme.UploadNewInfo", + "value": "По умолчанию тема будет создана на основе темы и фона, которые Вы используете. Вы также можете загрузить файл с нужной темой." + }, + "EditTheme.UploadNewTheme": { + "key": "EditTheme.UploadNewTheme", + "value": "Загрузить из файла..." + }, + "Embed.PlayingInPIP": { + "key": "Embed.PlayingInPIP", + "value": "Видео воспроизводится в режиме «картинка в картинке»" + }, + "EmptyGroupInfo.Line1": { + "key": "EmptyGroupInfo.Line1", + "value": "До 200,000 участников" + }, + "EmptyGroupInfo.Line2": { + "key": "EmptyGroupInfo.Line2", + "value": "Общая история переписки" + }, + "EmptyGroupInfo.Line3": { + "key": "EmptyGroupInfo.Line3", + "value": "Публичные ссылки вида t.me/title" + }, + "EmptyGroupInfo.Line4": { + "key": "EmptyGroupInfo.Line4", + "value": "Разный уровень прав" + }, + "EmptyGroupInfo.Subtitle": { + "key": "EmptyGroupInfo.Subtitle", + "value": "Возможности групп:" + }, + "EmptyGroupInfo.Title": { + "key": "EmptyGroupInfo.Title", + "value": "Вы создали группу" + }, + "EncryptionKey.Description": { + "key": "EncryptionKey.Description", + "value": "Это изображение и текст основаны на ключе шифрования для секретного чата с %1$@.\n\nЕсли они выглядят так же на устройстве у %2$@, ваше соединение надёжно зашифровано.\n\nУзнайте больше на telegram.org" + }, + "EncryptionKey.Title": { + "key": "EncryptionKey.Title", + "value": "Ключ шифрования" + }, + "EnterPasscode.ChangeTitle": { + "key": "EnterPasscode.ChangeTitle", + "value": "Смена кода-пароля" + }, + "EnterPasscode.EnterCurrentPasscode": { + "key": "EnterPasscode.EnterCurrentPasscode", + "value": "Введите старый код-пароль" + }, + "EnterPasscode.EnterNewPasscodeChange": { + "key": "EnterPasscode.EnterNewPasscodeChange", + "value": "Введите новый код-пароль" + }, + "EnterPasscode.EnterNewPasscodeNew": { + "key": "EnterPasscode.EnterNewPasscodeNew", + "value": "Введите код-пароль" + }, + "EnterPasscode.EnterPasscode": { + "key": "EnterPasscode.EnterPasscode", + "value": "Введите код-пароль от Telegram" + }, + "EnterPasscode.EnterTitle": { + "key": "EnterPasscode.EnterTitle", + "value": "Введите код-пароль от Telegram" + }, + "EnterPasscode.RepeatNewPasscode": { + "key": "EnterPasscode.RepeatNewPasscode", + "value": "Повторите код-пароль" + }, + "EnterPasscode.TouchId": { + "key": "EnterPasscode.TouchId", + "value": "Разблокировка Telegram" + }, + "Exceptions.AddToExceptions": { + "key": "Exceptions.AddToExceptions", + "value": "ДОБАВИТЬ В ИСКЛЮЧЕНИЯ" + }, + "ExplicitContent.AlertChannel": { + "key": "ExplicitContent.AlertChannel", + "value": "Этот канал недоступен, поскольку нарушает правила App Store." + }, + "ExplicitContent.AlertTitle": { + "key": "ExplicitContent.AlertTitle", + "value": "Сожалеем" + }, + "External.OpenIn": { + "key": "External.OpenIn", + "value": "Открыть в %@" + }, + "FastTwoStepSetup.EmailHelp": { + "key": "FastTwoStepSetup.EmailHelp", + "value": "Укажите настоящий Email. Это единственный способ восстановить аккаунт при утрате пароля." + }, + "FastTwoStepSetup.EmailPlaceholder": { + "key": "FastTwoStepSetup.EmailPlaceholder", + "value": "Ваш Email" + }, + "FastTwoStepSetup.EmailSection": { + "key": "FastTwoStepSetup.EmailSection", + "value": "EMAIL ВОССТАНОВЛЕНИЯ" + }, + "FastTwoStepSetup.HintHelp": { + "key": "FastTwoStepSetup.HintHelp", + "value": "Если хотите, укажите подсказку для пароля" + }, + "FastTwoStepSetup.HintPlaceholder": { + "key": "FastTwoStepSetup.HintPlaceholder", + "value": "Введите подсказку" + }, + "FastTwoStepSetup.HintSection": { + "key": "FastTwoStepSetup.HintSection", + "value": "ПОДСКАЗКА" + }, + "FastTwoStepSetup.PasswordConfirmationPlaceholder": { + "key": "FastTwoStepSetup.PasswordConfirmationPlaceholder", + "value": "Повторите пароль" + }, + "FastTwoStepSetup.PasswordHelp": { + "key": "FastTwoStepSetup.PasswordHelp", + "value": "Пожалуйста, установите пароль, чтобы защитить вашу платёжную информацию. Этот же пароль необходимо будет вводить, чтобы войти в Telegram с нового устройства." + }, + "FastTwoStepSetup.PasswordPlaceholder": { + "key": "FastTwoStepSetup.PasswordPlaceholder", + "value": "Придумайте пароль" + }, + "FastTwoStepSetup.PasswordSection": { + "key": "FastTwoStepSetup.PasswordSection", + "value": "ПАРОЛЬ" + }, + "FastTwoStepSetup.Title": { + "key": "FastTwoStepSetup.Title", + "value": "Пароль и Email" + }, + "FeatureDisabled.Oops": { + "key": "FeatureDisabled.Oops", + "value": "Приносим извинения" + }, + "FeaturedStickerPacks.Title": { + "key": "FeaturedStickerPacks.Title", + "value": "Популярные стикеры" + }, + "FeaturedStickers.OtherSection": { + "key": "FeaturedStickers.OtherSection", + "value": "ДРУГИЕ СТИКЕРЫ" + }, + "FileSize.B": { + "key": "FileSize.B", + "value": "%@ Б" + }, + "FileSize.GB": { + "key": "FileSize.GB", + "value": "%@ Гб" + }, + "FileSize.KB": { + "key": "FileSize.KB", + "value": "%@ КБ" + }, + "FileSize.MB": { + "key": "FileSize.MB", + "value": "%@ МБ" + }, + "Forward.ChannelReadOnly": { + "key": "Forward.ChannelReadOnly", + "value": "К сожалению, Вы не можете отправлять сообщения в этот канал." + }, + "Forward.ConfirmMultipleFiles": { + "key": "Forward.ConfirmMultipleFiles", + "zeroValue": null, + "oneValue": "Отправить %@ файл {target}?", + "twoValue": null, + "fewValue": "Отправить %@ файла {target}?", + "manyValue": "Отправить %@ файлов {target}?", + "otherValue": "Отправить %@ файла {target}?" + }, + "Forward.ErrorDisabledForChat": { + "key": "Forward.ErrorDisabledForChat", + "value": "Вы не можете пересылать сообщения в этот чат." + }, + "Forward.ErrorPublicPollDisabledInChannels": { + "key": "Forward.ErrorPublicPollDisabledInChannels", + "value": "Опросы с открытым списком результатов нельзя пересылать в каналы." + }, + "Forward.ErrorPublicQuizDisabledInChannels": { + "key": "Forward.ErrorPublicQuizDisabledInChannels", + "value": "Опросы с открытым списком результатов нельзя пересылать в каналы." + }, + "ForwardedAudios": { + "key": "ForwardedAudios", + "zeroValue": null, + "oneValue": "%@ пересланное голосовое сообщение", + "twoValue": null, + "fewValue": "%@ пересланных голосовых сообщения", + "manyValue": "%@ пересланных голосовых сообщений", + "otherValue": "%@ пересланных голосовых сообщений" + }, + "ForwardedAuthors2": { + "key": "ForwardedAuthors2", + "value": "%@, %@" + }, + "ForwardedAuthorsOthers": { + "key": "ForwardedAuthorsOthers", + "zeroValue": null, + "oneValue": "%@ и ещё %@", + "twoValue": null, + "fewValue": "%@ и %@ других", + "manyValue": "%@ и %@ других", + "otherValue": "%@ и %@ других" + }, + "ForwardedContacts": { + "key": "ForwardedContacts", + "zeroValue": null, + "oneValue": "%@ пересылаемый контакт", + "twoValue": null, + "fewValue": "%@ пересылаемых контакта", + "manyValue": "%@ пересылаемых контактов", + "otherValue": "%@ пересылаемых контакта" + }, + "ForwardedDices": { + "key": "ForwardedDices", + "zeroValue": null, + "oneValue": "Переслан %@ кубик", + "twoValue": null, + "fewValue": "Переслано %@ кубика", + "manyValue": "Переслано %@ кубиков", + "otherValue": "Переслано %@ кубика" + }, + "ForwardedFiles": { + "key": "ForwardedFiles", + "zeroValue": null, + "oneValue": "%@ пересылаемый файл", + "twoValue": null, + "fewValue": "%@ пересылаемых файла", + "manyValue": "%@ пересылаемых файлов", + "otherValue": "%@ пересылаемых файла" + }, + "ForwardedGifs": { + "key": "ForwardedGifs", + "zeroValue": null, + "oneValue": "%@ пересылаемый GIF", + "twoValue": null, + "fewValue": "%@ пересылаемых GIF'а", + "manyValue": "%@ пересылаемых GIF'ов", + "otherValue": "%@ переслаемых GIF'a" + }, + "ForwardedLocations": { + "key": "ForwardedLocations", + "zeroValue": null, + "oneValue": "Пересылка %@ геопозиции", + "twoValue": null, + "fewValue": "Пересылка %@ геопозиций", + "manyValue": "Пересылка %@ геопозиций", + "otherValue": "Пересылка %@ геопозиций" + }, + "ForwardedMessages": { + "key": "ForwardedMessages", + "zeroValue": null, + "oneValue": "%@ пересланное сообщение", + "twoValue": null, + "fewValue": "%@ пересланных сообщения", + "manyValue": "%@ пересланных сообщений", + "otherValue": "%@ пересланных сообщения" + }, + "ForwardedPhotos": { + "key": "ForwardedPhotos", + "zeroValue": null, + "oneValue": "%@ пересылаемое фото", + "twoValue": null, + "fewValue": "%@ пересылаемых фото", + "manyValue": "%@ пересылаемых фото", + "otherValue": "%@ пересылаемых фото" + }, + "ForwardedPolls": { + "key": "ForwardedPolls", + "zeroValue": null, + "oneValue": "%@ пересылаемый опрос", + "twoValue": null, + "fewValue": "%@ пересылаемых опроса", + "manyValue": "%@ пересылаемых опросов", + "otherValue": "%@ пересылаемых опросов" + }, + "ForwardedStickers": { + "key": "ForwardedStickers", + "zeroValue": null, + "oneValue": "%@ пересылаемый стикер", + "twoValue": null, + "fewValue": "%@ пересылаемых стикера", + "manyValue": "%@ пересылаемых стикеров", + "otherValue": "%@ пересылаемых стикера" + }, + "ForwardedVideoMessages": { + "key": "ForwardedVideoMessages", + "zeroValue": null, + "oneValue": "%@ пересланное видеосообщение", + "twoValue": null, + "fewValue": "%@ пересланное видеосообщение", + "manyValue": "%@ пересланных видеосообщений", + "otherValue": "%@ пересланных видеосообщения" + }, + "ForwardedVideos": { + "key": "ForwardedVideos", + "zeroValue": null, + "oneValue": "%@ пересылаемое видео", + "twoValue": null, + "fewValue": "%@ пересылаемых видео ", + "manyValue": "%@ пересылаемых видео ", + "otherValue": "%@ пересылаемых видео " + }, + "Generic.ErrorMoreInfo": { + "key": "Generic.ErrorMoreInfo", + "value": "Подробнее" + }, + "Generic.OpenHiddenLinkAlert": { + "key": "Generic.OpenHiddenLinkAlert", + "value": "Открыть %@?" + }, + "Gif.NoGifsFound": { + "key": "Gif.NoGifsFound", + "value": "GIF не найдены" + }, + "Gif.NoGifsPlaceholder": { + "key": "Gif.NoGifsPlaceholder", + "value": "Сохранённых GIF пока нет." + }, + "Gif.Search": { + "key": "Gif.Search", + "value": "Поиск GIF" + }, + "Group.About.Help": { + "key": "Group.About.Help", + "value": "Можете указать дополнительное описание для Вашей группы." + }, + "Group.AdminLog.EmptyText": { + "key": "Group.AdminLog.EmptyText", + "value": "За последние 48 часов администраторы и участники не совершали служебных действий." + }, + "Group.DeleteGroup": { + "key": "Group.DeleteGroup", + "value": "Удалить группу" + }, + "Group.EditAdmin.PermissionChangeInfo": { + "key": "Group.EditAdmin.PermissionChangeInfo", + "value": "Изменение профиля группы" + }, + "Group.EditAdmin.RankAdminPlaceholder": { + "key": "Group.EditAdmin.RankAdminPlaceholder", + "value": "админ" + }, + "Group.EditAdmin.RankInfo": { + "key": "Group.EditAdmin.RankInfo", + "value": "Должность, которая будет показываться в подписи вместо «%@»." + }, + "Group.EditAdmin.RankOwnerPlaceholder": { + "key": "Group.EditAdmin.RankOwnerPlaceholder", + "value": "владелец" + }, + "Group.EditAdmin.RankTitle": { + "key": "Group.EditAdmin.RankTitle", + "value": "ДОЛЖНОСТЬ" + }, + "Group.EditAdmin.TransferOwnership": { + "key": "Group.EditAdmin.TransferOwnership", + "value": "Передать права на группу" + }, + "Group.ErrorAccessDenied": { + "key": "Group.ErrorAccessDenied", + "value": "Это частная группа." + }, + "Group.ErrorAddBlocked": { + "key": "Group.ErrorAddBlocked", + "value": "Вы не можете добавлять этого пользователя в группы." + }, + "Group.ErrorAddTooMuchAdmins": { + "key": "Group.ErrorAddTooMuchAdmins", + "value": "К сожалению, в этой группе максимальное количество администраторов." + }, + "Group.ErrorAddTooMuchBots": { + "key": "Group.ErrorAddTooMuchBots", + "value": "К сожалению, вы достигли максимального количества ботов в этой группе." + }, + "Group.ErrorAdminsTooMuch": { + "key": "Group.ErrorAdminsTooMuch", + "value": "В группе слишком много администраторов." + }, + "Group.ErrorNotMutualContact": { + "key": "Group.ErrorNotMutualContact", + "value": "К сожалению, в данный момент Вы можете добавлять в группы только взаимных контактов." + }, + "Group.ErrorSendRestrictedMedia": { + "key": "Group.ErrorSendRestrictedMedia", + "value": "Администраторы группы запретили Вам отправлять фото и видео." + }, + "Group.ErrorSendRestrictedStickers": { + "key": "Group.ErrorSendRestrictedStickers", + "value": "Администраторы группы запретили Вам отправлять стикеры." + }, + "Group.ErrorSupergroupConversionNotPossible": { + "key": "Group.ErrorSupergroupConversionNotPossible", + "value": "К сожалению, Вы участвуете в максимальном числе групп и каналов. Пожалуйста, покиньте какие-то из них, прежде чем создавать новые." + }, + "Group.GroupMembersHeader": { + "key": "Group.GroupMembersHeader", + "value": "УЧАСТНИКИ ГРУППЫ" + }, + "Group.Info.AdminLog": { + "key": "Group.Info.AdminLog", + "value": "Недавние действия" + }, + "Group.Info.Members": { + "key": "Group.Info.Members", + "value": "Участники" + }, + "Group.LeaveGroup": { + "key": "Group.LeaveGroup", + "value": "Покинуть группу" + }, + "Group.LinkedChannel": { + "key": "Group.LinkedChannel", + "value": "Привязанный канал" + }, + "Group.Location.ChangeLocation": { + "key": "Group.Location.ChangeLocation", + "value": "Изменить геопозицию" + }, + "Group.Location.CreateInThisPlace": { + "key": "Group.Location.CreateInThisPlace", + "value": "Выбрать место поблизости" + }, + "Group.Location.Info": { + "key": "Group.Location.Info", + "value": "Пользователи смогут найти Вашу группу в разделе «Люди рядом»." + }, + "Group.Location.Title": { + "key": "Group.Location.Title", + "value": "Геопозиция" + }, + "Group.Management.AddModeratorHelp": { + "key": "Group.Management.AddModeratorHelp", + "value": "Вы можете добавлять администраторов, чтобы они помогали Вам управлять группой." + }, + "Group.Members.AddMemberBotErrorNotAllowed": { + "key": "Group.Members.AddMemberBotErrorNotAllowed", + "value": "У Вас нет прав на добавление ботов в эту группу." + }, + "Group.Members.AddMembers": { + "key": "Group.Members.AddMembers", + "value": "Добавить участников" + }, + "Group.Members.AddMembersHelp": { + "key": "Group.Members.AddMembersHelp", + "value": "Этот список видят только администраторы группы." + }, + "Group.Members.Title": { + "key": "Group.Members.Title", + "value": "Участники" + }, + "Group.MessagePhotoRemoved": { + "key": "Group.MessagePhotoRemoved", + "value": "Фото группы удалено" + }, + "Group.MessagePhotoUpdated": { + "key": "Group.MessagePhotoUpdated", + "value": "Фото группы обновлено" + }, + "Group.MessageVideoUpdated": { + "key": "Group.MessageVideoUpdated", + "value": "Видео группы обновлено" + }, + "Group.OwnershipTransfer.DescriptionInfo": { + "key": "Group.OwnershipTransfer.DescriptionInfo", + "value": "В этом случае **права** на группу **%1$@** будут полностью переданы **%2$@**.\n\nВы больше не будете считаться создателем группы. Новый владелец сможет разжаловать Вас из администраторов или даже заблокировать." + }, + "Group.OwnershipTransfer.ErrorAdminsTooMuch": { + "key": "Group.OwnershipTransfer.ErrorAdminsTooMuch", + "value": "В группе максимальное число администраторов, поэтому нельзя назначить выбранного пользователя. Пожалуйста, сперва удалите кого-то из других администраторов." + }, + "Group.OwnershipTransfer.ErrorLocatedGroupsTooMuch": { + "key": "Group.OwnershipTransfer.ErrorLocatedGroupsTooMuch", + "value": "У этого пользователя максимальное число групп с геопозицией. Пожалуйста, предложите ему сперва удалить или передать кому-либо одну из его групп." + }, + "Group.OwnershipTransfer.ErrorPrivacyRestricted": { + "key": "Group.OwnershipTransfer.ErrorPrivacyRestricted", + "value": "Пользователь не состоит в группе, а Вы не можете пригласить его из-за его настроек конфиденциальности." + }, + "Group.OwnershipTransfer.Title": { + "key": "Group.OwnershipTransfer.Title", + "value": "Передать права на группу" + }, + "Group.PublicLink.Info": { + "key": "Group.PublicLink.Info", + "value": "Люди смогут делиться этой ссылкой, а также найти Вашу группу в поиске Telegram.\n\nДопускаются символы 0-9, a-z и _. Минимальная длина — 5 символов." + }, + "Group.PublicLink.Placeholder": { + "key": "Group.PublicLink.Placeholder", + "value": "ссылка" + }, + "Group.PublicLink.Title": { + "key": "Group.PublicLink.Title", + "value": "Публичная ссылка" + }, + "Group.Setup.BasicHistoryHiddenHelp": { + "key": "Group.Setup.BasicHistoryHiddenHelp", + "value": "Новые участники будут видеть не больше 100 последних сообщений." + }, + "Group.Setup.HistoryHeader": { + "key": "Group.Setup.HistoryHeader", + "value": "ИСТОРИЯ ЧАТА ДЛЯ НОВЫХ УЧАСТНИКОВ" + }, + "Group.Setup.HistoryHidden": { + "key": "Group.Setup.HistoryHidden", + "value": "Скрыта" + }, + "Group.Setup.HistoryHiddenHelp": { + "key": "Group.Setup.HistoryHiddenHelp", + "value": "Новые участники не будут видеть более ранних сообщений." + }, + "Group.Setup.HistoryTitle": { + "key": "Group.Setup.HistoryTitle", + "value": "История чата" + }, + "Group.Setup.HistoryVisible": { + "key": "Group.Setup.HistoryVisible", + "value": "Видна" + }, + "Group.Setup.HistoryVisibleHelp": { + "key": "Group.Setup.HistoryVisibleHelp", + "value": "Новые участники будут видеть полную историю сообщений." + }, + "Group.Setup.TypeHeader": { + "key": "Group.Setup.TypeHeader", + "value": "ТИП ГРУППЫ" + }, + "Group.Setup.TypePrivate": { + "key": "Group.Setup.TypePrivate", + "value": "Частная" + }, + "Group.Setup.TypePrivateHelp": { + "key": "Group.Setup.TypePrivateHelp", + "value": "В частные группы можно попасть только по приглашению или пригласительной ссылке." + }, + "Group.Setup.TypePublic": { + "key": "Group.Setup.TypePublic", + "value": "Публичная" + }, + "Group.Setup.TypePublicHelp": { + "key": "Group.Setup.TypePublicHelp", + "value": "Публичные группы можно найти через поиск, история чата доступна всем, и присоединиться может любой пользователь. " + }, + "Group.Status": { + "key": "Group.Status", + "value": "группа" + }, + "Group.UpgradeConfirmation": { + "key": "Group.UpgradeConfirmation", + "value": "Внимание: это действие нельзя будет отменить. Супергруппу нельзя сделать обычной группой." + }, + "Group.UpgradeNoticeHeader": { + "key": "Group.UpgradeNoticeHeader", + "value": "ДОСТИГНУТ ЛИМИТ УЧАСТНИКОВ" + }, + "Group.UpgradeNoticeText1": { + "key": "Group.UpgradeNoticeText1", + "value": "Чтобы пригласить больше участников и получить дополнительные возможности, сделайте группу супергруппой:" + }, + "Group.UpgradeNoticeText2": { + "key": "Group.UpgradeNoticeText2", + "value": "• Супергруппы могут достигать {supergroup_member_limit} участников\n• Новые участники могут видеть всю историю сообщений\n• Администраторы могут удалять сообщения для всех участников\n• Уведомления отключены по умолчанию" + }, + "Group.Username.CreatePrivateLinkHelp": { + "key": "Group.Username.CreatePrivateLinkHelp", + "value": "По этой ссылке можно вступить в Вашу группу. Вы можете сбросить ссылку в любой момент." + }, + "Group.Username.CreatePublicLinkHelp": { + "key": "Group.Username.CreatePublicLinkHelp", + "value": "Люди смогут делиться этой ссылкой с другими и найти Вашу группу через поиск Telegram." + }, + "Group.Username.InvalidStartsWithNumber": { + "key": "Group.Username.InvalidStartsWithNumber", + "value": "Короткие имена не могут начинаться с цифры." + }, + "Group.Username.InvalidTooShort": { + "key": "Group.Username.InvalidTooShort", + "value": "Короткие имена должны содержать не меньше 5 символов." + }, + "Group.Username.RemoveExistingUsernamesInfo": { + "key": "Group.Username.RemoveExistingUsernamesInfo", + "value": "Вы используете слишком много публичных ссылок. Вы можете сбросить одну из уже занятых ссылок на свои группы или каналы или не создавать новую публичную ссылку." + }, + "Group.Username.RevokeExistingUsernamesInfo": { + "key": "Group.Username.RevokeExistingUsernamesInfo", + "value": "Вы можете создать частную группу или сбросить одну из уже занятых ссылок на свои группы или каналы." + }, + "GroupInfo.ActionPromote": { + "key": "GroupInfo.ActionPromote", + "value": "Повысить" + }, + "GroupInfo.ActionRestrict": { + "key": "GroupInfo.ActionRestrict", + "value": "Ограничить" + }, + "GroupInfo.AddParticipant": { + "key": "GroupInfo.AddParticipant", + "value": "Пригласить" + }, + "GroupInfo.AddParticipantConfirmation": { + "key": "GroupInfo.AddParticipantConfirmation", + "value": "Добавить %@ в группу?" + }, + "GroupInfo.AddParticipantTitle": { + "key": "GroupInfo.AddParticipantTitle", + "value": "Контакты" + }, + "GroupInfo.AddUserLeftError": { + "key": "GroupInfo.AddUserLeftError", + "value": "Поскольку пользователь был участником группы прежде, Вам нужно быть у него в списке контактов, чтобы пригласить его обратно.\n\nЕсли пользователя нет в чёрном списке группы, он может присоединиться с помощью ссылки-приглашения." + }, + "GroupInfo.Administrators": { + "key": "GroupInfo.Administrators", + "value": "Администраторы" + }, + "GroupInfo.Administrators.Title": { + "key": "GroupInfo.Administrators.Title", + "value": "Администраторы" + }, + "GroupInfo.ChannelListNamePlaceholder": { + "key": "GroupInfo.ChannelListNamePlaceholder", + "value": "Название канала" + }, + "GroupInfo.ChatAdmins": { + "key": "GroupInfo.ChatAdmins", + "value": "Добавить администраторов" + }, + "GroupInfo.ConvertToSupergroup": { + "key": "GroupInfo.ConvertToSupergroup", + "value": "Сделать супергруппой" + }, + "GroupInfo.DeactivatedStatus": { + "key": "GroupInfo.DeactivatedStatus", + "value": "Группа отключена" + }, + "GroupInfo.DeleteAndExit": { + "key": "GroupInfo.DeleteAndExit", + "value": "Удалить и выйти" + }, + "GroupInfo.DeleteAndExitConfirmation": { + "key": "GroupInfo.DeleteAndExitConfirmation", + "value": "Вы не сможете вернуться в эту группу." + }, + "GroupInfo.FakeGroupWarning": { + "key": "GroupInfo.FakeGroupWarning", + "value": "⚠️ Внимание: многие жаловались, что этот аккаунт выдаёт себя за официальный." + }, + "GroupInfo.GroupHistory": { + "key": "GroupInfo.GroupHistory", + "value": "История для новых участников" + }, + "GroupInfo.GroupHistoryHidden": { + "key": "GroupInfo.GroupHistoryHidden", + "value": "Скрыта" + }, + "GroupInfo.GroupHistoryShort": { + "key": "GroupInfo.GroupHistoryShort", + "value": "История чата" + }, + "GroupInfo.GroupHistoryVisible": { + "key": "GroupInfo.GroupHistoryVisible", + "value": "Видна" + }, + "GroupInfo.GroupNamePlaceholder": { + "key": "GroupInfo.GroupNamePlaceholder", + "value": "Название группы" + }, + "GroupInfo.GroupType": { + "key": "GroupInfo.GroupType", + "value": "Тип группы" + }, + "GroupInfo.InvitationLinkAcceptChannel": { + "key": "GroupInfo.InvitationLinkAcceptChannel", + "value": "Подписаться на канал «%@s»?" + }, + "GroupInfo.InvitationLinkDoesNotExist": { + "key": "GroupInfo.InvitationLinkDoesNotExist", + "value": "Извините, такой группы не существует." + }, + "GroupInfo.InvitationLinkGroupFull": { + "key": "GroupInfo.InvitationLinkGroupFull", + "value": "К сожалению, группа переполнена." + }, + "GroupInfo.InviteByLink": { + "key": "GroupInfo.InviteByLink", + "value": "Ссылка-приглашение" + }, + "GroupInfo.InviteLink.CopyAlert.Success": { + "key": "GroupInfo.InviteLink.CopyAlert.Success", + "value": "Ссылка скопирована" + }, + "GroupInfo.InviteLink.CopyLink": { + "key": "GroupInfo.InviteLink.CopyLink", + "value": "Скопировать ссылку" + }, + "GroupInfo.InviteLink.Help": { + "key": "GroupInfo.InviteLink.Help", + "value": "Любой пользователь Telegram сможет присоединиться к группе при помощи этой ссылки." + }, + "GroupInfo.InviteLink.LinkSection": { + "key": "GroupInfo.InviteLink.LinkSection", + "value": "ССЫЛКА" + }, + "GroupInfo.InviteLink.RevokeAlert.Revoke": { + "key": "GroupInfo.InviteLink.RevokeAlert.Revoke", + "value": "Сбросить" + }, + "GroupInfo.InviteLink.RevokeAlert.Success": { + "key": "GroupInfo.InviteLink.RevokeAlert.Success", + "value": "Прежняя ссылка-приглашение больше не действует. Создана новая." + }, + "GroupInfo.InviteLink.RevokeAlert.Text": { + "key": "GroupInfo.InviteLink.RevokeAlert.Text", + "value": "Вы точно хотите сбросить эту ссылку? После этого никто не сможет использовать её, чтобы присоединиться." + }, + "GroupInfo.InviteLink.RevokeLink": { + "key": "GroupInfo.InviteLink.RevokeLink", + "value": "Сбросить ссылку" + }, + "GroupInfo.InviteLink.ShareLink": { + "key": "GroupInfo.InviteLink.ShareLink", + "value": "Поделиться ссылкой" + }, + "GroupInfo.InviteLink.Title": { + "key": "GroupInfo.InviteLink.Title", + "value": "Ссылка-приглашение" + }, + "GroupInfo.InviteLinks": { + "key": "GroupInfo.InviteLinks", + "value": "Пригласительные ссылки" + }, + "GroupInfo.LabelAdmin": { + "key": "GroupInfo.LabelAdmin", + "value": "админ" + }, + "GroupInfo.LabelOwner": { + "key": "GroupInfo.LabelOwner", + "value": "владелец" + }, + "GroupInfo.LeftStatus": { + "key": "GroupInfo.LeftStatus", + "value": "Вы покинули группу" + }, + "GroupInfo.Location": { + "key": "GroupInfo.Location", + "value": "Геопозиция" + }, + "GroupInfo.Notifications": { + "key": "GroupInfo.Notifications", + "value": "Уведомления" + }, + "GroupInfo.ParticipantCount": { + "key": "GroupInfo.ParticipantCount", + "zeroValue": null, + "oneValue": "%@ участник", + "twoValue": null, + "fewValue": "%@ участника", + "manyValue": "%@ участников", + "otherValue": "%@ участников" + }, + "GroupInfo.Permissions": { + "key": "GroupInfo.Permissions", + "value": "Разрешения" + }, + "GroupInfo.Permissions.AddException": { + "key": "GroupInfo.Permissions.AddException", + "value": "Добавить исключение" + }, + "GroupInfo.Permissions.BroadcastConvert": { + "key": "GroupInfo.Permissions.BroadcastConvert", + "value": "Сделать группой для трансляций" + }, + "GroupInfo.Permissions.BroadcastConvertInfo": { + "key": "GroupInfo.Permissions.BroadcastConvertInfo", + "value": "В группе для трансляций могут состоять больше %@ участников, но писать сообщения смогут только администраторы." + }, + "GroupInfo.Permissions.BroadcastTitle": { + "key": "GroupInfo.Permissions.BroadcastTitle", + "value": "Группа для трансляций" + }, + "GroupInfo.Permissions.EditingDisabled": { + "key": "GroupInfo.Permissions.EditingDisabled", + "value": "Вы не можете менять это разрешение." + }, + "GroupInfo.Permissions.Exceptions": { + "key": "GroupInfo.Permissions.Exceptions", + "value": "ИСКЛЮЧЕНИЯ" + }, + "GroupInfo.Permissions.Removed": { + "key": "GroupInfo.Permissions.Removed", + "value": "Чёрный список" + }, + "GroupInfo.Permissions.SearchPlaceholder": { + "key": "GroupInfo.Permissions.SearchPlaceholder", + "value": "Поиск исключений" + }, + "GroupInfo.Permissions.SectionTitle": { + "key": "GroupInfo.Permissions.SectionTitle", + "value": "ВОЗМОЖНОСТИ УЧАСТНИКОВ ГРУППЫ:" + }, + "GroupInfo.Permissions.SlowmodeHeader": { + "key": "GroupInfo.Permissions.SlowmodeHeader", + "value": "МЕДЛЕННЫЙ РЕЖИМ" + }, + "GroupInfo.Permissions.SlowmodeInfo": { + "key": "GroupInfo.Permissions.SlowmodeInfo", + "value": "Выберите, как часто каждый участник сможет писать в группу." + }, + "GroupInfo.Permissions.SlowmodeValue.Off": { + "key": "GroupInfo.Permissions.SlowmodeValue.Off", + "value": "Нет" + }, + "GroupInfo.Permissions.Title": { + "key": "GroupInfo.Permissions.Title", + "value": "Разрешения" + }, + "GroupInfo.PublicLink": { + "key": "GroupInfo.PublicLink", + "value": "Публичная ссылка" + }, + "GroupInfo.PublicLinkAdd": { + "key": "GroupInfo.PublicLinkAdd", + "value": "Добавить" + }, + "GroupInfo.ScamGroupWarning": { + "key": "GroupInfo.ScamGroupWarning", + "value": "⚠️ Внимание: на эту группу много жалоб в связи с мошенничеством или попытками выдать себя за официальный аккаунт. Будьте осторожны, особенно если у Вас попросят денег." + }, + "GroupInfo.SetGroupPhoto": { + "key": "GroupInfo.SetGroupPhoto", + "value": "Изменить фото группы" + }, + "GroupInfo.SetGroupPhotoDelete": { + "key": "GroupInfo.SetGroupPhotoDelete", + "value": "Удалить фото" + }, + "GroupInfo.SetGroupPhotoStop": { + "key": "GroupInfo.SetGroupPhotoStop", + "value": "Остановить" + }, + "GroupInfo.SetSound": { + "key": "GroupInfo.SetSound", + "value": "Настроить звук" + }, + "GroupInfo.SharedMedia": { + "key": "GroupInfo.SharedMedia", + "value": "Общие материалы" + }, + "GroupInfo.SharedMediaNone": { + "key": "GroupInfo.SharedMediaNone", + "value": "Нет" + }, + "GroupInfo.ShowMoreMembers": { + "key": "GroupInfo.ShowMoreMembers", + "zeroValue": null, + "oneValue": "Показать ещё %@ участника", + "twoValue": null, + "fewValue": "Показать ещё %@ участников", + "manyValue": "Показать ещё %@ участников", + "otherValue": "Показать ещё %@ участников" + }, + "GroupInfo.Sound": { + "key": "GroupInfo.Sound", + "value": "Звук" + }, + "GroupInfo.Title": { + "key": "GroupInfo.Title", + "value": "Информация" + }, + "GroupInfo.UpgradeButton": { + "key": "GroupInfo.UpgradeButton", + "value": "Сделать супергруппой" + }, + "GroupPermission.AddMembersNotAvailable": { + "key": "GroupPermission.AddMembersNotAvailable", + "value": "У Вас нет разрешения добавлять участников." + }, + "GroupPermission.AddSuccess": { + "key": "GroupPermission.AddSuccess", + "value": "Исключение добавлено" + }, + "GroupPermission.AddedInfo": { + "key": "GroupPermission.AddedInfo", + "value": "Добавил(а) %1$@ %2$@" + }, + "GroupPermission.ApplyAlertAction": { + "key": "GroupPermission.ApplyAlertAction", + "value": "Готово" + }, + "GroupPermission.ApplyAlertText": { + "key": "GroupPermission.ApplyAlertText", + "value": "Вы изменили права пользователя в %@.\nПрименить изменения?" + }, + "GroupPermission.Delete": { + "key": "GroupPermission.Delete", + "value": "Удалить исключение" + }, + "GroupPermission.Duration": { + "key": "GroupPermission.Duration", + "value": "Срок" + }, + "GroupPermission.EditingDisabled": { + "key": "GroupPermission.EditingDisabled", + "value": "Вы не можете изменять ограничения этого пользователя" + }, + "GroupPermission.NewTitle": { + "key": "GroupPermission.NewTitle", + "value": "Новое исключение" + }, + "GroupPermission.NoAddMembers": { + "key": "GroupPermission.NoAddMembers", + "value": "без приглашений" + }, + "GroupPermission.NoChangeInfo": { + "key": "GroupPermission.NoChangeInfo", + "value": "без профиля" + }, + "GroupPermission.NoPinMessages": { + "key": "GroupPermission.NoPinMessages", + "value": "без закрепления" + }, + "GroupPermission.NoSendGifs": { + "key": "GroupPermission.NoSendGifs", + "value": "без GIF" + }, + "GroupPermission.NoSendLinks": { + "key": "GroupPermission.NoSendLinks", + "value": "без ссылок" + }, + "GroupPermission.NoSendMedia": { + "key": "GroupPermission.NoSendMedia", + "value": "без медиа" + }, + "GroupPermission.NoSendMessages": { + "key": "GroupPermission.NoSendMessages", + "value": "без сообщений" + }, + "GroupPermission.NoSendPolls": { + "key": "GroupPermission.NoSendPolls", + "value": "без опросов" + }, + "GroupPermission.NotAvailableInPublicGroups": { + "key": "GroupPermission.NotAvailableInPublicGroups", + "value": "В публичных группах нельзя разрешить это действие." + }, + "GroupPermission.PermissionDisabledByDefault": { + "key": "GroupPermission.PermissionDisabledByDefault", + "value": "Это действие отключено для всех участников в настройках группы." + }, + "GroupPermission.PermissionGloballyDisabled": { + "key": "GroupPermission.PermissionGloballyDisabled", + "value": "В этой группе отключена такая возможность." + }, + "GroupPermission.SectionTitle": { + "key": "GroupPermission.SectionTitle", + "value": "ВОЗМОЖНОСТИ УЧАСТНИКА:" + }, + "GroupPermission.Title": { + "key": "GroupPermission.Title", + "value": "Исключение" + }, + "GroupRemoved.AddToGroup": { + "key": "GroupRemoved.AddToGroup", + "value": "Добавить в группу" + }, + "GroupRemoved.DeleteUser": { + "key": "GroupRemoved.DeleteUser", + "value": "Удалить" + }, + "GroupRemoved.Remove": { + "key": "GroupRemoved.Remove", + "value": "Исключить пользователя" + }, + "GroupRemoved.RemoveInfo": { + "key": "GroupRemoved.RemoveInfo", + "value": "Пользователи, которых исключили администраторы группы, не смогут присоединиться снова с помощью ссылки-приглашения." + }, + "GroupRemoved.Title": { + "key": "GroupRemoved.Title", + "value": "Чёрный список" + }, + "GroupRemoved.UsersSectionTitle": { + "key": "GroupRemoved.UsersSectionTitle", + "value": "ЧЁРНЫЙ СПИСОК" + }, + "GroupRemoved.ViewUserInfo": { + "key": "GroupRemoved.ViewUserInfo", + "value": "Перейти к профилю" + }, + "HashtagSearch.AllChats": { + "key": "HashtagSearch.AllChats", + "value": "По всем чатам" + }, + "InfoPlist.NSCameraUsageDescription": { + "key": "InfoPlist.NSCameraUsageDescription", + "value": "Это необходимо, чтобы Вы могли делиться снятыми фотографиями и видео, а также совершать видеозвонки." + }, + "InfoPlist.NSContactsUsageDescription": { + "key": "InfoPlist.NSContactsUsageDescription", + "value": "Актуальная информация о Ваших контактах будет храниться зашифрованной в облаке Telegram, чтобы Вы могли связаться с друзьями с любого устройства." + }, + "InfoPlist.NSFaceIDUsageDescription": { + "key": "InfoPlist.NSFaceIDUsageDescription", + "value": "Вы можете разблокировать приложение с помощью Face ID." + }, + "InfoPlist.NSLocationAlwaysAndWhenInUseUsageDescription": { + "key": "InfoPlist.NSLocationAlwaysAndWhenInUseUsageDescription", + "value": "Фоновый доступ к геопозиции требуется, чтобы обновлять Вашу геопозицию, когда Вы транслируете её в чат с друзьями. " + }, + "InfoPlist.NSLocationAlwaysUsageDescription": { + "key": "InfoPlist.NSLocationAlwaysUsageDescription", + "value": "Фоновый доступ к геопозиции требуется, чтобы обновлять Вашу геопозицию, когда Вы транслируете её в чат с друзьями. Он также необходим для отправки геопозиции с Apple Watch." + }, + "InfoPlist.NSLocationWhenInUseUsageDescription": { + "key": "InfoPlist.NSLocationWhenInUseUsageDescription", + "value": "Когда Вы отправляете друзьям геопозицию, Telegram нужно разрешение, чтобы показать им карту." + }, + "InfoPlist.NSMicrophoneUsageDescription": { + "key": "InfoPlist.NSMicrophoneUsageDescription", + "value": "Это необходимо, чтобы Вы могли делиться голосовыми сообщениями и видео со звуком." + }, + "InfoPlist.NSPhotoLibraryAddUsageDescription": { + "key": "InfoPlist.NSPhotoLibraryAddUsageDescription", + "value": "Это необходимо, чтобы Вы могли сохранять фото и видео в библиотеку устройства." + }, + "InfoPlist.NSPhotoLibraryUsageDescription": { + "key": "InfoPlist.NSPhotoLibraryUsageDescription", + "value": "Это необходимо, чтобы Вы могли делиться фото и видео из библиотеки устройства." + }, + "InfoPlist.NSSiriUsageDescription": { + "key": "InfoPlist.NSSiriUsageDescription", + "value": "Вы можете использовать Siri для отправки сообщений" + }, + "InstantPage.AuthorAndDateTitle": { + "key": "InstantPage.AuthorAndDateTitle", + "value": "%1$@ • %2$@" + }, + "InstantPage.AutoNightTheme": { + "key": "InstantPage.AutoNightTheme", + "value": "Автосмена темы ночью" + }, + "InstantPage.FeedbackButton": { + "key": "InstantPage.FeedbackButton", + "value": "Сообщить об ошибке в превью" + }, + "InstantPage.FeedbackButtonShort": { + "key": "InstantPage.FeedbackButtonShort", + "value": "Ошибка в превью?" + }, + "InstantPage.Reference": { + "key": "InstantPage.Reference", + "value": "Сноска" + }, + "InstantPage.RelatedArticleAuthorAndDateTitle": { + "key": "InstantPage.RelatedArticleAuthorAndDateTitle", + "value": "%1$@ • %2$@" + }, + "InstantPage.TapToOpenLink": { + "key": "InstantPage.TapToOpenLink", + "value": "Перейти по ссылке:" + }, + "InstantPage.Views": { + "key": "InstantPage.Views", + "zeroValue": null, + "oneValue": "%@ просмотр", + "twoValue": null, + "fewValue": "%@ просмотра", + "manyValue": "%@ просмотров", + "otherValue": "%@ просмотров" + }, + "Intents.ErrorLockedText": { + "key": "Intents.ErrorLockedText", + "value": "Для настройки виджета откройте Telegram и разблокируйте приложение." + }, + "Intents.ErrorLockedTitle": { + "key": "Intents.ErrorLockedTitle", + "value": "Заблокировано" + }, + "IntentsSettings.MainAccount": { + "key": "IntentsSettings.MainAccount", + "value": "Основной аккаунт" + }, + "IntentsSettings.MainAccountInfo": { + "key": "IntentsSettings.MainAccountInfo", + "value": "Выберите, какой аккаунт использовать для Siri и функции «Поделиться»." + }, + "IntentsSettings.Reset": { + "key": "IntentsSettings.Reset", + "value": "Сброс" + }, + "IntentsSettings.ResetAll": { + "key": "IntentsSettings.ResetAll", + "value": "Сбросить все предложенные чаты" + }, + "IntentsSettings.SuggestBy": { + "key": "IntentsSettings.SuggestBy", + "value": "Учитывать" + }, + "IntentsSettings.SuggestByAll": { + "key": "IntentsSettings.SuggestByAll", + "value": "Отправку сообщений" + }, + "IntentsSettings.SuggestByShare": { + "key": "IntentsSettings.SuggestByShare", + "value": "Использование «Поделиться»" + }, + "IntentsSettings.SuggestedAndSpotlightChatsInfo": { + "key": "IntentsSettings.SuggestedAndSpotlightChatsInfo", + "value": "Подсказки будут показываться в меню «Поделиться» и результатах поиска Spotlight. Среди них не будет чатов из Архива." + }, + "IntentsSettings.SuggestedChats": { + "key": "IntentsSettings.SuggestedChats", + "value": "Предложенные чаты" + }, + "IntentsSettings.SuggestedChatsContacts": { + "key": "IntentsSettings.SuggestedChatsContacts", + "value": "Контакты" + }, + "IntentsSettings.SuggestedChatsGroups": { + "key": "IntentsSettings.SuggestedChatsGroups", + "value": "Группы" + }, + "IntentsSettings.SuggestedChatsInfo": { + "key": "IntentsSettings.SuggestedChatsInfo", + "value": "Чаты из архива не будут показываться в меню." + }, + "IntentsSettings.SuggestedChatsPrivateChats": { + "key": "IntentsSettings.SuggestedChatsPrivateChats", + "value": "Личные чаты" + }, + "IntentsSettings.SuggestedChatsSavedMessages": { + "key": "IntentsSettings.SuggestedChatsSavedMessages", + "value": "Избранное" + }, + "IntentsSettings.Title": { + "key": "IntentsSettings.Title", + "value": "Меню «Поделиться»" + }, + "Invitation.JoinGroup": { + "key": "Invitation.JoinGroup", + "value": "Вступить в группу" + }, + "Invitation.Members": { + "key": "Invitation.Members", + "zeroValue": null, + "oneValue": "%@ участник:", + "twoValue": null, + "fewValue": "%@ участника:", + "manyValue": "%@ участников:", + "otherValue": "%@ участников: " + }, + "Invite.ChannelsTooMuch": { + "key": "Invite.ChannelsTooMuch", + "value": "У пользователя максимальное число групп и каналов. Пожалуйста, предложите ему сперва покинуть какую-нибудь группу или канал." + }, + "Invite.LargeRecipientsCountWarning": { + "key": "Invite.LargeRecipientsCountWarning", + "value": "Отправка всех приглашений может занять некоторое время." + }, + "InviteLink.AdditionalLinks": { + "key": "InviteLink.AdditionalLinks", + "value": "Дополнительные ссылки" + }, + "InviteLink.ContextCopy": { + "key": "InviteLink.ContextCopy", + "value": "Копировать" + }, + "InviteLink.ContextDelete": { + "key": "InviteLink.ContextDelete", + "value": "Удалить" + }, + "InviteLink.ContextEdit": { + "key": "InviteLink.ContextEdit", + "value": "Изменить" + }, + "InviteLink.ContextGetQRCode": { + "key": "InviteLink.ContextGetQRCode", + "value": "Получить QR-код" + }, + "InviteLink.ContextRevoke": { + "key": "InviteLink.ContextRevoke", + "value": "Сбросить" + }, + "InviteLink.ContextShare": { + "key": "InviteLink.ContextShare", + "value": "Поделиться" + }, + "InviteLink.Create": { + "key": "InviteLink.Create", + "value": "Создать ссылку" + }, + "InviteLink.Create.EditTitle": { + "key": "InviteLink.Create.EditTitle", + "value": "Ссылка" + }, + "InviteLink.Create.Revoke": { + "key": "InviteLink.Create.Revoke", + "value": "Сбросить ссылку" + }, + "InviteLink.Create.TimeLimit": { + "key": "InviteLink.Create.TimeLimit", + "value": "Ограничение по времени" + }, + "InviteLink.Create.TimeLimitExpiryDate": { + "key": "InviteLink.Create.TimeLimitExpiryDate", + "value": "Будет сброшена" + }, + "InviteLink.Create.TimeLimitExpiryDateNever": { + "key": "InviteLink.Create.TimeLimitExpiryDateNever", + "value": "Никогда" + }, + "InviteLink.Create.TimeLimitExpiryTime": { + "key": "InviteLink.Create.TimeLimitExpiryTime", + "value": "Время" + }, + "InviteLink.Create.TimeLimitInfo": { + "key": "InviteLink.Create.TimeLimitInfo", + "value": "Вы можете выбрать срок действия для этой ссылки." + }, + "InviteLink.Create.TimeLimitNoLimit": { + "key": "InviteLink.Create.TimeLimitNoLimit", + "value": "∞" + }, + "InviteLink.Create.Title": { + "key": "InviteLink.Create.Title", + "value": "Новая ссылка" + }, + "InviteLink.Create.UsersLimit": { + "key": "InviteLink.Create.UsersLimit", + "value": "Ограничение по числу участников" + }, + "InviteLink.Create.UsersLimitInfo": { + "key": "InviteLink.Create.UsersLimitInfo", + "value": "Вы можете выбрать, сколько пользователей смогут присоединиться к группе по этой ссылке." + }, + "InviteLink.Create.UsersLimitNoLimit": { + "key": "InviteLink.Create.UsersLimitNoLimit", + "value": "∞" + }, + "InviteLink.Create.UsersLimitNumberOfUsers": { + "key": "InviteLink.Create.UsersLimitNumberOfUsers", + "value": "Число вступлений" + }, + "InviteLink.Create.UsersLimitNumberOfUsersUnlimited": { + "key": "InviteLink.Create.UsersLimitNumberOfUsersUnlimited", + "value": "Не ограничено" + }, + "InviteLink.CreateInfo": { + "key": "InviteLink.CreateInfo", + "value": "Вы можете создать дополнительные ссылки и задать для них срок действия или ограничение на число использований." + }, + "InviteLink.CreatePrivateLinkHelp": { + "key": "InviteLink.CreatePrivateLinkHelp", + "value": "Любой пользователь Telegram сможет вступить в Вашу группу, перейдя по этой ссылке." + }, + "InviteLink.CreatePrivateLinkHelpChannel": { + "key": "InviteLink.CreatePrivateLinkHelpChannel", + "value": "Любой пользователь Telegram сможет подписаться на канал при помощи этой ссылки." + }, + "InviteLink.CreatedBy": { + "key": "InviteLink.CreatedBy", + "value": "Ссылка создана" + }, + "InviteLink.DeleteAllRevokedLinks": { + "key": "InviteLink.DeleteAllRevokedLinks", + "value": "Удалить все неактивные ссылки" + }, + "InviteLink.DeleteAllRevokedLinksAlert.Action": { + "key": "InviteLink.DeleteAllRevokedLinksAlert.Action", + "value": "Удалить все" + }, + "InviteLink.DeleteAllRevokedLinksAlert.Text": { + "key": "InviteLink.DeleteAllRevokedLinksAlert.Text", + "value": "Это удалит все неактивные ссылки." + }, + "InviteLink.DeleteLinkAlert.Action": { + "key": "InviteLink.DeleteLinkAlert.Action", + "value": "Удалить" + }, + "InviteLink.DeleteLinkAlert.Text": { + "key": "InviteLink.DeleteLinkAlert.Text", + "value": "Вы точно хотите удалить эту ссылку? Она окончательно исчезнет." + }, + "InviteLink.Expired": { + "key": "InviteLink.Expired", + "value": "время истекло" + }, + "InviteLink.ExpiredLink": { + "key": "InviteLink.ExpiredLink", + "value": "Истекшая ссылка" + }, + "InviteLink.ExpiredLinkStatus": { + "key": "InviteLink.ExpiredLinkStatus", + "value": "срок действия истек" + }, + "InviteLink.ExpiresIn": { + "key": "InviteLink.ExpiresIn", + "value": "%@ до сброса" + }, + "InviteLink.InviteLink": { + "key": "InviteLink.InviteLink", + "value": "Ссылка-приглашение" + }, + "InviteLink.InviteLinkCopiedText": { + "key": "InviteLink.InviteLinkCopiedText", + "value": "Ссылка скопирована" + }, + "InviteLink.InviteLinkRevoked": { + "key": "InviteLink.InviteLinkRevoked", + "value": "Эта ссылка была сброшена." + }, + "InviteLink.InviteLinks": { + "key": "InviteLink.InviteLinks", + "zeroValue": null, + "oneValue": "%@ ссылка", + "twoValue": null, + "fewValue": "%@ ссылки", + "manyValue": "%@ ссылок", + "otherValue": "%@ ссылок" + }, + "InviteLink.Manage": { + "key": "InviteLink.Manage", + "value": "Управление приглашениями" + }, + "InviteLink.OtherAdminsLinks": { + "key": "InviteLink.OtherAdminsLinks", + "value": "Ссылки других администраторов" + }, + "InviteLink.OtherPermanentLinkInfo": { + "key": "InviteLink.OtherPermanentLinkInfo", + "value": "**%1$@** может видеть эту ссылку и использовать ее для добавления участников в **%2$@**." + }, + "InviteLink.PeopleCanJoin": { + "key": "InviteLink.PeopleCanJoin", + "zeroValue": null, + "oneValue": "ещё %@ вступление", + "twoValue": null, + "fewValue": "ещё %@ вступления", + "manyValue": "ещё %@ вступлений", + "otherValue": "ещё %@ вступлений" + }, + "InviteLink.PeopleJoined": { + "key": "InviteLink.PeopleJoined", + "zeroValue": null, + "oneValue": "%@ человек присоединился", + "twoValue": null, + "fewValue": "%@ присоединились", + "manyValue": "%@ присоединились", + "otherValue": "%@ присоединились" + }, + "InviteLink.PeopleJoinedNone": { + "key": "InviteLink.PeopleJoinedNone", + "value": "никто пока не присоединился" + }, + "InviteLink.PeopleJoinedShort": { + "key": "InviteLink.PeopleJoinedShort", + "zeroValue": null, + "oneValue": "%@ присоединился", + "twoValue": null, + "fewValue": "%@ присоединились", + "manyValue": "%@ присоединились", + "otherValue": "%@ присоединились" + }, + "InviteLink.PeopleJoinedShortNone": { + "key": "InviteLink.PeopleJoinedShortNone", + "value": "вступлений пока нет" + }, + "InviteLink.PeopleJoinedShortNoneExpired": { + "key": "InviteLink.PeopleJoinedShortNoneExpired", + "value": "нет вступлений" + }, + "InviteLink.PeopleRemaining": { + "key": "InviteLink.PeopleRemaining", + "zeroValue": null, + "oneValue": "осталось %@", + "twoValue": null, + "fewValue": "осталось %@", + "manyValue": "осталось %@", + "otherValue": "осталось %@" + }, + "InviteLink.PermanentLink": { + "key": "InviteLink.PermanentLink", + "value": "Ссылка-приглашение" + }, + "InviteLink.PublicLink": { + "key": "InviteLink.PublicLink", + "value": "Публичная ссылка" + }, + "InviteLink.QRCode.Info": { + "key": "InviteLink.QRCode.Info", + "value": "Пользователи смогут присоединиться к группе, считав этот код камерой телефона." + }, + "InviteLink.QRCode.InfoChannel": { + "key": "InviteLink.QRCode.InfoChannel", + "value": "Пользователи смогут подписаться на канал, считав этот код камерой телефона." + }, + "InviteLink.QRCode.Share": { + "key": "InviteLink.QRCode.Share", + "value": "Поделиться" + }, + "InviteLink.QRCode.Title": { + "key": "InviteLink.QRCode.Title", + "value": "QR-код" + }, + "InviteLink.ReactivateLink": { + "key": "InviteLink.ReactivateLink", + "value": "Активировать ссылку" + }, + "InviteLink.Revoked": { + "key": "InviteLink.Revoked", + "value": "неактивна" + }, + "InviteLink.RevokedLinks": { + "key": "InviteLink.RevokedLinks", + "value": "Неактивные ссылки" + }, + "InviteLink.Share": { + "key": "InviteLink.Share", + "value": "Поделиться" + }, + "InviteLink.Title": { + "key": "InviteLink.Title", + "value": "Пригласительные ссылки" + }, + "InviteLink.UsageLimitReached": { + "key": "InviteLink.UsageLimitReached", + "value": "достигнут лимит" + }, + "InviteLinks.InviteLinkExpired": { + "key": "InviteLinks.InviteLinkExpired", + "value": "Срок действия ссылки истёк." + }, + "InviteText.ContactsCount": { + "key": "InviteText.ContactsCount", + "zeroValue": null, + "oneValue": "Привет, я использую Telegram для переписки. Присоединяйся! Скачать можно здесь: %@", + "twoValue": null, + "fewValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контакта. Присоединяйся! Скачать можно здесь: %@", + "manyValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контактов. Присоединяйся! Скачать можно здесь: %@", + "otherValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контактов. Присоединяйся! Скачать можно здесь: %@" + }, + "InviteText.ContactsCountText": { + "key": "InviteText.ContactsCountText", + "zeroValue": null, + "oneValue": "Привет, я использую Telegram для переписки. Присоединяйся! Скачать можно здесь: {url}", + "twoValue": null, + "fewValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контакта. Присоединяйся! Скачать можно здесь: {url}", + "manyValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контактов. Присоединяйся! Скачать можно здесь: {url}", + "otherValue": "Привет, я использую Telegram для переписки — как и ещё %@ наших контактов. Присоединяйся! Скачать можно здесь: {url}" + }, + "InviteText.SingleContact": { + "key": "InviteText.SingleContact", + "value": "Привет, я использую Telegram для переписки. Присоединяйся! Скачать его можно здесь: %@" + }, + "InviteText.URL": { + "key": "InviteText.URL", + "value": "https://telegram.org/dl" + }, + "Items.NOfM": { + "key": "Items.NOfM", + "value": "%1$@ из %2$@" + }, + "Join.ChannelsTooMuch": { + "key": "Join.ChannelsTooMuch", + "value": "У Вас максимальное число групп и каналов. Пожалуйста, сперва покиньте какую-нибудь группу или канал." + }, + "KeyCommand.ChatInfo": { + "key": "KeyCommand.ChatInfo", + "value": "Информация чата" + }, + "KeyCommand.Find": { + "key": "KeyCommand.Find", + "value": "Поиск" + }, + "KeyCommand.FocusOnInputField": { + "key": "KeyCommand.FocusOnInputField", + "value": "Написать Сообщение" + }, + "KeyCommand.JumpToNextChat": { + "key": "KeyCommand.JumpToNextChat", + "value": "Перейти к следующему чату" + }, + "KeyCommand.JumpToNextUnreadChat": { + "key": "KeyCommand.JumpToNextUnreadChat", + "value": "Перейти к следующему непрочитанному чату" + }, + "KeyCommand.JumpToPreviousChat": { + "key": "KeyCommand.JumpToPreviousChat", + "value": "Перейти к предыдущему чату" + }, + "KeyCommand.JumpToPreviousUnreadChat": { + "key": "KeyCommand.JumpToPreviousUnreadChat", + "value": "Перейти к предыдущему непрочитанному чату" + }, + "KeyCommand.NewMessage": { + "key": "KeyCommand.NewMessage", + "value": "Новое сообщение" + }, + "KeyCommand.ScrollDown": { + "key": "KeyCommand.ScrollDown", + "value": "Прокрутить вниз" + }, + "KeyCommand.ScrollUp": { + "key": "KeyCommand.ScrollUp", + "value": "Прокрутить вверх" + }, + "KeyCommand.SearchInChat": { + "key": "KeyCommand.SearchInChat", + "value": "Поиск в чате" + }, + "KeyCommand.SendMessage": { + "key": "KeyCommand.SendMessage", + "value": "Отправить сообщение" + }, + "LOCKED_MESSAGE": { + "key": "LOCKED_MESSAGE", + "value": "Вам пришло сообщение%1$@" + }, + "LastSeen.ALongTimeAgo": { + "key": "LastSeen.ALongTimeAgo", + "value": "был(а) очень давно" + }, + "LastSeen.AtDate": { + "key": "LastSeen.AtDate", + "value": "был(а) %@" + }, + "LastSeen.HoursAgo": { + "key": "LastSeen.HoursAgo", + "zeroValue": null, + "oneValue": "был(а) %@ час назад", + "twoValue": null, + "fewValue": "был(а) %@ часа назад", + "manyValue": "был(а) %@ часов назад", + "otherValue": "был(а) %@ часа назад" + }, + "LastSeen.JustNow": { + "key": "LastSeen.JustNow", + "value": "был(а) только что" + }, + "LastSeen.Lately": { + "key": "LastSeen.Lately", + "value": "был(а) недавно" + }, + "LastSeen.MinutesAgo": { + "key": "LastSeen.MinutesAgo", + "zeroValue": null, + "oneValue": "был(а) %@ минуту назад", + "twoValue": null, + "fewValue": "был(а) %@ минуты назад", + "manyValue": "был(а) %@ минут назад", + "otherValue": "был(а) %@ минуты назад" + }, + "LastSeen.Offline": { + "key": "LastSeen.Offline", + "value": "был(а) давно" + }, + "LastSeen.TodayAt": { + "key": "LastSeen.TodayAt", + "value": "заходил(а) сегодня в %@" + }, + "LastSeen.WithinAMonth": { + "key": "LastSeen.WithinAMonth", + "value": "был(а) в этом месяце" + }, + "LastSeen.WithinAWeek": { + "key": "LastSeen.WithinAWeek", + "value": "был(а) на этой неделе" + }, + "LastSeen.YesterdayAt": { + "key": "LastSeen.YesterdayAt", + "value": "был(а) вчера в %@" + }, + "LiveLocation.MenuChatsCount": { + "key": "LiveLocation.MenuChatsCount", + "zeroValue": null, + "oneValue": "Вы транслируете геопозицию в %@ чат.", + "twoValue": null, + "fewValue": "Вы транслируете геопозицию в %@ чата.", + "manyValue": "Вы транслируете геопозицию в %@ чат.", + "otherValue": "Вы транслируете геопозицию в %@ чат." + }, + "LiveLocation.MenuStopAll": { + "key": "LiveLocation.MenuStopAll", + "value": "Отменить все" + }, + "LiveLocationUpdated.JustNow": { + "key": "LiveLocationUpdated.JustNow", + "value": "обновлено только что" + }, + "LiveLocationUpdated.MinutesAgo": { + "key": "LiveLocationUpdated.MinutesAgo", + "zeroValue": null, + "oneValue": "%@ минуту назад", + "twoValue": null, + "fewValue": "%@ минуты назад", + "manyValue": "%@ минут назад", + "otherValue": "%@ минут назад" + }, + "LiveLocationUpdated.TodayAt": { + "key": "LiveLocationUpdated.TodayAt", + "value": "обновлено в %@" + }, + "LocalGroup.ButtonTitle": { + "key": "LocalGroup.ButtonTitle", + "value": "Создать группу" + }, + "LocalGroup.IrrelevantWarning": { + "key": "LocalGroup.IrrelevantWarning", + "value": "Если группа не относится к выбранному месту, Вы рискуете потерять возможность создавать группы с геопозицией." + }, + "LocalGroup.Text": { + "key": "LocalGroup.Text", + "value": "Все, кто находится рядом (соседи, коллеги, сокурсники, участники мероприятия), будут видеть группу в разделе «Люди рядом»." + }, + "LocalGroup.Title": { + "key": "LocalGroup.Title", + "value": "Создать локальную группу" + }, + "Localization.ChooseLanguage": { + "key": "Localization.ChooseLanguage", + "value": "Выберите язык" + }, + "Localization.EnglishLanguageName": { + "key": "Localization.EnglishLanguageName", + "value": "Английский" + }, + "Localization.LanguageCustom": { + "key": "Localization.LanguageCustom", + "value": "Особый" + }, + "Localization.LanguageName": { + "key": "Localization.LanguageName", + "value": "Русский" + }, + "Localization.LanguageOther": { + "key": "Localization.LanguageOther", + "value": "Другой" + }, + "Location.LiveLocationRequired.Description": { + "key": "Location.LiveLocationRequired.Description", + "value": "Чтобы получить уведомление, необходимо поделиться геопозицией в этом чате." + }, + "Location.LiveLocationRequired.ShareLocation": { + "key": "Location.LiveLocationRequired.ShareLocation", + "value": "Поделиться геопозицией" + }, + "Location.LiveLocationRequired.Title": { + "key": "Location.LiveLocationRequired.Title", + "value": "Поделиться геопозицией" + }, + "Location.ProximityAlertCancelled": { + "key": "Location.ProximityAlertCancelled", + "value": "Оповещение отменено" + }, + "Location.ProximityAlertSetText": { + "key": "Location.ProximityAlertSetText", + "value": "Вы получите оповещение, когда %1$@ будет в %2$@ от Вас." + }, + "Location.ProximityAlertSetTextGroup": { + "key": "Location.ProximityAlertSetTextGroup", + "value": "Вы получите оповещение, когда кто-то из участников будет в %@ от Вас." + }, + "Location.ProximityAlertSetTitle": { + "key": "Location.ProximityAlertSetTitle", + "value": "Оповещение установлено" + }, + "Location.ProximityGroupTip": { + "key": "Location.ProximityGroupTip", + "value": "Уведомление о приближении других участников" + }, + "Location.ProximityNotification.AlreadyClose": { + "key": "Location.ProximityNotification.AlreadyClose", + "value": "Вы уже находитесь ближе, чем %@" + }, + "Location.ProximityNotification.DistanceKM": { + "key": "Location.ProximityNotification.DistanceKM", + "value": "км" + }, + "Location.ProximityNotification.DistanceM": { + "key": "Location.ProximityNotification.DistanceM", + "value": "м" + }, + "Location.ProximityNotification.DistanceMI": { + "key": "Location.ProximityNotification.DistanceMI", + "value": "мл" + }, + "Location.ProximityNotification.Notify": { + "key": "Location.ProximityNotification.Notify", + "value": "Оповестить в радиусе %@" + }, + "Location.ProximityNotification.NotifyLong": { + "key": "Location.ProximityNotification.NotifyLong", + "value": "Оповестить, когда %1$@ будет в %2$@ от меня" + }, + "Location.ProximityNotification.Title": { + "key": "Location.ProximityNotification.Title", + "value": "Оповещение" + }, + "Location.ProximityTip": { + "key": "Location.ProximityTip", + "value": "Уведомление о приближении %@" + }, + "Login.BannedPhoneBody": { + "key": "Login.BannedPhoneBody", + "value": "Я пытаюсь использовать свой мобильный номер: %@\nНо Telegram говорит, что он заблокирован. Пожалуйста, помогите." + }, + "Login.BannedPhoneSubject": { + "key": "Login.BannedPhoneSubject", + "value": "Заблокирован номер: %@" + }, + "Login.CallRequestState1": { + "key": "Login.CallRequestState1", + "value": "Telegram позвонит Вам через %d:%.2d" + }, + "Login.CallRequestState2": { + "key": "Login.CallRequestState2", + "value": "Запрашиваю звонок для диктовки кода..." + }, + "Login.CallRequestState3": { + "key": "Login.CallRequestState3", + "value": "Telegram набрал Ваш номер\n[Не получили код?]" + }, + "Login.CancelPhoneVerification": { + "key": "Login.CancelPhoneVerification", + "value": "Вы действительно хотите остановить подтверждение номера телефона?" + }, + "Login.CancelPhoneVerificationContinue": { + "key": "Login.CancelPhoneVerificationContinue", + "value": "Продолжить" + }, + "Login.CancelPhoneVerificationStop": { + "key": "Login.CancelPhoneVerificationStop", + "value": "Остановить" + }, + "Login.CancelSignUpConfirmation": { + "key": "Login.CancelSignUpConfirmation", + "value": "Вы действительно хотите прервать регистрацию?" + }, + "Login.CheckOtherSessionMessages": { + "key": "Login.CheckOtherSessionMessages", + "value": "Проверьте сообщения в Telegram" + }, + "Login.Code": { + "key": "Login.Code", + "value": "Код проверки" + }, + "Login.CodeExpired": { + "key": "Login.CodeExpired", + "value": "Время действия кода истекло. Попробуйте снова." + }, + "Login.CodeExpiredError": { + "key": "Login.CodeExpiredError", + "value": "Время действия кода истекло. Попробуйте ещё раз." + }, + "Login.CodeFloodError": { + "key": "Login.CodeFloodError", + "value": "Лимит попыток превышен. Пожалуйста, подождите и попробуйте позже." + }, + "Login.CodeSentCall": { + "key": "Login.CodeSentCall", + "value": "Мы звоним Вам, чтобы продиктовать код." + }, + "Login.CodeSentInternal": { + "key": "Login.CodeSentInternal", + "value": "Мы отправили код через **Telegram** на Ваши другие устройства" + }, + "Login.CodeSentSms": { + "key": "Login.CodeSentSms", + "value": "Мы отправили Вам SMS\nс проверочным кодом" + }, + "Login.ContinueWithLocalization": { + "key": "Login.ContinueWithLocalization", + "value": "Продолжить на русском" + }, + "Login.CountryCode": { + "key": "Login.CountryCode", + "value": "Код страны" + }, + "Login.EmailCodeBody": { + "key": "Login.EmailCodeBody", + "value": "Номер моего телефона:\n%@\n\nНе удаётся получить код для входа в Telegram." + }, + "Login.EmailCodeSubject": { + "key": "Login.EmailCodeSubject", + "value": "%@: проблема с кодом проверки" + }, + "Login.EmailNotConfiguredError": { + "key": "Login.EmailNotConfiguredError", + "value": "Чтобы отправить нам детали об ошибке, необходимо настроить электронную почту.\n\nДобавьте свою электронную почту в настройках устройства > Пароли и учётные записи > Добавить учётную запись." + }, + "Login.EmailPhoneBody": { + "key": "Login.EmailPhoneBody", + "value": "Я пытаюсь использовать свой мобильный номер: %@\nНо Telegram говорит, что он некорректный. Пожалуйста, помогите.\nДополнительная информация: %@, %@." + }, + "Login.EmailPhoneSubject": { + "key": "Login.EmailPhoneSubject", + "value": "Некорректный номер %@" + }, + "Login.HaveNotReceivedCodeInternal": { + "key": "Login.HaveNotReceivedCodeInternal", + "value": "Не получили код?" + }, + "Login.InfoAvatarAdd": { + "key": "Login.InfoAvatarAdd", + "value": "добавить" + }, + "Login.InfoAvatarPhoto": { + "key": "Login.InfoAvatarPhoto", + "value": "фото" + }, + "Login.InfoDeletePhoto": { + "key": "Login.InfoDeletePhoto", + "value": "Удалить фото" + }, + "Login.InfoFirstNamePlaceholder": { + "key": "Login.InfoFirstNamePlaceholder", + "value": "Имя" + }, + "Login.InfoHelp": { + "key": "Login.InfoHelp", + "value": "Пожалуйста, добавьте имя и фотографию." + }, + "Login.InfoLastNamePlaceholder": { + "key": "Login.InfoLastNamePlaceholder", + "value": "Фамилия" + }, + "Login.InfoTitle": { + "key": "Login.InfoTitle", + "value": "Информация о Вас" + }, + "Login.InvalidCodeError": { + "key": "Login.InvalidCodeError", + "value": "Вы ввели неправильный код. Попробуйте ещё раз." + }, + "Login.InvalidCountryCode": { + "key": "Login.InvalidCountryCode", + "value": "Некорректный код страны" + }, + "Login.InvalidFirstNameError": { + "key": "Login.InvalidFirstNameError", + "value": "Некорректное имя. Попробуйте ещё раз." + }, + "Login.InvalidLastNameError": { + "key": "Login.InvalidLastNameError", + "value": "Некорректная фамилия. Попробуйте ещё раз." + }, + "Login.InvalidPhoneEmailBody": { + "key": "Login.InvalidPhoneEmailBody", + "value": "Я пытаюсь использовать свой мобильный номер: %1$@.\nНо Telegram говорит, что он некорректный. Пожалуйста, помогите.\n\nВерсия приложения: %2$@\nВерсия OS: %3$@\nЛокаль: %4$@\nОператор: %5$@" + }, + "Login.InvalidPhoneEmailSubject": { + "key": "Login.InvalidPhoneEmailSubject", + "value": "Некорректный номер: %@" + }, + "Login.InvalidPhoneError": { + "key": "Login.InvalidPhoneError", + "value": "Некорректный номер телефона. Попробуйте ещё раз." + }, + "Login.NetworkError": { + "key": "Login.NetworkError", + "value": "Пожалуйста, проверьте соединение с интернетом и повторите попытку." + }, + "Login.PRIVACY_URL": { + "key": "Login.PRIVACY_URL", + "value": "https://telegram.org/privacy" + }, + "Login.PadPhoneHelp": { + "key": "Login.PadPhoneHelp", + "value": "Используйте основной номер телефона для входа в Telegram на любом устройстве. Номер SIM-карты iPad не подойдёт, поскольку Вам необходимо получить SMS. \n\nНомер указан верно?\n{number}" + }, + "Login.PadPhoneHelpTitle": { + "key": "Login.PadPhoneHelpTitle", + "value": "Ваш номер" + }, + "Login.PhoneAndCountryHelp": { + "key": "Login.PhoneAndCountryHelp", + "value": "Проверьте код страны и введите свой номер телефона." + }, + "Login.PhoneBannedEmailBody": { + "key": "Login.PhoneBannedEmailBody", + "value": "Я пытаюсь использовать свой мобильный номер: %1$@.\nНо Telegram говорит, что он заблокирован. Пожалуйста, помогите.\n\nВерсия приложения: %2$@\nВерсия OS: %3$@\nЛокаль: %4$@\nОператор: %5$@" + }, + "Login.PhoneBannedEmailSubject": { + "key": "Login.PhoneBannedEmailSubject", + "value": "Заблокирован номер: %@" + }, + "Login.PhoneBannedError": { + "key": "Login.PhoneBannedError", + "value": "Этот номер телефона заблокирован." + }, + "Login.PhoneFloodError": { + "key": "Login.PhoneFloodError", + "value": "За последнее время Вы слишком часто удаляли и создавали свой аккаунт заново. Пожалуйста, подождите несколько дней перед повторной регистрацией." + }, + "Login.PhoneGenericEmailBody": { + "key": "Login.PhoneGenericEmailBody", + "value": "Я пытаюсь использовать свой мобильный номер: %1$@\nНо Telegram показывает ошибку.\nПожалуйста, помогите.\n\nОшибка: %2$@\nВерсия приложения: %3$@\nВерсия ОС: %4$@\nЛокаль: %5$@\nПровайдер: %6$@" + }, + "Login.PhoneGenericEmailSubject": { + "key": "Login.PhoneGenericEmailSubject", + "value": "Ошибка Telegram iOS: %@" + }, + "Login.PhoneNumberAlreadyAuthorized": { + "key": "Login.PhoneNumberAlreadyAuthorized", + "value": "Вы уже зашли в этот аккаунт." + }, + "Login.PhoneNumberAlreadyAuthorizedSwitch": { + "key": "Login.PhoneNumberAlreadyAuthorizedSwitch", + "value": "Переключиться" + }, + "Login.PhoneNumberHelp": { + "key": "Login.PhoneNumberHelp", + "value": "Помощь" + }, + "Login.PhonePlaceholder": { + "key": "Login.PhonePlaceholder", + "value": "Номер телефона" + }, + "Login.PhoneTitle": { + "key": "Login.PhoneTitle", + "value": "Телефон" + }, + "Login.ResetAccountProtected.LimitExceeded": { + "key": "Login.ResetAccountProtected.LimitExceeded", + "value": "Ваша недавняя попытка сбросить аккаунт была отменена его активным пользователем. Пожалуйста, попробуйте снова через 7 дней." + }, + "Login.ResetAccountProtected.Reset": { + "key": "Login.ResetAccountProtected.Reset", + "value": "Сбросить" + }, + "Login.ResetAccountProtected.Text": { + "key": "Login.ResetAccountProtected.Text", + "value": "Поскольку аккаунт %@ используется и защищён паролем, в целях безопасности мы удалим его только через неделю.\n\nВы можете передумать и остановить отсчёт в любой момент." + }, + "Login.ResetAccountProtected.TimerTitle": { + "key": "Login.ResetAccountProtected.TimerTitle", + "value": "Вы сможете сбросить аккаунт через:" + }, + "Login.ResetAccountProtected.Title": { + "key": "Login.ResetAccountProtected.Title", + "value": "Сброс аккаунта" + }, + "Login.SelectCountry.Title": { + "key": "Login.SelectCountry.Title", + "value": "Страна" + }, + "Login.SendCodeViaSms": { + "key": "Login.SendCodeViaSms", + "value": "Отправить код через SMS" + }, + "Login.SmsRequestState1": { + "key": "Login.SmsRequestState1", + "value": "Telegram отправит Вам SMS через %d:%.2d" + }, + "Login.SmsRequestState2": { + "key": "Login.SmsRequestState2", + "value": "Запрос СМС от Telegram..." + }, + "Login.SmsRequestState3": { + "key": "Login.SmsRequestState3", + "value": "СМС от Telegram отправлена\n[Не получили код?]" + }, + "Login.TermsOfService.ProceedBot": { + "key": "Login.TermsOfService.ProceedBot", + "value": "Пожалуйста, подтвердите для перехода к %@." + }, + "Login.TermsOfServiceAgree": { + "key": "Login.TermsOfServiceAgree", + "value": "Принять и продолжить" + }, + "Login.TermsOfServiceDecline": { + "key": "Login.TermsOfServiceDecline", + "value": "Отклонить" + }, + "Login.TermsOfServiceHeader": { + "key": "Login.TermsOfServiceHeader", + "value": "Пользовательское соглашение" + }, + "Login.TermsOfServiceLabel": { + "key": "Login.TermsOfServiceLabel", + "value": "Регистрируясь,\nВы принимаете [Пользовательское соглашение]" + }, + "Login.TermsOfServiceSignupDecline": { + "key": "Login.TermsOfServiceSignupDecline", + "value": "К сожалению, это означает, что Вы не сможете зарегистрироваться в Telegram.\n\nВ отличие от других сервисов, мы не используем Ваши данные для рекламы и других коммерческих целей. На серверах хранится только та информация, которая позволяет Вам полноценно пользоваться Telegram. Вы можете регулировать доступ к своим данным в настройках приложения, в разделе Конфиденциальность и безопасность.\n\nЕсли Вы не готовы предоставить минимальные нужные данные , увы, мы не сможем обеспечить работу Telegram." + }, + "Login.UnknownError": { + "key": "Login.UnknownError", + "value": "Произошла ошибка. Пожалуйста, попробуйте позже." + }, + "Login.WillCallYou": { + "key": "Login.WillCallYou", + "value": "Telegram позвонит Вам через %@" + }, + "Login.WillSendSms": { + "key": "Login.WillSendSms", + "value": "Telegram отправит Вам SMS через %@" + }, + "LoginPassword.FloodError": { + "key": "LoginPassword.FloodError", + "value": "Лимит попыток превышен. Попробуйте ещё раз позже." + }, + "LoginPassword.ForgotPassword": { + "key": "LoginPassword.ForgotPassword", + "value": "Забыли пароль?" + }, + "LoginPassword.InvalidPasswordError": { + "key": "LoginPassword.InvalidPasswordError", + "value": "Неверный пароль. Пожалуйста, попробуйте снова." + }, + "LoginPassword.PasswordHelp": { + "key": "LoginPassword.PasswordHelp", + "value": "Включена двухэтапная аутентификация. Ваш аккаунт защищён дополнительным паролем." + }, + "LoginPassword.PasswordPlaceholder": { + "key": "LoginPassword.PasswordPlaceholder", + "value": "Пароль" + }, + "LoginPassword.ResetAccount": { + "key": "LoginPassword.ResetAccount", + "value": "Сбросить аккаунт" + }, + "LoginPassword.Title": { + "key": "LoginPassword.Title", + "value": "Ваш пароль" + }, + "LogoutOptions.AddAccountText": { + "key": "LogoutOptions.AddAccountText", + "value": "Подключите несколько аккаунтов Telegram и легко переключайтесь между ними." + }, + "LogoutOptions.AddAccountTitle": { + "key": "LogoutOptions.AddAccountTitle", + "value": "Добавить аккаунт" + }, + "LogoutOptions.AlternativeOptionsSection": { + "key": "LogoutOptions.AlternativeOptionsSection", + "value": "ДРУГИЕ ВОЗМОЖНОСТИ" + }, + "LogoutOptions.ChangePhoneNumberText": { + "key": "LogoutOptions.ChangePhoneNumberText", + "value": "Перенесите на новый номер телефона свой аккаунт со всеми чатами и файлами." + }, + "LogoutOptions.ChangePhoneNumberTitle": { + "key": "LogoutOptions.ChangePhoneNumberTitle", + "value": "Изменить номер" + }, + "LogoutOptions.ClearCacheText": { + "key": "LogoutOptions.ClearCacheText", + "value": "Освободите память устройства; файлы останутся в облаке." + }, + "LogoutOptions.ClearCacheTitle": { + "key": "LogoutOptions.ClearCacheTitle", + "value": "Очистить кэш" + }, + "LogoutOptions.ContactSupportText": { + "key": "LogoutOptions.ContactSupportText", + "value": "Если возникли неполадки, сообщите нам; выход из аккаунта обычно не помогает." + }, + "LogoutOptions.ContactSupportTitle": { + "key": "LogoutOptions.ContactSupportTitle", + "value": "Обратиться в поддержку" + }, + "LogoutOptions.LogOut": { + "key": "LogoutOptions.LogOut", + "value": "Выйти" + }, + "LogoutOptions.LogOutInfo": { + "key": "LogoutOptions.LogOutInfo", + "value": "При выходе из аккаунта секретные чаты на этом устройстве пропадут." + }, + "LogoutOptions.SetPasscodeText": { + "key": "LogoutOptions.SetPasscodeText", + "value": "Включите код-пароль для разблокировки приложения на Вашем устройстве." + }, + "LogoutOptions.SetPasscodeTitle": { + "key": "LogoutOptions.SetPasscodeTitle", + "value": "Установить код-пароль" + }, + "LogoutOptions.Title": { + "key": "LogoutOptions.Title", + "value": "Выход" + }, + "MESSAGES": { + "key": "MESSAGES", + "value": "Сообщения от %1$@: %2$@" + }, + "MESSAGES_SEPARATED": { + "key": "MESSAGES_SEPARATED", + "value": "%1$@:|сообщения (%2$@)" + }, + "MESSAGE_AUDIO": { + "key": "MESSAGE_AUDIO", + "value": "%1$@ прислал(а) голосовое сообщение" + }, + "MESSAGE_AUDIO_SEPARATED": { + "key": "MESSAGE_AUDIO_SEPARATED", + "value": "%1$@:|голосовое сообщение" + }, + "MESSAGE_CONTACT": { + "key": "MESSAGE_CONTACT", + "value": "%1$@ прислал(а) контакт" + }, + "MESSAGE_CONTACT_SEPARATED": { + "key": "MESSAGE_CONTACT_SEPARATED", + "value": "%1$@:|контакт" + }, + "MESSAGE_DOC": { + "key": "MESSAGE_DOC", + "value": "%1$@ прислал(а) файл" + }, + "MESSAGE_DOC_SEPARATED": { + "key": "MESSAGE_DOC_SEPARATED", + "value": "%1$@:|файл" + }, + "MESSAGE_FWDS": { + "key": "MESSAGE_FWDS", + "value": "%1$@ переслал(а) Вам сообщения (%2$@)" + }, + "MESSAGE_FWDS_SEPARATED": { + "key": "MESSAGE_FWDS_SEPARATED", + "value": "%1$@:|пересланные сообщения (%2$@)" + }, + "MESSAGE_GAME": { + "key": "MESSAGE_GAME", + "value": "%1$@ приглашает сыграть в «%2$@»" + }, + "MESSAGE_GAME_SEPARATED": { + "key": "MESSAGE_GAME_SEPARATED", + "value": "%1$@|приглашает сыграть в «%2$@»" + }, + "MESSAGE_GEO": { + "key": "MESSAGE_GEO", + "value": "%1$@ прислал(а) карту" + }, + "MESSAGE_GEOLIVE": { + "key": "MESSAGE_GEOLIVE", + "value": "%1$@ начал(а) транслировать геопозицию" + }, + "MESSAGE_GEOLIVE_SEPARATED": { + "key": "MESSAGE_GEOLIVE_SEPARATED", + "value": "%1$@:|трансляция геопозиции" + }, + "MESSAGE_GEO_SEPARATED": { + "key": "MESSAGE_GEO_SEPARATED", + "value": "%1$@:|карта" + }, + "MESSAGE_GIF": { + "key": "MESSAGE_GIF", + "value": "%1$@ прислал(а) GIF" + }, + "MESSAGE_GIF_SEPARATED": { + "key": "MESSAGE_GIF_SEPARATED", + "value": "%1$@:|GIF" + }, + "MESSAGE_INVOICE": { + "key": "MESSAGE_INVOICE", + "value": "%1$@ прислал(а) счёт на %2$@" + }, + "MESSAGE_INVOICE_SEPARATED": { + "key": "MESSAGE_INVOICE_SEPARATED", + "value": "%1$@:|счёт на %2$@" + }, + "MESSAGE_NOTEXT": { + "key": "MESSAGE_NOTEXT", + "value": "%1$@ прислал(а) сообщение" + }, + "MESSAGE_NOTEXT_SEPARATED": { + "key": "MESSAGE_NOTEXT_SEPARATED", + "value": "%1$@:|новое сообщение" + }, + "MESSAGE_PHOTO": { + "key": "MESSAGE_PHOTO", + "value": "%1$@ прислал(а) фото" + }, + "MESSAGE_PHOTOS": { + "key": "MESSAGE_PHOTOS", + "value": " %2$@ фото от %1$@" + }, + "MESSAGE_PHOTOS_SEPARATED": { + "key": "MESSAGE_PHOTOS_SEPARATED", + "value": "%1$@:|фотографии (%2$@)" + }, + "MESSAGE_PHOTO_SECRET": { + "key": "MESSAGE_PHOTO_SECRET", + "value": "%1$@ прислал(а) самоуничтожающееся фото" + }, + "MESSAGE_PHOTO_SECRET_SEPARATED": { + "key": "MESSAGE_PHOTO_SECRET_SEPARATED", + "value": "%1$@:|самоуничтожающееся фото" + }, + "MESSAGE_PHOTO_SEPARATED": { + "key": "MESSAGE_PHOTO_SEPARATED", + "value": "%1$@:|фотография" + }, + "MESSAGE_POLL": { + "key": "MESSAGE_POLL", + "value": "%1$@ прислал(а) опрос" + }, + "MESSAGE_POLL_SEPARATED": { + "key": "MESSAGE_POLL_SEPARATED", + "value": "%1$@:|опрос" + }, + "MESSAGE_ROUND": { + "key": "MESSAGE_ROUND", + "value": "%1$@ прислал(а) видеосообщение" + }, + "MESSAGE_ROUND_SEPARATED": { + "key": "MESSAGE_ROUND_SEPARATED", + "value": "%1$@:|видеосообщение" + }, + "MESSAGE_SCREENSHOT": { + "key": "MESSAGE_SCREENSHOT", + "value": "%1$@ сделал(а) скриншот" + }, + "MESSAGE_SCREENSHOT_SEPARATED": { + "key": "MESSAGE_SCREENSHOT_SEPARATED", + "value": "%1$@|сделал(а) скриншот" + }, + "MESSAGE_STICKER": { + "key": "MESSAGE_STICKER", + "value": "%1$@ прислал(а) Вам стикер %2$@" + }, + "MESSAGE_STICKER_SEPARATED": { + "key": "MESSAGE_STICKER_SEPARATED", + "value": "%1$@:|стикер %2$@" + }, + "MESSAGE_TEXT": { + "key": "MESSAGE_TEXT", + "value": "%1$@: %2$@" + }, + "MESSAGE_TEXT_SEPARATED": { + "key": "MESSAGE_TEXT_SEPARATED", + "value": "%1$@|%2$@" + }, + "MESSAGE_VIDEO": { + "key": "MESSAGE_VIDEO", + "value": "%1$@ прислал(а) видео" + }, + "MESSAGE_VIDEO_SECRET": { + "key": "MESSAGE_VIDEO_SECRET", + "value": "%1$@ прислал(а) самоуничтожающееся видео" + }, + "MESSAGE_VIDEO_SECRET_SEPARATED": { + "key": "MESSAGE_VIDEO_SECRET_SEPARATED", + "value": "%1$@:|самоуничтожающееся видео" + }, + "MESSAGE_VIDEO_SEPARATED": { + "key": "MESSAGE_VIDEO_SEPARATED", + "value": "%1$@:|видео" + }, + "Map.AccurateTo": { + "key": "Map.AccurateTo", + "value": "С точностью до %@" + }, + "Map.AddressOnMap": { + "key": "Map.AddressOnMap", + "value": "Адрес на карте" + }, + "Map.ChooseAPlace": { + "key": "Map.ChooseAPlace", + "value": "Или выбрать место" + }, + "Map.ChooseLocationTitle": { + "key": "Map.ChooseLocationTitle", + "value": "Геопозиция" + }, + "Map.Directions": { + "key": "Map.Directions", + "value": "Маршруты" + }, + "Map.DirectionsDriveEta": { + "key": "Map.DirectionsDriveEta", + "value": "ехать %@" + }, + "Map.DistanceAway": { + "key": "Map.DistanceAway", + "value": "%@ от Вас" + }, + "Map.ETAHours": { + "key": "Map.ETAHours", + "zeroValue": null, + "oneValue": "%@ ч.", + "twoValue": null, + "fewValue": "%@ ч.", + "manyValue": "%@ ч.", + "otherValue": "%@ ч." + }, + "Map.ETAMinutes": { + "key": "Map.ETAMinutes", + "zeroValue": null, + "oneValue": "%@ мин.", + "twoValue": null, + "fewValue": "%@ мин.", + "manyValue": "%@ мин.", + "otherValue": "%@ мин." + }, + "Map.GetDirections": { + "key": "Map.GetDirections", + "value": "Схема проезда" + }, + "Map.Home": { + "key": "Map.Home", + "value": "Домашний" + }, + "Map.HomeAndWorkInfo": { + "key": "Map.HomeAndWorkInfo", + "value": "В приложении используются домашний и рабочий адрес из Вашей карточки контакта.\n\nЕсли в ней указаны актуальные контактные данные, Вы сможете быстро отправлять их через Telegram." + }, + "Map.HomeAndWorkTitle": { + "key": "Map.HomeAndWorkTitle", + "value": "Домашний и рабочий адрес" + }, + "Map.Hybrid": { + "key": "Map.Hybrid", + "value": "Гибрид" + }, + "Map.LiveLocationFor15Minutes": { + "key": "Map.LiveLocationFor15Minutes", + "value": "15 минут" + }, + "Map.LiveLocationFor1Hour": { + "key": "Map.LiveLocationFor1Hour", + "value": "1 час" + }, + "Map.LiveLocationFor8Hours": { + "key": "Map.LiveLocationFor8Hours", + "value": "8 часов" + }, + "Map.LiveLocationGroupDescription": { + "key": "Map.LiveLocationGroupDescription", + "value": "Укажите, как долго Ваше актуальное местоположение будет доступно в чате." + }, + "Map.LiveLocationPrivateDescription": { + "key": "Map.LiveLocationPrivateDescription", + "value": "Укажите, как долго %@ будет видеть Ваше актуальное местоположение." + }, + "Map.LiveLocationShortHour": { + "key": "Map.LiveLocationShortHour", + "value": "%@ч" + }, + "Map.LiveLocationShowAll": { + "key": "Map.LiveLocationShowAll", + "value": "Показать все" + }, + "Map.LiveLocationTitle": { + "key": "Map.LiveLocationTitle", + "value": "Геопозиция" + }, + "Map.LoadError": { + "key": "Map.LoadError", + "value": "Произошла ошибка. Попробуйте ещё раз." + }, + "Map.Locating": { + "key": "Map.Locating", + "value": "Определение геопозиции..." + }, + "Map.LocatingError": { + "key": "Map.LocatingError", + "value": "Не удалось найти точку" + }, + "Map.Location": { + "key": "Map.Location", + "value": "Геопозиция" + }, + "Map.LocationTitle": { + "key": "Map.LocationTitle", + "value": "Геопозиция" + }, + "Map.Map": { + "key": "Map.Map", + "value": "Карта" + }, + "Map.NoPlacesNearby": { + "key": "Map.NoPlacesNearby", + "value": "Не найдено мест поблизости.\nПопробуйте задать другую геопозицию." + }, + "Map.OpenIn": { + "key": "Map.OpenIn", + "value": "Открыть с помощью" + }, + "Map.OpenInGoogleMaps": { + "key": "Map.OpenInGoogleMaps", + "value": "Открыть в Google Maps" + }, + "Map.OpenInHereMaps": { + "key": "Map.OpenInHereMaps", + "value": "Открыть в картах HERE" + }, + "Map.OpenInMaps": { + "key": "Map.OpenInMaps", + "value": "Открыть в картах Apple" + }, + "Map.OpenInWaze": { + "key": "Map.OpenInWaze", + "value": "Открыть в Waze" + }, + "Map.OpenInYandexMaps": { + "key": "Map.OpenInYandexMaps", + "value": "Открыть в «Яндекс.Картах»" + }, + "Map.OpenInYandexNavigator": { + "key": "Map.OpenInYandexNavigator", + "value": "Открыть в «Яндекс.Навигаторе»" + }, + "Map.PlacesInThisArea": { + "key": "Map.PlacesInThisArea", + "value": "Места поблизости" + }, + "Map.PlacesNearby": { + "key": "Map.PlacesNearby", + "value": "Места поблизости" + }, + "Map.PullUpForPlaces": { + "key": "Map.PullUpForPlaces", + "value": "ПОТЯНИТЕ, ЧТОБЫ ВЫБРАТЬ МЕСТО" + }, + "Map.Satellite": { + "key": "Map.Satellite", + "value": "Спутник" + }, + "Map.Search": { + "key": "Map.Search", + "value": "Поиск мест рядом" + }, + "Map.SearchNoResultsDescription": { + "key": "Map.SearchNoResultsDescription", + "value": "По запросу \"%@\" ничего не найдено.\nПопробуйте снова." + }, + "Map.SendMyCurrentLocation": { + "key": "Map.SendMyCurrentLocation", + "value": "Отправить геопозицию" + }, + "Map.SendThisLocation": { + "key": "Map.SendThisLocation", + "value": "Отправить геопозицию" + }, + "Map.SendThisPlace": { + "key": "Map.SendThisPlace", + "value": "Отправить это место" + }, + "Map.SetThisLocation": { + "key": "Map.SetThisLocation", + "value": "Выбрать эту геопозицию" + }, + "Map.SetThisPlace": { + "key": "Map.SetThisPlace", + "value": "Выбрать это место" + }, + "Map.ShareLiveLocation": { + "key": "Map.ShareLiveLocation", + "value": "Транслировать геопозицию" + }, + "Map.ShareLiveLocationHelp": { + "key": "Map.ShareLiveLocationHelp", + "value": "Обновляется в реальном времени" + }, + "Map.ShowPlaces": { + "key": "Map.ShowPlaces", + "value": "Показать места" + }, + "Map.StopLiveLocation": { + "key": "Map.StopLiveLocation", + "value": "Остановить трансляцию" + }, + "Map.Unknown": { + "key": "Map.Unknown", + "value": "Неизвестная геопозиция" + }, + "Map.Work": { + "key": "Map.Work", + "value": "Рабочий" + }, + "Map.YouAreHere": { + "key": "Map.YouAreHere", + "value": "Вы здесь" + }, + "MaskStickerSettings.Info": { + "key": "MaskStickerSettings.Info", + "value": "Вы можете добавлять маски на отправляемые фото и видео. Для этого перед отправкой откройте визуальный редактор." + }, + "MaskStickerSettings.Title": { + "key": "MaskStickerSettings.Title", + "value": "Маски" + }, + "Media.LimitedAccessChangeSettings": { + "key": "Media.LimitedAccessChangeSettings", + "value": "Изменить настройки" + }, + "Media.LimitedAccessManage": { + "key": "Media.LimitedAccessManage", + "value": "Управление" + }, + "Media.LimitedAccessSelectMore": { + "key": "Media.LimitedAccessSelectMore", + "value": "Выбрать другие фото..." + }, + "Media.LimitedAccessText": { + "key": "Media.LimitedAccessText", + "value": "Вы не разрешили приложению доступ ко всем фотографиям." + }, + "Media.LimitedAccessTitle": { + "key": "Media.LimitedAccessTitle", + "value": "Ограничен доступ к медиа" + }, + "Media.SendWithTimer": { + "key": "Media.SendWithTimer", + "value": "Задать таймер" + }, + "Media.SendingOptionsTooltip": { + "key": "Media.SendingOptionsTooltip", + "value": "Удерживайте кнопку, чтобы задать таймер для удаления." + }, + "Media.ShareItem": { + "key": "Media.ShareItem", + "zeroValue": null, + "oneValue": "%@ элемент", + "twoValue": null, + "fewValue": "%@ элемента", + "manyValue": "%@ элементов", + "otherValue": "Все %@ элементов" + }, + "Media.SharePhoto": { + "key": "Media.SharePhoto", + "zeroValue": null, + "oneValue": "%@ фотографию", + "twoValue": null, + "fewValue": "%@ фотографии", + "manyValue": "Все %@ фотографий", + "otherValue": "Все %@ фотографий" + }, + "Media.ShareThisPhoto": { + "key": "Media.ShareThisPhoto", + "value": "Выбрать эту фотографию" + }, + "Media.ShareThisVideo": { + "key": "Media.ShareThisVideo", + "value": "Это видео" + }, + "Media.ShareVideo": { + "key": "Media.ShareVideo", + "zeroValue": null, + "oneValue": "%@ видео", + "twoValue": null, + "fewValue": "%@ видео", + "manyValue": "%@ видео", + "otherValue": "Все %@ видео" + }, + "MediaPicker.AddCaption": { + "key": "MediaPicker.AddCaption", + "value": "Добавить подпись…" + }, + "MediaPicker.CameraRoll": { + "key": "MediaPicker.CameraRoll", + "value": "Фотопоток" + }, + "MediaPicker.GroupDescription": { + "key": "MediaPicker.GroupDescription", + "value": "Объединить фотографии в альбом" + }, + "MediaPicker.LivePhotoDescription": { + "key": "MediaPicker.LivePhotoDescription", + "value": "Live-фотография будет воспроизводиться автоматически и повторяться, как GIF." + }, + "MediaPicker.Send": { + "key": "MediaPicker.Send", + "value": "Отправить" + }, + "MediaPicker.TapToUngroupDescription": { + "key": "MediaPicker.TapToUngroupDescription", + "value": "Нажмите, чтобы отключить группировку" + }, + "MediaPicker.TimerTooltip": { + "key": "MediaPicker.TimerTooltip", + "value": "Вы можете включить удаление по таймеру" + }, + "MediaPicker.UngroupDescription": { + "key": "MediaPicker.UngroupDescription", + "value": "Не группировать фотографии" + }, + "MediaPicker.VideoMuteDescription": { + "key": "MediaPicker.VideoMuteDescription", + "value": "Звук отключен, видео будет воспроизводиться автоматически и по кругу, как GIF-анимация." + }, + "MediaPicker.Videos": { + "key": "MediaPicker.Videos", + "value": "Видео" + }, + "MediaPlayer.UnknownArtist": { + "key": "MediaPlayer.UnknownArtist", + "value": "Неизвестен" + }, + "MediaPlayer.UnknownTrack": { + "key": "MediaPlayer.UnknownTrack", + "value": "Неизвестный трек" + }, + "MemberSearch.BotSection": { + "key": "MemberSearch.BotSection", + "value": "БОТЫ" + }, + "Message.Animation": { + "key": "Message.Animation", + "value": "GIF" + }, + "Message.Audio": { + "key": "Message.Audio", + "value": "Голосовое сообщение" + }, + "Message.AuthorPinnedGame": { + "key": "Message.AuthorPinnedGame", + "value": "%@ закрепил(а) игру" + }, + "Message.Contact": { + "key": "Message.Contact", + "value": "Контакт" + }, + "Message.FakeAccount": { + "key": "Message.FakeAccount", + "value": "Fake" + }, + "Message.File": { + "key": "Message.File", + "value": "Файл" + }, + "Message.ForwardedMessage": { + "key": "Message.ForwardedMessage", + "value": "Пересланное сообщение\nАвтор: %@" + }, + "Message.ForwardedMessageShort": { + "key": "Message.ForwardedMessageShort", + "value": "Переслано от\n%@" + }, + "Message.ForwardedPsa.covid": { + "key": "Message.ForwardedPsa.covid", + "value": "Новость о COVID-19\nОт: %@" + }, + "Message.Game": { + "key": "Message.Game", + "value": "Игра" + }, + "Message.GenericForwardedPsa": { + "key": "Message.GenericForwardedPsa", + "value": "Экстренное оповещение\nОт: %@" + }, + "Message.ImageExpired": { + "key": "Message.ImageExpired", + "value": "Фотография самоуничтожилась" + }, + "Message.ImportedDateFormat": { + "key": "Message.ImportedDateFormat", + "value": "%1$@ в %2$@, импортировано в %3$@" + }, + "Message.InvoiceLabel": { + "key": "Message.InvoiceLabel", + "value": "СЧЁТ" + }, + "Message.LiveLocation": { + "key": "Message.LiveLocation", + "value": "Трансляция геопозиции" + }, + "Message.Location": { + "key": "Message.Location", + "value": "Геопозиция" + }, + "Message.PaymentSent": { + "key": "Message.PaymentSent", + "value": "Оплата: %@" + }, + "Message.Photo": { + "key": "Message.Photo", + "value": "Фотография" + }, + "Message.PinnedAnimationMessage": { + "key": "Message.PinnedAnimationMessage", + "value": "закреплённый GIF" + }, + "Message.PinnedAudioMessage": { + "key": "Message.PinnedAudioMessage", + "value": "закреплённое голосовое сообщение" + }, + "Message.PinnedContactMessage": { + "key": "Message.PinnedContactMessage", + "value": "закреплённый контакт" + }, + "Message.PinnedDocumentMessage": { + "key": "Message.PinnedDocumentMessage", + "value": "закрепил(а) файл" + }, + "Message.PinnedGame": { + "key": "Message.PinnedGame", + "value": "закреплённая игра" + }, + "Message.PinnedGenericMessage": { + "key": "Message.PinnedGenericMessage", + "value": "%@ закрепил(а) сообщение" + }, + "Message.PinnedInvoice": { + "key": "Message.PinnedInvoice", + "value": "закрепленный счёт" + }, + "Message.PinnedLiveLocationMessage": { + "key": "Message.PinnedLiveLocationMessage", + "value": "закрепленная трансляция геопозиции" + }, + "Message.PinnedLocationMessage": { + "key": "Message.PinnedLocationMessage", + "value": "закреплённая геопозиция" + }, + "Message.PinnedPhotoMessage": { + "key": "Message.PinnedPhotoMessage", + "value": "закреплённое фото" + }, + "Message.PinnedPollMessage": { + "key": "Message.PinnedPollMessage", + "value": "закреплённый опрос" + }, + "Message.PinnedStickerMessage": { + "key": "Message.PinnedStickerMessage", + "value": "закреплённый стикер" + }, + "Message.PinnedTextMessage": { + "key": "Message.PinnedTextMessage", + "value": "закреплено \"%@\"" + }, + "Message.PinnedVideoMessage": { + "key": "Message.PinnedVideoMessage", + "value": "закреплённое видео" + }, + "Message.ReplyActionButtonShowReceipt": { + "key": "Message.ReplyActionButtonShowReceipt", + "value": "Показать квитанцию" + }, + "Message.ScamAccount": { + "key": "Message.ScamAccount", + "value": "Scam" + }, + "Message.Sticker": { + "key": "Message.Sticker", + "value": "Стикер" + }, + "Message.StickerText": { + "key": "Message.StickerText", + "value": "Стикер %@" + }, + "Message.Theme": { + "key": "Message.Theme", + "value": "Цветовая тема" + }, + "Message.Video": { + "key": "Message.Video", + "value": "Видео" + }, + "Message.VideoExpired": { + "key": "Message.VideoExpired", + "value": "Срок жизни видео истёк" + }, + "Message.VideoMessage": { + "key": "Message.VideoMessage", + "value": "Видеосообщение" + }, + "Message.Wallpaper": { + "key": "Message.Wallpaper", + "value": "Фон для чатов" + }, + "MessagePoll.LabelAnonymous": { + "key": "MessagePoll.LabelAnonymous", + "value": "Анонимный опрос" + }, + "MessagePoll.LabelAnonymousQuiz": { + "key": "MessagePoll.LabelAnonymousQuiz", + "value": "Анонимная викторина" + }, + "MessagePoll.LabelClosed": { + "key": "MessagePoll.LabelClosed", + "value": "Результаты" + }, + "MessagePoll.LabelPoll": { + "key": "MessagePoll.LabelPoll", + "value": "Опрос" + }, + "MessagePoll.LabelQuiz": { + "key": "MessagePoll.LabelQuiz", + "value": "Викторина" + }, + "MessagePoll.NoVotes": { + "key": "MessagePoll.NoVotes", + "value": "Нет голосов" + }, + "MessagePoll.QuizCount": { + "key": "MessagePoll.QuizCount", + "zeroValue": null, + "oneValue": "%@ ответ", + "twoValue": null, + "fewValue": "%@ ответа", + "manyValue": "%@ ответов", + "otherValue": "%@ ответа" + }, + "MessagePoll.QuizNoUsers": { + "key": "MessagePoll.QuizNoUsers", + "value": "Ответов пока нет" + }, + "MessagePoll.SubmitVote": { + "key": "MessagePoll.SubmitVote", + "value": "Проголосовать" + }, + "MessagePoll.ViewResults": { + "key": "MessagePoll.ViewResults", + "value": "Результаты" + }, + "MessagePoll.VotedCount": { + "key": "MessagePoll.VotedCount", + "zeroValue": null, + "oneValue": "%@ голос", + "twoValue": null, + "fewValue": "%@ голоса", + "manyValue": "%@ голосов", + "otherValue": "%@ голосов" + }, + "MessageTimer.Custom": { + "key": "MessageTimer.Custom", + "value": "Другой срок" + }, + "MessageTimer.Days": { + "key": "MessageTimer.Days", + "zeroValue": null, + "oneValue": "%@ день", + "twoValue": null, + "fewValue": "%@ дня", + "manyValue": "%@ дней", + "otherValue": "%@ дней" + }, + "MessageTimer.Forever": { + "key": "MessageTimer.Forever", + "value": "Навсегда" + }, + "MessageTimer.Hours": { + "key": "MessageTimer.Hours", + "zeroValue": null, + "oneValue": "%@ час", + "twoValue": null, + "fewValue": "%@ часа", + "manyValue": "%@ часов", + "otherValue": "%@ часов" + }, + "MessageTimer.Minutes": { + "key": "MessageTimer.Minutes", + "zeroValue": null, + "oneValue": "%@ минута", + "twoValue": null, + "fewValue": "%@ минуты", + "manyValue": "%@ минут", + "otherValue": "%@ минут" + }, + "MessageTimer.Months": { + "key": "MessageTimer.Months", + "zeroValue": null, + "oneValue": "%@ месяц", + "twoValue": null, + "fewValue": "%@ месяца", + "manyValue": "%@ месяцев", + "otherValue": "%@ месяцев" + }, + "MessageTimer.Seconds": { + "key": "MessageTimer.Seconds", + "zeroValue": null, + "oneValue": "%@ секунда", + "twoValue": null, + "fewValue": "%@ секунды", + "manyValue": "%@ секунд", + "otherValue": "%@ секунд" + }, + "MessageTimer.ShortDays": { + "key": "MessageTimer.ShortDays", + "zeroValue": null, + "oneValue": "%@д", + "twoValue": null, + "fewValue": "%@д", + "manyValue": "%@д", + "otherValue": "%@д" + }, + "MessageTimer.ShortHours": { + "key": "MessageTimer.ShortHours", + "zeroValue": null, + "oneValue": "%@ч", + "twoValue": null, + "fewValue": "%@ч", + "manyValue": "%@ч", + "otherValue": "%@ч" + }, + "MessageTimer.ShortMinutes": { + "key": "MessageTimer.ShortMinutes", + "zeroValue": null, + "oneValue": "%@м", + "twoValue": null, + "fewValue": "%@м", + "manyValue": "%@м", + "otherValue": "%@м" + }, + "MessageTimer.ShortSeconds": { + "key": "MessageTimer.ShortSeconds", + "zeroValue": null, + "oneValue": "%@с", + "twoValue": null, + "fewValue": "%@с", + "manyValue": "%@с", + "otherValue": "%@с" + }, + "MessageTimer.ShortWeeks": { + "key": "MessageTimer.ShortWeeks", + "zeroValue": null, + "oneValue": "%@н", + "twoValue": null, + "fewValue": "%@н", + "manyValue": "%@н", + "otherValue": "%@н" + }, + "MessageTimer.Weeks": { + "key": "MessageTimer.Weeks", + "zeroValue": null, + "oneValue": "%@ неделя", + "twoValue": null, + "fewValue": "%@ недели", + "manyValue": "%@ недель", + "otherValue": "%@ недель" + }, + "Month.GenApril": { + "key": "Month.GenApril", + "value": "апреля" + }, + "Month.GenAugust": { + "key": "Month.GenAugust", + "value": "августа" + }, + "Month.GenDecember": { + "key": "Month.GenDecember", + "value": "декабря" + }, + "Month.GenFebruary": { + "key": "Month.GenFebruary", + "value": "февраля" + }, + "Month.GenJanuary": { + "key": "Month.GenJanuary", + "value": "января" + }, + "Month.GenJuly": { + "key": "Month.GenJuly", + "value": "июля" + }, + "Month.GenJune": { + "key": "Month.GenJune", + "value": "июня" + }, + "Month.GenMarch": { + "key": "Month.GenMarch", + "value": "марта" + }, + "Month.GenMay": { + "key": "Month.GenMay", + "value": "мая" + }, + "Month.GenNovember": { + "key": "Month.GenNovember", + "value": "ноября" + }, + "Month.GenOctober": { + "key": "Month.GenOctober", + "value": "октября" + }, + "Month.GenSeptember": { + "key": "Month.GenSeptember", + "value": "сентября" + }, + "Month.ShortApril": { + "key": "Month.ShortApril", + "value": "апр" + }, + "Month.ShortAugust": { + "key": "Month.ShortAugust", + "value": "авг" + }, + "Month.ShortDecember": { + "key": "Month.ShortDecember", + "value": "дек" + }, + "Month.ShortFebruary": { + "key": "Month.ShortFebruary", + "value": "фев" + }, + "Month.ShortJanuary": { + "key": "Month.ShortJanuary", + "value": "янв" + }, + "Month.ShortJuly": { + "key": "Month.ShortJuly", + "value": "июл" + }, + "Month.ShortJune": { + "key": "Month.ShortJune", + "value": "июн" + }, + "Month.ShortMarch": { + "key": "Month.ShortMarch", + "value": "мар" + }, + "Month.ShortMay": { + "key": "Month.ShortMay", + "value": "май" + }, + "Month.ShortNovember": { + "key": "Month.ShortNovember", + "value": "ноя" + }, + "Month.ShortOctober": { + "key": "Month.ShortOctober", + "value": "окт" + }, + "Month.ShortSeptember": { + "key": "Month.ShortSeptember", + "value": "сен" + }, + "MusicPlayer.VoiceNote": { + "key": "MusicPlayer.VoiceNote", + "value": "Голосовое сообщение" + }, + "MuteExpires.Days": { + "key": "MuteExpires.Days", + "zeroValue": null, + "oneValue": "через %@ день", + "twoValue": null, + "fewValue": "через %@ дня", + "manyValue": "через %@ дней", + "otherValue": "через %@ дней" + }, + "MuteExpires.Hours": { + "key": "MuteExpires.Hours", + "zeroValue": null, + "oneValue": "через %@ час", + "twoValue": null, + "fewValue": "через %@ часа", + "manyValue": "через %@ часов", + "otherValue": "через %@ час" + }, + "MuteExpires.Minutes": { + "key": "MuteExpires.Minutes", + "zeroValue": null, + "oneValue": "через %@ минуту", + "twoValue": null, + "fewValue": "через %@ минуты", + "manyValue": "через %@ минут", + "otherValue": "через %@ минут" + }, + "MuteFor.Days": { + "key": "MuteFor.Days", + "zeroValue": null, + "oneValue": "Не беспокоить 1 день", + "twoValue": null, + "fewValue": "Не беспокоить %@ дня", + "manyValue": "Не беспокоить %@ дней", + "otherValue": "Не беспокоить %@ дня" + }, + "MuteFor.Forever": { + "key": "MuteFor.Forever", + "value": "Выключить уведомления" + }, + "MuteFor.Hours": { + "key": "MuteFor.Hours", + "zeroValue": null, + "oneValue": "Не беспокоить %@ час", + "twoValue": null, + "fewValue": "Не беспокоить %@ часа", + "manyValue": "Не беспокоить %@ часов", + "otherValue": "Не беспокоить %@ часа" + }, + "NEW_CHANNEL_MESSAGES_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d новая публикация", + "twoValue": null, + "fewValue": "%1$@:|%2$d новых публикации", + "manyValue": "%1$@:|%2$d новых публикаций", + "otherValue": "%1$@:|%2$d новых публикаций" + }, + "NEW_CHANNEL_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d пересланное сообщение", + "twoValue": null, + "fewValue": "%1$@:|%2$d пересланных сообщения", + "manyValue": "%1$@:|%2$d пересланных сообщений", + "otherValue": "%1$@:|%2$d пересланных сообщений" + }, + "NEW_CHANNEL_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_CHANNEL_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d фотография", + "twoValue": null, + "fewValue": "%1$@:|%2$d фотографии", + "manyValue": "%1$@:|%2$d фотографий", + "otherValue": "%1$@:|%2$d фотографий" + }, + "NEW_CHAT_MESSAGES_SEPARATED": { + "key": "NEW_CHAT_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%2$@|%3$d сообщение от %1$@", + "twoValue": null, + "fewValue": "%2$@|%3$d сообщения от %1$@", + "manyValue": "%2$@|%3$d сообщений от %1$@", + "otherValue": "%2$@|%3$d сообщений от %1$@" + }, + "NEW_CHAT_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_CHAT_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@ в %2$@|%3$d пересланное сообщение", + "twoValue": null, + "fewValue": "%1$@ в %2$@|%3$d пересланных сообщения", + "manyValue": "%1$@ в %2$@|%3$d пересланных сообщений", + "otherValue": "%1$@ в %2$@|%3$d пересланных сообщений" + }, + "NEW_CHAT_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_CHAT_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%2$@|%3$d фотография от %1$@", + "twoValue": null, + "fewValue": "%2$@|%3$d фотографии от %1$@", + "manyValue": "%2$@|%3$d фотографий от %1$@", + "otherValue": "%2$@|%3$d фотографий от %1$@" + }, + "NEW_MESSAGES_SEPARATED": { + "key": "NEW_MESSAGES_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d новое сообщение", + "twoValue": null, + "fewValue": "%1$@:|%2$d новых сообщения", + "manyValue": "%1$@:|%2$d новых сообщений", + "otherValue": "%1$@:|%2$d новых сообщений" + }, + "NEW_MESSAGE_FWDS_SEPARATED": { + "key": "NEW_MESSAGE_FWDS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d пересланное сообщение", + "twoValue": null, + "fewValue": "%1$@:|%2$d пересланных сообщения", + "manyValue": "%1$@:|%2$d пересланных сообщений", + "otherValue": "%1$@:|%2$d пересланных сообщений" + }, + "NEW_MESSAGE_PHOTOS_SEPARATED": { + "key": "NEW_MESSAGE_PHOTOS_SEPARATED", + "zeroValue": null, + "oneValue": "%1$@:|%2$d фотография", + "twoValue": null, + "fewValue": "%1$@:|%2$d фотографии", + "manyValue": "%1$@:|%2$d фотографий", + "otherValue": "%1$@:|%2$d фотографий" + }, + "NetworkUsageSettings.BytesReceived": { + "key": "NetworkUsageSettings.BytesReceived", + "value": "Принято байт" + }, + "NetworkUsageSettings.BytesSent": { + "key": "NetworkUsageSettings.BytesSent", + "value": "Отправлено байт" + }, + "NetworkUsageSettings.CallDataSection": { + "key": "NetworkUsageSettings.CallDataSection", + "value": "ЗВОНКИ" + }, + "NetworkUsageSettings.Cellular": { + "key": "NetworkUsageSettings.Cellular", + "value": "Моб. сеть" + }, + "NetworkUsageSettings.CellularUsageSince": { + "key": "NetworkUsageSettings.CellularUsageSince", + "value": "Использование мобильной сети с %@" + }, + "NetworkUsageSettings.GeneralDataSection": { + "key": "NetworkUsageSettings.GeneralDataSection", + "value": "СООБЩЕНИЯ" + }, + "NetworkUsageSettings.MediaAudioDataSection": { + "key": "NetworkUsageSettings.MediaAudioDataSection", + "value": "АУДИО" + }, + "NetworkUsageSettings.MediaDocumentDataSection": { + "key": "NetworkUsageSettings.MediaDocumentDataSection", + "value": "ФАЙЛЫ" + }, + "NetworkUsageSettings.MediaImageDataSection": { + "key": "NetworkUsageSettings.MediaImageDataSection", + "value": "ФОТОГРАФИИ" + }, + "NetworkUsageSettings.MediaVideoDataSection": { + "key": "NetworkUsageSettings.MediaVideoDataSection", + "value": "ВИДЕО" + }, + "NetworkUsageSettings.ResetStats": { + "key": "NetworkUsageSettings.ResetStats", + "value": "Сбросить статистику" + }, + "NetworkUsageSettings.ResetStatsConfirmation": { + "key": "NetworkUsageSettings.ResetStatsConfirmation", + "value": "Вы точно хотите сбросить сетевую статистику?" + }, + "NetworkUsageSettings.Title": { + "key": "NetworkUsageSettings.Title", + "value": "Использование сети" + }, + "NetworkUsageSettings.TotalSection": { + "key": "NetworkUsageSettings.TotalSection", + "value": "ВСЕГО БАЙТ" + }, + "NetworkUsageSettings.Wifi": { + "key": "NetworkUsageSettings.Wifi", + "value": "Wi-Fi" + }, + "NetworkUsageSettings.WifiUsageSince": { + "key": "NetworkUsageSettings.WifiUsageSince", + "value": "Использование Wi-Fi с %@" + }, + "NewContact.Title": { + "key": "NewContact.Title", + "value": "Создать контакт" + }, + "Notification.CallBack": { + "key": "Notification.CallBack", + "value": "Перезвонить" + }, + "Notification.CallCanceled": { + "key": "Notification.CallCanceled", + "value": "Отменённый звонок" + }, + "Notification.CallCanceledShort": { + "key": "Notification.CallCanceledShort", + "value": "Отменённый вызов" + }, + "Notification.CallFormat": { + "key": "Notification.CallFormat", + "value": "%1$@, %2$@" + }, + "Notification.CallIncoming": { + "key": "Notification.CallIncoming", + "value": "Входящий звонок" + }, + "Notification.CallIncomingShort": { + "key": "Notification.CallIncomingShort", + "value": "Входящий" + }, + "Notification.CallMissed": { + "key": "Notification.CallMissed", + "value": "Пропущенный звонок" + }, + "Notification.CallMissedShort": { + "key": "Notification.CallMissedShort", + "value": "Пропущенный" + }, + "Notification.CallOutgoing": { + "key": "Notification.CallOutgoing", + "value": "Исходящий звонок" + }, + "Notification.CallOutgoingShort": { + "key": "Notification.CallOutgoingShort", + "value": "Исходящий" + }, + "Notification.CallTimeFormat": { + "key": "Notification.CallTimeFormat", + "value": "%1$@ (%2$@)" + }, + "Notification.ChangedGroupName": { + "key": "Notification.ChangedGroupName", + "value": "%@ изменил(а) название группы на «%@»" + }, + "Notification.ChangedGroupPhoto": { + "key": "Notification.ChangedGroupPhoto", + "value": "%@ изменил(а) фото группы" + }, + "Notification.ChangedGroupVideo": { + "key": "Notification.ChangedGroupVideo", + "value": "%@ изменил(а) видео группы" + }, + "Notification.ChannelInviter": { + "key": "Notification.ChannelInviter", + "value": "%@ пригласил(а) Вас в этот канал" + }, + "Notification.ChannelInviterSelf": { + "key": "Notification.ChannelInviterSelf", + "value": "Вы присоединились к этому каналу" + }, + "Notification.ChannelMigratedFrom": { + "key": "Notification.ChannelMigratedFrom", + "value": "Эта группа стала супергруппой" + }, + "Notification.CreatedChannel": { + "key": "Notification.CreatedChannel", + "value": "Канал создан" + }, + "Notification.CreatedChat": { + "key": "Notification.CreatedChat", + "value": "%@ создал(а) группу" + }, + "Notification.CreatedChatWithTitle": { + "key": "Notification.CreatedChatWithTitle", + "value": "%@ создал(а) группу «%@»" + }, + "Notification.CreatedGroup": { + "key": "Notification.CreatedGroup", + "value": "Группа создана" + }, + "Notification.Exceptions.Add": { + "key": "Notification.Exceptions.Add", + "value": "Добавить" + }, + "Notification.Exceptions.AddException": { + "key": "Notification.Exceptions.AddException", + "value": "Добавить исключение" + }, + "Notification.Exceptions.AlwaysOff": { + "key": "Notification.Exceptions.AlwaysOff", + "value": "Выключить" + }, + "Notification.Exceptions.AlwaysOn": { + "key": "Notification.Exceptions.AlwaysOn", + "value": "Включить" + }, + "Notification.Exceptions.DeleteAll": { + "key": "Notification.Exceptions.DeleteAll", + "value": "Удалить все" + }, + "Notification.Exceptions.DeleteAllConfirmation": { + "key": "Notification.Exceptions.DeleteAllConfirmation", + "value": "Вы точно хотите удалить все исключения?" + }, + "Notification.Exceptions.MessagePreviewAlwaysOff": { + "key": "Notification.Exceptions.MessagePreviewAlwaysOff", + "value": "Выключить" + }, + "Notification.Exceptions.MessagePreviewAlwaysOn": { + "key": "Notification.Exceptions.MessagePreviewAlwaysOn", + "value": "Включить" + }, + "Notification.Exceptions.MutedUntil": { + "key": "Notification.Exceptions.MutedUntil", + "value": "Без уведомлений до %@" + }, + "Notification.Exceptions.NewException": { + "key": "Notification.Exceptions.NewException", + "value": "Новое исключение" + }, + "Notification.Exceptions.NewException.MessagePreviewHeader": { + "key": "Notification.Exceptions.NewException.MessagePreviewHeader", + "value": "ПРЕДПРОСМОТР СООБЩЕНИЯ" + }, + "Notification.Exceptions.NewException.NotificationHeader": { + "key": "Notification.Exceptions.NewException.NotificationHeader", + "value": "УВЕДОМЛЕНИЯ" + }, + "Notification.Exceptions.PreviewAlwaysOff": { + "key": "Notification.Exceptions.PreviewAlwaysOff", + "value": "скрывать сообщение" + }, + "Notification.Exceptions.PreviewAlwaysOn": { + "key": "Notification.Exceptions.PreviewAlwaysOn", + "value": "Предпросмотр текста" + }, + "Notification.Exceptions.RemoveFromExceptions": { + "key": "Notification.Exceptions.RemoveFromExceptions", + "value": "Убрать из исключений" + }, + "Notification.Exceptions.Sound": { + "key": "Notification.Exceptions.Sound", + "value": "Звук: %@" + }, + "Notification.GameScoreExtended": { + "key": "Notification.GameScoreExtended", + "zeroValue": null, + "oneValue": "набрал(а) %@ в {game}", + "twoValue": null, + "fewValue": "набрал(а) %@ в {game}", + "manyValue": "набрал(а) %@ в {game}", + "otherValue": "набрал(а) %@ в {game}" + }, + "Notification.GameScoreSelfExtended": { + "key": "Notification.GameScoreSelfExtended", + "zeroValue": null, + "oneValue": "набрал(а) %@ в {game}", + "twoValue": null, + "fewValue": "набрал(а) %@ в {game}", + "manyValue": "набрал(а) %@ в {game}", + "otherValue": "набрал(а) %@ в {game}" + }, + "Notification.GameScoreSelfSimple": { + "key": "Notification.GameScoreSelfSimple", + "zeroValue": null, + "oneValue": "набрал(а) %@", + "twoValue": null, + "fewValue": "набрал(а) %@", + "manyValue": "набрал(а) %@", + "otherValue": "набрал(а) %@" + }, + "Notification.GameScoreSimple": { + "key": "Notification.GameScoreSimple", + "zeroValue": null, + "oneValue": "набрал(а) %@", + "twoValue": null, + "fewValue": "набрал(а) %@", + "manyValue": "набрал(а) %@", + "otherValue": "набрал(а) %@" + }, + "Notification.GroupInviter": { + "key": "Notification.GroupInviter", + "value": "%@ пригласил(а) Вас в эту группу" + }, + "Notification.GroupInviterSelf": { + "key": "Notification.GroupInviterSelf", + "value": "Вы присоединились к этой группе" + }, + "Notification.Invited": { + "key": "Notification.Invited", + "value": "%@ пригласил(а) %@" + }, + "Notification.InvitedMultiple": { + "key": "Notification.InvitedMultiple", + "value": "%@ пригласил(а) %@" + }, + "Notification.Joined": { + "key": "Notification.Joined", + "value": "%@ теперь в Telegram!" + }, + "Notification.JoinedChannel": { + "key": "Notification.JoinedChannel", + "value": "%@ теперь подписан(а) на канал" + }, + "Notification.JoinedChat": { + "key": "Notification.JoinedChat", + "value": "%@ вступил(а) в группу" + }, + "Notification.JoinedGroupByLink": { + "key": "Notification.JoinedGroupByLink", + "value": "%@ вступил(а) в группу по ссылке-приглашению" + }, + "Notification.Kicked": { + "key": "Notification.Kicked", + "value": "%@ исключил(а) %@" + }, + "Notification.LeftChannel": { + "key": "Notification.LeftChannel", + "value": "%@ покинул(а) канал" + }, + "Notification.LeftChat": { + "key": "Notification.LeftChat", + "value": "%@ покинул(а) группу" + }, + "Notification.MessageLifetime1d": { + "key": "Notification.MessageLifetime1d", + "value": "1 день" + }, + "Notification.MessageLifetime1h": { + "key": "Notification.MessageLifetime1h", + "value": "1 час" + }, + "Notification.MessageLifetime1m": { + "key": "Notification.MessageLifetime1m", + "value": "1 минуту" + }, + "Notification.MessageLifetime1w": { + "key": "Notification.MessageLifetime1w", + "value": "1 неделю" + }, + "Notification.MessageLifetime2s": { + "key": "Notification.MessageLifetime2s", + "value": "2 секунды" + }, + "Notification.MessageLifetime5s": { + "key": "Notification.MessageLifetime5s", + "value": "5 секунд" + }, + "Notification.MessageLifetimeChanged": { + "key": "Notification.MessageLifetimeChanged", + "value": "%1$@ включил(а) удаление по таймеру со сроком %2$@" + }, + "Notification.MessageLifetimeChangedOutgoing": { + "key": "Notification.MessageLifetimeChangedOutgoing", + "value": "Вы включили удаление по таймеру со сроком %1$@" + }, + "Notification.MessageLifetimeRemoved": { + "key": "Notification.MessageLifetimeRemoved", + "value": "%1$@ отключил(а) удаление по таймеру" + }, + "Notification.MessageLifetimeRemovedOutgoing": { + "key": "Notification.MessageLifetimeRemovedOutgoing", + "value": "Вы отключили удаление по таймеру" + }, + "Notification.Mute1h": { + "key": "Notification.Mute1h", + "value": "Не беспокоить час" + }, + "Notification.Mute1hMin": { + "key": "Notification.Mute1hMin", + "value": "Не беспокоить 1 час" + }, + "Notification.NewAuthDetected": { + "key": "Notification.NewAuthDetected", + "value": "%1$@,\nв Ваш аккаунт выполнен вход с нового устройства (%2$@ %3$@ в %4$@).\n\nУстройство: %5$@\nМесто: %6$@\n\nЕсли это были не Вы, перейдите в Настройки - Конфиденциальность - Сеансы и завершите этот сеанс.\n\nЕсли Вы считаете, что кто-то вошёл в Ваш аккаунт без Вашего ведома, советуем включить двухэтапную аутентификацию в разделе Конфиденциальность.\n\nКоманда Telegram" + }, + "Notification.PassportValueAddress": { + "key": "Notification.PassportValueAddress", + "value": "ваш адрес" + }, + "Notification.PassportValueEmail": { + "key": "Notification.PassportValueEmail", + "value": "электронная почта" + }, + "Notification.PassportValuePersonalDetails": { + "key": "Notification.PassportValuePersonalDetails", + "value": "личная информация" + }, + "Notification.PassportValuePhone": { + "key": "Notification.PassportValuePhone", + "value": "номер телефона" + }, + "Notification.PassportValueProofOfAddress": { + "key": "Notification.PassportValueProofOfAddress", + "value": "подтверждение адреса" + }, + "Notification.PassportValueProofOfIdentity": { + "key": "Notification.PassportValueProofOfIdentity", + "value": "удостоверение личности" + }, + "Notification.PassportValuesSentMessage": { + "key": "Notification.PassportValuesSentMessage", + "value": "%1$@ получил следующие документы: %2$@" + }, + "Notification.PaymentSent": { + "key": "Notification.PaymentSent", + "value": "Вы успешно перевели {amount} для {name} за {title}" + }, + "Notification.PinnedAnimationMessage": { + "key": "Notification.PinnedAnimationMessage", + "value": "%@ закрепил(а) GIF" + }, + "Notification.PinnedAudioMessage": { + "key": "Notification.PinnedAudioMessage", + "value": "%@ закрепил(а) голосовое сообщение" + }, + "Notification.PinnedContactMessage": { + "key": "Notification.PinnedContactMessage", + "value": "%@ закрепил(а) контакт" + }, + "Notification.PinnedDeletedMessage": { + "key": "Notification.PinnedDeletedMessage", + "value": "%@ закрепила(а) удалённое сообщение" + }, + "Notification.PinnedDocumentMessage": { + "key": "Notification.PinnedDocumentMessage", + "value": "%@ закрепил(а) файл" + }, + "Notification.PinnedLiveLocationMessage": { + "key": "Notification.PinnedLiveLocationMessage", + "value": "%@ закрепил(а) трансляцию геопозиции" + }, + "Notification.PinnedLocationMessage": { + "key": "Notification.PinnedLocationMessage", + "value": "%@ закрепил(а) карту" + }, + "Notification.PinnedMessage": { + "key": "Notification.PinnedMessage", + "value": "закреплённое сообщение" + }, + "Notification.PinnedPhotoMessage": { + "key": "Notification.PinnedPhotoMessage", + "value": "%@ закрепил(а) фотографию" + }, + "Notification.PinnedPollMessage": { + "key": "Notification.PinnedPollMessage", + "value": "%@ закрепил(а) опрос" + }, + "Notification.PinnedQuizMessage": { + "key": "Notification.PinnedQuizMessage", + "value": "%@ закрепил(а) викторину" + }, + "Notification.PinnedRoundMessage": { + "key": "Notification.PinnedRoundMessage", + "value": "%@ закрепил(а) видеосообщение" + }, + "Notification.PinnedStickerMessage": { + "key": "Notification.PinnedStickerMessage", + "value": "%@ закрепил(а) стикер" + }, + "Notification.PinnedTextMessage": { + "key": "Notification.PinnedTextMessage", + "value": "%@ закрепил(а) \"%@\"" + }, + "Notification.PinnedVideoMessage": { + "key": "Notification.PinnedVideoMessage", + "value": "%@ закрепил(а) видео" + }, + "Notification.ProximityReached": { + "key": "Notification.ProximityReached", + "value": "От %3$@ до %1$@ сейчас %2$@" + }, + "Notification.ProximityReachedYou": { + "key": "Notification.ProximityReachedYou", + "value": "От Вас до %1$@ сейчас %2$@" + }, + "Notification.ProximityYouReached": { + "key": "Notification.ProximityYouReached", + "value": "От Вас до %2$@ сейчас %1$@" + }, + "Notification.RemovedGroupPhoto": { + "key": "Notification.RemovedGroupPhoto", + "value": "%@ удалил(а) фото группы" + }, + "Notification.RenamedChannel": { + "key": "Notification.RenamedChannel", + "value": "Канал был переименован" + }, + "Notification.RenamedChat": { + "key": "Notification.RenamedChat", + "value": "%@ изменил(а) название группы" + }, + "Notification.RenamedGroup": { + "key": "Notification.RenamedGroup", + "value": "Группа переименована" + }, + "Notification.Reply": { + "key": "Notification.Reply", + "value": "Ответить" + }, + "Notification.SecretChatMessageScreenshot": { + "key": "Notification.SecretChatMessageScreenshot", + "value": "%@ сделал(а) скриншот!" + }, + "Notification.SecretChatMessageScreenshotSelf": { + "key": "Notification.SecretChatMessageScreenshotSelf", + "value": "Вы сделали скриншот!" + }, + "Notification.SecretChatScreenshot": { + "key": "Notification.SecretChatScreenshot", + "value": "Сделан скриншот" + }, + "Notification.VideoCallCanceled": { + "key": "Notification.VideoCallCanceled", + "value": "Отмененный видеозвонок" + }, + "Notification.VideoCallIncoming": { + "key": "Notification.VideoCallIncoming", + "value": "Входящий видеозвонок" + }, + "Notification.VideoCallMissed": { + "key": "Notification.VideoCallMissed", + "value": "Пропущенный видеозвонок" + }, + "Notification.VideoCallOutgoing": { + "key": "Notification.VideoCallOutgoing", + "value": "Исходящий видеозвонок" + }, + "Notification.VoiceChatEnded": { + "key": "Notification.VoiceChatEnded", + "value": "Голосовой чат завершен (%@)" + }, + "Notification.VoiceChatInvitation": { + "key": "Notification.VoiceChatInvitation", + "value": "%1$@ пригласил(а) %2$@ в голосовой чат" + }, + "Notification.VoiceChatInvitationForYou": { + "key": "Notification.VoiceChatInvitationForYou", + "value": "%1$@ пригласил(а) Вас в голосовой чат" + }, + "Notification.VoiceChatStarted": { + "key": "Notification.VoiceChatStarted", + "value": "%1$@ начал(а) голосовой чат" + }, + "NotificationSettings.ContactJoined": { + "key": "NotificationSettings.ContactJoined", + "value": "Новые контакты" + }, + "NotificationSettings.ContactJoinedInfo": { + "key": "NotificationSettings.ContactJoinedInfo", + "value": "Показывать всплывающее уведомление, когда кто-то из контактов появляется в Telegram." + }, + "NotificationSettings.ShowNotificationsAllAccounts": { + "key": "NotificationSettings.ShowNotificationsAllAccounts", + "value": "Всех аккаунтов" + }, + "NotificationSettings.ShowNotificationsAllAccountsInfoOff": { + "key": "NotificationSettings.ShowNotificationsAllAccountsInfoOff", + "value": "Включите, если хотите получать уведомления всех своих аккаунтов." + }, + "NotificationSettings.ShowNotificationsAllAccountsInfoOn": { + "key": "NotificationSettings.ShowNotificationsAllAccountsInfoOn", + "value": "Отключите, если хотите получать только уведомления активного аккаунта." + }, + "NotificationSettings.ShowNotificationsFromAccountsSection": { + "key": "NotificationSettings.ShowNotificationsFromAccountsSection", + "value": "ПОКАЗЫВАТЬ УВЕДОМЛЕНИЯ" + }, + "Notifications.AddExceptionTitle": { + "key": "Notifications.AddExceptionTitle", + "value": "Добавить исключение" + }, + "Notifications.AlertTones": { + "key": "Notifications.AlertTones", + "value": "ЗВУКИ СООБЩЕНИЙ" + }, + "Notifications.Badge": { + "key": "Notifications.Badge", + "value": "СЧЁТЧИК НА ИКОНКЕ" + }, + "Notifications.Badge.CountUnreadMessages": { + "key": "Notifications.Badge.CountUnreadMessages", + "value": "Число сообщений" + }, + "Notifications.Badge.CountUnreadMessages.InfoOff": { + "key": "Notifications.Badge.CountUnreadMessages.InfoOff", + "value": "Когда включено, счётчик показывает число непрочитанных сообщений, а не чатов." + }, + "Notifications.Badge.CountUnreadMessages.InfoOn": { + "key": "Notifications.Badge.CountUnreadMessages.InfoOn", + "value": "Когда выключено, счётчик показывает число непрочитанных чатов, а не число сообщений." + }, + "Notifications.Badge.IncludeChannels": { + "key": "Notifications.Badge.IncludeChannels", + "value": "Каналы" + }, + "Notifications.Badge.IncludeMutedChats": { + "key": "Notifications.Badge.IncludeMutedChats", + "value": "Чаты без уведомлений" + }, + "Notifications.Badge.IncludePublicGroups": { + "key": "Notifications.Badge.IncludePublicGroups", + "value": "Публичные группы" + }, + "Notifications.ChannelNotifications": { + "key": "Notifications.ChannelNotifications", + "value": "УВЕДОМЛЕНИЯ ОТ КАНАЛОВ" + }, + "Notifications.ChannelNotificationsAlert": { + "key": "Notifications.ChannelNotificationsAlert", + "value": "Показывать уведомления" + }, + "Notifications.ChannelNotificationsExceptionsHelp": { + "key": "Notifications.ChannelNotificationsExceptionsHelp", + "value": "Настройте свои уведомления для отдельных каналов." + }, + "Notifications.ChannelNotificationsHelp": { + "key": "Notifications.ChannelNotificationsHelp", + "value": "Уведомления для отдельных каналов можно настроить в их профилях." + }, + "Notifications.ChannelNotificationsPreview": { + "key": "Notifications.ChannelNotificationsPreview", + "value": "Показывать текст" + }, + "Notifications.ChannelNotificationsSound": { + "key": "Notifications.ChannelNotificationsSound", + "value": "Звук" + }, + "Notifications.ClassicTones": { + "key": "Notifications.ClassicTones", + "value": "КЛАССИЧЕСКИЕ" + }, + "Notifications.DisplayNamesOnLockScreen": { + "key": "Notifications.DisplayNamesOnLockScreen", + "value": "Имена в уведомлениях" + }, + "Notifications.DisplayNamesOnLockScreenInfo": { + "key": "Notifications.DisplayNamesOnLockScreenInfo", + "value": "Показывать имена в оповещениях на заблокированном экране. Чтобы отключить, перейдите в настройки iOS > Telegram > Уведомления > Показ миниатюр и выберите значение «Без блокировки» или «Никогда»." + }, + "Notifications.DisplayNamesOnLockScreenInfoWithLink": { + "key": "Notifications.DisplayNamesOnLockScreenInfoWithLink", + "value": "Показывать имена в оповещениях на заблокированном экране. Чтобы отключить, убедитесь также, что в [настройках iOS > Уведомления] для опции «Показ миниатюр» выбрано «Без блокировки» или «Никогда»." + }, + "Notifications.ExceptionMuteExpires.Days": { + "key": "Notifications.ExceptionMuteExpires.Days", + "zeroValue": null, + "oneValue": "через %@ день", + "twoValue": null, + "fewValue": "через %@ дня", + "manyValue": "через %@ дней", + "otherValue": "через %@ дней" + }, + "Notifications.ExceptionMuteExpires.Hours": { + "key": "Notifications.ExceptionMuteExpires.Hours", + "zeroValue": null, + "oneValue": "через %@ час", + "twoValue": null, + "fewValue": "через %@ часа", + "manyValue": "через %@ часов", + "otherValue": "через %@ часов" + }, + "Notifications.ExceptionMuteExpires.Minutes": { + "key": "Notifications.ExceptionMuteExpires.Minutes", + "zeroValue": null, + "oneValue": "через %@ минуту", + "twoValue": null, + "fewValue": "через %@ минуты", + "manyValue": "через %@ минут", + "otherValue": "через %@ минут" + }, + "Notifications.Exceptions": { + "key": "Notifications.Exceptions", + "zeroValue": null, + "oneValue": "%@ чат", + "twoValue": null, + "fewValue": "%@ чата", + "manyValue": "%@ чатов", + "otherValue": "%@ чатов" + }, + "Notifications.ExceptionsChangeSound": { + "key": "Notifications.ExceptionsChangeSound", + "value": "Изменить звук (%@)" + }, + "Notifications.ExceptionsDefaultSound": { + "key": "Notifications.ExceptionsDefaultSound", + "value": "По умолчанию" + }, + "Notifications.ExceptionsGroupPlaceholder": { + "key": "Notifications.ExceptionsGroupPlaceholder", + "value": "В этом разделе будут показываться все группы и каналы с особыми настройками уведомлений" + }, + "Notifications.ExceptionsMessagePlaceholder": { + "key": "Notifications.ExceptionsMessagePlaceholder", + "value": "В этом разделе будут показываться все личные чаты с особыми настройками уведомлений" + }, + "Notifications.ExceptionsMuted": { + "key": "Notifications.ExceptionsMuted", + "value": "Без уведомлений" + }, + "Notifications.ExceptionsNone": { + "key": "Notifications.ExceptionsNone", + "value": "Нет" + }, + "Notifications.ExceptionsTitle": { + "key": "Notifications.ExceptionsTitle", + "value": "Исключения" + }, + "Notifications.ExceptionsUnmuted": { + "key": "Notifications.ExceptionsUnmuted", + "value": "Уведомления" + }, + "Notifications.GroupNotifications": { + "key": "Notifications.GroupNotifications", + "value": "УВЕДОМЛЕНИЯ ОТ ЧАТОВ" + }, + "Notifications.GroupNotificationsAlert": { + "key": "Notifications.GroupNotificationsAlert", + "value": "Показывать уведомления" + }, + "Notifications.GroupNotificationsExceptions": { + "key": "Notifications.GroupNotificationsExceptions", + "value": "Исключения" + }, + "Notifications.GroupNotificationsExceptionsHelp": { + "key": "Notifications.GroupNotificationsExceptionsHelp", + "value": "Настройте свои уведомления для отдельных групп." + }, + "Notifications.GroupNotificationsHelp": { + "key": "Notifications.GroupNotificationsHelp", + "value": "Уведомления для отдельных групп можно настроить в их профилях." + }, + "Notifications.GroupNotificationsPreview": { + "key": "Notifications.GroupNotificationsPreview", + "value": "Показывать текст" + }, + "Notifications.GroupNotificationsSound": { + "key": "Notifications.GroupNotificationsSound", + "value": "Звук" + }, + "Notifications.InAppNotifications": { + "key": "Notifications.InAppNotifications", + "value": "УВЕДОМЛЕНИЯ В ПРИЛОЖЕНИИ" + }, + "Notifications.InAppNotificationsPreview": { + "key": "Notifications.InAppNotificationsPreview", + "value": "Показывать текст" + }, + "Notifications.InAppNotificationsSounds": { + "key": "Notifications.InAppNotificationsSounds", + "value": "Звук" + }, + "Notifications.InAppNotificationsVibrate": { + "key": "Notifications.InAppNotificationsVibrate", + "value": "Вибрация" + }, + "Notifications.MessageNotifications": { + "key": "Notifications.MessageNotifications", + "value": "УВЕДОМЛЕНИЯ О СООБЩЕНИЯХ" + }, + "Notifications.MessageNotificationsAlert": { + "key": "Notifications.MessageNotificationsAlert", + "value": "Показывать уведомления" + }, + "Notifications.MessageNotificationsExceptions": { + "key": "Notifications.MessageNotificationsExceptions", + "value": "Исключения" + }, + "Notifications.MessageNotificationsExceptionsHelp": { + "key": "Notifications.MessageNotificationsExceptionsHelp", + "value": "Настройте свои уведомления для отдельных пользователей." + }, + "Notifications.MessageNotificationsHelp": { + "key": "Notifications.MessageNotificationsHelp", + "value": "Уведомления о сообщениях от отдельных пользователей можно настроить в их профилях." + }, + "Notifications.MessageNotificationsPreview": { + "key": "Notifications.MessageNotificationsPreview", + "value": "Показывать текст" + }, + "Notifications.MessageNotificationsSound": { + "key": "Notifications.MessageNotificationsSound", + "value": "Звук" + }, + "Notifications.PermissionsAllow": { + "key": "Notifications.PermissionsAllow", + "value": "Включите уведомления" + }, + "Notifications.PermissionsAllowInSettings": { + "key": "Notifications.PermissionsAllowInSettings", + "value": "Включить в настройках" + }, + "Notifications.PermissionsEnable": { + "key": "Notifications.PermissionsEnable", + "value": "Включить" + }, + "Notifications.PermissionsKeepDisabled": { + "key": "Notifications.PermissionsKeepDisabled", + "value": "Не включать" + }, + "Notifications.PermissionsOpenSettings": { + "key": "Notifications.PermissionsOpenSettings", + "value": "Перейти в настройки" + }, + "Notifications.PermissionsSuppressWarningText": { + "key": "Notifications.PermissionsSuppressWarningText", + "value": "С выбранными настройками Вы можете пропустить важные сообщения в Telegram.\n\nРекомендуем включить уведомления в системных настройках. Отключить их для отдельных чатов или категории чатов можно в настройках Telegram." + }, + "Notifications.PermissionsSuppressWarningTitle": { + "key": "Notifications.PermissionsSuppressWarningTitle", + "value": "Оставить уведомления выключенными?" + }, + "Notifications.PermissionsText": { + "key": "Notifications.PermissionsText", + "value": "Уведомления помогут не пропускать важные сообщения от друзей или коллег." + }, + "Notifications.PermissionsTitle": { + "key": "Notifications.PermissionsTitle", + "value": "Включите уведомления" + }, + "Notifications.PermissionsUnreachableText": { + "key": "Notifications.PermissionsUnreachableText", + "value": "Уведомления частично выключены в системных настройках." + }, + "Notifications.PermissionsUnreachableTitle": { + "key": "Notifications.PermissionsUnreachableTitle", + "value": "Проверьте настройки" + }, + "Notifications.Reset": { + "key": "Notifications.Reset", + "value": "Сбросить" + }, + "Notifications.ResetAllNotifications": { + "key": "Notifications.ResetAllNotifications", + "value": "Сбросить настройки уведомлений" + }, + "Notifications.ResetAllNotificationsHelp": { + "key": "Notifications.ResetAllNotificationsHelp", + "value": "Сбросить особые настройки уведомлений для отдельных контактов, чатов и каналов." + }, + "Notifications.TextTone": { + "key": "Notifications.TextTone", + "value": "Звук" + }, + "Notifications.Title": { + "key": "Notifications.Title", + "value": "Уведомления" + }, + "NotificationsSound.Alert": { + "key": "NotificationsSound.Alert", + "value": "Тревога" + }, + "NotificationsSound.Aurora": { + "key": "NotificationsSound.Aurora", + "value": "Эхо-импульс" + }, + "NotificationsSound.Bamboo": { + "key": "NotificationsSound.Bamboo", + "value": "Бамбук" + }, + "NotificationsSound.Bell": { + "key": "NotificationsSound.Bell", + "value": "Колокольчик" + }, + "NotificationsSound.Calypso": { + "key": "NotificationsSound.Calypso", + "value": "Калипсо" + }, + "NotificationsSound.Chime": { + "key": "NotificationsSound.Chime", + "value": "Металлофон" + }, + "NotificationsSound.Chord": { + "key": "NotificationsSound.Chord", + "value": "Аккорд" + }, + "NotificationsSound.Circles": { + "key": "NotificationsSound.Circles", + "value": "Кольца" + }, + "NotificationsSound.Complete": { + "key": "NotificationsSound.Complete", + "value": "Завершение" + }, + "NotificationsSound.Glass": { + "key": "NotificationsSound.Glass", + "value": "Стекло" + }, + "NotificationsSound.Hello": { + "key": "NotificationsSound.Hello", + "value": "Привет" + }, + "NotificationsSound.Input": { + "key": "NotificationsSound.Input", + "value": "Вход" + }, + "NotificationsSound.Keys": { + "key": "NotificationsSound.Keys", + "value": "Клавиши" + }, + "NotificationsSound.None": { + "key": "NotificationsSound.None", + "value": "Нет" + }, + "NotificationsSound.Note": { + "key": "NotificationsSound.Note", + "value": "Нота" + }, + "NotificationsSound.Popcorn": { + "key": "NotificationsSound.Popcorn", + "value": "Попкорн" + }, + "NotificationsSound.Pulse": { + "key": "NotificationsSound.Pulse", + "value": "Импульс" + }, + "NotificationsSound.Synth": { + "key": "NotificationsSound.Synth", + "value": "Синтезатор" + }, + "NotificationsSound.Telegraph": { + "key": "NotificationsSound.Telegraph", + "value": "Телеграф" + }, + "NotificationsSound.Tremolo": { + "key": "NotificationsSound.Tremolo", + "value": "Тремоло" + }, + "NotificationsSound.Tritone": { + "key": "NotificationsSound.Tritone", + "value": "Трезвучие" + }, + "OldChannels.ChannelFormat": { + "key": "OldChannels.ChannelFormat", + "value": "канал, " + }, + "OldChannels.ChannelsHeader": { + "key": "OldChannels.ChannelsHeader", + "value": "НАИМЕНЕЕ АКТИВНЫЕ" + }, + "OldChannels.GroupEmptyFormat": { + "key": "OldChannels.GroupEmptyFormat", + "value": "группа, " + }, + "OldChannels.GroupFormat": { + "key": "OldChannels.GroupFormat", + "zeroValue": null, + "oneValue": "%@ участник ", + "twoValue": null, + "fewValue": "%@ участника ", + "manyValue": "%@ участников ", + "otherValue": "%@ участников " + }, + "OldChannels.InactiveMonth": { + "key": "OldChannels.InactiveMonth", + "zeroValue": null, + "oneValue": "неактивен %@ месяц", + "twoValue": null, + "fewValue": "неактивен %@ месяца", + "manyValue": "неактивен %@ месяцев", + "otherValue": "неактивен %@ месяцев" + }, + "OldChannels.InactiveWeek": { + "key": "OldChannels.InactiveWeek", + "zeroValue": null, + "oneValue": "неактивен %@ неделю", + "twoValue": null, + "fewValue": "неактивен %@ недели", + "manyValue": "неактивен %@ недель", + "otherValue": "неактивен %@ недель" + }, + "OldChannels.InactiveYear": { + "key": "OldChannels.InactiveYear", + "zeroValue": null, + "oneValue": "неактивен %@ год", + "twoValue": null, + "fewValue": "неактивен %@ года", + "manyValue": "неактивен %@ лет", + "otherValue": "неактивен %@ лет" + }, + "OldChannels.Leave": { + "key": "OldChannels.Leave", + "zeroValue": null, + "oneValue": "Покинуть %@ чат", + "twoValue": null, + "fewValue": "Покинуть %@ чата", + "manyValue": "Покинуть %@ чатов", + "otherValue": "Покинуть %@ чатов" + }, + "OldChannels.NoticeCreateText": { + "key": "OldChannels.NoticeCreateText", + "value": "К сожалению, Вы участвуете в максимальном числе групп и каналов.\nПожалуйста, покиньте какие-то из них, прежде чем создавать новые." + }, + "OldChannels.NoticeText": { + "key": "OldChannels.NoticeText", + "value": "У Вас максимальное число групп и каналов.\nПожалуйста, сперва покиньте какую-нибудь группу или канал." + }, + "OldChannels.NoticeTitle": { + "key": "OldChannels.NoticeTitle", + "value": "Слишком много групп и каналов" + }, + "OldChannels.NoticeUpgradeText": { + "key": "OldChannels.NoticeUpgradeText", + "value": "У Вас максимальное число групп и каналов.\nПо техническим причинам для изменения этой настройки нужно покинуть какую-нибудь группу или канал." + }, + "OldChannels.Title": { + "key": "OldChannels.Title", + "value": "Достигнут лимит" + }, + "OpenFile.PotentiallyDangerousContentAlert": { + "key": "OpenFile.PotentiallyDangerousContentAlert", + "value": "Предпросмотр этого файла может раскрыть Ваш IP-адрес его отправителю. Продолжить?" + }, + "OpenFile.Proceed": { + "key": "OpenFile.Proceed", + "value": "Продолжить" + }, + "OwnershipTransfer.ComeBackLater": { + "key": "OwnershipTransfer.ComeBackLater", + "value": "\n\nПопробуйте позже." + }, + "OwnershipTransfer.SecurityCheck": { + "key": "OwnershipTransfer.SecurityCheck", + "value": "Проверка безопасности" + }, + "OwnershipTransfer.SecurityRequirements": { + "key": "OwnershipTransfer.SecurityRequirements", + "value": "Вы сможете передать права, если:\n\n• Не меньше **7 дней назад** включили двухэтапную аутентификацию.\n\n• Зашли в аккаунт на этом устройстве не меньше **24 часов** назад." + }, + "OwnershipTransfer.SetupTwoStepAuth": { + "key": "OwnershipTransfer.SetupTwoStepAuth", + "value": "Включить двухэтапную аутентификацию" + }, + "OwnershipTransfer.Transfer": { + "key": "OwnershipTransfer.Transfer", + "value": "Передать" + }, + "PHONE_CALL_MISSED": { + "key": "PHONE_CALL_MISSED", + "value": "Вы пропустили звонок от %1$@" + }, + "PHONE_CALL_MISSED_SEPARATED": { + "key": "PHONE_CALL_MISSED_SEPARATED", + "value": "%1$@:|пропущенный звонок" + }, + "PHONE_CALL_REQUEST": { + "key": "PHONE_CALL_REQUEST", + "value": "Вам звонит %1$@" + }, + "PHONE_CALL_REQUEST_SEPARATED": { + "key": "PHONE_CALL_REQUEST_SEPARATED", + "value": "%1$@|звонит Вам!" + }, + "PINNED_AUDIO": { + "key": "PINNED_AUDIO", + "value": "%1$@ закрепил(а) голосовое сообщение" + }, + "PINNED_AUDIO_SEPARATED": { + "key": "PINNED_AUDIO_SEPARATED", + "value": "%1$@|закрепил(а) голосовое сообщение" + }, + "PINNED_CONTACT": { + "key": "PINNED_CONTACT", + "value": "%1$@ закрепил(а) контакт" + }, + "PINNED_CONTACT_SEPARATED": { + "key": "PINNED_CONTACT_SEPARATED", + "value": "%1$@|закрепил(а) контакт" + }, + "PINNED_DOC": { + "key": "PINNED_DOC", + "value": "%1$@ закрепил(а) файл" + }, + "PINNED_DOC_SEPARATED": { + "key": "PINNED_DOC_SEPARATED", + "value": "%1$@|закрепил(а) файл" + }, + "PINNED_GAME": { + "key": "PINNED_GAME", + "value": "%1$@ закрепил(а) игру" + }, + "PINNED_GAME_SEPARATED": { + "key": "PINNED_GAME_SEPARATED", + "value": "%1$@|закрепил(а) игру" + }, + "PINNED_GEO": { + "key": "PINNED_GEO", + "value": "%1$@ закрепил(а) карту" + }, + "PINNED_GEOLIVE": { + "key": "PINNED_GEOLIVE", + "value": "%1$@ закрепил(а) трансляцию геопозиции" + }, + "PINNED_GEOLIVE_SEPARATED": { + "key": "PINNED_GEOLIVE_SEPARATED", + "value": "%1$@|закрепил(а) трансляцию геопозиции" + }, + "PINNED_GEO_SEPARATED": { + "key": "PINNED_GEO_SEPARATED", + "value": "%1$@|закрепил(а) карту" + }, + "PINNED_GIF": { + "key": "PINNED_GIF", + "value": "%1$@ закрепил(а) GIF" + }, + "PINNED_GIF_SEPARATED": { + "key": "PINNED_GIF_SEPARATED", + "value": "%1$@|закрепил(а) GIF" + }, + "PINNED_INVOICE": { + "key": "PINNED_INVOICE", + "value": "%1$@ закрепил(а) счёт" + }, + "PINNED_INVOICE_SEPARATED": { + "key": "PINNED_INVOICE_SEPARATED", + "value": "%1$@|закрепил(а) счёт" + }, + "PINNED_NOTEXT": { + "key": "PINNED_NOTEXT", + "value": "%1$@ закрепил(а) сообщение" + }, + "PINNED_NOTEXT_SEPARATED": { + "key": "PINNED_NOTEXT_SEPARATED", + "value": "%1$@|закрепил(а) сообщение" + }, + "PINNED_PHOTO": { + "key": "PINNED_PHOTO", + "value": "%1$@ закрепил(а) фото" + }, + "PINNED_PHOTO_SEPARATED": { + "key": "PINNED_PHOTO_SEPARATED", + "value": "%1$@|закрепил(а) фотографию" + }, + "PINNED_POLL": { + "key": "PINNED_POLL", + "value": "%1$@ закрепил(а) опрос" + }, + "PINNED_POLL_SEPARATED": { + "key": "PINNED_POLL_SEPARATED", + "value": "%1$@|закрепил(а) опрос" + }, + "PINNED_ROUND": { + "key": "PINNED_ROUND", + "value": "%1$@ закрепил(а) видеосообщение" + }, + "PINNED_ROUND_SEPARATED": { + "key": "PINNED_ROUND_SEPARATED", + "value": "%1$@|закрепил(а) видеосообщение" + }, + "PINNED_STICKER": { + "key": "PINNED_STICKER", + "value": "%1$@ закрепил(а) стикер %2$@" + }, + "PINNED_STICKER_SEPARATED": { + "key": "PINNED_STICKER_SEPARATED", + "value": "%1$@|закрепил(а) стикер %2$@" + }, + "PINNED_TEXT": { + "key": "PINNED_TEXT", + "value": "%1$@ закрепил(а) \"%2$@\"" + }, + "PINNED_TEXT_SEPARATED": { + "key": "PINNED_TEXT_SEPARATED", + "value": "%1$@|закрепил(а) «%2$@»" + }, + "PINNED_VIDEO": { + "key": "PINNED_VIDEO", + "value": "%1$@ закрепил(а) видео" + }, + "PINNED_VIDEO_SEPARATED": { + "key": "PINNED_VIDEO_SEPARATED", + "value": "%1$@|закрепил(а) видео" + }, + "PUSH_ALBUM": { + "key": "PUSH_ALBUM", + "value": "%1$@|📷📹 Альбом" + }, + "PUSH_AUTH_REGION": { + "key": "PUSH_AUTH_REGION", + "value": "Вход в аккаунт|Устройство: %1$@. Место: %2$@" + }, + "PUSH_AUTH_UNKNOWN": { + "key": "PUSH_AUTH_UNKNOWN", + "value": "Вход в аккаунт|с %1$@" + }, + "PUSH_CHANNEL_ALBUM": { + "key": "PUSH_CHANNEL_ALBUM", + "value": "%1$@|📷📹 Альбом" + }, + "PUSH_CHANNEL_MESSAGE": { + "key": "PUSH_CHANNEL_MESSAGE", + "value": "%1$@|Новая публикация" + }, + "PUSH_CHANNEL_MESSAGES": { + "key": "PUSH_CHANNEL_MESSAGES", + "zeroValue": null, + "oneValue": "%1$@|📷 Альбом", + "twoValue": null, + "fewValue": "%1$@|📷 Альбом", + "manyValue": "%1$@|📷 Альбом", + "otherValue": "%1$@|📷 Альбом" + }, + "PUSH_CHANNEL_MESSAGE_AUDIO": { + "key": "PUSH_CHANNEL_MESSAGE_AUDIO", + "value": "%1$@|🎤 Аудиосообщение" + }, + "PUSH_CHANNEL_MESSAGE_CONTACT": { + "key": "PUSH_CHANNEL_MESSAGE_CONTACT", + "value": "%1$@|👤 Контакт %2$@" + }, + "PUSH_CHANNEL_MESSAGE_DOC": { + "key": "PUSH_CHANNEL_MESSAGE_DOC", + "value": "%1$@|📎 Файл" + }, + "PUSH_CHANNEL_MESSAGE_DOCS": { + "key": "PUSH_CHANNEL_MESSAGE_DOCS", + "value": "%1$@|файлы: %2$d" + }, + "PUSH_CHANNEL_MESSAGE_FWD": { + "key": "PUSH_CHANNEL_MESSAGE_FWD", + "value": "%1$@|Пересланное сообщение" + }, + "PUSH_CHANNEL_MESSAGE_FWDS": { + "key": "PUSH_CHANNEL_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%1$@|%2$d пересланное сообщение", + "twoValue": null, + "fewValue": "%1$@|%2$d пересланных сообщения", + "manyValue": "%1$@|%2$d пересланных сообщений", + "otherValue": "%1$@|%2$d пересланных сообщений" + }, + "PUSH_CHANNEL_MESSAGE_GAME": { + "key": "PUSH_CHANNEL_MESSAGE_GAME", + "value": "%1$@|🎮 Приглашение в «%2$@»" + }, + "PUSH_CHANNEL_MESSAGE_GEO": { + "key": "PUSH_CHANNEL_MESSAGE_GEO", + "value": "%1$@|📍Геопозиция" + }, + "PUSH_CHANNEL_MESSAGE_GEOLIVE": { + "key": "PUSH_CHANNEL_MESSAGE_GEOLIVE", + "value": "%1$@|Трансляция геопозиции" + }, + "PUSH_CHANNEL_MESSAGE_GIF": { + "key": "PUSH_CHANNEL_MESSAGE_GIF", + "value": "%1$@|📹 GIF" + }, + "PUSH_CHANNEL_MESSAGE_NOTEXT": { + "key": "PUSH_CHANNEL_MESSAGE_NOTEXT", + "value": "%1$@|Новая публикация" + }, + "PUSH_CHANNEL_MESSAGE_PHOTO": { + "key": "PUSH_CHANNEL_MESSAGE_PHOTO", + "value": "%1$@|📷 Фотография" + }, + "PUSH_CHANNEL_MESSAGE_PHOTOS": { + "key": "PUSH_CHANNEL_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%1$@|📷 %2$d фотография", + "twoValue": null, + "fewValue": "%1$@|📷 %2$d фотографии", + "manyValue": "%1$@|📷 %2$d фотографий", + "otherValue": "%1$@|📷 %2$d фотографий" + }, + "PUSH_CHANNEL_MESSAGE_POLL": { + "key": "PUSH_CHANNEL_MESSAGE_POLL", + "value": "%1$@|📊 Опрос «%2$@»" + }, + "PUSH_CHANNEL_MESSAGE_QUIZ": { + "key": "PUSH_CHANNEL_MESSAGE_QUIZ", + "value": "%1$@|викторина «%2$@»" + }, + "PUSH_CHANNEL_MESSAGE_ROUND": { + "key": "PUSH_CHANNEL_MESSAGE_ROUND", + "value": "%1$@|📺 Видеосообщение" + }, + "PUSH_CHANNEL_MESSAGE_ROUNDS": { + "key": "PUSH_CHANNEL_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%1$@|📺 %2$d видеосообщение", + "twoValue": null, + "fewValue": "%1$@|📺 %2$d видеосообщения", + "manyValue": "%1$@|📺 %2$d видеосообщений", + "otherValue": "%1$@|📺 %2$d видеосообщений" + }, + "PUSH_CHANNEL_MESSAGE_STICKER": { + "key": "PUSH_CHANNEL_MESSAGE_STICKER", + "value": "%1$@|Стикер %2$@" + }, + "PUSH_CHANNEL_MESSAGE_TEXT": { + "key": "PUSH_CHANNEL_MESSAGE_TEXT", + "value": "%1$@|%2$@" + }, + "PUSH_CHANNEL_MESSAGE_VIDEO": { + "key": "PUSH_CHANNEL_MESSAGE_VIDEO", + "value": "%1$@|📹 Видео" + }, + "PUSH_CHANNEL_MESSAGE_VIDEOS": { + "key": "PUSH_CHANNEL_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%1$@|📹 %2$d видео", + "twoValue": null, + "fewValue": "%1$@|📹 %2$d видео", + "manyValue": "%1$@|📹 %2$d видео", + "otherValue": "%1$@|📹 %2$d видео" + }, + "PUSH_CHAT_ADD_MEMBER": { + "key": "PUSH_CHAT_ADD_MEMBER", + "value": "%2$@|%1$@ пригласил(а) %3$@" + }, + "PUSH_CHAT_ADD_YOU": { + "key": "PUSH_CHAT_ADD_YOU", + "value": "%2$@|%1$@ пригласил(а) Вас в группу" + }, + "PUSH_CHAT_ALBUM": { + "key": "PUSH_CHAT_ALBUM", + "value": "%2$@|%1$@: 📷📹 Альбом" + }, + "PUSH_CHAT_CREATED": { + "key": "PUSH_CHAT_CREATED", + "value": "%2$@|%1$@ пригласил(а) Вас в группу" + }, + "PUSH_CHAT_DELETE_MEMBER": { + "key": "PUSH_CHAT_DELETE_MEMBER", + "value": "%2$@|%1$@ удалил(а) %3$@ из группы" + }, + "PUSH_CHAT_DELETE_YOU": { + "key": "PUSH_CHAT_DELETE_YOU", + "value": "%2$@|%1$@ удалил(а) Вас из группы" + }, + "PUSH_CHAT_JOINED": { + "key": "PUSH_CHAT_JOINED", + "value": "%2$@|%1$@ теперь в группе" + }, + "PUSH_CHAT_LEFT": { + "key": "PUSH_CHAT_LEFT", + "value": "%2$@|%1$@ больше не в группе" + }, + "PUSH_CHAT_MESSAGE": { + "key": "PUSH_CHAT_MESSAGE", + "value": "%2$@|%1$@: Сообщение" + }, + "PUSH_CHAT_MESSAGES": { + "key": "PUSH_CHAT_MESSAGES", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📷 Альбом", + "twoValue": null, + "fewValue": "%2$@|%1$@: 📷 Альбом", + "manyValue": "%2$@|%1$@: 📷 Альбом", + "otherValue": "%2$@|%1$@: 📷 Альбом" + }, + "PUSH_CHAT_MESSAGE_AUDIO": { + "key": "PUSH_CHAT_MESSAGE_AUDIO", + "value": "%2$@|%1$@: 🎤 Аудиосообщение" + }, + "PUSH_CHAT_MESSAGE_CONTACT": { + "key": "PUSH_CHAT_MESSAGE_CONTACT", + "value": "%2$@|%1$@: 👤 Контакт %3$@" + }, + "PUSH_CHAT_MESSAGE_DOC": { + "key": "PUSH_CHAT_MESSAGE_DOC", + "value": "%2$@|%1$@: 📎 Файл" + }, + "PUSH_CHAT_MESSAGE_DOCS": { + "key": "PUSH_CHAT_MESSAGE_DOCS", + "value": "%2$@|файлы от %1$@: %3$d" + }, + "PUSH_CHAT_MESSAGE_DOCS_FIX1": { + "key": "PUSH_CHAT_MESSAGE_DOCS_FIX1", + "zeroValue": null, + "oneValue": "%2$@|%3$d файл от %1$@", + "twoValue": null, + "fewValue": "%2$@|%3$d файла от %1$@", + "manyValue": "%2$@|%3$d файлов от %1$@", + "otherValue": "%2$@|%3$d файла от %1$@" + }, + "PUSH_CHAT_MESSAGE_FWD": { + "key": "PUSH_CHAT_MESSAGE_FWD", + "value": "%2$@|Пересланное сообщение от %1$@" + }, + "PUSH_CHAT_MESSAGE_FWDS": { + "key": "PUSH_CHAT_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: %3$d пересланное сообщение", + "twoValue": null, + "fewValue": "%2$@|%1$@: %3$d пересланных сообщения", + "manyValue": "%2$@|%1$@: %3$d пересланных сообщений", + "otherValue": "%2$@|%1$@: %3$d пересланных сообщений" + }, + "PUSH_CHAT_MESSAGE_GAME": { + "key": "PUSH_CHAT_MESSAGE_GAME", + "value": "%2$@|🎮 %1$@ приглашает сыграть в «%3$@»" + }, + "PUSH_CHAT_MESSAGE_GAME_SCORE": { + "key": "PUSH_CHAT_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ набрал(а) %4$@ очков в «%3$@»" + }, + "PUSH_CHAT_MESSAGE_GEO": { + "key": "PUSH_CHAT_MESSAGE_GEO", + "value": "%2$@|%1$@:📍Геопозиция" + }, + "PUSH_CHAT_MESSAGE_GEOLIVE": { + "key": "PUSH_CHAT_MESSAGE_GEOLIVE", + "value": "%2$@|%1$@: Трансляция геопозиции" + }, + "PUSH_CHAT_MESSAGE_GIF": { + "key": "PUSH_CHAT_MESSAGE_GIF", + "value": "%2$@|%1$@: 📹 GIF" + }, + "PUSH_CHAT_MESSAGE_INVOICE": { + "key": "PUSH_CHAT_MESSAGE_INVOICE", + "value": "%2$@|%1$@: Счёт на %3$@" + }, + "PUSH_CHAT_MESSAGE_NOTEXT": { + "key": "PUSH_CHAT_MESSAGE_NOTEXT", + "value": "%2$@|%1$@: Сообщение" + }, + "PUSH_CHAT_MESSAGE_PHOTO": { + "key": "PUSH_CHAT_MESSAGE_PHOTO", + "value": "%2$@|%1$@: 📷 Фотография" + }, + "PUSH_CHAT_MESSAGE_PHOTOS": { + "key": "PUSH_CHAT_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📷 %3$d фото", + "twoValue": null, + "fewValue": "%2$@|%1$@: 📷 %3$d фото", + "manyValue": "%2$@|%1$@: 📷 %3$d фото", + "otherValue": "%2$@|%1$@: 📷 %3$d фото" + }, + "PUSH_CHAT_MESSAGE_POLL": { + "key": "PUSH_CHAT_MESSAGE_POLL", + "value": "%2$@|%1$@: 📊 Опрос «%3$@»" + }, + "PUSH_CHAT_MESSAGE_QUIZ": { + "key": "PUSH_CHAT_MESSAGE_QUIZ", + "value": "%2$@|Викторина «%3$@» от %1$@" + }, + "PUSH_CHAT_MESSAGE_ROUND": { + "key": "PUSH_CHAT_MESSAGE_ROUND", + "value": "%2$@|%1$@: 📺 Видеосообщение" + }, + "PUSH_CHAT_MESSAGE_ROUNDS": { + "key": "PUSH_CHAT_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📺 %3$d видеосообщение", + "twoValue": null, + "fewValue": "%2$@|%1$@: 📺 %3$d видеосообщения", + "manyValue": "%2$@|%1$@: 📺 %3$d видеосообщений", + "otherValue": "%2$@|%1$@: 📺 %3$d видеосообщений" + }, + "PUSH_CHAT_MESSAGE_STICKER": { + "key": "PUSH_CHAT_MESSAGE_STICKER", + "value": "%2$@|%1$@: Стикер %3$@" + }, + "PUSH_CHAT_MESSAGE_TEXT": { + "key": "PUSH_CHAT_MESSAGE_TEXT", + "value": "%2$@|%1$@: %3$@" + }, + "PUSH_CHAT_MESSAGE_VIDEO": { + "key": "PUSH_CHAT_MESSAGE_VIDEO", + "value": "%2$@|%1$@: 📹 Видео" + }, + "PUSH_CHAT_MESSAGE_VIDEOS": { + "key": "PUSH_CHAT_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%2$@|%1$@: 📹 %3$d видео", + "twoValue": null, + "fewValue": "%2$@|%1$@: 📹 %3$d видео", + "manyValue": "%2$@|%1$@: 📹 %3$d видео", + "otherValue": "%2$@|%1$@: 📹 %3$d видео" + }, + "PUSH_CHAT_PHOTO_EDITED": { + "key": "PUSH_CHAT_PHOTO_EDITED", + "value": "%2$@|%1$@ изменил(а) фото группы" + }, + "PUSH_CHAT_RETURNED": { + "key": "PUSH_CHAT_RETURNED", + "value": "%2$@|%1$@ снова в группе" + }, + "PUSH_CHAT_TITLE_EDITED": { + "key": "PUSH_CHAT_TITLE_EDITED", + "value": "%2$@|%1$@ переименовал(а) группу" + }, + "PUSH_CHAT_VOICECHAT_INVITE": { + "key": "PUSH_CHAT_VOICECHAT_INVITE", + "value": "%2$@|%1$@ пригласил(а) %3$@ в голосовой чат" + }, + "PUSH_CHAT_VOICECHAT_INVITE_YOU": { + "key": "PUSH_CHAT_VOICECHAT_INVITE_YOU", + "value": "%2$@|%1$@ пригласил(а) Вас в голосовой чат" + }, + "PUSH_CHAT_VOICECHAT_START": { + "key": "PUSH_CHAT_VOICECHAT_START", + "value": "%2$@|%1$@ начал(а) голосовой чат" + }, + "PUSH_CONTACT_JOINED": { + "key": "PUSH_CONTACT_JOINED", + "value": "%1$@|теперь в Telegram!" + }, + "PUSH_ENCRYPTED_MESSAGE": { + "key": "PUSH_ENCRYPTED_MESSAGE", + "value": "Новое сообщение%1$@" + }, + "PUSH_ENCRYPTION_ACCEPT": { + "key": "PUSH_ENCRYPTION_ACCEPT", + "value": "Запрос на секретный чат принят%1$@" + }, + "PUSH_ENCRYPTION_REQUEST": { + "key": "PUSH_ENCRYPTION_REQUEST", + "value": "Новый секретный чат%1$@" + }, + "PUSH_LOCKED_MESSAGE": { + "key": "PUSH_LOCKED_MESSAGE", + "value": "Новое сообщение%1$@" + }, + "PUSH_MESSAGE": { + "key": "PUSH_MESSAGE", + "value": "%1$@|Новое сообщение" + }, + "PUSH_MESSAGES": { + "key": "PUSH_MESSAGES", + "zeroValue": null, + "oneValue": "%1$@|📷📹 Альбом", + "twoValue": null, + "fewValue": "%1$@|📷📹 Альбом", + "manyValue": "%1$@|📷📹 Альбом", + "otherValue": "%1$@|📷📹 Альбом" + }, + "PUSH_MESSAGE_ALBUM": { + "key": "PUSH_MESSAGE_ALBUM", + "value": "%1$@|📷 Альбом" + }, + "PUSH_MESSAGE_AUDIO": { + "key": "PUSH_MESSAGE_AUDIO", + "value": "%1$@|🎤 Аудиосообщение" + }, + "PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE": { + "key": "PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ набрал(а) %3$@ очков в «%2$@»" + }, + "PUSH_MESSAGE_CONTACT": { + "key": "PUSH_MESSAGE_CONTACT", + "value": "%1$@|👤 Контакт %2$@" + }, + "PUSH_MESSAGE_DOC": { + "key": "PUSH_MESSAGE_DOC", + "value": "%1$@|📎 Файл" + }, + "PUSH_MESSAGE_DOCS": { + "key": "PUSH_MESSAGE_DOCS", + "value": "%1$@|файлы: %2$d" + }, + "PUSH_MESSAGE_FWD": { + "key": "PUSH_MESSAGE_FWD", + "value": "%1$@|Пересланное сообщение" + }, + "PUSH_MESSAGE_FWDS": { + "key": "PUSH_MESSAGE_FWDS", + "zeroValue": null, + "oneValue": "%1$@|%2$d пересланное сообщение", + "twoValue": null, + "fewValue": "%1$@|%2$d пересланных сообщения", + "manyValue": "%1$@|%2$d пересланных сообщений", + "otherValue": "%1$@|%2$d пересланных сообщений" + }, + "PUSH_MESSAGE_GAME": { + "key": "PUSH_MESSAGE_GAME", + "value": "%1$@|🎮 Приглашение в «%2$@»" + }, + "PUSH_MESSAGE_GAME_SCORE": { + "key": "PUSH_MESSAGE_GAME_SCORE", + "value": "🎮 %1$@ набрал(а) %3$@ очков в «%2$@»" + }, + "PUSH_MESSAGE_GEO": { + "key": "PUSH_MESSAGE_GEO", + "value": "%1$@|📍Геопозиция" + }, + "PUSH_MESSAGE_GEOLIVE": { + "key": "PUSH_MESSAGE_GEOLIVE", + "value": "%1$@|Трансляция геопозиции" + }, + "PUSH_MESSAGE_GIF": { + "key": "PUSH_MESSAGE_GIF", + "value": "%1$@|📹 GIF" + }, + "PUSH_MESSAGE_INVOICE": { + "key": "PUSH_MESSAGE_INVOICE", + "value": "%1$@|Счёт на %2$@" + }, + "PUSH_MESSAGE_NOTEXT": { + "key": "PUSH_MESSAGE_NOTEXT", + "value": "%1$@|Новое сообщение" + }, + "PUSH_MESSAGE_PHOTO": { + "key": "PUSH_MESSAGE_PHOTO", + "value": "%1$@|📷 Фотография" + }, + "PUSH_MESSAGE_PHOTOS": { + "key": "PUSH_MESSAGE_PHOTOS", + "zeroValue": null, + "oneValue": "%1$@|📷 %2$d фотография", + "twoValue": null, + "fewValue": "%1$@|📷 %2$d фотографии", + "manyValue": "%1$@|📷 %2$d фотографий", + "otherValue": "%1$@|📷 %2$d фотографий" + }, + "PUSH_MESSAGE_PHOTO_SECRET": { + "key": "PUSH_MESSAGE_PHOTO_SECRET", + "value": "%1$@|🔥 Самоуничтожающееся фото" + }, + "PUSH_MESSAGE_POLL": { + "key": "PUSH_MESSAGE_POLL", + "value": "%1$@|📊 Опрос «%2$@»" + }, + "PUSH_MESSAGE_QUIZ": { + "key": "PUSH_MESSAGE_QUIZ", + "value": "%1$@|Викторина «%2$@»" + }, + "PUSH_MESSAGE_ROUND": { + "key": "PUSH_MESSAGE_ROUND", + "value": "%1$@|📺 Видеосообщение" + }, + "PUSH_MESSAGE_ROUNDS": { + "key": "PUSH_MESSAGE_ROUNDS", + "zeroValue": null, + "oneValue": "%1$@|📺 %2$d видеосообщение", + "twoValue": null, + "fewValue": "%1$@|📺 %2$d видеосообщения", + "manyValue": "%1$@|📺 %2$d видеосообщений", + "otherValue": "%1$@|📺 %2$d видеосообщений" + }, + "PUSH_MESSAGE_SCREENSHOT": { + "key": "PUSH_MESSAGE_SCREENSHOT", + "value": "%1$@|сделал(а) скриншот!" + }, + "PUSH_MESSAGE_STICKER": { + "key": "PUSH_MESSAGE_STICKER", + "value": "%1$@|Стикер %2$@" + }, + "PUSH_MESSAGE_TEXT": { + "key": "PUSH_MESSAGE_TEXT", + "value": "%1$@|%2$@" + }, + "PUSH_MESSAGE_VIDEO": { + "key": "PUSH_MESSAGE_VIDEO", + "value": "%1$@|📹 Видео" + }, + "PUSH_MESSAGE_VIDEOS": { + "key": "PUSH_MESSAGE_VIDEOS", + "zeroValue": null, + "oneValue": "%1$@|📹 %2$d видео", + "twoValue": null, + "fewValue": "%1$@|📹 %2$d видео", + "manyValue": "%1$@|📹 %2$d видео", + "otherValue": "%1$@|📹 %2$d видео" + }, + "PUSH_MESSAGE_VIDEO_SECRET": { + "key": "PUSH_MESSAGE_VIDEO_SECRET", + "value": "%1$@|🔥 Самоуничтожающееся видео" + }, + "PUSH_PHONE_CALL_MISSED": { + "key": "PUSH_PHONE_CALL_MISSED", + "value": "%1$@|☎️ Пропущенный звонок" + }, + "PUSH_PHONE_CALL_REQUEST": { + "key": "PUSH_PHONE_CALL_REQUEST", + "value": "%1$@|Звонит Вам!" + }, + "PUSH_PINNED_AUDIO": { + "key": "PUSH_PINNED_AUDIO", + "value": "%1$@|📌 Закрепил(а) аудиосообщение" + }, + "PUSH_PINNED_CONTACT": { + "key": "PUSH_PINNED_CONTACT", + "value": "%1$@|📌 Закрепил(а) контакт %2$@" + }, + "PUSH_PINNED_DOC": { + "key": "PUSH_PINNED_DOC", + "value": "%1$@|📌 Закрепил(а) файл" + }, + "PUSH_PINNED_GAME": { + "key": "PUSH_PINNED_GAME", + "value": "%1$@|📌 Закрепил(а) игру" + }, + "PUSH_PINNED_GAME_SCORE": { + "key": "PUSH_PINNED_GAME_SCORE", + "value": "%1$@ закрепил(а) результаты игры" + }, + "PUSH_PINNED_GEO": { + "key": "PUSH_PINNED_GEO", + "value": "%1$@|📌 Закрепил(а) геопозицию" + }, + "PUSH_PINNED_GEOLIVE": { + "key": "PUSH_PINNED_GEOLIVE", + "value": "%1$@|📌 Закрепил(а) трансляцию геопозиции" + }, + "PUSH_PINNED_GIF": { + "key": "PUSH_PINNED_GIF", + "value": "%1$@|📌 Закрепил(а) GIF" + }, + "PUSH_PINNED_INVOICE": { + "key": "PUSH_PINNED_INVOICE", + "value": "%1$@|📌 Закрепил(а) счёт" + }, + "PUSH_PINNED_NOTEXT": { + "key": "PUSH_PINNED_NOTEXT", + "value": "%1$@|📌 Закрепил(а) сообщение" + }, + "PUSH_PINNED_PHOTO": { + "key": "PUSH_PINNED_PHOTO", + "value": "%1$@|📌 Закрепил(а) фото" + }, + "PUSH_PINNED_POLL": { + "key": "PUSH_PINNED_POLL", + "value": "%1$@|📌 Закрепил(а) опрос" + }, + "PUSH_PINNED_QUIZ": { + "key": "PUSH_PINNED_QUIZ", + "value": "%1$@|закрепил(а) викторину" + }, + "PUSH_PINNED_ROUND": { + "key": "PUSH_PINNED_ROUND", + "value": "%1$@|📌 Закрепил(а) видеосообщение" + }, + "PUSH_PINNED_STICKER": { + "key": "PUSH_PINNED_STICKER", + "value": "%1$@|📌 Закрепил(а) стикер %2$@" + }, + "PUSH_PINNED_TEXT": { + "key": "PUSH_PINNED_TEXT", + "value": "%1$@|📌 Закрепил(а) «%2$@»" + }, + "PUSH_PINNED_VIDEO": { + "key": "PUSH_PINNED_VIDEO", + "value": "%1$@|📌 Закрепил(а) видео" + }, + "PUSH_REMINDER_TITLE": { + "key": "PUSH_REMINDER_TITLE", + "value": "🗓 Напоминание" + }, + "PUSH_SENDER_YOU": { + "key": "PUSH_SENDER_YOU", + "value": "📅 Вы" + }, + "PUSH_VIDEO_CALL_MISSED": { + "key": "PUSH_VIDEO_CALL_MISSED", + "value": "%1$@:|пропущенный видеозвонок" + }, + "PUSH_VIDEO_CALL_REQUEST": { + "key": "PUSH_VIDEO_CALL_REQUEST", + "value": "%1$@|звонит Вам!" + }, + "Paint.Arrow": { + "key": "Paint.Arrow", + "value": "Стрелка" + }, + "Paint.Clear": { + "key": "Paint.Clear", + "value": "Очистить всё" + }, + "Paint.ClearConfirm": { + "key": "Paint.ClearConfirm", + "value": "Очистить рисунок" + }, + "Paint.Delete": { + "key": "Paint.Delete", + "value": "Удалить" + }, + "Paint.Duplicate": { + "key": "Paint.Duplicate", + "value": "Дублировать" + }, + "Paint.Edit": { + "key": "Paint.Edit", + "value": "Редактировать" + }, + "Paint.Framed": { + "key": "Paint.Framed", + "value": "С фоном" + }, + "Paint.Marker": { + "key": "Paint.Marker", + "value": "Маркер" + }, + "Paint.Masks": { + "key": "Paint.Masks", + "value": "Маски" + }, + "Paint.Neon": { + "key": "Paint.Neon", + "value": "Неон" + }, + "Paint.Outlined": { + "key": "Paint.Outlined", + "value": "Контур" + }, + "Paint.Pen": { + "key": "Paint.Pen", + "value": "Ручка" + }, + "Paint.RecentStickers": { + "key": "Paint.RecentStickers", + "value": "Недавнее" + }, + "Paint.Regular": { + "key": "Paint.Regular", + "value": "Обычный" + }, + "Paint.Stickers": { + "key": "Paint.Stickers", + "value": "Стикеры" + }, + "Passcode.AppLockedAlert": { + "key": "Passcode.AppLockedAlert", + "value": "Приложение\nзаблокировано" + }, + "PasscodeSettings.4DigitCode": { + "key": "PasscodeSettings.4DigitCode", + "value": "4-х значный код" + }, + "PasscodeSettings.6DigitCode": { + "key": "PasscodeSettings.6DigitCode", + "value": "6-ти значный код" + }, + "PasscodeSettings.AlphanumericCode": { + "key": "PasscodeSettings.AlphanumericCode", + "value": "Пароль из чисел и букв" + }, + "PasscodeSettings.AutoLock": { + "key": "PasscodeSettings.AutoLock", + "value": "Автоблокировка" + }, + "PasscodeSettings.AutoLock.Disabled": { + "key": "PasscodeSettings.AutoLock.Disabled", + "value": "Выключена" + }, + "PasscodeSettings.AutoLock.IfAwayFor_1hour": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_1hour", + "value": "Через один час" + }, + "PasscodeSettings.AutoLock.IfAwayFor_1minute": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_1minute", + "value": "Через 1 минуту" + }, + "PasscodeSettings.AutoLock.IfAwayFor_5hours": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_5hours", + "value": "Через 5 часов" + }, + "PasscodeSettings.AutoLock.IfAwayFor_5minutes": { + "key": "PasscodeSettings.AutoLock.IfAwayFor_5minutes", + "value": "Через 5 минут" + }, + "PasscodeSettings.ChangePasscode": { + "key": "PasscodeSettings.ChangePasscode", + "value": "Изменить код-пароль" + }, + "PasscodeSettings.DoNotMatch": { + "key": "PasscodeSettings.DoNotMatch", + "value": "Пароли не совпадают. Повторите попытку." + }, + "PasscodeSettings.EncryptData": { + "key": "PasscodeSettings.EncryptData", + "value": "Шифровать локальные данные" + }, + "PasscodeSettings.EncryptDataHelp": { + "key": "PasscodeSettings.EncryptDataHelp", + "value": "Осторожно, экспериментальная функция! Ваши данные, хранящиеся на устройстве, будут зашифрованы, используя производную от вашего кода доступа в качестве ключа." + }, + "PasscodeSettings.FailedAttempts": { + "key": "PasscodeSettings.FailedAttempts", + "zeroValue": null, + "oneValue": "%@ неудачная попытка входа", + "twoValue": null, + "fewValue": "%@ неудачные попытки входа", + "manyValue": "%@ неудачных попыток входа", + "otherValue": "Неудачных попыток входа: %@" + }, + "PasscodeSettings.Help": { + "key": "PasscodeSettings.Help", + "value": "После установки кода-пароля в списке чатов появится иконка замка для блокировки и разблокировки приложения.\n\nВажно: если Вы забудете код доступа, Вам придётся переустанавливать приложение и все секретные чаты будут утеряны." + }, + "PasscodeSettings.HelpBottom": { + "key": "PasscodeSettings.HelpBottom", + "value": "Важно: если Вы забудете код-пароль, Вам придётся переустанавливать приложение, и все секретные чаты будут утеряны." + }, + "PasscodeSettings.HelpTop": { + "key": "PasscodeSettings.HelpTop", + "value": "После установки кода-пароля в списке чатов появится значок замка для блокировки и разблокировки приложения." + }, + "PasscodeSettings.PasscodeOptions": { + "key": "PasscodeSettings.PasscodeOptions", + "value": "Виды кода-пароля" + }, + "PasscodeSettings.SimplePasscode": { + "key": "PasscodeSettings.SimplePasscode", + "value": "Простой код-пароль" + }, + "PasscodeSettings.SimplePasscodeHelp": { + "key": "PasscodeSettings.SimplePasscodeHelp", + "value": "Простой код-пароль — это 4-значное число." + }, + "PasscodeSettings.Title": { + "key": "PasscodeSettings.Title", + "value": "Код-пароль" + }, + "PasscodeSettings.TryAgainIn1Minute": { + "key": "PasscodeSettings.TryAgainIn1Minute", + "value": "Повторите попытку через минуту" + }, + "PasscodeSettings.TurnPasscodeOff": { + "key": "PasscodeSettings.TurnPasscodeOff", + "value": "Отключить код-пароль" + }, + "PasscodeSettings.TurnPasscodeOn": { + "key": "PasscodeSettings.TurnPasscodeOn", + "value": "Включить код-пароль" + }, + "PasscodeSettings.UnlockWithFaceId": { + "key": "PasscodeSettings.UnlockWithFaceId", + "value": "Разблокировка по Face ID" + }, + "PasscodeSettings.UnlockWithTouchId": { + "key": "PasscodeSettings.UnlockWithTouchId", + "value": "Разблокировка по Touch ID" + }, + "Passport.AcceptHelp": { + "key": "Passport.AcceptHelp", + "value": "Вы отправите документы напрямую %1$@ и разрешите их боту %2$@ писать Вам сообщения." + }, + "Passport.Address.AddBankStatement": { + "key": "Passport.Address.AddBankStatement", + "value": "Добавить справку из банка" + }, + "Passport.Address.AddPassportRegistration": { + "key": "Passport.Address.AddPassportRegistration", + "value": "Добавить прописку" + }, + "Passport.Address.AddRentalAgreement": { + "key": "Passport.Address.AddRentalAgreement", + "value": "Добавить договор об аренде" + }, + "Passport.Address.AddResidentialAddress": { + "key": "Passport.Address.AddResidentialAddress", + "value": "Указать адрес проживания" + }, + "Passport.Address.AddTemporaryRegistration": { + "key": "Passport.Address.AddTemporaryRegistration", + "value": "Добавить временную прописку" + }, + "Passport.Address.AddUtilityBill": { + "key": "Passport.Address.AddUtilityBill", + "value": "Добавить коммунальный счёт" + }, + "Passport.Address.Address": { + "key": "Passport.Address.Address", + "value": "АДРЕС" + }, + "Passport.Address.City": { + "key": "Passport.Address.City", + "value": "Город" + }, + "Passport.Address.CityPlaceholder": { + "key": "Passport.Address.CityPlaceholder", + "value": "Город" + }, + "Passport.Address.Country": { + "key": "Passport.Address.Country", + "value": "Страна" + }, + "Passport.Address.CountryPlaceholder": { + "key": "Passport.Address.CountryPlaceholder", + "value": "Страна" + }, + "Passport.Address.EditBankStatement": { + "key": "Passport.Address.EditBankStatement", + "value": "Изменить справку из банка" + }, + "Passport.Address.EditPassportRegistration": { + "key": "Passport.Address.EditPassportRegistration", + "value": "Изменить прописку" + }, + "Passport.Address.EditRentalAgreement": { + "key": "Passport.Address.EditRentalAgreement", + "value": "Изменить договор об аренде" + }, + "Passport.Address.EditResidentialAddress": { + "key": "Passport.Address.EditResidentialAddress", + "value": "Изменить адрес проживания" + }, + "Passport.Address.EditTemporaryRegistration": { + "key": "Passport.Address.EditTemporaryRegistration", + "value": "Изменить временную прописку" + }, + "Passport.Address.EditUtilityBill": { + "key": "Passport.Address.EditUtilityBill", + "value": "Изменить коммунальный счёт" + }, + "Passport.Address.OneOfTypeBankStatement": { + "key": "Passport.Address.OneOfTypeBankStatement", + "value": "справки из банка" + }, + "Passport.Address.OneOfTypePassportRegistration": { + "key": "Passport.Address.OneOfTypePassportRegistration", + "value": "прописки" + }, + "Passport.Address.OneOfTypeRentalAgreement": { + "key": "Passport.Address.OneOfTypeRentalAgreement", + "value": "договора об аренде" + }, + "Passport.Address.OneOfTypeTemporaryRegistration": { + "key": "Passport.Address.OneOfTypeTemporaryRegistration", + "value": "временной прописки" + }, + "Passport.Address.OneOfTypeUtilityBill": { + "key": "Passport.Address.OneOfTypeUtilityBill", + "value": "коммунального счёта" + }, + "Passport.Address.Postcode": { + "key": "Passport.Address.Postcode", + "value": "Индекс" + }, + "Passport.Address.PostcodePlaceholder": { + "key": "Passport.Address.PostcodePlaceholder", + "value": "Индекс" + }, + "Passport.Address.Region": { + "key": "Passport.Address.Region", + "value": "Регион" + }, + "Passport.Address.RegionPlaceholder": { + "key": "Passport.Address.RegionPlaceholder", + "value": "Штат / Область / Регион" + }, + "Passport.Address.ScansHelp": { + "key": "Passport.Address.ScansHelp", + "value": "В документе должны быть Ваши имя и фамилия, адрес, подтверждение (печать, штрих-код, QR-код или фирменный знак), а также дата выдачи, не менее трех месяцев назад" + }, + "Passport.Address.Street": { + "key": "Passport.Address.Street", + "value": "Улица" + }, + "Passport.Address.Street1Placeholder": { + "key": "Passport.Address.Street1Placeholder", + "value": "Улица, дом, а/я" + }, + "Passport.Address.Street2Placeholder": { + "key": "Passport.Address.Street2Placeholder", + "value": "Кв., корпус, этаж" + }, + "Passport.Address.TypeBankStatement": { + "key": "Passport.Address.TypeBankStatement", + "value": "Справка из банка" + }, + "Passport.Address.TypeBankStatementUploadScan": { + "key": "Passport.Address.TypeBankStatementUploadScan", + "value": "Загрузите скан справки из банка" + }, + "Passport.Address.TypePassportRegistration": { + "key": "Passport.Address.TypePassportRegistration", + "value": "Прописка" + }, + "Passport.Address.TypePassportRegistrationUploadScan": { + "key": "Passport.Address.TypePassportRegistrationUploadScan", + "value": "Загрузите скан страницы паспорта с пропиской" + }, + "Passport.Address.TypeRentalAgreement": { + "key": "Passport.Address.TypeRentalAgreement", + "value": "Договор об аренде" + }, + "Passport.Address.TypeRentalAgreementUploadScan": { + "key": "Passport.Address.TypeRentalAgreementUploadScan", + "value": "Загрузите скан договора об аренде." + }, + "Passport.Address.TypeResidentialAddress": { + "key": "Passport.Address.TypeResidentialAddress", + "value": "Адрес проживания" + }, + "Passport.Address.TypeTemporaryRegistration": { + "key": "Passport.Address.TypeTemporaryRegistration", + "value": "Временная прописка" + }, + "Passport.Address.TypeTemporaryRegistrationUploadScan": { + "key": "Passport.Address.TypeTemporaryRegistrationUploadScan", + "value": "Загрузите скан временной прописки" + }, + "Passport.Address.TypeUtilityBill": { + "key": "Passport.Address.TypeUtilityBill", + "value": "Коммунальный счёт" + }, + "Passport.Address.TypeUtilityBillUploadScan": { + "key": "Passport.Address.TypeUtilityBillUploadScan", + "value": "Загрузите скан коммунального счёта" + }, + "Passport.Address.UploadOneOfScan": { + "key": "Passport.Address.UploadOneOfScan", + "value": "Загрузите скан %@" + }, + "Passport.Authorize": { + "key": "Passport.Authorize", + "value": "Авторизоваться" + }, + "Passport.CorrectErrors": { + "key": "Passport.CorrectErrors", + "value": "Нажмите, чтобы внести исправления" + }, + "Passport.DeleteAddress": { + "key": "Passport.DeleteAddress", + "value": "Удалить адрес" + }, + "Passport.DeleteAddressConfirmation": { + "key": "Passport.DeleteAddressConfirmation", + "value": "Вы точно хотите удалить адрес?" + }, + "Passport.DeleteDocument": { + "key": "Passport.DeleteDocument", + "value": "Удалить документ" + }, + "Passport.DeleteDocumentConfirmation": { + "key": "Passport.DeleteDocumentConfirmation", + "value": "Вы точно хотите удалить этот документ? Вся информация будет потеряна." + }, + "Passport.DeletePassport": { + "key": "Passport.DeletePassport", + "value": "Удалить Telegram Passport" + }, + "Passport.DeletePassportConfirmation": { + "key": "Passport.DeletePassportConfirmation", + "value": "Вы точно хотите удалить Telegram Passport? Вся информация будет потеряна." + }, + "Passport.DeletePersonalDetails": { + "key": "Passport.DeletePersonalDetails", + "value": "Удалить личную информацию" + }, + "Passport.DeletePersonalDetailsConfirmation": { + "key": "Passport.DeletePersonalDetailsConfirmation", + "value": "Вы точно хотите удалить личную информацию?" + }, + "Passport.DiscardMessageAction": { + "key": "Passport.DiscardMessageAction", + "value": "Сбросить" + }, + "Passport.DiscardMessageDescription": { + "key": "Passport.DiscardMessageDescription", + "value": "Вы точно хотите сбросить все изменения?" + }, + "Passport.DiscardMessageTitle": { + "key": "Passport.DiscardMessageTitle", + "value": "Сбросить изменения" + }, + "Passport.Email.CodeHelp": { + "key": "Passport.Email.CodeHelp", + "value": "Введите код подтверждения, который был только что отправлен на %@" + }, + "Passport.Email.Delete": { + "key": "Passport.Email.Delete", + "value": "Удалить электронную почту" + }, + "Passport.Email.EmailPlaceholder": { + "key": "Passport.Email.EmailPlaceholder", + "value": "Укажите электронную почту" + }, + "Passport.Email.EnterOtherEmail": { + "key": "Passport.Email.EnterOtherEmail", + "value": "ИЛИ УКАЖИТЕ НОВЫЙ АДРЕС" + }, + "Passport.Email.Help": { + "key": "Passport.Email.Help", + "value": "На указанную Вами почту придет код подтверждения." + }, + "Passport.Email.Title": { + "key": "Passport.Email.Title", + "value": "Email" + }, + "Passport.Email.UseTelegramEmail": { + "key": "Passport.Email.UseTelegramEmail", + "value": "Использовать %@" + }, + "Passport.Email.UseTelegramEmailHelp": { + "key": "Passport.Email.UseTelegramEmailHelp", + "value": "Используйте тот же адрес, что и в Telegram" + }, + "Passport.FieldAddress": { + "key": "Passport.FieldAddress", + "value": "Адрес проживания" + }, + "Passport.FieldAddressHelp": { + "key": "Passport.FieldAddressHelp", + "value": "Укажите свой адрес" + }, + "Passport.FieldAddressTranslationHelp": { + "key": "Passport.FieldAddressTranslationHelp", + "value": "Загрузите перевод документа" + }, + "Passport.FieldAddressUploadHelp": { + "key": "Passport.FieldAddressUploadHelp", + "value": "Загрузите подтверждение адреса" + }, + "Passport.FieldEmail": { + "key": "Passport.FieldEmail", + "value": "Электронная почта" + }, + "Passport.FieldEmailHelp": { + "key": "Passport.FieldEmailHelp", + "value": "Укажите адрес электронной почты" + }, + "Passport.FieldIdentity": { + "key": "Passport.FieldIdentity", + "value": "Удостоверение личности" + }, + "Passport.FieldIdentityDetailsHelp": { + "key": "Passport.FieldIdentityDetailsHelp", + "value": "Укажите данные о себе" + }, + "Passport.FieldIdentitySelfieHelp": { + "key": "Passport.FieldIdentitySelfieHelp", + "value": "Сделайте селфи со своим документом" + }, + "Passport.FieldIdentityTranslationHelp": { + "key": "Passport.FieldIdentityTranslationHelp", + "value": "Загрузите перевод документа" + }, + "Passport.FieldIdentityUploadHelp": { + "key": "Passport.FieldIdentityUploadHelp", + "value": "Загрузите скан удостоверения личности" + }, + "Passport.FieldOneOf.Delimeter": { + "key": "Passport.FieldOneOf.Delimeter", + "value": ", " + }, + "Passport.FieldOneOf.FinalDelimeter": { + "key": "Passport.FieldOneOf.FinalDelimeter", + "value": "или" + }, + "Passport.FieldOneOf.Or": { + "key": "Passport.FieldOneOf.Or", + "value": "%1$@ или %2$@" + }, + "Passport.FieldPhone": { + "key": "Passport.FieldPhone", + "value": "Номер телефона" + }, + "Passport.FieldPhoneHelp": { + "key": "Passport.FieldPhoneHelp", + "value": "Укажите номер своего телефона" + }, + "Passport.FloodError": { + "key": "Passport.FloodError", + "value": "Лимит попыток исчерпан. Попробуйте позже." + }, + "Passport.ForgottenPassword": { + "key": "Passport.ForgottenPassword", + "value": "Сброс пароля" + }, + "Passport.Identity.AddDriversLicense": { + "key": "Passport.Identity.AddDriversLicense", + "value": "Добавить водительские права" + }, + "Passport.Identity.AddIdentityCard": { + "key": "Passport.Identity.AddIdentityCard", + "value": "Добавить удостоверение" + }, + "Passport.Identity.AddInternalPassport": { + "key": "Passport.Identity.AddInternalPassport", + "value": "Добавить внутренний паспорт" + }, + "Passport.Identity.AddPassport": { + "key": "Passport.Identity.AddPassport", + "value": "Добавить паспорт" + }, + "Passport.Identity.AddPersonalDetails": { + "key": "Passport.Identity.AddPersonalDetails", + "value": "Добавить личную информацию" + }, + "Passport.Identity.Country": { + "key": "Passport.Identity.Country", + "value": "Гражданство" + }, + "Passport.Identity.CountryPlaceholder": { + "key": "Passport.Identity.CountryPlaceholder", + "value": "Гражданство" + }, + "Passport.Identity.DateOfBirth": { + "key": "Passport.Identity.DateOfBirth", + "value": "Дата рождения" + }, + "Passport.Identity.DateOfBirthPlaceholder": { + "key": "Passport.Identity.DateOfBirthPlaceholder", + "value": "Дата рождения" + }, + "Passport.Identity.DocumentDetails": { + "key": "Passport.Identity.DocumentDetails", + "value": "ДАННЫЕ ДОКУМЕНТА" + }, + "Passport.Identity.DocumentNumber": { + "key": "Passport.Identity.DocumentNumber", + "value": "Документ #" + }, + "Passport.Identity.DocumentNumberPlaceholder": { + "key": "Passport.Identity.DocumentNumberPlaceholder", + "value": "Номер документа" + }, + "Passport.Identity.DoesNotExpire": { + "key": "Passport.Identity.DoesNotExpire", + "value": "Не истекает" + }, + "Passport.Identity.EditDriversLicense": { + "key": "Passport.Identity.EditDriversLicense", + "value": "Изменить водительские права" + }, + "Passport.Identity.EditIdentityCard": { + "key": "Passport.Identity.EditIdentityCard", + "value": "Изменить удостоверение" + }, + "Passport.Identity.EditInternalPassport": { + "key": "Passport.Identity.EditInternalPassport", + "value": "Изменить внутренний паспорт" + }, + "Passport.Identity.EditPassport": { + "key": "Passport.Identity.EditPassport", + "value": "Изменить паспорт" + }, + "Passport.Identity.EditPersonalDetails": { + "key": "Passport.Identity.EditPersonalDetails", + "value": "Изменить личную информацию" + }, + "Passport.Identity.ExpiryDate": { + "key": "Passport.Identity.ExpiryDate", + "value": "Срок действия" + }, + "Passport.Identity.ExpiryDateNone": { + "key": "Passport.Identity.ExpiryDateNone", + "value": "Нет" + }, + "Passport.Identity.ExpiryDatePlaceholder": { + "key": "Passport.Identity.ExpiryDatePlaceholder", + "value": "Срок действия" + }, + "Passport.Identity.FilesTitle": { + "key": "Passport.Identity.FilesTitle", + "value": "НЕОБХОДИМЫЕ ФАЙЛЫ" + }, + "Passport.Identity.FilesUploadNew": { + "key": "Passport.Identity.FilesUploadNew", + "value": "Загрузить заново" + }, + "Passport.Identity.FilesView": { + "key": "Passport.Identity.FilesView", + "value": "Просмотр" + }, + "Passport.Identity.FrontSide": { + "key": "Passport.Identity.FrontSide", + "value": "Лицевая сторона" + }, + "Passport.Identity.FrontSideHelp": { + "key": "Passport.Identity.FrontSideHelp", + "value": "Загрузите фотографию лицевой стороны документа" + }, + "Passport.Identity.Gender": { + "key": "Passport.Identity.Gender", + "value": "Пол" + }, + "Passport.Identity.GenderFemale": { + "key": "Passport.Identity.GenderFemale", + "value": "Женский" + }, + "Passport.Identity.GenderMale": { + "key": "Passport.Identity.GenderMale", + "value": "Мужской" + }, + "Passport.Identity.GenderPlaceholder": { + "key": "Passport.Identity.GenderPlaceholder", + "value": "Пол" + }, + "Passport.Identity.IssueDate": { + "key": "Passport.Identity.IssueDate", + "value": "Выдан" + }, + "Passport.Identity.IssueDatePlaceholder": { + "key": "Passport.Identity.IssueDatePlaceholder", + "value": "Выдан" + }, + "Passport.Identity.LatinNameHelp": { + "key": "Passport.Identity.LatinNameHelp", + "value": "Укажите своё имя латиницей." + }, + "Passport.Identity.MainPage": { + "key": "Passport.Identity.MainPage", + "value": "Главная страница" + }, + "Passport.Identity.MainPageHelp": { + "key": "Passport.Identity.MainPageHelp", + "value": "Загрузите фотографию главной страницы документа" + }, + "Passport.Identity.MiddleName": { + "key": "Passport.Identity.MiddleName", + "value": "Отчество" + }, + "Passport.Identity.MiddleNamePlaceholder": { + "key": "Passport.Identity.MiddleNamePlaceholder", + "value": "Отчество" + }, + "Passport.Identity.Name": { + "key": "Passport.Identity.Name", + "value": "Имя" + }, + "Passport.Identity.NamePlaceholder": { + "key": "Passport.Identity.NamePlaceholder", + "value": "Имя" + }, + "Passport.Identity.NativeNameGenericHelp": { + "key": "Passport.Identity.NativeNameGenericHelp", + "value": "Ваше имя на языке страны проживания (%@)." + }, + "Passport.Identity.NativeNameGenericTitle": { + "key": "Passport.Identity.NativeNameGenericTitle", + "value": "ИМЯ НА ЯЗЫКЕ СТРАНЫ ПРОЖИВАНИЯ" + }, + "Passport.Identity.NativeNameHelp": { + "key": "Passport.Identity.NativeNameHelp", + "value": "Ваше имя на языке страны проживания" + }, + "Passport.Identity.NativeNameTitle": { + "key": "Passport.Identity.NativeNameTitle", + "value": "ВАШЕ ИМЯ %@" + }, + "Passport.Identity.OneOfTypeDriversLicense": { + "key": "Passport.Identity.OneOfTypeDriversLicense", + "value": "водительских прав" + }, + "Passport.Identity.OneOfTypeIdentityCard": { + "key": "Passport.Identity.OneOfTypeIdentityCard", + "value": "удостоверения личности" + }, + "Passport.Identity.OneOfTypeInternalPassport": { + "key": "Passport.Identity.OneOfTypeInternalPassport", + "value": "внутреннего паспорта" + }, + "Passport.Identity.OneOfTypePassport": { + "key": "Passport.Identity.OneOfTypePassport", + "value": "паспорта" + }, + "Passport.Identity.ResidenceCountry": { + "key": "Passport.Identity.ResidenceCountry", + "value": "Страна" + }, + "Passport.Identity.ResidenceCountryPlaceholder": { + "key": "Passport.Identity.ResidenceCountryPlaceholder", + "value": "Страна" + }, + "Passport.Identity.ReverseSide": { + "key": "Passport.Identity.ReverseSide", + "value": "Обратная сторона" + }, + "Passport.Identity.ReverseSideHelp": { + "key": "Passport.Identity.ReverseSideHelp", + "value": "Загрузите фотографию обратной стороны документа" + }, + "Passport.Identity.ScansHelp": { + "key": "Passport.Identity.ScansHelp", + "value": "В документе должны быть Ваша фотография, имя и фамилия, дата рождения, номер документа, страна получения и срок действия." + }, + "Passport.Identity.Selfie": { + "key": "Passport.Identity.Selfie", + "value": "Селфи" + }, + "Passport.Identity.SelfieHelp": { + "key": "Passport.Identity.SelfieHelp", + "value": "Загрузите фото, где Вы держите этот документ" + }, + "Passport.Identity.Surname": { + "key": "Passport.Identity.Surname", + "value": "Фамилия" + }, + "Passport.Identity.SurnamePlaceholder": { + "key": "Passport.Identity.SurnamePlaceholder", + "value": "Фамилия" + }, + "Passport.Identity.Translation": { + "key": "Passport.Identity.Translation", + "value": "Перевод" + }, + "Passport.Identity.TranslationHelp": { + "key": "Passport.Identity.TranslationHelp", + "value": "Загрузите перевод документа" + }, + "Passport.Identity.Translations": { + "key": "Passport.Identity.Translations", + "value": "ПЕРЕВОД" + }, + "Passport.Identity.TranslationsHelp": { + "key": "Passport.Identity.TranslationsHelp", + "value": "Загрузите сканы заверенного перевода для этого документа." + }, + "Passport.Identity.TypeDriversLicense": { + "key": "Passport.Identity.TypeDriversLicense", + "value": "Водительские права" + }, + "Passport.Identity.TypeDriversLicenseUploadScan": { + "key": "Passport.Identity.TypeDriversLicenseUploadScan", + "value": "Загрузите скан своих водительских прав" + }, + "Passport.Identity.TypeIdentityCard": { + "key": "Passport.Identity.TypeIdentityCard", + "value": "Удостоверение личности" + }, + "Passport.Identity.TypeIdentityCardUploadScan": { + "key": "Passport.Identity.TypeIdentityCardUploadScan", + "value": "Загрузите скан своего удостоверения личности" + }, + "Passport.Identity.TypeInternalPassport": { + "key": "Passport.Identity.TypeInternalPassport", + "value": "Внутренний паспорт" + }, + "Passport.Identity.TypeInternalPassportUploadScan": { + "key": "Passport.Identity.TypeInternalPassportUploadScan", + "value": "Загрузите скан внутреннего паспорта" + }, + "Passport.Identity.TypePassport": { + "key": "Passport.Identity.TypePassport", + "value": "Паспорт" + }, + "Passport.Identity.TypePassportUploadScan": { + "key": "Passport.Identity.TypePassportUploadScan", + "value": "Загрузите скан своего паспорта" + }, + "Passport.Identity.TypePersonalDetails": { + "key": "Passport.Identity.TypePersonalDetails", + "value": "Информация" + }, + "Passport.Identity.UploadOneOfScan": { + "key": "Passport.Identity.UploadOneOfScan", + "value": "Загрузите скан %@" + }, + "Passport.InfoFAQ_URL": { + "key": "Passport.InfoFAQ_URL", + "value": "https://telegram.org/faq#passport" + }, + "Passport.InfoLearnMore": { + "key": "Passport.InfoLearnMore", + "value": "Подробнее" + }, + "Passport.InfoText": { + "key": "Passport.InfoText", + "value": "С помощью Telegram Passport можно зарегистрироваться на сайтах и сервисах, где требуется идентификация личности.\n\nВаша информация, персональные данные и документы защищены оконечным шифрованием (end-to-end). Никто, включая Telegram, не сможет получить к ним доступ без Вашего согласия.\n\nПочитать об этом подробнее можно в нашем FAQ." + }, + "Passport.InfoTitle": { + "key": "Passport.InfoTitle", + "value": "Что такое Telegram Passport?" + }, + "Passport.InvalidPasswordError": { + "key": "Passport.InvalidPasswordError", + "value": "Неверный пароль. Попробуйте снова." + }, + "Passport.Language.ar": { + "key": "Passport.Language.ar", + "value": "на арабском языке" + }, + "Passport.Language.az": { + "key": "Passport.Language.az", + "value": "на азербайджанском языке" + }, + "Passport.Language.bg": { + "key": "Passport.Language.bg", + "value": "на болгарском языке" + }, + "Passport.Language.bn": { + "key": "Passport.Language.bn", + "value": "на бенгальском языке" + }, + "Passport.Language.cs": { + "key": "Passport.Language.cs", + "value": "на чешском языке" + }, + "Passport.Language.da": { + "key": "Passport.Language.da", + "value": "на датском языке" + }, + "Passport.Language.de": { + "key": "Passport.Language.de", + "value": "на немецком языке" + }, + "Passport.Language.dv": { + "key": "Passport.Language.dv", + "value": "на дивехи" + }, + "Passport.Language.dz": { + "key": "Passport.Language.dz", + "value": "на дзонг-кэ" + }, + "Passport.Language.el": { + "key": "Passport.Language.el", + "value": "на греческом языке" + }, + "Passport.Language.en": { + "key": "Passport.Language.en", + "value": "на английском языке" + }, + "Passport.Language.es": { + "key": "Passport.Language.es", + "value": "на испанском языке" + }, + "Passport.Language.et": { + "key": "Passport.Language.et", + "value": "на эстонском языке" + }, + "Passport.Language.fa": { + "key": "Passport.Language.fa", + "value": "на фарси" + }, + "Passport.Language.fr": { + "key": "Passport.Language.fr", + "value": "на французском языке" + }, + "Passport.Language.he": { + "key": "Passport.Language.he", + "value": "на иврите" + }, + "Passport.Language.hr": { + "key": "Passport.Language.hr", + "value": "на хорватском языке" + }, + "Passport.Language.hu": { + "key": "Passport.Language.hu", + "value": "на венгерском языке" + }, + "Passport.Language.hy": { + "key": "Passport.Language.hy", + "value": "на армянском языке" + }, + "Passport.Language.id": { + "key": "Passport.Language.id", + "value": "на индонезийском языке" + }, + "Passport.Language.is": { + "key": "Passport.Language.is", + "value": "на исландском языке" + }, + "Passport.Language.it": { + "key": "Passport.Language.it", + "value": "на итальянском языке" + }, + "Passport.Language.ja": { + "key": "Passport.Language.ja", + "value": "на японском языке" + }, + "Passport.Language.ka": { + "key": "Passport.Language.ka", + "value": "на грузинском языке" + }, + "Passport.Language.km": { + "key": "Passport.Language.km", + "value": "на кхмерском языке" + }, + "Passport.Language.ko": { + "key": "Passport.Language.ko", + "value": "на корейском языке" + }, + "Passport.Language.lo": { + "key": "Passport.Language.lo", + "value": "на лаосском языке" + }, + "Passport.Language.lt": { + "key": "Passport.Language.lt", + "value": "на литовском языке" + }, + "Passport.Language.lv": { + "key": "Passport.Language.lv", + "value": "на латышском языке" + }, + "Passport.Language.mk": { + "key": "Passport.Language.mk", + "value": "на македонском языке" + }, + "Passport.Language.mn": { + "key": "Passport.Language.mn", + "value": "на монгольском языке" + }, + "Passport.Language.ms": { + "key": "Passport.Language.ms", + "value": "на малайском языке" + }, + "Passport.Language.my": { + "key": "Passport.Language.my", + "value": "на бирманском языке" + }, + "Passport.Language.ne": { + "key": "Passport.Language.ne", + "value": "на непальском языке" + }, + "Passport.Language.nl": { + "key": "Passport.Language.nl", + "value": "на нидерландском языке" + }, + "Passport.Language.pl": { + "key": "Passport.Language.pl", + "value": "на польском языке" + }, + "Passport.Language.pt": { + "key": "Passport.Language.pt", + "value": "на португальском языке" + }, + "Passport.Language.ro": { + "key": "Passport.Language.ro", + "value": "на румынском языке" + }, + "Passport.Language.ru": { + "key": "Passport.Language.ru", + "value": "на русском языке" + }, + "Passport.Language.sk": { + "key": "Passport.Language.sk", + "value": "на словацком языке" + }, + "Passport.Language.sl": { + "key": "Passport.Language.sl", + "value": "на словенском языке" + }, + "Passport.Language.th": { + "key": "Passport.Language.th", + "value": "на тайском языке" + }, + "Passport.Language.tk": { + "key": "Passport.Language.tk", + "value": "на туркменском языке" + }, + "Passport.Language.tr": { + "key": "Passport.Language.tr", + "value": "на турецком языке" + }, + "Passport.Language.uk": { + "key": "Passport.Language.uk", + "value": "на украинском языке" + }, + "Passport.Language.uz": { + "key": "Passport.Language.uz", + "value": "на узбекском языке" + }, + "Passport.Language.vi": { + "key": "Passport.Language.vi", + "value": "на вьетнамском языке" + }, + "Passport.NotLoggedInMessage": { + "key": "Passport.NotLoggedInMessage", + "value": "Чтобы использовать Telegram Passport, войдите в свой аккаунт в Telegram." + }, + "Passport.PassportInformation": { + "key": "Passport.PassportInformation", + "value": "ПАСПОРТНЫЕ ДАННЫЕ" + }, + "Passport.PasswordCompleteSetup": { + "key": "Passport.PasswordCompleteSetup", + "value": "Закончить настройку пароля" + }, + "Passport.PasswordCreate": { + "key": "Passport.PasswordCreate", + "value": "Задать пароль" + }, + "Passport.PasswordDescription": { + "key": "Passport.PasswordDescription", + "value": "Чтобы защитить персональные данные оконечным шифрованием, пожалуйста, задайте пароль.\n\nЭтот пароль также будет запрашиваться при входе в Telegram с нового устройства." + }, + "Passport.PasswordHelp": { + "key": "Passport.PasswordHelp", + "value": "Для расшифровки данных введите свой пароль от Telegram." + }, + "Passport.PasswordNext": { + "key": "Passport.PasswordNext", + "value": "Дальше" + }, + "Passport.PasswordPlaceholder": { + "key": "Passport.PasswordPlaceholder", + "value": "Введите пароль" + }, + "Passport.PasswordReset": { + "key": "Passport.PasswordReset", + "value": "Все документы, загруженные Вами в Telegram Passport, будут потеряны. Вы сможете загрузить документы заново." + }, + "Passport.Phone.Delete": { + "key": "Passport.Phone.Delete", + "value": "Удалить номер телефона" + }, + "Passport.Phone.EnterOtherNumber": { + "key": "Passport.Phone.EnterOtherNumber", + "value": "ИЛИ ВВЕДИТЕ ДРУГОЙ НОМЕР ТЕЛЕФОНА" + }, + "Passport.Phone.Help": { + "key": "Passport.Phone.Help", + "value": "Обратите внимание: на указанный Вами номер телефона придет код подтверждения." + }, + "Passport.Phone.Title": { + "key": "Passport.Phone.Title", + "value": "Номер телефона" + }, + "Passport.Phone.UseTelegramNumber": { + "key": "Passport.Phone.UseTelegramNumber", + "value": "Использовать %@" + }, + "Passport.Phone.UseTelegramNumberHelp": { + "key": "Passport.Phone.UseTelegramNumberHelp", + "value": "Используйте тот же номер телефона, что и в Telegram" + }, + "Passport.PrivacyPolicy": { + "key": "Passport.PrivacyPolicy", + "value": "Вы принимаете [Политику конфиденциальности %1$@] и разрешаете их боту %2$@ писать Вам сообщения." + }, + "Passport.RequestHeader": { + "key": "Passport.RequestHeader", + "value": "Для регистрации %@ запрашивает доступ к вашей личной информации." + }, + "Passport.RequestedInformation": { + "key": "Passport.RequestedInformation", + "value": "НЕОБХОДИМАЯ ИНФОРМАЦИЯ" + }, + "Passport.ScanPassport": { + "key": "Passport.ScanPassport", + "value": "Отсканируйте свой паспорт" + }, + "Passport.ScanPassportHelp": { + "key": "Passport.ScanPassportHelp", + "value": "Чтобы автоматически заполнить личные данные, сканируйте свой паспорт или удостоверение личности с областью для считывания компьютером." + }, + "Passport.Scans": { + "key": "Passport.Scans", + "value": "СКАНЫ" + }, + "Passport.Scans.ScanIndex": { + "key": "Passport.Scans.ScanIndex", + "value": "Скан %@" + }, + "Passport.Scans.Upload": { + "key": "Passport.Scans.Upload", + "value": "Загрузить скан" + }, + "Passport.Scans.UploadNew": { + "key": "Passport.Scans.UploadNew", + "value": "Загрузить дополнительный скан" + }, + "Passport.Title": { + "key": "Passport.Title", + "value": "Passport" + }, + "Passport.UpdateRequiredError": { + "key": "Passport.UpdateRequiredError", + "value": "Ваша версия приложения устарела и не может обработать этот запрос. Пожалуйста, обновите Telegram." + }, + "PassportKit.Button.GetTelegramAlertInstall": { + "key": "PassportKit.Button.GetTelegramAlertInstall", + "value": "Установить" + }, + "PassportKit.Button.GetTelegramAlertMessage": { + "key": "PassportKit.Button.GetTelegramAlertMessage", + "value": "Чтобы использовать Telegram Passport, необходимо установить приложение Telegram Messenger" + }, + "PassportKit.Button.GetTelegramAlertNotNow": { + "key": "PassportKit.Button.GetTelegramAlertNotNow", + "value": "Не сейчас" + }, + "PassportKit.Button.GetTelegramAlertTitle": { + "key": "PassportKit.Button.GetTelegramAlertTitle", + "value": "Установка Telegram Messenger" + }, + "PassportKit.Button.Title": { + "key": "PassportKit.Button.Title", + "value": "Войти через Telegram" + }, + "Peer.DeletedUser": { + "key": "Peer.DeletedUser", + "value": "Удалённый аккаунт" + }, + "PeerInfo.AddToContacts": { + "key": "PeerInfo.AddToContacts", + "value": "Добавить в контакты" + }, + "PeerInfo.AutoremoveMessages": { + "key": "PeerInfo.AutoremoveMessages", + "value": "Автоудаление сообщений" + }, + "PeerInfo.AutoremoveMessagesDisabled": { + "key": "PeerInfo.AutoremoveMessagesDisabled", + "value": "Никогда" + }, + "PeerInfo.BioExpand": { + "key": "PeerInfo.BioExpand", + "value": "ещё" + }, + "PeerInfo.ButtonAddMember": { + "key": "PeerInfo.ButtonAddMember", + "value": "Пригласить" + }, + "PeerInfo.ButtonCall": { + "key": "PeerInfo.ButtonCall", + "value": "Звонок" + }, + "PeerInfo.ButtonDiscuss": { + "key": "PeerInfo.ButtonDiscuss", + "value": "Обсудить" + }, + "PeerInfo.ButtonLeave": { + "key": "PeerInfo.ButtonLeave", + "value": "Покинуть" + }, + "PeerInfo.ButtonMessage": { + "key": "PeerInfo.ButtonMessage", + "value": "Чат" + }, + "PeerInfo.ButtonMore": { + "key": "PeerInfo.ButtonMore", + "value": "Ещё" + }, + "PeerInfo.ButtonMute": { + "key": "PeerInfo.ButtonMute", + "value": "Звук" + }, + "PeerInfo.ButtonSearch": { + "key": "PeerInfo.ButtonSearch", + "value": "Поиск" + }, + "PeerInfo.ButtonUnmute": { + "key": "PeerInfo.ButtonUnmute", + "value": "Звук" + }, + "PeerInfo.ButtonVideoCall": { + "key": "PeerInfo.ButtonVideoCall", + "value": "Видео" + }, + "PeerInfo.ButtonVoiceChat": { + "key": "PeerInfo.ButtonVoiceChat", + "value": "Голосовой чат" + }, + "PeerInfo.CustomizeNotifications": { + "key": "PeerInfo.CustomizeNotifications", + "value": "Настроить" + }, + "PeerInfo.GroupAboutItem": { + "key": "PeerInfo.GroupAboutItem", + "value": "описание" + }, + "PeerInfo.PaneAudio": { + "key": "PeerInfo.PaneAudio", + "value": "Музыка" + }, + "PeerInfo.PaneFiles": { + "key": "PeerInfo.PaneFiles", + "value": "Файлы" + }, + "PeerInfo.PaneGifs": { + "key": "PeerInfo.PaneGifs", + "value": "GIF" + }, + "PeerInfo.PaneGroups": { + "key": "PeerInfo.PaneGroups", + "value": "Группы" + }, + "PeerInfo.PaneLinks": { + "key": "PeerInfo.PaneLinks", + "value": "Ссылки" + }, + "PeerInfo.PaneMedia": { + "key": "PeerInfo.PaneMedia", + "value": "Медиа" + }, + "PeerInfo.PaneMembers": { + "key": "PeerInfo.PaneMembers", + "value": "Участники" + }, + "PeerInfo.PaneVoice": { + "key": "PeerInfo.PaneVoice", + "value": "Голосовые сообщения" + }, + "PeerInfo.PaneVoiceAndVideo": { + "key": "PeerInfo.PaneVoiceAndVideo", + "value": "Голос" + }, + "PeerInfo.ReportProfilePhoto": { + "key": "PeerInfo.ReportProfilePhoto", + "value": "Пожаловаться на фото" + }, + "PeerInfo.ReportProfileVideo": { + "key": "PeerInfo.ReportProfileVideo", + "value": "Пожаловаться на видео" + }, + "PeerSelection.ImportIntoNewGroup": { + "key": "PeerSelection.ImportIntoNewGroup", + "value": "Импортировать в новую группу" + }, + "PeopleNearby.CreateGroup": { + "key": "PeopleNearby.CreateGroup", + "value": "Создать локальную группу" + }, + "PeopleNearby.Description": { + "key": "PeopleNearby.Description", + "value": "Предложите другу зайти в этот раздел, чтобы обменяться номерами телефона." + }, + "PeopleNearby.DiscoverDescription": { + "key": "PeopleNearby.DiscoverDescription", + "value": "Вы можете быстро обменяться контактами с пользователями поблизости или найти новых друзей." + }, + "PeopleNearby.Groups": { + "key": "PeopleNearby.Groups", + "value": "Группы рядом" + }, + "PeopleNearby.MakeInvisible": { + "key": "PeopleNearby.MakeInvisible", + "value": "Не показывать меня" + }, + "PeopleNearby.MakeVisible": { + "key": "PeopleNearby.MakeVisible", + "value": "Показывать меня здесь" + }, + "PeopleNearby.MakeVisibleDescription": { + "key": "PeopleNearby.MakeVisibleDescription", + "value": "Те, кто находится рядом с Вами, смогут увидеть Ваш профиль и написать Вам. Это поможет найти новых друзей, но может и привлечь излишнее внимание. Вы можете отключить эту функцию в любой момент.\n\nВаш номер телефона по-прежнему не будет виден." + }, + "PeopleNearby.MakeVisibleTitle": { + "key": "PeopleNearby.MakeVisibleTitle", + "value": "Показывать профиль" + }, + "PeopleNearby.NoMembers": { + "key": "PeopleNearby.NoMembers", + "value": "нет участников" + }, + "PeopleNearby.ShowMorePeople": { + "key": "PeopleNearby.ShowMorePeople", + "zeroValue": null, + "oneValue": "Показать ещё %@", + "twoValue": null, + "fewValue": "Показать ещё %@", + "manyValue": "Показать ещё %@", + "otherValue": "Показать ещё %@" + }, + "PeopleNearby.Title": { + "key": "PeopleNearby.Title", + "value": "Люди рядом" + }, + "PeopleNearby.Users": { + "key": "PeopleNearby.Users", + "value": "Люди рядом" + }, + "PeopleNearby.UsersEmpty": { + "key": "PeopleNearby.UsersEmpty", + "value": "Поиск пользователей рядом с Вами..." + }, + "PeopleNearby.VisibleUntil": { + "key": "PeopleNearby.VisibleUntil", + "value": "показывается до %@" + }, + "Permissions.CellularDataAllowInSettings.v0": { + "key": "Permissions.CellularDataAllowInSettings.v0", + "value": "Включить в настройках" + }, + "Permissions.CellularDataText.v0": { + "key": "Permissions.CellularDataText.v0", + "value": "Telegram использует сеть как можно экономнее. Управлять этим можно в настройках приложения > Данные и память." + }, + "Permissions.CellularDataTitle.v0": { + "key": "Permissions.CellularDataTitle.v0", + "value": "Включите мобильные данные" + }, + "Permissions.ContactsAllow.v0": { + "key": "Permissions.ContactsAllow.v0", + "value": "Разрешить доступ" + }, + "Permissions.ContactsAllowInSettings.v0": { + "key": "Permissions.ContactsAllowInSettings.v0", + "value": "Разрешить в настройках" + }, + "Permissions.ContactsText.v0": { + "key": "Permissions.ContactsText.v0", + "value": "Вы сможете сразу видеть, кто из знакомых пользуется Telegram, без какого-либо \"добавления\" друзей." + }, + "Permissions.ContactsTitle.v0": { + "key": "Permissions.ContactsTitle.v0", + "value": "Синхронизировать контакты\n" + }, + "Permissions.NotificationsAllow.v0": { + "key": "Permissions.NotificationsAllow.v0", + "value": "Включите уведомления" + }, + "Permissions.NotificationsAllowInSettings.v0": { + "key": "Permissions.NotificationsAllowInSettings.v0", + "value": "Включить в настройках" + }, + "Permissions.NotificationsText.v0": { + "key": "Permissions.NotificationsText.v0", + "value": "Уведомления помогут не пропускать важные сообщения от друзей или коллег." + }, + "Permissions.NotificationsTitle.v0": { + "key": "Permissions.NotificationsTitle.v0", + "value": "Включите уведомления" + }, + "Permissions.NotificationsUnreachableText.v0": { + "key": "Permissions.NotificationsUnreachableText.v0", + "value": "Уведомления частично выключены в системных настройках." + }, + "Permissions.PeopleNearbyAllow.v0": { + "key": "Permissions.PeopleNearbyAllow.v0", + "value": "Разрешить доступ" + }, + "Permissions.PeopleNearbyAllowInSettings.v0": { + "key": "Permissions.PeopleNearbyAllowInSettings.v0", + "value": "Разрешить в настройках" + }, + "Permissions.PeopleNearbyText.v0": { + "key": "Permissions.PeopleNearbyText.v0", + "value": "Вы можете быстро связаться с теми, кто находится рядом с Вами и зашёл в этот раздел, а также найти локальные группы.\n\nДля этого необходимо разрешить приложению доступ к геопозиции." + }, + "Permissions.PeopleNearbyTitle.v0": { + "key": "Permissions.PeopleNearbyTitle.v0", + "value": "Люди рядом" + }, + "Permissions.PrivacyPolicy": { + "key": "Permissions.PrivacyPolicy", + "value": "Политика конфиденциальности" + }, + "Permissions.SiriAllow.v0": { + "key": "Permissions.SiriAllow.v0", + "value": "Включить Siri" + }, + "Permissions.SiriAllowInSettings.v0": { + "key": "Permissions.SiriAllowInSettings.v0", + "value": "Включить в настройках" + }, + "Permissions.SiriText.v0": { + "key": "Permissions.SiriText.v0", + "value": "С помощью Siri можно отправлять сообщения и звонить." + }, + "Permissions.SiriTitle.v0": { + "key": "Permissions.SiriTitle.v0", + "value": "Включите Siri" + }, + "Permissions.Skip": { + "key": "Permissions.Skip", + "value": "Пропустить" + }, + "PhoneLabel.Title": { + "key": "PhoneLabel.Title", + "value": "Тип" + }, + "PhoneNumberHelp.Alert": { + "key": "PhoneNumberHelp.Alert", + "value": "Пользователи будут видеть Ваш новый номер, если он есть в их телефонной книге или если это разрешают Ваши настройки конфиденциальности: Настройки > Конфиденциальность > Номер телефона." + }, + "PhoneNumberHelp.ChangeNumber": { + "key": "PhoneNumberHelp.ChangeNumber", + "value": "Изменить номер" + }, + "PhoneNumberHelp.Help": { + "key": "PhoneNumberHelp.Help", + "value": "Здесь Вы можете сменить номер телефона. Ваш аккаунт и все данные (сообщения, медиа, контакты и т. д.) будут перенесены на новый номер." + }, + "PhotoEditor.BlurToolLinear": { + "key": "PhotoEditor.BlurToolLinear", + "value": "Линейное" + }, + "PhotoEditor.BlurToolOff": { + "key": "PhotoEditor.BlurToolOff", + "value": "Нет" + }, + "PhotoEditor.BlurToolPortrait": { + "key": "PhotoEditor.BlurToolPortrait", + "value": "Портрет" + }, + "PhotoEditor.BlurToolRadial": { + "key": "PhotoEditor.BlurToolRadial", + "value": "Радиальное" + }, + "PhotoEditor.ContrastTool": { + "key": "PhotoEditor.ContrastTool", + "value": "Контраст" + }, + "PhotoEditor.CropAspectRatioOriginal": { + "key": "PhotoEditor.CropAspectRatioOriginal", + "value": "Оригинал" + }, + "PhotoEditor.CropAspectRatioSquare": { + "key": "PhotoEditor.CropAspectRatioSquare", + "value": "Квадрат" + }, + "PhotoEditor.CropAuto": { + "key": "PhotoEditor.CropAuto", + "value": "АВТО" + }, + "PhotoEditor.CropReset": { + "key": "PhotoEditor.CropReset", + "value": "СБРОС" + }, + "PhotoEditor.CurvesAll": { + "key": "PhotoEditor.CurvesAll", + "value": "Все" + }, + "PhotoEditor.CurvesBlue": { + "key": "PhotoEditor.CurvesBlue", + "value": "Синий" + }, + "PhotoEditor.CurvesGreen": { + "key": "PhotoEditor.CurvesGreen", + "value": "Зелёный" + }, + "PhotoEditor.CurvesRed": { + "key": "PhotoEditor.CurvesRed", + "value": "Красный" + }, + "PhotoEditor.DiscardChanges": { + "key": "PhotoEditor.DiscardChanges", + "value": "Отменить изменения" + }, + "PhotoEditor.EnhanceTool": { + "key": "PhotoEditor.EnhanceTool", + "value": "Автоулучшение" + }, + "PhotoEditor.ExposureTool": { + "key": "PhotoEditor.ExposureTool", + "value": "Яркость" + }, + "PhotoEditor.FadeTool": { + "key": "PhotoEditor.FadeTool", + "value": "Затемнение" + }, + "PhotoEditor.GrainTool": { + "key": "PhotoEditor.GrainTool", + "value": "Зернистость" + }, + "PhotoEditor.HighlightsTint": { + "key": "PhotoEditor.HighlightsTint", + "value": "Выделение" + }, + "PhotoEditor.HighlightsTool": { + "key": "PhotoEditor.HighlightsTool", + "value": "Блики" + }, + "PhotoEditor.Original": { + "key": "PhotoEditor.Original", + "value": "Оригинал" + }, + "PhotoEditor.QualityTool": { + "key": "PhotoEditor.QualityTool", + "value": "Качество" + }, + "PhotoEditor.SaturationTool": { + "key": "PhotoEditor.SaturationTool", + "value": "Насыщенность" + }, + "PhotoEditor.SelectCoverFrame": { + "key": "PhotoEditor.SelectCoverFrame", + "value": "Выберите обложку для видеозаписи" + }, + "PhotoEditor.ShadowsTint": { + "key": "PhotoEditor.ShadowsTint", + "value": "Тени" + }, + "PhotoEditor.ShadowsTool": { + "key": "PhotoEditor.ShadowsTool", + "value": "Тени" + }, + "PhotoEditor.SharpenTool": { + "key": "PhotoEditor.SharpenTool", + "value": "Усиление резкости" + }, + "PhotoEditor.SkinTool": { + "key": "PhotoEditor.SkinTool", + "value": "Гладкая кожа" + }, + "PhotoEditor.TiltShift": { + "key": "PhotoEditor.TiltShift", + "value": "Размытие " + }, + "PhotoEditor.VignetteTool": { + "key": "PhotoEditor.VignetteTool", + "value": "Виньетка" + }, + "PhotoEditor.WarmthTool": { + "key": "PhotoEditor.WarmthTool", + "value": "Теплота" + }, + "PollResults.Collapse": { + "key": "PollResults.Collapse", + "value": "СКРЫТЬ" + }, + "PollResults.ShowMore": { + "key": "PollResults.ShowMore", + "zeroValue": null, + "oneValue": "Показать ещё (%@)", + "twoValue": null, + "fewValue": "Показать ещё (%@)", + "manyValue": "Показать ещё (%@)", + "otherValue": "Показать ещё (%@)" + }, + "PollResults.Title": { + "key": "PollResults.Title", + "value": "Результаты" + }, + "Presence.online": { + "key": "Presence.online", + "value": "в сети" + }, + "Preview.CopyAddress": { + "key": "Preview.CopyAddress", + "value": "Скопировать Адрес" + }, + "Preview.DeleteGif": { + "key": "Preview.DeleteGif", + "value": "Удалить GIF" + }, + "Preview.DeletePhoto": { + "key": "Preview.DeletePhoto", + "value": "Удалить фотографию" + }, + "Preview.OpenInInstagram": { + "key": "Preview.OpenInInstagram", + "value": "Открыть в Инстаграме" + }, + "Preview.SaveGif": { + "key": "Preview.SaveGif", + "value": "Сохранить GIF" + }, + "Preview.SaveToCameraRoll": { + "key": "Preview.SaveToCameraRoll", + "value": "Сохранить в фотопоток" + }, + "Privacy.AddNewPeer": { + "key": "Privacy.AddNewPeer", + "value": "Добавить людей или группы" + }, + "Privacy.Calls": { + "key": "Privacy.Calls", + "value": "Звонки" + }, + "Privacy.Calls.AlwaysAllow": { + "key": "Privacy.Calls.AlwaysAllow", + "value": "Всегда позволять" + }, + "Privacy.Calls.AlwaysAllow.Placeholder": { + "key": "Privacy.Calls.AlwaysAllow.Placeholder", + "value": "Всегда разрешать..." + }, + "Privacy.Calls.AlwaysAllow.Title": { + "key": "Privacy.Calls.AlwaysAllow.Title", + "value": "Всегда разрешать" + }, + "Privacy.Calls.CustomHelp": { + "key": "Privacy.Calls.CustomHelp", + "value": "Вы можете выбрать, кто может Вам позвонить." + }, + "Privacy.Calls.CustomShareHelp": { + "key": "Privacy.Calls.CustomShareHelp", + "value": "Этим пользователям будет разрешено или запрещено звонить Вам вне зависимости от настроек выше." + }, + "Privacy.Calls.Integration": { + "key": "Privacy.Calls.Integration", + "value": "Интеграция со звонками iOS" + }, + "Privacy.Calls.IntegrationHelp": { + "key": "Privacy.Calls.IntegrationHelp", + "value": "Интеграция со звонками iOS позволит показывать звонки Telegram на экране блокировки и в общей истории вызовов. Если включена синхронизация с iCloud, Ваша история вызовов будет синхронизироваться с Apple." + }, + "Privacy.Calls.NeverAllow": { + "key": "Privacy.Calls.NeverAllow", + "value": "Никогда не позволять" + }, + "Privacy.Calls.NeverAllow.Placeholder": { + "key": "Privacy.Calls.NeverAllow.Placeholder", + "value": "Никогда не разрешать..." + }, + "Privacy.Calls.NeverAllow.Title": { + "key": "Privacy.Calls.NeverAllow.Title", + "value": "Всегда запрещать" + }, + "Privacy.Calls.P2P": { + "key": "Privacy.Calls.P2P", + "value": "Peer-to-Peer" + }, + "Privacy.Calls.P2PAlways": { + "key": "Privacy.Calls.P2PAlways", + "value": "Всегда" + }, + "Privacy.Calls.P2PContacts": { + "key": "Privacy.Calls.P2PContacts", + "value": "Мои контакты" + }, + "Privacy.Calls.P2PHelp": { + "key": "Privacy.Calls.P2PHelp", + "value": "Если выключить peer-to-peer, все звонки будут идти через серверы Telegram. Собеседник не сможет узнать Ваш IP-адрес, но качество звука и видео может ухудшиться." + }, + "Privacy.Calls.P2PNever": { + "key": "Privacy.Calls.P2PNever", + "value": "Никогда" + }, + "Privacy.Calls.WhoCanCallMe": { + "key": "Privacy.Calls.WhoCanCallMe", + "value": "КТО МОЖЕТ МНЕ ЗВОНИТЬ" + }, + "Privacy.ChatsTitle": { + "key": "Privacy.ChatsTitle", + "value": "ЧАТЫ" + }, + "Privacy.ContactsReset": { + "key": "Privacy.ContactsReset", + "value": "Удалить импортированные контакты" + }, + "Privacy.ContactsResetConfirmation": { + "key": "Privacy.ContactsResetConfirmation", + "value": "Ваши контакты будут удалены с серверов Telegram. \nЕсли включена опция «Синхронизировать контакты», они синхронизируются заново." + }, + "Privacy.ContactsSync": { + "key": "Privacy.ContactsSync", + "value": "Синхронизировать контакты" + }, + "Privacy.ContactsSyncHelp": { + "key": "Privacy.ContactsSyncHelp", + "value": "Включите, чтобы добавлять контакты с этого устройства к Вашему аккаунту." + }, + "Privacy.ContactsTitle": { + "key": "Privacy.ContactsTitle", + "value": "КОНТАКТЫ" + }, + "Privacy.DeleteDrafts": { + "key": "Privacy.DeleteDrafts", + "value": "Удалить черновики" + }, + "Privacy.Forwards": { + "key": "Privacy.Forwards", + "value": "Пересылка сообщений" + }, + "Privacy.Forwards.AlwaysAllow.Title": { + "key": "Privacy.Forwards.AlwaysAllow.Title", + "value": "Всегда разрешать" + }, + "Privacy.Forwards.AlwaysLink": { + "key": "Privacy.Forwards.AlwaysLink", + "value": "Ссылка на Ваш аккаунт" + }, + "Privacy.Forwards.CustomHelp": { + "key": "Privacy.Forwards.CustomHelp", + "value": "В отправленных Вами сообщениях не будет ссылки на Ваш аккаунт, если переслать их в другой чат." + }, + "Privacy.Forwards.LinkIfAllowed": { + "key": "Privacy.Forwards.LinkIfAllowed", + "value": "Ссылка, если это разрешают настройки ниже" + }, + "Privacy.Forwards.NeverAllow.Title": { + "key": "Privacy.Forwards.NeverAllow.Title", + "value": "Всегда запрещать" + }, + "Privacy.Forwards.NeverLink": { + "key": "Privacy.Forwards.NeverLink", + "value": "Без ссылки на аккаунт" + }, + "Privacy.Forwards.Preview": { + "key": "Privacy.Forwards.Preview", + "value": "ПРИМЕР СООБЩЕНИЯ" + }, + "Privacy.Forwards.PreviewMessageText": { + "key": "Privacy.Forwards.PreviewMessageText", + "value": "Чем ворон похож на письменный стол?" + }, + "Privacy.Forwards.WhoCanForward": { + "key": "Privacy.Forwards.WhoCanForward", + "value": "КТО МОЖЕТ ССЫЛАТЬСЯ НА МОЙ АККАУНТ ПРИ ПЕРЕСЫЛКЕ СООБЩЕНИЙ" + }, + "Privacy.GroupsAndChannels": { + "key": "Privacy.GroupsAndChannels", + "value": "Группы и каналы" + }, + "Privacy.GroupsAndChannels.AlwaysAllow": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow", + "value": "Всегда разрешать" + }, + "Privacy.GroupsAndChannels.AlwaysAllow.Placeholder": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow.Placeholder", + "value": "Всегда разрешать..." + }, + "Privacy.GroupsAndChannels.AlwaysAllow.Title": { + "key": "Privacy.GroupsAndChannels.AlwaysAllow.Title", + "value": "Всегда позволять" + }, + "Privacy.GroupsAndChannels.CustomHelp": { + "key": "Privacy.GroupsAndChannels.CustomHelp", + "value": "Вы можете выбрать, кому разрешаете приглашать Вас в группы и каналы." + }, + "Privacy.GroupsAndChannels.CustomShareHelp": { + "key": "Privacy.GroupsAndChannels.CustomShareHelp", + "value": "Эти пользователи смогут или не смогут добавлять Вас в группы и каналы вне зависимости от настроек выше." + }, + "Privacy.GroupsAndChannels.InviteToChannelError": { + "key": "Privacy.GroupsAndChannels.InviteToChannelError", + "value": "Вы не можете добавлять %@ в каналы из-за настроек приватности %@" + }, + "Privacy.GroupsAndChannels.InviteToChannelMultipleError": { + "key": "Privacy.GroupsAndChannels.InviteToChannelMultipleError", + "value": "Вы не можете создать группу с этими пользователями из-за их настроек приватности." + }, + "Privacy.GroupsAndChannels.InviteToGroupError": { + "key": "Privacy.GroupsAndChannels.InviteToGroupError", + "value": "Вы не можете добавлять %@ в группы из-за настроек приватности %@" + }, + "Privacy.GroupsAndChannels.NeverAllow": { + "key": "Privacy.GroupsAndChannels.NeverAllow", + "value": "Никогда не позволять" + }, + "Privacy.GroupsAndChannels.NeverAllow.Placeholder": { + "key": "Privacy.GroupsAndChannels.NeverAllow.Placeholder", + "value": "Никогда не разрешать..." + }, + "Privacy.GroupsAndChannels.NeverAllow.Title": { + "key": "Privacy.GroupsAndChannels.NeverAllow.Title", + "value": "Всегда запрещать" + }, + "Privacy.GroupsAndChannels.WhoCanAddMe": { + "key": "Privacy.GroupsAndChannels.WhoCanAddMe", + "value": "КТО МОЖЕТ ПРИГЛАШАТЬ МЕНЯ" + }, + "Privacy.PaymentsClear.PaymentInfo": { + "key": "Privacy.PaymentsClear.PaymentInfo", + "value": "Реквизиты" + }, + "Privacy.PaymentsClear.ShippingInfo": { + "key": "Privacy.PaymentsClear.ShippingInfo", + "value": "Сведения о доставке" + }, + "Privacy.PaymentsClearInfo": { + "key": "Privacy.PaymentsClearInfo", + "value": "Удалить платежные данные" + }, + "Privacy.PaymentsClearInfoDoneHelp": { + "key": "Privacy.PaymentsClearInfoDoneHelp", + "value": "Данные о платежах и доставке удалены." + }, + "Privacy.PaymentsClearInfoHelp": { + "key": "Privacy.PaymentsClearInfoHelp", + "value": "Вы можете удалить свою платёжную информацию и запросить удаление сохраненных кредитных карт у платёжных провайдеров. Обратите внимание, что сам Telegram не хранит информацию о Ваших кредитных картах." + }, + "Privacy.PaymentsTitle": { + "key": "Privacy.PaymentsTitle", + "value": "ПЛАТЕЖИ" + }, + "Privacy.PhoneNumber": { + "key": "Privacy.PhoneNumber", + "value": "Номер телефона" + }, + "Privacy.ProfilePhoto": { + "key": "Privacy.ProfilePhoto", + "value": "Фотография профиля" + }, + "Privacy.ProfilePhoto.AlwaysShareWith.Title": { + "key": "Privacy.ProfilePhoto.AlwaysShareWith.Title", + "value": "Всегда показывать" + }, + "Privacy.ProfilePhoto.CustomHelp": { + "key": "Privacy.ProfilePhoto.CustomHelp", + "value": "Вы можете выбрать, кому разрешаете видеть фотографию в своём профиле." + }, + "Privacy.ProfilePhoto.NeverShareWith.Title": { + "key": "Privacy.ProfilePhoto.NeverShareWith.Title", + "value": "Никогда не показывать" + }, + "Privacy.ProfilePhoto.WhoCanSeeMyPhoto": { + "key": "Privacy.ProfilePhoto.WhoCanSeeMyPhoto", + "value": "КТО ВИДИТ МОЮ ФОТОГРАФИЮ" + }, + "Privacy.SecretChatsLinkPreviews": { + "key": "Privacy.SecretChatsLinkPreviews", + "value": "Предпросмотр ссылок" + }, + "Privacy.SecretChatsLinkPreviewsHelp": { + "key": "Privacy.SecretChatsLinkPreviewsHelp", + "value": "Предпросмотр для ссылок создается на серверах Telegram. Мы не храним данные об отправленных Вами ссылках." + }, + "Privacy.SecretChatsTitle": { + "key": "Privacy.SecretChatsTitle", + "value": "СЕКРЕТНЫЕ ЧАТЫ" + }, + "Privacy.TopPeers": { + "key": "Privacy.TopPeers", + "value": "Подсказка людей при поиске" + }, + "Privacy.TopPeersDelete": { + "key": "Privacy.TopPeersDelete", + "value": "Удалить" + }, + "Privacy.TopPeersHelp": { + "key": "Privacy.TopPeersHelp", + "value": "Показывать пользователей, которым Вы часто пишете, вверху в разделе поиска." + }, + "Privacy.TopPeersWarning": { + "key": "Privacy.TopPeersWarning", + "value": "Информация о том, каким пользователям Вы часто пишете и какими ботами обычно пользуетесь, будет удалена." + }, + "PrivacyLastSeenSettings.AddUsers": { + "key": "PrivacyLastSeenSettings.AddUsers", + "zeroValue": null, + "oneValue": "Добавить %@ пользователя в этот список?", + "twoValue": null, + "fewValue": "Добавить %@ пользователей в этот список?", + "manyValue": "Добавить %@ пользователей в этот список?", + "otherValue": "Добавить %@ пользователей в этот список?" + }, + "PrivacyLastSeenSettings.AlwaysShareWith": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith", + "value": "Всегда показывать" + }, + "PrivacyLastSeenSettings.AlwaysShareWith.Placeholder": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith.Placeholder", + "value": "Всегда показывать..." + }, + "PrivacyLastSeenSettings.AlwaysShareWith.Title": { + "key": "PrivacyLastSeenSettings.AlwaysShareWith.Title", + "value": "Показывать" + }, + "PrivacyLastSeenSettings.CustomHelp": { + "key": "PrivacyLastSeenSettings.CustomHelp", + "value": "Важно: Вы не будете видеть появление в сети и время активности пользователей, от которых скрыли свои. Вместо времени будет видно примерное значение (недавно, на этой неделе, в этом месяце)." + }, + "PrivacyLastSeenSettings.CustomShareSettings.Delete": { + "key": "PrivacyLastSeenSettings.CustomShareSettings.Delete", + "value": "Удалить" + }, + "PrivacyLastSeenSettings.CustomShareSettingsHelp": { + "key": "PrivacyLastSeenSettings.CustomShareSettingsHelp", + "value": "Вы можете добавить пользователей или целые группы в список исключений из настроек выше." + }, + "PrivacyLastSeenSettings.EmpryUsersPlaceholder": { + "key": "PrivacyLastSeenSettings.EmpryUsersPlaceholder", + "value": "Добавить" + }, + "PrivacyLastSeenSettings.GroupsAndChannelsHelp": { + "key": "PrivacyLastSeenSettings.GroupsAndChannelsHelp", + "value": "Выберите, кто может добавлять Вас в группы и каналы." + }, + "PrivacyLastSeenSettings.NeverShareWith": { + "key": "PrivacyLastSeenSettings.NeverShareWith", + "value": "Никогда не показывать" + }, + "PrivacyLastSeenSettings.NeverShareWith.Placeholder": { + "key": "PrivacyLastSeenSettings.NeverShareWith.Placeholder", + "value": "Никогда не показывать..." + }, + "PrivacyLastSeenSettings.NeverShareWith.Title": { + "key": "PrivacyLastSeenSettings.NeverShareWith.Title", + "value": "Не показывать" + }, + "PrivacyLastSeenSettings.Title": { + "key": "PrivacyLastSeenSettings.Title", + "value": "Активность" + }, + "PrivacyLastSeenSettings.WhoCanSeeMyTimestamp": { + "key": "PrivacyLastSeenSettings.WhoCanSeeMyTimestamp", + "value": "КТО ВИДИТ, КОГДА Я В СЕТИ" + }, + "PrivacyPhoneNumberSettings.CustomDisabledHelp": { + "key": "PrivacyPhoneNumberSettings.CustomDisabledHelp", + "value": "Пользователи, которые сохранили Ваш номер в телефонную книгу, будут видеть его в Telegram, только если Вы добавили их в контакты." + }, + "PrivacyPhoneNumberSettings.CustomHelp": { + "key": "PrivacyPhoneNumberSettings.CustomHelp", + "value": "Пользователи, которые сохранили Ваш номер в телефонную книгу, будут видеть его и в Telegram." + }, + "PrivacyPhoneNumberSettings.DiscoveryHeader": { + "key": "PrivacyPhoneNumberSettings.DiscoveryHeader", + "value": "КТО МОЖЕТ НАЙТИ МЕНЯ ПО НОМЕРУ" + }, + "PrivacyPhoneNumberSettings.WhoCanSeeMyPhoneNumber": { + "key": "PrivacyPhoneNumberSettings.WhoCanSeeMyPhoneNumber", + "value": "КТО ВИДИТ МОЙ НОМЕР ТЕЛЕФОНА" + }, + "PrivacyPolicy.Accept": { + "key": "PrivacyPolicy.Accept", + "value": "Принять и продолжить" + }, + "PrivacyPolicy.AgeVerificationAgree": { + "key": "PrivacyPolicy.AgeVerificationAgree", + "value": "Принять" + }, + "PrivacyPolicy.AgeVerificationMessage": { + "key": "PrivacyPolicy.AgeVerificationMessage", + "value": "Нажмите «Принять» для подтверждения, что Вам %@ лет или более." + }, + "PrivacyPolicy.AgeVerificationTitle": { + "key": "PrivacyPolicy.AgeVerificationTitle", + "value": "Подтверждение возраста" + }, + "PrivacyPolicy.Decline": { + "key": "PrivacyPolicy.Decline", + "value": "Отклонить" + }, + "PrivacyPolicy.DeclineDeclineAndDelete": { + "key": "PrivacyPolicy.DeclineDeclineAndDelete", + "value": "Отклонить и удалить" + }, + "PrivacyPolicy.DeclineDeleteNow": { + "key": "PrivacyPolicy.DeclineDeleteNow", + "value": "Удалить сейчас" + }, + "PrivacyPolicy.DeclineLastWarning": { + "key": "PrivacyPolicy.DeclineLastWarning", + "value": "Внимание: в этом случае Ваш аккаунт в Telegram будет необратимо удалён вместе со всей информацией, которую Вы храните на серверах Telegram.\n\nВажно: Вы можете отменить удаление и сначала экспортировать данные своего аккаунта, чтобы не потерять их. (Для этого зайдите в аккаунт через свежую версию Telegram для ПК и выберите Настройки > Экспорт данных из Telegram.)" + }, + "PrivacyPolicy.DeclineMessage": { + "key": "PrivacyPolicy.DeclineMessage", + "value": "К сожалению, в этом случае придется отказаться от использования Telegram. \n\nВ отличие от других сервисов, мы не используем Ваши данные для рекламы и иных коммерческих целей. На серверах хранится только та информация, которая позволяет Вам полноценно пользоваться Telegram. Вы можете регулировать доступ к своим данным в настройках приложения, в разделе Конфиденциальность и безопасность.\n\nЕсли Вы не готовы предоставить минимальные нужные данные, увы, мы не сможем обеспечить работу Telegram." + }, + "PrivacyPolicy.DeclineTitle": { + "key": "PrivacyPolicy.DeclineTitle", + "value": "Отклонить" + }, + "PrivacyPolicy.Title": { + "key": "PrivacyPolicy.Title", + "value": "Пользовательское соглашение" + }, + "PrivacySettings.AuthSessions": { + "key": "PrivacySettings.AuthSessions", + "value": "Активные сеансы" + }, + "PrivacySettings.AutoArchive": { + "key": "PrivacySettings.AutoArchive", + "value": "В архив и без уведомлений" + }, + "PrivacySettings.AutoArchiveInfo": { + "key": "PrivacySettings.AutoArchiveInfo", + "value": "Автоматически отключать уведомления о новых чатах, группах и каналов от неконтактов и помещать их в архив." + }, + "PrivacySettings.AutoArchiveTitle": { + "key": "PrivacySettings.AutoArchiveTitle", + "value": "НОВЫЕ ЧАТЫ С НЕЗНАКОМЦАМИ" + }, + "PrivacySettings.BlockedPeersEmpty": { + "key": "PrivacySettings.BlockedPeersEmpty", + "value": "Нет" + }, + "PrivacySettings.DataSettings": { + "key": "PrivacySettings.DataSettings", + "value": "Управление данными" + }, + "PrivacySettings.DataSettingsHelp": { + "key": "PrivacySettings.DataSettingsHelp", + "value": "Вы можете выбрать, какие данные хранятся в облаке и расширяют ваши возможности в Telegram." + }, + "PrivacySettings.DeleteAccountHelp": { + "key": "PrivacySettings.DeleteAccountHelp", + "value": "Если Вы ни разу не заглянете в Telegram за это время, аккаунт будет удалён вместе со всеми сообщениями и контактами." + }, + "PrivacySettings.DeleteAccountIfAwayFor": { + "key": "PrivacySettings.DeleteAccountIfAwayFor", + "value": "Если я не захожу" + }, + "PrivacySettings.DeleteAccountTitle": { + "key": "PrivacySettings.DeleteAccountTitle", + "value": "УДАЛИТЬ АККАУНТ АВТОМАТИЧЕСКИ" + }, + "PrivacySettings.LastSeen": { + "key": "PrivacySettings.LastSeen", + "value": "Последняя активность" + }, + "PrivacySettings.LastSeenContacts": { + "key": "PrivacySettings.LastSeenContacts", + "value": "Мои контакты" + }, + "PrivacySettings.LastSeenContactsMinus": { + "key": "PrivacySettings.LastSeenContactsMinus", + "value": "Мои контакты (-%@)" + }, + "PrivacySettings.LastSeenContactsMinusPlus": { + "key": "PrivacySettings.LastSeenContactsMinusPlus", + "value": "Мои контакты (-%@, +%@)" + }, + "PrivacySettings.LastSeenContactsPlus": { + "key": "PrivacySettings.LastSeenContactsPlus", + "value": "Мои контакты (+%@)" + }, + "PrivacySettings.LastSeenEverybody": { + "key": "PrivacySettings.LastSeenEverybody", + "value": "Все" + }, + "PrivacySettings.LastSeenEverybodyMinus": { + "key": "PrivacySettings.LastSeenEverybodyMinus", + "value": "Все (-%@)" + }, + "PrivacySettings.LastSeenNobody": { + "key": "PrivacySettings.LastSeenNobody", + "value": "Никто" + }, + "PrivacySettings.LastSeenNobodyPlus": { + "key": "PrivacySettings.LastSeenNobodyPlus", + "value": "Никто (+%@)" + }, + "PrivacySettings.LastSeenTitle": { + "key": "PrivacySettings.LastSeenTitle", + "value": "Активность" + }, + "PrivacySettings.Passcode": { + "key": "PrivacySettings.Passcode", + "value": "Код-пароль" + }, + "PrivacySettings.PasscodeAndFaceId": { + "key": "PrivacySettings.PasscodeAndFaceId", + "value": "Код-пароль и Face ID" + }, + "PrivacySettings.PasscodeAndTouchId": { + "key": "PrivacySettings.PasscodeAndTouchId", + "value": "Код-пароль и Touch ID" + }, + "PrivacySettings.PasscodeOff": { + "key": "PrivacySettings.PasscodeOff", + "value": "Нет" + }, + "PrivacySettings.PasscodeOn": { + "key": "PrivacySettings.PasscodeOn", + "value": "Вкл" + }, + "PrivacySettings.PhoneNumber": { + "key": "PrivacySettings.PhoneNumber", + "value": "Номер телефона" + }, + "PrivacySettings.PrivacyTitle": { + "key": "PrivacySettings.PrivacyTitle", + "value": "КОНФИДЕНЦИАЛЬНОСТЬ" + }, + "PrivacySettings.SecurityTitle": { + "key": "PrivacySettings.SecurityTitle", + "value": "БЕЗОПАСНОСТЬ" + }, + "PrivacySettings.Title": { + "key": "PrivacySettings.Title", + "value": "Конфиденциальность" + }, + "PrivacySettings.TwoStepAuth": { + "key": "PrivacySettings.TwoStepAuth", + "value": "Облачный пароль" + }, + "PrivacySettings.WebSessions": { + "key": "PrivacySettings.WebSessions", + "value": "Активные сайты" + }, + "PrivateDataSettings.Title": { + "key": "PrivateDataSettings.Title", + "value": "Управление данными" + }, + "Profile.About": { + "key": "Profile.About", + "value": "о себе" + }, + "Profile.AddToExisting": { + "key": "Profile.AddToExisting", + "value": "Добавить в имеющийся" + }, + "Profile.BotInfo": { + "key": "Profile.BotInfo", + "value": "описание" + }, + "Profile.CreateEncryptedChatError": { + "key": "Profile.CreateEncryptedChatError", + "value": "Произошла ошибка." + }, + "Profile.CreateNewContact": { + "key": "Profile.CreateNewContact", + "value": "Создать новый контакт" + }, + "Profile.EncryptionKey": { + "key": "Profile.EncryptionKey", + "value": "Ключ шифрования" + }, + "Profile.MessageLifetime1d": { + "key": "Profile.MessageLifetime1d", + "value": "1 дн." + }, + "Profile.MessageLifetime1h": { + "key": "Profile.MessageLifetime1h", + "value": "1 ч." + }, + "Profile.MessageLifetime1m": { + "key": "Profile.MessageLifetime1m", + "value": "1 мин." + }, + "Profile.MessageLifetime1w": { + "key": "Profile.MessageLifetime1w", + "value": "1 нед." + }, + "Profile.MessageLifetime2s": { + "key": "Profile.MessageLifetime2s", + "value": "2 сек." + }, + "Profile.MessageLifetime5s": { + "key": "Profile.MessageLifetime5s", + "value": "5 сек." + }, + "Profile.MessageLifetimeForever": { + "key": "Profile.MessageLifetimeForever", + "value": "Нет" + }, + "Profile.ShareContactButton": { + "key": "Profile.ShareContactButton", + "value": "Отправить контакт" + }, + "Profile.Username": { + "key": "Profile.Username", + "value": "имя пользователя" + }, + "ProfilePhoto.MainPhoto": { + "key": "ProfilePhoto.MainPhoto", + "value": "Основная фотография" + }, + "ProfilePhoto.MainVideo": { + "key": "ProfilePhoto.MainVideo", + "value": "Основное видео" + }, + "ProfilePhoto.OpenGallery": { + "key": "ProfilePhoto.OpenGallery", + "value": "Открыть галерею" + }, + "ProfilePhoto.OpenInEditor": { + "key": "ProfilePhoto.OpenInEditor", + "value": "Открыть в редакторе" + }, + "ProfilePhoto.SearchWeb": { + "key": "ProfilePhoto.SearchWeb", + "value": "Поиск в сети" + }, + "ProfilePhoto.SetMainPhoto": { + "key": "ProfilePhoto.SetMainPhoto", + "value": "Сделать основной" + }, + "ProfilePhoto.SetMainVideo": { + "key": "ProfilePhoto.SetMainVideo", + "value": "Сделать основным" + }, + "Proxy.TooltipUnavailable": { + "key": "Proxy.TooltipUnavailable", + "value": "Прокси-сервер может быть недоступен. Попробуйте выбрать другой." + }, + "ProxyServer.VoiceOver.Active": { + "key": "ProxyServer.VoiceOver.Active", + "value": "Используется" + }, + "QuickSend.Photos": { + "key": "QuickSend.Photos", + "zeroValue": null, + "oneValue": "Отправить %@ фото", + "twoValue": null, + "fewValue": "Отправить %@ фото", + "manyValue": "Отправить %@ фото", + "otherValue": "Отправить %@ фото" + }, + "Replies.BlockAndDeleteRepliesActionTitle": { + "key": "Replies.BlockAndDeleteRepliesActionTitle", + "value": "Блокировать и удалить ответы" + }, + "RepliesChat.DescriptionText": { + "key": "RepliesChat.DescriptionText", + "value": "Этот чат поможет отслеживать ответы на Ваши комментарии в каналах." + }, + "Report.AdditionalDetailsPlaceholder": { + "key": "Report.AdditionalDetailsPlaceholder", + "value": "Комментарий..." + }, + "Report.AdditionalDetailsText": { + "key": "Report.AdditionalDetailsText", + "value": "Вы можете указать дополнительную информацию в комментарии." + }, + "Report.Report": { + "key": "Report.Report", + "value": "Пожаловаться" + }, + "Report.Succeed": { + "key": "Report.Succeed", + "value": "Вашу жалобу проверят модераторы. Спасибо!" + }, + "ReportGroupLocation.Report": { + "key": "ReportGroupLocation.Report", + "value": "Сообщить" + }, + "ReportGroupLocation.Text": { + "key": "ReportGroupLocation.Text", + "value": "Пожалуйста, сообщите нам, если группа никак не связана с местом, где Вы находитесь." + }, + "ReportGroupLocation.Title": { + "key": "ReportGroupLocation.Title", + "value": "Жалоба на группу" + }, + "ReportPeer.AlertSuccess": { + "key": "ReportPeer.AlertSuccess", + "value": "Спасибо!\nВаша жалоба отправлена на проверку." + }, + "ReportPeer.ReasonChildAbuse": { + "key": "ReportPeer.ReasonChildAbuse", + "value": "Детская порнография" + }, + "ReportPeer.ReasonCopyright": { + "key": "ReportPeer.ReasonCopyright", + "value": "Авторские права" + }, + "ReportPeer.ReasonFake": { + "key": "ReportPeer.ReasonFake", + "value": "Ненастоящий аккаунт" + }, + "ReportPeer.ReasonOther": { + "key": "ReportPeer.ReasonOther", + "value": "Другое" + }, + "ReportPeer.ReasonOther.Placeholder": { + "key": "ReportPeer.ReasonOther.Placeholder", + "value": "Описание" + }, + "ReportPeer.ReasonOther.Send": { + "key": "ReportPeer.ReasonOther.Send", + "value": "Отправить" + }, + "ReportPeer.ReasonOther.Title": { + "key": "ReportPeer.ReasonOther.Title", + "value": "Жалоба" + }, + "ReportPeer.ReasonPornography": { + "key": "ReportPeer.ReasonPornography", + "value": "Порнография" + }, + "ReportPeer.ReasonSpam": { + "key": "ReportPeer.ReasonSpam", + "value": "Спам" + }, + "ReportPeer.ReasonViolence": { + "key": "ReportPeer.ReasonViolence", + "value": "Насилие" + }, + "ReportPeer.Report": { + "key": "ReportPeer.Report", + "value": "Пожаловаться" + }, + "ReportSpam.DeleteThisChat": { + "key": "ReportSpam.DeleteThisChat", + "value": "Удалить чат" + }, + "Resolve.ErrorNotFound": { + "key": "Resolve.ErrorNotFound", + "value": "Похоже, такого пользователя не существует." + }, + "SaveIncomingPhotosSettings.From": { + "key": "SaveIncomingPhotosSettings.From", + "value": "СОХРАНЯТЬ ФОТОГРАФИИ" + }, + "SaveIncomingPhotosSettings.Title": { + "key": "SaveIncomingPhotosSettings.Title", + "value": "Полученные фото" + }, + "ScheduledMessages.BotActionUnavailable": { + "key": "ScheduledMessages.BotActionUnavailable", + "value": "Это действие будет доступно после публикации сообщения." + }, + "ScheduledMessages.ClearAll": { + "key": "ScheduledMessages.ClearAll", + "value": "Очистить всё" + }, + "ScheduledMessages.ClearAllConfirmation": { + "key": "ScheduledMessages.ClearAllConfirmation", + "value": "Очистить отложенные сообщения" + }, + "ScheduledMessages.Delete": { + "key": "ScheduledMessages.Delete", + "value": "Удалить сообщение" + }, + "ScheduledMessages.DeleteMany": { + "key": "ScheduledMessages.DeleteMany", + "value": "Удалить сообщения" + }, + "ScheduledMessages.EditTime": { + "key": "ScheduledMessages.EditTime", + "value": "Изменить время" + }, + "ScheduledMessages.EmptyPlaceholder": { + "key": "ScheduledMessages.EmptyPlaceholder", + "value": "Здесь пока нет отложенных сообщений..." + }, + "ScheduledMessages.PollUnavailable": { + "key": "ScheduledMessages.PollUnavailable", + "value": "Голосование будет доступно после публикации сообщения." + }, + "ScheduledMessages.ReminderNotification": { + "key": "ScheduledMessages.ReminderNotification", + "value": "📅 Напоминание" + }, + "ScheduledMessages.RemindersTitle": { + "key": "ScheduledMessages.RemindersTitle", + "value": "Напоминания" + }, + "ScheduledMessages.ScheduledDate": { + "key": "ScheduledMessages.ScheduledDate", + "value": "Отправка %@" + }, + "ScheduledMessages.ScheduledOnline": { + "key": "ScheduledMessages.ScheduledOnline", + "value": "Отправка при появлении в сети" + }, + "ScheduledMessages.ScheduledToday": { + "key": "ScheduledMessages.ScheduledToday", + "value": "Отправка сегодня" + }, + "ScheduledMessages.SendNow": { + "key": "ScheduledMessages.SendNow", + "value": "Отправить сейчас" + }, + "ScheduledMessages.Title": { + "key": "ScheduledMessages.Title", + "value": "Отложенная отправка" + }, + "SearchImages.NoImagesFound": { + "key": "SearchImages.NoImagesFound", + "value": "Изображения не найдены" + }, + "SearchImages.Title": { + "key": "SearchImages.Title", + "value": "Альбомы" + }, + "SecretChat.Title": { + "key": "SecretChat.Title", + "value": "Секретный чат" + }, + "SecretGIF.NotViewedYet": { + "key": "SecretGIF.NotViewedYet", + "value": "%@ ещё не просмотрел(а) этот GIF" + }, + "SecretGif.Title": { + "key": "SecretGif.Title", + "value": "Исчезающий GIF" + }, + "SecretImage.NotViewedYet": { + "key": "SecretImage.NotViewedYet", + "value": "%@ ещё не посмотрел(а) это фото" + }, + "SecretImage.Title": { + "key": "SecretImage.Title", + "value": "Исчезающее фото" + }, + "SecretTimer.ImageDescription": { + "key": "SecretTimer.ImageDescription", + "value": "Если Вы поставите таймер, фотография самоуничтожится после просмотра." + }, + "SecretTimer.VideoDescription": { + "key": "SecretTimer.VideoDescription", + "value": "Если Вы поставите таймер, видео самоуничтожится после просмотра." + }, + "SecretVideo.NotViewedYet": { + "key": "SecretVideo.NotViewedYet", + "value": "%@ ещё не воспроизвел(а) это видео" + }, + "SecretVideo.Title": { + "key": "SecretVideo.Title", + "value": "Исчезающее видео" + }, + "ServiceMessage.GameScoreExtended": { + "key": "ServiceMessage.GameScoreExtended", + "zeroValue": null, + "oneValue": "{name} набрал(а) %@ очко в {game}", + "twoValue": null, + "fewValue": "{name} набрал(а) %@ очка в {game}", + "manyValue": "{name} набрал(а) %@ очков в {game}", + "otherValue": "{name} набрал(а) %@ очков в {game}" + }, + "ServiceMessage.GameScoreSelfExtended": { + "key": "ServiceMessage.GameScoreSelfExtended", + "zeroValue": null, + "oneValue": "Вы набрали %@ очко в {game}", + "twoValue": null, + "fewValue": "Вы набрали %@ очка в {game}", + "manyValue": "Вы набрали %@ очков в {game}", + "otherValue": "Вы набрали %@ очков в {game}" + }, + "ServiceMessage.GameScoreSelfSimple": { + "key": "ServiceMessage.GameScoreSelfSimple", + "zeroValue": null, + "oneValue": "Вы набрали %@", + "twoValue": null, + "fewValue": "Вы набрали %@", + "manyValue": "Вы набрали %@", + "otherValue": "Вы набрали %@" + }, + "ServiceMessage.GameScoreSimple": { + "key": "ServiceMessage.GameScoreSimple", + "zeroValue": null, + "oneValue": "{name} набрал(а) %@", + "twoValue": null, + "fewValue": "{name} набрал(а) %@", + "manyValue": "{name} набрал(а) %@", + "otherValue": "{name} набрал(а) %@" + }, + "Settings.About": { + "key": "Settings.About", + "value": "О себе" + }, + "Settings.About.Help": { + "key": "Settings.About.Help", + "value": "Любые подробности, например: возраст, род занятий или город.\nПример: 23 года, дизайнер из Санкт-Петербурга." + }, + "Settings.About.Title": { + "key": "Settings.About.Title", + "value": "О себе" + }, + "Settings.AboutEmpty": { + "key": "Settings.AboutEmpty", + "value": "Добавить" + }, + "Settings.AddAccount": { + "key": "Settings.AddAccount", + "value": "Добавить аккаунт" + }, + "Settings.AddAnotherAccount": { + "key": "Settings.AddAnotherAccount", + "value": "Добавить аккаунт" + }, + "Settings.AddAnotherAccount.Help": { + "key": "Settings.AddAnotherAccount.Help", + "value": "Вы можете выбрать до трёх аккаунтов с разными номерами телефона." + }, + "Settings.AddDevice": { + "key": "Settings.AddDevice", + "value": "QR-код" + }, + "Settings.AppLanguage": { + "key": "Settings.AppLanguage", + "value": "Язык" + }, + "Settings.AppLanguage.Unofficial": { + "key": "Settings.AppLanguage.Unofficial", + "value": "НЕОФИЦИАЛЬНЫЕ" + }, + "Settings.Appearance": { + "key": "Settings.Appearance", + "value": "Оформление" + }, + "Settings.AppleWatch": { + "key": "Settings.AppleWatch", + "value": "Apple Watch" + }, + "Settings.ApplyProxyAlert": { + "key": "Settings.ApplyProxyAlert", + "value": "Хотите включить этот прокси?\nСервер: %1$@\nПорт: %2$@\n\nВы можете изменить прокси-сервер позднее в настройках > Данные и память." + }, + "Settings.ApplyProxyAlertCredentials": { + "key": "Settings.ApplyProxyAlertCredentials", + "value": "Хотите включить этот прокси?\nСервер: %1$@\nПорт: %2$@\nЛогин: %3$@\nПароль: %4$@\n\nВы можете изменить прокси-сервер позднее в настройках > Данные и память." + }, + "Settings.ApplyProxyAlertEnable": { + "key": "Settings.ApplyProxyAlertEnable", + "value": "Включить" + }, + "Settings.BlockedUsers": { + "key": "Settings.BlockedUsers", + "value": "Чёрный список" + }, + "Settings.CallSettings": { + "key": "Settings.CallSettings", + "value": "Звонки" + }, + "Settings.CancelUpload": { + "key": "Settings.CancelUpload", + "value": "Отменить загрузку" + }, + "Settings.ChangePhoneNumber": { + "key": "Settings.ChangePhoneNumber", + "value": "Изменить номер" + }, + "Settings.ChatBackground": { + "key": "Settings.ChatBackground", + "value": "Фон для чатов" + }, + "Settings.ChatFolders": { + "key": "Settings.ChatFolders", + "value": "Папки с чатами" + }, + "Settings.ChatSettings": { + "key": "Settings.ChatSettings", + "value": "Данные и память" + }, + "Settings.CheckPhoneNumberText": { + "key": "Settings.CheckPhoneNumberText", + "value": "Чтобы Вы всегда могли зайти в Telegram, важно указать актуальный номер телефона. [Подробнее]()" + }, + "Settings.CheckPhoneNumberTitle": { + "key": "Settings.CheckPhoneNumberTitle", + "value": "Ваш номер телефона — %@?" + }, + "Settings.Context.Logout": { + "key": "Settings.Context.Logout", + "value": "Выйти" + }, + "Settings.CopyPhoneNumber": { + "key": "Settings.CopyPhoneNumber", + "value": "Копировать телефон" + }, + "Settings.CopyUsername": { + "key": "Settings.CopyUsername", + "value": "Копировать имя пользователя" + }, + "Settings.Devices": { + "key": "Settings.Devices", + "value": "Устройства" + }, + "Settings.EditAccount": { + "key": "Settings.EditAccount", + "value": "Изменить аккаунт" + }, + "Settings.EditPhoto": { + "key": "Settings.EditPhoto", + "value": "Изм." + }, + "Settings.EditProfileMedia": { + "key": "Settings.EditProfileMedia", + "value": "Правка" + }, + "Settings.EditVideo": { + "key": "Settings.EditVideo", + "value": "Изм." + }, + "Settings.FAQ": { + "key": "Settings.FAQ", + "value": "Вопросы о Telegram" + }, + "Settings.FAQ_Button": { + "key": "Settings.FAQ_Button", + "value": "Ответы" + }, + "Settings.FAQ_Intro": { + "key": "Settings.FAQ_Intro", + "value": "Пожалуйста, обратите внимание, что в поддержке Telegram отвечают волонтеры. Мы постараемся помочь как можно быстрее, но ожидание может занять время.\n\nПожалуйста, ознакомьтесь с часто задаваемыми вопросами о Telegram: там Вы найдёте ответы на большинство вопросов и важные советы по устранению неполадок." + }, + "Settings.FAQ_URL": { + "key": "Settings.FAQ_URL", + "value": "https://telegram.org/faq#general-questions" + }, + "Settings.FrequentlyAskedQuestions": { + "key": "Settings.FrequentlyAskedQuestions", + "value": "Часто задаваемые вопросы" + }, + "Settings.KeepPhoneNumber": { + "key": "Settings.KeepPhoneNumber", + "value": "Оставить %@" + }, + "Settings.Logout": { + "key": "Settings.Logout", + "value": "Выйти" + }, + "Settings.LogoutConfirmationText": { + "key": "Settings.LogoutConfirmationText", + "value": "Вы можете пользоваться Telegram на всех Ваших устройствах одновременно.\n\nВажно: если Вы выйдете из аккаунта, все секретные чаты на этом устройстве будут утеряны." + }, + "Settings.LogoutConfirmationTitle": { + "key": "Settings.LogoutConfirmationTitle", + "value": "Выйти?" + }, + "Settings.NotificationsAndSounds": { + "key": "Settings.NotificationsAndSounds", + "value": "Уведомления и звуки" + }, + "Settings.Passport": { + "key": "Settings.Passport", + "value": "Telegram Passport" + }, + "Settings.PhoneNumber": { + "key": "Settings.PhoneNumber", + "value": "Сменить номер" + }, + "Settings.PrivacySettings": { + "key": "Settings.PrivacySettings", + "value": "Конфиденциальность" + }, + "Settings.Proxy": { + "key": "Settings.Proxy", + "value": "Прокси" + }, + "Settings.ProxyConnected": { + "key": "Settings.ProxyConnected", + "value": "Подключен" + }, + "Settings.ProxyConnecting": { + "key": "Settings.ProxyConnecting", + "value": "Соединение..." + }, + "Settings.ProxyDisabled": { + "key": "Settings.ProxyDisabled", + "value": "Отключен" + }, + "Settings.RemoveConfirmation": { + "key": "Settings.RemoveConfirmation", + "value": "Удалить" + }, + "Settings.RemoveVideo": { + "key": "Settings.RemoveVideo", + "value": "Удалить видео" + }, + "Settings.SaveEditedPhotos": { + "key": "Settings.SaveEditedPhotos", + "value": "Сохранять отред. фото" + }, + "Settings.SaveIncomingPhotos": { + "key": "Settings.SaveIncomingPhotos", + "value": "Сохранять полученные фото" + }, + "Settings.SavedMessages": { + "key": "Settings.SavedMessages", + "value": "Избранное" + }, + "Settings.Search": { + "key": "Settings.Search", + "value": "Поиск" + }, + "Settings.SetNewProfilePhotoOrVideo": { + "key": "Settings.SetNewProfilePhotoOrVideo", + "value": "Новое фото или видео" + }, + "Settings.SetProfilePhoto": { + "key": "Settings.SetProfilePhoto", + "value": "Изменить мою фотографию" + }, + "Settings.SetProfilePhotoOrVideo": { + "key": "Settings.SetProfilePhotoOrVideo", + "value": "Загрузить фото или видео" + }, + "Settings.SetUsername": { + "key": "Settings.SetUsername", + "value": "Выбрать имя пользователя" + }, + "Settings.Support": { + "key": "Settings.Support", + "value": "Помощь" + }, + "Settings.Title": { + "key": "Settings.Title", + "value": "Настройки" + }, + "Settings.Username": { + "key": "Settings.Username", + "value": "Имя пользователя" + }, + "Settings.UsernameEmpty": { + "key": "Settings.UsernameEmpty", + "value": "Добавить" + }, + "Settings.ViewPhoto": { + "key": "Settings.ViewPhoto", + "value": "Посмотреть фото" + }, + "Settings.ViewVideo": { + "key": "Settings.ViewVideo", + "value": "Посмотреть видео" + }, + "SettingsSearch.FAQ": { + "key": "SettingsSearch.FAQ", + "value": "FAQ" + }, + "SettingsSearch.Synonyms.AppLanguage": { + "key": "SettingsSearch.Synonyms.AppLanguage", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.Animations": { + "key": "SettingsSearch.Synonyms.Appearance.Animations", + "value": "Анимации" + }, + "SettingsSearch.Synonyms.Appearance.AutoNightTheme": { + "key": "SettingsSearch.Synonyms.Appearance.AutoNightTheme", + "value": "Автоматическая смена темы ночью" + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground", + "value": "Фон чатов" + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground.Custom": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground.Custom", + "value": "Свой фон" + }, + "SettingsSearch.Synonyms.Appearance.ChatBackground.SetColor": { + "key": "SettingsSearch.Synonyms.Appearance.ChatBackground.SetColor", + "value": "Выбрать цвет фона" + }, + "SettingsSearch.Synonyms.Appearance.ColorTheme": { + "key": "SettingsSearch.Synonyms.Appearance.ColorTheme", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.LargeEmoji": { + "key": "SettingsSearch.Synonyms.Appearance.LargeEmoji", + "value": " " + }, + "SettingsSearch.Synonyms.Appearance.TextSize": { + "key": "SettingsSearch.Synonyms.Appearance.TextSize", + "value": "Шрифт крупнее" + }, + "SettingsSearch.Synonyms.Appearance.Title": { + "key": "SettingsSearch.Synonyms.Appearance.Title", + "value": "Оформление" + }, + "SettingsSearch.Synonyms.Calls.CallTab": { + "key": "SettingsSearch.Synonyms.Calls.CallTab", + "value": " " + }, + "SettingsSearch.Synonyms.Calls.Title": { + "key": "SettingsSearch.Synonyms.Calls.Title", + "value": " " + }, + "SettingsSearch.Synonyms.ChatSettings.IntentsSettings": { + "key": "SettingsSearch.Synonyms.ChatSettings.IntentsSettings", + "value": "Предложения Siri" + }, + "SettingsSearch.Synonyms.ChatSettings.OpenLinksIn": { + "key": "SettingsSearch.Synonyms.ChatSettings.OpenLinksIn", + "value": "Браузер" + }, + "SettingsSearch.Synonyms.Data.AutoDownloadReset": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadReset", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoDownloadUsingCellular": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadUsingCellular", + "value": "Мобильный интернет\nМобильная сеть" + }, + "SettingsSearch.Synonyms.Data.AutoDownloadUsingWifi": { + "key": "SettingsSearch.Synonyms.Data.AutoDownloadUsingWifi", + "value": " " + }, + "SettingsSearch.Synonyms.Data.AutoplayGifs": { + "key": "SettingsSearch.Synonyms.Data.AutoplayGifs", + "value": "Автозапуск анимации" + }, + "SettingsSearch.Synonyms.Data.AutoplayVideos": { + "key": "SettingsSearch.Synonyms.Data.AutoplayVideos", + "value": "Автозапуск видеозаписей" + }, + "SettingsSearch.Synonyms.Data.CallsUseLessData": { + "key": "SettingsSearch.Synonyms.Data.CallsUseLessData", + "value": " " + }, + "SettingsSearch.Synonyms.Data.DownloadInBackground": { + "key": "SettingsSearch.Synonyms.Data.DownloadInBackground", + "value": "Загружать в фоне" + }, + "SettingsSearch.Synonyms.Data.NetworkUsage": { + "key": "SettingsSearch.Synonyms.Data.NetworkUsage", + "value": " " + }, + "SettingsSearch.Synonyms.Data.SaveEditedPhotos": { + "key": "SettingsSearch.Synonyms.Data.SaveEditedPhotos", + "value": "Отредактированные фотографии\nПри редактировании\nПосле редактора" + }, + "SettingsSearch.Synonyms.Data.SaveIncomingPhotos": { + "key": "SettingsSearch.Synonyms.Data.SaveIncomingPhotos", + "value": "Фотографии из входящих в Галерею" + }, + "SettingsSearch.Synonyms.Data.Storage.ClearCache": { + "key": "SettingsSearch.Synonyms.Data.Storage.ClearCache", + "value": "Удалить кеш" + }, + "SettingsSearch.Synonyms.Data.Storage.KeepMedia": { + "key": "SettingsSearch.Synonyms.Data.Storage.KeepMedia", + "value": "сохранять мультимедиа\nвремя хранения медиа\nавтоматически чистить кеш через\nудалять кэш спустя" + }, + "SettingsSearch.Synonyms.Data.Storage.Title": { + "key": "SettingsSearch.Synonyms.Data.Storage.Title", + "value": "Кэш\nКеш\nМесто\nХранилище\nДиск" + }, + "SettingsSearch.Synonyms.Data.Title": { + "key": "SettingsSearch.Synonyms.Data.Title", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.AddAccount": { + "key": "SettingsSearch.Synonyms.EditProfile.AddAccount", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Bio": { + "key": "SettingsSearch.Synonyms.EditProfile.Bio", + "value": "Био\nБиография\nСтатус" + }, + "SettingsSearch.Synonyms.EditProfile.Logout": { + "key": "SettingsSearch.Synonyms.EditProfile.Logout", + "value": "Выход\nРазлогиниться" + }, + "SettingsSearch.Synonyms.EditProfile.PhoneNumber": { + "key": "SettingsSearch.Synonyms.EditProfile.PhoneNumber", + "value": " " + }, + "SettingsSearch.Synonyms.EditProfile.Title": { + "key": "SettingsSearch.Synonyms.EditProfile.Title", + "value": "Редактировать информацию" + }, + "SettingsSearch.Synonyms.EditProfile.Username": { + "key": "SettingsSearch.Synonyms.EditProfile.Username", + "value": "Юзернейм\nПубличный адрес" + }, + "SettingsSearch.Synonyms.FAQ": { + "key": "SettingsSearch.Synonyms.FAQ", + "value": "Ответы на частые распространенные вопросы о Telegram\nСправка\nПомощь\nИнформация" + }, + "SettingsSearch.Synonyms.Notifications.BadgeCountUnreadMessages": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeCountUnreadMessages", + "value": "Учитывать в счетчике непрочитанные сообщения" + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChannels": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChannels", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChats": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedChats", + "value": "Учитывать в счетчике замьюченные беседы" + }, + "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedPublicGroups": { + "key": "SettingsSearch.Synonyms.Notifications.BadgeIncludeMutedPublicGroups", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsAlert", + "value": "Сигнал о новом сообщении в каналах" + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsExceptions", + "value": "Уведомления от каналов" + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsPreview", + "value": "Предпросмотр текста\nПревью" + }, + "SettingsSearch.Synonyms.Notifications.ChannelNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.ChannelNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ContactJoined": { + "key": "SettingsSearch.Synonyms.Notifications.ContactJoined", + "value": "Теперь пользуется" + }, + "SettingsSearch.Synonyms.Notifications.DisplayNamesOnLockScreen": { + "key": "SettingsSearch.Synonyms.Notifications.DisplayNamesOnLockScreen", + "value": "Показывать отправителей" + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsAlert", + "value": "Сигнал о новом сообщении в групповых чатах" + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsExceptions", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsPreview", + "value": "Предпросмотр текста\nПревью" + }, + "SettingsSearch.Synonyms.Notifications.GroupNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.GroupNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsPreview", + "value": "Превью\nПредпросмотр сообщений" + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.InAppNotificationsVibrate": { + "key": "SettingsSearch.Synonyms.Notifications.InAppNotificationsVibrate", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsAlert": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsAlert", + "value": "Сигнал о новом сообщении" + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsExceptions": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsExceptions", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsPreview": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsPreview", + "value": "Предпросмотр текста\nПревью" + }, + "SettingsSearch.Synonyms.Notifications.MessageNotificationsSound": { + "key": "SettingsSearch.Synonyms.Notifications.MessageNotificationsSound", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.ResetAllNotifications": { + "key": "SettingsSearch.Synonyms.Notifications.ResetAllNotifications", + "value": " " + }, + "SettingsSearch.Synonyms.Notifications.Title": { + "key": "SettingsSearch.Synonyms.Notifications.Title", + "value": "Оповещения" + }, + "SettingsSearch.Synonyms.Passport": { + "key": "SettingsSearch.Synonyms.Passport", + "value": "Паспорт" + }, + "SettingsSearch.Synonyms.Privacy.AuthSessions": { + "key": "SettingsSearch.Synonyms.Privacy.AuthSessions", + "value": "Показать сессии с других устройств" + }, + "SettingsSearch.Synonyms.Privacy.BlockedUsers": { + "key": "SettingsSearch.Synonyms.Privacy.BlockedUsers", + "value": "Заблокированные пользователи" + }, + "SettingsSearch.Synonyms.Privacy.Calls": { + "key": "SettingsSearch.Synonyms.Privacy.Calls", + "value": " Кто может звонить" + }, + "SettingsSearch.Synonyms.Privacy.Data.ClearPaymentsInfo": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ClearPaymentsInfo", + "value": "Стереть банковскую информацию и адрес доставки" + }, + "SettingsSearch.Synonyms.Privacy.Data.ContactsReset": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ContactsReset", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.ContactsSync": { + "key": "SettingsSearch.Synonyms.Privacy.Data.ContactsSync", + "value": "Не импортировать контакты из телефона" + }, + "SettingsSearch.Synonyms.Privacy.Data.DeleteDrafts": { + "key": "SettingsSearch.Synonyms.Privacy.Data.DeleteDrafts", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.SecretChatLinkPreview": { + "key": "SettingsSearch.Synonyms.Privacy.Data.SecretChatLinkPreview", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.Title": { + "key": "SettingsSearch.Synonyms.Privacy.Data.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Privacy.Data.TopPeers": { + "key": "SettingsSearch.Synonyms.Privacy.Data.TopPeers", + "value": "Популярные контакты" + }, + "SettingsSearch.Synonyms.Privacy.DeleteAccountIfAwayFor": { + "key": "SettingsSearch.Synonyms.Privacy.DeleteAccountIfAwayFor", + "value": "Самоуничтожение аккаунта\nАвтоудаление\nПри неактивности" + }, + "SettingsSearch.Synonyms.Privacy.Forwards": { + "key": "SettingsSearch.Synonyms.Privacy.Forwards", + "value": "Ссылка в пересланных сообщениях" + }, + "SettingsSearch.Synonyms.Privacy.GroupsAndChannels": { + "key": "SettingsSearch.Synonyms.Privacy.GroupsAndChannels", + "value": "Приглашения\nДобавлять в группы\nПодписывать на каналы" + }, + "SettingsSearch.Synonyms.Privacy.LastSeen": { + "key": "SettingsSearch.Synonyms.Privacy.LastSeen", + "value": "Скрыть время последнего входа\nКогда заходил\nБыл в сети\nКто видит онлайн" + }, + "SettingsSearch.Synonyms.Privacy.Passcode": { + "key": "SettingsSearch.Synonyms.Privacy.Passcode", + "value": "Пин-код\nЗалочить" + }, + "SettingsSearch.Synonyms.Privacy.PasscodeAndFaceId": { + "key": "SettingsSearch.Synonyms.Privacy.PasscodeAndFaceId", + "value": "Пин-код\nЗалочить" + }, + "SettingsSearch.Synonyms.Privacy.PasscodeAndTouchId": { + "key": "SettingsSearch.Synonyms.Privacy.PasscodeAndTouchId", + "value": "Пин-код\nЗалочить" + }, + "SettingsSearch.Synonyms.Privacy.ProfilePhoto": { + "key": "SettingsSearch.Synonyms.Privacy.ProfilePhoto", + "value": "Скрыть аватарку\nКто видит фото" + }, + "SettingsSearch.Synonyms.Privacy.Title": { + "key": "SettingsSearch.Synonyms.Privacy.Title", + "value": "Приватность\nБезопасность" + }, + "SettingsSearch.Synonyms.Privacy.TwoStepAuth": { + "key": "SettingsSearch.Synonyms.Privacy.TwoStepAuth", + "value": "Двухэтапная аутентификация\nДвухфакторная авторизация\nПароль\n2ФА\n2FA" + }, + "SettingsSearch.Synonyms.Proxy.AddProxy": { + "key": "SettingsSearch.Synonyms.Proxy.AddProxy", + "value": "Сервер proxy" + }, + "SettingsSearch.Synonyms.Proxy.Title": { + "key": "SettingsSearch.Synonyms.Proxy.Title", + "value": "SOCKS5\nMTProto" + }, + "SettingsSearch.Synonyms.Proxy.UseForCalls": { + "key": "SettingsSearch.Synonyms.Proxy.UseForCalls", + "value": " " + }, + "SettingsSearch.Synonyms.SavedMessages": { + "key": "SettingsSearch.Synonyms.SavedMessages", + "value": "Сохраненные сообщения\nЗакладки\nОблачное хранилище" + }, + "SettingsSearch.Synonyms.Stickers.ArchivedPacks": { + "key": "SettingsSearch.Synonyms.Stickers.ArchivedPacks", + "value": "Старые стикеры" + }, + "SettingsSearch.Synonyms.Stickers.FeaturedPacks": { + "key": "SettingsSearch.Synonyms.Stickers.FeaturedPacks", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.Masks": { + "key": "SettingsSearch.Synonyms.Stickers.Masks", + "value": " " + }, + "SettingsSearch.Synonyms.Stickers.SuggestStickers": { + "key": "SettingsSearch.Synonyms.Stickers.SuggestStickers", + "value": "Предлагать стикеры по эмоджи\nПодсказывать по смайлам" + }, + "SettingsSearch.Synonyms.Stickers.Title": { + "key": "SettingsSearch.Synonyms.Stickers.Title", + "value": " " + }, + "SettingsSearch.Synonyms.Support": { + "key": "SettingsSearch.Synonyms.Support", + "value": "Поддержка\nПомощь\nТехподдержка\nВолонтеры\nВолонтёры\nЗадать вопрос" + }, + "SettingsSearch.Synonyms.Watch": { + "key": "SettingsSearch.Synonyms.Watch", + "value": "Apple Watch" + }, + "Share.AuthDescription": { + "key": "Share.AuthDescription", + "value": "Чтобы поделиться, войдите в свой аккаунт в Telegram." + }, + "Share.AuthTitle": { + "key": "Share.AuthTitle", + "value": "Войти в Telegram" + }, + "Share.MultipleMessagesDisabled": { + "key": "Share.MultipleMessagesDisabled", + "value": "Включён медленный режим. Вы не можете отправить несколько сообщений за раз." + }, + "Share.Title": { + "key": "Share.Title", + "value": "Поделиться" + }, + "ShareFileTip.CloseTip": { + "key": "ShareFileTip.CloseTip", + "value": "Закрыть подсказку" + }, + "ShareFileTip.Text": { + "key": "ShareFileTip.Text", + "value": "Здесь Вы можете отправлять фото и видео **без сжатия** прямо из фотопотока.\n\nЧтобы отправить файл другого типа, откройте его на своём %@ (например, в браузере), нажмите **«Открыть в…»** либо иконку действий и выберите Telegram." + }, + "ShareFileTip.Title": { + "key": "ShareFileTip.Title", + "value": "Отправка файлов" + }, + "ShareMenu.Comment": { + "key": "ShareMenu.Comment", + "value": "Оставьте комментарий..." + }, + "ShareMenu.CopyShareLink": { + "key": "ShareMenu.CopyShareLink", + "value": "Скопировать ссылку" + }, + "ShareMenu.CopyShareLinkGame": { + "key": "ShareMenu.CopyShareLinkGame", + "value": "Копировать ссылку на игру" + }, + "ShareMenu.SelectChats": { + "key": "ShareMenu.SelectChats", + "value": "Выберите чаты" + }, + "ShareMenu.Send": { + "key": "ShareMenu.Send", + "value": "Отправить" + }, + "ShareMenu.ShareTo": { + "key": "ShareMenu.ShareTo", + "value": "Отправить" + }, + "SharedMedia.CategoryDocs": { + "key": "SharedMedia.CategoryDocs", + "value": "Файлы" + }, + "SharedMedia.CategoryLinks": { + "key": "SharedMedia.CategoryLinks", + "value": "Ссылки" + }, + "SharedMedia.CategoryMedia": { + "key": "SharedMedia.CategoryMedia", + "value": "Медиа" + }, + "SharedMedia.CategoryOther": { + "key": "SharedMedia.CategoryOther", + "value": "Музыка" + }, + "SharedMedia.DeleteItemsConfirmation": { + "key": "SharedMedia.DeleteItemsConfirmation", + "zeroValue": null, + "oneValue": "Удалить %@ файл?", + "twoValue": null, + "fewValue": "Удалить %@ файла?", + "manyValue": "Удалить %@ файлов?", + "otherValue": "Удалить %@ файла?" + }, + "SharedMedia.EmptyFilesText": { + "key": "SharedMedia.EmptyFilesText", + "value": "Вы можете отправлять и получать\nфайлы любого типа, до 2 ГБ каждый,\nи смотреть их с любого устройства." + }, + "SharedMedia.EmptyLinksText": { + "key": "SharedMedia.EmptyLinksText", + "value": "Здесь будут показаны все ссылки, которыми поделились в этом чате" + }, + "SharedMedia.EmptyMusicText": { + "key": "SharedMedia.EmptyMusicText", + "value": "Здесь будет показана вся музыка, которой делились в этом чате." + }, + "SharedMedia.EmptyText": { + "key": "SharedMedia.EmptyText", + "value": "Этой скрепке очень грустно, ведь\nв этот чат ещё никто не отправлял\nфотографии или видео." + }, + "SharedMedia.EmptyTitle": { + "key": "SharedMedia.EmptyTitle", + "value": "Нет медиафайлов" + }, + "SharedMedia.File": { + "key": "SharedMedia.File", + "zeroValue": null, + "oneValue": "%@ файл", + "twoValue": null, + "fewValue": "%@ файла", + "manyValue": "%@ файлов", + "otherValue": "%@ файлов" + }, + "SharedMedia.Generic": { + "key": "SharedMedia.Generic", + "zeroValue": null, + "oneValue": " %@ медиафайл", + "twoValue": null, + "fewValue": "%@ медиафайла", + "manyValue": "%@ медиафайлов", + "otherValue": "%@ медиафайлов" + }, + "SharedMedia.Link": { + "key": "SharedMedia.Link", + "zeroValue": null, + "oneValue": "%@ ссылка", + "twoValue": null, + "fewValue": "%@ ссылки", + "manyValue": "%@ ссылок", + "otherValue": "%@ ссылок" + }, + "SharedMedia.Photo": { + "key": "SharedMedia.Photo", + "zeroValue": null, + "oneValue": "%@ фотография", + "twoValue": null, + "fewValue": "%@ фотографии", + "manyValue": "%@ фотографий", + "otherValue": "%@ фотографий" + }, + "SharedMedia.SearchNoResults": { + "key": "SharedMedia.SearchNoResults", + "value": "Нет результатов" + }, + "SharedMedia.SearchNoResultsDescription": { + "key": "SharedMedia.SearchNoResultsDescription", + "value": "По запросу «%@» ничего не найдено.\nПопробуйте снова." + }, + "SharedMedia.TitleAll": { + "key": "SharedMedia.TitleAll", + "value": "Медиа" + }, + "SharedMedia.Video": { + "key": "SharedMedia.Video", + "zeroValue": null, + "oneValue": "%@ видео", + "twoValue": null, + "fewValue": "%@ видео", + "manyValue": "%@ видео", + "otherValue": "%@ видео" + }, + "SharedMedia.ViewInChat": { + "key": "SharedMedia.ViewInChat", + "value": "Просмотреть в чате" + }, + "Shortcut.SwitchAccount": { + "key": "Shortcut.SwitchAccount", + "value": "Сменить аккаунт" + }, + "SocksProxySetup.AdNoticeHelp": { + "key": "SocksProxySetup.AdNoticeHelp", + "value": "Этот прокси-сервер может показывать спонсорский канал в списке ваших чатов. Это не раскрывает ваш трафик." + }, + "SocksProxySetup.AddProxy": { + "key": "SocksProxySetup.AddProxy", + "value": "Добавить прокси" + }, + "SocksProxySetup.AddProxyTitle": { + "key": "SocksProxySetup.AddProxyTitle", + "value": "Добавить прокси" + }, + "SocksProxySetup.ConnectAndSave": { + "key": "SocksProxySetup.ConnectAndSave", + "value": "Подключить прокси" + }, + "SocksProxySetup.Connecting": { + "key": "SocksProxySetup.Connecting", + "value": "Соединение..." + }, + "SocksProxySetup.Connection": { + "key": "SocksProxySetup.Connection", + "value": "СОЕДИНЕНИЕ" + }, + "SocksProxySetup.Credentials": { + "key": "SocksProxySetup.Credentials", + "value": "УЧЕТНЫЕ ДАННЫЕ (НЕОБЯЗАТЕЛЬНО)" + }, + "SocksProxySetup.FailedToConnect": { + "key": "SocksProxySetup.FailedToConnect", + "value": "Не удалось соединиться" + }, + "SocksProxySetup.Hostname": { + "key": "SocksProxySetup.Hostname", + "value": "Сервер" + }, + "SocksProxySetup.HostnamePlaceholder": { + "key": "SocksProxySetup.HostnamePlaceholder", + "value": "Сервер" + }, + "SocksProxySetup.Password": { + "key": "SocksProxySetup.Password", + "value": "Пароль" + }, + "SocksProxySetup.PasswordPlaceholder": { + "key": "SocksProxySetup.PasswordPlaceholder", + "value": "Пароль" + }, + "SocksProxySetup.PasteFromClipboard": { + "key": "SocksProxySetup.PasteFromClipboard", + "value": "Вставить из буфера обмена" + }, + "SocksProxySetup.Port": { + "key": "SocksProxySetup.Port", + "value": "Порт" + }, + "SocksProxySetup.PortPlaceholder": { + "key": "SocksProxySetup.PortPlaceholder", + "value": "Порт" + }, + "SocksProxySetup.ProxyDetailsTitle": { + "key": "SocksProxySetup.ProxyDetailsTitle", + "value": "Настройки подключения" + }, + "SocksProxySetup.ProxyEnabled": { + "key": "SocksProxySetup.ProxyEnabled", + "value": "Прокси\nПодключен" + }, + "SocksProxySetup.ProxySocks5": { + "key": "SocksProxySetup.ProxySocks5", + "value": "SOCKS5" + }, + "SocksProxySetup.ProxyStatusChecking": { + "key": "SocksProxySetup.ProxyStatusChecking", + "value": "проверка..." + }, + "SocksProxySetup.ProxyStatusConnected": { + "key": "SocksProxySetup.ProxyStatusConnected", + "value": "подключен" + }, + "SocksProxySetup.ProxyStatusConnecting": { + "key": "SocksProxySetup.ProxyStatusConnecting", + "value": "соединение" + }, + "SocksProxySetup.ProxyStatusPing": { + "key": "SocksProxySetup.ProxyStatusPing", + "value": "пинг %@ мс" + }, + "SocksProxySetup.ProxyStatusUnavailable": { + "key": "SocksProxySetup.ProxyStatusUnavailable", + "value": "недоступен" + }, + "SocksProxySetup.ProxyTelegram": { + "key": "SocksProxySetup.ProxyTelegram", + "value": "MTProto" + }, + "SocksProxySetup.ProxyType": { + "key": "SocksProxySetup.ProxyType", + "value": "ТИП" + }, + "SocksProxySetup.RequiredCredentials": { + "key": "SocksProxySetup.RequiredCredentials", + "value": "УЧЕТНЫЕ ДАННЫЕ" + }, + "SocksProxySetup.SaveProxy": { + "key": "SocksProxySetup.SaveProxy", + "value": "Сохранить прокси" + }, + "SocksProxySetup.SavedProxies": { + "key": "SocksProxySetup.SavedProxies", + "value": "СОХРАНЕННЫЕ ПРОКСИ" + }, + "SocksProxySetup.Secret": { + "key": "SocksProxySetup.Secret", + "value": "Ключ" + }, + "SocksProxySetup.SecretPlaceholder": { + "key": "SocksProxySetup.SecretPlaceholder", + "value": "Ключ" + }, + "SocksProxySetup.ShareLink": { + "key": "SocksProxySetup.ShareLink", + "value": "Поделиться ссылкой" + }, + "SocksProxySetup.ShareProxyList": { + "key": "SocksProxySetup.ShareProxyList", + "value": "Поделиться списком прокси" + }, + "SocksProxySetup.ShareQRCode": { + "key": "SocksProxySetup.ShareQRCode", + "value": "Поделиться QR-кодом" + }, + "SocksProxySetup.ShareQRCodeInfo": { + "key": "SocksProxySetup.ShareQRCodeInfo", + "value": "Чтобы добавить этот прокси, Вашим друзьям достаточно сканировать этот код камерой телефона или приложения." + }, + "SocksProxySetup.Status": { + "key": "SocksProxySetup.Status", + "value": "Статус" + }, + "SocksProxySetup.Title": { + "key": "SocksProxySetup.Title", + "value": "Прокси" + }, + "SocksProxySetup.TypeNone": { + "key": "SocksProxySetup.TypeNone", + "value": "Выключено" + }, + "SocksProxySetup.TypeSocks": { + "key": "SocksProxySetup.TypeSocks", + "value": "SOCKS5" + }, + "SocksProxySetup.UseForCalls": { + "key": "SocksProxySetup.UseForCalls", + "value": "Использовать для звонков" + }, + "SocksProxySetup.UseForCallsHelp": { + "key": "SocksProxySetup.UseForCallsHelp", + "value": "Использование прокси может ухудшить качество звонков." + }, + "SocksProxySetup.UseProxy": { + "key": "SocksProxySetup.UseProxy", + "value": "Использовать прокси" + }, + "SocksProxySetup.UseSocks5": { + "key": "SocksProxySetup.UseSocks5", + "value": "SOCKS5-прокси" + }, + "SocksProxySetup.Username": { + "key": "SocksProxySetup.Username", + "value": "Логин" + }, + "SocksProxySetup.UsernamePlaceholder": { + "key": "SocksProxySetup.UsernamePlaceholder", + "value": "Логин" + }, + "State.Connecting": { + "key": "State.Connecting", + "value": "Соединение..." + }, + "State.ConnectingToProxy": { + "key": "State.ConnectingToProxy", + "value": "Соединение с прокси..." + }, + "State.ConnectingToProxyInfo": { + "key": "State.ConnectingToProxyInfo", + "value": "нажмите для настроек" + }, + "State.Updating": { + "key": "State.Updating", + "value": "Обновление…" + }, + "State.WaitingForNetwork": { + "key": "State.WaitingForNetwork", + "value": "Ожидание сети" + }, + "State.connecting": { + "key": "State.connecting", + "value": "соединение" + }, + "Stats.EnabledNotifications": { + "key": "Stats.EnabledNotifications", + "value": "Уведомления включены" + }, + "Stats.Followers": { + "key": "Stats.Followers", + "value": "Подписчики" + }, + "Stats.FollowersBySourceTitle": { + "key": "Stats.FollowersBySourceTitle", + "value": "ИСТОЧНИКИ ПОДПИСЧИКОВ" + }, + "Stats.FollowersTitle": { + "key": "Stats.FollowersTitle", + "value": "ПОДПИСЧИКИ" + }, + "Stats.GroupActionsTitle": { + "key": "Stats.GroupActionsTitle", + "value": "ДЕЙСТВИЯ" + }, + "Stats.GroupGrowthTitle": { + "key": "Stats.GroupGrowthTitle", + "value": "РОСТ" + }, + "Stats.GroupLanguagesTitle": { + "key": "Stats.GroupLanguagesTitle", + "value": "ОСНОВНОЙ ЯЗЫК УЧАСТНИКОВ" + }, + "Stats.GroupMembers": { + "key": "Stats.GroupMembers", + "value": "Участники" + }, + "Stats.GroupMembersTitle": { + "key": "Stats.GroupMembersTitle", + "value": "УЧАСТНИКИ ГРУППЫ" + }, + "Stats.GroupMessages": { + "key": "Stats.GroupMessages", + "value": "Сообщения" + }, + "Stats.GroupMessagesTitle": { + "key": "Stats.GroupMessagesTitle", + "value": "СООБЩЕНИЯ" + }, + "Stats.GroupNewMembersBySourceTitle": { + "key": "Stats.GroupNewMembersBySourceTitle", + "value": "ИСТОЧНИКИ УЧАСТНИКОВ" + }, + "Stats.GroupOverview": { + "key": "Stats.GroupOverview", + "value": "ОБЩАЯ" + }, + "Stats.GroupPosters": { + "key": "Stats.GroupPosters", + "value": "Отправляли сообщения" + }, + "Stats.GroupShowMoreTopAdmins": { + "key": "Stats.GroupShowMoreTopAdmins", + "zeroValue": null, + "oneValue": "Показать ещё %@", + "twoValue": null, + "fewValue": "Показать ещё %@", + "manyValue": "Показать ещё %@", + "otherValue": "Показать ещё %@" + }, + "Stats.GroupShowMoreTopInviters": { + "key": "Stats.GroupShowMoreTopInviters", + "zeroValue": null, + "oneValue": "Показать ещё %@", + "twoValue": null, + "fewValue": "Показать ещё %@", + "manyValue": "Показать ещё %@", + "otherValue": "Показать ещё %@" + }, + "Stats.GroupShowMoreTopPosters": { + "key": "Stats.GroupShowMoreTopPosters", + "zeroValue": null, + "oneValue": "Показать ещё %@", + "twoValue": null, + "fewValue": "Показать ещё %@", + "manyValue": "Показать ещё %@", + "otherValue": "Показать ещё %@" + }, + "Stats.GroupTopAdmin.Actions": { + "key": "Stats.GroupTopAdmin.Actions", + "value": "Действия" + }, + "Stats.GroupTopAdmin.Promote": { + "key": "Stats.GroupTopAdmin.Promote", + "value": "Повысить" + }, + "Stats.GroupTopAdminBans": { + "key": "Stats.GroupTopAdminBans", + "zeroValue": null, + "oneValue": "%@ ограничение", + "twoValue": null, + "fewValue": "%@ ограничения", + "manyValue": "%@ ограничений", + "otherValue": "%@ ограничения" + }, + "Stats.GroupTopAdminDeletions": { + "key": "Stats.GroupTopAdminDeletions", + "zeroValue": null, + "oneValue": "%@ удаление", + "twoValue": null, + "fewValue": "%@ удаления", + "manyValue": "%@ удалений", + "otherValue": "%@ удаления" + }, + "Stats.GroupTopAdminKicks": { + "key": "Stats.GroupTopAdminKicks", + "zeroValue": null, + "oneValue": "%@ блокировка", + "twoValue": null, + "fewValue": "%@ блокировки", + "manyValue": "%@ блокировок", + "otherValue": "%@ блокировки" + }, + "Stats.GroupTopAdminsTitle": { + "key": "Stats.GroupTopAdminsTitle", + "value": "АДМИНЫ" + }, + "Stats.GroupTopHoursTitle": { + "key": "Stats.GroupTopHoursTitle", + "value": "АКТИВНЫЕ ЧАСЫ" + }, + "Stats.GroupTopInviter.History": { + "key": "Stats.GroupTopInviter.History", + "value": "История" + }, + "Stats.GroupTopInviter.Promote": { + "key": "Stats.GroupTopInviter.Promote", + "value": "Повысить" + }, + "Stats.GroupTopInviterInvites": { + "key": "Stats.GroupTopInviterInvites", + "zeroValue": null, + "oneValue": "%@ приглашение", + "twoValue": null, + "fewValue": "%@ приглашения", + "manyValue": "%@ приглашений", + "otherValue": "%@ приглашения" + }, + "Stats.GroupTopInvitersTitle": { + "key": "Stats.GroupTopInvitersTitle", + "value": "ПРИГЛАШЕНИЯ" + }, + "Stats.GroupTopPoster.History": { + "key": "Stats.GroupTopPoster.History", + "value": "История" + }, + "Stats.GroupTopPoster.Promote": { + "key": "Stats.GroupTopPoster.Promote", + "value": "Повысить" + }, + "Stats.GroupTopPosterChars": { + "key": "Stats.GroupTopPosterChars", + "zeroValue": null, + "oneValue": "~ по %@ символу", + "twoValue": null, + "fewValue": "~ по %@ символа", + "manyValue": "~ по %@ символов", + "otherValue": "~ по %@ символа" + }, + "Stats.GroupTopPosterMessages": { + "key": "Stats.GroupTopPosterMessages", + "zeroValue": null, + "oneValue": "%@ сообщение", + "twoValue": null, + "fewValue": "%@ сообщения", + "manyValue": "%@ сообщений", + "otherValue": "%@ сообщений" + }, + "Stats.GroupTopPostersTitle": { + "key": "Stats.GroupTopPostersTitle", + "value": "УЧАСТНИКИ" + }, + "Stats.GroupTopWeekdaysTitle": { + "key": "Stats.GroupTopWeekdaysTitle", + "value": "АКТИВНЫЕ ДНИ НЕДЕЛИ" + }, + "Stats.GroupViewers": { + "key": "Stats.GroupViewers", + "value": "Читают" + }, + "Stats.GrowthTitle": { + "key": "Stats.GrowthTitle", + "value": "РОСТ" + }, + "Stats.InstantViewInteractionsTitle": { + "key": "Stats.InstantViewInteractionsTitle", + "value": "АКТИВНОСТЬ В INSTANT VIEW" + }, + "Stats.InteractionsTitle": { + "key": "Stats.InteractionsTitle", + "value": "АКТИВНОСТЬ" + }, + "Stats.LanguagesTitle": { + "key": "Stats.LanguagesTitle", + "value": "ЯЗЫКИ" + }, + "Stats.LoadingText": { + "key": "Stats.LoadingText", + "value": "Создание графиков может\nзанять некоторое время" + }, + "Stats.LoadingTitle": { + "key": "Stats.LoadingTitle", + "value": "Подготовка статистики" + }, + "Stats.Message.PrivateShares": { + "key": "Stats.Message.PrivateShares", + "value": "Непублично" + }, + "Stats.Message.PublicShares": { + "key": "Stats.Message.PublicShares", + "value": "Поделились публично" + }, + "Stats.Message.Views": { + "key": "Stats.Message.Views", + "value": "Просмотры" + }, + "Stats.MessageForwards": { + "key": "Stats.MessageForwards", + "zeroValue": null, + "oneValue": "%@ поделился", + "twoValue": null, + "fewValue": "%@ поделились", + "manyValue": "%@ поделились", + "otherValue": "%@ поделились" + }, + "Stats.MessageInteractionsTitle": { + "key": "Stats.MessageInteractionsTitle", + "value": "Активность" + }, + "Stats.MessageOverview": { + "key": "Stats.MessageOverview", + "value": "Общая" + }, + "Stats.MessagePublicForwardsTitle": { + "key": "Stats.MessagePublicForwardsTitle", + "value": "Поделились в публичные каналы" + }, + "Stats.MessageTitle": { + "key": "Stats.MessageTitle", + "value": "Статистика сообщения" + }, + "Stats.MessageViews": { + "key": "Stats.MessageViews", + "zeroValue": null, + "oneValue": "%@ просм.", + "twoValue": null, + "fewValue": "%@ просм.", + "manyValue": "%@ просм.", + "otherValue": "%@ просм." + }, + "Stats.NotificationsTitle": { + "key": "Stats.NotificationsTitle", + "value": "УВЕДОМЛЕНИЯ" + }, + "Stats.Overview": { + "key": "Stats.Overview", + "value": "ОБЩАЯ" + }, + "Stats.PostsTitle": { + "key": "Stats.PostsTitle", + "value": "НЕДАВНИЕ ПОСТЫ" + }, + "Stats.SharesPerPost": { + "key": "Stats.SharesPerPost", + "value": "Пересылка постов" + }, + "Stats.Total": { + "key": "Stats.Total", + "value": "Всего" + }, + "Stats.ViewsByHoursTitle": { + "key": "Stats.ViewsByHoursTitle", + "value": "ПРОСМОТРЫ ПО ЧАСАМ (UTC)" + }, + "Stats.ViewsBySourceTitle": { + "key": "Stats.ViewsBySourceTitle", + "value": "ИСТОЧНИКИ ПРОСМОТРОВ" + }, + "Stats.ViewsPerPost": { + "key": "Stats.ViewsPerPost", + "value": "Просмотры постов" + }, + "Stats.ZoomOut": { + "key": "Stats.ZoomOut", + "value": "Уменьшить" + }, + "StickerPack.Add": { + "key": "StickerPack.Add", + "value": "Добавить" + }, + "StickerPack.AddMaskCount": { + "key": "StickerPack.AddMaskCount", + "zeroValue": null, + "oneValue": "Добавить %@ маску", + "twoValue": null, + "fewValue": "Добавить %@ маски", + "manyValue": "Добавить %@ масок", + "otherValue": "Добавить %@ маски" + }, + "StickerPack.AddStickerCount": { + "key": "StickerPack.AddStickerCount", + "zeroValue": null, + "oneValue": "Добавить %@ стикер", + "twoValue": null, + "fewValue": "Добавить %@ стикера", + "manyValue": "Добавить %@ стикеров", + "otherValue": "Добавить %@ стикера" + }, + "StickerPack.BuiltinPackName": { + "key": "StickerPack.BuiltinPackName", + "value": "Великие люди" + }, + "StickerPack.ErrorNotFound": { + "key": "StickerPack.ErrorNotFound", + "value": "Похоже, такого набора стикеров не существует." + }, + "StickerPack.HideStickers": { + "key": "StickerPack.HideStickers", + "value": "Спрятать Стикеры" + }, + "StickerPack.RemoveMaskCount": { + "key": "StickerPack.RemoveMaskCount", + "zeroValue": null, + "oneValue": "Удалить %@ маску", + "twoValue": null, + "fewValue": "Удалить %@ маски", + "manyValue": "Удалить %@ масок", + "otherValue": "Удалить %@ масок" + }, + "StickerPack.RemoveStickerCount": { + "key": "StickerPack.RemoveStickerCount", + "zeroValue": null, + "oneValue": "Удалить %@ стикер", + "twoValue": null, + "fewValue": "Удалить %@ стикера", + "manyValue": "Удалить %@ стикеров", + "otherValue": "Удалить %@ стикеров" + }, + "StickerPack.Send": { + "key": "StickerPack.Send", + "value": "Отправить стикер" + }, + "StickerPack.Share": { + "key": "StickerPack.Share", + "value": "Поделиться" + }, + "StickerPack.ShowStickers": { + "key": "StickerPack.ShowStickers", + "value": "Показать Стикеры" + }, + "StickerPack.StickerCount": { + "key": "StickerPack.StickerCount", + "zeroValue": null, + "oneValue": "%@ стикер", + "twoValue": null, + "fewValue": "%@ стикера", + "manyValue": "%@ стикеров", + "otherValue": "%@ стикеров" + }, + "StickerPack.ViewPack": { + "key": "StickerPack.ViewPack", + "value": "Посмотреть набор" + }, + "StickerPackActionInfo.AddedText": { + "key": "StickerPackActionInfo.AddedText", + "value": "Набор %@ добавлен в Ваши стикеры." + }, + "StickerPackActionInfo.AddedTitle": { + "key": "StickerPackActionInfo.AddedTitle", + "value": "Стикеры добавлены" + }, + "StickerPackActionInfo.ArchivedTitle": { + "key": "StickerPackActionInfo.ArchivedTitle", + "value": "Стикеры архивированы" + }, + "StickerPackActionInfo.RemovedText": { + "key": "StickerPackActionInfo.RemovedText", + "value": "Набор %@ удалён из Ваших стикеров." + }, + "StickerPackActionInfo.RemovedTitle": { + "key": "StickerPackActionInfo.RemovedTitle", + "value": "Стикеры удалены" + }, + "StickerPacksSettings.AnimatedStickers": { + "key": "StickerPacksSettings.AnimatedStickers", + "value": "Зациклить анимацию" + }, + "StickerPacksSettings.AnimatedStickersInfo": { + "key": "StickerPacksSettings.AnimatedStickersInfo", + "value": "Анимированные стикеры будут проигрываться без остановки." + }, + "StickerPacksSettings.ArchivedMasks": { + "key": "StickerPacksSettings.ArchivedMasks", + "value": "Архив масок" + }, + "StickerPacksSettings.ArchivedMasks.Info": { + "key": "StickerPacksSettings.ArchivedMasks.Info", + "value": "Вы можете установить до 200 наборов масок.\nСтарые наборы архивируются по мере установки новых." + }, + "StickerPacksSettings.ArchivedPacks": { + "key": "StickerPacksSettings.ArchivedPacks", + "value": "Архив стикеров" + }, + "StickerPacksSettings.ArchivedPacks.Info": { + "key": "StickerPacksSettings.ArchivedPacks.Info", + "value": "У Вас может быть до 200 наборов стикеров. Старые наборы архивируются по мере установки новых." + }, + "StickerPacksSettings.FeaturedPacks": { + "key": "StickerPacksSettings.FeaturedPacks", + "value": "Популярные стикеры" + }, + "StickerPacksSettings.ManagingHelp": { + "key": "StickerPacksSettings.ManagingHelp", + "value": "Художники могут создавать собственные наборы с помощью бота @stickers.\n\nНажмите на стикер, чтобы просмотреть и добавить весь набор." + }, + "StickerPacksSettings.ShowStickersButton": { + "key": "StickerPacksSettings.ShowStickersButton", + "value": "Показать панель стикеров" + }, + "StickerPacksSettings.ShowStickersButtonHelp": { + "key": "StickerPacksSettings.ShowStickersButtonHelp", + "value": "Иконка стикера появится в поле ввода сообщений." + }, + "StickerPacksSettings.StickerPacksSection": { + "key": "StickerPacksSettings.StickerPacksSection", + "value": "НАБОРЫ СТИКЕРОВ" + }, + "StickerPacksSettings.Title": { + "key": "StickerPacksSettings.Title", + "value": "Стикеры" + }, + "StickerSettings.ContextHide": { + "key": "StickerSettings.ContextHide", + "value": "Архивировать" + }, + "StickerSettings.ContextInfo": { + "key": "StickerSettings.ContextInfo", + "value": "Любой набор из архива можно быстро восстановить в разделе «Архив стикеров»." + }, + "StickerSettings.MaskContextInfo": { + "key": "StickerSettings.MaskContextInfo", + "value": "Если Вы архивируете набор масок, его можно будет быстро восстановить в разделе «Архив масок»." + }, + "Stickers.AddToFavorites": { + "key": "Stickers.AddToFavorites", + "value": "Добавить в избранные" + }, + "Stickers.ClearRecent": { + "key": "Stickers.ClearRecent", + "value": "Очистить последние стикеры" + }, + "Stickers.FavoriteStickers": { + "key": "Stickers.FavoriteStickers", + "value": "Избранные стикеры" + }, + "Stickers.FrequentlyUsed": { + "key": "Stickers.FrequentlyUsed", + "value": "Последние" + }, + "Stickers.GroupChooseStickerPack": { + "key": "Stickers.GroupChooseStickerPack", + "value": "ВЫБЕРИТЕ НАБОР СТИКЕРОВ" + }, + "Stickers.GroupStickers": { + "key": "Stickers.GroupStickers", + "value": "Стикеры группы" + }, + "Stickers.GroupStickersHelp": { + "key": "Stickers.GroupStickersHelp", + "value": "Вы можете выбрать набор стикеров, который будет доступен всем участникам группы при общении в ней." + }, + "Stickers.Install": { + "key": "Stickers.Install", + "value": "ДОБАВИТЬ" + }, + "Stickers.Installed": { + "key": "Stickers.Installed", + "value": "ДОБАВЛЕНЫ" + }, + "Stickers.NoStickersFound": { + "key": "Stickers.NoStickersFound", + "value": "Стикеры не найдены" + }, + "Stickers.RemoveFromFavorites": { + "key": "Stickers.RemoveFromFavorites", + "value": "Удалить из Избранного" + }, + "Stickers.Search": { + "key": "Stickers.Search", + "value": "Поиск стикеров" + }, + "Stickers.SuggestAdded": { + "key": "Stickers.SuggestAdded", + "value": "Свои наборы" + }, + "Stickers.SuggestAll": { + "key": "Stickers.SuggestAll", + "value": "Все" + }, + "Stickers.SuggestNone": { + "key": "Stickers.SuggestNone", + "value": "Нет" + }, + "Stickers.SuggestStickers": { + "key": "Stickers.SuggestStickers", + "value": "Подсказка по эмодзи" + }, + "Target.InviteToGroupConfirmation": { + "key": "Target.InviteToGroupConfirmation", + "value": "Добавить бота в группу «%@»?" + }, + "Target.InviteToGroupErrorAlreadyInvited": { + "key": "Target.InviteToGroupErrorAlreadyInvited", + "value": "Этот бот уже состоит в группе." + }, + "Target.SelectGroup": { + "key": "Target.SelectGroup", + "value": "Выбрать группу" + }, + "Target.ShareGameConfirmationGroup": { + "key": "Target.ShareGameConfirmationGroup", + "value": "Поделиться игрой с \"%@\"?" + }, + "Target.ShareGameConfirmationPrivate": { + "key": "Target.ShareGameConfirmationPrivate", + "value": "Поделиться игрой с %@?" + }, + "TextFormat.AddLinkPlaceholder": { + "key": "TextFormat.AddLinkPlaceholder", + "value": "URL" + }, + "TextFormat.AddLinkText": { + "key": "TextFormat.AddLinkText", + "value": "Ссылка будет выглядеть как «%@»." + }, + "TextFormat.AddLinkTitle": { + "key": "TextFormat.AddLinkTitle", + "value": "Добавить ссылку" + }, + "TextFormat.Bold": { + "key": "TextFormat.Bold", + "value": "Жирный" + }, + "TextFormat.Italic": { + "key": "TextFormat.Italic", + "value": "Курсив" + }, + "TextFormat.Link": { + "key": "TextFormat.Link", + "value": "Ссылка" + }, + "TextFormat.Monospace": { + "key": "TextFormat.Monospace", + "value": "Моноширинный" + }, + "TextFormat.Strikethrough": { + "key": "TextFormat.Strikethrough", + "value": "Зачёркнутый" + }, + "TextFormat.Underline": { + "key": "TextFormat.Underline", + "value": "Подчёркнутый" + }, + "Theme.Colors.Accent": { + "key": "Theme.Colors.Accent", + "value": "Акцент" + }, + "Theme.Colors.Background": { + "key": "Theme.Colors.Background", + "value": "Фон" + }, + "Theme.Colors.ColorWallpaperWarning": { + "key": "Theme.Colors.ColorWallpaperWarning", + "value": "Вы точно хотите изменить фон чата на однотонный?" + }, + "Theme.Colors.ColorWallpaperWarningProceed": { + "key": "Theme.Colors.ColorWallpaperWarningProceed", + "value": "Продолжить" + }, + "Theme.Colors.Messages": { + "key": "Theme.Colors.Messages", + "value": "Сообщения" + }, + "Theme.Colors.Proceed": { + "key": "Theme.Colors.Proceed", + "value": "Продолжить" + }, + "Theme.Context.Apply": { + "key": "Theme.Context.Apply", + "value": "Применить" + }, + "Theme.Context.ChangeColors": { + "key": "Theme.Context.ChangeColors", + "value": "Изменить цвета" + }, + "Theme.ErrorNotFound": { + "key": "Theme.ErrorNotFound", + "value": "Похоже, такой темы не существует." + }, + "Theme.ThemeChanged": { + "key": "Theme.ThemeChanged", + "value": "Цветовая тема изменена" + }, + "Theme.ThemeChangedText": { + "key": "Theme.ThemeChangedText", + "value": "Отменить изменения можно в разделе\n[Настройки > Оформление]()." + }, + "Theme.Unsupported": { + "key": "Theme.Unsupported", + "value": "К сожалению, тема пока не поддерживается на Вашем устройстве" + }, + "Theme.UsersCount": { + "key": "Theme.UsersCount", + "zeroValue": null, + "oneValue": "Число установок: %@ ", + "twoValue": null, + "fewValue": "Число установок: %@ ", + "manyValue": "Число установок: %@ ", + "otherValue": "Число установок: %@ " + }, + "Time.MediumDate": { + "key": "Time.MediumDate", + "value": "%1$@ в %2$@" + }, + "Time.MonthOfYear_m1": { + "key": "Time.MonthOfYear_m1", + "value": "Январь %@" + }, + "Time.MonthOfYear_m10": { + "key": "Time.MonthOfYear_m10", + "value": "Октябрь %@" + }, + "Time.MonthOfYear_m11": { + "key": "Time.MonthOfYear_m11", + "value": "Ноябрь %@" + }, + "Time.MonthOfYear_m12": { + "key": "Time.MonthOfYear_m12", + "value": "Декабрь %@" + }, + "Time.MonthOfYear_m2": { + "key": "Time.MonthOfYear_m2", + "value": "Февраль %@" + }, + "Time.MonthOfYear_m3": { + "key": "Time.MonthOfYear_m3", + "value": "Март %@" + }, + "Time.MonthOfYear_m4": { + "key": "Time.MonthOfYear_m4", + "value": "Апрель %@" + }, + "Time.MonthOfYear_m5": { + "key": "Time.MonthOfYear_m5", + "value": "Май %@" + }, + "Time.MonthOfYear_m6": { + "key": "Time.MonthOfYear_m6", + "value": "Июнь %@" + }, + "Time.MonthOfYear_m7": { + "key": "Time.MonthOfYear_m7", + "value": "Июль %@" + }, + "Time.MonthOfYear_m8": { + "key": "Time.MonthOfYear_m8", + "value": "Август %@" + }, + "Time.MonthOfYear_m9": { + "key": "Time.MonthOfYear_m9", + "value": "Сентябрь %@" + }, + "Time.PreciseDate_m1": { + "key": "Time.PreciseDate_m1", + "value": "%1$@ янв. %2$@ в %3$@" + }, + "Time.PreciseDate_m10": { + "key": "Time.PreciseDate_m10", + "value": "%1$@ окт. %2$@ в %3$@" + }, + "Time.PreciseDate_m11": { + "key": "Time.PreciseDate_m11", + "value": "%1$@ ноя. %2$@ в %3$@" + }, + "Time.PreciseDate_m12": { + "key": "Time.PreciseDate_m12", + "value": "%1$@ дек. %2$@ в %3$@" + }, + "Time.PreciseDate_m2": { + "key": "Time.PreciseDate_m2", + "value": "%1$@ фев. %2$@ в %3$@" + }, + "Time.PreciseDate_m3": { + "key": "Time.PreciseDate_m3", + "value": "%1$@ мар. %2$@ в %3$@" + }, + "Time.PreciseDate_m4": { + "key": "Time.PreciseDate_m4", + "value": "%1$@ апр. %2$@ в %3$@" + }, + "Time.PreciseDate_m5": { + "key": "Time.PreciseDate_m5", + "value": "%1$@ мая %2$@ в %3$@" + }, + "Time.PreciseDate_m6": { + "key": "Time.PreciseDate_m6", + "value": "%1$@ июн. %2$@ в %3$@" + }, + "Time.PreciseDate_m7": { + "key": "Time.PreciseDate_m7", + "value": "%1$@ июл. %2$@ в %3$@" + }, + "Time.PreciseDate_m8": { + "key": "Time.PreciseDate_m8", + "value": "%1$@ авг. %2$@ в %3$@" + }, + "Time.PreciseDate_m9": { + "key": "Time.PreciseDate_m9", + "value": "%1$@ сен. %2$@ в %3$@" + }, + "Time.TodayAt": { + "key": "Time.TodayAt", + "value": "сегодня в %@" + }, + "Time.TomorrowAt": { + "key": "Time.TomorrowAt", + "value": "завтра в %@" + }, + "Time.YesterdayAt": { + "key": "Time.YesterdayAt", + "value": "вчера в %@" + }, + "Tour.StartButton": { + "key": "Tour.StartButton", + "value": "Начать общение" + }, + "Tour.Text1": { + "key": "Tour.Text1", + "value": "Самый **быстрый** мессенджер в мире.\n **Бесплатный** и **безопасный**." + }, + "Tour.Text2": { + "key": "Tour.Text2", + "value": "**Telegram** доставляет сообщения\nбыстрее любого другого мессенджера." + }, + "Tour.Text3": { + "key": "Tour.Text3", + "value": "**Telegram** не ограничивает размер\n Ваших медиафайлов и чатов." + }, + "Tour.Text4": { + "key": "Tour.Text4", + "value": "**Telegram** защищает Вашу\nпереписку от злоумышленников." + }, + "Tour.Text5": { + "key": "Tour.Text5", + "value": "В **Telegram** можно переписываться с любого количества устройств." + }, + "Tour.Text6": { + "key": "Tour.Text6", + "value": "**Telegram** всегда будет бесплатным!\nНикакой рекламы. Никаких подписок." + }, + "Tour.Title1": { + "key": "Tour.Title1", + "value": "Telegram" + }, + "Tour.Title2": { + "key": "Tour.Title2", + "value": "Быстрый" + }, + "Tour.Title3": { + "key": "Tour.Title3", + "value": "Мощный" + }, + "Tour.Title4": { + "key": "Tour.Title4", + "value": "Безопасный" + }, + "Tour.Title5": { + "key": "Tour.Title5", + "value": "Облачный" + }, + "Tour.Title6": { + "key": "Tour.Title6", + "value": "Бесплатный" + }, + "TwoFactorSetup.Done.Action": { + "key": "TwoFactorSetup.Done.Action", + "value": "Вернуться к настройкам" + }, + "TwoFactorSetup.Done.Text": { + "key": "TwoFactorSetup.Done.Text", + "value": "Этот пароль потребуется вводить при авторизации с нового устройства в дополнение к коду из SMS." + }, + "TwoFactorSetup.Done.Title": { + "key": "TwoFactorSetup.Done.Title", + "value": "Пароль установлен" + }, + "TwoFactorSetup.Email.Action": { + "key": "TwoFactorSetup.Email.Action", + "value": "Продолжить" + }, + "TwoFactorSetup.Email.Placeholder": { + "key": "TwoFactorSetup.Email.Placeholder", + "value": "Электронная почта" + }, + "TwoFactorSetup.Email.SkipAction": { + "key": "TwoFactorSetup.Email.SkipAction", + "value": "Пропустить выбор почты" + }, + "TwoFactorSetup.Email.SkipConfirmationSkip": { + "key": "TwoFactorSetup.Email.SkipConfirmationSkip", + "value": "Пропустить" + }, + "TwoFactorSetup.Email.SkipConfirmationText": { + "key": "TwoFactorSetup.Email.SkipConfirmationText", + "value": "Если Вы забудете пароль, Вы потеряете доступ к своему аккаунту. Не будет никакого способа его восстановить." + }, + "TwoFactorSetup.Email.SkipConfirmationTitle": { + "key": "TwoFactorSetup.Email.SkipConfirmationTitle", + "value": "Нет, серьёзно." + }, + "TwoFactorSetup.Email.Text": { + "key": "TwoFactorSetup.Email.Text", + "value": "Вы можете задать адрес электронной почты для сброса пароля и восстановления доступа к своему аккаунту в Telegram." + }, + "TwoFactorSetup.Email.Title": { + "key": "TwoFactorSetup.Email.Title", + "value": "Почта для восстановления" + }, + "TwoFactorSetup.EmailVerification.Action": { + "key": "TwoFactorSetup.EmailVerification.Action", + "value": "Продолжить" + }, + "TwoFactorSetup.EmailVerification.ChangeAction": { + "key": "TwoFactorSetup.EmailVerification.ChangeAction", + "value": "Другой адрес" + }, + "TwoFactorSetup.EmailVerification.Placeholder": { + "key": "TwoFactorSetup.EmailVerification.Placeholder", + "value": "Код" + }, + "TwoFactorSetup.EmailVerification.ResendAction": { + "key": "TwoFactorSetup.EmailVerification.ResendAction", + "value": "Отправить ещё раз" + }, + "TwoFactorSetup.EmailVerification.Text": { + "key": "TwoFactorSetup.EmailVerification.Text", + "value": "Пожалуйста, введите код, который пришёл на почту %@." + }, + "TwoFactorSetup.EmailVerification.Title": { + "key": "TwoFactorSetup.EmailVerification.Title", + "value": "Почта для восстановления" + }, + "TwoFactorSetup.Hint.Action": { + "key": "TwoFactorSetup.Hint.Action", + "value": "Продолжить" + }, + "TwoFactorSetup.Hint.Placeholder": { + "key": "TwoFactorSetup.Hint.Placeholder", + "value": "Подсказка (не обязательно)" + }, + "TwoFactorSetup.Hint.SkipAction": { + "key": "TwoFactorSetup.Hint.SkipAction", + "value": "Пропустить подсказку" + }, + "TwoFactorSetup.Hint.Text": { + "key": "TwoFactorSetup.Hint.Text", + "value": "Если хотите, укажите подсказку для пароля." + }, + "TwoFactorSetup.Hint.Title": { + "key": "TwoFactorSetup.Hint.Title", + "value": "Подсказка" + }, + "TwoFactorSetup.Intro.Action": { + "key": "TwoFactorSetup.Intro.Action", + "value": "Установить пароль" + }, + "TwoFactorSetup.Intro.Text": { + "key": "TwoFactorSetup.Intro.Text", + "value": "Вы можете установить пароль, и его потребуется вводить при авторизации с нового устройства в дополнение к коду из SMS." + }, + "TwoFactorSetup.Intro.Title": { + "key": "TwoFactorSetup.Intro.Title", + "value": "Облачный пароль" + }, + "TwoFactorSetup.Password.Action": { + "key": "TwoFactorSetup.Password.Action", + "value": "Создать пароль" + }, + "TwoFactorSetup.Password.PlaceholderConfirmPassword": { + "key": "TwoFactorSetup.Password.PlaceholderConfirmPassword", + "value": "Повторите пароль" + }, + "TwoFactorSetup.Password.PlaceholderPassword": { + "key": "TwoFactorSetup.Password.PlaceholderPassword", + "value": "Пароль" + }, + "TwoFactorSetup.Password.Title": { + "key": "TwoFactorSetup.Password.Title", + "value": "Создать пароль" + }, + "TwoStepAuth.AddHintDescription": { + "key": "TwoStepAuth.AddHintDescription", + "value": "Если хотите, укажите подсказку для пароля." + }, + "TwoStepAuth.AddHintTitle": { + "key": "TwoStepAuth.AddHintTitle", + "value": "Добавьте подсказку" + }, + "TwoStepAuth.AdditionalPassword": { + "key": "TwoStepAuth.AdditionalPassword", + "value": "Дополнительный пароль " + }, + "TwoStepAuth.ChangeEmail": { + "key": "TwoStepAuth.ChangeEmail", + "value": "Изменить email" + }, + "TwoStepAuth.ChangePassword": { + "key": "TwoStepAuth.ChangePassword", + "value": "Изменить пароль" + }, + "TwoStepAuth.ChangePasswordDescription": { + "key": "TwoStepAuth.ChangePasswordDescription", + "value": "Пожалуйста, введите новый пароль, с помощью которого будут защищены Ваши данные." + }, + "TwoStepAuth.ConfirmEmailCodePlaceholder": { + "key": "TwoStepAuth.ConfirmEmailCodePlaceholder", + "value": "Код" + }, + "TwoStepAuth.ConfirmEmailDescription": { + "key": "TwoStepAuth.ConfirmEmailDescription", + "value": "Пожалуйста, введите код, который пришёл на почту %1$@." + }, + "TwoStepAuth.ConfirmEmailResendCode": { + "key": "TwoStepAuth.ConfirmEmailResendCode", + "value": "Отправить снова" + }, + "TwoStepAuth.ConfirmationAbort": { + "key": "TwoStepAuth.ConfirmationAbort", + "value": "Отменить двухэтапную аутентификацию" + }, + "TwoStepAuth.ConfirmationText": { + "key": "TwoStepAuth.ConfirmationText", + "value": "Проверьте электронную почту (не забудьте про папку «Спам») и пройдите по ссылке в письме, чтобы включить двухэтапную аутентификацию." + }, + "TwoStepAuth.ConfirmationTitle": { + "key": "TwoStepAuth.ConfirmationTitle", + "value": "Двухэтапная аутентификация" + }, + "TwoStepAuth.Disable": { + "key": "TwoStepAuth.Disable", + "value": "Отключить" + }, + "TwoStepAuth.DisableSuccess": { + "key": "TwoStepAuth.DisableSuccess", + "value": "Двухэтапная аутентификация\nотключена." + }, + "TwoStepAuth.Email": { + "key": "TwoStepAuth.Email", + "value": "Email" + }, + "TwoStepAuth.EmailAddSuccess": { + "key": "TwoStepAuth.EmailAddSuccess", + "value": "Электронная почта\nдобавлена." + }, + "TwoStepAuth.EmailChangeSuccess": { + "key": "TwoStepAuth.EmailChangeSuccess", + "value": "Электронная почта\nизменена." + }, + "TwoStepAuth.EmailCodeExpired": { + "key": "TwoStepAuth.EmailCodeExpired", + "value": "Время действия этого кода истекло. Попробуйте снова." + }, + "TwoStepAuth.EmailHelp": { + "key": "TwoStepAuth.EmailHelp", + "value": "Пожалуйста, укажите Ваш настоящий адрес электронной почты. Это единственный способ восстановить забытый пароль." + }, + "TwoStepAuth.EmailInvalid": { + "key": "TwoStepAuth.EmailInvalid", + "value": "Некорректный адрес электронной почты. Попробуйте ещё раз." + }, + "TwoStepAuth.EmailPlaceholder": { + "key": "TwoStepAuth.EmailPlaceholder", + "value": "Адрес email" + }, + "TwoStepAuth.EmailSent": { + "key": "TwoStepAuth.EmailSent", + "value": "Мы отправили Вам письмо, чтобы подтвердить Ваш резервный email." + }, + "TwoStepAuth.EmailSkip": { + "key": "TwoStepAuth.EmailSkip", + "value": "Пропустить" + }, + "TwoStepAuth.EmailSkipAlert": { + "key": "TwoStepAuth.EmailSkipAlert", + "value": "Внимание!\n\nЕсли Вы забудете пароль, Вы потеряете доступ к своему аккаунту. Не будет никакого способа его восстановить." + }, + "TwoStepAuth.EmailTitle": { + "key": "TwoStepAuth.EmailTitle", + "value": "Электронная почта" + }, + "TwoStepAuth.EnabledSuccess": { + "key": "TwoStepAuth.EnabledSuccess", + "value": "Двухэтапная аутентификация\nвключена." + }, + "TwoStepAuth.EnterEmailCode": { + "key": "TwoStepAuth.EnterEmailCode", + "value": "Ввести код" + }, + "TwoStepAuth.EnterPasswordForgot": { + "key": "TwoStepAuth.EnterPasswordForgot", + "value": "Забыли пароль?" + }, + "TwoStepAuth.EnterPasswordHelp": { + "key": "TwoStepAuth.EnterPasswordHelp", + "value": "Вы включили двухэтапную аутентификацию. Теперь Ваш аккаунт защищён дополнительным паролем." + }, + "TwoStepAuth.EnterPasswordHint": { + "key": "TwoStepAuth.EnterPasswordHint", + "value": "Подсказка: %@" + }, + "TwoStepAuth.EnterPasswordInvalid": { + "key": "TwoStepAuth.EnterPasswordInvalid", + "value": "Неверный пароль. Попробуйте ещё раз." + }, + "TwoStepAuth.EnterPasswordPassword": { + "key": "TwoStepAuth.EnterPasswordPassword", + "value": "Пароль" + }, + "TwoStepAuth.EnterPasswordTitle": { + "key": "TwoStepAuth.EnterPasswordTitle", + "value": "Пароль" + }, + "TwoStepAuth.FloodError": { + "key": "TwoStepAuth.FloodError", + "value": "Лимит попыток исчерпан. Попробуйте чуть позже." + }, + "TwoStepAuth.GenericHelp": { + "key": "TwoStepAuth.GenericHelp", + "value": "Включена двухэтапная аутентификация.\n\nДля входа в Telegram нужно будет вводить установленный здесь пароль." + }, + "TwoStepAuth.HintPlaceholder": { + "key": "TwoStepAuth.HintPlaceholder", + "value": "Подсказка" + }, + "TwoStepAuth.PasswordChangeSuccess": { + "key": "TwoStepAuth.PasswordChangeSuccess", + "value": "Пароль изменён." + }, + "TwoStepAuth.PasswordRemoveConfirmation": { + "key": "TwoStepAuth.PasswordRemoveConfirmation", + "value": "Вы точно хотите отключить пароль?" + }, + "TwoStepAuth.PasswordRemovePassportConfirmation": { + "key": "TwoStepAuth.PasswordRemovePassportConfirmation", + "value": "Вы уверены, что хотите отключить пароль?\n\nВажно! Вся информация, сохраненная в Telegram Passport, будет потеряна." + }, + "TwoStepAuth.PasswordSet": { + "key": "TwoStepAuth.PasswordSet", + "value": "Двухэтапная аутентификация включена." + }, + "TwoStepAuth.PendingEmailHelp": { + "key": "TwoStepAuth.PendingEmailHelp", + "value": "Пожалуйста проверьте почту, чтобы подтвердить резервный email %@." + }, + "TwoStepAuth.ReEnterPasswordDescription": { + "key": "TwoStepAuth.ReEnterPasswordDescription", + "value": "Пожалуйста, подтвердите пароль." + }, + "TwoStepAuth.ReEnterPasswordTitle": { + "key": "TwoStepAuth.ReEnterPasswordTitle", + "value": "Повторите пароль" + }, + "TwoStepAuth.RecoveryCode": { + "key": "TwoStepAuth.RecoveryCode", + "value": "Код" + }, + "TwoStepAuth.RecoveryCodeExpired": { + "key": "TwoStepAuth.RecoveryCodeExpired", + "value": "Мы отправили Вам новый шестизначный код." + }, + "TwoStepAuth.RecoveryCodeHelp": { + "key": "TwoStepAuth.RecoveryCodeHelp", + "value": "Чтобы отключить двухэтапную аутентификацию, введите шестизначный код, отправленный Вам по электронной почте." + }, + "TwoStepAuth.RecoveryCodeInvalid": { + "key": "TwoStepAuth.RecoveryCodeInvalid", + "value": "Неверный код. Попробуйте ещё раз." + }, + "TwoStepAuth.RecoveryEmailAddDescription": { + "key": "TwoStepAuth.RecoveryEmailAddDescription", + "value": "Пожалуйста, добавьте настоящий адрес электронной почты. Это единственный способ восстановить забытый пароль." + }, + "TwoStepAuth.RecoveryEmailChangeDescription": { + "key": "TwoStepAuth.RecoveryEmailChangeDescription", + "value": "Пожалуйста, введите резервный адрес электронной почты. Только с помощью этой почты можно будет восстановить пароль, если Вы его забудете." + }, + "TwoStepAuth.RecoveryEmailTitle": { + "key": "TwoStepAuth.RecoveryEmailTitle", + "value": "Электронная почта" + }, + "TwoStepAuth.RecoveryEmailUnavailable": { + "key": "TwoStepAuth.RecoveryEmailUnavailable", + "value": "Нет доступа к %@?" + }, + "TwoStepAuth.RecoveryFailed": { + "key": "TwoStepAuth.RecoveryFailed", + "value": "В этом случае остаётся либо вспомнить пароль, либо сбросить аккаунт и начать с чистого листа." + }, + "TwoStepAuth.RecoveryTitle": { + "key": "TwoStepAuth.RecoveryTitle", + "value": "Код из письма" + }, + "TwoStepAuth.RecoveryUnavailable": { + "key": "TwoStepAuth.RecoveryUnavailable", + "value": "Поскольку Вы не указали резервный адрес электронной почты, Вам остаётся либо вспомнить пароль, либо сбросить аккаунт и начать с чистого листа." + }, + "TwoStepAuth.RemovePassword": { + "key": "TwoStepAuth.RemovePassword", + "value": "Выключить пароль" + }, + "TwoStepAuth.ResetAccountConfirmation": { + "key": "TwoStepAuth.ResetAccountConfirmation", + "value": "Если Вы сбросите аккаунт, все чаты, сообщения и файлы будут утеряны." + }, + "TwoStepAuth.ResetAccountHelp": { + "key": "TwoStepAuth.ResetAccountHelp", + "value": "Если Вы сбросите аккаунт, все чаты, сообщения и файлы будут утеряны." + }, + "TwoStepAuth.SetPassword": { + "key": "TwoStepAuth.SetPassword", + "value": "Установить пароль" + }, + "TwoStepAuth.SetPasswordHelp": { + "key": "TwoStepAuth.SetPasswordHelp", + "value": "Вы можете установить пароль, который будет использоваться для входа с новых устройств в дополнение к проверочному коду из SMS." + }, + "TwoStepAuth.SetupEmail": { + "key": "TwoStepAuth.SetupEmail", + "value": "Добавить резервную почту" + }, + "TwoStepAuth.SetupHint": { + "key": "TwoStepAuth.SetupHint", + "value": "Придумайте подсказку к паролю:" + }, + "TwoStepAuth.SetupHintTitle": { + "key": "TwoStepAuth.SetupHintTitle", + "value": "Подсказка" + }, + "TwoStepAuth.SetupPasswordConfirmFailed": { + "key": "TwoStepAuth.SetupPasswordConfirmFailed", + "value": "Пароли не совпадают. Попробуйте ещё раз." + }, + "TwoStepAuth.SetupPasswordConfirmPassword": { + "key": "TwoStepAuth.SetupPasswordConfirmPassword", + "value": "Повторите пароль:" + }, + "TwoStepAuth.SetupPasswordDescription": { + "key": "TwoStepAuth.SetupPasswordDescription", + "value": "Пожалуйста, задайте пароль, с помощью которого будут защищены ваши данные." + }, + "TwoStepAuth.SetupPasswordEnterPasswordChange": { + "key": "TwoStepAuth.SetupPasswordEnterPasswordChange", + "value": "Введите новый пароль:" + }, + "TwoStepAuth.SetupPasswordEnterPasswordNew": { + "key": "TwoStepAuth.SetupPasswordEnterPasswordNew", + "value": "Придумайте пароль:" + }, + "TwoStepAuth.SetupPasswordTitle": { + "key": "TwoStepAuth.SetupPasswordTitle", + "value": "Ваш пароль" + }, + "TwoStepAuth.SetupPendingEmail": { + "key": "TwoStepAuth.SetupPendingEmail", + "value": "Электронная почта %@ для восстановления пароля ещё не подтверждена и не используется.\n\nЧтобы закончить настройку двухэтапной аутентификации, проверьте почту и введите код подтверждения. Если не удаётся найти письмо, пожалуйста, проверьте папку со спамом." + }, + "TwoStepAuth.SetupResendEmailCode": { + "key": "TwoStepAuth.SetupResendEmailCode", + "value": "Отправить ещё раз" + }, + "TwoStepAuth.SetupResendEmailCodeAlert": { + "key": "TwoStepAuth.SetupResendEmailCodeAlert", + "value": "Код отправлен. Пожалуйста, проверьте почту, в том числе папку со спамом." + }, + "TwoStepAuth.Title": { + "key": "TwoStepAuth.Title", + "value": "Облачный пароль" + }, + "Undo.ChatCleared": { + "key": "Undo.ChatCleared", + "value": "История удалена" + }, + "Undo.ChatClearedForBothSides": { + "key": "Undo.ChatClearedForBothSides", + "value": "История удалена для обоих участников" + }, + "Undo.ChatDeleted": { + "key": "Undo.ChatDeleted", + "value": "Чат удалён" + }, + "Undo.ChatDeletedForBothSides": { + "key": "Undo.ChatDeletedForBothSides", + "value": "Чат удален для обоих участников" + }, + "Undo.DeletedChannel": { + "key": "Undo.DeletedChannel", + "value": "Канал удалён" + }, + "Undo.DeletedGroup": { + "key": "Undo.DeletedGroup", + "value": "Группа удалена" + }, + "Undo.LeftChannel": { + "key": "Undo.LeftChannel", + "value": "Вы покинули канал" + }, + "Undo.LeftGroup": { + "key": "Undo.LeftGroup", + "value": "Вы покинули группу" + }, + "Undo.MessagesDeleted": { + "key": "Undo.MessagesDeleted", + "value": "Сообщения удалены" + }, + "Undo.ScheduledMessagesCleared": { + "key": "Undo.ScheduledMessagesCleared", + "value": "Отложенные сообщения удалены" + }, + "Undo.SecretChatDeleted": { + "key": "Undo.SecretChatDeleted", + "value": "Секретный чат удалён" + }, + "Undo.Undo": { + "key": "Undo.Undo", + "value": "Отмена" + }, + "Update.AppVersion": { + "key": "Update.AppVersion", + "value": "Telegram %@" + }, + "Update.Skip": { + "key": "Update.Skip", + "value": "Пропустить" + }, + "Update.Title": { + "key": "Update.Title", + "value": "Обновление Telegram" + }, + "Update.UpdateApp": { + "key": "Update.UpdateApp", + "value": "Обновить Telegram" + }, + "Updated.AtDate": { + "key": "Updated.AtDate", + "value": "%@" + }, + "Updated.HoursAgo": { + "key": "Updated.HoursAgo", + "zeroValue": null, + "oneValue": "%@ час назад", + "twoValue": null, + "fewValue": "%@ часа назад", + "manyValue": "%@ часов назад", + "otherValue": "%@ часов назад" + }, + "Updated.JustNow": { + "key": "Updated.JustNow", + "value": "только что" + }, + "Updated.MinutesAgo": { + "key": "Updated.MinutesAgo", + "zeroValue": null, + "oneValue": "%@ минуту назад", + "twoValue": null, + "fewValue": "%@ минуты назад", + "manyValue": "%@ минут назад", + "otherValue": "%@ минут назад" + }, + "Updated.TodayAt": { + "key": "Updated.TodayAt", + "value": "сегодня в %@" + }, + "Updated.YesterdayAt": { + "key": "Updated.YesterdayAt", + "value": "вчера в %@" + }, + "User.DeletedAccount": { + "key": "User.DeletedAccount", + "value": "Удалённый аккаунт" + }, + "UserCount": { + "key": "UserCount", + "zeroValue": null, + "oneValue": "%@ человек", + "twoValue": null, + "fewValue": "%@ человека", + "manyValue": "%@ человек", + "otherValue": "%@ человек" + }, + "UserInfo.About.Placeholder": { + "key": "UserInfo.About.Placeholder", + "value": "О себе" + }, + "UserInfo.AddContact": { + "key": "UserInfo.AddContact", + "value": "Добавить в контакты" + }, + "UserInfo.AddPhone": { + "key": "UserInfo.AddPhone", + "value": "добавить телефон" + }, + "UserInfo.AddToExisting": { + "key": "UserInfo.AddToExisting", + "value": "Добавить в имеющийся" + }, + "UserInfo.BlockActionTitle": { + "key": "UserInfo.BlockActionTitle", + "value": "Заблокировать %@" + }, + "UserInfo.BlockConfirmation": { + "key": "UserInfo.BlockConfirmation", + "value": "Заблокировать %@?" + }, + "UserInfo.BlockConfirmationTitle": { + "key": "UserInfo.BlockConfirmationTitle", + "value": "Запретить %@ писать Вам сообщения и звонить через Telegram?" + }, + "UserInfo.BotHelp": { + "key": "UserInfo.BotHelp", + "value": "Помощь" + }, + "UserInfo.BotPrivacy": { + "key": "UserInfo.BotPrivacy", + "value": "Политика конфиденциальности" + }, + "UserInfo.BotSettings": { + "key": "UserInfo.BotSettings", + "value": "Настройки" + }, + "UserInfo.CreateNewContact": { + "key": "UserInfo.CreateNewContact", + "value": "Создать новый контакт" + }, + "UserInfo.DeleteContact": { + "key": "UserInfo.DeleteContact", + "value": "Удалить контакт" + }, + "UserInfo.FakeBotWarning": { + "key": "UserInfo.FakeBotWarning", + "value": "⚠️ Внимание: многие жаловались, что этот аккаунт выдаёт себя за официальный." + }, + "UserInfo.FakeUserWarning": { + "key": "UserInfo.FakeUserWarning", + "value": "⚠️ Внимание: многие жаловались, что этот аккаунт выдаёт себя за официальный." + }, + "UserInfo.FirstNamePlaceholder": { + "key": "UserInfo.FirstNamePlaceholder", + "value": "Имя" + }, + "UserInfo.GenericPhoneLabel": { + "key": "UserInfo.GenericPhoneLabel", + "value": "телефон" + }, + "UserInfo.GroupsInCommon": { + "key": "UserInfo.GroupsInCommon", + "value": "Общие группы" + }, + "UserInfo.Invite": { + "key": "UserInfo.Invite", + "value": "Пригласить в Telegram" + }, + "UserInfo.InviteBotToGroup": { + "key": "UserInfo.InviteBotToGroup", + "value": "Добавить в группу" + }, + "UserInfo.LastNamePlaceholder": { + "key": "UserInfo.LastNamePlaceholder", + "value": "Фамилия" + }, + "UserInfo.NotificationsDefault": { + "key": "UserInfo.NotificationsDefault", + "value": "По умолчанию" + }, + "UserInfo.NotificationsDefaultDisabled": { + "key": "UserInfo.NotificationsDefaultDisabled", + "value": "По умолчанию (выкл.)" + }, + "UserInfo.NotificationsDefaultEnabled": { + "key": "UserInfo.NotificationsDefaultEnabled", + "value": "По умолчанию (вкл.)" + }, + "UserInfo.NotificationsDefaultSound": { + "key": "UserInfo.NotificationsDefaultSound", + "value": "По умолчанию (%@)" + }, + "UserInfo.NotificationsDisable": { + "key": "UserInfo.NotificationsDisable", + "value": "Выключить" + }, + "UserInfo.NotificationsDisabled": { + "key": "UserInfo.NotificationsDisabled", + "value": "Выкл." + }, + "UserInfo.NotificationsEnable": { + "key": "UserInfo.NotificationsEnable", + "value": "Включить" + }, + "UserInfo.NotificationsEnabled": { + "key": "UserInfo.NotificationsEnabled", + "value": "Вкл." + }, + "UserInfo.PhoneCall": { + "key": "UserInfo.PhoneCall", + "value": "Позвонить по телефону" + }, + "UserInfo.ScamBotWarning": { + "key": "UserInfo.ScamBotWarning", + "value": "⚠️ Внимание: на этот аккаунт много жалоб в связи с мошенничеством или попытками выдать себя за официальный аккаунт. Будьте осторожны, особенно если у Вас попросят денег." + }, + "UserInfo.ScamUserWarning": { + "key": "UserInfo.ScamUserWarning", + "value": "⚠️ Внимание: на этот аккаунт много жалоб в связи с мошенничеством или попытками выдать себя за официальный аккаунт. Будьте осторожны, особенно если у Вас попросят денег." + }, + "UserInfo.SendMessage": { + "key": "UserInfo.SendMessage", + "value": "Отправить сообщение" + }, + "UserInfo.ShareBot": { + "key": "UserInfo.ShareBot", + "value": "Отправить" + }, + "UserInfo.ShareContact": { + "key": "UserInfo.ShareContact", + "value": "Отправить этот контакт" + }, + "UserInfo.ShareMyContactInfo": { + "key": "UserInfo.ShareMyContactInfo", + "value": "Отправить мой номер телефона" + }, + "UserInfo.StartSecretChat": { + "key": "UserInfo.StartSecretChat", + "value": "Начать секретный чат" + }, + "UserInfo.StartSecretChatConfirmation": { + "key": "UserInfo.StartSecretChatConfirmation", + "value": "Вы действительно хотите начать секретный чат с %@?" + }, + "UserInfo.StartSecretChatStart": { + "key": "UserInfo.StartSecretChatStart", + "value": "Начать" + }, + "UserInfo.TapToCall": { + "key": "UserInfo.TapToCall", + "value": "Нажмите для зашифрованного звонка" + }, + "UserInfo.TelegramCall": { + "key": "UserInfo.TelegramCall", + "value": "Позвонить через Telegram" + }, + "UserInfo.Title": { + "key": "UserInfo.Title", + "value": "Информация" + }, + "UserInfo.UnblockConfirmation": { + "key": "UserInfo.UnblockConfirmation", + "value": "Разблокировать %@?" + }, + "Username.CheckingUsername": { + "key": "Username.CheckingUsername", + "value": "Проверка имени…" + }, + "Username.Help": { + "key": "Username.Help", + "value": "Вы можете выбрать публичное имя пользователя в **Telegram**. В этом случае другие люди смогут найти Вас по такому имени и связаться с Вами, не зная Вашего телефона.\n\nВы можете использовать **a-z**, **0-9** и _. Минимальная длина — **5** символов." + }, + "Username.InvalidCharacters": { + "key": "Username.InvalidCharacters", + "value": "Допустимые символы: a-z, 0-9, _." + }, + "Username.InvalidStartsWithNumber": { + "key": "Username.InvalidStartsWithNumber", + "value": "Имя пользователя не может начинаться с цифры." + }, + "Username.InvalidTaken": { + "key": "Username.InvalidTaken", + "value": "К сожалению, это имя уже занято." + }, + "Username.InvalidTooShort": { + "key": "Username.InvalidTooShort", + "value": "Имя пользователя должно состоять минимум из 5 символов." + }, + "Username.LinkCopied": { + "key": "Username.LinkCopied", + "value": "Ссылка скопирована" + }, + "Username.LinkHint": { + "key": "Username.LinkHint", + "value": "По этой ссылке откроется диалог с Вами в Telegram:[\nhttps://t.me/%@]" + }, + "Username.Placeholder": { + "key": "Username.Placeholder", + "value": "Ваше имя" + }, + "Username.Title": { + "key": "Username.Title", + "value": "Имя пользователя" + }, + "Username.TooManyPublicUsernamesError": { + "key": "Username.TooManyPublicUsernamesError", + "value": "К сожалению, Вы используете слишком много публичных ссылок." + }, + "Username.UsernameIsAvailable": { + "key": "Username.UsernameIsAvailable", + "value": "Имя %@ доступно." + }, + "VoiceChat.AnonymousDisabledAlertText": { + "key": "VoiceChat.AnonymousDisabledAlertText", + "value": "Анонимные администраторы не могут участвовать в голосовых чатах." + }, + "VoiceChat.Audio": { + "key": "VoiceChat.Audio", + "value": "аудио" + }, + "VoiceChat.ChatFullAlertText": { + "key": "VoiceChat.ChatFullAlertText", + "value": "В этом голосовом чате максимальное число участников." + }, + "VoiceChat.Connecting": { + "key": "VoiceChat.Connecting", + "value": "Соединение..." + }, + "VoiceChat.CopyInviteLink": { + "key": "VoiceChat.CopyInviteLink", + "value": "Копировать ссылку" + }, + "VoiceChat.CreateNewVoiceChatStart": { + "key": "VoiceChat.CreateNewVoiceChatStart", + "value": "Начать" + }, + "VoiceChat.CreateNewVoiceChatText": { + "key": "VoiceChat.CreateNewVoiceChatText", + "value": "Голосовой чат завершён. Начать новый?" + }, + "VoiceChat.EndConfirmationEnd": { + "key": "VoiceChat.EndConfirmationEnd", + "value": "Завершить" + }, + "VoiceChat.EndConfirmationText": { + "key": "VoiceChat.EndConfirmationText", + "value": "Вы точно хотите завершить голосовой чат?" + }, + "VoiceChat.EndConfirmationTitle": { + "key": "VoiceChat.EndConfirmationTitle", + "value": "Завершить голосовой чат" + }, + "VoiceChat.EndVoiceChat": { + "key": "VoiceChat.EndVoiceChat", + "value": "Завершить голосовой чат" + }, + "VoiceChat.InviteLinkCopiedText": { + "key": "VoiceChat.InviteLinkCopiedText", + "value": "Ссылка скопирована в буфер обмена" + }, + "VoiceChat.InviteMember": { + "key": "VoiceChat.InviteMember", + "value": "Пригласить участников" + }, + "VoiceChat.InviteMemberToGroupFirstAdd": { + "key": "VoiceChat.InviteMemberToGroupFirstAdd", + "value": "Пригласить" + }, + "VoiceChat.InviteMemberToGroupFirstText": { + "key": "VoiceChat.InviteMemberToGroupFirstText", + "value": "%1$@ пока не в чате «%2$@». Пригласить?" + }, + "VoiceChat.InvitePeer": { + "key": "VoiceChat.InvitePeer", + "value": "Пригласить" + }, + "VoiceChat.InvitedPeerText": { + "key": "VoiceChat.InvitedPeerText", + "value": "Вы пригласили %@ в голосовой чат" + }, + "VoiceChat.Leave": { + "key": "VoiceChat.Leave", + "value": "выйти" + }, + "VoiceChat.Live": { + "key": "VoiceChat.Live", + "value": "Вы в эфире" + }, + "VoiceChat.Mute": { + "key": "VoiceChat.Mute", + "value": "Выключить микрофон" + }, + "VoiceChat.MuteForMe": { + "key": "VoiceChat.MuteForMe", + "value": "Выкл. звук для меня" + }, + "VoiceChat.MutePeer": { + "key": "VoiceChat.MutePeer", + "value": "Выключить микрофон" + }, + "VoiceChat.Muted": { + "key": "VoiceChat.Muted", + "value": "Без микрофона" + }, + "VoiceChat.MutedHelp": { + "key": "VoiceChat.MutedHelp", + "value": "Вам запретили использовать микрофон" + }, + "VoiceChat.OpenChat": { + "key": "VoiceChat.OpenChat", + "value": "Открыть чат" + }, + "VoiceChat.Panel.Members": { + "key": "VoiceChat.Panel.Members", + "zeroValue": null, + "oneValue": "%@ участник", + "twoValue": null, + "fewValue": "%@ участника", + "manyValue": "%@ участников", + "otherValue": "%@ участника" + }, + "VoiceChat.Panel.MembersSpeaking": { + "key": "VoiceChat.Panel.MembersSpeaking", + "zeroValue": null, + "oneValue": "%@ участник говорит", + "twoValue": null, + "fewValue": "%@ участника говорят", + "manyValue": "%@ участников говорят", + "otherValue": "%@ участника говорят" + }, + "VoiceChat.Panel.TapToJoin": { + "key": "VoiceChat.Panel.TapToJoin", + "value": "Нажмите для участия" + }, + "VoiceChat.PanelJoin": { + "key": "VoiceChat.PanelJoin", + "value": "Вступить" + }, + "VoiceChat.PeerJoinedText": { + "key": "VoiceChat.PeerJoinedText", + "value": "%@ теперь в голосовом чате" + }, + "VoiceChat.Reconnecting": { + "key": "VoiceChat.Reconnecting", + "value": "Переподключение..." + }, + "VoiceChat.RemovePeer": { + "key": "VoiceChat.RemovePeer", + "value": "Исключить" + }, + "VoiceChat.RemovePeerConfirmation": { + "key": "VoiceChat.RemovePeerConfirmation", + "value": "Вы точно хотите исключить %@ из группового чата?" + }, + "VoiceChat.RemovePeerRemove": { + "key": "VoiceChat.RemovePeerRemove", + "value": "Удалить" + }, + "VoiceChat.RemovedPeerText": { + "key": "VoiceChat.RemovedPeerText", + "value": "Вы исключили %@ из группы" + }, + "VoiceChat.Share": { + "key": "VoiceChat.Share", + "value": "Ссылка-приглашение" + }, + "VoiceChat.SpeakPermissionAdmin": { + "key": "VoiceChat.SpeakPermissionAdmin", + "value": "Новые участники только слушают" + }, + "VoiceChat.SpeakPermissionEveryone": { + "key": "VoiceChat.SpeakPermissionEveryone", + "value": "Все участники могут говорить" + }, + "VoiceChat.Status.Members": { + "key": "VoiceChat.Status.Members", + "zeroValue": null, + "oneValue": "[%@]участник", + "twoValue": null, + "fewValue": "[%@]участника", + "manyValue": "[%@]участников", + "otherValue": "[%@]участника" + }, + "VoiceChat.Status.MembersFormat": { + "key": "VoiceChat.Status.MembersFormat", + "value": "%1$@ %2$@" + }, + "VoiceChat.StatusInvited": { + "key": "VoiceChat.StatusInvited", + "value": "приглашен(а)" + }, + "VoiceChat.StatusListening": { + "key": "VoiceChat.StatusListening", + "value": "слушает" + }, + "VoiceChat.StatusMutedForYou": { + "key": "VoiceChat.StatusMutedForYou", + "value": "без звука для Вас" + }, + "VoiceChat.StatusMutedYou": { + "key": "VoiceChat.StatusMutedYou", + "value": "отключил для Вас звук" + }, + "VoiceChat.StatusSpeaking": { + "key": "VoiceChat.StatusSpeaking", + "value": "говорит" + }, + "VoiceChat.Title": { + "key": "VoiceChat.Title", + "value": "Голосовой чат" + }, + "VoiceChat.Unmute": { + "key": "VoiceChat.Unmute", + "value": "Нажмите, чтобы включить микрофон" + }, + "VoiceChat.UnmuteForMe": { + "key": "VoiceChat.UnmuteForMe", + "value": "Вкл. звук для меня" + }, + "VoiceChat.UnmuteHelp": { + "key": "VoiceChat.UnmuteHelp", + "value": "или удерживайте кнопку, чтобы говорить" + }, + "VoiceChat.UnmutePeer": { + "key": "VoiceChat.UnmutePeer", + "value": "Разрешить говорить" + }, + "VoiceChat.UserInvited": { + "key": "VoiceChat.UserInvited", + "value": "Вы пригласили **%@** в голосовой чат" + }, + "VoiceOver.AttachMedia": { + "key": "VoiceOver.AttachMedia", + "value": "Отправить медиа" + }, + "VoiceOver.AuthSessions.CurrentSession": { + "key": "VoiceOver.AuthSessions.CurrentSession", + "value": "Текущий сеанс" + }, + "VoiceOver.Chat.AnonymousPoll": { + "key": "VoiceOver.Chat.AnonymousPoll", + "value": "Анонимный опрос" + }, + "VoiceOver.Chat.AnonymousPollFrom": { + "key": "VoiceOver.Chat.AnonymousPollFrom", + "value": "Анонимный опрос от: %@" + }, + "VoiceOver.Chat.Caption": { + "key": "VoiceOver.Chat.Caption", + "value": "Подпись: %@" + }, + "VoiceOver.Chat.ChannelInfo": { + "key": "VoiceOver.Chat.ChannelInfo", + "value": "Информация о канале" + }, + "VoiceOver.Chat.Contact": { + "key": "VoiceOver.Chat.Contact", + "value": "Отправленный контакт" + }, + "VoiceOver.Chat.ContactEmail": { + "key": "VoiceOver.Chat.ContactEmail", + "value": "Email" + }, + "VoiceOver.Chat.ContactEmailCount": { + "key": "VoiceOver.Chat.ContactEmailCount", + "zeroValue": null, + "oneValue": "%@ адрес электронной почты", + "twoValue": null, + "fewValue": "%@ адреса электронной почты", + "manyValue": "%@ адресов электронной почты", + "otherValue": "%@ адресов электронной почты" + }, + "VoiceOver.Chat.ContactFrom": { + "key": "VoiceOver.Chat.ContactFrom", + "value": "Отправленный контакт от: %@" + }, + "VoiceOver.Chat.ContactOrganization": { + "key": "VoiceOver.Chat.ContactOrganization", + "value": "Организация: %@" + }, + "VoiceOver.Chat.ContactPhoneNumber": { + "key": "VoiceOver.Chat.ContactPhoneNumber", + "value": "Номер телефона" + }, + "VoiceOver.Chat.ContactPhoneNumberCount": { + "key": "VoiceOver.Chat.ContactPhoneNumberCount", + "zeroValue": null, + "oneValue": "%@ номер телефона", + "twoValue": null, + "fewValue": "%@ номера телефона", + "manyValue": "%@ номеров телефона", + "otherValue": "%@ номеров телефона" + }, + "VoiceOver.Chat.Duration": { + "key": "VoiceOver.Chat.Duration", + "value": "Длительность: %@" + }, + "VoiceOver.Chat.File": { + "key": "VoiceOver.Chat.File", + "value": "Файл" + }, + "VoiceOver.Chat.FileFrom": { + "key": "VoiceOver.Chat.FileFrom", + "value": "Файл от: %@" + }, + "VoiceOver.Chat.ForwardedFrom": { + "key": "VoiceOver.Chat.ForwardedFrom", + "value": "Переслано от: %@" + }, + "VoiceOver.Chat.ForwardedFromYou": { + "key": "VoiceOver.Chat.ForwardedFromYou", + "value": "Переслано от Вас" + }, + "VoiceOver.Chat.GoToOriginalMessage": { + "key": "VoiceOver.Chat.GoToOriginalMessage", + "value": "Перейти к сообщению" + }, + "VoiceOver.Chat.GroupInfo": { + "key": "VoiceOver.Chat.GroupInfo", + "value": "Информация о группе" + }, + "VoiceOver.Chat.Message": { + "key": "VoiceOver.Chat.Message", + "value": "Сообщение" + }, + "VoiceOver.Chat.MessagesSelected": { + "key": "VoiceOver.Chat.MessagesSelected", + "zeroValue": null, + "oneValue": "Выбрано %@ сообщение", + "twoValue": null, + "fewValue": "Выбрано %@ сообщения", + "manyValue": "Выбрано %@ сообщений", + "otherValue": "Выбрано %@ сообщения" + }, + "VoiceOver.Chat.Music": { + "key": "VoiceOver.Chat.Music", + "value": "Аудиосообщение" + }, + "VoiceOver.Chat.MusicFrom": { + "key": "VoiceOver.Chat.MusicFrom", + "value": "Аудиофайл от: %@" + }, + "VoiceOver.Chat.MusicTitle": { + "key": "VoiceOver.Chat.MusicTitle", + "value": "%1$@, %2$@" + }, + "VoiceOver.Chat.OpenHint": { + "key": "VoiceOver.Chat.OpenHint", + "value": "Нажмите дважды, чтобы открыть" + }, + "VoiceOver.Chat.OpenLinkHint": { + "key": "VoiceOver.Chat.OpenLinkHint", + "value": "Нажмите дважды, чтобы перейти по ссылке" + }, + "VoiceOver.Chat.OptionSelected": { + "key": "VoiceOver.Chat.OptionSelected", + "value": "выбрано" + }, + "VoiceOver.Chat.PagePreview": { + "key": "VoiceOver.Chat.PagePreview", + "value": "Предпросмотр страницы" + }, + "VoiceOver.Chat.Photo": { + "key": "VoiceOver.Chat.Photo", + "value": "Фотография" + }, + "VoiceOver.Chat.PhotoFrom": { + "key": "VoiceOver.Chat.PhotoFrom", + "value": "Фотография от: %@" + }, + "VoiceOver.Chat.PlayHint": { + "key": "VoiceOver.Chat.PlayHint", + "value": "Нажмите дважды, чтобы воспроизвести" + }, + "VoiceOver.Chat.PollFinalResults": { + "key": "VoiceOver.Chat.PollFinalResults", + "value": "Результаты" + }, + "VoiceOver.Chat.PollNoVotes": { + "key": "VoiceOver.Chat.PollNoVotes", + "value": "Нет голосов" + }, + "VoiceOver.Chat.PollOptionCount": { + "key": "VoiceOver.Chat.PollOptionCount", + "zeroValue": null, + "oneValue": "%@ вариант:", + "twoValue": null, + "fewValue": "%@ варианта:", + "manyValue": "%@ вариантов:", + "otherValue": "%@ вариантов:" + }, + "VoiceOver.Chat.PollVotes": { + "key": "VoiceOver.Chat.PollVotes", + "zeroValue": null, + "oneValue": "%@ голос", + "twoValue": null, + "fewValue": "%@ голоса", + "manyValue": "%@ голосов", + "otherValue": "%@ голосов" + }, + "VoiceOver.Chat.Profile": { + "key": "VoiceOver.Chat.Profile", + "value": "Профиль" + }, + "VoiceOver.Chat.RecordModeVideoMessage": { + "key": "VoiceOver.Chat.RecordModeVideoMessage", + "value": "Видеосообщение" + }, + "VoiceOver.Chat.RecordModeVideoMessageInfo": { + "key": "VoiceOver.Chat.RecordModeVideoMessageInfo", + "value": "Для записи видеосообщения нажмите дважды и удерживайте. Чтобы продолжать запись, проведите вверх по экрану. Чтобы переключиться на аудио, нажмите дважды." + }, + "VoiceOver.Chat.RecordModeVoiceMessage": { + "key": "VoiceOver.Chat.RecordModeVoiceMessage", + "value": "Голосовое сообщение" + }, + "VoiceOver.Chat.RecordModeVoiceMessageInfo": { + "key": "VoiceOver.Chat.RecordModeVoiceMessageInfo", + "value": "Для записи аудиосообщения нажмите дважды и удерживайте. Чтобы продолжать запись, проведите вверх по экрану. Для отмены проведите влево. Чтобы переключиться на видео, нажмите дважды." + }, + "VoiceOver.Chat.RecordPreviewVoiceMessage": { + "key": "VoiceOver.Chat.RecordPreviewVoiceMessage", + "value": "Предпросмотр голосового сообщения" + }, + "VoiceOver.Chat.Reply": { + "key": "VoiceOver.Chat.Reply", + "value": "Ответ на сообщение" + }, + "VoiceOver.Chat.ReplyFrom": { + "key": "VoiceOver.Chat.ReplyFrom", + "value": "Ответ на сообщение от: %@" + }, + "VoiceOver.Chat.ReplyToYourMessage": { + "key": "VoiceOver.Chat.ReplyToYourMessage", + "value": "Ответ на ваше сообщение" + }, + "VoiceOver.Chat.SeenByRecipient": { + "key": "VoiceOver.Chat.SeenByRecipient", + "value": "Прочитано получателем" + }, + "VoiceOver.Chat.SeenByRecipients": { + "key": "VoiceOver.Chat.SeenByRecipients", + "value": "Прочитано получателями" + }, + "VoiceOver.Chat.Selected": { + "key": "VoiceOver.Chat.Selected", + "value": "Выбрано" + }, + "VoiceOver.Chat.Size": { + "key": "VoiceOver.Chat.Size", + "value": "Размер: %@" + }, + "VoiceOver.Chat.Title": { + "key": "VoiceOver.Chat.Title", + "value": "Название: %@" + }, + "VoiceOver.Chat.UnreadMessages": { + "key": "VoiceOver.Chat.UnreadMessages", + "zeroValue": null, + "oneValue": "%@ непрочитанное сообщение", + "twoValue": null, + "fewValue": "%@ непрочитанных сообщения", + "manyValue": "%@ непрочитанных сообщений", + "otherValue": "%@ непрочитанных сообщения" + }, + "VoiceOver.Chat.Video": { + "key": "VoiceOver.Chat.Video", + "value": "Видео" + }, + "VoiceOver.Chat.VideoFrom": { + "key": "VoiceOver.Chat.VideoFrom", + "value": "Видео от: %@" + }, + "VoiceOver.Chat.VideoMessage": { + "key": "VoiceOver.Chat.VideoMessage", + "value": "Видеосообщение" + }, + "VoiceOver.Chat.VideoMessageFrom": { + "key": "VoiceOver.Chat.VideoMessageFrom", + "value": "Видеосообщение от: %@" + }, + "VoiceOver.Chat.VoiceMessage": { + "key": "VoiceOver.Chat.VoiceMessage", + "value": "Голосовое сообщение" + }, + "VoiceOver.Chat.VoiceMessageFrom": { + "key": "VoiceOver.Chat.VoiceMessageFrom", + "value": "Голосовое сообщение от: %@" + }, + "VoiceOver.Chat.YourAnonymousPoll": { + "key": "VoiceOver.Chat.YourAnonymousPoll", + "value": "Ваш анонимный опрос" + }, + "VoiceOver.Chat.YourContact": { + "key": "VoiceOver.Chat.YourContact", + "value": "Отправленный Вами контакт" + }, + "VoiceOver.Chat.YourFile": { + "key": "VoiceOver.Chat.YourFile", + "value": "Ваш файл" + }, + "VoiceOver.Chat.YourMessage": { + "key": "VoiceOver.Chat.YourMessage", + "value": "Ваше сообщение" + }, + "VoiceOver.Chat.YourMusic": { + "key": "VoiceOver.Chat.YourMusic", + "value": "Ваше аудиосообщение" + }, + "VoiceOver.Chat.YourPhoto": { + "key": "VoiceOver.Chat.YourPhoto", + "value": "Ваша фотография" + }, + "VoiceOver.Chat.YourVideo": { + "key": "VoiceOver.Chat.YourVideo", + "value": "Ваше видео" + }, + "VoiceOver.Chat.YourVideoMessage": { + "key": "VoiceOver.Chat.YourVideoMessage", + "value": "Ваше видеосообщение" + }, + "VoiceOver.Chat.YourVoiceMessage": { + "key": "VoiceOver.Chat.YourVoiceMessage", + "value": "Ваше голосовое сообщение" + }, + "VoiceOver.ChatList.Message": { + "key": "VoiceOver.ChatList.Message", + "value": "Сообщение" + }, + "VoiceOver.ChatList.MessageEmpty": { + "key": "VoiceOver.ChatList.MessageEmpty", + "value": "Пусто" + }, + "VoiceOver.ChatList.MessageFrom": { + "key": "VoiceOver.ChatList.MessageFrom", + "value": "От: %@" + }, + "VoiceOver.ChatList.MessageRead": { + "key": "VoiceOver.ChatList.MessageRead", + "value": "Прочитано" + }, + "VoiceOver.ChatList.OutgoingMessage": { + "key": "VoiceOver.ChatList.OutgoingMessage", + "value": "Исходящее сообщение" + }, + "VoiceOver.Common.Off": { + "key": "VoiceOver.Common.Off", + "value": "Выключено" + }, + "VoiceOver.Common.On": { + "key": "VoiceOver.Common.On", + "value": "Включено" + }, + "VoiceOver.Common.SwitchHint": { + "key": "VoiceOver.Common.SwitchHint", + "value": "Чтобы переключить настройку, нажмите два раза" + }, + "VoiceOver.DiscardPreparedContent": { + "key": "VoiceOver.DiscardPreparedContent", + "value": "Сбросить" + }, + "VoiceOver.DismissContextMenu": { + "key": "VoiceOver.DismissContextMenu", + "value": "Закрыть контекстное меню" + }, + "VoiceOver.Editing.ClearText": { + "key": "VoiceOver.Editing.ClearText", + "value": "Очистить текст" + }, + "VoiceOver.Media.PlaybackPause": { + "key": "VoiceOver.Media.PlaybackPause", + "value": "Пауза" + }, + "VoiceOver.Media.PlaybackPlay": { + "key": "VoiceOver.Media.PlaybackPlay", + "value": "Воспроизвести" + }, + "VoiceOver.Media.PlaybackRate": { + "key": "VoiceOver.Media.PlaybackRate", + "value": "Скорость воспроизведения" + }, + "VoiceOver.Media.PlaybackRateChange": { + "key": "VoiceOver.Media.PlaybackRateChange", + "value": "Для изменения нажмите дважды" + }, + "VoiceOver.Media.PlaybackRateFast": { + "key": "VoiceOver.Media.PlaybackRateFast", + "value": "Быстрая" + }, + "VoiceOver.Media.PlaybackRateNormal": { + "key": "VoiceOver.Media.PlaybackRateNormal", + "value": "Нормальная" + }, + "VoiceOver.Media.PlaybackStop": { + "key": "VoiceOver.Media.PlaybackStop", + "value": "Остановить воспроизведение" + }, + "VoiceOver.MessageContextDelete": { + "key": "VoiceOver.MessageContextDelete", + "value": "Удалить" + }, + "VoiceOver.MessageContextForward": { + "key": "VoiceOver.MessageContextForward", + "value": "Переслать" + }, + "VoiceOver.MessageContextOpenMessageMenu": { + "key": "VoiceOver.MessageContextOpenMessageMenu", + "value": "Открыть меню сообщения" + }, + "VoiceOver.MessageContextReply": { + "key": "VoiceOver.MessageContextReply", + "value": "Ответить" + }, + "VoiceOver.MessageContextReport": { + "key": "VoiceOver.MessageContextReport", + "value": "Пожаловаться" + }, + "VoiceOver.MessageContextSend": { + "key": "VoiceOver.MessageContextSend", + "value": "Отправить" + }, + "VoiceOver.MessageContextShare": { + "key": "VoiceOver.MessageContextShare", + "value": "Поделиться" + }, + "VoiceOver.Navigation.Compose": { + "key": "VoiceOver.Navigation.Compose", + "value": "Создать" + }, + "VoiceOver.Navigation.ProxySettings": { + "key": "VoiceOver.Navigation.ProxySettings", + "value": "Настройки прокси" + }, + "VoiceOver.Navigation.Search": { + "key": "VoiceOver.Navigation.Search", + "value": "Поиск" + }, + "VoiceOver.Recording.StopAndPreview": { + "key": "VoiceOver.Recording.StopAndPreview", + "value": "Остановить и перейти к предпросмотру" + }, + "VoiceOver.ScrollStatus": { + "key": "VoiceOver.ScrollStatus", + "value": "Строка %1$@ из %2$@" + }, + "Wallpaper.DeleteConfirmation": { + "key": "Wallpaper.DeleteConfirmation", + "zeroValue": null, + "oneValue": "Удалить %@ фон", + "twoValue": null, + "fewValue": "Удалить %@ фона", + "manyValue": "Удалить %@ фонов", + "otherValue": "Удалить %@ фонов" + }, + "Wallpaper.ErrorNotFound": { + "key": "Wallpaper.ErrorNotFound", + "value": "Похоже, такого фона не существует." + }, + "Wallpaper.PhotoLibrary": { + "key": "Wallpaper.PhotoLibrary", + "value": "Библиотека" + }, + "Wallpaper.ResetWallpapers": { + "key": "Wallpaper.ResetWallpapers", + "value": "Сбросить настройки фона" + }, + "Wallpaper.ResetWallpapersConfirmation": { + "key": "Wallpaper.ResetWallpapersConfirmation", + "value": "Сбросить все фоны" + }, + "Wallpaper.ResetWallpapersInfo": { + "key": "Wallpaper.ResetWallpapersInfo", + "value": "Удалить все загруженные фоны и восстановить предустановленные фоны для всех тем." + }, + "Wallpaper.Search": { + "key": "Wallpaper.Search", + "value": "Поиск изображений" + }, + "Wallpaper.SearchShort": { + "key": "Wallpaper.SearchShort", + "value": "Поиск" + }, + "Wallpaper.Set": { + "key": "Wallpaper.Set", + "value": "Применить" + }, + "Wallpaper.SetColor": { + "key": "Wallpaper.SetColor", + "value": "Задать цвет" + }, + "Wallpaper.SetCustomBackground": { + "key": "Wallpaper.SetCustomBackground", + "value": "Выбрать из галереи" + }, + "Wallpaper.SetCustomBackgroundInfo": { + "key": "Wallpaper.SetCustomBackgroundInfo", + "value": "Вы можете настроить собственный фон и поделиться им с друзьями." + }, + "Wallpaper.Title": { + "key": "Wallpaper.Title", + "value": "Фон чатов" + }, + "Wallpaper.Wallpaper": { + "key": "Wallpaper.Wallpaper", + "value": "Обои" + }, + "WallpaperColors.SetCustomColor": { + "key": "WallpaperColors.SetCustomColor", + "value": "Подобрать свой цвет" + }, + "WallpaperColors.Title": { + "key": "WallpaperColors.Title", + "value": "Задать цвет" + }, + "WallpaperPreview.Blurred": { + "key": "WallpaperPreview.Blurred", + "value": "Размытие" + }, + "WallpaperPreview.CropBottomText": { + "key": "WallpaperPreview.CropBottomText", + "value": "Фоном можно будет поделиться с друзьями с помощью специальной ссылки" + }, + "WallpaperPreview.CropTopText": { + "key": "WallpaperPreview.CropTopText", + "value": "Перемещайте по экрану, чтобы выбрать нужный фрагмент" + }, + "WallpaperPreview.CustomColorBottomText": { + "key": "WallpaperPreview.CustomColorBottomText", + "value": "Что-нибудь в тон шторам" + }, + "WallpaperPreview.CustomColorTopText": { + "key": "WallpaperPreview.CustomColorTopText", + "value": "Используйте спектр ниже, чтобы выбрать нужный цвет" + }, + "WallpaperPreview.Motion": { + "key": "WallpaperPreview.Motion", + "value": "Движение" + }, + "WallpaperPreview.Pattern": { + "key": "WallpaperPreview.Pattern", + "value": "Узор" + }, + "WallpaperPreview.PatternIntensity": { + "key": "WallpaperPreview.PatternIntensity", + "value": "Яркость узора" + }, + "WallpaperPreview.PatternPaternApply": { + "key": "WallpaperPreview.PatternPaternApply", + "value": "Применить" + }, + "WallpaperPreview.PatternPaternDiscard": { + "key": "WallpaperPreview.PatternPaternDiscard", + "value": "Отмена" + }, + "WallpaperPreview.PatternTitle": { + "key": "WallpaperPreview.PatternTitle", + "value": "Выберите узор" + }, + "WallpaperPreview.PreviewBottomText": { + "key": "WallpaperPreview.PreviewBottomText", + "value": "Наслаждайтесь видом" + }, + "WallpaperPreview.PreviewTopText": { + "key": "WallpaperPreview.PreviewTopText", + "value": "Чтобы применить фон, нажмите «Установить»" + }, + "WallpaperPreview.SwipeBottomText": { + "key": "WallpaperPreview.SwipeBottomText", + "value": "Включите «Движение» и попробуйте наклонить устройство" + }, + "WallpaperPreview.SwipeColorsBottomText": { + "key": "WallpaperPreview.SwipeColorsBottomText", + "value": "Фисташковый — вкус, а не цвет" + }, + "WallpaperPreview.SwipeColorsTopText": { + "key": "WallpaperPreview.SwipeColorsTopText", + "value": "Проведите влево или вправо, чтобы просмотреть другие цвета" + }, + "WallpaperPreview.SwipeTopText": { + "key": "WallpaperPreview.SwipeTopText", + "value": "Проведите влево или вправо, чтобы просмотреть другие фоны" + }, + "WallpaperPreview.Title": { + "key": "WallpaperPreview.Title", + "value": "Предпросмотр фона" + }, + "WallpaperSearch.ColorBlack": { + "key": "WallpaperSearch.ColorBlack", + "value": "Чёрный" + }, + "WallpaperSearch.ColorBlue": { + "key": "WallpaperSearch.ColorBlue", + "value": "Синий" + }, + "WallpaperSearch.ColorBrown": { + "key": "WallpaperSearch.ColorBrown", + "value": "Коричневый" + }, + "WallpaperSearch.ColorGray": { + "key": "WallpaperSearch.ColorGray", + "value": "Серый" + }, + "WallpaperSearch.ColorGreen": { + "key": "WallpaperSearch.ColorGreen", + "value": "Зелёный" + }, + "WallpaperSearch.ColorOrange": { + "key": "WallpaperSearch.ColorOrange", + "value": "Оранжевый" + }, + "WallpaperSearch.ColorPink": { + "key": "WallpaperSearch.ColorPink", + "value": "Розовый" + }, + "WallpaperSearch.ColorPrefix": { + "key": "WallpaperSearch.ColorPrefix", + "value": "цвет:" + }, + "WallpaperSearch.ColorPurple": { + "key": "WallpaperSearch.ColorPurple", + "value": "Фиолетовый" + }, + "WallpaperSearch.ColorRed": { + "key": "WallpaperSearch.ColorRed", + "value": "Красный" + }, + "WallpaperSearch.ColorTeal": { + "key": "WallpaperSearch.ColorTeal", + "value": "Цвет морской волны" + }, + "WallpaperSearch.ColorTitle": { + "key": "WallpaperSearch.ColorTitle", + "value": "ПОИСК ПО ЦВЕТУ" + }, + "WallpaperSearch.ColorWhite": { + "key": "WallpaperSearch.ColorWhite", + "value": "Белый" + }, + "WallpaperSearch.ColorYellow": { + "key": "WallpaperSearch.ColorYellow", + "value": "Жёлтый" + }, + "WallpaperSearch.Recent": { + "key": "WallpaperSearch.Recent", + "value": "НЕДАВНИЕ" + }, + "Watch.AppName": { + "key": "Watch.AppName", + "value": "Telegram" + }, + "Watch.AuthRequired": { + "key": "Watch.AuthRequired", + "value": "Войдите в Telegram на телефоне, чтобы начать" + }, + "Watch.Bot.Restart": { + "key": "Watch.Bot.Restart", + "value": "Перезапустить" + }, + "Watch.ChannelInfo.Title": { + "key": "Watch.ChannelInfo.Title", + "value": "О канале" + }, + "Watch.ChatList.Compose": { + "key": "Watch.ChatList.Compose", + "value": "Новое сообщение" + }, + "Watch.ChatList.NoConversationsText": { + "key": "Watch.ChatList.NoConversationsText", + "value": "Для отправки сообщения надавите на экран и\nвыберите «Новое сообщение»" + }, + "Watch.ChatList.NoConversationsTitle": { + "key": "Watch.ChatList.NoConversationsTitle", + "value": "Нет сообщений" + }, + "Watch.Compose.AddContact": { + "key": "Watch.Compose.AddContact", + "value": "Выбрать контакт" + }, + "Watch.Compose.CreateMessage": { + "key": "Watch.Compose.CreateMessage", + "value": "Создать сообщение" + }, + "Watch.Compose.CurrentLocation": { + "key": "Watch.Compose.CurrentLocation", + "value": "Геопозиция сейчас" + }, + "Watch.Compose.Send": { + "key": "Watch.Compose.Send", + "value": "Отправить" + }, + "Watch.ConnectionDescription": { + "key": "Watch.ConnectionDescription", + "value": "Ваши часы должны быть подключены к телефону, чтобы приложение работало корректно" + }, + "Watch.Contacts.NoResults": { + "key": "Watch.Contacts.NoResults", + "value": "Подходящих контактов\nне найдено" + }, + "Watch.Conversation.GroupInfo": { + "key": "Watch.Conversation.GroupInfo", + "value": "О группе" + }, + "Watch.Conversation.Reply": { + "key": "Watch.Conversation.Reply", + "value": "Ответить" + }, + "Watch.Conversation.Unblock": { + "key": "Watch.Conversation.Unblock", + "value": "Разблокировать" + }, + "Watch.Conversation.UserInfo": { + "key": "Watch.Conversation.UserInfo", + "value": "Информация" + }, + "Watch.GroupInfo.Title": { + "key": "Watch.GroupInfo.Title", + "value": "Информация о группе" + }, + "Watch.LastSeen.ALongTimeAgo": { + "key": "Watch.LastSeen.ALongTimeAgo", + "value": "очень давно" + }, + "Watch.LastSeen.AtDate": { + "key": "Watch.LastSeen.AtDate", + "value": "%@" + }, + "Watch.LastSeen.HoursAgo": { + "key": "Watch.LastSeen.HoursAgo", + "zeroValue": null, + "oneValue": "%@ час назад", + "twoValue": null, + "fewValue": "%@ часа назад", + "manyValue": "%@ часов назад", + "otherValue": "%@ часа назад" + }, + "Watch.LastSeen.JustNow": { + "key": "Watch.LastSeen.JustNow", + "value": "только что" + }, + "Watch.LastSeen.Lately": { + "key": "Watch.LastSeen.Lately", + "value": "недавно" + }, + "Watch.LastSeen.MinutesAgo": { + "key": "Watch.LastSeen.MinutesAgo", + "zeroValue": null, + "oneValue": "%@ минуту назад", + "twoValue": null, + "fewValue": "%@ мин. назад", + "manyValue": "%@ мин. назад", + "otherValue": "%@ мин. назад" + }, + "Watch.LastSeen.WithinAMonth": { + "key": "Watch.LastSeen.WithinAMonth", + "value": "в этом месяце" + }, + "Watch.LastSeen.WithinAWeek": { + "key": "Watch.LastSeen.WithinAWeek", + "value": "на этой неделе" + }, + "Watch.LastSeen.YesterdayAt": { + "key": "Watch.LastSeen.YesterdayAt", + "value": "вчера в %@" + }, + "Watch.Location.Access": { + "key": "Watch.Location.Access", + "value": "Разрешите Telegram доступ к геолокации в настройках телефона" + }, + "Watch.Location.Current": { + "key": "Watch.Location.Current", + "value": "Геопозиция сейчас" + }, + "Watch.Message.Call": { + "key": "Watch.Message.Call", + "value": "Звонок" + }, + "Watch.Message.ForwardedFrom": { + "key": "Watch.Message.ForwardedFrom", + "value": "Переслано от:" + }, + "Watch.Message.Game": { + "key": "Watch.Message.Game", + "value": "Игра" + }, + "Watch.Message.Invoice": { + "key": "Watch.Message.Invoice", + "value": "Счёт" + }, + "Watch.Message.Poll": { + "key": "Watch.Message.Poll", + "value": "Опрос" + }, + "Watch.Message.Unsupported": { + "key": "Watch.Message.Unsupported", + "value": "Сообщение не поддерживается" + }, + "Watch.MessageView.Forward": { + "key": "Watch.MessageView.Forward", + "value": "Переслать" + }, + "Watch.MessageView.Reply": { + "key": "Watch.MessageView.Reply", + "value": "Ответить" + }, + "Watch.MessageView.Title": { + "key": "Watch.MessageView.Title", + "value": "Сообщение" + }, + "Watch.MessageView.ViewOnPhone": { + "key": "Watch.MessageView.ViewOnPhone", + "value": "Открыть на телефоне" + }, + "Watch.Microphone.Access": { + "key": "Watch.Microphone.Access", + "value": "Разрешите Telegram доступ к микрофону" + }, + "Watch.NoConnection": { + "key": "Watch.NoConnection", + "value": "Нет связи" + }, + "Watch.Notification.Joined": { + "key": "Watch.Notification.Joined", + "value": "Теперь в Telegram" + }, + "Watch.PhotoView.Title": { + "key": "Watch.PhotoView.Title", + "value": "Фотография" + }, + "Watch.Stickers.RecentPlaceholder": { + "key": "Watch.Stickers.RecentPlaceholder", + "value": "Здесь будут показаны часто используемые стикеры" + }, + "Watch.Stickers.Recents": { + "key": "Watch.Stickers.Recents", + "value": "Недавние" + }, + "Watch.Stickers.StickerPacks": { + "key": "Watch.Stickers.StickerPacks", + "value": "Наборы стикеров" + }, + "Watch.Suggestion.BRB": { + "key": "Watch.Suggestion.BRB", + "value": "Скоро вернусь." + }, + "Watch.Suggestion.CantTalk": { + "key": "Watch.Suggestion.CantTalk", + "value": "Не могу сейчас говорить…" + }, + "Watch.Suggestion.HoldOn": { + "key": "Watch.Suggestion.HoldOn", + "value": "Подожди секундочку…" + }, + "Watch.Suggestion.OK": { + "key": "Watch.Suggestion.OK", + "value": "ОК" + }, + "Watch.Suggestion.OnMyWay": { + "key": "Watch.Suggestion.OnMyWay", + "value": "Я в пути." + }, + "Watch.Suggestion.TalkLater": { + "key": "Watch.Suggestion.TalkLater", + "value": "Поговорим позже?" + }, + "Watch.Suggestion.Thanks": { + "key": "Watch.Suggestion.Thanks", + "value": "Спасибо!" + }, + "Watch.Suggestion.WhatsUp": { + "key": "Watch.Suggestion.WhatsUp", + "value": "Как дела?" + }, + "Watch.Time.ShortFullAt": { + "key": "Watch.Time.ShortFullAt", + "value": "%1$@ %2$@" + }, + "Watch.Time.ShortTodayAt": { + "key": "Watch.Time.ShortTodayAt", + "value": "Сегодня %@" + }, + "Watch.Time.ShortWeekdayAt": { + "key": "Watch.Time.ShortWeekdayAt", + "value": "%1$@ %2$@" + }, + "Watch.Time.ShortYesterdayAt": { + "key": "Watch.Time.ShortYesterdayAt", + "value": "Вчера %@" + }, + "Watch.UserInfo.Block": { + "key": "Watch.UserInfo.Block", + "value": "Заблокировать" + }, + "Watch.UserInfo.Mute": { + "key": "Watch.UserInfo.Mute", + "zeroValue": null, + "oneValue": "Не беспокоить %@ час", + "twoValue": null, + "fewValue": "Не беспокоить %@ часа", + "manyValue": "Не беспокоить %@ часов", + "otherValue": "Не беспокоить %@ часов" + }, + "Watch.UserInfo.MuteTitle": { + "key": "Watch.UserInfo.MuteTitle", + "value": "Убрать звук" + }, + "Watch.UserInfo.Service": { + "key": "Watch.UserInfo.Service", + "value": "служебные уведомления" + }, + "Watch.UserInfo.Title": { + "key": "Watch.UserInfo.Title", + "value": "Информация" + }, + "Watch.UserInfo.Unblock": { + "key": "Watch.UserInfo.Unblock", + "value": "Разблокировать" + }, + "Watch.UserInfo.Unmute": { + "key": "Watch.UserInfo.Unmute", + "value": "Вкл. звук" + }, + "WatchRemote.AlertOpen": { + "key": "WatchRemote.AlertOpen", + "value": "Читать" + }, + "WatchRemote.AlertText": { + "key": "WatchRemote.AlertText", + "value": "Прочитать сообщение здесь?" + }, + "WatchRemote.AlertTitle": { + "key": "WatchRemote.AlertTitle", + "value": "Сообщение от Apple Watch" + }, + "WatchRemote.NotificationText": { + "key": "WatchRemote.NotificationText", + "value": "Откройте это уведомление на телефоне, чтобы прочитать сообщение от Apple Watch" + }, + "Web.Error": { + "key": "Web.Error", + "value": "Невозможно загрузить страницу" + }, + "Web.OpenExternal": { + "key": "Web.OpenExternal", + "value": "Открыть в Safari" + }, + "WebBrowser.DefaultBrowser": { + "key": "WebBrowser.DefaultBrowser", + "value": "БРАУЗЕР ПО УМОЛЧАНИЮ" + }, + "WebBrowser.InAppSafari": { + "key": "WebBrowser.InAppSafari", + "value": "Safari в приложении" + }, + "WebBrowser.Title": { + "key": "WebBrowser.Title", + "value": "Браузер" + }, + "WebPreview.GettingLinkInfo": { + "key": "WebPreview.GettingLinkInfo", + "value": "Получение информации…" + }, + "WebSearch.GIFs": { + "key": "WebSearch.GIFs", + "value": "GIF" + }, + "WebSearch.Images": { + "key": "WebSearch.Images", + "value": "Изображения" + }, + "WebSearch.RecentClearConfirmation": { + "key": "WebSearch.RecentClearConfirmation", + "value": "Вы точно хотите удалить последние изображения?" + }, + "WebSearch.RecentSectionClear": { + "key": "WebSearch.RecentSectionClear", + "value": "Очистить" + }, + "WebSearch.RecentSectionTitle": { + "key": "WebSearch.RecentSectionTitle", + "value": "Недавние" + }, + "WebSearch.SearchNoResults": { + "key": "WebSearch.SearchNoResults", + "value": "Нет результатов" + }, + "WebSearch.SearchNoResultsDescription": { + "key": "WebSearch.SearchNoResultsDescription", + "value": "По запросу «%@» ничего не найдено.\nПопробуйте снова." + }, + "Weekday.Friday": { + "key": "Weekday.Friday", + "value": "пятница" + }, + "Weekday.Monday": { + "key": "Weekday.Monday", + "value": "понедельник" + }, + "Weekday.Saturday": { + "key": "Weekday.Saturday", + "value": "суббота" + }, + "Weekday.ShortFriday": { + "key": "Weekday.ShortFriday", + "value": "пт" + }, + "Weekday.ShortMonday": { + "key": "Weekday.ShortMonday", + "value": "пн" + }, + "Weekday.ShortSaturday": { + "key": "Weekday.ShortSaturday", + "value": "сб" + }, + "Weekday.ShortSunday": { + "key": "Weekday.ShortSunday", + "value": "вс" + }, + "Weekday.ShortThursday": { + "key": "Weekday.ShortThursday", + "value": "чт" + }, + "Weekday.ShortTuesday": { + "key": "Weekday.ShortTuesday", + "value": "вт" + }, + "Weekday.ShortWednesday": { + "key": "Weekday.ShortWednesday", + "value": "ср" + }, + "Weekday.Sunday": { + "key": "Weekday.Sunday", + "value": "воскресенье" + }, + "Weekday.Thursday": { + "key": "Weekday.Thursday", + "value": "четверг" + }, + "Weekday.Today": { + "key": "Weekday.Today", + "value": "Сегодня" + }, + "Weekday.Tuesday": { + "key": "Weekday.Tuesday", + "value": "вторник" + }, + "Weekday.Wednesday": { + "key": "Weekday.Wednesday", + "value": "среда" + }, + "Weekday.Yesterday": { + "key": "Weekday.Yesterday", + "value": "Вчера" + }, + "Widget.ApplicationLocked": { + "key": "Widget.ApplicationLocked", + "value": "Разблокируйте приложение, чтобы использовать виджет" + }, + "Widget.ApplicationStartRequired": { + "key": "Widget.ApplicationStartRequired", + "value": "Чтобы использовать виджет, зайдите в приложение" + }, + "Widget.AuthRequired": { + "key": "Widget.AuthRequired", + "value": "Войти в Telegram" + }, + "Widget.ChatsGalleryDescription": { + "key": "Widget.ChatsGalleryDescription", + "value": "Вы можете видеть новые сообщения в важных чатах." + }, + "Widget.ChatsGalleryTitle": { + "key": "Widget.ChatsGalleryTitle", + "value": "Чаты" + }, + "Widget.LongTapToEdit": { + "key": "Widget.LongTapToEdit", + "value": "Нажмите для настройки виджета." + }, + "Widget.MessageAutoremoveTimerRemoved": { + "key": "Widget.MessageAutoremoveTimerRemoved", + "value": "Таймер для удаления отключен" + }, + "Widget.MessageAutoremoveTimerUpdated": { + "key": "Widget.MessageAutoremoveTimerUpdated", + "value": "Таймер для удаления обновлён" + }, + "Widget.NoUsers": { + "key": "Widget.NoUsers", + "value": "Здесь будут показаны люди, с которыми Вы переписываетесь." + }, + "Widget.ShortcutsGalleryDescription": { + "key": "Widget.ShortcutsGalleryDescription", + "value": "Вы можете добавить ярлыки для быстрого доступа к важным чатам." + }, + "Widget.ShortcutsGalleryTitle": { + "key": "Widget.ShortcutsGalleryTitle", + "value": "Ярлыки" + }, + "Widget.UpdatedAt": { + "key": "Widget.UpdatedAt", + "value": "Обновлено {}" + }, + "Widget.UpdatedTodayAt": { + "key": "Widget.UpdatedTodayAt", + "value": "Обновлено в {}" + }, + "Your_card_has_expired": { + "key": "Your_card_has_expired", + "value": "Срок действия вашей карты истёк." + }, + "Your_card_was_declined": { + "key": "Your_card_was_declined", + "value": "Ваша карта была отклонена." + }, + "Your_cards_expiration_month_is_invalid": { + "key": "Your_cards_expiration_month_is_invalid", + "value": "Вы ввели неверный месяц завершения срока действия." + }, + "Your_cards_expiration_year_is_invalid": { + "key": "Your_cards_expiration_year_is_invalid", + "value": "Вы ввели неверный год завершения срока действия." + }, + "Your_cards_number_is_invalid": { + "key": "Your_cards_number_is_invalid", + "value": "Вы ввели неверный номер карты." + }, + "Your_cards_security_code_is_invalid": { + "key": "Your_cards_security_code_is_invalid", + "value": "Вы ввели неверный код безопасности." + }, + "ALongTimeAgo": { + "key": "ALongTimeAgo", + "value": "был(а) давно" + }, + "Abort": { + "key": "Abort", + "value": "Прервать" + }, + "AbortEmail": { + "key": "AbortEmail", + "value": "Прервать настройку почты" + }, + "AbortPassword": { + "key": "AbortPassword", + "value": "Прервать настройку двухэтапной аутентификации" + }, + "AbortPasswordMenu": { + "key": "AbortPasswordMenu", + "value": "Отменить настройку" + }, + "AccActionCancelDownload": { + "key": "AccActionCancelDownload", + "value": "Отмена загрузки" + }, + "AccActionDownload": { + "key": "AccActionDownload", + "value": "Загрузка" + }, + "AccActionEnterSelectionMode": { + "key": "AccActionEnterSelectionMode", + "value": "Перейти в режим выбора" + }, + "AccActionMessageOptions": { + "key": "AccActionMessageOptions", + "value": "Параметры сообщения" + }, + "AccActionOpenFile": { + "key": "AccActionOpenFile", + "value": "Открыть файл" + }, + "AccActionPause": { + "key": "AccActionPause", + "value": "Пауза" + }, + "AccActionPlay": { + "key": "AccActionPlay", + "value": "Воспроизвести" + }, + "AccActionRecordVideo": { + "key": "AccActionRecordVideo", + "value": "Записать видео" + }, + "AccActionTakePicture": { + "key": "AccActionTakePicture", + "value": "Сделать снимок" + }, + "AccAutoDeleteTimer": { + "key": "AccAutoDeleteTimer", + "value": "Таймер для удаления" + }, + "AccDescrAspectRatio": { + "key": "AccDescrAspectRatio", + "value": "Соотношение сторон" + }, + "AccDescrAttachButton": { + "key": "AccDescrAttachButton", + "value": "Прикрепить медиа" + }, + "AccDescrBackspace": { + "key": "AccDescrBackspace", + "value": "Backspace" + }, + "AccDescrBotCommands": { + "key": "AccDescrBotCommands", + "value": "Команды бота" + }, + "AccDescrBotKeyboard": { + "key": "AccDescrBotKeyboard", + "value": "Клавиатура бота" + }, + "AccDescrCameraFlashAuto": { + "key": "AccDescrCameraFlashAuto", + "value": "Вспышка автоматическая" + }, + "AccDescrCameraFlashOff": { + "key": "AccDescrCameraFlashOff", + "value": "Вспышка выключена" + }, + "AccDescrCameraFlashOn": { + "key": "AccDescrCameraFlashOn", + "value": "Вспышка включена" + }, + "AccDescrCancelEdit": { + "key": "AccDescrCancelEdit", + "value": "Отмена редактирования" + }, + "AccDescrCancelForward": { + "key": "AccDescrCancelForward", + "value": "Отменить пересылку" + }, + "AccDescrCancelReply": { + "key": "AccDescrCancelReply", + "value": "Отмена ответа" + }, + "AccDescrChanSilentOff": { + "key": "AccDescrChanSilentOff", + "value": "Отправить уведомления" + }, + "AccDescrChanSilentOn": { + "key": "AccDescrChanSilentOn", + "value": "Отправить без уведомления" + }, + "AccDescrChangeProfilePicture": { + "key": "AccDescrChangeProfilePicture", + "value": "Изменить фотографию в профиле" + }, + "AccDescrChannel": { + "key": "AccDescrChannel", + "value": "Канал" + }, + "AccDescrCloseMenu": { + "key": "AccDescrCloseMenu", + "value": "Закрыть меню" + }, + "AccDescrClosePlayer": { + "key": "AccDescrClosePlayer", + "value": "Закрыть аудиоплеер" + }, + "AccDescrCollapsePanel": { + "key": "AccDescrCollapsePanel", + "value": "Свернуть панель" + }, + "AccDescrContactSorting": { + "key": "AccDescrContactSorting", + "value": "Изменить сортировку" + }, + "AccDescrDownloadProgress": { + "key": "AccDescrDownloadProgress", + "value": "Загружено %1$s из %2$s" + }, + "AccDescrEditing": { + "key": "AccDescrEditing", + "value": "Редактирование" + }, + "AccDescrEmojiButton": { + "key": "AccDescrEmojiButton", + "value": "Эмодзи, стикеры и GIF" + }, + "AccDescrExpandPanel": { + "key": "AccDescrExpandPanel", + "value": "Развернуть панель" + }, + "AccDescrForwarding": { + "key": "AccDescrForwarding", + "value": "Пересылка от" + }, + "AccDescrGIFs": { + "key": "AccDescrGIFs", + "value": "GIF" + }, + "AccDescrGoBack": { + "key": "AccDescrGoBack", + "value": "Назад" + }, + "AccDescrGoToMessage": { + "key": "AccDescrGoToMessage", + "value": "Перейти к сообщению" + }, + "AccDescrGroup": { + "key": "AccDescrGroup", + "value": "Группа" + }, + "AccDescrHideAccounts": { + "key": "AccDescrHideAccounts", + "value": "Скрыть аккаунты" + }, + "AccDescrIVHeading": { + "key": "AccDescrIVHeading", + "value": "Заголовок" + }, + "AccDescrIVTitle": { + "key": "AccDescrIVTitle", + "value": "Заголовок" + }, + "AccDescrInstantCamera": { + "key": "AccDescrInstantCamera", + "value": "Переключиться в режим камеры" + }, + "AccDescrLocationNotify": { + "key": "AccDescrLocationNotify", + "value": "Уведомление о приближении" + }, + "AccDescrMentionDown": { + "key": "AccDescrMentionDown", + "value": "Перейти к следующему упоминанию" + }, + "AccDescrMirror": { + "key": "AccDescrMirror", + "value": "Отразить" + }, + "AccDescrMoreOptions": { + "key": "AccDescrMoreOptions", + "value": "Дополнительные параметры" + }, + "AccDescrMsgNotPlayed": { + "key": "AccDescrMsgNotPlayed", + "value": "Не воспроизведено" + }, + "AccDescrMsgRead": { + "key": "AccDescrMsgRead", + "value": "Прочитано" + }, + "AccDescrMsgSending": { + "key": "AccDescrMsgSending", + "value": "Отправка" + }, + "AccDescrMsgSendingError": { + "key": "AccDescrMsgSendingError", + "value": "Ошибка отправки" + }, + "AccDescrMsgUnread": { + "key": "AccDescrMsgUnread", + "value": "Не прочитано" + }, + "AccDescrMusicInfo": { + "key": "AccDescrMusicInfo", + "value": "%2$s %1$s" + }, + "AccDescrMuteMic": { + "key": "AccDescrMuteMic", + "value": "Отключить микрофон" + }, + "AccDescrMyLocation": { + "key": "AccDescrMyLocation", + "value": "Моя геопозиция" + }, + "AccDescrNumberOfViews": { + "key": "AccDescrNumberOfViews", + "zeroValue": null, + "oneValue": "%1$d просмотр", + "twoValue": null, + "fewValue": "%1$d просмотра", + "manyValue": "%1$d просмотров", + "otherValue": "%1$d просмотра" + }, + "AccDescrOpenChat": { + "key": "AccDescrOpenChat", + "value": "Открыть чат" + }, + "AccDescrOpenInPhotoViewer": { + "key": "AccDescrOpenInPhotoViewer", + "value": "Открыть просмотр фотографии" + }, + "AccDescrOpenMenu": { + "key": "AccDescrOpenMenu", + "value": "Открыть меню навигации" + }, + "AccDescrOpenMenu2": { + "key": "AccDescrOpenMenu2", + "value": "Открыть меню" + }, + "AccDescrPageDown": { + "key": "AccDescrPageDown", + "value": "Перейти в конец" + }, + "AccDescrPasscodeLock": { + "key": "AccDescrPasscodeLock", + "value": "Заблокировать приложение" + }, + "AccDescrPasscodeUnlock": { + "key": "AccDescrPasscodeUnlock", + "value": "Разблокировать приложение" + }, + "AccDescrPhotoAdjust": { + "key": "AccDescrPhotoAdjust", + "value": "Настройка" + }, + "AccDescrPhotoEditor": { + "key": "AccDescrPhotoEditor", + "value": "Фоторедактор" + }, + "AccDescrPhotoViewer": { + "key": "AccDescrPhotoViewer", + "value": "Просмотр фото" + }, + "AccDescrPipMode": { + "key": "AccDescrPipMode", + "value": "Режим Картинка в картинке" + }, + "AccDescrPlayerDuration": { + "key": "AccDescrPlayerDuration", + "value": "%1$s из %2$s" + }, + "AccDescrPlayerSpeed": { + "key": "AccDescrPlayerSpeed", + "value": "Ускоренное воспроизведение" + }, + "AccDescrPrevious": { + "key": "AccDescrPrevious", + "value": "Назад" + }, + "AccDescrProfilePicture": { + "key": "AccDescrProfilePicture", + "value": "Фотография профиля" + }, + "AccDescrQuizCorrectAnswer": { + "key": "AccDescrQuizCorrectAnswer", + "value": "Правильный ответ" + }, + "AccDescrQuizExplanation": { + "key": "AccDescrQuizExplanation", + "value": "Объяснение" + }, + "AccDescrReceivedDate": { + "key": "AccDescrReceivedDate", + "value": "Получено %s" + }, + "AccDescrRepeatList": { + "key": "AccDescrRepeatList", + "value": "Повтор плейлиста" + }, + "AccDescrRepeatOff": { + "key": "AccDescrRepeatOff", + "value": "Повтор отключён" + }, + "AccDescrRepeatOne": { + "key": "AccDescrRepeatOne", + "value": "Повтор один раз" + }, + "AccDescrReplying": { + "key": "AccDescrReplying", + "value": "Ответ для" + }, + "AccDescrRotate": { + "key": "AccDescrRotate", + "value": "Повернуть" + }, + "AccDescrScheduledDate": { + "key": "AccDescrScheduledDate", + "value": "Отправка %s" + }, + "AccDescrSearchByUser": { + "key": "AccDescrSearchByUser", + "value": "Фильтр по участнику" + }, + "AccDescrSearchNext": { + "key": "AccDescrSearchNext", + "value": "Следующий результат поиска" + }, + "AccDescrSearchPrev": { + "key": "AccDescrSearchPrev", + "value": "Предыдущий результат поиска" + }, + "AccDescrSecretChat": { + "key": "AccDescrSecretChat", + "value": "Секретный чат" + }, + "AccDescrSendAudio": { + "key": "AccDescrSendAudio", + "zeroValue": null, + "oneValue": "Отправить %1$d аудиофайл", + "twoValue": null, + "fewValue": "Отправить %1$d аудиофайла", + "manyValue": "Отправить %1$d аудиофайлов", + "otherValue": "Отправить %1$d аудиофайла" + }, + "AccDescrSendFiles": { + "key": "AccDescrSendFiles", + "zeroValue": null, + "oneValue": "Отправить %1$d файл", + "twoValue": null, + "fewValue": "Отправить %1$d файла", + "manyValue": "Отправить %1$d файлов", + "otherValue": "Отправить %1$d файла" + }, + "AccDescrSendPhotos": { + "key": "AccDescrSendPhotos", + "zeroValue": null, + "oneValue": "Отправить %1$d фотографию", + "twoValue": null, + "fewValue": "Отправить %1$d фотографии", + "manyValue": "Отправить %1$d фотографий", + "otherValue": "Отправить %1$d фотографии" + }, + "AccDescrSentDate": { + "key": "AccDescrSentDate", + "value": "Отправлено %s" + }, + "AccDescrShareInChats": { + "key": "AccDescrShareInChats", + "zeroValue": null, + "oneValue": "Отправить в %1$d чат", + "twoValue": null, + "fewValue": "Отправить в %1$d чата", + "manyValue": "Отправить в %1$d чатов", + "otherValue": "Отправить в %1$d чата" + }, + "AccDescrShowAccounts": { + "key": "AccDescrShowAccounts", + "value": "Показать аккаунты" + }, + "AccDescrShowKeyboard": { + "key": "AccDescrShowKeyboard", + "value": "Показать клавиатуру" + }, + "AccDescrShutter": { + "key": "AccDescrShutter", + "value": "Затвор" + }, + "AccDescrStickerSet": { + "key": "AccDescrStickerSet", + "value": "Набор стикеров" + }, + "AccDescrStickers": { + "key": "AccDescrStickers", + "value": "Стикеры" + }, + "AccDescrStopLiveLocation": { + "key": "AccDescrStopLiveLocation", + "value": "Остановить трансляцию геопозиции" + }, + "AccDescrSwitchCamera": { + "key": "AccDescrSwitchCamera", + "value": "Переключить камеру" + }, + "AccDescrSwitchToDayTheme": { + "key": "AccDescrSwitchToDayTheme", + "value": "Переключиться на дневную тему" + }, + "AccDescrSwitchToNightTheme": { + "key": "AccDescrSwitchToNightTheme", + "value": "Переключиться на ночную тему" + }, + "AccDescrTakeMorePics": { + "key": "AccDescrTakeMorePics", + "value": "Сделать ещё один снимок" + }, + "AccDescrUploadProgress": { + "key": "AccDescrUploadProgress", + "value": "Загружено %1$s из %2$s" + }, + "AccDescrUserOptions": { + "key": "AccDescrUserOptions", + "value": "Параметры пользователя" + }, + "AccDescrVideoCompressHigh": { + "key": "AccDescrVideoCompressHigh", + "value": "Высокое качество" + }, + "AccDescrVideoCompressLow": { + "key": "AccDescrVideoCompressLow", + "value": "Небольшой размер" + }, + "AccDescrVideoMessage": { + "key": "AccDescrVideoMessage", + "value": "Записать видеосообщение" + }, + "AccDescrVideoQuality": { + "key": "AccDescrVideoQuality", + "value": "Качество видео" + }, + "AccDescrVoiceMessage": { + "key": "AccDescrVoiceMessage", + "value": "Записать голосовое сообщение" + }, + "AccDescrVoipCamOff": { + "key": "AccDescrVoipCamOff", + "value": "Камера выключена" + }, + "AccDescrVoipCamOn": { + "key": "AccDescrVoipCamOn", + "value": "Камера включена" + }, + "AccDescrVoipCamSwitchedToBack": { + "key": "AccDescrVoipCamSwitchedToBack", + "value": "Используется задняя камера" + }, + "AccDescrVoipCamSwitchedToFront": { + "key": "AccDescrVoipCamSwitchedToFront", + "value": "Используется фронтальная камера" + }, + "AccDescrVoipMicOff": { + "key": "AccDescrVoipMicOff", + "value": "Микрофон выключен" + }, + "AccDescrVoipMicOn": { + "key": "AccDescrVoipMicOn", + "value": "Микрофон включен" + }, + "AccExitFullscreen": { + "key": "AccExitFullscreen", + "value": "Выйти из полноэкраннного режима" + }, + "AccPinnedMessagesList": { + "key": "AccPinnedMessagesList", + "value": "Список закрепленных сообщений" + }, + "AccReleaseForArchive": { + "key": "AccReleaseForArchive", + "value": "Отпустите для вывода архива" + }, + "AccSwipeForArchive": { + "key": "AccSwipeForArchive", + "value": "Тяните для вывода архива" + }, + "AccSwitchToFullscreen": { + "key": "AccSwitchToFullscreen", + "value": "Перейти в полноэкранный режим" + }, + "Accept": { + "key": "Accept", + "value": "Принять" + }, + "AcceptCall": { + "key": "AcceptCall", + "value": "Принять" + }, + "AccessError": { + "key": "AccessError", + "value": "Ошибка доступа" + }, + "Account": { + "key": "Account", + "value": "Аккаунт" + }, + "AccountAlreadyLoggedIn": { + "key": "AccountAlreadyLoggedIn", + "value": "Вы уже зашли в этот аккаунт." + }, + "AccountSettings": { + "key": "AccountSettings", + "value": "Настройки аккаунта" + }, + "AccountSwitch": { + "key": "AccountSwitch", + "value": "Переключиться" + }, + "AccurateTo": { + "key": "AccurateTo", + "value": "С точностью до %1$s" + }, + "ActionAddUser": { + "key": "ActionAddUser", + "value": "un1 добавил(а) un2" + }, + "ActionAddUserSelf": { + "key": "ActionAddUserSelf", + "value": "un1 снова в группе" + }, + "ActionAddUserSelfMega": { + "key": "ActionAddUserSelfMega", + "value": "un1 теперь в группе" + }, + "ActionAddUserSelfYou": { + "key": "ActionAddUserSelfYou", + "value": "Вы вернулись в группу" + }, + "ActionAddUserYou": { + "key": "ActionAddUserYou", + "value": "un1 добавил(а) вас" + }, + "ActionBotAllowed": { + "key": "ActionBotAllowed", + "value": "Вы разрешили этому боту писать Вам, когда авторизовались на %1$s." + }, + "ActionBotDocumentAddress": { + "key": "ActionBotDocumentAddress", + "value": "Адрес" + }, + "ActionBotDocumentBankStatement": { + "key": "ActionBotDocumentBankStatement", + "value": "Справка из банка" + }, + "ActionBotDocumentDriverLicence": { + "key": "ActionBotDocumentDriverLicence", + "value": "Водительские права" + }, + "ActionBotDocumentEmail": { + "key": "ActionBotDocumentEmail", + "value": "Электронная почта" + }, + "ActionBotDocumentIdentity": { + "key": "ActionBotDocumentIdentity", + "value": "Личная информация" + }, + "ActionBotDocumentIdentityCard": { + "key": "ActionBotDocumentIdentityCard", + "value": "Удостоверение личности" + }, + "ActionBotDocumentInternalPassport": { + "key": "ActionBotDocumentInternalPassport", + "value": "Внутренний паспорт" + }, + "ActionBotDocumentPassport": { + "key": "ActionBotDocumentPassport", + "value": "Паспорт" + }, + "ActionBotDocumentPassportRegistration": { + "key": "ActionBotDocumentPassportRegistration", + "value": "Прописка" + }, + "ActionBotDocumentPhone": { + "key": "ActionBotDocumentPhone", + "value": "Номер телефона" + }, + "ActionBotDocumentRentalAgreement": { + "key": "ActionBotDocumentRentalAgreement", + "value": "Договор об аренде" + }, + "ActionBotDocumentTemporaryRegistration": { + "key": "ActionBotDocumentTemporaryRegistration", + "value": "Временная прописка" + }, + "ActionBotDocumentUtilityBill": { + "key": "ActionBotDocumentUtilityBill", + "value": "Коммунальный счёт" + }, + "ActionBotDocuments": { + "key": "ActionBotDocuments", + "value": "%1$s получил следующие документы: %2$s" + }, + "ActionChangedPhoto": { + "key": "ActionChangedPhoto", + "value": "un1 изменил(а) фото группы" + }, + "ActionChangedTitle": { + "key": "ActionChangedTitle", + "value": "un1 изменил(а) имя группы на un2" + }, + "ActionChangedVideo": { + "key": "ActionChangedVideo", + "value": "un1 изменил(а) видео группы" + }, + "ActionChannelChangedPhoto": { + "key": "ActionChannelChangedPhoto", + "value": "Фото канала изменено" + }, + "ActionChannelChangedTitle": { + "key": "ActionChannelChangedTitle", + "value": "Имя канала изменено на un2" + }, + "ActionChannelChangedVideo": { + "key": "ActionChannelChangedVideo", + "value": "Видео канала изменено" + }, + "ActionChannelRemovedPhoto": { + "key": "ActionChannelRemovedPhoto", + "value": "Фото канала удалено" + }, + "ActionCreateChannel": { + "key": "ActionCreateChannel", + "value": "Канал создан" + }, + "ActionCreateGroup": { + "key": "ActionCreateGroup", + "value": "un1 создал(а) группу" + }, + "ActionCreateMega": { + "key": "ActionCreateMega", + "value": "Группа создана" + }, + "ActionCreatedInviteLink": { + "key": "ActionCreatedInviteLink", + "value": "un1 создал(а) ссылку-приглашение %1$s" + }, + "ActionDeletedInviteLink": { + "key": "ActionDeletedInviteLink", + "value": "un1 удалил(а) ссылку-приглашение %1$s" + }, + "ActionEditedInviteLink": { + "key": "ActionEditedInviteLink", + "value": "un1 изменил(а) ссылку-приглашение %1$s на %2$s" + }, + "ActionEditedInviteLinkToSame": { + "key": "ActionEditedInviteLinkToSame", + "value": "un1 изменил(а) ссылку-приглашение %1$s" + }, + "ActionGroupCallEnded": { + "key": "ActionGroupCallEnded", + "value": "Голосовой чат завершен (%s)" + }, + "ActionGroupCallInvited": { + "key": "ActionGroupCallInvited", + "value": "un1 пригласил(а) un2 в голосовой чат" + }, + "ActionGroupCallInvitedYou": { + "key": "ActionGroupCallInvitedYou", + "value": "un1 пригласил(а) Вас в голосовой чат" + }, + "ActionGroupCallStarted": { + "key": "ActionGroupCallStarted", + "value": "un1 начал(а) голосовой чат" + }, + "ActionGroupCallStartedByYou": { + "key": "ActionGroupCallStartedByYou", + "value": "Вы начали голосовой чат" + }, + "ActionGroupCallYouInvited": { + "key": "ActionGroupCallYouInvited", + "value": "Вы пригласили un2 в голосовой чат" + }, + "ActionInviteUser": { + "key": "ActionInviteUser", + "value": "un1 вступил(а) в группу по ссылке-приглашению" + }, + "ActionInviteYou": { + "key": "ActionInviteYou", + "value": "Вы вступили в группу по ссылке-приглашению" + }, + "ActionKickUser": { + "key": "ActionKickUser", + "value": "un1 удалил(а) un2" + }, + "ActionKickUserYou": { + "key": "ActionKickUserYou", + "value": "un1 удалил(а) вас" + }, + "ActionLeftUser": { + "key": "ActionLeftUser", + "value": "un1 покинул(а) группу" + }, + "ActionMigrateFromGroup": { + "key": "ActionMigrateFromGroup", + "value": "Эта группа стала супергруппой" + }, + "ActionMigrateFromGroupNotify": { + "key": "ActionMigrateFromGroupNotify", + "value": "%1$s стала супергруппой." + }, + "ActionPinnedContact": { + "key": "ActionPinnedContact", + "value": "un1 закрепил(а) контакт" + }, + "ActionPinnedFile": { + "key": "ActionPinnedFile", + "value": "un1 закрепил(а) файл" + }, + "ActionPinnedGame": { + "key": "ActionPinnedGame", + "value": "un1 закрепил(а) %1$s" + }, + "ActionPinnedGeo": { + "key": "ActionPinnedGeo", + "value": "un1 закрепил(а) карту" + }, + "ActionPinnedGeoLive": { + "key": "ActionPinnedGeoLive", + "value": "un1 закрепил(а) трансляцию геопозиции" + }, + "ActionPinnedGif": { + "key": "ActionPinnedGif", + "value": "un1 закрепил(а) GIF" + }, + "ActionPinnedMusic": { + "key": "ActionPinnedMusic", + "value": "un1 закрепил(а) аудиофайл" + }, + "ActionPinnedNoText": { + "key": "ActionPinnedNoText", + "value": "un1 закрепил(а) сообщение" + }, + "ActionPinnedPhoto": { + "key": "ActionPinnedPhoto", + "value": "un1 закрепил(а) фото" + }, + "ActionPinnedPoll": { + "key": "ActionPinnedPoll", + "value": "un1 закрепил(а) опрос" + }, + "ActionPinnedQuiz": { + "key": "ActionPinnedQuiz", + "value": "un1 закрепил(а) викторину" + }, + "ActionPinnedRound": { + "key": "ActionPinnedRound", + "value": "un1 закрепил(а) видеосообщение" + }, + "ActionPinnedSticker": { + "key": "ActionPinnedSticker", + "value": "un1 закрепил(а) стикер" + }, + "ActionPinnedText": { + "key": "ActionPinnedText", + "value": "un1 закрепил(а) «%1$s»" + }, + "ActionPinnedVideo": { + "key": "ActionPinnedVideo", + "value": "un1 закрепил(а) видео" + }, + "ActionPinnedVoice": { + "key": "ActionPinnedVoice", + "value": "un1 закрепил(а) голосовое сообщение" + }, + "ActionRemovedPhoto": { + "key": "ActionRemovedPhoto", + "value": "un1 удалил(а) фото группы" + }, + "ActionRevokedInviteLink": { + "key": "ActionRevokedInviteLink", + "value": "un1 сбросил(а) ссылку-приглашение %1$s" + }, + "ActionTTLChanged": { + "key": "ActionTTLChanged", + "value": "un1 включил(а) автоудаление сообщений через %1$s" + }, + "ActionTTLChannelChanged": { + "key": "ActionTTLChannelChanged", + "value": "Сообщения в этом канале будут автоматически удаляться через %1$s" + }, + "ActionTTLChannelDisabled": { + "key": "ActionTTLChannelDisabled", + "value": "Сообщения в этом канале больше не будут автоматически удаляться" + }, + "ActionTTLDisabled": { + "key": "ActionTTLDisabled", + "value": "un1 отключил(а) удаление по таймеру" + }, + "ActionTTLYouChanged": { + "key": "ActionTTLYouChanged", + "value": "Вы включили автоудаление сообщений через %1$s" + }, + "ActionTTLYouDisabled": { + "key": "ActionTTLYouDisabled", + "value": "Вы отключили удаление по таймеру" + }, + "ActionTakeScreenshoot": { + "key": "ActionTakeScreenshoot", + "value": "un1 сделал(а) скриншот!" + }, + "ActionTakeScreenshootYou": { + "key": "ActionTakeScreenshootYou", + "value": "Вы сделали скриншот!" + }, + "ActionUserInvitedToChannel": { + "key": "ActionUserInvitedToChannel", + "value": "un1 пригласил(а) Вас в этот канал" + }, + "ActionUserInvitedToGroup": { + "key": "ActionUserInvitedToGroup", + "value": "un1 пригласил(а) Вас в эту группу" + }, + "ActionUserScored": { + "key": "ActionUserScored", + "value": "un1 набрал(а) %1$s" + }, + "ActionUserScoredInGame": { + "key": "ActionUserScoredInGame", + "value": "un1 набрал(а) %1$s в игре un2" + }, + "ActionUserWithinOtherRadius": { + "key": "ActionUserWithinOtherRadius", + "value": "un1 находится в %1$s от un2" + }, + "ActionUserWithinRadius": { + "key": "ActionUserWithinRadius", + "value": "un1 находится в %1$s от Вас" + }, + "ActionUserWithinYouRadius": { + "key": "ActionUserWithinYouRadius", + "value": "Вы находитесь в %1$s от un1" + }, + "ActionVolumeChanged": { + "key": "ActionVolumeChanged", + "value": "un1 изменил(а) громкость un2 до %1$d%%" + }, + "ActionYouAddUser": { + "key": "ActionYouAddUser", + "value": "Вы добавили un2" + }, + "ActionYouChangedPhoto": { + "key": "ActionYouChangedPhoto", + "value": "Вы изменили фото группы" + }, + "ActionYouChangedTitle": { + "key": "ActionYouChangedTitle", + "value": "Вы изменили имя группы на un2" + }, + "ActionYouChangedVideo": { + "key": "ActionYouChangedVideo", + "value": "Вы изменили видео группы" + }, + "ActionYouCreateGroup": { + "key": "ActionYouCreateGroup", + "value": "Вы создали группу" + }, + "ActionYouKickUser": { + "key": "ActionYouKickUser", + "value": "Вы удалили un2" + }, + "ActionYouLeftUser": { + "key": "ActionYouLeftUser", + "value": "Вы покинули группу" + }, + "ActionYouRemovedPhoto": { + "key": "ActionYouRemovedPhoto", + "value": "Вы удалили фото группы" + }, + "ActionYouScored": { + "key": "ActionYouScored", + "value": "Вы набрали %1$s" + }, + "ActionYouScoredInGame": { + "key": "ActionYouScoredInGame", + "value": "Вы набрали %1$s в игре un2" + }, + "ActionsChartTitle": { + "key": "ActionsChartTitle", + "value": "Действия" + }, + "Add": { + "key": "Add", + "value": "Добавить" + }, + "AddAccount": { + "key": "AddAccount", + "value": "Добавить аккаунт" + }, + "AddAdminErrorBlacklisted": { + "key": "AddAdminErrorBlacklisted", + "value": "К сожалению, Вы не можете назначить этого пользователя администратором, поскольку он находится в чёрном списке, а Вы не можете убирать людей из чёрного списка." + }, + "AddAdminErrorNotAMember": { + "key": "AddAdminErrorNotAMember", + "value": "Вы не можете назначить этого пользователя администратором, потому что он не состоит в группе и Вы не можете его пригласить." + }, + "AddAnExplanation": { + "key": "AddAnExplanation", + "value": "Добавить объяснение" + }, + "AddAnExplanationInfo": { + "key": "AddAnExplanationInfo", + "value": "Участники увидят этот текст, если выберут неправильный ответ (полезно для образовательных тестов)." + }, + "AddAnOption": { + "key": "AddAnOption", + "value": "Добавить ответ..." + }, + "AddAnOptionInfo": { + "key": "AddAnOptionInfo", + "value": "Можно добавить %1$s." + }, + "AddAnOptionInfoMax": { + "key": "AddAnOptionInfoMax", + "value": "Вы указали максимальное количество вариантов ответа." + }, + "AddAnotherAccount": { + "key": "AddAnotherAccount", + "value": "Добавить аккаунт" + }, + "AddAnotherAccountInfo": { + "key": "AddAnotherAccountInfo", + "value": "Подключите несколько аккаунтов Telegram и легко переключайтесь между ними." + }, + "AddBannedErrorAdmin": { + "key": "AddBannedErrorAdmin", + "value": "К сожалению, Вы не можете заблокировать этого пользователя, поскольку он администрирует эту группу, а у Вас нет прав, чтобы его разжаловать." + }, + "AddBotAsAdmin": { + "key": "AddBotAsAdmin", + "value": "Бота можно добавить только как администратора." + }, + "AddCaption": { + "key": "AddCaption", + "value": "Добавить подпись..." + }, + "AddContact": { + "key": "AddContact", + "value": "Добавить контакт" + }, + "AddContactByPhone": { + "key": "AddContactByPhone", + "value": "Добавить %1$s" + }, + "AddContactChat": { + "key": "AddContactChat", + "value": "В КОНТАКТЫ" + }, + "AddContactFullChat": { + "key": "AddContactFullChat", + "value": "ДОБАВИТЬ %1$s В КОНТАКТЫ" + }, + "AddContactPhonebookTitle": { + "key": "AddContactPhonebookTitle", + "value": "Добавить контакт" + }, + "AddContactTitle": { + "key": "AddContactTitle", + "value": "Добавить контакт" + }, + "AddExceptions": { + "key": "AddExceptions", + "value": "Добавить исключения" + }, + "AddMasks": { + "key": "AddMasks", + "value": "Добавить маски" + }, + "AddMasksInstalled": { + "key": "AddMasksInstalled", + "value": "Добавлены новые маски" + }, + "AddMasksInstalledInfo": { + "key": "AddMasksInstalledInfo", + "value": "Набор %1$s добавлен к Вашим маскам." + }, + "AddMember": { + "key": "AddMember", + "value": "Добавить участника" + }, + "AddMembersAlertCountText": { + "key": "AddMembersAlertCountText", + "value": "Вы точно хотите добавить %1$s в **%2$s**?" + }, + "AddMembersAlertNamesText": { + "key": "AddMembersAlertNamesText", + "value": "Вы точно хотите добавить %1$s в **%2$s**?" + }, + "AddMembersAlertTitle": { + "key": "AddMembersAlertTitle", + "value": "Добавить %1$s" + }, + "AddMembersForwardMessages": { + "key": "AddMembersForwardMessages", + "value": "Показать новым участникам последние 100 сообщений" + }, + "AddMutual": { + "key": "AddMutual", + "value": "Пригласить подписаться на канал" + }, + "AddOneMemberAlertTitle": { + "key": "AddOneMemberAlertTitle", + "value": "Добавить участника" + }, + "AddOneMemberForwardMessages": { + "key": "AddOneMemberForwardMessages", + "value": "Показать **%1$s** последние 100 сообщений" + }, + "AddPeopleNearby": { + "key": "AddPeopleNearby", + "value": "Найти людей рядом" + }, + "AddPhoto": { + "key": "AddPhoto", + "value": "Выбрать фотографию" + }, + "AddProxy": { + "key": "AddProxy", + "value": "Добавить прокси" + }, + "AddRecipient": { + "key": "AddRecipient", + "value": "Добавить получателя" + }, + "AddShortcut": { + "key": "AddShortcut", + "value": "Создать ярлык" + }, + "AddStickers": { + "key": "AddStickers", + "value": "Добавить стикеры" + }, + "AddStickersCount": { + "key": "AddStickersCount", + "value": "ДОБАВИТЬ %1$s" + }, + "AddStickersInstalled": { + "key": "AddStickersInstalled", + "value": "Добавлены новые стикеры" + }, + "AddStickersInstalledInfo": { + "key": "AddStickersInstalledInfo", + "value": "Набор %1$s добавлен к Вашим стикерам." + }, + "AddStickersNotFound": { + "key": "AddStickersNotFound", + "value": "Стикеры не найдены" + }, + "AddSubscriber": { + "key": "AddSubscriber", + "value": "Добавить подписчика" + }, + "AddToContacts": { + "key": "AddToContacts", + "value": "Добавить в контакты" + }, + "AddToExceptions": { + "key": "AddToExceptions", + "value": "Добавить в исключения" + }, + "AddToExistingContact": { + "key": "AddToExistingContact", + "value": "Добавить в имеющийся" + }, + "AddToFavorites": { + "key": "AddToFavorites", + "value": "Добавить в избранные" + }, + "AddToMasks": { + "key": "AddToMasks", + "value": "Добавить в маски" + }, + "AddToStickers": { + "key": "AddToStickers", + "value": "Добавить в стикеры" + }, + "AddToTheGroup": { + "key": "AddToTheGroup", + "value": "Добавить %1$s в группу?" + }, + "AddToTheGroupAlertText": { + "key": "AddToTheGroupAlertText", + "value": "Хотите добавить **%1$s** в группу **%2$s**?" + }, + "AddToTheGroupAlertTitle": { + "key": "AddToTheGroupAlertTitle", + "value": "Добавить бота" + }, + "AddToTheGroupForwardCount": { + "key": "AddToTheGroupForwardCount", + "value": "Сколько последних сообщений показать:" + }, + "AddToTheGroupTitle": { + "key": "AddToTheGroupTitle", + "value": "Добавить %1$s в чат %2$s?" + }, + "AddUserErrorBlacklisted": { + "key": "AddUserErrorBlacklisted", + "value": "Вы не можете добавить этого пользователя, так как он в чёрном списке, а у Вас недостаточно прав, чтобы его изменить." + }, + "AddedToFavorites": { + "key": "AddedToFavorites", + "value": "Стикер добавлен в избранные" + }, + "AdminWillBeRemoved": { + "key": "AdminWillBeRemoved", + "value": "%1$s перестанет быть администратором, если потеряет базовые права." + }, + "Agree": { + "key": "Agree", + "value": "Принять" + }, + "Alert": { + "key": "Alert", + "value": "Показывать уведомления" + }, + "AlertClearHistory": { + "key": "AlertClearHistory", + "value": "Очистить историю" + }, + "AllAccounts": { + "key": "AllAccounts", + "value": "Всех аккаунтов" + }, + "AllMedia": { + "key": "AllMedia", + "value": "Все медиа" + }, + "AllPhotos": { + "key": "AllPhotos", + "value": "Все фотографии" + }, + "AllVideo": { + "key": "AllVideo", + "value": "Все видео" + }, + "AllVideos": { + "key": "AllVideos", + "value": "Все видео" + }, + "AllowCustomQuickReply": { + "key": "AllowCustomQuickReply", + "value": "Задать свой текст" + }, + "AllowFillNumber": { + "key": "AllowFillNumber", + "value": "Разрешите приложению принимать звонки, чтобы мы могли подтвердить Ваш номер телефона автоматически." + }, + "AllowReadCall": { + "key": "AllowReadCall", + "value": "Разрешите приложению принимать звонки, чтобы код для входа срабатывал автоматически." + }, + "AllowReadCallAndLog": { + "key": "AllowReadCallAndLog", + "value": "Разрешите приложению принимать звонки и видеть историю звонков, чтобы код для входа срабатывал автоматически." + }, + "AllowReadCallAndSms": { + "key": "AllowReadCallAndSms", + "value": "Разрешите приложению принимать звонки, чтобы мы могли подтвердить Ваш номер телефона автоматически." + }, + "AllowReadCallLog": { + "key": "AllowReadCallLog", + "value": "Разрешите приложению доступ к истории звонков, чтобы код для входа срабатывал автоматически." + }, + "AllowReadSms": { + "key": "AllowReadSms", + "value": "Разрешите приложению получать SMS, чтобы код для входа подставлялся автоматически." + }, + "AlternativeOptions": { + "key": "AlternativeOptions", + "value": "Другие возможности" + }, + "AlwaysAllow": { + "key": "AlwaysAllow", + "value": "Всегда разрешать" + }, + "AlwaysAllowPlaceholder": { + "key": "AlwaysAllowPlaceholder", + "value": "Всегда разрешать..." + }, + "AlwaysShareWith": { + "key": "AlwaysShareWith", + "value": "Всегда делиться с" + }, + "AlwaysShareWithPlaceholder": { + "key": "AlwaysShareWithPlaceholder", + "value": "Всегда показывать пользователям..." + }, + "AlwaysShareWithTitle": { + "key": "AlwaysShareWithTitle", + "value": "Всегда показывать" + }, + "AlwaysShowPopup": { + "key": "AlwaysShowPopup", + "value": "Показывать всегда" + }, + "AndMoreTyping": { + "key": "AndMoreTyping", + "zeroValue": null, + "oneValue": "и ещё %1$d печатают", + "twoValue": null, + "fewValue": "и ещё %1$d печатают", + "manyValue": "и ещё %1$d печатают", + "otherValue": "и ещё %1$d печатают" + }, + "AndMoreTypingGroup": { + "key": "AndMoreTypingGroup", + "zeroValue": null, + "oneValue": "%1$s и ещё %2$d печатает", + "twoValue": null, + "fewValue": "%1$s и ещё %2$d печатают", + "manyValue": "%1$s и ещё %2$d печатают", + "otherValue": "%1$s и ещё %2$d печатают" + }, + "AndOther": { + "key": "AndOther", + "zeroValue": null, + "oneValue": "и ещё %1$d", + "twoValue": null, + "fewValue": "и ещё %1$d", + "manyValue": "и ещё %1$d", + "otherValue": "и ещё %1$d" + }, + "AnimatedStickers": { + "key": "AnimatedStickers", + "value": "Анимированные стикеры" + }, + "AnonymousPoll": { + "key": "AnonymousPoll", + "value": "Анонимный опрос" + }, + "AnonymousQuizPoll": { + "key": "AnonymousQuizPoll", + "value": "Анонимная викторина" + }, + "Answer": { + "key": "Answer", + "zeroValue": null, + "oneValue": "%1$d ответ", + "twoValue": null, + "fewValue": "%1$d ответа", + "manyValue": "%1$d ответов", + "otherValue": "%1$d ответов" + }, + "AnswerOptions": { + "key": "AnswerOptions", + "value": "Варианты ответа" + }, + "ApkRestricted": { + "key": "ApkRestricted", + "value": "Приложению не разрешена установка APK. Вы можете изменить это в настройках системы." + }, + "AppFolderInfo": { + "key": "AppFolderInfo", + "value": "Поиск в папке приложения" + }, + "AppName": { + "key": "AppName", + "value": "Telegram" + }, + "AppNameBeta": { + "key": "AppNameBeta", + "value": "Telegram" + }, + "Appearance": { + "key": "Appearance", + "value": "Оформление" + }, + "ApplyLocalizationFile": { + "key": "ApplyLocalizationFile", + "value": "Применить локализацию" + }, + "ApplyTheme": { + "key": "ApplyTheme", + "value": "ПРИМЕНИТЬ" + }, + "ApplyThemeFile": { + "key": "ApplyThemeFile", + "value": "Применить файл темы" + }, + "April": { + "key": "April", + "value": "Апрель" + }, + "Archive": { + "key": "Archive", + "value": "В архив" + }, + "ArchiveAndMute": { + "key": "ArchiveAndMute", + "value": "В архив и без уведомлений" + }, + "ArchiveAndMuteInfo": { + "key": "ArchiveAndMuteInfo", + "value": "Автоматически отключать уведомления о новых чатах, группах и каналов от неконтактов и помещать их в архив." + }, + "ArchiveHidden": { + "key": "ArchiveHidden", + "value": "Архив скрыт." + }, + "ArchiveHiddenInfo": { + "key": "ArchiveHiddenInfo", + "value": "Потяните вниз, чтобы увидеть архив." + }, + "ArchiveHintHeader1": { + "key": "ArchiveHintHeader1", + "value": "Это Ваш архив" + }, + "ArchiveHintHeader2": { + "key": "ArchiveHintHeader2", + "value": "Чаты без уведомлений" + }, + "ArchiveHintHeader3": { + "key": "ArchiveHintHeader3", + "value": "Закреплённые чаты" + }, + "ArchiveHintText1": { + "key": "ArchiveHintText1", + "value": "Чаты со включенными уведомлениями покидают архив, когда приходят новые сообщения." + }, + "ArchiveHintText2": { + "key": "ArchiveHintText2", + "value": "Чаты с выключенными уведомлениями остаются в архиве, когда приходят новые сообщения." + }, + "ArchiveHintText3": { + "key": "ArchiveHintText3", + "value": "Вы можете закрепить неограниченное количество чатов наверху архива." + }, + "ArchivePinned": { + "key": "ArchivePinned", + "value": "Архив закреплен." + }, + "ArchivePinnedInfo": { + "key": "ArchivePinnedInfo", + "value": "Смахните влево, чтобы скрыть архив." + }, + "ArchiveSearchFilter": { + "key": "ArchiveSearchFilter", + "value": "Архив" + }, + "ArchiveStickerSetsAlertTitle": { + "key": "ArchiveStickerSetsAlertTitle", + "value": "Архивировать %1$s" + }, + "ArchiveStickersAlertMessage": { + "key": "ArchiveStickersAlertMessage", + "value": "Архивировать выбранные наборы стикеров?" + }, + "ArchivedChats": { + "key": "ArchivedChats", + "value": "Архив" + }, + "ArchivedMasks": { + "key": "ArchivedMasks", + "value": "Архив масок" + }, + "ArchivedMasksAlertInfo": { + "key": "ArchivedMasksAlertInfo", + "value": "Некоторые из старых наборов масок были архивированы. Вы можете снова активировать их в настройках масок." + }, + "ArchivedMasksAlertTitle": { + "key": "ArchivedMasksAlertTitle", + "value": "Архив масок" + }, + "ArchivedMasksEmpty": { + "key": "ArchivedMasksEmpty", + "value": "Нет масок в архиве" + }, + "ArchivedMasksInfo": { + "key": "ArchivedMasksInfo", + "value": "У Вас может быть установлено до 200 наборов масок. При установке новых наборов неиспользуемые маски архивируются." + }, + "ArchivedStickers": { + "key": "ArchivedStickers", + "value": "Архив стикеров" + }, + "ArchivedStickersAlertInfo": { + "key": "ArchivedStickersAlertInfo", + "value": "Некоторые из ваших старых наборов стикеров были архивированы. Вы можете снова активировать их в настройках стикеров." + }, + "ArchivedStickersAlertTitle": { + "key": "ArchivedStickersAlertTitle", + "value": "Архив стикеров" + }, + "ArchivedStickersEmpty": { + "key": "ArchivedStickersEmpty", + "value": "Нет стикеров в архиве" + }, + "ArchivedStickersInfo": { + "key": "ArchivedStickersInfo", + "value": "У Вас может быть до 200 наборов стикеров. При установке новых наборов неиспользуемые стикеры архивируются." + }, + "AreTyping": { + "key": "AreTyping", + "value": "печатают…" + }, + "AreTypingGroup": { + "key": "AreTypingGroup", + "value": "%1$s печатают..." + }, + "AreYouSure": { + "key": "AreYouSure", + "value": "Уверены?" + }, + "AreYouSureBlockContact": { + "key": "AreYouSureBlockContact", + "value": "Вы точно хотите заблокировать этот контакт?" + }, + "AreYouSureBlockContact2": { + "key": "AreYouSureBlockContact2", + "value": "Вы точно хотите заблокировать **%1$s**?" + }, + "AreYouSureClearDrafts": { + "key": "AreYouSureClearDrafts", + "value": "Вы действительно хотите удалить все черновики сообщений, сохраненные в облаке?" + }, + "AreYouSureClearDraftsTitle": { + "key": "AreYouSureClearDraftsTitle", + "value": "Удалить черновики" + }, + "AreYouSureClearHistory": { + "key": "AreYouSureClearHistory", + "value": "Вы точно хотите очистить историю?" + }, + "AreYouSureClearHistoryCacheFewChats": { + "key": "AreYouSureClearHistoryCacheFewChats", + "value": "Удалить из кэша все сообщения и материалы выбранных чатов?" + }, + "AreYouSureClearHistoryChannel": { + "key": "AreYouSureClearHistoryChannel", + "value": "Удалить из кэша текст и медиафайлы этого канала?" + }, + "AreYouSureClearHistoryFewChats": { + "key": "AreYouSureClearHistoryFewChats", + "value": "Вы точно хотите удалить историю переписки в выбранных чатах?" + }, + "AreYouSureClearHistoryGroup": { + "key": "AreYouSureClearHistoryGroup", + "value": "Удалить из кэша все сообщения и материалы этой группы?" + }, + "AreYouSureClearHistorySavedMessages": { + "key": "AreYouSureClearHistorySavedMessages", + "value": "Вы точно хотите очистить историю чата **Избранное**?" + }, + "AreYouSureClearHistoryWithChat": { + "key": "AreYouSureClearHistoryWithChat", + "value": "Вы точно хотите удалить историю переписки в **%1$s**?" + }, + "AreYouSureClearHistoryWithSecretUser": { + "key": "AreYouSureClearHistoryWithSecretUser", + "value": "Вы точно хотите удалить историю секретного чата с **%1$s**?" + }, + "AreYouSureClearHistoryWithUser": { + "key": "AreYouSureClearHistoryWithUser", + "value": "Вы точно хотите очистить историю переписки с **%1$s**?" + }, + "AreYouSureDeleteAndExit": { + "key": "AreYouSureDeleteAndExit", + "value": "Вы точно хотите покинуть группу и удалить её?" + }, + "AreYouSureDeleteAndExitChannel": { + "key": "AreYouSureDeleteAndExitChannel", + "value": "Вы точно хотите покинуть канал и удалить его?" + }, + "AreYouSureDeleteAndExitName": { + "key": "AreYouSureDeleteAndExitName", + "value": "Вы точно хотите группу **%1$s** и удалить её?" + }, + "AreYouSureDeleteContact": { + "key": "AreYouSureDeleteContact", + "value": "Вы точно хотите удалить этот контакт?" + }, + "AreYouSureDeleteFewChats": { + "key": "AreYouSureDeleteFewChats", + "value": "Вы точно хотите удалить выбранные чаты?" + }, + "AreYouSureDeleteFewMessages": { + "key": "AreYouSureDeleteFewMessages", + "value": "Вы точно хотите удалить эти сообщения?" + }, + "AreYouSureDeleteFewMessagesMega": { + "key": "AreYouSureDeleteFewMessagesMega", + "value": "Вы точно хотите удалить сообщения для всех участников чата?" + }, + "AreYouSureDeleteGIF": { + "key": "AreYouSureDeleteGIF", + "value": "Вы точно хотите удалить GIF?" + }, + "AreYouSureDeleteGIFEveryone": { + "key": "AreYouSureDeleteGIFEveryone", + "value": "Вы точно хотите удалить GIF для всех?" + }, + "AreYouSureDeleteGIFTitle": { + "key": "AreYouSureDeleteGIFTitle", + "value": "Удалить GIF" + }, + "AreYouSureDeleteMessages": { + "key": "AreYouSureDeleteMessages", + "value": "Вы точно хотите удалить %1$s?" + }, + "AreYouSureDeletePhoto": { + "key": "AreYouSureDeletePhoto", + "value": "Вы точно хотите удалить фото?" + }, + "AreYouSureDeletePhotoEveryone": { + "key": "AreYouSureDeletePhotoEveryone", + "value": "Вы точно хотите удалить эту фотографию у всех?" + }, + "AreYouSureDeletePhotoTitle": { + "key": "AreYouSureDeletePhotoTitle", + "value": "Удалить фотографию" + }, + "AreYouSureDeleteSingleMessage": { + "key": "AreYouSureDeleteSingleMessage", + "value": "Вы точно хотите удалить это сообщение?" + }, + "AreYouSureDeleteSingleMessageMega": { + "key": "AreYouSureDeleteSingleMessageMega", + "value": "Вы точно хотите удалить сообщение для всех участников чата?" + }, + "AreYouSureDeleteThisChat": { + "key": "AreYouSureDeleteThisChat", + "value": "Вы точно хотите удалить этот чат?" + }, + "AreYouSureDeleteThisChatSavedMessages": { + "key": "AreYouSureDeleteThisChatSavedMessages", + "value": "Вы точно хотите удалить чат **Избранное**?" + }, + "AreYouSureDeleteThisChatWithBot": { + "key": "AreYouSureDeleteThisChatWithBot", + "value": "Вы точно хотите удалить чат с **%1$s** и заблокировать его?" + }, + "AreYouSureDeleteThisChatWithGroup": { + "key": "AreYouSureDeleteThisChatWithGroup", + "value": "Вы точно хотите удалить чат **%1$s**?" + }, + "AreYouSureDeleteThisChatWithSecretUser": { + "key": "AreYouSureDeleteThisChatWithSecretUser", + "value": "Вы точно хотите удалить секретный чат с **%1$s**?" + }, + "AreYouSureDeleteThisChatWithUser": { + "key": "AreYouSureDeleteThisChatWithUser", + "value": "Вы точно хотите удалить чат с **%1$s**?" + }, + "AreYouSureDeleteVideo": { + "key": "AreYouSureDeleteVideo", + "value": "Вы точно хотите удалить это видео?" + }, + "AreYouSureDeleteVideoEveryone": { + "key": "AreYouSureDeleteVideoEveryone", + "value": "Вы точно хотите удалить это видео у всех?" + }, + "AreYouSureDeleteVideoTitle": { + "key": "AreYouSureDeleteVideoTitle", + "value": "Удалить видео" + }, + "AreYouSureLogout": { + "key": "AreYouSureLogout", + "value": "Вы точно хотите выйти?\n\nВы можете пользоваться Telegram на всех Ваших устройствах одновременно.\n\nВажно: при выходе из аккаунта все секретные чаты на этом устройстве пропадут." + }, + "AreYouSureRegistration": { + "key": "AreYouSureRegistration", + "value": "Вы точно хотите отменить регистрацию?" + }, + "AreYouSureSecretChat": { + "key": "AreYouSureSecretChat", + "value": "Хотите начать секретный чат?" + }, + "AreYouSureSecretChatTitle": { + "key": "AreYouSureSecretChatTitle", + "value": "Секретный чат" + }, + "AreYouSureSessionTitle": { + "key": "AreYouSureSessionTitle", + "value": "Завершить сеанс" + }, + "AreYouSureSessions": { + "key": "AreYouSureSessions", + "value": "Вы точно хотите завершить все другие сеансы?" + }, + "AreYouSureSessionsTitle": { + "key": "AreYouSureSessionsTitle", + "value": "Завершить сеансы" + }, + "AreYouSureShareMyContactInfo": { + "key": "AreYouSureShareMyContactInfo", + "value": "Вы точно хотите поделиться номером телефона?" + }, + "AreYouSureShareMyContactInfoBot": { + "key": "AreYouSureShareMyContactInfoBot", + "value": "Бот будет знать номер Вашего телефона. Это может использоваться для интеграции с другими сервисами." + }, + "AreYouSureShareMyContactInfoUser": { + "key": "AreYouSureShareMyContactInfoUser", + "value": "Хотите поделиться своим номером телефона %1$s с **%2$s**?" + }, + "AreYouSureUnblockContact": { + "key": "AreYouSureUnblockContact", + "value": "Вы точно хотите разблокировать этот контакт?" + }, + "AreYouSureWebSessions": { + "key": "AreYouSureWebSessions", + "value": "Вы действительно хотите отключить все сайты, где авторизованы через Telegram?" + }, + "ArticleByAuthor": { + "key": "ArticleByAuthor", + "value": "от %1$s" + }, + "ArticleDateByAuthor": { + "key": "ArticleDateByAuthor", + "value": "%1$s от %2$s" + }, + "AskAQuestion": { + "key": "AskAQuestion", + "value": "Задать вопрос" + }, + "AskAQuestionInfo": { + "key": "AskAQuestionInfo", + "value": "Пожалуйста, обратите внимание, что в поддержке Telegram отвечают волонтеры. Мы постараемся помочь как можно быстрее, но ожидание может занять время.\n\nПожалуйста, ознакомьтесь с частыми вопросами о Telegram]]>: там есть ответ на большинство вопросов и важные советы по устранению неполадок]]>." + }, + "AskButton": { + "key": "AskButton", + "value": "Спросить волонтёров" + }, + "AttachAudio": { + "key": "AttachAudio", + "value": "Голосовое сообщение" + }, + "AttachBotsHelp": { + "key": "AttachBotsHelp", + "value": "Список ботов ниже" + }, + "AttachContact": { + "key": "AttachContact", + "value": "Контакт" + }, + "AttachDestructingPhoto": { + "key": "AttachDestructingPhoto", + "value": "Самоуничтожающееся фото" + }, + "AttachDestructingVideo": { + "key": "AttachDestructingVideo", + "value": "Самоуничтожающееся видео" + }, + "AttachDocument": { + "key": "AttachDocument", + "value": "Файл" + }, + "AttachGame": { + "key": "AttachGame", + "value": "Игра" + }, + "AttachGif": { + "key": "AttachGif", + "value": "GIF" + }, + "AttachGifRestricted": { + "key": "AttachGifRestricted", + "value": "Администраторы группы запретили Вам отправлять GIF до %1$s" + }, + "AttachGifRestrictedForever": { + "key": "AttachGifRestrictedForever", + "value": "Администраторы группы запретили Вам отправлять GIF." + }, + "AttachInlineRestricted": { + "key": "AttachInlineRestricted", + "value": "Администраторы группы запретили Вам отправлять сообщения с помощью ботов до %1$s" + }, + "AttachInlineRestrictedForever": { + "key": "AttachInlineRestrictedForever", + "value": "Администраторы группы запретили Вам отправлять сообщения с помощью ботов." + }, + "AttachLiveLocation": { + "key": "AttachLiveLocation", + "value": "Трансляция геопозиции" + }, + "AttachLiveLocationIsSharing": { + "key": "AttachLiveLocationIsSharing", + "value": "%1$s для %2$s" + }, + "AttachLiveLocationIsSharingChat": { + "key": "AttachLiveLocationIsSharingChat", + "value": "%1$s в %2$s" + }, + "AttachLiveLocationIsSharingChats": { + "key": "AttachLiveLocationIsSharingChats", + "value": "%1$s в %2$s" + }, + "AttachLocation": { + "key": "AttachLocation", + "value": "Геопозиция" + }, + "AttachMediaRestricted": { + "key": "AttachMediaRestricted", + "value": "Администраторы группы запретили Вам отправлять фото и видео до %1$s" + }, + "AttachMediaRestrictedForever": { + "key": "AttachMediaRestrictedForever", + "value": "Администраторы группы запретили Вам отправлять в нее фото и видео." + }, + "AttachMusic": { + "key": "AttachMusic", + "value": "Музыка" + }, + "AttachPhoto": { + "key": "AttachPhoto", + "value": "Фотография" + }, + "AttachPhotoExpired": { + "key": "AttachPhotoExpired", + "value": "Фотография самоуничтожилась" + }, + "AttachRound": { + "key": "AttachRound", + "value": "Видеосообщение" + }, + "AttachSticker": { + "key": "AttachSticker", + "value": "Стикер" + }, + "AttachStickersRestricted": { + "key": "AttachStickersRestricted", + "value": "Администраторы группы запретили Вам отправлять стикеры до %1$s" + }, + "AttachStickersRestrictedForever": { + "key": "AttachStickersRestrictedForever", + "value": "Администраторы группы запретили Вам отправлять стикеры" + }, + "AttachVideo": { + "key": "AttachVideo", + "value": "Видео" + }, + "AttachVideoExpired": { + "key": "AttachVideoExpired", + "value": "Срок жизни видеозаписи истёк" + }, + "AudioAutodownload": { + "key": "AudioAutodownload", + "value": "Голосовые сообщения" + }, + "AudioSavedHint": { + "key": "AudioSavedHint", + "value": "Файл сохранён в музыку" + }, + "AudioSpeedFast": { + "key": "AudioSpeedFast", + "value": "Аудио будет играть в два раза быстрее." + }, + "AudioSpeedNormal": { + "key": "AudioSpeedNormal", + "value": "Аудио будет играть с обычной скоростью." + }, + "AudioTitle": { + "key": "AudioTitle", + "value": "Общая музыка" + }, + "AudioUnknownArtist": { + "key": "AudioUnknownArtist", + "value": "Неизвестен" + }, + "AudioUnknownTitle": { + "key": "AudioUnknownTitle", + "value": "Неизвестный трек" + }, + "AudiosSavedHint": { + "key": "AudiosSavedHint", + "zeroValue": null, + "oneValue": "%1$d файл сохранён в музыку", + "twoValue": null, + "fewValue": "%1$d файла сохранено в музыку", + "manyValue": "%1$d файлов сохранено в музыку", + "otherValue": "%1$d файла сохранено в музыку" + }, + "August": { + "key": "August", + "value": "Август" + }, + "AuthAnotherClient": { + "key": "AuthAnotherClient", + "value": "Сканировать QR-код" + }, + "AuthAnotherClientDownloadClientUrl": { + "key": "AuthAnotherClientDownloadClientUrl", + "value": "https://desktop.telegram.org/" + }, + "AuthAnotherClientInfo1": { + "key": "AuthAnotherClientInfo1", + "value": "Установите Telegram для компьютера по ссылке *desktop.telegram.org*." + }, + "AuthAnotherClientInfo2": { + "key": "AuthAnotherClientInfo2", + "value": "Запустите Telegram Desktop, чтобы получить QR-код." + }, + "AuthAnotherClientInfo3": { + "key": "AuthAnotherClientInfo3", + "value": "Сканируйте этот QR-код для входа в аккаунт." + }, + "AuthAnotherClientNotFound": { + "key": "AuthAnotherClientNotFound", + "value": "Токен не найден" + }, + "AuthAnotherClientOk": { + "key": "AuthAnotherClientOk", + "value": "Успешная авторизация" + }, + "AuthAnotherClientScan": { + "key": "AuthAnotherClientScan", + "value": "Сканировать QR-код" + }, + "AuthAnotherClientTokenError": { + "key": "AuthAnotherClientTokenError", + "value": "Токен недействителен или устарел." + }, + "AuthAnotherClientUrl": { + "key": "AuthAnotherClientUrl", + "value": "Этот код можно использовать для входа в Ваш аккаунт в Telegram.\n\nДля подтверждения входа перейдите в Настройки > Устройства > Сканировать QR и отсканируйте этот код." + }, + "AutoDelete24Hours": { + "key": "AutoDelete24Hours", + "value": "24 часа" + }, + "AutoDelete7Days": { + "key": "AutoDelete7Days", + "value": "7 дней" + }, + "AutoDeleteAlertChannelInfo": { + "key": "AutoDeleteAlertChannelInfo", + "value": "Новые сообщения в канале будут автоматически удалены для всех подписчиков через выбранное Вами время." + }, + "AutoDeleteAlertGroupInfo": { + "key": "AutoDeleteAlertGroupInfo", + "value": "Новые сообщения в группе будут автоматически удалены для всех участников через выбранное Вами время." + }, + "AutoDeleteAlertTitle": { + "key": "AutoDeleteAlertTitle", + "value": "Автоудаление сообщений" + }, + "AutoDeleteAlertUserInfo": { + "key": "AutoDeleteAlertUserInfo", + "value": "Новые сообщения будут автоматически удалены для Вас и %1$s через выбранное время." + }, + "AutoDeleteConfirm": { + "key": "AutoDeleteConfirm", + "value": "Подтвердить" + }, + "AutoDeleteHeader": { + "key": "AutoDeleteHeader", + "value": "Автоудаление сообщений в этом чате" + }, + "AutoDeleteHintOffText": { + "key": "AutoDeleteHintOffText", + "value": "Автоудаление выключено." + }, + "AutoDeleteHintOnText": { + "key": "AutoDeleteHintOnText", + "value": "Новые сообщения в чате будут автоматически удаляться через %1$s." + }, + "AutoDeleteIn": { + "key": "AutoDeleteIn", + "value": "Автоудаление через %1$s" + }, + "AutoDeleteInfo": { + "key": "AutoDeleteInfo", + "value": "Новые сообщения в чате будут автоматически удалены через выбранное время." + }, + "AutoDeleteNever": { + "key": "AutoDeleteNever", + "value": "Нет" + }, + "AutoDeleteSet": { + "key": "AutoDeleteSet", + "value": "Применить в этом чате" + }, + "AutoDeleteSetInfo": { + "key": "AutoDeleteSetInfo", + "value": "Сообщения в этом чате автоматически\nудаляются через %1$s после отправки." + }, + "AutoDeleteSetTimer": { + "key": "AutoDeleteSetTimer", + "value": "Удаление по таймеру" + }, + "AutoDownloadAudioInfo": { + "key": "AutoDownloadAudioInfo", + "value": "Голосовые сообщения имеют небольшой размер и всегда загружаются автоматически." + }, + "AutoDownloadChannels": { + "key": "AutoDownloadChannels", + "value": "каналы" + }, + "AutoDownloadContacts": { + "key": "AutoDownloadContacts", + "value": "контакты" + }, + "AutoDownloadCustom": { + "key": "AutoDownloadCustom", + "value": "Другой" + }, + "AutoDownloadDataUsage": { + "key": "AutoDownloadDataUsage", + "value": "Расход трафика" + }, + "AutoDownloadFiles": { + "key": "AutoDownloadFiles", + "value": "Файлы" + }, + "AutoDownloadFilesOn": { + "key": "AutoDownloadFilesOn", + "value": "Файлы" + }, + "AutoDownloadFilesTitle": { + "key": "AutoDownloadFilesTitle", + "value": "Автозагрузка файлов и музыки" + }, + "AutoDownloadGroups": { + "key": "AutoDownloadGroups", + "value": "группы" + }, + "AutoDownloadHigh": { + "key": "AutoDownloadHigh", + "value": "Высокий" + }, + "AutoDownloadLow": { + "key": "AutoDownloadLow", + "value": "Низкий" + }, + "AutoDownloadMaxFileSize": { + "key": "AutoDownloadMaxFileSize", + "value": "Максимальный размер файла" + }, + "AutoDownloadMaxVideoSize": { + "key": "AutoDownloadMaxVideoSize", + "value": "Максимальный размер видео" + }, + "AutoDownloadMedia": { + "key": "AutoDownloadMedia", + "value": "Загружать автоматически" + }, + "AutoDownloadMedium": { + "key": "AutoDownloadMedium", + "value": "Средний" + }, + "AutoDownloadOff": { + "key": "AutoDownloadOff", + "value": "Выключено" + }, + "AutoDownloadOnAllChats": { + "key": "AutoDownloadOnAllChats", + "value": "Включено для всех чатов" + }, + "AutoDownloadOnFor": { + "key": "AutoDownloadOnFor", + "value": "%1$s" + }, + "AutoDownloadOnMobileData": { + "key": "AutoDownloadOnMobileData", + "value": "Через моб. сеть" + }, + "AutoDownloadOnMobileDataInfo": { + "key": "AutoDownloadOnMobileDataInfo", + "value": "Включите, чтобы файлы мультимедиа автоматически загружались, когда Вы используете мобильную сеть." + }, + "AutoDownloadOnRoamingData": { + "key": "AutoDownloadOnRoamingData", + "value": "Через роуминг" + }, + "AutoDownloadOnRoamingDataInfo": { + "key": "AutoDownloadOnRoamingDataInfo", + "value": "Включите, чтобы файлы мультимедиа автоматически загружались, когда Вы находитесь в роуминге." + }, + "AutoDownloadOnUpToFor": { + "key": "AutoDownloadOnUpToFor", + "value": "До %1$s: %2$s" + }, + "AutoDownloadOnWiFiData": { + "key": "AutoDownloadOnWiFiData", + "value": "Через Wi-Fi" + }, + "AutoDownloadOnWiFiDataInfo": { + "key": "AutoDownloadOnWiFiDataInfo", + "value": "Включите, чтобы файлы мультимедиа автоматически загружались, когда Вы используете Wi-Fi." + }, + "AutoDownloadPhotos": { + "key": "AutoDownloadPhotos", + "value": "Фото" + }, + "AutoDownloadPhotosOn": { + "key": "AutoDownloadPhotosOn", + "value": "Фото" + }, + "AutoDownloadPhotosTitle": { + "key": "AutoDownloadPhotosTitle", + "value": "Автозагрузка фото" + }, + "AutoDownloadPm": { + "key": "AutoDownloadPm", + "value": "личные чаты" + }, + "AutoDownloadPreloadMusic": { + "key": "AutoDownloadPreloadMusic", + "value": "Предзагрузка следующего аудио" + }, + "AutoDownloadPreloadMusicInfo": { + "key": "AutoDownloadPreloadMusicInfo", + "value": "Начать загрузку следующего трека во время прослушивания аудиофайла." + }, + "AutoDownloadPreloadVideo": { + "key": "AutoDownloadPreloadVideo", + "value": "Предзагрузка длинных видео" + }, + "AutoDownloadPreloadVideoInfo": { + "key": "AutoDownloadPreloadVideoInfo", + "value": "Подгружать первые секунды (1-2 МБ) для видеозаписей больше %1$s, чтобы воспроизводить их без задержки." + }, + "AutoDownloadTypes": { + "key": "AutoDownloadTypes", + "value": "Загружать мультимедиа" + }, + "AutoDownloadUpToOnAllChats": { + "key": "AutoDownloadUpToOnAllChats", + "value": "До %1$s для всех чатов" + }, + "AutoDownloadVideos": { + "key": "AutoDownloadVideos", + "value": "Видео" + }, + "AutoDownloadVideosOn": { + "key": "AutoDownloadVideosOn", + "value": "Видео" + }, + "AutoDownloadVideosTitle": { + "key": "AutoDownloadVideosTitle", + "value": "Автозагрузка видео и GIF" + }, + "AutoLock": { + "key": "AutoLock", + "value": "Автоблокировка" + }, + "AutoLockDisabled": { + "key": "AutoLockDisabled", + "value": "Отключена" + }, + "AutoLockInTime": { + "key": "AutoLockInTime", + "value": "через %1$s" + }, + "AutoLockInfo": { + "key": "AutoLockInfo", + "value": "Запрашивать код доступа, если какое-то время не было активности." + }, + "AutoNightAdaptive": { + "key": "AutoNightAdaptive", + "value": "Адаптивная" + }, + "AutoNightAutomatic": { + "key": "AutoNightAutomatic", + "value": "Автоматически" + }, + "AutoNightBrightness": { + "key": "AutoNightBrightness", + "value": "Порог яркости" + }, + "AutoNightBrightnessInfo": { + "key": "AutoNightBrightnessInfo", + "value": "Переключать на выбранную ночную тему, если яркость внешнего освещения меньше %1$d%%." + }, + "AutoNightDisabled": { + "key": "AutoNightDisabled", + "value": "Не использовать" + }, + "AutoNightFrom": { + "key": "AutoNightFrom", + "value": "Начало" + }, + "AutoNightLocation": { + "key": "AutoNightLocation", + "value": "Местное время рассвета и заката" + }, + "AutoNightModeOff": { + "key": "AutoNightModeOff", + "value": "Смена темы ночью отключена" + }, + "AutoNightPreferred": { + "key": "AutoNightPreferred", + "value": "Выбранная ночная тема" + }, + "AutoNightSchedule": { + "key": "AutoNightSchedule", + "value": "Время использования" + }, + "AutoNightScheduled": { + "key": "AutoNightScheduled", + "value": "По расписанию" + }, + "AutoNightSystemDefault": { + "key": "AutoNightSystemDefault", + "value": "Использовать настройки системы" + }, + "AutoNightTheme": { + "key": "AutoNightTheme", + "value": "Настроить ночную тему" + }, + "AutoNightThemeOff": { + "key": "AutoNightThemeOff", + "value": "Не используется" + }, + "AutoNightTo": { + "key": "AutoNightTo", + "value": "Конец" + }, + "AutoNightUpdateLocation": { + "key": "AutoNightUpdateLocation", + "value": "Обновить геопозицию" + }, + "AutoNightUpdateLocationInfo": { + "key": "AutoNightUpdateLocationInfo", + "value": "Чтобы определить время захода и восхода солнца, необходимо разово получить данные о Вашем примерном местоположении. Эта информация будет храниться только на данном устройстве.\n\nЗакат: %1$s\nРассвет: %2$s" + }, + "AutodownloadChannels": { + "key": "AutodownloadChannels", + "value": "Каналы" + }, + "AutodownloadContacts": { + "key": "AutodownloadContacts", + "value": "Контакты" + }, + "AutodownloadGroupChats": { + "key": "AutodownloadGroupChats", + "value": "Группы" + }, + "AutodownloadPrivateChats": { + "key": "AutodownloadPrivateChats", + "value": "Личные чаты" + }, + "AutodownloadSizeLimit": { + "key": "AutodownloadSizeLimit", + "value": "По размеру" + }, + "AutodownloadSizeLimitUpTo": { + "key": "AutodownloadSizeLimitUpTo", + "value": "до %1$s" + }, + "AutomaticMediaDownload": { + "key": "AutomaticMediaDownload", + "value": "Автозагрузка медиа" + }, + "AutoplayGIF": { + "key": "AutoplayGIF", + "value": "GIF" + }, + "AutoplayGifs": { + "key": "AutoplayGifs", + "value": "Автозапуск GIF" + }, + "AutoplayMedia": { + "key": "AutoplayMedia", + "value": "Автовоспроизведение" + }, + "AutoplayVideo": { + "key": "AutoplayVideo", + "value": "Видео" + }, + "AutoplayVideoInfo": { + "key": "AutoplayVideoInfo", + "value": "Звук можно включить кнопками громкости." + }, + "Available": { + "key": "Available", + "value": "Доступен" + }, + "AwaitingEncryption": { + "key": "AwaitingEncryption", + "value": "Ждём, когда %s появится в сети..." + }, + "AwayTo": { + "key": "AwayTo", + "value": "%1$s отсюда" + }, + "Back": { + "key": "Back", + "value": "Назад" + }, + "BackgroundBlurred": { + "key": "BackgroundBlurred", + "value": "Размытие" + }, + "BackgroundBrightness": { + "key": "BackgroundBrightness", + "value": "Яркость" + }, + "BackgroundChoosePattern": { + "key": "BackgroundChoosePattern", + "value": "Выбрать узор" + }, + "BackgroundColor": { + "key": "BackgroundColor", + "value": "Цвет" + }, + "BackgroundColorPreviewLine1": { + "key": "BackgroundColorPreviewLine1", + "value": "Проведите влево или вправо, чтобы просмотреть другие цвета." + }, + "BackgroundColorPreviewLine2": { + "key": "BackgroundColorPreviewLine2", + "value": "Фисташковый — вкус, а не цвет." + }, + "BackgroundColorSinglePreviewLine1": { + "key": "BackgroundColorSinglePreviewLine1", + "value": "Чтобы применить фон, нажмите «Установить»" + }, + "BackgroundColorSinglePreviewLine2": { + "key": "BackgroundColorSinglePreviewLine2", + "value": "Наслаждайтесь видом" + }, + "BackgroundHexColorCode": { + "key": "BackgroundHexColorCode", + "value": "Шестнадцатеричный код" + }, + "BackgroundIntensity": { + "key": "BackgroundIntensity", + "value": "Интенсивность" + }, + "BackgroundMotion": { + "key": "BackgroundMotion", + "value": "Движение" + }, + "BackgroundPattern": { + "key": "BackgroundPattern", + "value": "Узор" + }, + "BackgroundPreview": { + "key": "BackgroundPreview", + "value": "Предпросмотр фона" + }, + "BackgroundPreviewLine1": { + "key": "BackgroundPreviewLine1", + "value": "Подсказка: иногда фон лучше выглядит с эффектом размытия." + }, + "BackgroundPreviewLine2": { + "key": "BackgroundPreviewLine2", + "value": "Ого! Спасибо." + }, + "BackgroundRestricted": { + "key": "BackgroundRestricted", + "value": "Фоновая передача данных ограничена." + }, + "BackgroundSearchColor": { + "key": "BackgroundSearchColor", + "value": "Цвет:" + }, + "BadgeNumber": { + "key": "BadgeNumber", + "value": "Счётчик сообщений" + }, + "BadgeNumberMutedChats": { + "key": "BadgeNumberMutedChats", + "value": "Чаты без уведомлений" + }, + "BadgeNumberShow": { + "key": "BadgeNumberShow", + "value": "Показывать счётчик" + }, + "BadgeNumberUnread": { + "key": "BadgeNumberUnread", + "value": "Число сообщений" + }, + "BanFromTheGroup": { + "key": "BanFromTheGroup", + "value": "УДАЛИТЬ ИЗ ГРУППЫ" + }, + "BannedPhoneNumber": { + "key": "BannedPhoneNumber", + "value": "Номер телефона заблокирован" + }, + "Bans": { + "key": "Bans", + "zeroValue": null, + "oneValue": "%1$d блокировка", + "twoValue": null, + "fewValue": "%1$d блокировки", + "manyValue": "%1$d блокировок", + "otherValue": "%1$d блокировки" + }, + "BioCopied": { + "key": "BioCopied", + "value": "Текст скопирован в буфер обмена." + }, + "Black": { + "key": "Black", + "value": "Чёрный" + }, + "Block": { + "key": "Block", + "value": "БЛОКИРОВАТЬ" + }, + "BlockAndDeleteReplies": { + "key": "BlockAndDeleteReplies", + "value": "БЛОКИРОВАТЬ И УДАЛИТЬ ОТВЕТЫ" + }, + "BlockContact": { + "key": "BlockContact", + "value": "Заблокировать" + }, + "BlockUser": { + "key": "BlockUser", + "value": "Заблокировать" + }, + "BlockUserAlert": { + "key": "BlockUserAlert", + "value": "Запретить **%1$s** писать Вам сообщения и звонить через Telegram?" + }, + "BlockUserChatsTitle": { + "key": "BlockUserChatsTitle", + "value": "ЧАТЫ" + }, + "BlockUserContactsTitle": { + "key": "BlockUserContactsTitle", + "value": "КОНТАКТЫ" + }, + "BlockUserMessage": { + "key": "BlockUserMessage", + "value": "Запретить **%1$s** писать Вам сообщения и звонить через Telegram?" + }, + "BlockUserMultiTitle": { + "key": "BlockUserMultiTitle", + "value": "Заблокировать" + }, + "BlockUserReplyAlert": { + "key": "BlockUserReplyAlert", + "value": "Заблокировать сообщения от **%1$s**?" + }, + "BlockUserTitle": { + "key": "BlockUserTitle", + "value": "Заблокировать %1$s" + }, + "BlockUsers": { + "key": "BlockUsers", + "value": "Заблокировать" + }, + "BlockUsersMessage": { + "key": "BlockUsersMessage", + "value": "Запретить **%1$s** писать Вам сообщения и звонить через Telegram?" + }, + "BlockedEmpty": { + "key": "BlockedEmpty", + "value": "Нет" + }, + "BlockedUsers": { + "key": "BlockedUsers", + "value": "Чёрный список" + }, + "BlockedUsersCount": { + "key": "BlockedUsersCount", + "zeroValue": null, + "oneValue": "%1$d заблокированный пользователь", + "twoValue": null, + "fewValue": "%1$d заблокированных пользователя", + "manyValue": "%1$d заблокированных пользователей", + "otherValue": "%1$d заблокированных пользователей" + }, + "BlockedUsersInfo": { + "key": "BlockedUsersInfo", + "value": "Заблокированные пользователи не смогут связаться с Вами и не будут видеть время Вашей последней активности." + }, + "Blue": { + "key": "Blue", + "value": "Синий" + }, + "BlurLinear": { + "key": "BlurLinear", + "value": "Линейное" + }, + "BlurOff": { + "key": "BlurOff", + "value": "Откл." + }, + "BlurRadial": { + "key": "BlurRadial", + "value": "Радиальное" + }, + "Bold": { + "key": "Bold", + "value": "Жирный" + }, + "Bot": { + "key": "Bot", + "value": "бот" + }, + "BotCantJoinGroups": { + "key": "BotCantJoinGroups", + "value": "Этот бот не может вступать в группы." + }, + "BotHelp": { + "key": "BotHelp", + "value": "Помощь" + }, + "BotInfoTitle": { + "key": "BotInfoTitle", + "value": "Что умеет этот бот?" + }, + "BotInvite": { + "key": "BotInvite", + "value": "Добавить в группу" + }, + "BotOwnershipTransfer": { + "key": "BotOwnershipTransfer", + "value": "Передача прав на бота" + }, + "BotOwnershipTransferAlertText": { + "key": "BotOwnershipTransferAlertText", + "value": "Вы сможете передать права на бота, если:" + }, + "BotOwnershipTransferChangeOwner": { + "key": "BotOwnershipTransferChangeOwner", + "value": "Сменить владельца" + }, + "BotOwnershipTransferReadyAlertText": { + "key": "BotOwnershipTransferReadyAlertText", + "value": "В этом случае **права** на бота будут полностью переданы выбранному пользователю." + }, + "BotPermissionGameAlert": { + "key": "BotPermissionGameAlert", + "value": "Разрешить боту %1$s передавать Ваше имя и id в Telegram (не номер телефона) сайтам, которые Вы откроете с его помощью?" + }, + "BotRestart": { + "key": "BotRestart", + "value": "Перезапустить бота" + }, + "BotSettings": { + "key": "BotSettings", + "value": "Настройки" + }, + "BotShare": { + "key": "BotShare", + "value": "Поделиться" + }, + "BotStart": { + "key": "BotStart", + "value": "СТАРТ" + }, + "BotStatusCantRead": { + "key": "BotStatusCantRead", + "value": "не имеет доступа к сообщениям" + }, + "BotStatusRead": { + "key": "BotStatusRead", + "value": "имеет доступ к сообщениям" + }, + "BotStop": { + "key": "BotStop", + "value": "Остановить бота" + }, + "BotUnblock": { + "key": "BotUnblock", + "value": "ПЕРЕЗАПУСТИТЬ" + }, + "BroadcastGroup": { + "key": "BroadcastGroup", + "value": "Группа для трансляций" + }, + "BroadcastGroupConvert": { + "key": "BroadcastGroupConvert", + "value": "Сделать группой для трансляций" + }, + "BroadcastGroupConvertInfo": { + "key": "BroadcastGroupConvertInfo", + "value": "В группе для трансляций могут состоять больше 200,000 участников, но писать сообщения смогут только администраторы." + }, + "BroadcastGroupConvertSuccess": { + "key": "BroadcastGroupConvertSuccess", + "value": "Теперь в Вашей группе может быть больше 200,000 участников." + }, + "BroadcastGroupInfo": { + "key": "BroadcastGroupInfo", + "value": "Только администраторы могут писать в этой группе." + }, + "Brown": { + "key": "Brown", + "value": "Коричневый" + }, + "BubbleRadius": { + "key": "BubbleRadius", + "value": "Углы блоков с сообщениями" + }, + "BuiltInThemes": { + "key": "BuiltInThemes", + "value": "Стандартные темы" + }, + "BytesReceived": { + "key": "BytesReceived", + "value": "Получено байт" + }, + "BytesSent": { + "key": "BytesSent", + "value": "Отправлено байт" + }, + "CacheClear": { + "key": "CacheClear", + "value": "Очистить" + }, + "CacheEmpty": { + "key": "CacheEmpty", + "value": "Пусто" + }, + "CacheWasCleared": { + "key": "CacheWasCleared", + "value": "%s освободилось" + }, + "CalculatingSize": { + "key": "CalculatingSize", + "value": "Подсчёт…" + }, + "Call": { + "key": "Call", + "value": "Позвонить" + }, + "CallAgain": { + "key": "CallAgain", + "value": "Позвонить снова" + }, + "CallAlert": { + "key": "CallAlert", + "value": "Позвонить **%1$s**?" + }, + "CallAlertTitle": { + "key": "CallAlertTitle", + "value": "Звонок" + }, + "CallBack": { + "key": "CallBack", + "value": "Перезвонить" + }, + "CallEmojiKeyTooltip": { + "key": "CallEmojiKeyTooltip", + "value": "Если %1$s видит те же эмодзи, что и вы, звонок на 100%% защищён." + }, + "CallMessageIncoming": { + "key": "CallMessageIncoming", + "value": "Входящий звонок" + }, + "CallMessageIncomingDeclined": { + "key": "CallMessageIncomingDeclined", + "value": "Отклонённый звонок" + }, + "CallMessageIncomingMissed": { + "key": "CallMessageIncomingMissed", + "value": "Пропущенный звонок" + }, + "CallMessageOutgoing": { + "key": "CallMessageOutgoing", + "value": "Исходящий звонок" + }, + "CallMessageOutgoingMissed": { + "key": "CallMessageOutgoingMissed", + "value": "Отменённый звонок" + }, + "CallMessageReportProblem": { + "key": "CallMessageReportProblem", + "value": "Оцените звонок" + }, + "CallMessageVideoIncoming": { + "key": "CallMessageVideoIncoming", + "value": "Входящий звонок" + }, + "CallMessageVideoIncomingDeclined": { + "key": "CallMessageVideoIncomingDeclined", + "value": "Отклонённый видеозвонок" + }, + "CallMessageVideoIncomingMissed": { + "key": "CallMessageVideoIncomingMissed", + "value": "Пропущенный звонок" + }, + "CallMessageVideoOutgoing": { + "key": "CallMessageVideoOutgoing", + "value": "Исходящий звонок" + }, + "CallMessageVideoOutgoingMissed": { + "key": "CallMessageVideoOutgoingMissed", + "value": "Отменённый звонок" + }, + "CallMessageWithDuration": { + "key": "CallMessageWithDuration", + "value": "%1$s (%2$s)" + }, + "CallNotAvailable": { + "key": "CallNotAvailable", + "value": "К сожалению, **%1$s** не принимает звонки." + }, + "CallReportHint": { + "key": "CallReportHint", + "value": "Что пошло не так?" + }, + "CallReportIncludeLogs": { + "key": "CallReportIncludeLogs", + "value": "Техническая информация" + }, + "CallReportLogsExplain": { + "key": "CallReportLogsExplain", + "value": "Это не раскроет содержание разговора и поможет решить проблему быстрее." + }, + "CallReportSent": { + "key": "CallReportSent", + "value": "Спасибо, что помогаете делать звонки Telegram лучше." + }, + "CallText": { + "key": "CallText", + "value": "Telegram позвонит Вам через %1$d:%2$02d" + }, + "CallViaTelegram": { + "key": "CallViaTelegram", + "value": "Звонок через Telegram" + }, + "Calling": { + "key": "Calling", + "value": "Звоним вам..." + }, + "Calls": { + "key": "Calls", + "value": "Звонки" + }, + "CallsDataUsage": { + "key": "CallsDataUsage", + "value": "Звонки" + }, + "CallsTotalTime": { + "key": "CallsTotalTime", + "value": "Всего времени" + }, + "CameraPermissionText": { + "key": "CameraPermissionText", + "value": "Нажмите, чтобы разрешить доступ к камере" + }, + "CanJoin": { + "key": "CanJoin", + "zeroValue": null, + "oneValue": "ещё %1$d вступление", + "twoValue": null, + "fewValue": "ещё %1$d вступления", + "manyValue": "ещё %1$d вступлений", + "otherValue": "ещё %1$d вступлений" + }, + "Cancel": { + "key": "Cancel", + "value": "Отмена" + }, + "CancelAccountReset": { + "key": "CancelAccountReset", + "value": "Отмена сброса аккаунта" + }, + "CancelAccountResetInfo": { + "key": "CancelAccountResetInfo", + "value": "Кто-то с доступом к **%1$s** запросил удаление Вашего аккаунта Telegram и сброс пароля двухэтапной аутентификации.\n\nЕсли это были не Вы, введите код из SMS, отправленного на Ваш номер. Вы также можете отменить удаление, **изменив номер телефона**." + }, + "CancelAccountResetInfo2": { + "key": "CancelAccountResetInfo2", + "value": "Кто-то с доступом к **%1$s** запросил удаление Вашего аккаунта Telegram и сброс пароля двухэтапной аутентификации.\n\nЕсли это были не Вы, введите код из SMS, отправленного на Ваш номер. Вы также можете отменить удаление, *изменив номер телефона*." + }, + "CancelEmailQuestion": { + "key": "CancelEmailQuestion", + "value": "Вы точно хотите прервать настройку почты для восстановления пароля?" + }, + "CancelEmailQuestionTitle": { + "key": "CancelEmailQuestionTitle", + "value": "Прервать установку" + }, + "CancelLinkExpired": { + "key": "CancelLinkExpired", + "value": "Ссылка неверна или устарела." + }, + "CancelLinkSuccess": { + "key": "CancelLinkSuccess", + "value": "Процесс удаления Вашего аккаунта %1$s был отменён. Теперь можете закрыть это окно." + }, + "CancelPasswordQuestion": { + "key": "CancelPasswordQuestion", + "value": "Вы точно хотите прервать настройку двухэтапной аутентификации?" + }, + "CancelPollAlertText": { + "key": "CancelPollAlertText", + "value": "Вы уверены, что хотите удалить этот опрос?" + }, + "CancelPollAlertTitle": { + "key": "CancelPollAlertTitle", + "value": "Удалить опрос?" + }, + "CancelRegistration": { + "key": "CancelRegistration", + "value": "Отмена регистрации" + }, + "CancelSending": { + "key": "CancelSending", + "value": "Отменить отправку" + }, + "CantAddBotAsAdmin": { + "key": "CantAddBotAsAdmin", + "value": "Ботов можно добавлять в каналы только как администраторов." + }, + "CantPlayVideo": { + "key": "CantPlayVideo", + "value": "Не удалось воспроизвести видео в приложении. Попробовать сторонний видеоплеер?" + }, + "Caption": { + "key": "Caption", + "value": "Подпись" + }, + "CardNumberCopied": { + "key": "CardNumberCopied", + "value": "Номер карты скопирован в буфер обмена" + }, + "Change": { + "key": "Change", + "value": "Изменить" + }, + "ChangeChatBackground": { + "key": "ChangeChatBackground", + "value": "Изменить фон чатов" + }, + "ChangeLanguageLater": { + "key": "ChangeLanguageLater", + "value": "Вы всегда можете изменить язык в настройках." + }, + "ChangePasscode": { + "key": "ChangePasscode", + "value": "Сменить код-пароль" + }, + "ChangePasscodeInfo": { + "key": "ChangePasscodeInfo", + "value": "После установки кода-пароля в списке чатов появится значок замка для блокировки и разблокировки приложения.\n\nВажно: если Вы забудете код-пароль, приложение придётся переустановить, и все секретные чаты будут утрачены." + }, + "ChangePassword": { + "key": "ChangePassword", + "value": "Сменить пароль" + }, + "ChangePermissions": { + "key": "ChangePermissions", + "value": "Изменить разрешения" + }, + "ChangePhoneHelp": { + "key": "ChangePhoneHelp", + "value": "SMS с кодом подтверждения придет на Ваш новый номер." + }, + "ChangePhoneNewNumber": { + "key": "ChangePhoneNewNumber", + "value": "Новый номер" + }, + "ChangePhoneNumber": { + "key": "ChangePhoneNumber", + "value": "Изменить номер" + }, + "ChangePhoneNumberInfo": { + "key": "ChangePhoneNumberInfo", + "value": "Перенесите на новый номер телефона свой аккаунт со всеми чатами и файлами." + }, + "ChangePhoneNumberOccupied": { + "key": "ChangePhoneNumberOccupied", + "value": "Номер %1$s уже привязан к аккаунту в Telegram. Удалите тот аккаунт, прежде чем перейти на новый номер." + }, + "ChangePublicLimitReached": { + "key": "ChangePublicLimitReached", + "value": "Вы уже используете слишком много публичных ссылок. Вы можете сбросить одну из уже занятых ссылок на свои группы или каналы или не создавать новую публичную ссылку." + }, + "ChangeRecoveryEmail": { + "key": "ChangeRecoveryEmail", + "value": "Сменить адрес электронной почты" + }, + "ChangeWallpaperToColor": { + "key": "ChangeWallpaperToColor", + "value": "Вы точно хотите изменить фон чата на однотонный?" + }, + "ChannelAddAdmin": { + "key": "ChannelAddAdmin", + "value": "Добавить администратора" + }, + "ChannelAddException": { + "key": "ChannelAddException", + "value": "Добавить исключение" + }, + "ChannelAddMembers": { + "key": "ChannelAddMembers", + "value": "Добавить участников" + }, + "ChannelAddSubscribers": { + "key": "ChannelAddSubscribers", + "value": "Добавить подписчиков" + }, + "ChannelAddTo": { + "key": "ChannelAddTo", + "value": "Пригласить %1$s в канал?" + }, + "ChannelAddToChannel": { + "key": "ChannelAddToChannel", + "value": "Добавить в канал" + }, + "ChannelAddToGroup": { + "key": "ChannelAddToGroup", + "value": "Добавить в группу" + }, + "ChannelAddedBy": { + "key": "ChannelAddedBy", + "value": "un1 пригласил(а) Вас в этот канал" + }, + "ChannelAddedByNotification": { + "key": "ChannelAddedByNotification", + "value": "%1$s пригласил(а) вас в канал %2$s" + }, + "ChannelAdmin": { + "key": "ChannelAdmin", + "value": "Админ" + }, + "ChannelAdministrator": { + "key": "ChannelAdministrator", + "value": "Администратор" + }, + "ChannelAdministrators": { + "key": "ChannelAdministrators", + "value": "Администраторы" + }, + "ChannelAdminsInfo": { + "key": "ChannelAdminsInfo", + "value": "Вы можете назначать помощников для управления каналом. Чтобы удалить администратора, нажмите и удерживайте." + }, + "ChannelAlertCreate": { + "key": "ChannelAlertCreate", + "value": "СОЗДАТЬ КАНАЛ" + }, + "ChannelAlertCreate2": { + "key": "ChannelAlertCreate2", + "value": "Создать канал" + }, + "ChannelAlertText": { + "key": "ChannelAlertText", + "value": "Каналы — инструмент, который позволяет транслировать сообщения на большую аудиторию." + }, + "ChannelAlertTitle": { + "key": "ChannelAlertTitle", + "value": "Что такое канал?" + }, + "ChannelBlacklist": { + "key": "ChannelBlacklist", + "value": "Чёрный список" + }, + "ChannelBlockUser": { + "key": "ChannelBlockUser", + "value": "Исключить пользователя" + }, + "ChannelBlockedUsers": { + "key": "ChannelBlockedUsers", + "value": "Чёрный список" + }, + "ChannelBots": { + "key": "ChannelBots", + "value": "Боты" + }, + "ChannelBroadcast": { + "key": "ChannelBroadcast", + "value": "Публикация" + }, + "ChannelCantOpenBanned": { + "key": "ChannelCantOpenBanned", + "value": "К сожалению, Вам запрещено состоять в публичных группах." + }, + "ChannelCantOpenBannedByAdmin": { + "key": "ChannelCantOpenBannedByAdmin", + "value": "У Вас нет доступа к этому чату, так как Вас заблокировал его администратор." + }, + "ChannelCantOpenNa": { + "key": "ChannelCantOpenNa", + "value": "К сожалению, чат больше не доступен." + }, + "ChannelCantOpenPrivate": { + "key": "ChannelCantOpenPrivate", + "value": "К сожалению, чат больше не доступен." + }, + "ChannelCantSendMessage": { + "key": "ChannelCantSendMessage", + "value": "К сожалению, Вы не можете отправлять сообщения в этот канал." + }, + "ChannelContacts": { + "key": "ChannelContacts", + "value": "Контакты в этом канале" + }, + "ChannelCreator": { + "key": "ChannelCreator", + "value": "Владелец" + }, + "ChannelDelete": { + "key": "ChannelDelete", + "value": "Удалить канал" + }, + "ChannelDeleteAlert": { + "key": "ChannelDeleteAlert", + "value": "Важно! Если удалить канал, все подписчики и все сообщения в нём будут потеряны. Всё равно удалить?" + }, + "ChannelDeleteFromList": { + "key": "ChannelDeleteFromList", + "value": "Удалить из этого списка" + }, + "ChannelDeleteInfo": { + "key": "ChannelDeleteInfo", + "value": "Вы потеряете все сообщения из этого канала." + }, + "ChannelDeleteMenu": { + "key": "ChannelDeleteMenu", + "value": "Удалить канал" + }, + "ChannelDeletedUndo": { + "key": "ChannelDeletedUndo", + "value": "Канал удалён." + }, + "ChannelDiscuss": { + "key": "ChannelDiscuss", + "value": "ОБСУДИТЬ" + }, + "ChannelEdit": { + "key": "ChannelEdit", + "value": "Изменить" + }, + "ChannelEditPermissions": { + "key": "ChannelEditPermissions", + "value": "Изменить разрешения" + }, + "ChannelInviteLinkTitle": { + "key": "ChannelInviteLinkTitle", + "value": "Ссылка-приглашение" + }, + "ChannelInviteViaLink": { + "key": "ChannelInviteViaLink", + "value": "Пригласить по ссылке" + }, + "ChannelJoin": { + "key": "ChannelJoin", + "value": "ПРИСОЕДИНИТЬСЯ" + }, + "ChannelJoinTo": { + "key": "ChannelJoinTo", + "value": "Хотите подписаться на канал «%1$s»?" + }, + "ChannelJoined": { + "key": "ChannelJoined", + "value": "Вы подписались на этот канал" + }, + "ChannelLeaveAlert": { + "key": "ChannelLeaveAlert", + "value": "Вы точно хотите покинуть канал?" + }, + "ChannelLeaveAlertWithName": { + "key": "ChannelLeaveAlertWithName", + "value": "Вы точно хотите покинуть **%1$s**?" + }, + "ChannelLinkInfo": { + "key": "ChannelLinkInfo", + "value": "Любой пользователь Telegram сможет подписаться на Ваш канал, перейдя по этой ссылке." + }, + "ChannelLinkTitle": { + "key": "ChannelLinkTitle", + "value": "Публичная ссылка" + }, + "ChannelMegaJoined": { + "key": "ChannelMegaJoined", + "value": "Вы вступили в эту группу" + }, + "ChannelMembers": { + "key": "ChannelMembers", + "value": "Участники" + }, + "ChannelMembersInfo": { + "key": "ChannelMembersInfo", + "value": "Этот список видят только администраторы канала." + }, + "ChannelMessageAlbum": { + "key": "ChannelMessageAlbum", + "value": "В канале «%1$s» новый альбом" + }, + "ChannelMessageAudio": { + "key": "ChannelMessageAudio", + "value": "В канале «%1$s» новое голосовое сообщение" + }, + "ChannelMessageContact": { + "key": "ChannelMessageContact", + "value": "В канал %1$s отправили контакт" + }, + "ChannelMessageContact2": { + "key": "ChannelMessageContact2", + "value": "В канале «%1$s» новый контакт %2$s" + }, + "ChannelMessageDocument": { + "key": "ChannelMessageDocument", + "value": "В канале «%1$s» новый файл" + }, + "ChannelMessageFew": { + "key": "ChannelMessageFew", + "value": "%1$s опубликовал(а) %2$s" + }, + "ChannelMessageGIF": { + "key": "ChannelMessageGIF", + "value": "В канале «%1$s» новый GIF" + }, + "ChannelMessageLiveLocation": { + "key": "ChannelMessageLiveLocation", + "value": "В канале «%1$s» новая трансляция геопозиции" + }, + "ChannelMessageMap": { + "key": "ChannelMessageMap", + "value": "В канале «%1$s» новая геопозиция" + }, + "ChannelMessageMusic": { + "key": "ChannelMessageMusic", + "value": "В канале «%1$s» новый аудиофайл" + }, + "ChannelMessageNoText": { + "key": "ChannelMessageNoText", + "value": "В канале «%1$s» новая публикация" + }, + "ChannelMessagePhoto": { + "key": "ChannelMessagePhoto", + "value": "В канале «%1$s» новое фото" + }, + "ChannelMessagePoll": { + "key": "ChannelMessagePoll", + "value": "В канале «%1$s» новый опрос" + }, + "ChannelMessagePoll2": { + "key": "ChannelMessagePoll2", + "value": "В канале «%1$s» новый опрос %2$s" + }, + "ChannelMessageQuiz2": { + "key": "ChannelMessageQuiz2", + "value": "В канале «%1$s» новая викторина «%2$s»" + }, + "ChannelMessageRound": { + "key": "ChannelMessageRound", + "value": "В канале «%1$s» новое видеосообщение" + }, + "ChannelMessageSticker": { + "key": "ChannelMessageSticker", + "value": "В канале %1$s новый стикер" + }, + "ChannelMessageStickerEmoji": { + "key": "ChannelMessageStickerEmoji", + "value": "В канал %1$s отправили стикер %2$s" + }, + "ChannelMessageVideo": { + "key": "ChannelMessageVideo", + "value": "В канале «%1$s» новое видео" + }, + "ChannelModerator": { + "key": "ChannelModerator", + "value": "Модератор" + }, + "ChannelMute": { + "key": "ChannelMute", + "value": "УБРАТЬ ЗВУК" + }, + "ChannelNotifyMembersInfoOff": { + "key": "ChannelNotifyMembersInfoOff", + "value": "Подписчики получат уведомление без звука" + }, + "ChannelNotifyMembersInfoOn": { + "key": "ChannelNotifyMembersInfoOn", + "value": "Участники получают уведомления о публикациях" + }, + "ChannelOtherMembers": { + "key": "ChannelOtherMembers", + "value": "Другие участники" + }, + "ChannelOtherSubscriberJoined": { + "key": "ChannelOtherSubscriberJoined", + "value": "участник с %1$s" + }, + "ChannelOtherSubscribers": { + "key": "ChannelOtherSubscribers", + "value": "Другие подписчики" + }, + "ChannelPermissions": { + "key": "ChannelPermissions", + "value": "Разрешения" + }, + "ChannelPermissionsHeader": { + "key": "ChannelPermissionsHeader", + "value": "Возможности участников:" + }, + "ChannelPhotoEditNotification": { + "key": "ChannelPhotoEditNotification", + "value": "Фото канала %1$s обновлено" + }, + "ChannelPostDeleted": { + "key": "ChannelPostDeleted", + "value": "Этот пост был удален из группы для обсуждения." + }, + "ChannelPrivate": { + "key": "ChannelPrivate", + "value": "Частный канал" + }, + "ChannelPrivateInfo": { + "key": "ChannelPrivateInfo", + "value": "На частные каналы можно подписаться только по ссылке-приглашению." + }, + "ChannelPrivateLinkHelp": { + "key": "ChannelPrivateLinkHelp", + "value": "По этой ссылке можно подписаться на Ваш канал. Вы можете сбросить её в любой момент." + }, + "ChannelPublic": { + "key": "ChannelPublic", + "value": "Публичный канал" + }, + "ChannelPublicEmptyUsername": { + "key": "ChannelPublicEmptyUsername", + "value": "Выберите публичную ссылку для канала, чтобы пользователи могли отправлять её друг другу, а канал можно было найти через поиск.\n\nЕсли Вы в этом не заинтересованы, предлагаем создать частный канал." + }, + "ChannelPublicEmptyUsernameTitle": { + "key": "ChannelPublicEmptyUsernameTitle", + "value": "Выберите ссылку" + }, + "ChannelPublicInfo": { + "key": "ChannelPublicInfo", + "value": "Публичные каналы можно найти через поиск, подписаться на них может любой пользователь." + }, + "ChannelRemoveUser": { + "key": "ChannelRemoveUser", + "value": "Удалить из канала" + }, + "ChannelRemoveUserAdmin": { + "key": "ChannelRemoveUserAdmin", + "value": "Разжаловать" + }, + "ChannelRestrictedUsers": { + "key": "ChannelRestrictedUsers", + "value": "Пользователи с ограничениями" + }, + "ChannelSearchException": { + "key": "ChannelSearchException", + "value": "Поиск исключений" + }, + "ChannelSettings": { + "key": "ChannelSettings", + "value": "Настройки" + }, + "ChannelSettingsChangedAlert": { + "key": "ChannelSettingsChangedAlert", + "value": "Вы изменили настройки канала. Применить изменения?" + }, + "ChannelSettingsTitle": { + "key": "ChannelSettingsTitle", + "value": "Настройки канала" + }, + "ChannelSignMessages": { + "key": "ChannelSignMessages", + "value": "Подписывать сообщения" + }, + "ChannelSignMessagesInfo": { + "key": "ChannelSignMessagesInfo", + "value": "Добавлять имена администраторов к их сообщениям в канале." + }, + "ChannelSilentBroadcast": { + "key": "ChannelSilentBroadcast", + "value": "Тихая публикация" + }, + "ChannelSubscribers": { + "key": "ChannelSubscribers", + "value": "Подписчики" + }, + "ChannelTooMuch": { + "key": "ChannelTooMuch", + "value": "К сожалению, Вы участвуете в максимальном числе групп и каналов. Пожалуйста, покиньте какие-то из них, прежде чем создавать новые." + }, + "ChannelTooMuchJoin": { + "key": "ChannelTooMuchJoin", + "value": "У Вас максимальное число групп и каналов. Пожалуйста, сперва покиньте какую-нибудь группу или канал." + }, + "ChannelTooMuchTitle": { + "key": "ChannelTooMuchTitle", + "value": "Вы достигли лимита" + }, + "ChannelType": { + "key": "ChannelType", + "value": "Тип канала" + }, + "ChannelTypeHeader": { + "key": "ChannelTypeHeader", + "value": "Тип канала" + }, + "ChannelUnmute": { + "key": "ChannelUnmute", + "value": "ВКЛ. ЗВУК" + }, + "ChannelUserAddLimit": { + "key": "ChannelUserAddLimit", + "value": "Вы можете добавить в канал только первых 200 подписчиков. А вот по пригласительной ссылке на канал может подписаться неограниченное количество человек." + }, + "ChannelUserCantAdd": { + "key": "ChannelUserCantAdd", + "value": "Вы не можете приглашать этого пользователя в каналы." + }, + "ChannelUserCantAdmin": { + "key": "ChannelUserCantAdmin", + "value": "К сожалению, у канала слишком много администраторов." + }, + "ChannelUserCantBot": { + "key": "ChannelUserCantBot", + "value": "К сожалению, в канале слишком много ботов." + }, + "ChannelUserLeftError": { + "key": "ChannelUserLeftError", + "value": "Поскольку пользователь был подписан на канал прежде, Вы не можете пригласить его обратно. Для этого требуется, чтобы вы были друг у друга в списке контактов.\n\nЕсли пользователя нет в чёрном списке канала, он может присоединиться с помощь ссылки-приглашения." + }, + "ChannelUsernameHelp": { + "key": "ChannelUsernameHelp", + "value": "Если у канала будет постоянная публичная ссылка, другие пользователи смогут найти его и подписаться.\n\nМожно использовать латиницу (a-z), цифры (0-9) и подчёркивание. Минимальная длина — 5 символов." + }, + "ChannelUsernamePlaceholder": { + "key": "ChannelUsernamePlaceholder", + "value": "ссылка" + }, + "ChannelVerifiedWarning": { + "key": "ChannelVerifiedWarning", + "value": "Внимание" + }, + "ChannelVideoEditNotification": { + "key": "ChannelVideoEditNotification", + "value": "Новое видео у канала «%1$s»" + }, + "Channels": { + "key": "Channels", + "zeroValue": null, + "oneValue": "%1$d канал", + "twoValue": null, + "fewValue": "%1$d канала", + "manyValue": "%1$d каналов", + "otherValue": "%1$d каналов" + }, + "Characters": { + "key": "Characters", + "zeroValue": null, + "oneValue": "%1$d символ", + "twoValue": null, + "fewValue": "%1$d символа", + "manyValue": "%1$d символов", + "otherValue": "%1$d символа" + }, + "CharactersPerMessage": { + "key": "CharactersPerMessage", + "value": "%s на сообщение" + }, + "ChatAdmin": { + "key": "ChatAdmin", + "value": "админ" + }, + "ChatArchived": { + "key": "ChatArchived", + "value": "Чат в архиве." + }, + "ChatArchivedInfo": { + "key": "ChatArchivedInfo", + "value": "Смахните влево, чтобы скрыть архив." + }, + "ChatBackground": { + "key": "ChatBackground", + "value": "Фон для чатов" + }, + "ChatCamera": { + "key": "ChatCamera", + "value": "Камера" + }, + "ChatDeletedUndo": { + "key": "ChatDeletedUndo", + "value": "Чат удалён" + }, + "ChatDistanceToPeer": { + "key": "ChatDistanceToPeer", + "value": "%1$s в %2$s" + }, + "ChatDocument": { + "key": "ChatDocument", + "value": "Файл" + }, + "ChatGallery": { + "key": "ChatGallery", + "value": "Галерея" + }, + "ChatHints": { + "key": "ChatHints", + "value": "Люди" + }, + "ChatHintsDelete": { + "key": "ChatHintsDelete", + "value": "Убрать %1$s из подсказок?" + }, + "ChatHintsDeleteAlert": { + "key": "ChatHintsDeleteAlert", + "value": "Вы точно хотите скрыть **%1$s** из подсказок?" + }, + "ChatHintsDeleteAlertTitle": { + "key": "ChatHintsDeleteAlertTitle", + "value": "Скрыть подсказку" + }, + "ChatHistory": { + "key": "ChatHistory", + "value": "История чата для новых участников" + }, + "ChatHistoryHidden": { + "key": "ChatHistoryHidden", + "value": "Скрыта" + }, + "ChatHistoryHiddenInfo": { + "key": "ChatHistoryHiddenInfo", + "value": "Новые участники не будут видеть более ранних сообщений." + }, + "ChatHistoryHiddenInfo2": { + "key": "ChatHistoryHiddenInfo2", + "value": "Новые участники будут видеть не больше 100 последних сообщений." + }, + "ChatHistoryVisible": { + "key": "ChatHistoryVisible", + "value": "Видна" + }, + "ChatHistoryVisibleInfo": { + "key": "ChatHistoryVisibleInfo", + "value": "Новые участники будут видеть полную историю сообщений." + }, + "ChatList": { + "key": "ChatList", + "value": "Список чатов" + }, + "ChatListDefault": { + "key": "ChatListDefault", + "value": "Двустрочный" + }, + "ChatListExpanded": { + "key": "ChatListExpanded", + "value": "Трехстрочный" + }, + "ChatLocation": { + "key": "ChatLocation", + "value": "Геопозиция" + }, + "ChatSetLocation": { + "key": "ChatSetLocation", + "value": "Указать геопозицию" + }, + "ChatSetLocationInfo": { + "key": "ChatSetLocationInfo", + "value": "Пользователи будут видеть группу в разделе «Люди рядом»." + }, + "ChatSetNewPhoto": { + "key": "ChatSetNewPhoto", + "value": "Выбрать фотографию" + }, + "ChatSetPhotoOrVideo": { + "key": "ChatSetPhotoOrVideo", + "value": "Загрузить фотографию или видео" + }, + "ChatSetThisLocation": { + "key": "ChatSetThisLocation", + "value": "Выбрать эту геопозицию" + }, + "ChatSettings": { + "key": "ChatSettings", + "value": "Настройки чатов" + }, + "ChatVideo": { + "key": "ChatVideo", + "value": "Видео" + }, + "ChatWasMovedToMainList": { + "key": "ChatWasMovedToMainList", + "value": "Чат перенесен в основной список." + }, + "ChatYourSelf": { + "key": "ChatYourSelf", + "value": "сохранённые сообщения" + }, + "ChatYourSelfDescription1": { + "key": "ChatYourSelfDescription1", + "value": "Пересылайте сюда нужные сообщения" + }, + "ChatYourSelfDescription2": { + "key": "ChatYourSelfDescription2", + "value": "Храните здесь фото и видео" + }, + "ChatYourSelfDescription3": { + "key": "ChatYourSelfDescription3", + "value": "Заходите в этот чат с любых устройств" + }, + "ChatYourSelfDescription4": { + "key": "ChatYourSelfDescription4", + "value": "Найти нужное сообщение поможет поиск" + }, + "ChatYourSelfName": { + "key": "ChatYourSelfName", + "value": "Вы" + }, + "ChatYourSelfTitle": { + "key": "ChatYourSelfTitle", + "value": "Ваше личное хранилище" + }, + "Chats": { + "key": "Chats", + "zeroValue": null, + "oneValue": "%1$d чат", + "twoValue": null, + "fewValue": "%1$d чата", + "manyValue": "%1$d чатов", + "otherValue": "%1$d чатов" + }, + "ChatsArchived": { + "key": "ChatsArchived", + "value": "Чаты в архиве." + }, + "ChatsException": { + "key": "ChatsException", + "zeroValue": null, + "oneValue": "%1$d чат", + "twoValue": null, + "fewValue": "%1$d чата", + "manyValue": "%1$d чатов", + "otherValue": "%1$d чатов" + }, + "ChatsMute": { + "key": "ChatsMute", + "value": "Убрать звук" + }, + "ChatsNearbyHeader": { + "key": "ChatsNearbyHeader", + "value": "Группы рядом" + }, + "ChatsSelected": { + "key": "ChatsSelected", + "zeroValue": null, + "oneValue": "%1$d чат", + "twoValue": null, + "fewValue": "%1$d чата", + "manyValue": "%1$d чатов", + "otherValue": "%1$d чатов" + }, + "ChatsSelectedClear": { + "key": "ChatsSelectedClear", + "zeroValue": null, + "oneValue": "%1$d чат", + "twoValue": null, + "fewValue": "%1$d чата", + "manyValue": "%1$d чатов", + "otherValue": "%1$d чатов" + }, + "ChatsSelectedClearCache": { + "key": "ChatsSelectedClearCache", + "zeroValue": null, + "oneValue": "%1$d чата", + "twoValue": null, + "fewValue": "%1$d чатов", + "manyValue": "%1$d чатов", + "otherValue": "%1$d чатов" + }, + "ChatsUnmute": { + "key": "ChatsUnmute", + "value": "Вкл. уведомления" + }, + "Checking": { + "key": "Checking", + "value": "Проверка..." + }, + "ChooseCountry": { + "key": "ChooseCountry", + "value": "Выберите страну" + }, + "ChooseCover": { + "key": "ChooseCover", + "value": "Выберите обложку для видеозаписи" + }, + "ChooseDate": { + "key": "ChooseDate", + "value": "Выбрать дату" + }, + "ChooseFromGallery": { + "key": "ChooseFromGallery", + "value": "Загрузить из галереи" + }, + "ChooseFromSearch": { + "key": "ChooseFromSearch", + "value": "Поиск в сети" + }, + "ChooseFromYourStickers": { + "key": "ChooseFromYourStickers", + "value": "Выберите из своих наборов" + }, + "ChooseMapPreviewProvider": { + "key": "ChooseMapPreviewProvider", + "value": "Выберите сервис для предпросмотра карты" + }, + "ChoosePhoto": { + "key": "ChoosePhoto", + "value": "Выбрать фото" + }, + "ChoosePhotoOrVideo": { + "key": "ChoosePhotoOrVideo", + "value": "Выберите фотографию или видео" + }, + "ChooseRecordVideo": { + "key": "ChooseRecordVideo", + "value": "Записать видео" + }, + "ChooseStickerSet": { + "key": "ChooseStickerSet", + "value": "ВЫБЕРИТЕ СТИКЕРЫ" + }, + "ChooseStickerSetMy": { + "key": "ChooseStickerSetMy", + "value": "Вы можете создать собственные наборы стикеров с помощью бота @stickers." + }, + "ChooseStickerSetNotFound": { + "key": "ChooseStickerSetNotFound", + "value": "Набор стикеров не найден" + }, + "ChooseStickerSetNotFoundInfo": { + "key": "ChooseStickerSetNotFoundInfo", + "value": "Попробуйте ещё раз или выберите из списка ниже" + }, + "ChooseStickerSetPlaceholder": { + "key": "ChooseStickerSetPlaceholder", + "value": "набор стикеров" + }, + "ChooseTakePhoto": { + "key": "ChooseTakePhoto", + "value": "Сделать снимок" + }, + "ChooseTheme": { + "key": "ChooseTheme", + "value": "Выбрать тему" + }, + "ChooseYourLanguage": { + "key": "ChooseYourLanguage", + "value": "Выберите язык" + }, + "ChooseYourLanguageOther": { + "key": "ChooseYourLanguageOther", + "value": "Другой" + }, + "ChromeCustomTabs": { + "key": "ChromeCustomTabs", + "value": "Встроенный браузер" + }, + "ChromeCustomTabsInfo": { + "key": "ChromeCustomTabsInfo", + "value": "Открывать внешние ссылки в приложении" + }, + "ClearButton": { + "key": "ClearButton", + "value": "Очистить" + }, + "ClearCache": { + "key": "ClearCache", + "value": "Очистить кэш" + }, + "ClearCacheFewChatsTitle": { + "key": "ClearCacheFewChatsTitle", + "value": "Очистить кэш для %1$s" + }, + "ClearCacheInfo": { + "key": "ClearCacheInfo", + "value": "Освободите память устройства; файлы останутся в облаке." + }, + "ClearFewChatsTitle": { + "key": "ClearFewChatsTitle", + "value": "Очистить %1$s" + }, + "ClearHistory": { + "key": "ClearHistory", + "value": "Очистить историю" + }, + "ClearHistoryCache": { + "key": "ClearHistoryCache", + "value": "Удалить из кэша" + }, + "ClearHistoryOptionAlso": { + "key": "ClearHistoryOptionAlso", + "value": "Также очистить для %1$s" + }, + "ClearLocalDatabase": { + "key": "ClearLocalDatabase", + "value": "Очистить базу данных" + }, + "ClearMediaCache": { + "key": "ClearMediaCache", + "value": "Очистить кэш" + }, + "ClearOtherSessionsHelp": { + "key": "ClearOtherSessionsHelp", + "value": "Выйти на всех устройствах, кроме этого." + }, + "ClearOtherWebSessionsHelp": { + "key": "ClearOtherWebSessionsHelp", + "value": "Вы можете использовать свой аккаунт для авторизации на сайтах, которые поддерживают вход через Telegram." + }, + "ClearRecentEmoji": { + "key": "ClearRecentEmoji", + "value": "Удалить недавние эмодзи?" + }, + "ClearRecentHistory": { + "key": "ClearRecentHistory", + "value": "Очистить историю" + }, + "ClearSearch": { + "key": "ClearSearch", + "value": "Очистить историю поиска?" + }, + "ClearSearchAlert": { + "key": "ClearSearchAlert", + "value": "Вы точно хотите очистить историю поиска?" + }, + "ClearSearchAlertTitle": { + "key": "ClearSearchAlertTitle", + "value": "Очистить историю поиска" + }, + "ClearSearchRemove": { + "key": "ClearSearchRemove", + "value": "Убрать" + }, + "ClearSearchSingleAlertTitle": { + "key": "ClearSearchSingleAlertTitle", + "value": "История поиска" + }, + "ClearSearchSingleChatAlertText": { + "key": "ClearSearchSingleChatAlertText", + "value": "Вы точно хотите удалить \"%1$s\" из истории поиска?" + }, + "ClearSearchSingleUserAlertText": { + "key": "ClearSearchSingleUserAlertText", + "value": "Вы точно хотите удалить \"%1$s\" из истории поиска?" + }, + "ClearTelegramCache": { + "key": "ClearTelegramCache", + "value": "Очистить кэш Telegram" + }, + "Close": { + "key": "Close", + "value": "Закрыть" + }, + "CloseEditor": { + "key": "CloseEditor", + "value": "ЗАКРЫТЬ РЕДАКТОР" + }, + "Code": { + "key": "Code", + "value": "Код" + }, + "CodeExpired": { + "key": "CodeExpired", + "value": "Код устарел. Попробуйте ещё раз." + }, + "ColorBlue": { + "key": "ColorBlue", + "value": "Синий" + }, + "ColorCyan": { + "key": "ColorCyan", + "value": "Голубой" + }, + "ColorDark": { + "key": "ColorDark", + "value": "Тёмный" + }, + "ColorGreen": { + "key": "ColorGreen", + "value": "Зелёный" + }, + "ColorOrange": { + "key": "ColorOrange", + "value": "Оранжевый" + }, + "ColorPickerBackground": { + "key": "ColorPickerBackground", + "value": "Фон" + }, + "ColorPickerMainColor": { + "key": "ColorPickerMainColor", + "value": "Цвет акцентов" + }, + "ColorPickerMyMessages": { + "key": "ColorPickerMyMessages", + "value": "Мои сообщения" + }, + "ColorPickerReset": { + "key": "ColorPickerReset", + "value": "СБРОС" + }, + "ColorPickerResetAll": { + "key": "ColorPickerResetAll", + "value": "СБРОСИТЬ ВСЕ" + }, + "ColorPink": { + "key": "ColorPink", + "value": "Розовый" + }, + "ColorRed": { + "key": "ColorRed", + "value": "Красный" + }, + "ColorSepia": { + "key": "ColorSepia", + "value": "Сепия" + }, + "ColorTheme": { + "key": "ColorTheme", + "value": "Цветовая тема" + }, + "ColorThemeChanged": { + "key": "ColorThemeChanged", + "value": "Цветовая тема изменена." + }, + "ColorThemeChangedInfo": { + "key": "ColorThemeChangedInfo", + "value": "Вы можете изменить тему в разделе *Настройки чатов*." + }, + "ColorThemes": { + "key": "ColorThemes", + "value": "Цветовые темы" + }, + "ColorViolet": { + "key": "ColorViolet", + "value": "Фиолетовый" + }, + "ColorWhite": { + "key": "ColorWhite", + "value": "Белый" + }, + "ColorYellow": { + "key": "ColorYellow", + "value": "Желтый" + }, + "Comment": { + "key": "Comment", + "value": "Комментарий" + }, + "Comments": { + "key": "Comments", + "zeroValue": null, + "oneValue": "%1$d комментарий", + "twoValue": null, + "fewValue": "%1$d комментария", + "manyValue": "%1$d комментариев", + "otherValue": "%1$d комментария" + }, + "CommentsCount": { + "key": "CommentsCount", + "zeroValue": null, + "oneValue": "%1$d комментарий", + "twoValue": null, + "fewValue": "%1$d комментария", + "manyValue": "%1$d комментариев", + "otherValue": "%1$d комментария" + }, + "CommentsNoNumber": { + "key": "CommentsNoNumber", + "zeroValue": null, + "oneValue": "комментарий", + "twoValue": null, + "fewValue": "комментария", + "manyValue": "комментариев", + "otherValue": "комментария" + }, + "CommentsTitle": { + "key": "CommentsTitle", + "value": "Комментарии" + }, + "CommonGroups": { + "key": "CommonGroups", + "zeroValue": null, + "oneValue": "%1$d общая группа", + "twoValue": null, + "fewValue": "%1$d общих группы", + "manyValue": "%1$d общих групп", + "otherValue": "%1$d общих групп" + }, + "CompatibilityChat": { + "key": "CompatibilityChat", + "value": "%1$s использует старую версию Telegram, поэтому секретные фотографии отображаются в режиме совместимости.\n\nКогда %2$s обновит Telegram, для просмотра фотографий с таймером на минуту и меньше нужно будет нажать на фото и удерживать. Вы также будете видеть уведомление, если собеседник делает скриншот." + }, + "ConfirmDeleteCallLog": { + "key": "ConfirmDeleteCallLog", + "value": "Вы точно хотите удалить запись из истории звонков?" + }, + "Connected": { + "key": "Connected", + "value": "Подключен" + }, + "Connecting": { + "key": "Connecting", + "value": "Соединение..." + }, + "ConnectingConnectProxy": { + "key": "ConnectingConnectProxy", + "value": "Подключить прокси" + }, + "ConnectingToProxy": { + "key": "ConnectingToProxy", + "value": "Подключение к прокси..." + }, + "ConnectingToProxyDisable": { + "key": "ConnectingToProxyDisable", + "value": "Отключить" + }, + "ConnectingToProxyDisableAlert": { + "key": "ConnectingToProxyDisableAlert", + "value": "Хотите отключить прокси-сервер %1$s? Вы всегда можете включить его в настройках > Данные и память." + }, + "ConnectingToProxyEnable": { + "key": "ConnectingToProxyEnable", + "value": "Включить" + }, + "ConnectingToProxyTapToDisable": { + "key": "ConnectingToProxyTapToDisable", + "value": "Нажмите для отключения прокси..." + }, + "ContactBirthday": { + "key": "ContactBirthday", + "value": "День рождения" + }, + "ContactJob": { + "key": "ContactJob", + "value": "Работа" + }, + "ContactJobTitle": { + "key": "ContactJobTitle", + "value": "Должность" + }, + "ContactJoined": { + "key": "ContactJoined", + "value": "Контакт присоединился к Telegram" + }, + "ContactNotRegistered": { + "key": "ContactNotRegistered", + "value": "%1$s пока не использует Telegram. Пригласить?" + }, + "ContactNotRegisteredTitle": { + "key": "ContactNotRegisteredTitle", + "value": "Пригласить в Telegram" + }, + "ContactShare": { + "key": "ContactShare", + "value": "Отправить контакт" + }, + "ContactShortcutMessage": { + "key": "ContactShortcutMessage", + "value": "Сообщение %1$s" + }, + "ContactShortcutVideoCall": { + "key": "ContactShortcutVideoCall", + "value": "Видеозвонок %1$s" + }, + "ContactShortcutVoiceCall": { + "key": "ContactShortcutVoiceCall", + "value": "Звонок %1$s" + }, + "ContactSupport": { + "key": "ContactSupport", + "value": "Обратиться в поддержку" + }, + "ContactSupportInfo": { + "key": "ContactSupportInfo", + "value": "Если возникли неполадки, сообщите нам; выход из аккаунта обычно не помогает." + }, + "Contacts": { + "key": "Contacts", + "value": "Контакты" + }, + "ContactsPermissionAlert": { + "key": "ContactsPermissionAlert", + "value": "**Telegram** требуется доступ к Вашим контактам, чтобы Вы могли оставаться на связи с друзьями с любого устройства. Актуальная информация о Ваших контактах будет храниться зашифрованной в облаке Telegram." + }, + "ContactsPermissionAlertContinue": { + "key": "ContactsPermissionAlertContinue", + "value": "ПРОДОЛЖИТЬ" + }, + "ContactsPermissionAlertNotNow": { + "key": "ContactsPermissionAlertNotNow", + "value": "НЕ СЕЙЧАС" + }, + "Continue": { + "key": "Continue", + "value": "Продолжить" + }, + "ContinueOnThisLanguage": { + "key": "ContinueOnThisLanguage", + "value": "Продолжить на русском" + }, + "Contrast": { + "key": "Contrast", + "value": "Контраст" + }, + "ConvertGroup": { + "key": "ConvertGroup", + "value": "Сделать супергруппой" + }, + "ConvertGroupAlert": { + "key": "ConvertGroupAlert", + "value": "Это действие нельзя будет отменить. Супергруппу невозможно сделать обычной группой." + }, + "ConvertGroupAlertWarning": { + "key": "ConvertGroupAlertWarning", + "value": "Внимание" + }, + "ConvertGroupInfo": { + "key": "ConvertGroupInfo", + "value": "**Максимальное количество участников.**\n\nСделайте группу супергруппой, чтобы увеличить число участников и получить другие возможности:\n\n• В супергруппах могут общаться до %1$s участников\n• Новые участники могут видеть всю историю сообщений\n• Удалённые сообщения исчезают у всех пользователей\n• Администраторы могут указать описание группы\n• Создатель может выбрать для группы публичную ссылку" + }, + "ConvertGroupInfo2": { + "key": "ConvertGroupInfo2", + "value": "**В супергруппах:**\n\n• Новые участники видят всю историю сообщений\n• Удалённые сообщения исчезают у всех участников\n• Администраторы могут указать описание группы\n• Создатель может выбрать для группы публичную ссылку" + }, + "ConvertGroupInfo3": { + "key": "ConvertGroupInfo3", + "value": "**Важно:** это нельзя будет отменить." + }, + "ConvertGroupMenu": { + "key": "ConvertGroupMenu", + "value": "Сделать супергруппой" + }, + "Copy": { + "key": "Copy", + "value": "Копировать" + }, + "CopyCardNumber": { + "key": "CopyCardNumber", + "value": "Копировать" + }, + "CopyLink": { + "key": "CopyLink", + "value": "Копировать ссылку" + }, + "CountOfResults": { + "key": "CountOfResults", + "zeroValue": null, + "oneValue": "%1$d из %2$d", + "twoValue": null, + "fewValue": "%1$d из %2$d", + "manyValue": "%1$d из %2$d", + "otherValue": "%1$d из %2$d" + }, + "CountReceived": { + "key": "CountReceived", + "value": "Получено" + }, + "CountSent": { + "key": "CountSent", + "value": "Отправлено" + }, + "Create": { + "key": "Create", + "value": "Создать" + }, + "CreateEncryptedChatError": { + "key": "CreateEncryptedChatError", + "value": "Произошла ошибка." + }, + "CreateGroupError": { + "key": "CreateGroupError", + "value": "Вы не можете создать группу с этими пользователями из-за их настроек приватности." + }, + "CreateGroupForImport": { + "key": "CreateGroupForImport", + "value": "Создать группу для импорта" + }, + "CreateLink": { + "key": "CreateLink", + "value": "Добавить ссылку" + }, + "CreateNewContact": { + "key": "CreateNewContact", + "value": "Создать новый контакт" + }, + "CreateNewFilter": { + "key": "CreateNewFilter", + "value": "Создать новую папку" + }, + "CreateNewFilterInfo": { + "key": "CreateNewFilterInfo", + "value": "Вы можете создать папки с нужными чатами и переключаться между ними." + }, + "CreateNewLink": { + "key": "CreateNewLink", + "value": "Создать ссылку" + }, + "CreateNewLinkHelp": { + "key": "CreateNewLinkHelp", + "value": "Вы можете ограничить срок действия ссылки или число вступлений." + }, + "CreateNewTheme": { + "key": "CreateNewTheme", + "value": "Создать новую тему" + }, + "CreateNewThemeAlert": { + "key": "CreateNewThemeAlert", + "value": "Настройте нужные цвета, чтобы создать собственную тему оформления.\n\nВ этом же разделе можно вернуться к теме по умолчанию." + }, + "CreateNewThemeHelp": { + "key": "CreateNewThemeHelp", + "value": "Нажмите на иконку палитры, чтобы видеть и редактировать список элементов на экране." + }, + "CreateNewThemeInfo": { + "key": "CreateNewThemeInfo", + "value": "Создайте собственную тему, изменяя цвета в приложении. Здесь Вы всегда можете вернуться к теме, которая использовалась по умолчанию." + }, + "CreateNewThemeMenu": { + "key": "CreateNewThemeMenu", + "value": "Создать новую тему" + }, + "CreateTheme": { + "key": "CreateTheme", + "value": "СОЗДАТЬ ТЕМУ" + }, + "Crop": { + "key": "Crop", + "value": "КАДРИРОВАТЬ" + }, + "CropImage": { + "key": "CropImage", + "value": "Кадрировать" + }, + "CropOriginal": { + "key": "CropOriginal", + "value": "Оригинал" + }, + "CropReset": { + "key": "CropReset", + "value": "Сброс" + }, + "CropSquare": { + "key": "CropSquare", + "value": "Квадрат" + }, + "CurrentGroupStickers": { + "key": "CurrentGroupStickers", + "value": "Стикеры группы" + }, + "CurrentSession": { + "key": "CurrentSession", + "value": "Это устройство" + }, + "CurvesAll": { + "key": "CurvesAll", + "value": "ВСЕ" + }, + "CurvesBlue": { + "key": "CurvesBlue", + "value": "СИНИЙ" + }, + "CurvesGreen": { + "key": "CurvesGreen", + "value": "ЗЕЛЁНЫЙ" + }, + "CurvesRed": { + "key": "CurvesRed", + "value": "КРАСНЫЙ" + }, + "CustomCallInfo": { + "key": "CustomCallInfo", + "value": "Этим пользователям будет разрешено или запрещено звонить Вам независимо от настроек выше." + }, + "CustomHelp": { + "key": "CustomHelp", + "value": "Вы не будете видеть появление в сети и время активности пользователей, от которых скрыли свои. Вместо времени будет видно примерное значение (недавно, на этой неделе, в этом месяце)." + }, + "CustomNotifications": { + "key": "CustomNotifications", + "value": "Особые уведомления" + }, + "CustomP2PInfo": { + "key": "CustomP2PInfo", + "value": "Звонки через Peer-to-Peer будут использоваться или не использоваться для этих пользователей независимо от настроек выше." + }, + "CustomShareInfo": { + "key": "CustomShareInfo", + "value": "Этим пользователям будет разрешено или запрещено добавлять Вас в группы и каналы независимо от настроек выше." + }, + "CustomShareSettingsHelp": { + "key": "CustomShareSettingsHelp", + "value": "Вы можете добавить пользователей или целые группы в список исключений из настроек выше." + }, + "CustomThemes": { + "key": "CustomThemes", + "value": "Пользовательские темы" + }, + "DartInfo": { + "key": "DartInfo", + "value": "Отправьте эмодзи **:дартс:**, чтобы испытать удачу." + }, + "DataSettings": { + "key": "DataSettings", + "value": "Данные и память" + }, + "DataUsage": { + "key": "DataUsage", + "value": "Использование сети и кэша" + }, + "Days": { + "key": "Days", + "zeroValue": null, + "oneValue": "%1$d день", + "twoValue": null, + "fewValue": "%1$d дня", + "manyValue": "%1$d дней", + "otherValue": "%1$d дней" + }, + "DaysBold": { + "key": "DaysBold", + "zeroValue": null, + "oneValue": "**%1$d** д.", + "twoValue": null, + "fewValue": "**%1$d** д.", + "manyValue": "**%1$d** д.", + "otherValue": "**%1$d** д." + }, + "DaysLeft": { + "key": "DaysLeft", + "zeroValue": null, + "oneValue": "остался %1$d день", + "twoValue": null, + "fewValue": "осталось %1$d дня", + "manyValue": "осталось %1$d дней", + "otherValue": "осталось %1$d дня" + }, + "Deactivate": { + "key": "Deactivate", + "value": "Удалить сейчас" + }, + "DebugClearLogs": { + "key": "DebugClearLogs", + "value": "Очистить лог" + }, + "DebugMenu": { + "key": "DebugMenu", + "value": "Меню отладки" + }, + "DebugMenuCallSettings": { + "key": "DebugMenuCallSettings", + "value": "Настройки звонков" + }, + "DebugMenuClearMediaCache": { + "key": "DebugMenuClearMediaCache", + "value": "Очистить кэш отправки файлов" + }, + "DebugMenuDisableCamera": { + "key": "DebugMenuDisableCamera", + "value": "Выключить встроенную камеру" + }, + "DebugMenuDisableLogs": { + "key": "DebugMenuDisableLogs", + "value": "Выключить логирование" + }, + "DebugMenuDisablePauseMusic": { + "key": "DebugMenuDisablePauseMusic", + "value": "Продолжать музыку при записи" + }, + "DebugMenuDisableSmoothKeyboard": { + "key": "DebugMenuDisableSmoothKeyboard", + "value": "Клавиатура без анимации" + }, + "DebugMenuEnableCamera": { + "key": "DebugMenuEnableCamera", + "value": "Включить встроенную камеру" + }, + "DebugMenuEnableLogs": { + "key": "DebugMenuEnableLogs", + "value": "Включить логирование" + }, + "DebugMenuEnablePauseMusic": { + "key": "DebugMenuEnablePauseMusic", + "value": "Останавливать музыку при записи" + }, + "DebugMenuEnableSmoothKeyboard": { + "key": "DebugMenuEnableSmoothKeyboard", + "value": "Анимация клавиатуры" + }, + "DebugMenuImportContacts": { + "key": "DebugMenuImportContacts", + "value": "Импорт контактов" + }, + "DebugMenuReadAllDialogs": { + "key": "DebugMenuReadAllDialogs", + "value": "Прочесть все чаты" + }, + "DebugMenuReloadContacts": { + "key": "DebugMenuReloadContacts", + "value": "Перезагрузить контакты" + }, + "DebugMenuResetContacts": { + "key": "DebugMenuResetContacts", + "value": "Сбросить контакты" + }, + "DebugMenuResetDialogs": { + "key": "DebugMenuResetDialogs", + "value": "Сбросить кэш чатов" + }, + "DebugSendLogs": { + "key": "DebugSendLogs", + "value": "Отправить лог" + }, + "December": { + "key": "December", + "value": "Декабрь" + }, + "Decline": { + "key": "Decline", + "value": "Отклонить" + }, + "DeclineCall": { + "key": "DeclineCall", + "value": "Отклонить" + }, + "DeclineDeactivate": { + "key": "DeclineDeactivate", + "value": "Отклонить и удалить" + }, + "Default": { + "key": "Default", + "value": "По умолчанию" + }, + "DefaultRingtone": { + "key": "DefaultRingtone", + "value": "По умолчанию" + }, + "Delete": { + "key": "Delete", + "value": "Удалить" + }, + "DeleteAccountHelp": { + "key": "DeleteAccountHelp", + "value": "Если Вы ни разу не заглянете в Telegram за это время, аккаунт будет удалён вместе со всеми сообщениями и контактами." + }, + "DeleteAccountIfAwayFor": { + "key": "DeleteAccountIfAwayFor", + "value": "Если Вас не было" + }, + "DeleteAccountIfAwayFor2": { + "key": "DeleteAccountIfAwayFor2", + "value": "Автоудаление аккаунта" + }, + "DeleteAccountIfAwayFor3": { + "key": "DeleteAccountIfAwayFor3", + "value": "Если я не захожу" + }, + "DeleteAccountTitle": { + "key": "DeleteAccountTitle", + "value": "Удаление аккаунта при неактивности" + }, + "DeleteAll": { + "key": "DeleteAll", + "value": "Удалить все" + }, + "DeleteAllCalls": { + "key": "DeleteAllCalls", + "value": "Удалить все звонки" + }, + "DeleteAllCallsText": { + "key": "DeleteAllCallsText", + "value": "Удалить все недавние звонки?" + }, + "DeleteAllFrom": { + "key": "DeleteAllFrom", + "value": "Удалить всё от %1$s" + }, + "DeleteAllMessagesAlert": { + "key": "DeleteAllMessagesAlert", + "value": "Внимание! **Все сообщения** в чате будут удалены для Вас и **для Вашего собеседника**." + }, + "DeleteAllMessagesSavedAlert": { + "key": "DeleteAllMessagesSavedAlert", + "value": "Важно: это **удалит все сообщения** в чате." + }, + "DeleteAllRevokedLinkHelp": { + "key": "DeleteAllRevokedLinkHelp", + "value": "Это удалит все неактивные ссылки." + }, + "DeleteAllRevokedLinks": { + "key": "DeleteAllRevokedLinks", + "value": "Удалить все неактивные ссылки" + }, + "DeleteAndExit": { + "key": "DeleteAndExit", + "value": "Удалить и покинуть группу" + }, + "DeleteAndExitButton": { + "key": "DeleteAndExitButton", + "value": "Удалить и покинуть группу" + }, + "DeleteAndStop": { + "key": "DeleteAndStop", + "value": "Удалить и остановить" + }, + "DeleteBackground": { + "key": "DeleteBackground", + "zeroValue": null, + "oneValue": "Удалить %1$d фон", + "twoValue": null, + "fewValue": "Удалить %1$d фона", + "manyValue": "Удалить %1$d фонов", + "otherValue": "Удалить %1$d фонов" + }, + "DeleteBanUser": { + "key": "DeleteBanUser", + "value": "Заблокировать пользователя" + }, + "DeleteCalls": { + "key": "DeleteCalls", + "value": "Удалить звонки" + }, + "DeleteCallsForEveryone": { + "key": "DeleteCallsForEveryone", + "value": "Удалить для всех" + }, + "DeleteChannelForAll": { + "key": "DeleteChannelForAll", + "value": "Удалить для всех подписчиков" + }, + "DeleteChat": { + "key": "DeleteChat", + "value": "Удалить и выйти" + }, + "DeleteChatBackgroundsAlert": { + "key": "DeleteChatBackgroundsAlert", + "value": "Вы точно хотите удалить выбранные фоны? " + }, + "DeleteChatUser": { + "key": "DeleteChatUser", + "value": "Удалить чат" + }, + "DeleteContact": { + "key": "DeleteContact", + "value": "Удалить контакт" + }, + "DeleteFewChatsTitle": { + "key": "DeleteFewChatsTitle", + "value": "Удалить %1$s" + }, + "DeleteForAll": { + "key": "DeleteForAll", + "value": "Удалить у всех участников" + }, + "DeleteForUser": { + "key": "DeleteForUser", + "value": "Удалить для %1$s" + }, + "DeleteFromFavorites": { + "key": "DeleteFromFavorites", + "value": "Удалить из избранных" + }, + "DeleteFromRecent": { + "key": "DeleteFromRecent", + "value": "Убрать из недавних" + }, + "DeleteGif": { + "key": "DeleteGif", + "value": "Удалить GIF из этого раздела?" + }, + "DeleteGroupForAll": { + "key": "DeleteGroupForAll", + "value": "Удалить группу для всех участников" + }, + "DeleteLink": { + "key": "DeleteLink", + "value": "Удалить ссылку" + }, + "DeleteLinkHelp": { + "key": "DeleteLinkHelp", + "value": "Это удалит ссылку." + }, + "DeleteLocalization": { + "key": "DeleteLocalization", + "value": "Удалить локализацию?" + }, + "DeleteLocalizationText": { + "key": "DeleteLocalizationText", + "value": "Вы точно хотите удалить перевод **%1$s**?" + }, + "DeleteLocalizationTitle": { + "key": "DeleteLocalizationTitle", + "value": "Удалить перевод" + }, + "DeleteMega": { + "key": "DeleteMega", + "value": "Удалить группу" + }, + "DeleteMegaMenu": { + "key": "DeleteMegaMenu", + "value": "Удалить группу" + }, + "DeleteMessagesOption": { + "key": "DeleteMessagesOption", + "value": "Отозвать мои сообщения" + }, + "DeleteMessagesOptionAlso": { + "key": "DeleteMessagesOptionAlso", + "value": "Также удалить для %1$s" + }, + "DeleteMessagesText": { + "key": "DeleteMessagesText", + "value": "Чтобы удалить отправленные Вами %1$s из истории для **%2$s**, выберите «Отозвать мои сообщения»." + }, + "DeleteMessagesTextGroup": { + "key": "DeleteMessagesTextGroup", + "value": "Чтобы удалить отправленные Вами %1$s из истории для других участников группы, выберите «Отозвать мои сообщения»." + }, + "DeleteMessagesTextGroupPart": { + "key": "DeleteMessagesTextGroupPart", + "value": "Чтобы удалить отправленные Вами %1$s из истории для других участников группы, выберите «Удалить у всех участников»." + }, + "DeleteMessagesTitle": { + "key": "DeleteMessagesTitle", + "value": "Удалить %1$s" + }, + "DeleteMyAccount": { + "key": "DeleteMyAccount", + "value": "Удалить мой аккаунт" + }, + "DeletePhoto": { + "key": "DeletePhoto", + "value": "Удалить фото" + }, + "DeleteProxy": { + "key": "DeleteProxy", + "value": "Удалить прокси?" + }, + "DeleteReportSpam": { + "key": "DeleteReportSpam", + "value": "Сообщить о спаме" + }, + "DeleteSelectedCallsText": { + "key": "DeleteSelectedCallsText", + "value": "Удалить выбранные звонки из списка недавних?" + }, + "DeleteSingleMessagesTitle": { + "key": "DeleteSingleMessagesTitle", + "value": "Удалить сообщение" + }, + "DeleteStickerSetsAlertTitle": { + "key": "DeleteStickerSetsAlertTitle", + "value": "Удалить %1$s" + }, + "DeleteStickersAlertMessage": { + "key": "DeleteStickersAlertMessage", + "value": "Удалить выбранные наборы?" + }, + "DeleteTheme": { + "key": "DeleteTheme", + "value": "Удалить тему" + }, + "DeleteThemeAlert": { + "key": "DeleteThemeAlert", + "value": "Вы точно хотите удалить тему?" + }, + "DeleteThemeTitle": { + "key": "DeleteThemeTitle", + "value": "Удалить тему" + }, + "DeleteTheseChats": { + "key": "DeleteTheseChats", + "value": "Удалить чаты" + }, + "DeleteTheseChatsBothSides": { + "key": "DeleteTheseChatsBothSides", + "value": "Удалить чаты" + }, + "DeleteThisChat": { + "key": "DeleteThisChat", + "value": "Удалить чат" + }, + "DeleteThisChatBothSides": { + "key": "DeleteThisChatBothSides", + "value": "Удалить чат" + }, + "DeleteThisGroup": { + "key": "DeleteThisGroup", + "value": "Удалить группу" + }, + "DeletedFromYourContacts": { + "key": "DeletedFromYourContacts", + "value": "%s удален(а) из Ваших контактов" + }, + "Deletions": { + "key": "Deletions", + "zeroValue": null, + "oneValue": "%1$d удаление", + "twoValue": null, + "fewValue": "%1$d удаления", + "manyValue": "%1$d удалений", + "otherValue": "%1$d удаления" + }, + "DescriptionInfo": { + "key": "DescriptionInfo", + "value": "Можете указать дополнительное описание вашего канала." + }, + "DescriptionOptionalPlaceholder": { + "key": "DescriptionOptionalPlaceholder", + "value": "Описание (необязательно)" + }, + "DescriptionPlaceholder": { + "key": "DescriptionPlaceholder", + "value": "Описание" + }, + "DeviceStorage": { + "key": "DeviceStorage", + "value": "Память устройства" + }, + "Devices": { + "key": "Devices", + "value": "Устройства" + }, + "DialogPin": { + "key": "DialogPin", + "value": "Закрепить" + }, + "DialogUnpin": { + "key": "DialogUnpin", + "value": "Открепить" + }, + "DiceEmojiInfo": { + "key": "DiceEmojiInfo", + "value": "Отправьте эмодзи %1$s, чтобы испытать удачу." + }, + "DiceInfo": { + "key": "DiceInfo", + "value": "Отправьте эмодзи 🎲 в любой чат, чтобы получить случайное число." + }, + "DiceInfo2": { + "key": "DiceInfo2", + "value": "Чтобы сделать бросок, отправьте эмодзи **:кубик:**" + }, + "DidNotGetTheCode": { + "key": "DidNotGetTheCode", + "value": "Не получили код?" + }, + "DidNotGetTheCodeSms": { + "key": "DidNotGetTheCodeSms", + "value": "Отправить код через SMS" + }, + "DirectShare": { + "key": "DirectShare", + "value": "Direct Share" + }, + "DirectShareInfo": { + "key": "DirectShareInfo", + "value": "Показывать недавние чаты в меню" + }, + "Directions": { + "key": "Directions", + "value": "Маршрут" + }, + "Disable": { + "key": "Disable", + "value": "Отключить" + }, + "DisappearingGif": { + "key": "DisappearingGif", + "value": "Секретный GIF" + }, + "DisappearingPhoto": { + "key": "DisappearingPhoto", + "value": "Секретное фото" + }, + "DisappearingVideo": { + "key": "DisappearingVideo", + "value": "Исчезающее видео" + }, + "DiscardChanges": { + "key": "DiscardChanges", + "value": "Отменить изменения?" + }, + "DiscardVideoMessageDescription": { + "key": "DiscardVideoMessageDescription", + "value": "Вы точно хотите прекратить запись и удалить видеосообщение?" + }, + "DiscardVideoMessageTitle": { + "key": "DiscardVideoMessageTitle", + "value": "Отмена видеосообщения" + }, + "DiscardVoiceMessageAction": { + "key": "DiscardVoiceMessageAction", + "value": "Да" + }, + "DiscardVoiceMessageDescription": { + "key": "DiscardVoiceMessageDescription", + "value": "Вы точно хотите прекратить запись и удалить голосовое сообщение?" + }, + "DiscardVoiceMessageTitle": { + "key": "DiscardVoiceMessageTitle", + "value": "Отмена голосового сообщения" + }, + "Disconnect": { + "key": "Disconnect", + "value": "Отключить" + }, + "DiscussChannel": { + "key": "DiscussChannel", + "value": "канал" + }, + "Discussion": { + "key": "Discussion", + "value": "Обсуждение" + }, + "DiscussionChannelGroupSetHelp": { + "key": "DiscussionChannelGroupSetHelp", + "value": "Подписчики смогут перейти в **%1$s**, нажав на кнопку «Обсудить»." + }, + "DiscussionChannelGroupSetHelp2": { + "key": "DiscussionChannelGroupSetHelp2", + "value": "В группе «%1$s» будут появляться комментарии к публикациям канала." + }, + "DiscussionChannelHelp": { + "key": "DiscussionChannelHelp", + "value": "Подписчики смогут перейти в группу, нажав на кнопку «Обсудить»." + }, + "DiscussionChannelHelp2": { + "key": "DiscussionChannelHelp2", + "value": "Всё, что Вы публикуете в этом канале, будет автоматически пересылаться в группу." + }, + "DiscussionChannelHelp3": { + "key": "DiscussionChannelHelp3", + "value": "Выберите группу, где будут появляться комментарии к публикациям канала." + }, + "DiscussionCreateGroup": { + "key": "DiscussionCreateGroup", + "value": "Создать группу" + }, + "DiscussionGroupHelp": { + "key": "DiscussionGroupHelp", + "value": "Группа привязана к %1$s как площадка для обсуждения публикаций." + }, + "DiscussionGroupHelp2": { + "key": "DiscussionGroupHelp2", + "value": "Все публикации в этом канале автоматически пересылаются в группу." + }, + "DiscussionInfo": { + "key": "DiscussionInfo", + "value": "Добавить группу для комментариев." + }, + "DiscussionLinkGroup": { + "key": "DiscussionLinkGroup", + "value": "ПРИВЯЗАТЬ ГРУППУ" + }, + "DiscussionLinkGroupAlertHistory": { + "key": "DiscussionLinkGroupAlertHistory", + "value": "Новые участники группы будут видеть всю историю чата." + }, + "DiscussionLinkGroupPrivateAlert": { + "key": "DiscussionLinkGroupPrivateAlert", + "value": "Назначить **%1$s** группой для обсуждения **%2$s**?\n\nВсе участники группы смогут видеть публикации канала." + }, + "DiscussionLinkGroupPublicAlert": { + "key": "DiscussionLinkGroupPublicAlert", + "value": "Назначить %1$s группой для обсуждения %2$s?" + }, + "DiscussionLinkGroupPublicPrivateAlert": { + "key": "DiscussionLinkGroupPublicPrivateAlert", + "value": "Назначить **%1$s** группой для обсуждения **%2$s**?\n\nВсе подписчики канала смогут видеть сообщения в группе." + }, + "DiscussionStarted": { + "key": "DiscussionStarted", + "value": "Начало обсуждения" + }, + "DiscussionUnlink": { + "key": "DiscussionUnlink", + "value": "Отвязать" + }, + "DiscussionUnlinkChannel": { + "key": "DiscussionUnlinkChannel", + "value": "Отвязать канал" + }, + "DiscussionUnlinkChannelAlert": { + "key": "DiscussionUnlinkChannelAlert", + "value": "Вы точно хотите отвязать **%1$s** от этого канала?" + }, + "DiscussionUnlinkGroup": { + "key": "DiscussionUnlinkGroup", + "value": "Отвязать группу" + }, + "DiscussionUnlinkGroupAlert": { + "key": "DiscussionUnlinkGroupAlert", + "value": "Вы точно хотите отвязать **%1$s** от этой группы?" + }, + "DistanceUnits": { + "key": "DistanceUnits", + "value": "Мера расстояния" + }, + "DistanceUnitsAutomatic": { + "key": "DistanceUnitsAutomatic", + "value": "Автоматически" + }, + "DistanceUnitsKilometers": { + "key": "DistanceUnitsKilometers", + "value": "Километры" + }, + "DistanceUnitsMiles": { + "key": "DistanceUnitsMiles", + "value": "Мили" + }, + "DistanceUnitsTitle": { + "key": "DistanceUnitsTitle", + "value": "Мера расстояния" + }, + "DocumentsTitle": { + "key": "DocumentsTitle", + "value": "Общие файлы" + }, + "Done": { + "key": "Done", + "value": "Готово" + }, + "Draft": { + "key": "Draft", + "value": "Черновик" + }, + "Edit": { + "key": "Edit", + "value": "Изменить" + }, + "EditAdmin": { + "key": "EditAdmin", + "value": "Права админов" + }, + "EditAdminAddAdmins": { + "key": "EditAdminAddAdmins", + "value": "Выбор администраторов" + }, + "EditAdminAddUsers": { + "key": "EditAdminAddUsers", + "value": "Добавление участников" + }, + "EditAdminAddUsersViaLink": { + "key": "EditAdminAddUsersViaLink", + "value": "Пригласительные ссылки" + }, + "EditAdminBanUsers": { + "key": "EditAdminBanUsers", + "value": "Блокировка пользователей" + }, + "EditAdminCantEdit": { + "key": "EditAdminCantEdit", + "value": "Вы не можете изменять права этого администратора." + }, + "EditAdminChangeChannelInfo": { + "key": "EditAdminChangeChannelInfo", + "value": "Изменять информацию о канале" + }, + "EditAdminChangeGroupInfo": { + "key": "EditAdminChangeGroupInfo", + "value": "Изменение профиля группы" + }, + "EditAdminChannelTransfer": { + "key": "EditAdminChannelTransfer", + "value": "Передать права на канал" + }, + "EditAdminDeleteMessages": { + "key": "EditAdminDeleteMessages", + "value": "Удалять чужие сообщения" + }, + "EditAdminEditMessages": { + "key": "EditAdminEditMessages", + "value": "Редактировать чужие сообщения" + }, + "EditAdminGroupDeleteMessages": { + "key": "EditAdminGroupDeleteMessages", + "value": "Удаление сообщений" + }, + "EditAdminGroupTransfer": { + "key": "EditAdminGroupTransfer", + "value": "Передать права на группу" + }, + "EditAdminPinMessages": { + "key": "EditAdminPinMessages", + "value": "Закрепление сообщений" + }, + "EditAdminPostMessages": { + "key": "EditAdminPostMessages", + "value": "Публиковать сообщения" + }, + "EditAdminPromotedBy": { + "key": "EditAdminPromotedBy", + "value": "Назначил(а): %1$s" + }, + "EditAdminRank": { + "key": "EditAdminRank", + "value": "Должность" + }, + "EditAdminRankInfo": { + "key": "EditAdminRankInfo", + "value": "Должность, которая будет показываться в подписи вместо «%1$s»." + }, + "EditAdminRemoveAdmin": { + "key": "EditAdminRemoveAdmin", + "value": "Разжаловать" + }, + "EditAdminRights": { + "key": "EditAdminRights", + "value": "Изменить права админа" + }, + "EditAdminSendAnonymously": { + "key": "EditAdminSendAnonymously", + "value": "Анонимность" + }, + "EditAdminTransferAlertText": { + "key": "EditAdminTransferAlertText", + "value": "Вы сможете передать права на группу **%1$s**, если:" + }, + "EditAdminTransferAlertText1": { + "key": "EditAdminTransferAlertText1", + "value": "Не меньше **7 дней назад** включили двухэтапную аутентификацию." + }, + "EditAdminTransferAlertText2": { + "key": "EditAdminTransferAlertText2", + "value": "Зашли в аккаунт на этом устройстве не меньше **24 часов** назад." + }, + "EditAdminTransferAlertText3": { + "key": "EditAdminTransferAlertText3", + "value": "Попробуйте позже." + }, + "EditAdminTransferAlertTitle": { + "key": "EditAdminTransferAlertTitle", + "value": "Проверка безопасности" + }, + "EditAdminTransferChangeOwner": { + "key": "EditAdminTransferChangeOwner", + "value": "Сменить владельца" + }, + "EditAdminTransferChannelToast": { + "key": "EditAdminTransferChannelToast", + "value": "**%1$s** теперь владелец канала." + }, + "EditAdminTransferGroupToast": { + "key": "EditAdminTransferGroupToast", + "value": "**%1$s** теперь владелец группы." + }, + "EditAdminTransferReadyAlertText": { + "key": "EditAdminTransferReadyAlertText", + "value": "В этом случае **права** на **%1$s** будут полностью переданы **%2$s**." + }, + "EditAdminTransferSetPassword": { + "key": "EditAdminTransferSetPassword", + "value": "Установить пароль" + }, + "EditAdminWhatCanDo": { + "key": "EditAdminWhatCanDo", + "value": "Возможности администратора:" + }, + "EditCantEditPermissions": { + "key": "EditCantEditPermissions", + "value": "Вы не можете менять это разрешение." + }, + "EditCantEditPermissionsPublic": { + "key": "EditCantEditPermissionsPublic", + "value": "В публичных группах нельзя разрешить это действие." + }, + "EditCaption": { + "key": "EditCaption", + "value": "Изменить подпись" + }, + "EditChannelAdminTransferAlertText": { + "key": "EditChannelAdminTransferAlertText", + "value": "Вы сможете передать права на канал **%1$s**, если:" + }, + "EditContact": { + "key": "EditContact", + "value": "Изменить контакт" + }, + "EditLink": { + "key": "EditLink", + "value": "Изменить" + }, + "EditMessage": { + "key": "EditMessage", + "value": "Редактирование" + }, + "EditMessageEditPhoto": { + "key": "EditMessageEditPhoto", + "value": "Редактировать" + }, + "EditMessageEditVideo": { + "key": "EditMessageEditVideo", + "value": "Редактировать" + }, + "EditMessageError": { + "key": "EditMessageError", + "value": "К сожалению, Вы не можете изменить сообщение." + }, + "EditMessageMedia": { + "key": "EditMessageMedia", + "value": "Изменить медиа" + }, + "EditMessageReplaceAudio": { + "key": "EditMessageReplaceAudio", + "value": "Заменить" + }, + "EditMessageReplaceFile": { + "key": "EditMessageReplaceFile", + "value": "Заменить" + }, + "EditMessageReplaceGif": { + "key": "EditMessageReplaceGif", + "value": "Заменить" + }, + "EditMessageReplacePhoto": { + "key": "EditMessageReplacePhoto", + "value": "Заменить" + }, + "EditMessageReplaceVideo": { + "key": "EditMessageReplaceVideo", + "value": "Заменить" + }, + "EditName": { + "key": "EditName", + "value": "Изменить имя" + }, + "EditPhoto": { + "key": "EditPhoto", + "value": "Открыть в редакторе" + }, + "EditThemeColors": { + "key": "EditThemeColors", + "value": "Изменить цвета" + }, + "EditThemeTitle": { + "key": "EditThemeTitle", + "value": "Изменить тему" + }, + "EditWidget": { + "key": "EditWidget", + "value": "Редактировать виджет" + }, + "EditWidgetChatsInfo": { + "key": "EditWidgetChatsInfo", + "value": "Виджет будет показывать последнее сообщение в выбранных Вами чатах.\n\nЕсли ничего не выбрано, показываться будут последние активные чаты." + }, + "EditWidgetContactsInfo": { + "key": "EditWidgetContactsInfo", + "value": "Виджет будет показывать ярлыки для быстрого доступа к выбранным Вами чатам.\n\nЕсли ничего не выбрано, показываться будут последние активные чаты." + }, + "EditedMessage": { + "key": "EditedMessage", + "value": "изменено" + }, + "EmailCopied": { + "key": "EmailCopied", + "value": "Email скопирован в буфер обмена" + }, + "EmailPasswordConfirmText": { + "key": "EmailPasswordConfirmText", + "value": "Пожалуйста, выполните эти шаги, чтобы закончить настройку двухэтапной аутентификации:\n\n1. Проверьте почту (не забудьте о папке со спамом)\n%1$s\n\n2. Перейдите по ссылке для подтверждения." + }, + "EmailPasswordConfirmText2": { + "key": "EmailPasswordConfirmText2", + "value": "Чтобы закончить настройку двухэтапной аутентификации, проверьте почту (не забудьте о папке со спамом) и введите код, который получили в письме." + }, + "EmailPasswordConfirmText3": { + "key": "EmailPasswordConfirmText3", + "value": "Чтобы подтвердить почту для восстановления пароля, проверьте %1$s (не забудьте о папке со спамом) и введите код, который получили в письме." + }, + "Emoji": { + "key": "Emoji", + "value": "ЕМОДЗИ" + }, + "Emoji1": { + "key": "Emoji1", + "value": "Смайлы и люди" + }, + "Emoji2": { + "key": "Emoji2", + "value": "Животные и природа" + }, + "Emoji3": { + "key": "Emoji3", + "value": "Еда и напитки" + }, + "Emoji4": { + "key": "Emoji4", + "value": "Занятия" + }, + "Emoji5": { + "key": "Emoji5", + "value": "Места и путешествия" + }, + "Emoji6": { + "key": "Emoji6", + "value": "Предметы" + }, + "Emoji7": { + "key": "Emoji7", + "value": "Символы" + }, + "Emoji8": { + "key": "Emoji8", + "value": "Флаги" + }, + "EmojiBigSize": { + "key": "EmojiBigSize", + "value": "Большие одиночные эмодзи" + }, + "EmojiSuggestions": { + "key": "EmojiSuggestions", + "value": "Подсказки эмодзи" + }, + "EmojiSuggestionsInfo": { + "key": "EmojiSuggestionsInfo", + "value": "В **Telegram** можно искать эмодзи по множеству ключевых слов, но всегда есть что добавить. Вы можете предложить свои варианты слов для поиска здесь:" + }, + "EmojiSuggestionsUrl": { + "key": "EmojiSuggestionsUrl", + "value": "https://translations.telegram.org/%1$s/emoji" + }, + "EmojiUseDefault": { + "key": "EmojiUseDefault", + "value": "Использовать системные эмодзи" + }, + "EmpryUsersPlaceholder": { + "key": "EmpryUsersPlaceholder", + "value": "Добавить" + }, + "EmptyExceptions": { + "key": "EmptyExceptions", + "value": "Нет" + }, + "Enable": { + "key": "Enable", + "value": "Включить" + }, + "EnableAllStreamingInfo": { + "key": "EnableAllStreamingInfo", + "value": "Потоковая загрузка недоступна для некоторых видеозаписей – например, отправленных с устройств Android с помощью Telegram версии 4.7 и ниже." + }, + "EnableAnimations": { + "key": "EnableAnimations", + "value": "Анимация" + }, + "EnableAutoDelete": { + "key": "EnableAutoDelete", + "value": "Настроить автоудаление" + }, + "EnableProxyAlert": { + "key": "EnableProxyAlert", + "value": "Хотите включить этот прокси?" + }, + "EnableProxyAlert2": { + "key": "EnableProxyAlert2", + "value": "Вы всегда можете изменить прокси-сервер в настройках > Данные и память." + }, + "EnableStreaming": { + "key": "EnableStreaming", + "value": "Стриминг аудиофайлов и видео" + }, + "EnabledNotifications": { + "key": "EnabledNotifications", + "value": "Уведомления включены" + }, + "EnabledPasswordText": { + "key": "EnabledPasswordText", + "value": "Включена двухэтапная аутентификация.\nДля входа в свой аккаунт в Telegram Вам нужно будет вводить установленный здесь пароль." + }, + "EncryptedChatStartedIncoming": { + "key": "EncryptedChatStartedIncoming", + "value": "Вы присоединились к секретному чату." + }, + "EncryptedChatStartedOutgoing": { + "key": "EncryptedChatStartedOutgoing", + "value": "Теперь Вы и %s в секретном чате. " + }, + "EncryptedDescription1": { + "key": "EncryptedDescription1", + "value": "Оконечное шифрование" + }, + "EncryptedDescription2": { + "key": "EncryptedDescription2", + "value": "Никаких следов на серверах" + }, + "EncryptedDescription3": { + "key": "EncryptedDescription3", + "value": "Удаление по таймеру" + }, + "EncryptedDescription4": { + "key": "EncryptedDescription4", + "value": "Запрет пересылки" + }, + "EncryptedDescriptionTitle": { + "key": "EncryptedDescriptionTitle", + "value": "Секретные чаты — это:" + }, + "EncryptedPlaceholderTitleIncoming": { + "key": "EncryptedPlaceholderTitleIncoming", + "value": "%s пригласил(а) вас в секретный чат." + }, + "EncryptedPlaceholderTitleOutgoing": { + "key": "EncryptedPlaceholderTitleOutgoing", + "value": "Вы пригласили %s в секретный чат." + }, + "EncryptionKey": { + "key": "EncryptionKey", + "value": "Ключ шифрования" + }, + "EncryptionKeyDescription": { + "key": "EncryptionKeyDescription", + "value": "Это изображение и текст были созданы на основе ключа шифрования для этого секретного чата с **%1$s**.\n\nЕсли они выглядят так же, как на устройстве **%2$s**, оконечное шифрование надежно.\n\nУзнать больше на telegram.org" + }, + "EncryptionKeyLink": { + "key": "EncryptionKeyLink", + "value": "https://telegram.org/faq#secret-chats" + }, + "EncryptionProcessing": { + "key": "EncryptionProcessing", + "value": "Обмен ключами шифрования..." + }, + "EncryptionRejected": { + "key": "EncryptionRejected", + "value": "Секретный чат отменён" + }, + "English": { + "key": "English", + "value": "Английский" + }, + "Enhance": { + "key": "Enhance", + "value": "Улучшение" + }, + "EnterChannelName": { + "key": "EnterChannelName", + "value": "Имя канала" + }, + "EnterCode": { + "key": "EnterCode", + "value": "Ввести код" + }, + "EnterCurrentPasscode": { + "key": "EnterCurrentPasscode", + "value": "Введите текущий код-пароль" + }, + "EnterGroupNamePlaceholder": { + "key": "EnterGroupNamePlaceholder", + "value": "Введите имя группы" + }, + "EnterListName": { + "key": "EnterListName", + "value": "Введите имя списка" + }, + "EnterNewFirstPasscode": { + "key": "EnterNewFirstPasscode", + "value": "Введите код-пароль" + }, + "EnterNewPasscode": { + "key": "EnterNewPasscode", + "value": "Введите новый код-пароль" + }, + "EnterThemeName": { + "key": "EnterThemeName", + "value": "Введите название темы" + }, + "EnterThemeNameEdit": { + "key": "EnterThemeNameEdit", + "value": "Нажмите **Создать**, чтобы поделиться своей темой с друзьями или вручную настроить любые цвета.\n\nВыберите название для темы:" + }, + "EnterYourPasscode": { + "key": "EnterYourPasscode", + "value": "Введите код-пароль" + }, + "ErrorOccurred": { + "key": "ErrorOccurred", + "value": "Произошла ошибка." + }, + "ErrorSendRestrictedMedia": { + "key": "ErrorSendRestrictedMedia", + "value": "Администраторы группы запретили Вам отправлять медиа." + }, + "ErrorSendRestrictedMediaAll": { + "key": "ErrorSendRestrictedMediaAll", + "value": "В этой группе запрещено отправлять фото и видео." + }, + "ErrorSendRestrictedPolls": { + "key": "ErrorSendRestrictedPolls", + "value": "Администраторы группы запретили Вам публиковать в ней опросы." + }, + "ErrorSendRestrictedPollsAll": { + "key": "ErrorSendRestrictedPollsAll", + "value": "В этой группе запрещено публиковать опросы." + }, + "ErrorSendRestrictedStickers": { + "key": "ErrorSendRestrictedStickers", + "value": "Администраторы группы запретили Вам отправлять стикеры." + }, + "ErrorSendRestrictedStickersAll": { + "key": "ErrorSendRestrictedStickersAll", + "value": "В этой группе запрещено отправлять стикеры." + }, + "EventLog": { + "key": "EventLog", + "value": "Недавние действия" + }, + "EventLogAdded": { + "key": "EventLogAdded", + "value": "un1 добавил(а) un2" + }, + "EventLogAllAdmins": { + "key": "EventLogAllAdmins", + "value": "Все администраторы" + }, + "EventLogAllEvents": { + "key": "EventLogAllEvents", + "value": "Все действия" + }, + "EventLogChangedChannelLink": { + "key": "EventLogChangedChannelLink", + "value": "un1 изменил(а) ссылку на канал:" + }, + "EventLogChangedGroupLink": { + "key": "EventLogChangedGroupLink", + "value": "un1 изменил(а) ссылку на группу:" + }, + "EventLogChangedLinkedChannel": { + "key": "EventLogChangedLinkedChannel", + "value": "un1 привязал(а) группу к un2" + }, + "EventLogChangedLinkedGroup": { + "key": "EventLogChangedLinkedGroup", + "value": "un1 сделал(а) un2 группой для обсуждения публикаций в этом канале." + }, + "EventLogChangedLocation": { + "key": "EventLogChangedLocation", + "value": "un1 изменил(а) геопозицию группы на \"%1$s\"" + }, + "EventLogChangedOwnership": { + "key": "EventLogChangedOwnership", + "value": "права переданы %1$s" + }, + "EventLogChangedStickersSet": { + "key": "EventLogChangedStickersSet", + "value": "un1 изменил(а) набор стикеров группы" + }, + "EventLogChannelJoined": { + "key": "EventLogChannelJoined", + "value": "un1 теперь подписан(а) на канал" + }, + "EventLogChannelRestricted": { + "key": "EventLogChannelRestricted", + "value": "заблокировал(а) %1$s" + }, + "EventLogChannelUnrestricted": { + "key": "EventLogChannelUnrestricted", + "value": "разблокировал(а) %1$s" + }, + "EventLogDefaultPermissions": { + "key": "EventLogDefaultPermissions", + "value": "изменены разрешения по умолчанию" + }, + "EventLogDeletedMessages": { + "key": "EventLogDeletedMessages", + "value": "un1 удалил(а) сообщение:" + }, + "EventLogEditedCaption": { + "key": "EventLogEditedCaption", + "value": "un1 отредактировал(а) подпись:" + }, + "EventLogEditedChannelDescription": { + "key": "EventLogEditedChannelDescription", + "value": "un1 изменил(а) описание канала:" + }, + "EventLogEditedChannelPhoto": { + "key": "EventLogEditedChannelPhoto", + "value": "un1 добавил(а) новое фото канала" + }, + "EventLogEditedChannelTitle": { + "key": "EventLogEditedChannelTitle", + "value": "un1 переименовал(а) канал в «%1$s»" + }, + "EventLogEditedChannelVideo": { + "key": "EventLogEditedChannelVideo", + "value": "un1 загрузил(а) новое видео канала" + }, + "EventLogEditedGroupDescription": { + "key": "EventLogEditedGroupDescription", + "value": "un1 изменил(а) описание группы:" + }, + "EventLogEditedGroupPhoto": { + "key": "EventLogEditedGroupPhoto", + "value": "un1 добавил(а) новое фото группы" + }, + "EventLogEditedGroupTitle": { + "key": "EventLogEditedGroupTitle", + "value": "un1 переименовал(а) группу в «%1$s»" + }, + "EventLogEditedGroupVideo": { + "key": "EventLogEditedGroupVideo", + "value": "un1 загрузил(а) новое видео группы" + }, + "EventLogEditedMedia": { + "key": "EventLogEditedMedia", + "value": "un1 отредактировал(а) медиа:" + }, + "EventLogEditedMediaCaption": { + "key": "EventLogEditedMediaCaption", + "value": "un1 отредактировал(а) медиа и подпись:" + }, + "EventLogEditedMessages": { + "key": "EventLogEditedMessages", + "value": "un1 отредактировал(а) сообщение:" + }, + "EventLogEditedYouChannelPhoto": { + "key": "EventLogEditedYouChannelPhoto", + "value": "Вы установили новое фото канала" + }, + "EventLogEditedYouChannelTitle": { + "key": "EventLogEditedYouChannelTitle", + "value": "Вы переименовали канал в «%1$s»" + }, + "EventLogEditedYouGroupPhoto": { + "key": "EventLogEditedYouGroupPhoto", + "value": "Вы установили новое фото группы" + }, + "EventLogEditedYouGroupTitle": { + "key": "EventLogEditedYouGroupTitle", + "value": "Вы переименовали группу в «%1$s»" + }, + "EventLogEmpty": { + "key": "EventLogEmpty", + "value": "**Действий пока нет**\n\nУчастники и администраторы группы\nне выполняли никаких служебных действий\nза последние 48 часов." + }, + "EventLogEmptyChannel": { + "key": "EventLogEmptyChannel", + "value": "**Действий пока нет**\n\nАдминистраторы канала\nне выполняли никаких служебных действий\nза последние 48 часов." + }, + "EventLogEmptySearch": { + "key": "EventLogEmptySearch", + "value": "**Действий не найдено**\n\nПо Вашему запросу не удалось найти недавних действий." + }, + "EventLogEmptyTextSearch": { + "key": "EventLogEmptyTextSearch", + "value": "Не удалось найти недавние действия, содержащие '**%1$s**'." + }, + "EventLogEndedVoiceChat": { + "key": "EventLogEndedVoiceChat", + "value": "un1 завершил(а) голосовой чат" + }, + "EventLogFilterAll": { + "key": "EventLogFilterAll", + "value": "Все действия" + }, + "EventLogFilterCalls": { + "key": "EventLogFilterCalls", + "value": "Голосовые чаты" + }, + "EventLogFilterChannelInfo": { + "key": "EventLogFilterChannelInfo", + "value": "Описание канала" + }, + "EventLogFilterChannelSettings": { + "key": "EventLogFilterChannelSettings", + "value": "Настройки канала" + }, + "EventLogFilterDeletedMessages": { + "key": "EventLogFilterDeletedMessages", + "value": "Удалённые сообщения" + }, + "EventLogFilterEditedMessages": { + "key": "EventLogFilterEditedMessages", + "value": "Отредактированные сообщения" + }, + "EventLogFilterGroupInfo": { + "key": "EventLogFilterGroupInfo", + "value": "Информация о группе" + }, + "EventLogFilterInvites": { + "key": "EventLogFilterInvites", + "value": "Пригласительные ссылки" + }, + "EventLogFilterLeavingMembers": { + "key": "EventLogFilterLeavingMembers", + "value": "Выход участников" + }, + "EventLogFilterNewAdmins": { + "key": "EventLogFilterNewAdmins", + "value": "Права админов" + }, + "EventLogFilterNewMembers": { + "key": "EventLogFilterNewMembers", + "value": "Новые участники" + }, + "EventLogFilterNewRestrictions": { + "key": "EventLogFilterNewRestrictions", + "value": "Новые исключения" + }, + "EventLogFilterPinnedMessages": { + "key": "EventLogFilterPinnedMessages", + "value": "Закреплённые сообщения" + }, + "EventLogGroupJoined": { + "key": "EventLogGroupJoined", + "value": "un1 вступил(а) в группу" + }, + "EventLogInfoDetail": { + "key": "EventLogInfoDetail", + "value": "Это список важных действий, совершённых участниками и администраторами группы за последние 48 часов." + }, + "EventLogInfoDetailChannel": { + "key": "EventLogInfoDetailChannel", + "value": "Это список всех служебных действий, совершённых администраторами канала за последние 48 часов." + }, + "EventLogInfoTitle": { + "key": "EventLogInfoTitle", + "value": "Что такое недавние действия?" + }, + "EventLogLeft": { + "key": "EventLogLeft", + "value": "un1 покинул(а) группу" + }, + "EventLogLeftChannel": { + "key": "EventLogLeftChannel", + "value": "un1 покинул(а) канал" + }, + "EventLogLeftGroup": { + "key": "EventLogLeftGroup", + "value": "un1 покинул(а) группу" + }, + "EventLogOriginalCaption": { + "key": "EventLogOriginalCaption", + "value": "Исходная подпись" + }, + "EventLogOriginalCaptionEmpty": { + "key": "EventLogOriginalCaptionEmpty", + "value": "Пусто" + }, + "EventLogOriginalMessages": { + "key": "EventLogOriginalMessages", + "value": "Исходное сообщение" + }, + "EventLogPinnedMessages": { + "key": "EventLogPinnedMessages", + "value": "un1 закрепил(а) сообщение:" + }, + "EventLogPreviousChannelLink": { + "key": "EventLogPreviousChannelLink", + "value": "Прежняя ссылка канала" + }, + "EventLogPreviousGroupDescription": { + "key": "EventLogPreviousGroupDescription", + "value": "Прежнее описание" + }, + "EventLogPreviousGroupLink": { + "key": "EventLogPreviousGroupLink", + "value": "Прежняя ссылка группы" + }, + "EventLogPreviousLink": { + "key": "EventLogPreviousLink", + "value": "Прежняя ссылка" + }, + "EventLogPromoted": { + "key": "EventLogPromoted", + "value": "изменены права для %1$s" + }, + "EventLogPromotedAddAdmins": { + "key": "EventLogPromotedAddAdmins", + "value": "Добавление администраторов" + }, + "EventLogPromotedAddUsers": { + "key": "EventLogPromotedAddUsers", + "value": "Добавление пользователей" + }, + "EventLogPromotedBanUsers": { + "key": "EventLogPromotedBanUsers", + "value": "Блокировки пользователей" + }, + "EventLogPromotedChangeChannelInfo": { + "key": "EventLogPromotedChangeChannelInfo", + "value": "Изменение информации о канале" + }, + "EventLogPromotedChangeGroupInfo": { + "key": "EventLogPromotedChangeGroupInfo", + "value": "Изменение информации о группе" + }, + "EventLogPromotedDeleteMessages": { + "key": "EventLogPromotedDeleteMessages", + "value": "Удаление сообщений" + }, + "EventLogPromotedEditMessages": { + "key": "EventLogPromotedEditMessages", + "value": "Редактирование сообщений" + }, + "EventLogPromotedInviteLink": { + "key": "EventLogPromotedInviteLink", + "value": "Приглашение по ссылке" + }, + "EventLogPromotedManageCall": { + "key": "EventLogPromotedManageCall", + "value": "Управление голосовыми чатами" + }, + "EventLogPromotedNoRights": { + "key": "EventLogPromotedNoRights", + "value": "назначил(а) %1$s" + }, + "EventLogPromotedPinMessages": { + "key": "EventLogPromotedPinMessages", + "value": "Закрепление сообщений" + }, + "EventLogPromotedPostMessages": { + "key": "EventLogPromotedPostMessages", + "value": "Публикация сообщений" + }, + "EventLogPromotedRemovedTitle": { + "key": "EventLogPromotedRemovedTitle", + "value": "Должность" + }, + "EventLogPromotedSendAnonymously": { + "key": "EventLogPromotedSendAnonymously", + "value": "Анонимность" + }, + "EventLogPromotedTitle": { + "key": "EventLogPromotedTitle", + "value": "Должность: %1$s" + }, + "EventLogRemoved": { + "key": "EventLogRemoved", + "value": "un1 исключил(а) пользователя un2" + }, + "EventLogRemovedChannelLink": { + "key": "EventLogRemovedChannelLink", + "value": "un1 удалил(а) ссылку на канал" + }, + "EventLogRemovedChannelPhoto": { + "key": "EventLogRemovedChannelPhoto", + "value": "un1 удалил(а) фото канала" + }, + "EventLogRemovedGroupLink": { + "key": "EventLogRemovedGroupLink", + "value": "un1 удалил(а) ссылку на группу" + }, + "EventLogRemovedLinkedChannel": { + "key": "EventLogRemovedLinkedChannel", + "value": "un1 отвязал(а) группу от un2" + }, + "EventLogRemovedLinkedGroup": { + "key": "EventLogRemovedLinkedGroup", + "value": "un1 убрал(а) группу для обсуждения un2" + }, + "EventLogRemovedLocation": { + "key": "EventLogRemovedLocation", + "value": "un1 удалил(а) геопозицию группы" + }, + "EventLogRemovedStickersSet": { + "key": "EventLogRemovedStickersSet", + "value": "un1 удалил(а) набор стикеров группы" + }, + "EventLogRemovedWGroupPhoto": { + "key": "EventLogRemovedWGroupPhoto", + "value": "un1 удалил(а) фото группы" + }, + "EventLogRemovedYouChannelPhoto": { + "key": "EventLogRemovedYouChannelPhoto", + "value": "Вы удалили фото канала" + }, + "EventLogRemovedYouGroupPhoto": { + "key": "EventLogRemovedYouGroupPhoto", + "value": "Вы удалили фото группы" + }, + "EventLogRestricted": { + "key": "EventLogRestricted", + "value": "un1 изменил(а) ограничения для пользователя un2 (%1$s)" + }, + "EventLogRestrictedChangeInfo": { + "key": "EventLogRestrictedChangeInfo", + "value": "Изменять профиль" + }, + "EventLogRestrictedInviteUsers": { + "key": "EventLogRestrictedInviteUsers", + "value": "Добавлять пользователей" + }, + "EventLogRestrictedPinMessages": { + "key": "EventLogRestrictedPinMessages", + "value": "Закреплять сообщения" + }, + "EventLogRestrictedReadMessages": { + "key": "EventLogRestrictedReadMessages", + "value": "Читать сообщения" + }, + "EventLogRestrictedSendEmbed": { + "key": "EventLogRestrictedSendEmbed", + "value": "Предпросмотр для ссылок" + }, + "EventLogRestrictedSendMedia": { + "key": "EventLogRestrictedSendMedia", + "value": "Отправлять медиа" + }, + "EventLogRestrictedSendMessages": { + "key": "EventLogRestrictedSendMessages", + "value": "Отправлять сообщения" + }, + "EventLogRestrictedSendPolls": { + "key": "EventLogRestrictedSendPolls", + "value": "Отправлять опросы" + }, + "EventLogRestrictedSendStickers": { + "key": "EventLogRestrictedSendStickers", + "value": "Отправлять стикеры и GIF" + }, + "EventLogRestrictedUntil": { + "key": "EventLogRestrictedUntil", + "value": "изменены права для %1$s\n\nСрок: %2$s" + }, + "EventLogSelectedEvents": { + "key": "EventLogSelectedEvents", + "value": "выбранные действия" + }, + "EventLogStartedVoiceChat": { + "key": "EventLogStartedVoiceChat", + "value": "un1 начал(а) голосовой чат" + }, + "EventLogStopPoll": { + "key": "EventLogStopPoll", + "value": "un1 остановил(а) опрос:" + }, + "EventLogStopQuiz": { + "key": "EventLogStopQuiz", + "value": "un1 остановил(а) опрос:" + }, + "EventLogToggledInvitesHistoryOff": { + "key": "EventLogToggledInvitesHistoryOff", + "value": "un1 скрыл(а) историю группы от новых участников" + }, + "EventLogToggledInvitesHistoryOn": { + "key": "EventLogToggledInvitesHistoryOn", + "value": "un1 сделал(а) историю группы доступной новым участникам" + }, + "EventLogToggledInvitesOff": { + "key": "EventLogToggledInvitesOff", + "value": "un1 запретил(а) приглашения в группу" + }, + "EventLogToggledInvitesOn": { + "key": "EventLogToggledInvitesOn", + "value": "un1 разрешил(а) приглашения в группу" + }, + "EventLogToggledSignaturesOff": { + "key": "EventLogToggledSignaturesOff", + "value": "un1 отключил(а) подписи к сообщениям" + }, + "EventLogToggledSignaturesOn": { + "key": "EventLogToggledSignaturesOn", + "value": "un1 включил(а) подписи к сообщениям" + }, + "EventLogToggledSlowmodeOff": { + "key": "EventLogToggledSlowmodeOff", + "value": "un1 отключил(а) медленный режим" + }, + "EventLogToggledSlowmodeOn": { + "key": "EventLogToggledSlowmodeOn", + "value": "un1 установил(а) таймер медленного режима на %1$s" + }, + "EventLogUnpinnedMessages": { + "key": "EventLogUnpinnedMessages", + "value": "un1 открепил(а) сообщение" + }, + "EventLogVoiceChatAllowedToSpeak": { + "key": "EventLogVoiceChatAllowedToSpeak", + "value": "un1 разрешил(а) микрофон для новых участников" + }, + "EventLogVoiceChatMuted": { + "key": "EventLogVoiceChatMuted", + "value": "un1 выключил(а) микрофон для un2" + }, + "EventLogVoiceChatNotAllowedToSpeak": { + "key": "EventLogVoiceChatNotAllowedToSpeak", + "value": "un1 выключил(а) микрофон для новых участников" + }, + "EventLogVoiceChatUnmuted": { + "key": "EventLogVoiceChatUnmuted", + "value": "un1 разрешил(а) микрофон для un2" + }, + "EventLogYouChannelJoined": { + "key": "EventLogYouChannelJoined", + "value": "Вы присоединились к каналу" + }, + "EventLogYouGroupJoined": { + "key": "EventLogYouGroupJoined", + "value": "Вы вступили в группу" + }, + "EventLogYouLeft": { + "key": "EventLogYouLeft", + "value": "Вы покинули группу" + }, + "EventLogYouPromoted": { + "key": "EventLogYouPromoted", + "value": "Вы изменили привилегии пользователя un2 (%1$s)" + }, + "EventLogYouRestricted": { + "key": "EventLogYouRestricted", + "value": "Вы изменили ограничения для пользователя un2 (%1$s)" + }, + "Events": { + "key": "Events", + "value": "События" + }, + "Exception": { + "key": "Exception", + "zeroValue": null, + "oneValue": "%1$d исключение", + "twoValue": null, + "fewValue": "%1$d исключения", + "manyValue": "%1$d исключений", + "otherValue": "%1$d исключений" + }, + "ExpireAfter": { + "key": "ExpireAfter", + "value": "Действует до" + }, + "Expired": { + "key": "Expired", + "value": "Истекла" + }, + "ExpiredLink": { + "key": "ExpiredLink", + "value": "Истекшая ссылка" + }, + "ExportTheme": { + "key": "ExportTheme", + "value": "Экспортировать" + }, + "Exposure": { + "key": "Exposure", + "value": "Экспозиция" + }, + "ExternalFolderInfo": { + "key": "ExternalFolderInfo", + "value": "Поиск во внешнем хранилище" + }, + "ExternalStorage": { + "key": "ExternalStorage", + "value": "Внешнее хранилище" + }, + "Fade": { + "key": "Fade", + "value": "Затемнение" + }, + "FakeMessage": { + "key": "FakeMessage", + "value": "FAKE" + }, + "FavoriteStickers": { + "key": "FavoriteStickers", + "value": "Избранные" + }, + "FeaturedGifs": { + "key": "FeaturedGifs", + "value": "Популярные GIF" + }, + "FeaturedStickers": { + "key": "FeaturedStickers", + "value": "Популярные стикеры" + }, + "FeaturedStickersInfo": { + "key": "FeaturedStickersInfo", + "value": "Эти стикеры сейчас популярны в Telegram. Вы можете добавлять свои стикеры с помощью бота @stickers." + }, + "February": { + "key": "February", + "value": "Февраль" + }, + "FileSavedHint": { + "key": "FileSavedHint", + "value": "Файл сохранён в загрузки" + }, + "FileUploadLimit": { + "key": "FileUploadLimit", + "value": "Размер файла не может превышать %1$s" + }, + "Files": { + "key": "Files", + "zeroValue": null, + "oneValue": "%1$d файл", + "twoValue": null, + "fewValue": "%1$d файла", + "manyValue": "%1$d файлов", + "otherValue": "%1$d файлов" + }, + "FilesDataUsage": { + "key": "FilesDataUsage", + "value": "Файлы" + }, + "FilesSavedHint": { + "key": "FilesSavedHint", + "zeroValue": null, + "oneValue": "%1$d файл сохранён в загрузки", + "twoValue": null, + "fewValue": "%1$d файла сохранено в загрузки", + "manyValue": "%1$d файлов сохранено в загрузки", + "otherValue": "%1$d файла сохранено в загрузки" + }, + "FilterAddChats": { + "key": "FilterAddChats", + "value": "Добавить чаты" + }, + "FilterAddException": { + "key": "FilterAddException", + "value": "Добавить исключение" + }, + "FilterAddTo": { + "key": "FilterAddTo", + "value": "Добавить в папку" + }, + "FilterAddToAlertFullText": { + "key": "FilterAddToAlertFullText", + "value": "Из папки нельзя исключить больше 100 чатов." + }, + "FilterAddToAlertFullTitle": { + "key": "FilterAddToAlertFullTitle", + "value": "Достигнут лимит" + }, + "FilterAddingChats": { + "key": "FilterAddingChats", + "value": "Добавление чатов" + }, + "FilterAddingChatsInfo": { + "key": "FilterAddingChatsInfo", + "value": "Добавление чатов в папку..." + }, + "FilterAllChats": { + "key": "FilterAllChats", + "value": "Все чаты" + }, + "FilterAllChatsShort": { + "key": "FilterAllChatsShort", + "value": "Все" + }, + "FilterAlwaysShow": { + "key": "FilterAlwaysShow", + "value": "Чаты в папке" + }, + "FilterArchived": { + "key": "FilterArchived", + "value": "Архивированные" + }, + "FilterAvailableText": { + "key": "FilterAvailableText", + "value": "Чаты можно сгруппировать в настройках, в разделе *Папки*." + }, + "FilterAvailableTitle": { + "key": "FilterAvailableTitle", + "value": "Папки с чатами" + }, + "FilterBots": { + "key": "FilterBots", + "value": "Боты" + }, + "FilterChannels": { + "key": "FilterChannels", + "value": "Каналы" + }, + "FilterChatAddedToExisting": { + "key": "FilterChatAddedToExisting", + "value": "Чат **%1$s** добавлен в **%2$s**" + }, + "FilterChatRemovedFrom": { + "key": "FilterChatRemovedFrom", + "value": "Чат **%1$s** исключён из **%2$s**" + }, + "FilterChatTypes": { + "key": "FilterChatTypes", + "value": "Типы чатов" + }, + "FilterChats": { + "key": "FilterChats", + "value": "Чаты" + }, + "FilterChatsAddedToExisting": { + "key": "FilterChatsAddedToExisting", + "value": "**%1$s** добавлены в **%2$s**" + }, + "FilterChatsRemovedFrom": { + "key": "FilterChatsRemovedFrom", + "value": "**%1$s** исключены из **%2$s**" + }, + "FilterChoose": { + "key": "FilterChoose", + "value": "Выбрать папку" + }, + "FilterContact": { + "key": "FilterContact", + "value": "Контакт" + }, + "FilterContacts": { + "key": "FilterContacts", + "value": "Контакты" + }, + "FilterDelete": { + "key": "FilterDelete", + "value": "Удалить папку" + }, + "FilterDeleteAlert": { + "key": "FilterDeleteAlert", + "value": "Удалить эту папку? Это не затронет чаты, которые в ней находятся." + }, + "FilterDeleteItem": { + "key": "FilterDeleteItem", + "value": "Удалить" + }, + "FilterDiscardAlert": { + "key": "FilterDiscardAlert", + "value": "Вы изменили настройки папки. Применить изменения?" + }, + "FilterDiscardNewAlert": { + "key": "FilterDiscardNewAlert", + "value": "Вы не закончили создание папки. Создать?" + }, + "FilterDiscardNewSave": { + "key": "FilterDiscardNewSave", + "value": "Создать" + }, + "FilterDiscardNewTitle": { + "key": "FilterDiscardNewTitle", + "value": "Создать папку?" + }, + "FilterDiscardTitle": { + "key": "FilterDiscardTitle", + "value": "Применить изменения?" + }, + "FilterEdit": { + "key": "FilterEdit", + "value": "Настроить папку" + }, + "FilterEditAll": { + "key": "FilterEditAll", + "value": "Настроить папки" + }, + "FilterEditItem": { + "key": "FilterEditItem", + "value": "Изменить" + }, + "FilterExclude": { + "key": "FilterExclude", + "value": "Исключённые чаты" + }, + "FilterExcludeArchived": { + "key": "FilterExcludeArchived", + "value": "Исключить архив" + }, + "FilterExcludeInfo": { + "key": "FilterExcludeInfo", + "value": "Выберите чаты или типы чатов, которые не нужно показывать в этой папке." + }, + "FilterExcludeMuted": { + "key": "FilterExcludeMuted", + "value": "Исключить чаты без звука" + }, + "FilterExcludeRead": { + "key": "FilterExcludeRead", + "value": "Исключить прочитанные" + }, + "FilterGroups": { + "key": "FilterGroups", + "value": "Группы" + }, + "FilterInclude": { + "key": "FilterInclude", + "value": "Выбранные чаты" + }, + "FilterIncludeInfo": { + "key": "FilterIncludeInfo", + "value": "Выберите чаты или типы чатов, которые нужно показывать в этой папке." + }, + "FilterMuted": { + "key": "FilterMuted", + "value": "Без уведомлений" + }, + "FilterNameHint": { + "key": "FilterNameHint", + "value": "Название папки" + }, + "FilterNameNonMuted": { + "key": "FilterNameNonMuted", + "value": "Важные" + }, + "FilterNameUnread": { + "key": "FilterNameUnread", + "value": "Новые" + }, + "FilterNeverShow": { + "key": "FilterNeverShow", + "value": "Чаты не в папке" + }, + "FilterNew": { + "key": "FilterNew", + "value": "Новая папка" + }, + "FilterNoChats": { + "key": "FilterNoChats", + "value": "Нет чатов" + }, + "FilterNoChatsToDisplay": { + "key": "FilterNoChatsToDisplay", + "value": "Нет чатов" + }, + "FilterNoChatsToDisplayInfo": { + "key": "FilterNoChatsToDisplayInfo", + "value": "В этой папке пока нет чатов." + }, + "FilterNonContact": { + "key": "FilterNonContact", + "value": "Не контакт" + }, + "FilterNonContacts": { + "key": "FilterNonContacts", + "value": "Не контакты" + }, + "FilterRead": { + "key": "FilterRead", + "value": "Прочитанные" + }, + "FilterRecommended": { + "key": "FilterRecommended", + "value": "Рекомендованные папки" + }, + "FilterRemoveChats": { + "key": "FilterRemoveChats", + "value": "Исключить чаты" + }, + "FilterRemoveExclusionChatText": { + "key": "FilterRemoveExclusionChatText", + "value": "Убрать \"%1$s\" из списка чатов, которые не должны показываться в папке?" + }, + "FilterRemoveExclusionText": { + "key": "FilterRemoveExclusionText", + "value": "Убрать \"%1$s\" из списка чатов, которые не должны показываться в папке?" + }, + "FilterRemoveExclusionTitle": { + "key": "FilterRemoveExclusionTitle", + "value": "Убрать исключение" + }, + "FilterRemoveExclusionUserText": { + "key": "FilterRemoveExclusionUserText", + "value": "Убрать \"%1$s\" из списка чатов, которые не должны показываться в папке?" + }, + "FilterRemoveFrom": { + "key": "FilterRemoveFrom", + "value": "Убрать из папки" + }, + "FilterRemoveFromAlertFullText": { + "key": "FilterRemoveFromAlertFullText", + "value": "В папку нельзя добавить больше 100 чатов." + }, + "FilterRemoveInclusionChatText": { + "key": "FilterRemoveInclusionChatText", + "value": "Убрать \"%1$s\" из списка чатов, которые должны показываться в папке?" + }, + "FilterRemoveInclusionText": { + "key": "FilterRemoveInclusionText", + "value": "Убрать \"%1$s\" из списка чатов, которые должны показываться в папке?" + }, + "FilterRemoveInclusionTitle": { + "key": "FilterRemoveInclusionTitle", + "value": "Убрать исключение" + }, + "FilterRemoveInclusionUserText": { + "key": "FilterRemoveInclusionUserText", + "value": "Убрать \"%1$s\" из списка чатов, которые должны показываться в папке?" + }, + "FilterReorder": { + "key": "FilterReorder", + "value": "Изменить порядок" + }, + "FilterSecretChats": { + "key": "FilterSecretChats", + "value": "Секретные чаты" + }, + "FilterShowMoreChats": { + "key": "FilterShowMoreChats", + "zeroValue": null, + "oneValue": "Показать ещё %1$d", + "twoValue": null, + "fewValue": "Показать ещё %1$d", + "manyValue": "Показать ещё %1$d", + "otherValue": "Показать ещё %1$d" + }, + "FilterUnread": { + "key": "FilterUnread", + "value": "Новые" + }, + "FilterUserAddedToExisting": { + "key": "FilterUserAddedToExisting", + "value": "Чат с **%1$s** добавлен в **%2$s**" + }, + "FilterUserRemovedFrom": { + "key": "FilterUserRemovedFrom", + "value": "Чат с **%1$s** исключён из **%2$s**" + }, + "Filters": { + "key": "Filters", + "value": "Папки" + }, + "FiltersSetup": { + "key": "FiltersSetup", + "value": "Настройка" + }, + "FiltersSetupPinAlert": { + "key": "FiltersSetupPinAlert", + "value": "Настроить папки" + }, + "FinalResults": { + "key": "FinalResults", + "value": "Результаты" + }, + "FingerprintHelp": { + "key": "FingerprintHelp", + "value": "Сканер отпечатков пальцев" + }, + "FingerprintInfo": { + "key": "FingerprintInfo", + "value": "Подтвердите отпечаток пальца" + }, + "FingerprintNotRecognized": { + "key": "FingerprintNotRecognized", + "value": "Отпечаток пальца не распознан. Попробуйте ещё раз." + }, + "FirstName": { + "key": "FirstName", + "value": "Имя (обязательно)" + }, + "FloodWait": { + "key": "FloodWait", + "value": "Слишком много попыток. Повторите позже." + }, + "FloodWaitTime": { + "key": "FloodWaitTime", + "value": "Слишком много попыток, попробуйте снова через %1$s" + }, + "Folder": { + "key": "Folder", + "value": "Папка" + }, + "FollowersChartTitle": { + "key": "FollowersChartTitle", + "value": "Подписчики" + }, + "FontSize": { + "key": "FontSize", + "value": "Размер текста" + }, + "FontSizePreviewLine1": { + "key": "FontSizePreviewLine1", + "value": "Знаешь, который час?" + }, + "FontSizePreviewLine2": { + "key": "FontSizePreviewLine2", + "value": "В Токио утро 😎" + }, + "FontSizePreviewName": { + "key": "FontSizePreviewName", + "value": "Боб Харрис" + }, + "FontSizePreviewReply": { + "key": "FontSizePreviewReply", + "value": "Доброе утро! 👋" + }, + "FontType": { + "key": "FontType", + "value": "Шрифт" + }, + "FootsAway": { + "key": "FootsAway", + "value": "%1$s фт отсюда" + }, + "FootsFromYou": { + "key": "FootsFromYou", + "value": "%1$s футах от Вас" + }, + "FootsShort": { + "key": "FootsShort", + "value": "%1$s фт" + }, + "ForgotPassword": { + "key": "ForgotPassword", + "value": "Забыли пароль?" + }, + "Forward": { + "key": "Forward", + "value": "Переслать" + }, + "ForwardTo": { + "key": "ForwardTo", + "value": "Переслать..." + }, + "ForwardedAudio": { + "key": "ForwardedAudio", + "zeroValue": null, + "oneValue": "%1$d пересылаемое аудиосообщение", + "twoValue": null, + "fewValue": "%1$d пересылаемых аудиосообщения", + "manyValue": "%1$d пересылаемых аудиосообщений", + "otherValue": "%1$d пересылаемых аудиосообщений" + }, + "ForwardedContact": { + "key": "ForwardedContact", + "zeroValue": null, + "oneValue": "%1$d пересылаемый контакт", + "twoValue": null, + "fewValue": "%1$d пересылаемых контакта", + "manyValue": "%1$d пересылаемых контактов", + "otherValue": "%1$d пересылаемых контактов" + }, + "ForwardedFile": { + "key": "ForwardedFile", + "zeroValue": null, + "oneValue": "%1$d пересылаемый файл", + "twoValue": null, + "fewValue": "%1$d пересылаемых файла", + "manyValue": "%1$d пересылаемых файлов", + "otherValue": "%1$d пересылаемых файлов" + }, + "ForwardedLocation": { + "key": "ForwardedLocation", + "zeroValue": null, + "oneValue": "%1$d пересылаемая геопозиция", + "twoValue": null, + "fewValue": "%1$d пересылаемых геопозиции", + "manyValue": "%1$d пересылаемых геопозиций", + "otherValue": "%1$d пересылаемых геопозиций" + }, + "ForwardedMessage": { + "key": "ForwardedMessage", + "value": "Пересланное сообщение" + }, + "ForwardedMessageCount": { + "key": "ForwardedMessageCount", + "zeroValue": null, + "oneValue": "%1$d пересылаемое сообщение", + "twoValue": null, + "fewValue": "%1$d пересылаемых сообщения", + "manyValue": "%1$d пересылаемых сообщений", + "otherValue": "%1$d пересылаемых сообщений" + }, + "ForwardedMusic": { + "key": "ForwardedMusic", + "zeroValue": null, + "oneValue": "%1$d пересылаемый аудиофайл", + "twoValue": null, + "fewValue": "%1$d пересылаемых аудиофайла", + "manyValue": "%1$d пересылаемых аудиофайлов", + "otherValue": "%1$d пересылаемых аудиофайлов" + }, + "ForwardedPhoto": { + "key": "ForwardedPhoto", + "zeroValue": null, + "oneValue": "%1$d пересылаемое фото", + "twoValue": null, + "fewValue": "%1$d пересылаемых фото", + "manyValue": "%1$d пересылаемых фото", + "otherValue": "%1$d пересылаемых фото" + }, + "ForwardedPoll": { + "key": "ForwardedPoll", + "zeroValue": null, + "oneValue": "%1$d пересылаемый опрос", + "twoValue": null, + "fewValue": "%1$d пересылаемых опроса", + "manyValue": "%1$d пересылаемых опросов", + "otherValue": "%1$d пересылаемых опросов" + }, + "ForwardedRound": { + "key": "ForwardedRound", + "zeroValue": null, + "oneValue": "%1$d пересылаемое видеосообщение", + "twoValue": null, + "fewValue": "%1$d пересылаемых видеосообщения", + "manyValue": "%1$d пересылаемых видеосообщений", + "otherValue": "%1$d пересылаемых видеосообщений" + }, + "ForwardedSticker": { + "key": "ForwardedSticker", + "zeroValue": null, + "oneValue": "%1$d пересылаемый стикер", + "twoValue": null, + "fewValue": "%1$d пересылаемых стикера", + "manyValue": "%1$d пересылаемых стикеров", + "otherValue": "%1$d пересылаемых стикеров" + }, + "ForwardedVideo": { + "key": "ForwardedVideo", + "zeroValue": null, + "oneValue": "%1$d пересылаемое видео", + "twoValue": null, + "fewValue": "%1$d пересылаемых видео", + "manyValue": "%1$d пересылаемых видео", + "otherValue": "%1$d пересылаемых видео" + }, + "FreeOfTotal": { + "key": "FreeOfTotal", + "value": "Свободно %1$s из %2$s" + }, + "From": { + "key": "From", + "value": "От:" + }, + "FromCamera": { + "key": "FromCamera", + "value": "С камеры" + }, + "FromChats": { + "key": "FromChats", + "zeroValue": null, + "oneValue": "из %1$d чата", + "twoValue": null, + "fewValue": "из %1$d чатов", + "manyValue": "из %1$d чатов", + "otherValue": "из %1$d чатов" + }, + "FromFormatted": { + "key": "FromFormatted", + "value": "От %1$s" + }, + "FromGalley": { + "key": "FromGalley", + "value": "Из галереи" + }, + "FromYou": { + "key": "FromYou", + "value": "Вы" + }, + "FwdMessageToChats": { + "key": "FwdMessageToChats", + "value": "Сообщение переслано в **%1$s**." + }, + "FwdMessageToGroup": { + "key": "FwdMessageToGroup", + "value": "Сообщение переслано в **%1$s**." + }, + "FwdMessageToSavedMessages": { + "key": "FwdMessageToSavedMessages", + "value": "Сообщение переслано в **Избранное**." + }, + "FwdMessageToUser": { + "key": "FwdMessageToUser", + "value": "Сообщение переслано в **%1$s**." + }, + "FwdMessagesToChats": { + "key": "FwdMessagesToChats", + "value": "Сообщения пересланы в **%1$s**." + }, + "FwdMessagesToGroup": { + "key": "FwdMessagesToGroup", + "value": "Сообщения пересланы в **%1$s**." + }, + "FwdMessagesToSavedMessages": { + "key": "FwdMessagesToSavedMessages", + "value": "Сообщения пересланы в **Избранное**." + }, + "FwdMessagesToUser": { + "key": "FwdMessagesToUser", + "value": "Сообщения пересланы в **%1$s**." + }, + "GIFs": { + "key": "GIFs", + "zeroValue": null, + "oneValue": "%1$d GIF", + "twoValue": null, + "fewValue": "\n%1$d GIF", + "manyValue": "\n%1$d GIF", + "otherValue": "%1$d GIF" + }, + "Gallery": { + "key": "Gallery", + "value": "Галерея" + }, + "GalleryInfo": { + "key": "GalleryInfo", + "value": "Для отправки изображений без сжатия" + }, + "GalleryPermissionText": { + "key": "GalleryPermissionText", + "value": "Нажмите, чтобы разрешить доступ к галерее" + }, + "General": { + "key": "General", + "value": "Основные" + }, + "GetQRCode": { + "key": "GetQRCode", + "value": "Получить QR-код" + }, + "GettingLinkInfo": { + "key": "GettingLinkInfo", + "value": "Загрузка предпросмотра для ссылки..." + }, + "GifCaption": { + "key": "GifCaption", + "value": "Подпись к GIF" + }, + "GifSavedToDownloadsHint": { + "key": "GifSavedToDownloadsHint", + "value": "GIF сохранён в загрузки" + }, + "GifsTab": { + "key": "GifsTab", + "value": "GIF" + }, + "GifsTab2": { + "key": "GifsTab2", + "value": "GIF" + }, + "GigagroupAlertLearnMore": { + "key": "GigagroupAlertLearnMore", + "value": "ПОДРОБНЕЕ" + }, + "GigagroupAlertText": { + "key": "GigagroupAlertText", + "value": "Ваша группа достигла лимита в **200,000** участников.\n\nВы можете повысить лимит, сделав её **группой для трансляций**, в которой только администраторы могут отправлять сообщения. Продолжить?" + }, + "GigagroupAlertTitle": { + "key": "GigagroupAlertTitle", + "value": "Достигнут лимит" + }, + "GigagroupConvertAlertConver": { + "key": "GigagroupConvertAlertConver", + "value": "ДА" + }, + "GigagroupConvertAlertText": { + "key": "GigagroupConvertAlertText", + "value": "Обычные участники (не администраторы) **навсегда** потеряют возможность писать сообщения в группе.\n\nЭто **нельзя** будет отменить." + }, + "GigagroupConvertAlertTitle": { + "key": "GigagroupConvertAlertTitle", + "value": "Вы уверены?" + }, + "GigagroupConvertCancelButton": { + "key": "GigagroupConvertCancelButton", + "value": "Оставить обычной группой" + }, + "GigagroupConvertCancelHint": { + "key": "GigagroupConvertCancelHint", + "value": "Если Вы передумаете, перейдите в настройки группы > Разрешения." + }, + "GigagroupConvertInfo1": { + "key": "GigagroupConvertInfo1", + "value": "Сколько угодно участников." + }, + "GigagroupConvertInfo2": { + "key": "GigagroupConvertInfo2", + "value": "Пишут только администраторы." + }, + "GigagroupConvertInfo3": { + "key": "GigagroupConvertInfo3", + "value": "Нельзя сделать обычной группой." + }, + "GigagroupConvertProcessButton": { + "key": "GigagroupConvertProcessButton", + "value": "Сделать группой для трансляций" + }, + "GigagroupConvertTitle": { + "key": "GigagroupConvertTitle", + "value": "Группы для трансляций" + }, + "GlobalAttachGifRestricted": { + "key": "GlobalAttachGifRestricted", + "value": "В этой группе запрещено отправлять GIF." + }, + "GlobalAttachInlineRestricted": { + "key": "GlobalAttachInlineRestricted", + "value": "В этой группе запрещено публиковать материалы с помощью ботов." + }, + "GlobalAttachMediaRestricted": { + "key": "GlobalAttachMediaRestricted", + "value": "В этой группе запрещено публиковать мультимедиа." + }, + "GlobalAttachStickersRestricted": { + "key": "GlobalAttachStickersRestricted", + "value": "В этой группе запрещено отправлять стикеры." + }, + "GlobalSearch": { + "key": "GlobalSearch", + "value": "Глобальный поиск" + }, + "GlobalSendMessageRestricted": { + "key": "GlobalSendMessageRestricted", + "value": "В этой группе запрещено писать сообщения." + }, + "GoToSettings": { + "key": "GoToSettings", + "value": "В НАСТРОЙКИ" + }, + "GotAQuestion": { + "key": "GotAQuestion", + "value": "Вопрос по Telegram?" + }, + "GpsDisabledAlert": { + "key": "GpsDisabledAlert", + "value": "Похоже, у Вас отключён GPS. Включите его, чтобы использовать функции геопозиции в приложении." + }, + "GpsDisabledAlertText": { + "key": "GpsDisabledAlertText", + "value": "Чтобы использовать геопозицию, пожалуйста, включите GPS." + }, + "GpsDisabledAlertTitle": { + "key": "GpsDisabledAlertTitle", + "value": "Требуется GPS" + }, + "Grain": { + "key": "Grain", + "value": "Зернистость" + }, + "Gray": { + "key": "Gray", + "value": "Серый" + }, + "Green": { + "key": "Green", + "value": "Зелёный" + }, + "GroupAddMembers": { + "key": "GroupAddMembers", + "value": "Добавить участников" + }, + "GroupContacts": { + "key": "GroupContacts", + "value": "Контакты в этой группе" + }, + "GroupDeletedUndo": { + "key": "GroupDeletedUndo", + "value": "Группа удалена." + }, + "GroupDescription1": { + "key": "GroupDescription1", + "value": "До 200 000 участников" + }, + "GroupDescription2": { + "key": "GroupDescription2", + "value": "Общая история переписки" + }, + "GroupDescription3": { + "key": "GroupDescription3", + "value": "Публичные ссылки вида t.me/title" + }, + "GroupDescription4": { + "key": "GroupDescription4", + "value": "Разный уровень прав" + }, + "GroupEmptyTitle1": { + "key": "GroupEmptyTitle1", + "value": "Вы создали **группу**." + }, + "GroupEmptyTitle2": { + "key": "GroupEmptyTitle2", + "value": "Возможности групп:" + }, + "GroupMembers": { + "key": "GroupMembers", + "value": "Участники" + }, + "GroupMembersChartTitle": { + "key": "GroupMembersChartTitle", + "value": "Участники группы" + }, + "GroupName": { + "key": "GroupName", + "value": "Имя группы" + }, + "GroupNotifications": { + "key": "GroupNotifications", + "value": "Группы" + }, + "GroupPhotosHelp": { + "key": "GroupPhotosHelp", + "value": "Объединить фотографии в альбом" + }, + "GroupSettingsChangedAlert": { + "key": "GroupSettingsChangedAlert", + "value": "Вы изменили настройки группы. Применить изменения?" + }, + "GroupSettingsTitle": { + "key": "GroupSettingsTitle", + "value": "Настройки группы" + }, + "GroupStickers": { + "key": "GroupStickers", + "value": "Стикеры группы" + }, + "GroupStickersInfo": { + "key": "GroupStickersInfo", + "value": "Вы можете выбрать набор стикеров, который будет доступен всем участникам группы при общении в ней." + }, + "GroupType": { + "key": "GroupType", + "value": "Тип группы" + }, + "GroupTypeHeader": { + "key": "GroupTypeHeader", + "value": "Тип группы" + }, + "GroupUserAddLimit": { + "key": "GroupUserAddLimit", + "value": "К сожалению, группа переполнена." + }, + "GroupUserCantAdd": { + "key": "GroupUserCantAdd", + "value": "К сожалению, Вы не можете добавлять этого пользователя в группы." + }, + "GroupUserCantAdmin": { + "key": "GroupUserCantAdmin", + "value": "К сожалению, у группы слишком много администраторов." + }, + "GroupUserCantBot": { + "key": "GroupUserCantBot", + "value": "К сожалению, в группе слишком много ботов." + }, + "GroupUserLeftError": { + "key": "GroupUserLeftError", + "value": "Поскольку пользователь был участником группы прежде, Вы не можете пригласить его обратно. Для этого требуется, чтобы вы были друг у друга в списке контактов.\n\nЕсли пользователя нет в чёрном списке группы, он может присоединиться с помощь ссылки-приглашения." + }, + "Groups": { + "key": "Groups", + "zeroValue": null, + "oneValue": "%1$d группа", + "twoValue": null, + "fewValue": "%1$d группы", + "manyValue": "%1$d групп", + "otherValue": "%1$d групп" + }, + "GroupsAndChannels": { + "key": "GroupsAndChannels", + "value": "Группы" + }, + "GroupsAndChannelsHelp": { + "key": "GroupsAndChannelsHelp", + "value": "Выберите, кто может приглашать Вас в группы и каналы." + }, + "GroupsInCommon": { + "key": "GroupsInCommon", + "value": "Общие группы" + }, + "GroupsInCommonTitle": { + "key": "GroupsInCommonTitle", + "value": "Общие группы" + }, + "GrowthChartTitle": { + "key": "GrowthChartTitle", + "value": "Рост" + }, + "HashtagCopied": { + "key": "HashtagCopied", + "value": "Хештег скопирован в буфер обмена." + }, + "Hashtags": { + "key": "Hashtags", + "value": "ХЕШТЕГИ" + }, + "HidAccount": { + "key": "HidAccount", + "value": "Аккаунт скрыт пользователем" + }, + "HiddenName": { + "key": "HiddenName", + "value": "Удалённый аккаунт" + }, + "HideAboveTheList": { + "key": "HideAboveTheList", + "value": "Скрыть над списком чатов" + }, + "HideNewChatsAlertText": { + "key": "HideNewChatsAlertText", + "value": "Вам часто пишут пользователи не из списка контактов. Хотите, чтобы новые чаты с ними **автоматически** помещались в **Архив**, а **уведомления** о них были **выключены**?" + }, + "HideNewChatsAlertTitle": { + "key": "HideNewChatsAlertTitle", + "value": "Скрывать новые чаты?" + }, + "HideOnTop": { + "key": "HideOnTop", + "value": "Скрыть" + }, + "HidePinnedMessages": { + "key": "HidePinnedMessages", + "value": "Скрыть закреплённые сообщения" + }, + "Highlights": { + "key": "Highlights", + "value": "Свет" + }, + "HintRead": { + "key": "HintRead", + "value": "Прочитано" + }, + "HintSent": { + "key": "HintSent", + "value": "Доставлено" + }, + "HistoryCleared": { + "key": "HistoryCleared", + "value": "История очищена" + }, + "HistoryClearedUndo": { + "key": "HistoryClearedUndo", + "value": "История очищена." + }, + "HoldToAudio": { + "key": "HoldToAudio", + "value": "Удерживайте для записи аудио. Нажмите для переключения на видео." + }, + "HoldToAudioOnly": { + "key": "HoldToAudioOnly", + "value": "Удерживайте для записи аудио." + }, + "HoldToVideo": { + "key": "HoldToVideo", + "value": "Удерживайте для записи видео. Нажмите для переключения на аудио." + }, + "Hours": { + "key": "Hours", + "zeroValue": null, + "oneValue": "%1$d час", + "twoValue": null, + "fewValue": "%1$d часа", + "manyValue": "%1$d часов", + "otherValue": "%1$d часов" + }, + "HoursBold": { + "key": "HoursBold", + "zeroValue": null, + "oneValue": "**%1$d** ч.", + "twoValue": null, + "fewValue": "**%1$d** ч.", + "manyValue": "**%1$d** ч.", + "otherValue": "**%1$d** ч." + }, + "Hybrid": { + "key": "Hybrid", + "value": "Гибрид" + }, + "IVInteractionsChartTitle": { + "key": "IVInteractionsChartTitle", + "value": "Активность в IV" + }, + "ImagesTab": { + "key": "ImagesTab", + "value": "ИЗОБРАЖЕНИЯ" + }, + "ImagesTab2": { + "key": "ImagesTab2", + "value": "Изображения" + }, + "ImporImportingService": { + "key": "ImporImportingService", + "value": "Импорт сообщений и медиа..." + }, + "Import": { + "key": "Import", + "value": "ИМПОРТ" + }, + "ImportContacts": { + "key": "ImportContacts", + "value": "Импорт контактов" + }, + "ImportCount": { + "key": "ImportCount", + "value": "%1$s из %2$s" + }, + "ImportDone": { + "key": "ImportDone", + "value": "Готово" + }, + "ImportDoneInfo": { + "key": "ImportDoneInfo", + "value": "Чтобы освободить место на устройстве, импортируйте больше чатов в Telegram." + }, + "ImportDoneTitle": { + "key": "ImportDoneTitle", + "value": "Чат успешно импортирован!" + }, + "ImportErrorChatInvalidGroup": { + "key": "ImportErrorChatInvalidGroup", + "value": "Формат файла предназначен для личного чата, но Вы выбрали группу." + }, + "ImportErrorChatInvalidUser": { + "key": "ImportErrorChatInvalidUser", + "value": "Формат файла предназначен для группы, но Вы выбрали пользователя." + }, + "ImportErrorFileFormatInvalid": { + "key": "ImportErrorFileFormatInvalid", + "value": "Неверный формат файла." + }, + "ImportErrorFileLang": { + "key": "ImportErrorFileLang", + "value": "Неизвестный язык файла." + }, + "ImportErrorNotAdmin": { + "key": "ImportErrorNotAdmin", + "value": "Для импорта сообщений необходимо быть админом группы." + }, + "ImportErrorPeerInvalid": { + "key": "ImportErrorPeerInvalid", + "value": "Невозможно импортировать историю в этот чат." + }, + "ImportErrorTitle": { + "key": "ImportErrorTitle", + "value": "Ошибка импорта" + }, + "ImportErrorUserBlocked": { + "key": "ImportErrorUserBlocked", + "value": "Невозможно импортировать сообщения из-за настроек конфиденциальности." + }, + "ImportFailedToUpload": { + "key": "ImportFailedToUpload", + "value": "Не удалось загрузить файл." + }, + "ImportFileTooLarge": { + "key": "ImportFileTooLarge", + "value": "Файл для импорта слишком велик." + }, + "ImportHeader": { + "key": "ImportHeader", + "value": "Импорт сообщений и медиа..." + }, + "ImportHeaderContacts": { + "key": "ImportHeaderContacts", + "value": "Или выберите один из своих контактов" + }, + "ImportImportingInfo": { + "key": "ImportImportingInfo", + "value": "Пожалуйста, не закрывайте Telegram до завершения импорта." + }, + "ImportImportingTitle": { + "key": "ImportImportingTitle", + "value": "Импорт чата" + }, + "ImportMessages": { + "key": "ImportMessages", + "value": "Импорт сообщений" + }, + "ImportMutualError": { + "key": "ImportMutualError", + "value": "Чтобы импортировать сообщения в личный чат, необходимо, чтобы Вы и собеседник были в списке контактов друг у друга." + }, + "ImportNotAdmin": { + "key": "ImportNotAdmin", + "value": "Для импорта сообщений необходимо быть админом группы." + }, + "ImportToChat": { + "key": "ImportToChat", + "value": "Импортировать сообщения из **%1$s** в группу **%2$s**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидят все участники группы." + }, + "ImportToChatNoTitle": { + "key": "ImportToChatNoTitle", + "value": "Импортировать сообщения в группу **%1$s**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидят все участники группы." + }, + "ImportToUser": { + "key": "ImportToUser", + "value": "Импортировать сообщения от **%1$s** в чат с **%2$s**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидите и Вы, и собеседник." + }, + "ImportToUserNoTitle": { + "key": "ImportToUserNoTitle", + "value": "Импортировать сообщения в чат с **%1$s**?\n\nИмпортированные сообщения попадут в конец переписки, но для них будет указано настоящее время отправки. Их увидите и Вы, и собеседник." + }, + "ImportUploading": { + "key": "ImportUploading", + "value": "Импорт сообщений и медиа... **%d%%**" + }, + "ImportedInfo": { + "key": "ImportedInfo", + "value": "Это сообщение было импортировано из другого приложения. Мы не можем гарантировать, что оно настоящее." + }, + "ImportedMessage": { + "key": "ImportedMessage", + "value": "импортировано в" + }, + "InAppNotifications": { + "key": "InAppNotifications", + "value": "В приложении" + }, + "InAppPreview": { + "key": "InAppPreview", + "value": "Показывать текст" + }, + "InAppSounds": { + "key": "InAppSounds", + "value": "Звук" + }, + "InAppVibrate": { + "key": "InAppVibrate", + "value": "Вибросигнал" + }, + "InChatSound": { + "key": "InChatSound", + "value": "Звук в чате" + }, + "InactiveChannelSignature": { + "key": "InactiveChannelSignature", + "value": "канал, неактивен %1$s" + }, + "InactiveChatSignature": { + "key": "InactiveChatSignature", + "value": "%1$s, неактивен %2$s" + }, + "InactiveChats": { + "key": "InactiveChats", + "value": "Неактивные чаты" + }, + "IncomingCalls": { + "key": "IncomingCalls", + "value": "Входящие звонки" + }, + "IncorrectLocalization": { + "key": "IncorrectLocalization", + "value": "Некорректный файл локализации" + }, + "IncorrectTheme": { + "key": "IncorrectTheme", + "value": "Некорректный файл темы" + }, + "Info": { + "key": "Info", + "value": "Информация" + }, + "InstallGoogleMaps": { + "key": "InstallGoogleMaps", + "value": "Установить Google Maps?" + }, + "InstantView": { + "key": "InstantView", + "value": "ПОСМОТРЕТЬ" + }, + "InstantViewNightMode": { + "key": "InstantViewNightMode", + "value": "Тёмная тема будет автоматически включаться в ночное время" + }, + "InstantViewReference": { + "key": "InstantViewReference", + "value": "Сноска" + }, + "InteractionsChartTitle": { + "key": "InteractionsChartTitle", + "value": "Активность" + }, + "InternalFolderInfo": { + "key": "InternalFolderInfo", + "value": "Поиск в файловой системе" + }, + "InternalStorage": { + "key": "InternalStorage", + "value": "Внутреннее хранилище" + }, + "InvalidCode": { + "key": "InvalidCode", + "value": "Неверный код, попробуйте снова." + }, + "InvalidFirstName": { + "key": "InvalidFirstName", + "value": "Некорректное имя" + }, + "InvalidLastName": { + "key": "InvalidLastName", + "value": "Некорректная фамилия" + }, + "InvalidPhoneNumber": { + "key": "InvalidPhoneNumber", + "value": "Некорректный номер телефона. Пожалуйста, проверьте номер и попробуйте ещё раз." + }, + "Invisible": { + "key": "Invisible", + "value": "невидимый" + }, + "Invitations": { + "key": "Invitations", + "zeroValue": null, + "oneValue": "%1$d приглашение", + "twoValue": null, + "fewValue": "%1$d приглашения", + "manyValue": "%1$d приглашений", + "otherValue": "%1$d приглашений" + }, + "Invite": { + "key": "Invite", + "value": "Пригласить" + }, + "InviteByQRCode": { + "key": "InviteByQRCode", + "value": "QR-код" + }, + "InviteExpired": { + "key": "InviteExpired", + "value": "Срок действия ссылки истёк." + }, + "InviteFriends": { + "key": "InviteFriends", + "value": "Пригласить друзей" + }, + "InviteFriendsHelp": { + "key": "InviteFriendsHelp", + "value": "Выберите людей, которых хотите пригласить в Telegram" + }, + "InviteLink": { + "key": "InviteLink", + "value": "Ссылка-приглашение" + }, + "InviteLinkCount": { + "key": "InviteLinkCount", + "zeroValue": null, + "oneValue": "%1$d пригласительная ссылка", + "twoValue": null, + "fewValue": "%1$d пригласительные ссылки", + "manyValue": "%1$d пригласительных ссылок", + "otherValue": "%1$d пригласительные ссылки" + }, + "InviteLinks": { + "key": "InviteLinks", + "value": "Пригласительные ссылки" + }, + "InviteRevokedHint": { + "key": "InviteRevokedHint", + "value": "Эта ссылка была сброшена." + }, + "InviteText2": { + "key": "InviteText2", + "value": "Привет, я использую Telegram для переписки. Присоединяйся! Скачать его можно здесь: %1$s" + }, + "InviteTextNum": { + "key": "InviteTextNum", + "zeroValue": null, + "oneValue": "Привет, я использую Telegram для переписки – как и ещё %1$d наш контакт. Присоединяйся! Скачать можно здесь: %@", + "twoValue": null, + "fewValue": "Привет, я использую Telegram для переписки – как и ещё %1$d наших контакта. Присоединяйся! Скачать можно здесь: %@", + "manyValue": "Привет, я использую Telegram для переписки – как и ещё %1$d наших контактов. Присоединяйся! Скачать можно здесь: %@", + "otherValue": "Привет, я использую Telegram для переписки – как и ещё %1$d наших контактов. Присоединяйся! Скачать можно здесь: %@" + }, + "InviteToChannelError": { + "key": "InviteToChannelError", + "value": "Вы не можете приглашать этого пользователя в каналы из-за его настроек приватности." + }, + "InviteToGroupByLink": { + "key": "InviteToGroupByLink", + "value": "Пригласить в группу по ссылке" + }, + "InviteToGroupError": { + "key": "InviteToGroupError", + "value": "Вы не можете приглашать этого пользователя в группы из-за его настроек приватности." + }, + "InviteToTelegram": { + "key": "InviteToTelegram", + "value": "ПРИГЛАСИТЬ В TELEGRAM" + }, + "InviteUser": { + "key": "InviteUser", + "value": "У этого пользователя пока нет Telegram, отправить приглашение?" + }, + "Invited": { + "key": "Invited", + "value": "приглашен(а)" + }, + "IsRecordingAudio": { + "key": "IsRecordingAudio", + "value": "%1$s записывает голосовое сообщение..." + }, + "IsRecordingRound": { + "key": "IsRecordingRound", + "value": "%1$s записывает видеосообщение..." + }, + "IsSendingAudio": { + "key": "IsSendingAudio", + "value": "%1$s отправляет аудио..." + }, + "IsSendingFile": { + "key": "IsSendingFile", + "value": "%1$s отправляет файл..." + }, + "IsSendingGame": { + "key": "IsSendingGame", + "value": "%1$s играет в игру..." + }, + "IsSendingPhoto": { + "key": "IsSendingPhoto", + "value": "%1$s отправляет фото..." + }, + "IsSendingVideo": { + "key": "IsSendingVideo", + "value": "%1$s отправляет видео..." + }, + "IsTyping": { + "key": "IsTyping", + "value": "печатает…" + }, + "IsTypingGroup": { + "key": "IsTypingGroup", + "value": "%1$s печатает..." + }, + "Italic": { + "key": "Italic", + "value": "Курсив" + }, + "January": { + "key": "January", + "value": "Январь" + }, + "JoinByPeekChannelText": { + "key": "JoinByPeekChannelText", + "value": "Этот частный канал. Чтобы видеть материалы в дальнейшем, необходимо подписаться на него." + }, + "JoinByPeekChannelTitle": { + "key": "JoinByPeekChannelTitle", + "value": "Подписаться" + }, + "JoinByPeekGroupText": { + "key": "JoinByPeekGroupText", + "value": "Этот частная группа. Чтобы видеть материалы в дальнейшем, необходимо вступить в неё." + }, + "JoinByPeekGroupTitle": { + "key": "JoinByPeekGroupTitle", + "value": "Вступить в группу" + }, + "JoinByPeekJoin": { + "key": "JoinByPeekJoin", + "value": "Подписаться" + }, + "JoinGroup": { + "key": "JoinGroup", + "value": "ВСТУПИТЬ В ГРУППУ" + }, + "JoinToGroupErrorFull": { + "key": "JoinToGroupErrorFull", + "value": "К сожалению, группа переполнена." + }, + "JoinToGroupErrorNotExist": { + "key": "JoinToGroupErrorNotExist", + "value": "Похоже, такого чата не существует." + }, + "July": { + "key": "July", + "value": "Июль" + }, + "JumpToDate": { + "key": "JumpToDate", + "value": "Перейти к дате" + }, + "June": { + "key": "June", + "value": "Июнь" + }, + "KMetersAway": { + "key": "KMetersAway", + "value": "км отсюда" + }, + "KMetersAway2": { + "key": "KMetersAway2", + "value": "%1$s км отсюда" + }, + "KMetersFromYou2": { + "key": "KMetersFromYou2", + "value": "%1$s км от вас" + }, + "KMetersShort": { + "key": "KMetersShort", + "value": "%1$s км" + }, + "KeepMedia": { + "key": "KeepMedia", + "value": "Хранить медиа" + }, + "KeepMediaForever": { + "key": "KeepMediaForever", + "value": "Всегда" + }, + "KeepMediaInfo": { + "key": "KeepMediaInfo", + "value": "Фото, видео и другие файлы, которые Вы **не смотрели** в течение этого срока, будут удалены с устройства для экономии места на телефоне.\n\nВсе медиа останутся в облаке Telegram, при необходимости Вы сможете загрузить их снова." + }, + "KickFromBroadcast": { + "key": "KickFromBroadcast", + "value": "Удалить из списка рассылки" + }, + "KickFromGroup": { + "key": "KickFromGroup", + "value": "Удалить из группы" + }, + "KickFromSupergroup": { + "key": "KickFromSupergroup", + "value": "Ограничить пользователя" + }, + "Km": { + "key": "Km", + "value": "км" + }, + "Language": { + "key": "Language", + "value": "Язык" + }, + "LanguageAlert": { + "key": "LanguageAlert", + "value": "Перевод (**%1$s**), который Вы собираетесь использовать, закончен на %2$d%%.\n\nЭто изменит язык всего интерфейса. Предложить свою версию перевода можно через [платформу переводов].\n\nВы можете в любой момент изменить язык в настройках приложения." + }, + "LanguageCode": { + "key": "LanguageCode", + "value": "ru" + }, + "LanguageCustom": { + "key": "LanguageCustom", + "value": "Сторонний" + }, + "LanguageCustomAlert": { + "key": "LanguageCustomAlert", + "value": "Сторонний перевод (**%1$s**), который Вы собираетесь установить, закончен на %2$d%%.\n\nЭто изменит язык всего интерфейса. Предложить свою версию перевода можно через [платформу переводов].\n\nВы можете в любой момент изменить язык в настройках приложения." + }, + "LanguageName": { + "key": "LanguageName", + "value": "Русский" + }, + "LanguageNameInEnglish": { + "key": "LanguageNameInEnglish", + "value": "Russian" + }, + "LanguageSame": { + "key": "LanguageSame", + "value": "Вы уже используете этот язык (**%1$s**). Вы можете сменить язык в любое время в Настройках." + }, + "LanguageSuggested": { + "key": "LanguageSuggested", + "value": "Установить \"%1$s\" язык?" + }, + "LanguageTitle": { + "key": "LanguageTitle", + "value": "Изменить язык?" + }, + "LanguageUnknownCustomAlert": { + "key": "LanguageUnknownCustomAlert", + "value": "К сожалению, в этом неофициальном переводе (**%1$s**) нет текстов приложения Telegram для Android." + }, + "LanguageUnknownTitle": { + "key": "LanguageUnknownTitle", + "value": "Недостаточно данных" + }, + "LanguageUnofficial": { + "key": "LanguageUnofficial", + "value": "Неофициальные переводы" + }, + "LanguageUnsupportedError": { + "key": "LanguageUnsupportedError", + "value": "Выбранный язык не найден." + }, + "LanguagesChartTitle": { + "key": "LanguagesChartTitle", + "value": "Языки" + }, + "LargeEmoji": { + "key": "LargeEmoji", + "value": "Крупные эмодзи" + }, + "LastName": { + "key": "LastName", + "value": "Фамилия (необязательно)" + }, + "LastSeen": { + "key": "LastSeen", + "value": "был(а)" + }, + "LastSeenContacts": { + "key": "LastSeenContacts", + "value": "Мои контакты" + }, + "LastSeenContactsMinus": { + "key": "LastSeenContactsMinus", + "value": "Мои контакты (-%1$d)" + }, + "LastSeenContactsMinusPlus": { + "key": "LastSeenContactsMinusPlus", + "value": "Мои контакты (-%1$d, +%2$d)" + }, + "LastSeenContactsPlus": { + "key": "LastSeenContactsPlus", + "value": "Мои контакты (+%1$d)" + }, + "LastSeenDate": { + "key": "LastSeenDate", + "value": "был(а)" + }, + "LastSeenDateFormatted": { + "key": "LastSeenDateFormatted", + "value": "был(а) %1$s" + }, + "LastSeenEverybody": { + "key": "LastSeenEverybody", + "value": "Все" + }, + "LastSeenEverybodyMinus": { + "key": "LastSeenEverybodyMinus", + "value": "Все (-%1$d)" + }, + "LastSeenFormatted": { + "key": "LastSeenFormatted", + "value": "был(а) %1$s" + }, + "LastSeenNobody": { + "key": "LastSeenNobody", + "value": "Никто" + }, + "LastSeenNobodyPlus": { + "key": "LastSeenNobodyPlus", + "value": "Никто (+%1$d)" + }, + "LastSeenTitle": { + "key": "LastSeenTitle", + "value": "Кто видит время моего последнего входа и статус в сети?" + }, + "Lately": { + "key": "Lately", + "value": "был(а) недавно" + }, + "Later": { + "key": "Later", + "value": "ПОЗЖЕ" + }, + "LeaveAComment": { + "key": "LeaveAComment", + "value": "Прокомментировать" + }, + "LeaveChannel": { + "key": "LeaveChannel", + "value": "Покинуть канал" + }, + "LeaveChannelMenu": { + "key": "LeaveChannelMenu", + "value": "Покинуть канал" + }, + "LeaveChats": { + "key": "LeaveChats", + "value": "Покинуть %1$s" + }, + "LeaveMegaMenu": { + "key": "LeaveMegaMenu", + "value": "Покинуть группу" + }, + "LedColor": { + "key": "LedColor", + "value": "Цвет светодиода" + }, + "LedDisabled": { + "key": "LedDisabled", + "value": "Откл." + }, + "LimitByPeriod": { + "key": "LimitByPeriod", + "value": "Ограничение по времени" + }, + "LimitNumberOfUses": { + "key": "LimitNumberOfUses", + "value": "Число вступлений" + }, + "LimitReached": { + "key": "LimitReached", + "value": "Достигнут лимит" + }, + "LinkActionCopy": { + "key": "LinkActionCopy", + "value": "Скопировать" + }, + "LinkActionShare": { + "key": "LinkActionShare", + "value": "Поделиться" + }, + "LinkAvailable": { + "key": "LinkAvailable", + "value": "%1$s доступно." + }, + "LinkChecking": { + "key": "LinkChecking", + "value": "Проверка имени…" + }, + "LinkCopied": { + "key": "LinkCopied", + "value": "Ссылка скопирована в буфер обмена." + }, + "LinkCopiedPrivate": { + "key": "LinkCopiedPrivate", + "value": "Ссылка скопирована.\nОна будет работать только для участников чата." + }, + "LinkCopiedPrivateInfo": { + "key": "LinkCopiedPrivateInfo", + "value": "Ссылка будет работать только для участников этого чата." + }, + "LinkCreatedeBy": { + "key": "LinkCreatedeBy", + "value": "Ссылка создана" + }, + "LinkExpiresIn": { + "key": "LinkExpiresIn", + "value": "Ссылка истекает %s" + }, + "LinkExpiresInTime": { + "key": "LinkExpiresInTime", + "value": "Ссылка истекает через %s" + }, + "LinkInUse": { + "key": "LinkInUse", + "value": "Имя уже занято." + }, + "LinkInfo": { + "key": "LinkInfo", + "value": "Любой пользователь Telegram сможет вступить в Вашу группу, перейдя по этой ссылке." + }, + "LinkInfoChannel": { + "key": "LinkInfoChannel", + "value": "Любой пользователь Telegram сможет подписаться на канал при помощи этой ссылки." + }, + "LinkInvalid": { + "key": "LinkInvalid", + "value": "Некорректное имя." + }, + "LinkInvalidLong": { + "key": "LinkInvalidLong", + "value": "Имя не может быть длиннее 32 символов." + }, + "LinkInvalidShort": { + "key": "LinkInvalidShort", + "value": "Короткие имена должны содержать не меньше 5 символов." + }, + "LinkInvalidShortMega": { + "key": "LinkInvalidShortMega", + "value": "Имена групп должны содержать не меньше 5 символов." + }, + "LinkInvalidStartNumber": { + "key": "LinkInvalidStartNumber", + "value": "Имя канала не может начинаться с цифры." + }, + "LinkInvalidStartNumberMega": { + "key": "LinkInvalidStartNumberMega", + "value": "Имена групп не могут начинаться с цифры." + }, + "LinkIsExpired": { + "key": "LinkIsExpired", + "value": "Срок действия этой ссылки истёк." + }, + "LinkIsExpiredLimitReached": { + "key": "LinkIsExpiredLimitReached", + "value": "Ссылка достигла лимита на использование." + }, + "LinkIsNoActive": { + "key": "LinkIsNoActive", + "value": "Ссылка больше не активна" + }, + "LinkLimitReached": { + "key": "LinkLimitReached", + "value": "Достигнут лимит" + }, + "LinkNotFound": { + "key": "LinkNotFound", + "value": "К сожалению, Вы не состоите в чате, где было опубликовано это сообщение." + }, + "LinkPreview": { + "key": "LinkPreview", + "value": "Предпросмотр ссылки" + }, + "LinkedChannel": { + "key": "LinkedChannel", + "value": "Привязанный канал" + }, + "Links": { + "key": "Links", + "zeroValue": null, + "oneValue": "%1$d ссылка", + "twoValue": null, + "fewValue": "%1$d ссылки", + "manyValue": "%1$d ссылок", + "otherValue": "%1$d ссылок" + }, + "LinksCreatedByOtherAdmins": { + "key": "LinksCreatedByOtherAdmins", + "value": "Ссылки других администраторов" + }, + "LinksCreatedByThisAdmin": { + "key": "LinksCreatedByThisAdmin", + "value": "Ссылки, созданные администратором" + }, + "LinksTitle": { + "key": "LinksTitle", + "value": "Общие ссылки" + }, + "Listening": { + "key": "Listening", + "value": "слушает" + }, + "LiveLocationAlertGroup": { + "key": "LiveLocationAlertGroup", + "value": "Выберите, как долго участники этого чата смогут видеть, где Вы находитесь." + }, + "LiveLocationAlertPrivate": { + "key": "LiveLocationAlertPrivate", + "value": "Укажите, в течение какого времени %1$s будет видеть Ваше актуальное местоположение." + }, + "LiveLocationContext": { + "key": "LiveLocationContext", + "value": "Трансляция геопозиции" + }, + "LiveLocations": { + "key": "LiveLocations", + "value": "Трансляции геопозиции" + }, + "Loading": { + "key": "Loading", + "value": "Загрузка..." + }, + "LoadingFullImage": { + "key": "LoadingFullImage", + "value": "загрузка в полном размере..." + }, + "LoadingStats": { + "key": "LoadingStats", + "value": "Загрузка статистики..." + }, + "LoadingStatsDescription": { + "key": "LoadingStatsDescription", + "value": "Создание графиков может занять некоторое время." + }, + "LocalAudioCache": { + "key": "LocalAudioCache", + "value": "Аудио/видеосообщения" + }, + "LocalCache": { + "key": "LocalCache", + "value": "Другие файлы" + }, + "LocalDatabase": { + "key": "LocalDatabase", + "value": "Локальная база данных" + }, + "LocalDatabaseClear": { + "key": "LocalDatabaseClear", + "value": "Очистить кэш текстовых сообщений?" + }, + "LocalDatabaseClearText": { + "key": "LocalDatabaseClearText", + "value": "Вы точно хотите очистить кэш текстовых сообщений?" + }, + "LocalDatabaseClearTextTitle": { + "key": "LocalDatabaseClearTextTitle", + "value": "Очистить базу данных" + }, + "LocalDatabaseInfo": { + "key": "LocalDatabaseInfo", + "value": "Очистка локальной базы данных удалит кэш сообщений и сожмёт базу данных для экономии места на внутреннем накопителе. Некоторые данные нужны для работы Telegram, поэтому размер базы данных останется больше нуля.\n\nЭта операция может занять несколько минут." + }, + "LocalDatabaseSize": { + "key": "LocalDatabaseSize", + "value": "%s — база данных приложения" + }, + "LocalDocumentCache": { + "key": "LocalDocumentCache", + "value": "Файлы" + }, + "LocalGifCache": { + "key": "LocalGifCache", + "value": "GIF" + }, + "LocalMusicCache": { + "key": "LocalMusicCache", + "value": "Музыка" + }, + "LocalPhotoCache": { + "key": "LocalPhotoCache", + "value": "Фото" + }, + "LocalVideoCache": { + "key": "LocalVideoCache", + "value": "Видео" + }, + "LocatedChannelsTooMuch": { + "key": "LocatedChannelsTooMuch", + "value": "У этого пользователя максимальное число групп с геопозицией. Пожалуйста, предложите ему сперва удалить или передать кому-либо одну из его групп." + }, + "LocationNotifiation": { + "key": "LocationNotifiation", + "value": "Уведомление" + }, + "LocationNotifiationButton": { + "key": "LocationNotifiationButton", + "value": "Оповестить в радиусе %1$s" + }, + "LocationNotifiationButtonGroup": { + "key": "LocationNotifiationButtonGroup", + "value": "Оповестить, если кто-либо находится в радиусе %1$s" + }, + "LocationNotifiationButtonUser": { + "key": "LocationNotifiationButtonUser", + "value": "Оповестить, если %1$s ближе %2$s" + }, + "LocationNotifiationCloser": { + "key": "LocationNotifiationCloser", + "value": "Вы уже находитесь ближе, чем %1$s" + }, + "LocationUpdated": { + "key": "LocationUpdated", + "value": "обновлена" + }, + "LocationUpdatedFormatted": { + "key": "LocationUpdatedFormatted", + "value": "обновлено %1$s" + }, + "LocationUpdatedJustNow": { + "key": "LocationUpdatedJustNow", + "value": "обновлена только что" + }, + "LogOut": { + "key": "LogOut", + "value": "Выход" + }, + "LogOutInfo": { + "key": "LogOutInfo", + "value": "При выходе из аккаунта секретные чаты на этом устройстве пропадут." + }, + "LogOutTitle": { + "key": "LogOutTitle", + "value": "Выход" + }, + "LoginAttempts": { + "key": "LoginAttempts", + "value": "Незавершенные попытки входа" + }, + "LoginAttemptsInfo": { + "key": "LoginAttemptsInfo", + "value": "С этих устройств нет доступа к Вашему аккаунту. Код для входа был введен верно, но правильный пароль указан не был." + }, + "LoginPassword": { + "key": "LoginPassword", + "value": "Пароль" + }, + "LoginPasswordText": { + "key": "LoginPasswordText", + "value": "Вы включили двухэтапную аутентификацию. Теперь Ваш аккаунт защищён дополнительным паролем." + }, + "Long": { + "key": "Long", + "value": "Долгий" + }, + "LoopAnimatedStickers": { + "key": "LoopAnimatedStickers", + "value": "Зациклить анимацию" + }, + "LoopAnimatedStickersInfo": { + "key": "LoopAnimatedStickersInfo", + "value": "Анимированные стикеры будут проигрываться без остановки." + }, + "LowDiskSpaceMessage": { + "key": "LowDiskSpaceMessage", + "value": "В устройстве почти не осталось места. Чтобы освободить немного места, разрешите Telegram хранить в кэше только недавние медиафайлы." + }, + "LowDiskSpaceNeverRemove": { + "key": "LowDiskSpaceNeverRemove", + "value": "Никогда не удалять" + }, + "LowDiskSpaceTitle": { + "key": "LowDiskSpaceTitle", + "value": "Внимание" + }, + "LowDiskSpaceTitle2": { + "key": "LowDiskSpaceTitle2", + "value": "Удалять медиа старше" + }, + "MainChannelProfilePhotoSetHint": { + "key": "MainChannelProfilePhotoSetHint", + "value": "Теперь это основная фотография канала." + }, + "MainChannelProfileVideoSetHint": { + "key": "MainChannelProfileVideoSetHint", + "value": "Теперь это основное видео канала." + }, + "MainGroupProfilePhotoSetHint": { + "key": "MainGroupProfilePhotoSetHint", + "value": "Теперь это основная фотография группы." + }, + "MainGroupProfileVideoSetHint": { + "key": "MainGroupProfileVideoSetHint", + "value": "Теперь это основное видео группы." + }, + "MainProfilePhotoSetHint": { + "key": "MainProfilePhotoSetHint", + "value": "Теперь это Ваша основная фотография." + }, + "MainProfileVideoSetHint": { + "key": "MainProfileVideoSetHint", + "value": "Теперь это Ваше основное видео." + }, + "MakeAdmin": { + "key": "MakeAdmin", + "value": "НАЗНАЧИТЬ" + }, + "MakeMyselfVisible": { + "key": "MakeMyselfVisible", + "value": "Показывать меня здесь" + }, + "MakeMyselfVisibleInfo": { + "key": "MakeMyselfVisibleInfo", + "value": "Те, кто находится рядом с Вами, смогут увидеть Ваш профиль и написать Вам. Это поможет найти новых друзей, но может и привлечь излишнее внимание. Вы можете отключить эту функцию в любой момент.\n\nВаш номер телефона по-прежнему не будет виден." + }, + "MakeMyselfVisibleTitle": { + "key": "MakeMyselfVisibleTitle", + "value": "Показывать профиль" + }, + "ManageChannel": { + "key": "ManageChannel", + "value": "Управление каналом" + }, + "ManageChannelMenu": { + "key": "ManageChannelMenu", + "value": "Управление каналом" + }, + "ManageGroup": { + "key": "ManageGroup", + "value": "Управление группой" + }, + "ManageGroupMenu": { + "key": "ManageGroupMenu", + "value": "Управление группой" + }, + "ManageInviteLinks": { + "key": "ManageInviteLinks", + "value": "Управление приглашениями" + }, + "ManageLinksInfoHelp": { + "key": "ManageLinksInfoHelp", + "value": "Вы можете создать дополнительные ссылки и задать для них срок действия или ограничение на число использований." + }, + "Map": { + "key": "Map", + "value": "Карта" + }, + "MapPreviewProvider": { + "key": "MapPreviewProvider", + "value": "Предпросмотр карты" + }, + "MapPreviewProviderGoogle": { + "key": "MapPreviewProviderGoogle", + "value": "Google" + }, + "MapPreviewProviderNobody": { + "key": "MapPreviewProviderNobody", + "value": "Не использовать" + }, + "MapPreviewProviderTelegram": { + "key": "MapPreviewProviderTelegram", + "value": "Telegram" + }, + "MapPreviewProviderTitle": { + "key": "MapPreviewProviderTitle", + "value": "Предпросмотр карты" + }, + "MapPreviewProviderYandex": { + "key": "MapPreviewProviderYandex", + "value": "Yandex" + }, + "March": { + "key": "March", + "value": "Март" + }, + "MarkAllAsRead": { + "key": "MarkAllAsRead", + "value": "Прочитать все" + }, + "MarkAsRead": { + "key": "MarkAsRead", + "value": "Пометить как прочитанное" + }, + "MarkAsUnread": { + "key": "MarkAsUnread", + "value": "Пометить как непрочитанное" + }, + "Masks": { + "key": "Masks", + "value": "Маски" + }, + "MasksArchived": { + "key": "MasksArchived", + "value": "Маски архивированы." + }, + "MasksArchivedInfo": { + "key": "MasksArchivedInfo", + "value": "Набор %1$s перемещён в архив." + }, + "MasksCount": { + "key": "MasksCount", + "zeroValue": null, + "oneValue": "%1$d маска", + "twoValue": null, + "fewValue": "%1$d маски", + "manyValue": "%1$d масок", + "otherValue": "%1$d масок" + }, + "MasksInfo": { + "key": "MasksInfo", + "value": "Вы можете добавлять маски на отправляемые фото. Для этого перед отправкой откройте фоторедактор." + }, + "MasksRemoved": { + "key": "MasksRemoved", + "value": "Маски удалены" + }, + "MasksRemovedInfo": { + "key": "MasksRemovedInfo", + "value": "Набор %1$s удалён из Ваших масок." + }, + "May": { + "key": "May", + "value": "Май" + }, + "Media": { + "key": "Media", + "zeroValue": null, + "oneValue": "%1$d медиафайл", + "twoValue": null, + "fewValue": "%1$d медиафайла", + "manyValue": "%1$d медиафайлов", + "otherValue": "%1$d медиафайлов" + }, + "MediaSavedHint": { + "key": "MediaSavedHint", + "zeroValue": null, + "oneValue": "%1$d медиафайл сохранён в галерею", + "twoValue": null, + "fewValue": "%1$d медиафайла сохранено в галерею", + "manyValue": "%1$d медиафайлов сохранено в галерею", + "otherValue": "%1$d медиафайла сохранено в галерею" + }, + "MediaSelected": { + "key": "MediaSelected", + "zeroValue": null, + "oneValue": "выбран %1$d медиафайл", + "twoValue": null, + "fewValue": "выбраны %1$d медиафайла", + "manyValue": "выбрано %1$d медиафайлов", + "otherValue": "выбрано %1$d медиафайлов" + }, + "MegaAddedBy": { + "key": "MegaAddedBy", + "value": "un1 добавил(а) вас в эту группу" + }, + "MegaAdminsInfo": { + "key": "MegaAdminsInfo", + "value": "Выберите помощников для управления группой. Чтобы удалить администратора, нажмите и удерживайте." + }, + "MegaDeleteAlert": { + "key": "MegaDeleteAlert", + "value": "Внимание! Удаление этой группы приведёт к исключению всех участников и потере всех сообщений. Вы точно хотите её удалить?" + }, + "MegaDeleteInfo": { + "key": "MegaDeleteInfo", + "value": "Вы потеряете все сообщения из этой группы." + }, + "MegaLeaveAlert": { + "key": "MegaLeaveAlert", + "value": "Вы точно хотите покинуть группу?" + }, + "MegaLeaveAlertWithName": { + "key": "MegaLeaveAlertWithName", + "value": "Вы точно хотите покинуть **%1$s**?" + }, + "MegaLocation": { + "key": "MegaLocation", + "value": "Группа с геопозицией" + }, + "MegaPrivate": { + "key": "MegaPrivate", + "value": "Частная группа" + }, + "MegaPrivateInfo": { + "key": "MegaPrivateInfo", + "value": "В частные группы можно вступить только по приглашению или пригласительной ссылке." + }, + "MegaPrivateLinkHelp": { + "key": "MegaPrivateLinkHelp", + "value": "По этой ссылке можно вступить в Вашу группу. Вы можете сбросить ссылку в любой момент." + }, + "MegaPublic": { + "key": "MegaPublic", + "value": "Публичная группа" + }, + "MegaPublicInfo": { + "key": "MegaPublicInfo", + "value": "Публичные группы можно найти через поиск, история чата доступна всем, и присоединиться может любой пользователь." + }, + "MegaUsernameHelp": { + "key": "MegaUsernameHelp", + "value": "Если у группы будет публичная ссылка, другие пользователи смогут найти её и присоединиться.\n\nМожно использовать латиницу (a-z), цифры (0-9) и подчёркивание. Минимальная длина — 5 символов." + }, + "Members": { + "key": "Members", + "zeroValue": null, + "oneValue": "%1$d участник", + "twoValue": null, + "fewValue": "%1$d участника", + "manyValue": "%1$d участников", + "otherValue": "%1$d участников" + }, + "MembersCount": { + "key": "MembersCount", + "value": "Выбрано %1$d из %2$d" + }, + "MembersCountSelected": { + "key": "MembersCountSelected", + "zeroValue": null, + "oneValue": "Выбрано %1$d из %2$d", + "twoValue": null, + "fewValue": "Выбрано %1$d из %2$d", + "manyValue": "Выбрано %1$d из %2$d", + "otherValue": "Выбрано %1$d из %2$d" + }, + "MembersCountZero": { + "key": "MembersCountZero", + "value": "до %1$s" + }, + "MembersLanguageChartTitle": { + "key": "MembersLanguageChartTitle", + "value": "Основной язык участников" + }, + "MembersOverviewTitle": { + "key": "MembersOverviewTitle", + "value": "Участники" + }, + "MembersTalking": { + "key": "MembersTalking", + "zeroValue": null, + "oneValue": "%1$s участник говорит", + "twoValue": null, + "fewValue": "%1$s участника говорят", + "manyValue": "%1$s участников говорят", + "otherValue": "%1$s участника говорят" + }, + "MembersTalkingNobody": { + "key": "MembersTalkingNobody", + "value": "Нажмите для участия" + }, + "Mention": { + "key": "Mention", + "value": "Упомянуть" + }, + "Message": { + "key": "Message", + "value": "Сообщение" + }, + "MessageCopied": { + "key": "MessageCopied", + "value": "Сообщение скопировано в буфер обмена." + }, + "MessageLifetime": { + "key": "MessageLifetime", + "value": "Удаление по таймеру" + }, + "MessageLifetimeChanged": { + "key": "MessageLifetimeChanged", + "value": "%1$s включил(а) удаление по таймеру через %2$s" + }, + "MessageLifetimeChangedOutgoing": { + "key": "MessageLifetimeChangedOutgoing", + "value": "Вы включили удаление по таймеру через %1$s" + }, + "MessageLifetimePhoto": { + "key": "MessageLifetimePhoto", + "value": "Если вы поставите таймер, фото автоматически удалится после просмотра." + }, + "MessageLifetimeRemoved": { + "key": "MessageLifetimeRemoved", + "value": "%1$s отключил(а) удаление по таймеру" + }, + "MessageLifetimeVideo": { + "key": "MessageLifetimeVideo", + "value": "Если вы установите таймер, видео автоматически удалится после просмотра." + }, + "MessageLifetimeYouRemoved": { + "key": "MessageLifetimeYouRemoved", + "value": "Вы отключили удаление по таймеру" + }, + "MessageNotFound": { + "key": "MessageNotFound", + "value": "Сообщение не найдено" + }, + "MessageNotifications": { + "key": "MessageNotifications", + "value": "Сообщения" + }, + "MessagePinnedHint": { + "key": "MessagePinnedHint", + "value": "Сообщение закреплено" + }, + "MessagePreview": { + "key": "MessagePreview", + "value": "Показывать текст" + }, + "MessageScheduleEditTime": { + "key": "MessageScheduleEditTime", + "value": "Изменить время" + }, + "MessageScheduleSend": { + "key": "MessageScheduleSend", + "value": "Отправить сейчас" + }, + "MessageScheduleToday": { + "key": "MessageScheduleToday", + "value": "Сегодня" + }, + "MessageScheduledBotAction": { + "key": "MessageScheduledBotAction", + "value": "Это действие будет доступно после публикации сообщения." + }, + "MessageScheduledLimitReached": { + "key": "MessageScheduledLimitReached", + "value": "Вы не можете добавить больше 100 отложенных сообщений." + }, + "MessageScheduledOn": { + "key": "MessageScheduledOn", + "value": "Отправка %1$s" + }, + "MessageScheduledReminderNotification": { + "key": "MessageScheduledReminderNotification", + "value": "📅 Напоминание" + }, + "MessageScheduledUntilOnline": { + "key": "MessageScheduledUntilOnline", + "value": "Отправка при появлении в сети" + }, + "MessageScheduledVote": { + "key": "MessageScheduledVote", + "value": "Голосование будет доступно после публикации сообщения." + }, + "MessageScheduledVoteResults": { + "key": "MessageScheduledVoteResults", + "value": "Результаты опроса будут доступны после его публикации." + }, + "MessageUnpinnedHint": { + "key": "MessageUnpinnedHint", + "value": "Сообщение откреплено" + }, + "MessagesChartTitle": { + "key": "MessagesChartTitle", + "value": "Сообщения" + }, + "MessagesDataUsage": { + "key": "MessagesDataUsage", + "value": "Сообщения и прочие данные" + }, + "MessagesDeletedHint": { + "key": "MessagesDeletedHint", + "zeroValue": null, + "oneValue": "%1$d сообщение удалено", + "twoValue": null, + "fewValue": "%1$d сообщения удалены", + "manyValue": "%1$d сообщений удалены", + "otherValue": "%1$d сообщения удалено" + }, + "MessagesOverview": { + "key": "MessagesOverview", + "value": "Сообщения" + }, + "MessagesSettings": { + "key": "MessagesSettings", + "value": "Сообщения" + }, + "MessagesUnpinned": { + "key": "MessagesUnpinned", + "zeroValue": null, + "oneValue": "%1$d сообщение откреплено", + "twoValue": null, + "fewValue": "%1$d сообщения откреплено", + "manyValue": "%1$d сообщений откреплено", + "otherValue": "%1$d сообщений откреплено" + }, + "Meters": { + "key": "Meters", + "zeroValue": null, + "oneValue": "%1$d метра", + "twoValue": null, + "fewValue": "%1$d метров", + "manyValue": "%1$d метров", + "otherValue": "%1$d метров" + }, + "MetersAway": { + "key": "MetersAway", + "value": "м отсюда" + }, + "MetersAway2": { + "key": "MetersAway2", + "value": "%1$s м отсюда" + }, + "MetersFromYou2": { + "key": "MetersFromYou2", + "value": "%1$s м от вас" + }, + "MetersShort": { + "key": "MetersShort", + "value": "%1$s м" + }, + "Mi": { + "key": "Mi", + "value": "мл" + }, + "MilesAway": { + "key": "MilesAway", + "value": "%1$s мл отсюда" + }, + "MilesFromYou": { + "key": "MilesFromYou", + "value": "%1$s милях от Вас" + }, + "MilesShort": { + "key": "MilesShort", + "value": "%1$s мл" + }, + "Minutes": { + "key": "Minutes", + "zeroValue": null, + "oneValue": "%1$d мин.", + "twoValue": null, + "fewValue": "%1$d мин.", + "manyValue": "%1$d мин.", + "otherValue": "%1$d мин." + }, + "MinutesBold": { + "key": "MinutesBold", + "zeroValue": null, + "oneValue": "**%1$d** минута", + "twoValue": null, + "fewValue": "**%1$d** минуты", + "manyValue": "**%1$d** минут", + "otherValue": "**%1$d** минут" + }, + "MobileHidden": { + "key": "MobileHidden", + "value": "Номер скрыт" + }, + "MobileHiddenExceptionInfo": { + "key": "MobileHiddenExceptionInfo", + "value": "Номер телефона будет виден, когда %1$s добавит Вас в контакты." + }, + "MobileUsage": { + "key": "MobileUsage", + "value": "Использование мобильной сети" + }, + "MobileVisibleInfo": { + "key": "MobileVisibleInfo", + "value": "Когда Вы нажмёте **ГОТОВО**, %1$s начнёт видеть Ваш номер телефона." + }, + "Mono": { + "key": "Mono", + "value": "Моно" + }, + "Months": { + "key": "Months", + "zeroValue": null, + "oneValue": "%1$d месяц", + "twoValue": null, + "fewValue": "%1$d месяца", + "manyValue": "%1$d месяцев", + "otherValue": "%1$d месяцев" + }, + "MoreInfo": { + "key": "MoreInfo", + "value": "Больше информации" + }, + "MusicFiles": { + "key": "MusicFiles", + "zeroValue": null, + "oneValue": "%1$d файл с музыкой", + "twoValue": null, + "fewValue": "%1$d файла с музыкой", + "manyValue": "%1$d файлов с музыкой", + "otherValue": "%1$d файлов с музыкой" + }, + "MusicInfo": { + "key": "MusicInfo", + "value": "Для отправки музыки" + }, + "MuteDisable": { + "key": "MuteDisable", + "value": "Отключить" + }, + "MuteFor": { + "key": "MuteFor", + "value": "Отключить на %1$s" + }, + "MuteNotifications": { + "key": "MuteNotifications", + "value": "Отключить уведомления" + }, + "NearbyCreateGroup": { + "key": "NearbyCreateGroup", + "value": "Локальная группа" + }, + "NearbyCreateGroupInfo": { + "key": "NearbyCreateGroupInfo", + "value": "Все, кто находится рядом (соседи, коллеги, сокурсники, участники мероприятия), будут видеть группу в разделе «Люди рядом»." + }, + "NearbyCreateGroupInfo2": { + "key": "NearbyCreateGroupInfo2", + "value": "Если группа не относится к выбранному месту, Вы рискуете потерять возможность создавать группы с геопозицией." + }, + "NearbyPeopleGreetingsDescription": { + "key": "NearbyPeopleGreetingsDescription", + "value": "Отправьте сообщение или нажмите на приветствие ниже, чтобы начать общение." + }, + "NearbyPeopleGreetingsMessage": { + "key": "NearbyPeopleGreetingsMessage", + "value": "%1$s в %2$s" + }, + "NearbyPlaces": { + "key": "NearbyPlaces", + "value": "Или выберите место" + }, + "NearbyStartGroup": { + "key": "NearbyStartGroup", + "value": "Создать группу" + }, + "NearbyVenue": { + "key": "NearbyVenue", + "value": "Или выберите место" + }, + "NetworkUsage": { + "key": "NetworkUsage", + "value": "Использование трафика" + }, + "NetworkUsageMobile": { + "key": "NetworkUsageMobile", + "value": "МОБ. СЕТЬ" + }, + "NetworkUsageMobileTab": { + "key": "NetworkUsageMobileTab", + "value": "Мобильный" + }, + "NetworkUsageRoaming": { + "key": "NetworkUsageRoaming", + "value": "РОУМИНГ" + }, + "NetworkUsageRoamingTab": { + "key": "NetworkUsageRoamingTab", + "value": "Роуминг" + }, + "NetworkUsageSince": { + "key": "NetworkUsageSince", + "value": "Использование сети с %1$s" + }, + "NetworkUsageWiFi": { + "key": "NetworkUsageWiFi", + "value": "WI-FI" + }, + "NetworkUsageWiFiTab": { + "key": "NetworkUsageWiFiTab", + "value": "Wi-Fi" + }, + "NeverAllow": { + "key": "NeverAllow", + "value": "Всегда запрещать" + }, + "NeverAllowPlaceholder": { + "key": "NeverAllowPlaceholder", + "value": "Всегда запрещать..." + }, + "NeverShareWith": { + "key": "NeverShareWith", + "value": "Всегда скрывать" + }, + "NeverShareWithPlaceholder": { + "key": "NeverShareWithPlaceholder", + "value": "Всегда скрывать от пользователей..." + }, + "NeverShareWithTitle": { + "key": "NeverShareWithTitle", + "value": "Всегда скрывать" + }, + "NewBroadcastList": { + "key": "NewBroadcastList", + "value": "Новый список рассылки" + }, + "NewChannel": { + "key": "NewChannel", + "value": "Создать канал" + }, + "NewChatsFromNonContacts": { + "key": "NewChatsFromNonContacts", + "value": "Новые чаты с незнакомцами" + }, + "NewContact": { + "key": "NewContact", + "value": "Новый контакт" + }, + "NewContactAlertButton": { + "key": "NewContactAlertButton", + "value": "Добавить контакт" + }, + "NewContactAlertMessage": { + "key": "NewContactAlertMessage", + "value": "Номера телефона **%1$s** нет в Вашем списке контактов. Добавить его?" + }, + "NewContactAlertTitle": { + "key": "NewContactAlertTitle", + "value": "Новый контакт" + }, + "NewConversationShortcut": { + "key": "NewConversationShortcut", + "value": "Новая беседа" + }, + "NewFollowersBySourceChartTitle": { + "key": "NewFollowersBySourceChartTitle", + "value": "Источники новых подписчиков" + }, + "NewGroup": { + "key": "NewGroup", + "value": "Создать группу" + }, + "NewLink": { + "key": "NewLink", + "value": "Новая ссылка" + }, + "NewMembersBySourceChartTitle": { + "key": "NewMembersBySourceChartTitle", + "value": "Источники участников" + }, + "NewMessageTitle": { + "key": "NewMessageTitle", + "value": "Новое сообщение" + }, + "NewMessages": { + "key": "NewMessages", + "zeroValue": null, + "oneValue": "%1$d новое сообщение", + "twoValue": null, + "fewValue": "%1$d новых сообщения", + "manyValue": "%1$d новых сообщений", + "otherValue": "%1$d новых сообщений" + }, + "NewPoll": { + "key": "NewPoll", + "value": "Новый опрос" + }, + "NewQuiz": { + "key": "NewQuiz", + "value": "Новая викторина" + }, + "NewSecretChat": { + "key": "NewSecretChat", + "value": "Создать секретный чат" + }, + "NewTheme": { + "key": "NewTheme", + "value": "Новая цветовая тема" + }, + "NewThemePreviewLine1": { + "key": "NewThemePreviewLine1", + "value": "Знаешь, который час?" + }, + "NewThemePreviewLine2": { + "key": "NewThemePreviewLine2", + "value": "В Токио утро 😎" + }, + "NewThemePreviewLine3": { + "key": "NewThemePreviewLine3", + "value": "В *Токио* утро 😎" + }, + "NewThemePreviewName": { + "key": "NewThemePreviewName", + "value": "Боб Харрис" + }, + "NewThemePreviewReply": { + "key": "NewThemePreviewReply", + "value": "Доброе утро! 👋" + }, + "NewThemePreviewReply2": { + "key": "NewThemePreviewReply2", + "value": "Доброе утро" + }, + "NewThemeTitle": { + "key": "NewThemeTitle", + "value": "Новая тема" + }, + "Next": { + "key": "Next", + "value": "Далее" + }, + "NoAudio": { + "key": "NoAudio", + "value": "Чтобы видеть здесь файлы с музыкой, добавьте их в библиотеку на своем устройстве." + }, + "NoAudioFiles": { + "key": "NoAudioFiles", + "value": "Аудиофайлов нет" + }, + "NoAudioFilesInfo": { + "key": "NoAudioFilesInfo", + "value": "В Вашей библиотеке нет музыки" + }, + "NoAudioFound": { + "key": "NoAudioFound", + "value": "Ничего не найдено" + }, + "NoAudioFoundInfo": { + "key": "NoAudioFoundInfo", + "value": "По запросу **%1$s** в Вашей музыкальной библиотеке ничего не найдено." + }, + "NoAudioFoundPlayerInfo": { + "key": "NoAudioFoundPlayerInfo", + "value": "По **%1$s** ничего не найдено." + }, + "NoBlocked": { + "key": "NoBlocked", + "value": "Заблокированных пользователей пока нет" + }, + "NoBlockedChannel": { + "key": "NoBlockedChannel", + "value": "Заблокированные пользователи удалены из канала и могут вернуться обратно только по приглашению администратора. Пригласительные ссылки для них не работают." + }, + "NoBlockedChannel2": { + "key": "NoBlockedChannel2", + "value": "Пользователи, которых исключили администраторы канала, не смогут присоединиться снова с помощью ссылки." + }, + "NoBlockedGroup": { + "key": "NoBlockedGroup", + "value": "Заблокированные пользователи удалены из группы и могут вернуться только по приглашению администратора. Пригласительные ссылки для них не работают." + }, + "NoBlockedGroup2": { + "key": "NoBlockedGroup2", + "value": "Пользователи, которых исключили администраторы группы, не смогут присоединиться снова с помощью ссылки." + }, + "NoBlockedUsers": { + "key": "NoBlockedUsers", + "value": "Нет пользователей в чёрном списке" + }, + "NoCallLog": { + "key": "NoCallLog", + "value": "Вы пока никому не звонили." + }, + "NoChats": { + "key": "NoChats", + "value": "Добро пожаловать" + }, + "NoChatsContactsHelp": { + "key": "NoChatsContactsHelp", + "value": "Чтобы начать переписку, нажмите на один из контактов ниже." + }, + "NoChatsHelp": { + "key": "NoChatsHelp", + "value": "Чтобы написать сообщение, нажмите на значок карандаша в правом нижнем углу." + }, + "NoComments": { + "key": "NoComments", + "value": "Комментариев пока нет..." + }, + "NoContacts": { + "key": "NoContacts", + "value": "Контактов пока нет" + }, + "NoContactsYet": { + "key": "NoContactsYet", + "value": "У Вас пока нет контактов" + }, + "NoContactsYetLine1": { + "key": "NoContactsYetLine1", + "value": "Пригласите друзей в Telegram" + }, + "NoContactsYetLine2": { + "key": "NoContactsYetLine2", + "value": "Попробуйте найти людей рядом" + }, + "NoContactsYetLine3": { + "key": "NoContactsYetLine3", + "value": "Введите в поиске имя пользователя" + }, + "NoEmojiFound": { + "key": "NoEmojiFound", + "value": "Эмодзи не найдены" + }, + "NoExceptions": { + "key": "NoExceptions", + "value": "В этом разделе будут показаны все чаты с особыми настройками уведомлений.\n\nЧтобы задать свои настройки для чата, откройте профиль чата > Уведомления." + }, + "NoFilesFound": { + "key": "NoFilesFound", + "value": "Ничего не найдено" + }, + "NoFilesFoundInfo": { + "key": "NoFilesFoundInfo", + "value": "В выбранной папке ничего не найдено по запросу **%1$s**." + }, + "NoFilesInfo": { + "key": "NoFilesInfo", + "value": "Эта папка пустая." + }, + "NoGIFs": { + "key": "NoGIFs", + "value": "Нет GIF" + }, + "NoGIFsFound": { + "key": "NoGIFsFound", + "value": "GIF не найдены" + }, + "NoGroupsInCommon": { + "key": "NoGroupsInCommon", + "value": "Общих групп пока нет" + }, + "NoHandleAppInstalled": { + "key": "NoHandleAppInstalled", + "value": "У вас нет приложения для работы с файлами типа «%1$s», пожалуйста, установите его, чтобы продолжить" + }, + "NoLimit": { + "key": "NoLimit", + "value": "∞" + }, + "NoMailInstalled": { + "key": "NoMailInstalled", + "value": "Пожалуйста, отправьте нам письмо с описанием Вашей проблемы на sms@stel.com." + }, + "NoMasks": { + "key": "NoMasks", + "value": "Масок пока нет" + }, + "NoMedia": { + "key": "NoMedia", + "value": "Поделитесь фото и видео в этом чате, и они будут доступны Вам с любого устройства." + }, + "NoMediaAutoDownload": { + "key": "NoMediaAutoDownload", + "value": "Не загружать" + }, + "NoMediaSecret": { + "key": "NoMediaSecret", + "value": "Здесь будут отображаться фото и видео из этого чата." + }, + "NoMessages": { + "key": "NoMessages", + "value": "Здесь пока ничего нет…" + }, + "NoMessagesGreetingsDescription": { + "key": "NoMessagesGreetingsDescription", + "value": "Отправьте сообщение или нажмите на приветствие ниже." + }, + "NoOneJoined": { + "key": "NoOneJoined", + "value": "Нет вступлений" + }, + "NoOneJoinedYet": { + "key": "NoOneJoinedYet", + "value": "Вступлений пока нет" + }, + "NoOtherSessions": { + "key": "NoOtherSessions", + "value": "Нет других активных сеансов" + }, + "NoOtherSessionsInfo": { + "key": "NoOtherSessionsInfo", + "value": "Вы можете войти в Telegram с другого смартфона, планшета или компьютера, используя тот же номер телефона. Все данные будут мгновенно синхронизированы." + }, + "NoOtherWebSessions": { + "key": "NoOtherWebSessions", + "value": "Нет активных авторизаций." + }, + "NoOtherWebSessionsInfo": { + "key": "NoOtherWebSessionsInfo", + "value": "Вы можете использовать свой аккаунт для авторизации на сайтах, которые поддерживают вход через Telegram." + }, + "NoPhotos": { + "key": "NoPhotos", + "value": "Фотографий пока нет" + }, + "NoPlacesFound": { + "key": "NoPlacesFound", + "value": "Не найдено мест" + }, + "NoPlacesFoundInfo": { + "key": "NoPlacesFoundInfo", + "value": "Нет совпадений с **%1$s** рядом с вами." + }, + "NoPlayerInstalled": { + "key": "NoPlayerInstalled", + "value": "У вас нет видеоплеера, пожалуйста, установите его для продолжения" + }, + "NoPopup": { + "key": "NoPopup", + "value": "Не показывать" + }, + "NoRecent": { + "key": "NoRecent", + "value": "Нет недавних" + }, + "NoRecentGIFs": { + "key": "NoRecentGIFs", + "value": "Нет недавних GIF" + }, + "NoRecentPhotos": { + "key": "NoRecentPhotos", + "value": "Нет недавних фотографий" + }, + "NoRecentSearches": { + "key": "NoRecentSearches", + "value": "Нет недавних запросов" + }, + "NoReplies": { + "key": "NoReplies", + "value": "Ответов пока нет..." + }, + "NoResult": { + "key": "NoResult", + "value": "Нет результатов" + }, + "NoScheduledMessages": { + "key": "NoScheduledMessages", + "value": "Здесь пока нет отложенных сообщений..." + }, + "NoSharedAudio": { + "key": "NoSharedAudio", + "value": "Делитесь музыкой в этом чате, и она будет доступна Вам с любого устройства." + }, + "NoSharedAudioSecret": { + "key": "NoSharedAudioSecret", + "value": "Здесь будет отображаться музыка из этого чата." + }, + "NoSharedFiles": { + "key": "NoSharedFiles", + "value": "Поделитесь файлами и документами в этом чате, и они будут доступны Вам с любого устройства." + }, + "NoSharedFilesSecret": { + "key": "NoSharedFilesSecret", + "value": "Здесь будут отображаться файлы и документы из этого чата." + }, + "NoSharedGifSecret": { + "key": "NoSharedGifSecret", + "value": "Здесь будут отображаться GIF из этого чата." + }, + "NoSharedLinks": { + "key": "NoSharedLinks", + "value": "Поделитесь ссылками в этом чате, и они будут доступны Вам с любого устройства." + }, + "NoSharedLinksSecret": { + "key": "NoSharedLinksSecret", + "value": "Здесь будут отображаться общие ссылки из этого чата." + }, + "NoSharedVoice": { + "key": "NoSharedVoice", + "value": "Поделитесь голосовыми сообщениями в этом чате, и они будут доступны Вам с любого устройства." + }, + "NoSharedVoiceSecret": { + "key": "NoSharedVoiceSecret", + "value": "Здесь будут отображаться голосовые сообщения из этого чата." + }, + "NoSound": { + "key": "NoSound", + "value": "Без звука" + }, + "NoStickers": { + "key": "NoStickers", + "value": "Стикеров пока нет" + }, + "NoStickersFound": { + "key": "NoStickersFound", + "value": "Стикеры не найдены" + }, + "NoUsernameFound": { + "key": "NoUsernameFound", + "value": "Нет аккаунта Telegram с таким именем пользователя." + }, + "NoVotes": { + "key": "NoVotes", + "value": "Нет голосов" + }, + "NoVotesQuiz": { + "key": "NoVotesQuiz", + "value": "Ответов пока нет" + }, + "NobodyLikesSpam1": { + "key": "NobodyLikesSpam1", + "value": "К сожалению, в данный момент Вы можете отправлять сообщения только взаимным контактам." + }, + "NobodyLikesSpam2": { + "key": "NobodyLikesSpam2", + "value": "Вы можете добавлять в группы только тех, кто добавил ваш номер в контакты." + }, + "NobodyLikesSpam3": { + "key": "NobodyLikesSpam3", + "value": "К сожалению, в данный момент Вы не можете отправлять сообщения в публичные группы." + }, + "NotMounted": { + "key": "NotMounted", + "value": "Нет подключения к хранилищу" + }, + "NotificationActionPinnedContact": { + "key": "NotificationActionPinnedContact", + "value": "%1$s закрепил(а) контакт в группе %2$s" + }, + "NotificationActionPinnedContact2": { + "key": "NotificationActionPinnedContact2", + "value": "%1$s закрепил(а) контакт %3$s в группе «%2$s»" + }, + "NotificationActionPinnedContactChannel": { + "key": "NotificationActionPinnedContactChannel", + "value": "%1$s закрепил(а) контакт" + }, + "NotificationActionPinnedContactChannel2": { + "key": "NotificationActionPinnedContactChannel2", + "value": "%1$s закрепил(а) контакт %2$s" + }, + "NotificationActionPinnedContactUser": { + "key": "NotificationActionPinnedContactUser", + "value": "%1$s закрепил(а) контакт %2$s" + }, + "NotificationActionPinnedFile": { + "key": "NotificationActionPinnedFile", + "value": "%1$s закрепил(а) файл в группе %2$s" + }, + "NotificationActionPinnedFileChannel": { + "key": "NotificationActionPinnedFileChannel", + "value": "%1$s закрепил(а) файл" + }, + "NotificationActionPinnedFileUser": { + "key": "NotificationActionPinnedFileUser", + "value": "%1$s закрепил(а) файл" + }, + "NotificationActionPinnedGame": { + "key": "NotificationActionPinnedGame", + "value": "%1$s закрепил(а) игру в группе %2$s" + }, + "NotificationActionPinnedGameChannel": { + "key": "NotificationActionPinnedGameChannel", + "value": "%1$s закрепил(а) игру" + }, + "NotificationActionPinnedGameScore": { + "key": "NotificationActionPinnedGameScore", + "value": "%1$s закрепил(а) счёт игры в группе «%2$s»" + }, + "NotificationActionPinnedGameScoreChannel": { + "key": "NotificationActionPinnedGameScoreChannel", + "value": "%1$s закрепил(а) очки в игре" + }, + "NotificationActionPinnedGameScoreUser": { + "key": "NotificationActionPinnedGameScoreUser", + "value": "%1$s закрепил(а) очки в игре" + }, + "NotificationActionPinnedGameUser": { + "key": "NotificationActionPinnedGameUser", + "value": "%1$s закрепил(а) игру" + }, + "NotificationActionPinnedGeo": { + "key": "NotificationActionPinnedGeo", + "value": "%1$s закрепил(а) карту в группе %2$s" + }, + "NotificationActionPinnedGeoChannel": { + "key": "NotificationActionPinnedGeoChannel", + "value": "%1$s закрепил(а) карту" + }, + "NotificationActionPinnedGeoLive": { + "key": "NotificationActionPinnedGeoLive", + "value": "%1$s закрепил(а) трансляцию геопозиции в группе %2$s" + }, + "NotificationActionPinnedGeoLiveChannel": { + "key": "NotificationActionPinnedGeoLiveChannel", + "value": "%1$@ закрепил(а) трансляцию геопозиции" + }, + "NotificationActionPinnedGeoLiveUser": { + "key": "NotificationActionPinnedGeoLiveUser", + "value": "%1$s закрепил(а) трансляцию геопозиции" + }, + "NotificationActionPinnedGeoUser": { + "key": "NotificationActionPinnedGeoUser", + "value": "%1$s закрепил(а) карту" + }, + "NotificationActionPinnedGif": { + "key": "NotificationActionPinnedGif", + "value": "%1$s закрепил(а) GIF в группе %2$s" + }, + "NotificationActionPinnedGifChannel": { + "key": "NotificationActionPinnedGifChannel", + "value": "%1$s закрепил(а) GIF" + }, + "NotificationActionPinnedGifUser": { + "key": "NotificationActionPinnedGifUser", + "value": "%1$s закрепил(а) GIF" + }, + "NotificationActionPinnedInvoice": { + "key": "NotificationActionPinnedInvoice", + "value": "%1$s закрепил(а) счёт в «%2$s»" + }, + "NotificationActionPinnedInvoiceChannel": { + "key": "NotificationActionPinnedInvoiceChannel", + "value": "%1$s закрепил(а) счёт" + }, + "NotificationActionPinnedInvoiceUser": { + "key": "NotificationActionPinnedInvoiceUser", + "value": "%1$s закрепил(а) счёт" + }, + "NotificationActionPinnedMusic": { + "key": "NotificationActionPinnedMusic", + "value": "%1$s закрепил(а) аудиофайл в группе %2$s" + }, + "NotificationActionPinnedMusicChannel": { + "key": "NotificationActionPinnedMusicChannel", + "value": "%1$s закрепил(а) аудиофайл" + }, + "NotificationActionPinnedMusicUser": { + "key": "NotificationActionPinnedMusicUser", + "value": "%1$s закрепил(а) аудиофайл" + }, + "NotificationActionPinnedNoText": { + "key": "NotificationActionPinnedNoText", + "value": "%1$s закрепил(а) сообщение в «%2$s»" + }, + "NotificationActionPinnedNoTextChannel": { + "key": "NotificationActionPinnedNoTextChannel", + "value": "%1$s закрепил(а) сообщение" + }, + "NotificationActionPinnedNoTextUser": { + "key": "NotificationActionPinnedNoTextUser", + "value": "%1$s закрепил(а) сообщение" + }, + "NotificationActionPinnedPhoto": { + "key": "NotificationActionPinnedPhoto", + "value": "%1$s закрепил(а) фото в группе %2$s" + }, + "NotificationActionPinnedPhotoChannel": { + "key": "NotificationActionPinnedPhotoChannel", + "value": "%1$s закрепил(а) фото" + }, + "NotificationActionPinnedPhotoUser": { + "key": "NotificationActionPinnedPhotoUser", + "value": "%1$s закрепил(а) фото" + }, + "NotificationActionPinnedPoll": { + "key": "NotificationActionPinnedPoll", + "value": "%1$s закрепил(а) опрос в группе «%2$s»" + }, + "NotificationActionPinnedPoll2": { + "key": "NotificationActionPinnedPoll2", + "value": "%1$s закрепил(а) опрос %3$s в группе «%2$s»" + }, + "NotificationActionPinnedPollChannel": { + "key": "NotificationActionPinnedPollChannel", + "value": "%1$s закрепил(а) опрос" + }, + "NotificationActionPinnedPollChannel2": { + "key": "NotificationActionPinnedPollChannel2", + "value": "%1$s закрепил(а) опрос %2$s" + }, + "NotificationActionPinnedPollUser": { + "key": "NotificationActionPinnedPollUser", + "value": "%1$s закрепил(а) опрос %2$s" + }, + "NotificationActionPinnedQuiz2": { + "key": "NotificationActionPinnedQuiz2", + "value": "%1$s закрепил(а) викторину «%3$s» в группе «%2$s»" + }, + "NotificationActionPinnedQuizChannel2": { + "key": "NotificationActionPinnedQuizChannel2", + "value": "%1$s закрепил(а) викторину «%2$s»" + }, + "NotificationActionPinnedQuizUser": { + "key": "NotificationActionPinnedQuizUser", + "value": "%1$s закрепил(а) викторину %2$s" + }, + "NotificationActionPinnedRound": { + "key": "NotificationActionPinnedRound", + "value": "%1$s закрепил(а) видеосообщение в группе %2$s" + }, + "NotificationActionPinnedRoundChannel": { + "key": "NotificationActionPinnedRoundChannel", + "value": "%1$s закрепил(а) видеосообщение" + }, + "NotificationActionPinnedRoundUser": { + "key": "NotificationActionPinnedRoundUser", + "value": "%1$s закрепил(а) видеосообщение" + }, + "NotificationActionPinnedSticker": { + "key": "NotificationActionPinnedSticker", + "value": "%1$s закрепил(а) стикер в «%2$s»" + }, + "NotificationActionPinnedStickerChannel": { + "key": "NotificationActionPinnedStickerChannel", + "value": "%1$s закрепил(а) стикер" + }, + "NotificationActionPinnedStickerEmoji": { + "key": "NotificationActionPinnedStickerEmoji", + "value": "%1$s закрепил(а) стикер %3$s в «%2$s»" + }, + "NotificationActionPinnedStickerEmojiChannel": { + "key": "NotificationActionPinnedStickerEmojiChannel", + "value": "%1$s закрепил(а) стикер %2$s" + }, + "NotificationActionPinnedStickerEmojiUser": { + "key": "NotificationActionPinnedStickerEmojiUser", + "value": "%1$s закрепил(а) стикер %2$s" + }, + "NotificationActionPinnedStickerUser": { + "key": "NotificationActionPinnedStickerUser", + "value": "%1$s закрепил(а) стикер" + }, + "NotificationActionPinnedText": { + "key": "NotificationActionPinnedText", + "value": "%1$s закрепил(а) «%2$s» в группе %3$s" + }, + "NotificationActionPinnedTextChannel": { + "key": "NotificationActionPinnedTextChannel", + "value": "%1$s закрепил(а) «%2$s»" + }, + "NotificationActionPinnedTextUser": { + "key": "NotificationActionPinnedTextUser", + "value": "%1$s закрепила(а) \"%2$s\"" + }, + "NotificationActionPinnedVideo": { + "key": "NotificationActionPinnedVideo", + "value": "%1$s закрепил(а) видео в группе %2$s" + }, + "NotificationActionPinnedVideoChannel": { + "key": "NotificationActionPinnedVideoChannel", + "value": "%1$s закрепил(а) видео" + }, + "NotificationActionPinnedVideoUser": { + "key": "NotificationActionPinnedVideoUser", + "value": "%1$s закрепил(а) видео" + }, + "NotificationActionPinnedVoice": { + "key": "NotificationActionPinnedVoice", + "value": "%1$s закрепил(а) голосовое сообщение в «%2$s»" + }, + "NotificationActionPinnedVoiceChannel": { + "key": "NotificationActionPinnedVoiceChannel", + "value": "%1$s закрепил(а) голосовое сообщение" + }, + "NotificationActionPinnedVoiceUser": { + "key": "NotificationActionPinnedVoiceUser", + "value": "%1$s закрепил(а) голосовое сообщение" + }, + "NotificationContactJoined": { + "key": "NotificationContactJoined", + "value": "%1$s теперь в Telegram!" + }, + "NotificationContactNewPhoto": { + "key": "NotificationContactNewPhoto", + "value": "%1$s обновил(а) фото профиля" + }, + "NotificationEditedGroupName": { + "key": "NotificationEditedGroupName", + "value": "%1$s переименовал(а) группу %2$s" + }, + "NotificationEditedGroupPhoto": { + "key": "NotificationEditedGroupPhoto", + "value": "%1$s изменил(а) фото группы на %2$s" + }, + "NotificationEditedGroupVideo": { + "key": "NotificationEditedGroupVideo", + "value": "%1$s изменил(а) видео группы в «%2$s»" + }, + "NotificationGroupAddMember": { + "key": "NotificationGroupAddMember", + "value": "%1$s пригласил(а) %3$s в группу %2$s" + }, + "NotificationGroupAddSelf": { + "key": "NotificationGroupAddSelf", + "value": "%1$s снова в «%2$s»" + }, + "NotificationGroupAddSelfMega": { + "key": "NotificationGroupAddSelfMega", + "value": "%1$s теперь в «%2$s»" + }, + "NotificationGroupAlbum": { + "key": "NotificationGroupAlbum", + "value": "%1$s отправил(а) альбом в группу «%2$s»" + }, + "NotificationGroupCreatedCall": { + "key": "NotificationGroupCreatedCall", + "value": "%1$s начал(а) голосовой чат в %2$s" + }, + "NotificationGroupEndedCall": { + "key": "NotificationGroupEndedCall", + "value": "%1$s завершил(а) голосовой чат в %2$s" + }, + "NotificationGroupFew": { + "key": "NotificationGroupFew", + "value": "%1$s отправил(а) %3$s в «%2$s»" + }, + "NotificationGroupForwardedFew": { + "key": "NotificationGroupForwardedFew", + "value": "%1$s переслал(а) %3$s в «%2$s»" + }, + "NotificationGroupInvitedToCall": { + "key": "NotificationGroupInvitedToCall", + "value": "%1$s пригласил(а) %3$s в голосовой чат в %2$s" + }, + "NotificationGroupInvitedYouToCall": { + "key": "NotificationGroupInvitedYouToCall", + "value": "%1$s пригласил(а) Вас в голосовой чат в %2$s" + }, + "NotificationGroupKickMember": { + "key": "NotificationGroupKickMember", + "value": "%1$s удалил(а) %3$s из группы %2$s" + }, + "NotificationGroupKickYou": { + "key": "NotificationGroupKickYou", + "value": "%1$s удалил(а) Вас из «%2$s»" + }, + "NotificationGroupLeftMember": { + "key": "NotificationGroupLeftMember", + "value": "%1$s больше не состоит в «%2$s»" + }, + "NotificationHiddenChatName": { + "key": "NotificationHiddenChatName", + "value": "Telegram" + }, + "NotificationHiddenChatUserName": { + "key": "NotificationHiddenChatUserName", + "value": "Пользователь" + }, + "NotificationHiddenMessage": { + "key": "NotificationHiddenMessage", + "value": "Новое сообщение" + }, + "NotificationHiddenName": { + "key": "NotificationHiddenName", + "value": "Telegram" + }, + "NotificationInvitedToGroup": { + "key": "NotificationInvitedToGroup", + "value": "%1$s пригласил(а) вас в «%2$s»" + }, + "NotificationInvitedToGroupByLink": { + "key": "NotificationInvitedToGroupByLink", + "value": "%1$s вступил(а) в группу %2$s по ссылке-приглашению" + }, + "NotificationMessageAlbum": { + "key": "NotificationMessageAlbum", + "value": "%1$s прислал(а) альбом" + }, + "NotificationMessageAudio": { + "key": "NotificationMessageAudio", + "value": "%1$s прислал(а) голосовое сообщение" + }, + "NotificationMessageContact": { + "key": "NotificationMessageContact", + "value": "%1$s прислал(а) контакт" + }, + "NotificationMessageContact2": { + "key": "NotificationMessageContact2", + "value": "%1$s прислал(а) контакт %2$s" + }, + "NotificationMessageDocument": { + "key": "NotificationMessageDocument", + "value": "%1$s прислал(а) файл" + }, + "NotificationMessageFew": { + "key": "NotificationMessageFew", + "value": "%1$s прислал(а) вам %2$s" + }, + "NotificationMessageForwardFew": { + "key": "NotificationMessageForwardFew", + "value": "%1$s переслал(а) вам %2$s" + }, + "NotificationMessageGame": { + "key": "NotificationMessageGame", + "value": "%1$s пригласил(а) Вас сыграть в %2$s" + }, + "NotificationMessageGameScored": { + "key": "NotificationMessageGameScored", + "value": "%1$s набрал(а) %3$s очков в игре «%2$s»" + }, + "NotificationMessageGif": { + "key": "NotificationMessageGif", + "value": "%1$s прислал(а) GIF" + }, + "NotificationMessageGroupAudio": { + "key": "NotificationMessageGroupAudio", + "value": "%1$s отправил(а) голосовое сообщение в «%2$s»" + }, + "NotificationMessageGroupContact": { + "key": "NotificationMessageGroupContact", + "value": "%1$s отправил(а) контакт в «%2$s»" + }, + "NotificationMessageGroupContact2": { + "key": "NotificationMessageGroupContact2", + "value": "%1$s отправил(а) контакт %3$s в группу «%2$s»" + }, + "NotificationMessageGroupDocument": { + "key": "NotificationMessageGroupDocument", + "value": "%1$s отправил(а) файл в «%2$s»" + }, + "NotificationMessageGroupGame": { + "key": "NotificationMessageGroupGame", + "value": "%1$s пригласил(а) «%2$s» сыграть в %3$s" + }, + "NotificationMessageGroupGameScored": { + "key": "NotificationMessageGroupGameScored", + "value": "%1$s набрал(а) %4$s очков в «%3$s» в группе «%2$s»" + }, + "NotificationMessageGroupGif": { + "key": "NotificationMessageGroupGif", + "value": "%1$s отправил(а) GIF в «%2$s»" + }, + "NotificationMessageGroupInvoice": { + "key": "NotificationMessageGroupInvoice", + "value": "%1$s отправил(а) счёт на %3$s в «%2$s»" + }, + "NotificationMessageGroupLiveLocation": { + "key": "NotificationMessageGroupLiveLocation", + "value": "%1$s отправил(а) трансляцию геопозиции в «%2$s»" + }, + "NotificationMessageGroupMap": { + "key": "NotificationMessageGroupMap", + "value": "%1$s отправил(а) геопозицию в «%2$s»" + }, + "NotificationMessageGroupMusic": { + "key": "NotificationMessageGroupMusic", + "value": "%1$s отправил(а) аудиофайл в «%2$s»" + }, + "NotificationMessageGroupNoText": { + "key": "NotificationMessageGroupNoText", + "value": "%1$s отправил(а) сообщение группе %2$s" + }, + "NotificationMessageGroupPhoto": { + "key": "NotificationMessageGroupPhoto", + "value": "%1$s отправил(а) фото в «%2$s»" + }, + "NotificationMessageGroupPoll": { + "key": "NotificationMessageGroupPoll", + "value": "%1$s отправил(а) опрос в группу «%2$s»" + }, + "NotificationMessageGroupPoll2": { + "key": "NotificationMessageGroupPoll2", + "value": "%1$s отправил(а) опрос %3$s в группу «%2$s»" + }, + "NotificationMessageGroupQuiz2": { + "key": "NotificationMessageGroupQuiz2", + "value": "%1$s отправил(а) викторину «%3$s» в группу «%2$s»" + }, + "NotificationMessageGroupRound": { + "key": "NotificationMessageGroupRound", + "value": "%1$s отправил(а) видеосообщение в «%2$s»" + }, + "NotificationMessageGroupSticker": { + "key": "NotificationMessageGroupSticker", + "value": "%1$s отправил(а) стикер в «%2$s»" + }, + "NotificationMessageGroupStickerEmoji": { + "key": "NotificationMessageGroupStickerEmoji", + "value": "%1$s отправил(а) стикер %3$s в «%2$s»" + }, + "NotificationMessageGroupText": { + "key": "NotificationMessageGroupText", + "value": "%1$s @ %2$s: %3$s" + }, + "NotificationMessageGroupVideo": { + "key": "NotificationMessageGroupVideo", + "value": "%1$s отправил(а) видео в «%2$s»" + }, + "NotificationMessageInvoice": { + "key": "NotificationMessageInvoice", + "value": "%1$s прислал(а) счёт на %2$s" + }, + "NotificationMessageLiveLocation": { + "key": "NotificationMessageLiveLocation", + "value": "%1$s прислал(а) трансляцию геопозиции" + }, + "NotificationMessageMap": { + "key": "NotificationMessageMap", + "value": "%1$s прислал(а) геопозицию" + }, + "NotificationMessageMusic": { + "key": "NotificationMessageMusic", + "value": "%1$s прислал(а) аудиофайл" + }, + "NotificationMessageNoText": { + "key": "NotificationMessageNoText", + "value": "%1$s прислал(а) сообщение" + }, + "NotificationMessagePhoto": { + "key": "NotificationMessagePhoto", + "value": "%1$s прислал(а) фото" + }, + "NotificationMessagePoll": { + "key": "NotificationMessagePoll", + "value": "%1$s прислал(а) опрос" + }, + "NotificationMessagePoll2": { + "key": "NotificationMessagePoll2", + "value": "%1$s прислал(а) опрос %2$s" + }, + "NotificationMessageQuiz2": { + "key": "NotificationMessageQuiz2", + "value": "%1$s прислал(а) викторину «%2$s»" + }, + "NotificationMessageRound": { + "key": "NotificationMessageRound", + "value": "%1$s прислал(а) видеосообщение" + }, + "NotificationMessageSDPhoto": { + "key": "NotificationMessageSDPhoto", + "value": "%1$s прислал(а) самоуничтожающееся фото" + }, + "NotificationMessageSDVideo": { + "key": "NotificationMessageSDVideo", + "value": "%1$s прислал(а) самоуничтожающееся видео" + }, + "NotificationMessageScheduled": { + "key": "NotificationMessageScheduled", + "value": "📅 Вы: %1$s" + }, + "NotificationMessageScheduledName": { + "key": "NotificationMessageScheduledName", + "value": "📅 Вы" + }, + "NotificationMessageSticker": { + "key": "NotificationMessageSticker", + "value": "%1$s прислал(а) стикер" + }, + "NotificationMessageStickerEmoji": { + "key": "NotificationMessageStickerEmoji", + "value": "%1$s прислал(а) стикер %2$s" + }, + "NotificationMessageText": { + "key": "NotificationMessageText", + "value": "%1$s: %2$s" + }, + "NotificationMessageVideo": { + "key": "NotificationMessageVideo", + "value": "%1$s прислал(а) видео" + }, + "NotificationMessagesPeopleDisplayOrder": { + "key": "NotificationMessagesPeopleDisplayOrder", + "value": "%1$s %2$s" + }, + "NotificationUnrecognizedDevice": { + "key": "NotificationUnrecognizedDevice", + "value": "%1$s,\nв Ваш аккаунт выполнен вход с нового устройства %2$s\n\nУстройство: %3$s\nМесто: %4$s\n\nЕсли это были не Вы, перейдите в Настройки - Конфиденциальность - Сеансы и завершите этот сеанс.\n\nЕсли Вы считаете, что кто-то вошёл в Ваш аккаунт без Вашего ведома, советуем включить двухэтапную аутентификацию в разделе Конфиденциальность.\n\nКоманда Telegram" + }, + "Notifications": { + "key": "Notifications", + "value": "Уведомления" + }, + "NotificationsAddAnException": { + "key": "NotificationsAddAnException", + "value": "Добавить исключение" + }, + "NotificationsAndSounds": { + "key": "NotificationsAndSounds", + "value": "Уведомления и звук" + }, + "NotificationsChannels": { + "key": "NotificationsChannels", + "value": "Каналы" + }, + "NotificationsChartTitle": { + "key": "NotificationsChartTitle", + "value": "Уведомления" + }, + "NotificationsChatInApp": { + "key": "NotificationsChatInApp", + "value": "%1$s в приложении" + }, + "NotificationsCustom": { + "key": "NotificationsCustom", + "value": "Особые" + }, + "NotificationsCustomize": { + "key": "NotificationsCustomize", + "value": "Настроить" + }, + "NotificationsDefault": { + "key": "NotificationsDefault", + "value": "По умолчанию" + }, + "NotificationsDefaultOff": { + "key": "NotificationsDefaultOff", + "value": "По умолчанию (выкл)" + }, + "NotificationsDefaultOn": { + "key": "NotificationsDefaultOn", + "value": "По умолчанию (вкл)" + }, + "NotificationsDeleteAllException": { + "key": "NotificationsDeleteAllException", + "value": "Удалить все исключения" + }, + "NotificationsDeleteAllExceptionAlert": { + "key": "NotificationsDeleteAllExceptionAlert", + "value": "Вы точно хотите удалить все исключения?" + }, + "NotificationsDeleteAllExceptionTitle": { + "key": "NotificationsDeleteAllExceptionTitle", + "value": "Удалить все исключения" + }, + "NotificationsEnableCustom": { + "key": "NotificationsEnableCustom", + "value": "Включить особые уведомления" + }, + "NotificationsExceptions": { + "key": "NotificationsExceptions", + "value": "Исключения" + }, + "NotificationsExceptionsAlert": { + "key": "NotificationsExceptionsAlert", + "value": "Учтите, что **%1$s** в списке исключений, на которые не повлияет это изменение." + }, + "NotificationsExceptionsSingleAlert": { + "key": "NotificationsExceptionsSingleAlert", + "value": "Учтите, что **%1$s** в списке исключений, на которые не повлияет это изменение." + }, + "NotificationsForChannels": { + "key": "NotificationsForChannels", + "value": "Уведомления из каналов" + }, + "NotificationsForChats": { + "key": "NotificationsForChats", + "value": "Уведомления из чатов" + }, + "NotificationsForGroups": { + "key": "NotificationsForGroups", + "value": "Уведомления из групп" + }, + "NotificationsForPrivateChats": { + "key": "NotificationsForPrivateChats", + "value": "Уведомления из личных чатов" + }, + "NotificationsGroups": { + "key": "NotificationsGroups", + "value": "Группы" + }, + "NotificationsImportance": { + "key": "NotificationsImportance", + "value": "Приоритет" + }, + "NotificationsInAppDefault": { + "key": "NotificationsInAppDefault", + "value": "По умолчанию в приложении" + }, + "NotificationsLed": { + "key": "NotificationsLed", + "value": "Светодиод" + }, + "NotificationsLedColor": { + "key": "NotificationsLedColor", + "value": "Цвет" + }, + "NotificationsLedInfo": { + "key": "NotificationsLedInfo", + "value": "Светодиод — маленький мерцающий индикатор на некоторых устройствах, используемый для уведомления о новых сообщениях." + }, + "NotificationsMuted": { + "key": "NotificationsMuted", + "value": "Без уведомлений" + }, + "NotificationsMutedForHint": { + "key": "NotificationsMutedForHint", + "value": "Уведомления выключены на %1$s" + }, + "NotificationsMutedHint": { + "key": "NotificationsMutedHint", + "value": "Уведомления выключены" + }, + "NotificationsNewException": { + "key": "NotificationsNewException", + "value": "Новое исключение" + }, + "NotificationsOff": { + "key": "NotificationsOff", + "value": "Отключены" + }, + "NotificationsOffUntil": { + "key": "NotificationsOffUntil", + "value": "Откл. до %1$s" + }, + "NotificationsOn": { + "key": "NotificationsOn", + "value": "Включены" + }, + "NotificationsOther": { + "key": "NotificationsOther", + "value": "Другое" + }, + "NotificationsPriority": { + "key": "NotificationsPriority", + "value": "Приоритет" + }, + "NotificationsPriorityDefault": { + "key": "NotificationsPriorityDefault", + "value": "По умолчанию" + }, + "NotificationsPriorityHigh": { + "key": "NotificationsPriorityHigh", + "value": "Высокий" + }, + "NotificationsPriorityLow": { + "key": "NotificationsPriorityLow", + "value": "Низкий" + }, + "NotificationsPriorityMax": { + "key": "NotificationsPriorityMax", + "value": "Максимальный" + }, + "NotificationsPriorityMedium": { + "key": "NotificationsPriorityMedium", + "value": "Средний" + }, + "NotificationsPrioritySettings": { + "key": "NotificationsPrioritySettings", + "value": "Как в настройках" + }, + "NotificationsPriorityUrgent": { + "key": "NotificationsPriorityUrgent", + "value": "Срочный" + }, + "NotificationsPrivateChats": { + "key": "NotificationsPrivateChats", + "value": "Личные чаты" + }, + "NotificationsService": { + "key": "NotificationsService", + "value": "Перезапуск при закрытии" + }, + "NotificationsServiceConnection": { + "key": "NotificationsServiceConnection", + "value": "Фоновое соединение" + }, + "NotificationsServiceConnectionInfo": { + "key": "NotificationsServiceConnectionInfo", + "value": "Поддерживать минимальное фоновое соединение с Telegram, чтобы получать уведомления. Обеспечивает надежность уведомлений." + }, + "NotificationsServiceInfo": { + "key": "NotificationsServiceInfo", + "value": "Перезапускать приложение, если оно закрыто. Обеспечивает надежность уведомлений." + }, + "NotificationsSilent": { + "key": "NotificationsSilent", + "value": "Тихий режим" + }, + "NotificationsTurnOff": { + "key": "NotificationsTurnOff", + "value": "Отключить" + }, + "NotificationsTurnOn": { + "key": "NotificationsTurnOn", + "value": "Включить" + }, + "NotificationsUnmuted": { + "key": "NotificationsUnmuted", + "value": "Уведомления" + }, + "NotificationsUnmutedHint": { + "key": "NotificationsUnmutedHint", + "value": "Уведомления включены" + }, + "November": { + "key": "November", + "value": "Ноябрь" + }, + "NowInContacts": { + "key": "NowInContacts", + "value": "%1$s теперь в списке Ваших контактов." + }, + "NumberUnknown": { + "key": "NumberUnknown", + "value": "Неизвестен" + }, + "OK": { + "key": "OK", + "value": "OK" + }, + "October": { + "key": "October", + "value": "Октябрь" + }, + "Of": { + "key": "Of", + "value": "%1$d из %2$d" + }, + "OfCounted": { + "key": "OfCounted", + "value": "**%1$d** из %2$d" + }, + "OneResult": { + "key": "OneResult", + "value": "1 результат" + }, + "Online": { + "key": "Online", + "value": "в сети" + }, + "OnlineCount": { + "key": "OnlineCount", + "zeroValue": null, + "oneValue": "%1$d в сети", + "twoValue": null, + "fewValue": "%1$d в сети", + "manyValue": "%1$d в сети", + "otherValue": "%1$d в сети" + }, + "OnlyIfSilent": { + "key": "OnlyIfSilent", + "value": "Только в беззвучном" + }, + "OnlyWhenScreenOff": { + "key": "OnlyWhenScreenOff", + "value": "Только когда экран выключен" + }, + "OnlyWhenScreenOn": { + "key": "OnlyWhenScreenOn", + "value": "Только когда экран включён" + }, + "Open": { + "key": "Open", + "value": "Открыть" + }, + "OpenBackground": { + "key": "OpenBackground", + "value": "ПРОСМОТР ФОНА" + }, + "OpenChannel": { + "key": "OpenChannel", + "value": "ПЕРЕЙТИ В КАНАЛ" + }, + "OpenChannel2": { + "key": "OpenChannel2", + "value": "Открыть канал" + }, + "OpenFile": { + "key": "OpenFile", + "value": "ОТКРЫТЬ ФАЙЛ" + }, + "OpenGroup": { + "key": "OpenGroup", + "value": "ПЕРЕЙТИ В ГРУППУ" + }, + "OpenGroup2": { + "key": "OpenGroup2", + "value": "Открыть группу" + }, + "OpenInBrowser": { + "key": "OpenInBrowser", + "value": "ОТКРЫТЬ В..." + }, + "OpenInEditor": { + "key": "OpenInEditor", + "value": "Открыть в редакторе" + }, + "OpenInExternalApp": { + "key": "OpenInExternalApp", + "value": "Открыть в..." + }, + "OpenMessage": { + "key": "OpenMessage", + "value": "ПЕРЕЙТИ К СООБЩЕНИЮ" + }, + "OpenProfile": { + "key": "OpenProfile", + "value": "Открыть профиль" + }, + "OpenTheme": { + "key": "OpenTheme", + "value": "ПРОСМОТР ТЕМЫ" + }, + "OpenUrlAlert": { + "key": "OpenUrlAlert", + "value": "Открыть URL %1$s?" + }, + "OpenUrlAlert2": { + "key": "OpenUrlAlert2", + "value": "Перейти по ссылке %1$s?" + }, + "OpenUrlOption1": { + "key": "OpenUrlOption1", + "value": "Авторизоваться на %1$s как **%2$s**" + }, + "OpenUrlOption2": { + "key": "OpenUrlOption2", + "value": "Разрешить **%1$s** писать мне сообщения" + }, + "OpenUrlTitle": { + "key": "OpenUrlTitle", + "value": "Открыть ссылку" + }, + "Option": { + "key": "Option", + "zeroValue": null, + "oneValue": "ещё %1$d вариант ответа", + "twoValue": null, + "fewValue": "ещё %1$d варианта ответа", + "manyValue": "ещё %1$d вариантов ответа", + "otherValue": "ещё %1$d вариантов ответа" + }, + "OptionHint": { + "key": "OptionHint", + "value": "Ответ" + }, + "Orange": { + "key": "Orange", + "value": "Оранжевый" + }, + "OtherLoginCode": { + "key": "OtherLoginCode", + "value": "Ваш код для входа: **%1$s**. Укажите его в приложении Telegram, в котором хотите зайти в свой аккаунт.\n\nНикому не передавайте этот код." + }, + "OtherSessions": { + "key": "OtherSessions", + "value": "Активные сеансы" + }, + "OtherStickers": { + "key": "OtherStickers", + "value": "Больше стикеров" + }, + "OtherWebSessions": { + "key": "OtherWebSessions", + "value": "Подключенные сайты" + }, + "OutgoingCalls": { + "key": "OutgoingCalls", + "value": "Исходящие звонки" + }, + "P2PContacts": { + "key": "P2PContacts", + "value": "Мои контакты" + }, + "P2PContactsMinus": { + "key": "P2PContactsMinus", + "value": "Мои контакты (-%1$d)" + }, + "P2PContactsMinusPlus": { + "key": "P2PContactsMinusPlus", + "value": "Мои контакты (-%1$d, +%2$d)" + }, + "P2PContactsPlus": { + "key": "P2PContactsPlus", + "value": "Мои контакты (+%1$d)" + }, + "P2PEnabledWith": { + "key": "P2PEnabledWith", + "value": "Использовать peer-to-peer для звонков" + }, + "P2PEverybody": { + "key": "P2PEverybody", + "value": "Все" + }, + "P2PEverybodyMinus": { + "key": "P2PEverybodyMinus", + "value": "Все (-%1$d)" + }, + "P2PNobody": { + "key": "P2PNobody", + "value": "Не использовать" + }, + "P2PNobodyPlus": { + "key": "P2PNobodyPlus", + "value": "Не использовать (+%1$d)" + }, + "Page1Message": { + "key": "Page1Message", + "value": "Самый **быстрый** мессенджер в мире.\n**Бесплатный** и **безопасный**." + }, + "Page1Title": { + "key": "Page1Title", + "value": "Telegram" + }, + "Page2Message": { + "key": "Page2Message", + "value": "**Telegram** доставляет сообщения быстрее\nлюбого другого приложения." + }, + "Page2Title": { + "key": "Page2Title", + "value": "Быстрый" + }, + "Page3Message": { + "key": "Page3Message", + "value": "**Telegram** бесплатный навсегда. Без рекламы.\nБез абонентской платы." + }, + "Page3Title": { + "key": "Page3Title", + "value": "Бесплатный" + }, + "Page4Message": { + "key": "Page4Message", + "value": "**Telegram** защищает Вашу переписку от злоумышленников." + }, + "Page4Title": { + "key": "Page4Title", + "value": "Безопасный" + }, + "Page5Message": { + "key": "Page5Message", + "value": "**Telegram** не ограничивает размер\n Ваших медиафайлов и чатов." + }, + "Page5Title": { + "key": "Page5Title", + "value": "Мощный" + }, + "Page6Message": { + "key": "Page6Message", + "value": "В **Telegram** можно переписываться с любого количества устройств." + }, + "Page6Title": { + "key": "Page6Title", + "value": "Облачный" + }, + "PaintArrow": { + "key": "PaintArrow", + "value": "Стрелка" + }, + "PaintDelete": { + "key": "PaintDelete", + "value": "Удалить" + }, + "PaintDuplicate": { + "key": "PaintDuplicate", + "value": "Копировать" + }, + "PaintEdit": { + "key": "PaintEdit", + "value": "Изменить" + }, + "PaintFramed": { + "key": "PaintFramed", + "value": "С фоном" + }, + "PaintMarker": { + "key": "PaintMarker", + "value": "Маркер" + }, + "PaintNeon": { + "key": "PaintNeon", + "value": "Неон" + }, + "PaintOutlined": { + "key": "PaintOutlined", + "value": "Контур" + }, + "PaintPen": { + "key": "PaintPen", + "value": "Ручка" + }, + "PaintRegular": { + "key": "PaintRegular", + "value": "Обычный" + }, + "Participants": { + "key": "Participants", + "zeroValue": null, + "oneValue": "%1$d участник", + "twoValue": null, + "fewValue": "%1$d участника", + "manyValue": "%1$d участников", + "otherValue": "%1$d участника" + }, + "Passcode": { + "key": "Passcode", + "value": "Код-пароль" + }, + "PasscodeDoNotMatch": { + "key": "PasscodeDoNotMatch", + "value": "Код-пароли не совпадают" + }, + "PasscodePIN": { + "key": "PasscodePIN", + "value": "ПИН-код" + }, + "PasscodePassword": { + "key": "PasscodePassword", + "value": "Пароль" + }, + "PassportAddAddressUploadInfo": { + "key": "PassportAddAddressUploadInfo", + "value": "Чтобы подтвердить адрес, загрузите скан или фотографию выбранного документа (все страницы)." + }, + "PassportAddAgreement": { + "key": "PassportAddAgreement", + "value": "Добавить договор об аренде" + }, + "PassportAddAgreementInfo": { + "key": "PassportAddAgreementInfo", + "value": "Загрузите скан договора об аренде." + }, + "PassportAddBank": { + "key": "PassportAddBank", + "value": "Добавить справку из банка" + }, + "PassportAddBankInfo": { + "key": "PassportAddBankInfo", + "value": "Загрузите скан справки из банка" + }, + "PassportAddBill": { + "key": "PassportAddBill", + "value": "Добавить коммунальный счёт" + }, + "PassportAddBillInfo": { + "key": "PassportAddBillInfo", + "value": "Загрузите скан коммунального платежа." + }, + "PassportAddCard": { + "key": "PassportAddCard", + "value": "Добавить удостоверение личности" + }, + "PassportAddDriverLicenceInfo": { + "key": "PassportAddDriverLicenceInfo", + "value": "Загрузите сканы заверенного перевода для своих водительских прав." + }, + "PassportAddIdentityCardInfo": { + "key": "PassportAddIdentityCardInfo", + "value": "Загрузите сканы заверенного перевода для своего удостоверения личности." + }, + "PassportAddInternalPassport": { + "key": "PassportAddInternalPassport", + "value": "Добавить внутренний паспорт" + }, + "PassportAddInternalPassportInfo": { + "key": "PassportAddInternalPassportInfo", + "value": "Загрузите сканы заверенного перевода для своего внутреннего паспорта." + }, + "PassportAddLicence": { + "key": "PassportAddLicence", + "value": "Добавить водительские права" + }, + "PassportAddPassport": { + "key": "PassportAddPassport", + "value": "Добавить паспорт" + }, + "PassportAddPassportInfo": { + "key": "PassportAddPassportInfo", + "value": "Загрузите сканы заверенного перевода для своего паспорта." + }, + "PassportAddPassportRegistration": { + "key": "PassportAddPassportRegistration", + "value": "Прописка" + }, + "PassportAddPassportRegistrationInfo": { + "key": "PassportAddPassportRegistrationInfo", + "value": "Загрузите скан страницы паспорта с пропиской" + }, + "PassportAddTemporaryRegistration": { + "key": "PassportAddTemporaryRegistration", + "value": "Временная прописка" + }, + "PassportAddTemporaryRegistrationInfo": { + "key": "PassportAddTemporaryRegistrationInfo", + "value": "Загрузитe скан временной прописки." + }, + "PassportAddTranslationAgreementInfo": { + "key": "PassportAddTranslationAgreementInfo", + "value": "Загрузите сканы заверенного перевода для своего договора об аренде." + }, + "PassportAddTranslationBankInfo": { + "key": "PassportAddTranslationBankInfo", + "value": "Загрузите сканы заверенного перевода для своей справки из банка." + }, + "PassportAddTranslationBillInfo": { + "key": "PassportAddTranslationBillInfo", + "value": "Загрузите сканы заверенного перевода для своего коммунального счёта." + }, + "PassportAddTranslationPassportRegistrationInfo": { + "key": "PassportAddTranslationPassportRegistrationInfo", + "value": "Загрузите сканы заверенного перевода для страницы паспорта с пропиской." + }, + "PassportAddTranslationTemporaryRegistrationInfo": { + "key": "PassportAddTranslationTemporaryRegistrationInfo", + "value": "Загрузите сканы заверенного перевода для документа о временной прописке." + }, + "PassportAddTranslationUploadInfo": { + "key": "PassportAddTranslationUploadInfo", + "value": "Пожалуйста, загрузите сканы заверенного перевода для выбранного документа." + }, + "PassportAddress": { + "key": "PassportAddress", + "value": "Адрес" + }, + "PassportAddressHeader": { + "key": "PassportAddressHeader", + "value": "Адрес" + }, + "PassportAddressInfo": { + "key": "PassportAddressInfo", + "value": "Загрузите подтверждение адреса" + }, + "PassportAddressNoUploadInfo": { + "key": "PassportAddressNoUploadInfo", + "value": "Укажите свой адрес" + }, + "PassportAuthorize": { + "key": "PassportAuthorize", + "value": "Авторизоваться" + }, + "PassportBirthdate": { + "key": "PassportBirthdate", + "value": "Дата рождения" + }, + "PassportCitizenship": { + "key": "PassportCitizenship", + "value": "Гражданство" + }, + "PassportCity": { + "key": "PassportCity", + "value": "Город" + }, + "PassportCorrectErrors": { + "key": "PassportCorrectErrors", + "value": "Нажмите, чтобы внести исправления." + }, + "PassportCountry": { + "key": "PassportCountry", + "value": "Страна" + }, + "PassportDeleteAddressAlert": { + "key": "PassportDeleteAddressAlert", + "value": "Вы точно хотите удалить данные об адресе?" + }, + "PassportDeleteDocument": { + "key": "PassportDeleteDocument", + "value": "Удалить документ" + }, + "PassportDeleteDocumentAddress": { + "key": "PassportDeleteDocumentAddress", + "value": "Удалить данные об адресе" + }, + "PassportDeleteDocumentAlert": { + "key": "PassportDeleteDocumentAlert", + "value": "Вы точно хотите удалить этот документ?" + }, + "PassportDeleteDocumentPersonal": { + "key": "PassportDeleteDocumentPersonal", + "value": "Удалить личную информацию" + }, + "PassportDeleteEmailAlert": { + "key": "PassportDeleteEmailAlert", + "value": "Удалить почту?" + }, + "PassportDeleteInfo": { + "key": "PassportDeleteInfo", + "value": "Удалить" + }, + "PassportDeletePersonalAlert": { + "key": "PassportDeletePersonalAlert", + "value": "Вы точно хотите удалить личную информацию?" + }, + "PassportDeletePhoneAlert": { + "key": "PassportDeletePhoneAlert", + "value": "Удалить номер телефона?" + }, + "PassportDeleteScan": { + "key": "PassportDeleteScan", + "value": "Удалить скан?" + }, + "PassportDeleteScanAlert": { + "key": "PassportDeleteScanAlert", + "value": "Вы точно хотите удалить этот скан?" + }, + "PassportDeleteSelfie": { + "key": "PassportDeleteSelfie", + "value": "Удалить селфи?" + }, + "PassportDeleteSelfieAlert": { + "key": "PassportDeleteSelfieAlert", + "value": "Вы точно хотите удалить это селфи?" + }, + "PassportDiscard": { + "key": "PassportDiscard", + "value": "Сбросить" + }, + "PassportDiscardChanges": { + "key": "PassportDiscardChanges", + "value": "Вы точно хотите сбросить всю введённую информацию?" + }, + "PassportDocument": { + "key": "PassportDocument", + "value": "Данные документа" + }, + "PassportDocumentNumber": { + "key": "PassportDocumentNumber", + "value": "Номер документа" + }, + "PassportDocuments": { + "key": "PassportDocuments", + "value": "Сканы" + }, + "PassportEmail": { + "key": "PassportEmail", + "value": "Email" + }, + "PassportEmailCode": { + "key": "PassportEmailCode", + "value": "Код" + }, + "PassportEmailInfo": { + "key": "PassportEmailInfo", + "value": "Укажите свой адрес электронной почты" + }, + "PassportEmailUploadInfo": { + "key": "PassportEmailUploadInfo", + "value": "Обратите внимание: на указанную Вами электронную почту придет код подтверждения." + }, + "PassportEmailVerifyInfo": { + "key": "PassportEmailVerifyInfo", + "value": "Введите код подтверждения, который был только что отправлен на %1$s." + }, + "PassportExpired": { + "key": "PassportExpired", + "value": "Срок действия" + }, + "PassportFemale": { + "key": "PassportFemale", + "value": "Женский" + }, + "PassportFrontSide": { + "key": "PassportFrontSide", + "value": "Лицевая сторона" + }, + "PassportFrontSideInfo": { + "key": "PassportFrontSideInfo", + "value": "Загрузите фотографию лицевой стороны документа" + }, + "PassportGender": { + "key": "PassportGender", + "value": "Пол" + }, + "PassportIdentityDocument": { + "key": "PassportIdentityDocument", + "value": "Удостоверение личности" + }, + "PassportIdentityDocumentInfo": { + "key": "PassportIdentityDocumentInfo", + "value": "Загрузить скан паспорта или другого удостоверения личности" + }, + "PassportIdentityDriverLicence": { + "key": "PassportIdentityDriverLicence", + "value": "Загрузите скан своих водительских прав" + }, + "PassportIdentityID": { + "key": "PassportIdentityID", + "value": "Загрузите скан своего удостоверения личности" + }, + "PassportIdentityInternalPassport": { + "key": "PassportIdentityInternalPassport", + "value": "Загрузите скан внутреннего паспорта" + }, + "PassportIdentityPassport": { + "key": "PassportIdentityPassport", + "value": "Загрузите скан своего паспорта" + }, + "PassportInfo": { + "key": "PassportInfo", + "value": "С помощью Telegram Passport можно зарегистрироваться на сайтах и сервисах, где требуется идентификация личности.\n\nВаша информация, персональные данные и документы защищены оконечным шифрованием (end-to-end). Никто, включая Telegram, не сможет получить к ним доступ без Вашего согласия.\n\nПочитать об этом подробнее можно в нашем FAQ." + }, + "PassportInfo2": { + "key": "PassportInfo2", + "value": "С помощью Telegram Passport можно зарегистрироваться на сайтах и сервисах, где требуется идентификация личности.\n\nВаша информация, персональные данные и документы защищены оконечным шифрованием (end-to-end). Никто, включая Telegram, не сможет получить к ним доступ без Вашего согласия.\n\nПочитать об этом подробнее можно в нашем *FAQ*." + }, + "PassportInfoTitle": { + "key": "PassportInfoTitle", + "value": "Что такое Telegram Passport?" + }, + "PassportInfoUrl": { + "key": "PassportInfoUrl", + "value": "https://telegram.org/faq#passport" + }, + "PassportLanguage_AR": { + "key": "PassportLanguage_AR", + "value": "на арабском языке" + }, + "PassportLanguage_AZ": { + "key": "PassportLanguage_AZ", + "value": "на азербайджанском языке" + }, + "PassportLanguage_BG": { + "key": "PassportLanguage_BG", + "value": "на болгарском языке" + }, + "PassportLanguage_BN": { + "key": "PassportLanguage_BN", + "value": "на бенгальском языке" + }, + "PassportLanguage_CS": { + "key": "PassportLanguage_CS", + "value": "на чешском языке" + }, + "PassportLanguage_DA": { + "key": "PassportLanguage_DA", + "value": "на датском языке" + }, + "PassportLanguage_DE": { + "key": "PassportLanguage_DE", + "value": "на немецком языке" + }, + "PassportLanguage_DV": { + "key": "PassportLanguage_DV", + "value": "на дивехи" + }, + "PassportLanguage_DZ": { + "key": "PassportLanguage_DZ", + "value": "на дзонг-кэ" + }, + "PassportLanguage_EL": { + "key": "PassportLanguage_EL", + "value": "на греческом языке" + }, + "PassportLanguage_ES": { + "key": "PassportLanguage_ES", + "value": "на испанском языке" + }, + "PassportLanguage_ET": { + "key": "PassportLanguage_ET", + "value": "на эстонском языке" + }, + "PassportLanguage_FA": { + "key": "PassportLanguage_FA", + "value": "на фарси" + }, + "PassportLanguage_FR": { + "key": "PassportLanguage_FR", + "value": "на французском языке" + }, + "PassportLanguage_HE": { + "key": "PassportLanguage_HE", + "value": "на иврите" + }, + "PassportLanguage_HR": { + "key": "PassportLanguage_HR", + "value": "на хорватском языке" + }, + "PassportLanguage_HU": { + "key": "PassportLanguage_HU", + "value": "на венгерском языке" + }, + "PassportLanguage_HY": { + "key": "PassportLanguage_HY", + "value": "на армянском языке" + }, + "PassportLanguage_ID": { + "key": "PassportLanguage_ID", + "value": "на индонезийском языке" + }, + "PassportLanguage_IS": { + "key": "PassportLanguage_IS", + "value": "на исландском языке" + }, + "PassportLanguage_IT": { + "key": "PassportLanguage_IT", + "value": "на итальянском языке" + }, + "PassportLanguage_JA": { + "key": "PassportLanguage_JA", + "value": "на японском языке" + }, + "PassportLanguage_KA": { + "key": "PassportLanguage_KA", + "value": "на грузинском языке" + }, + "PassportLanguage_KM": { + "key": "PassportLanguage_KM", + "value": "на кхмерском языке" + }, + "PassportLanguage_KO": { + "key": "PassportLanguage_KO", + "value": "на корейском языке" + }, + "PassportLanguage_LO": { + "key": "PassportLanguage_LO", + "value": "на лаосском языке" + }, + "PassportLanguage_LT": { + "key": "PassportLanguage_LT", + "value": "на литовском языке" + }, + "PassportLanguage_LV": { + "key": "PassportLanguage_LV", + "value": "на латышском языке" + }, + "PassportLanguage_MK": { + "key": "PassportLanguage_MK", + "value": "на македонском языке" + }, + "PassportLanguage_MN": { + "key": "PassportLanguage_MN", + "value": "на монгольском языке" + }, + "PassportLanguage_MS": { + "key": "PassportLanguage_MS", + "value": "на малайском языке" + }, + "PassportLanguage_MY": { + "key": "PassportLanguage_MY", + "value": "на бирманском языке" + }, + "PassportLanguage_NE": { + "key": "PassportLanguage_NE", + "value": "на непальском языке" + }, + "PassportLanguage_NL": { + "key": "PassportLanguage_NL", + "value": "на нидерландском языке" + }, + "PassportLanguage_PL": { + "key": "PassportLanguage_PL", + "value": "на польском языке" + }, + "PassportLanguage_PT": { + "key": "PassportLanguage_PT", + "value": "на португальском языке" + }, + "PassportLanguage_RO": { + "key": "PassportLanguage_RO", + "value": "на румынском языке" + }, + "PassportLanguage_RU": { + "key": "PassportLanguage_RU", + "value": "на русском языке" + }, + "PassportLanguage_SK": { + "key": "PassportLanguage_SK", + "value": "на словацком языке" + }, + "PassportLanguage_SL": { + "key": "PassportLanguage_SL", + "value": "на словенском языке" + }, + "PassportLanguage_TH": { + "key": "PassportLanguage_TH", + "value": "на тайском языке" + }, + "PassportLanguage_TK": { + "key": "PassportLanguage_TK", + "value": "на туркменском языке" + }, + "PassportLanguage_TR": { + "key": "PassportLanguage_TR", + "value": "на турецком языке" + }, + "PassportLanguage_UK": { + "key": "PassportLanguage_UK", + "value": "на украинском языке" + }, + "PassportLanguage_UZ": { + "key": "PassportLanguage_UZ", + "value": "на узбекском языке" + }, + "PassportLanguage_VI": { + "key": "PassportLanguage_VI", + "value": "на вьетнамском языке" + }, + "PassportMainPage": { + "key": "PassportMainPage", + "value": "Главная страница" + }, + "PassportMainPageInfo": { + "key": "PassportMainPageInfo", + "value": "Загрузить фотографию главной страницы документа" + }, + "PassportMale": { + "key": "PassportMale", + "value": "Мужской" + }, + "PassportMidname": { + "key": "PassportMidname", + "value": "Отчество" + }, + "PassportMidnameCountry": { + "key": "PassportMidnameCountry", + "value": "Отчество (%1$s)" + }, + "PassportMidnameLatin": { + "key": "PassportMidnameLatin", + "value": "Отчество (латиницей)" + }, + "PassportName": { + "key": "PassportName", + "value": "Имя" + }, + "PassportNameCheckAlert": { + "key": "PassportNameCheckAlert", + "value": "Пожалуйста, проверьте имя:\n\n%1$s %2$s %3$s" + }, + "PassportNameCountry": { + "key": "PassportNameCountry", + "value": "Имя (%1$s)" + }, + "PassportNameLatin": { + "key": "PassportNameLatin", + "value": "Имя (латиницей)" + }, + "PassportNativeHeader": { + "key": "PassportNativeHeader", + "value": "Имя" + }, + "PassportNativeHeaderLang": { + "key": "PassportNativeHeaderLang", + "value": "Ваше имя %1$s" + }, + "PassportNativeInfo": { + "key": "PassportNativeInfo", + "value": "Ваше имя на языке страны проживания (%1$s)." + }, + "PassportNoDocuments": { + "key": "PassportNoDocuments", + "value": "Вы пока не загружали документы" + }, + "PassportNoDocumentsAdd": { + "key": "PassportNoDocumentsAdd", + "value": "Добавить документ" + }, + "PassportNoDocumentsInfo": { + "key": "PassportNoDocumentsInfo", + "value": "Вы можете добавить свой номер телефона, email, удостоверение личности или адрес проживания." + }, + "PassportNoExpireDate": { + "key": "PassportNoExpireDate", + "value": "Нет" + }, + "PassportNoPolicy": { + "key": "PassportNoPolicy", + "value": "Вы отправите документы напрямую %1$s и разрешите их боту @%2$s писать вам сообщения." + }, + "PassportPersonal": { + "key": "PassportPersonal", + "value": "Личная информация" + }, + "PassportPersonalDetails": { + "key": "PassportPersonalDetails", + "value": "Личная информация" + }, + "PassportPersonalDetailsInfo": { + "key": "PassportPersonalDetailsInfo", + "value": "Укажите данные о себе" + }, + "PassportPersonalUploadInfo": { + "key": "PassportPersonalUploadInfo", + "value": "В документе должны быть Ваша фотография, имя и фамилия, дата рождения, номер документа, страна получения и срок действия." + }, + "PassportPhone": { + "key": "PassportPhone", + "value": "Номер телефона" + }, + "PassportPhoneInfo": { + "key": "PassportPhoneInfo", + "value": "Укажите свой номер телефона" + }, + "PassportPhoneUploadInfo": { + "key": "PassportPhoneUploadInfo", + "value": "Обратите внимание: на указанный Вами номер телефона придет код подтверждения." + }, + "PassportPhoneUseOther": { + "key": "PassportPhoneUseOther", + "value": "Или введите другой номер телефона" + }, + "PassportPhoneUseSame": { + "key": "PassportPhoneUseSame", + "value": "Использовать %1$s" + }, + "PassportPhoneUseSameEmailInfo": { + "key": "PassportPhoneUseSameEmailInfo", + "value": "Используйте тот же адрес электронной почты, что и в Telegram." + }, + "PassportPhoneUseSameInfo": { + "key": "PassportPhoneUseSameInfo", + "value": "Используйте тот же номер телефона, что и в Telegram." + }, + "PassportPolicy": { + "key": "PassportPolicy", + "value": "Вы принимаете *Политику конфиденциальности %1$s* и разрешаете их боту @%2$s писать Вам сообщения." + }, + "PassportPostcode": { + "key": "PassportPostcode", + "value": "Индекс" + }, + "PassportProvidedInformation": { + "key": "PassportProvidedInformation", + "value": "Предоставленная информация" + }, + "PassportRequest": { + "key": "PassportRequest", + "value": "Для регистрации **%1$s** запрашивает доступ к Вашей личной информации." + }, + "PassportRequestPasswordInfo": { + "key": "PassportRequestPasswordInfo", + "value": "Для расшифровки данных введите свой пароль от Telegram." + }, + "PassportRequestedInformation": { + "key": "PassportRequestedInformation", + "value": "Необходимая информация" + }, + "PassportRequiredDocuments": { + "key": "PassportRequiredDocuments", + "value": "Необходимые документы" + }, + "PassportResidence": { + "key": "PassportResidence", + "value": "Местожительство" + }, + "PassportResidentialAddress": { + "key": "PassportResidentialAddress", + "value": "Адрес проживания" + }, + "PassportReverseSide": { + "key": "PassportReverseSide", + "value": "Обратная сторона" + }, + "PassportReverseSideInfo": { + "key": "PassportReverseSideInfo", + "value": "Загрузите фотографию обратной стороны документа" + }, + "PassportSDK_Cancel": { + "key": "PassportSDK_Cancel", + "value": "Отмена" + }, + "PassportSDK_DownloadTelegram": { + "key": "PassportSDK_DownloadTelegram", + "value": "Чтобы авторизоваться в **%s**, требуется Telegram. Хотите установить его сейчас?" + }, + "PassportSDK_LogInWithTelegram": { + "key": "PassportSDK_LogInWithTelegram", + "value": "Войти через Telegram" + }, + "PassportSDK_OpenGooglePlay": { + "key": "PassportSDK_OpenGooglePlay", + "value": "Открыть Google Play" + }, + "PassportSDK_TelegramPassport": { + "key": "PassportSDK_TelegramPassport", + "value": "Telegram Passport" + }, + "PassportScanPassport": { + "key": "PassportScanPassport", + "value": "Отсканируйте свой паспорт" + }, + "PassportScanPassportInfo": { + "key": "PassportScanPassportInfo", + "value": "Чтобы автоматически заполнить личные данные, сканируйте свой паспорт или удостоверение личности с областью для считывания компьютером." + }, + "PassportSelectBithdayDate": { + "key": "PassportSelectBithdayDate", + "value": "Укажите дату рождения" + }, + "PassportSelectExpiredDate": { + "key": "PassportSelectExpiredDate", + "value": "Укажите срок действия" + }, + "PassportSelectGender": { + "key": "PassportSelectGender", + "value": "Выберите пол" + }, + "PassportSelectNotExpire": { + "key": "PassportSelectNotExpire", + "value": "Не истекает" + }, + "PassportSelfRequest": { + "key": "PassportSelfRequest", + "value": "Для доступа к личной информации введите свой пароль." + }, + "PassportSelfie": { + "key": "PassportSelfie", + "value": "Селфи" + }, + "PassportSelfieInfo": { + "key": "PassportSelfieInfo", + "value": "Загрузите фотографию, где вы держите свой документ." + }, + "PassportState": { + "key": "PassportState", + "value": "Область" + }, + "PassportStreet1": { + "key": "PassportStreet1", + "value": "Улица" + }, + "PassportStreet2": { + "key": "PassportStreet2", + "value": "Улица" + }, + "PassportSurname": { + "key": "PassportSurname", + "value": "Фамилия" + }, + "PassportSurnameCountry": { + "key": "PassportSurnameCountry", + "value": "Фамилия (%1$s)" + }, + "PassportSurnameLatin": { + "key": "PassportSurnameLatin", + "value": "Фамилия (латиницей)" + }, + "PassportTranslation": { + "key": "PassportTranslation", + "value": "Перевод" + }, + "PassportTwoDocuments": { + "key": "PassportTwoDocuments", + "value": "%1$s или %2$s" + }, + "PassportUploadAdditinalDocument": { + "key": "PassportUploadAdditinalDocument", + "value": "Загрузить дополнительные сканы" + }, + "PassportUploadDocument": { + "key": "PassportUploadDocument", + "value": "Загрузить сканы" + }, + "PassportUploadMaxReached": { + "key": "PassportUploadMaxReached", + "value": "Невозможно загрузить больше %1$s." + }, + "PassportUploadNotImage": { + "key": "PassportUploadNotImage", + "value": "Вы можете загружать только изображения." + }, + "PassportUseLatinOnly": { + "key": "PassportUseLatinOnly", + "value": "Пожалуйста, используйте только латиницу." + }, + "PasswordAsHintError": { + "key": "PasswordAsHintError", + "value": "Подсказка не должна совпадать с паролем" + }, + "PasswordCode": { + "key": "PasswordCode", + "value": "Код" + }, + "PasswordDoNotMatch": { + "key": "PasswordDoNotMatch", + "value": "Пароли не совпадают" + }, + "PasswordEmailInvalid": { + "key": "PasswordEmailInvalid", + "value": "Некорректный адрес электронной почты. Пожалуйста, проверьте, что правильно указываете адрес, и попробуйте ещё раз." + }, + "PasswordHint": { + "key": "PasswordHint", + "value": "Подсказка" + }, + "PasswordHintPlaceholder": { + "key": "PasswordHintPlaceholder", + "value": "Подсказка" + }, + "PasswordHintText": { + "key": "PasswordHintText", + "value": "Введите подсказку для пароля" + }, + "PasswordOff": { + "key": "PasswordOff", + "value": "Выкл." + }, + "PasswordOn": { + "key": "PasswordOn", + "value": "Вкл." + }, + "PasswordRecovery": { + "key": "PasswordRecovery", + "value": "Восстановление пароля" + }, + "PasswordReset": { + "key": "PasswordReset", + "value": "Пароль отключён" + }, + "PasteFromClipboard": { + "key": "PasteFromClipboard", + "value": "Вставить из буфера обмена" + }, + "PaymentBillingAddress": { + "key": "PaymentBillingAddress", + "value": "Платёжный адрес" + }, + "PaymentCardCvv": { + "key": "PaymentCardCvv", + "value": "Код безопасности (CVV)" + }, + "PaymentCardExpireDate": { + "key": "PaymentCardExpireDate", + "value": "ММ/ГГ" + }, + "PaymentCardInfo": { + "key": "PaymentCardInfo", + "value": "Платёжная информация" + }, + "PaymentCardName": { + "key": "PaymentCardName", + "value": "Имя и фамилия" + }, + "PaymentCardNumber": { + "key": "PaymentCardNumber", + "value": "Номер карты" + }, + "PaymentCardSavePaymentInformation": { + "key": "PaymentCardSavePaymentInformation", + "value": "Сохранить реквизиты" + }, + "PaymentCardSavePaymentInformationInfoLine1": { + "key": "PaymentCardSavePaymentInformationInfoLine1", + "value": "Вы можете сохранить эти данные, чтобы в будущем использовать их для оплаты." + }, + "PaymentCardSavePaymentInformationInfoLine2": { + "key": "PaymentCardSavePaymentInformationInfoLine2", + "value": "Чтобы сделать это, пожалуйста, *настройте двухэтапную аутентификацию*." + }, + "PaymentCardTitle": { + "key": "PaymentCardTitle", + "value": "Платёжная карта" + }, + "PaymentCheckout": { + "key": "PaymentCheckout", + "value": "Оплатить" + }, + "PaymentCheckoutEmail": { + "key": "PaymentCheckoutEmail", + "value": "Контактный адрес" + }, + "PaymentCheckoutMethod": { + "key": "PaymentCheckoutMethod", + "value": "Способ оплаты" + }, + "PaymentCheckoutName": { + "key": "PaymentCheckoutName", + "value": "Имя" + }, + "PaymentCheckoutPay": { + "key": "PaymentCheckoutPay", + "value": "ОПЛАТИТЬ %1$s" + }, + "PaymentCheckoutPhoneNumber": { + "key": "PaymentCheckoutPhoneNumber", + "value": "Номер телефона" + }, + "PaymentCheckoutProvider": { + "key": "PaymentCheckoutProvider", + "value": "Платёжный провайдер" + }, + "PaymentCheckoutShippingMethod": { + "key": "PaymentCheckoutShippingMethod", + "value": "Способ доставки" + }, + "PaymentConfirmationMessage": { + "key": "PaymentConfirmationMessage", + "value": "Ваша карта %1$s сохранена. Чтобы оплатить этой картой, пожалуйста, введите свой пароль двухэтапной аутентификации." + }, + "PaymentConfirmationNewCard": { + "key": "PaymentConfirmationNewCard", + "value": "Выберите другую карту" + }, + "PaymentConnectionFailed": { + "key": "PaymentConnectionFailed", + "value": "Не удалось соединиться с платёжным сервером. Пожалуйста, проверьте подключение к интернету и попробуйте снова." + }, + "PaymentEmailToProvider": { + "key": "PaymentEmailToProvider", + "value": "В качестве платёжной информации %1$s получит данные о Вашей электронной почте." + }, + "PaymentFailed": { + "key": "PaymentFailed", + "value": "К сожалению, платёж отклонён." + }, + "PaymentInvoice": { + "key": "PaymentInvoice", + "value": "СЧЁТ" + }, + "PaymentNoShippingMethod": { + "key": "PaymentNoShippingMethod", + "value": "К сожалению, доставка по этому адресу невозможна." + }, + "PaymentPassword": { + "key": "PaymentPassword", + "value": "Пароль и почта" + }, + "PaymentPasswordEmail": { + "key": "PaymentPasswordEmail", + "value": "Ваша электронная почта" + }, + "PaymentPasswordEmailInfo": { + "key": "PaymentPasswordEmailInfo", + "value": "Пожалуйста, добавьте настоящий email. Это единственный способ восстановить аккаунт в случае утраты пароля." + }, + "PaymentPasswordEmailTitle": { + "key": "PaymentPasswordEmailTitle", + "value": "Почта для восстановления" + }, + "PaymentPasswordEnter": { + "key": "PaymentPasswordEnter", + "value": "Введите пароль" + }, + "PaymentPasswordInfo": { + "key": "PaymentPasswordInfo", + "value": "Чтобы защитить свою платежную информацию, задайте пароль. Его нужно будет вводить для входа в Ваш аккаунт." + }, + "PaymentPasswordReEnter": { + "key": "PaymentPasswordReEnter", + "value": "Повторите пароль" + }, + "PaymentPasswordTitle": { + "key": "PaymentPasswordTitle", + "value": "Пароль" + }, + "PaymentPhoneEmailToProvider": { + "key": "PaymentPhoneEmailToProvider", + "value": "В качестве платежной информации %1$s получит ваш номер телефона и электронную почту." + }, + "PaymentPhoneToProvider": { + "key": "PaymentPhoneToProvider", + "value": "В качестве платёжной информации %1$s получит Ваш номер телефона." + }, + "PaymentPrecheckoutFailed": { + "key": "PaymentPrecheckoutFailed", + "value": "К сожалению, бот отменил платёж." + }, + "PaymentReceipt": { + "key": "PaymentReceipt", + "value": "Чек" + }, + "PaymentShippingAddress": { + "key": "PaymentShippingAddress", + "value": "Адрес доставки" + }, + "PaymentShippingAddress1Placeholder": { + "key": "PaymentShippingAddress1Placeholder", + "value": "Адрес 1 (улица)" + }, + "PaymentShippingAddress2Placeholder": { + "key": "PaymentShippingAddress2Placeholder", + "value": "Адрес 2 (улица)" + }, + "PaymentShippingCityPlaceholder": { + "key": "PaymentShippingCityPlaceholder", + "value": "Город" + }, + "PaymentShippingCountry": { + "key": "PaymentShippingCountry", + "value": "Страна" + }, + "PaymentShippingEmailPlaceholder": { + "key": "PaymentShippingEmailPlaceholder", + "value": "Электронная почта" + }, + "PaymentShippingInfo": { + "key": "PaymentShippingInfo", + "value": "Информация о доставке" + }, + "PaymentShippingMethod": { + "key": "PaymentShippingMethod", + "value": "Способы доставки" + }, + "PaymentShippingName": { + "key": "PaymentShippingName", + "value": "Имя полностью" + }, + "PaymentShippingPhoneNumber": { + "key": "PaymentShippingPhoneNumber", + "value": "Номер телефона" + }, + "PaymentShippingReceiver": { + "key": "PaymentShippingReceiver", + "value": "Получатель" + }, + "PaymentShippingSave": { + "key": "PaymentShippingSave", + "value": "Сохранить адрес доставки" + }, + "PaymentShippingSaveInfo": { + "key": "PaymentShippingSaveInfo", + "value": "Вы можете сохранить эти данные, чтобы в будущем использовать их для доставки." + }, + "PaymentShippingStatePlaceholder": { + "key": "PaymentShippingStatePlaceholder", + "value": "Область" + }, + "PaymentShippingZipPlaceholder": { + "key": "PaymentShippingZipPlaceholder", + "value": "Индекс" + }, + "PaymentSuccessfullyPaid": { + "key": "PaymentSuccessfullyPaid", + "value": "Вы успешно перевели %1$s для %2$s за %3$s" + }, + "PaymentSuccessfullyPaidNoItem": { + "key": "PaymentSuccessfullyPaidNoItem", + "value": "Вы успешно перевели %1$s для %2$s" + }, + "PaymentTestInvoice": { + "key": "PaymentTestInvoice", + "value": "ТЕСТОВЫЙ СЧЁТ" + }, + "PaymentTransactionMessage": { + "key": "PaymentTransactionMessage", + "value": "Вы точно хотите перевести %1$s боту %2$s за %3$s?" + }, + "PaymentTransactionReview": { + "key": "PaymentTransactionReview", + "value": "Ваша транзакция" + }, + "PaymentTransactionTotal": { + "key": "PaymentTransactionTotal", + "value": "Итого" + }, + "PaymentWarning": { + "key": "PaymentWarning", + "value": "Внимание" + }, + "PaymentWarningText": { + "key": "PaymentWarningText", + "value": "Ни Telegram, ни %1$s не будут иметь доступа к Вашей платёжной информации. Все реквизиты карт обрабатываются только платёжной системой, %2$s.\n\nОплата осуществляется напрямую разработчику %1$s. Telegram не может предоставить никаких гарантий. В случае любых проблем, пожалуйста, свяжитесь с разработчиком %1$s или своим банком." + }, + "PendingEmailText": { + "key": "PendingEmailText", + "value": "Ваш адрес электронной почты для восстановления %1$s ещё не активирован и ожидает подтверждения." + }, + "PeopleCanJoinViaLink": { + "key": "PeopleCanJoinViaLink", + "value": "Ссылку могут использовать %s человек" + }, + "PeopleJoined": { + "key": "PeopleJoined", + "zeroValue": null, + "oneValue": "%1$d человек присоединился", + "twoValue": null, + "fewValue": "%1$d человека присоединились", + "manyValue": "%1$d человек присоединились", + "otherValue": "%1$d человек присоединились" + }, + "PeopleJoinedRemaining": { + "key": "PeopleJoinedRemaining", + "zeroValue": null, + "oneValue": "осталось %1$d", + "twoValue": null, + "fewValue": "осталось %1$d", + "manyValue": "осталось %1$d", + "otherValue": "осталось %1$d" + }, + "PeopleNearby": { + "key": "PeopleNearby", + "value": "Люди рядом" + }, + "PeopleNearbyAccessInfo": { + "key": "PeopleNearbyAccessInfo", + "value": "Вы можете быстро связаться с теми, кто находится рядом с Вами и зашёл в этот раздел, а также найти локальные группы.\n\nДля этого необходимо разрешить приложению доступ к геопозиции." + }, + "PeopleNearbyAllowAccess": { + "key": "PeopleNearbyAllowAccess", + "value": "Разрешить доступ" + }, + "PeopleNearbyEmpty": { + "key": "PeopleNearbyEmpty", + "value": "Поиск пользователей рядом с Вами..." + }, + "PeopleNearbyGps": { + "key": "PeopleNearbyGps", + "value": "Включить" + }, + "PeopleNearbyGpsInfo": { + "key": "PeopleNearbyGpsInfo", + "value": "Вы можете быстро связаться с теми, кто находится рядом с Вами и зашёл в этот раздел, а также найти локальные группы.\n\nДля этого необходимо разрешить приложению доступ к геопозиции." + }, + "PeopleNearbyHeader": { + "key": "PeopleNearbyHeader", + "value": "Люди рядом" + }, + "PeopleNearbyInfo": { + "key": "PeopleNearbyInfo", + "value": "Предложите другу зайти в этот раздел, чтобы обменяться номерами телефона." + }, + "PeopleNearbyInfo2": { + "key": "PeopleNearbyInfo2", + "value": "Вы можете быстро обменяться контактами с пользователями поблизости или найти новых друзей." + }, + "Permanent": { + "key": "Permanent", + "value": "Основная" + }, + "PermanentLinkForThisAdmin": { + "key": "PermanentLinkForThisAdmin", + "value": "Ссылка для этого администратора" + }, + "PermissionBackgroundLocation": { + "key": "PermissionBackgroundLocation", + "value": "Telegram требуется доступ к геопозиции в фоновом режиме, чтобы Вы могли транслировать её в этот чат в реальном времени.\n\nПриложение будет иметь доступ к геопозиции только на выбранный Вами период времени, и Вы можете отозвать доступ в любой момент. Информация будет использоваться только для трансляции геопозиции в этот чат." + }, + "PermissionContacts": { + "key": "PermissionContacts", + "value": "Актуальная информация о Ваших контактах будет храниться зашифрованной в облаке Telegram, чтобы Вы могли связаться с друзьями с любого устройства." + }, + "PermissionDrawAboveOtherApps": { + "key": "PermissionDrawAboveOtherApps", + "value": "Telegram требуется доступ к работе поверх других приложений, чтобы показывать видео в режиме картинка в картинке." + }, + "PermissionDrawAboveOtherAppsGroupCall": { + "key": "PermissionDrawAboveOtherAppsGroupCall", + "value": "В этом режиме можно включать микрофон и видеть говорящих в чате, даже когда приложение свернуто." + }, + "PermissionDrawAboveOtherAppsGroupCallTitle": { + "key": "PermissionDrawAboveOtherAppsGroupCallTitle", + "value": "Фоновый режим" + }, + "PermissionDrawAboveOtherAppsTitle": { + "key": "PermissionDrawAboveOtherAppsTitle", + "value": "Картинка в картинке" + }, + "PermissionNoAudio": { + "key": "PermissionNoAudio", + "value": "Telegram требуется доступ к микрофону, чтобы Вы могли отправлять голосовые сообщения." + }, + "PermissionNoAudioVideo": { + "key": "PermissionNoAudioVideo", + "value": "Telegram требуется доступ к микрофону, чтобы Вы могли снимать видео." + }, + "PermissionNoCamera": { + "key": "PermissionNoCamera", + "value": "Telegram требуется доступ к камере, чтобы Вы могли снимать фото и видео." + }, + "PermissionNoLocation": { + "key": "PermissionNoLocation", + "value": "Telegram требуется доступ к геопозиции, чтобы Вы могли отправлять её друзьям." + }, + "PermissionNoLocationPosition": { + "key": "PermissionNoLocationPosition", + "value": "Telegram требуется доступ к геопозиции." + }, + "PermissionOpenSettings": { + "key": "PermissionOpenSettings", + "value": "НАСТРОЙКИ" + }, + "PermissionStorage": { + "key": "PermissionStorage", + "value": "Telegram требуется доступ к хранилищу, чтобы Вы могли отправлять и сохранять фото, видео, музыку и другие медиа." + }, + "PermissionXiaomiLockscreen": { + "key": "PermissionXiaomiLockscreen", + "value": "Для корректной работы звонков, пожалуйста, разрешите приложению показываться на экране блокировки." + }, + "Phone": { + "key": "Phone", + "value": "Телефон" + }, + "PhoneCopied": { + "key": "PhoneCopied", + "value": "Телефон скопирован в буфер обмена" + }, + "PhoneHidden": { + "key": "PhoneHidden", + "value": "Неизвестен" + }, + "PhoneHome": { + "key": "PhoneHome", + "value": "Дом" + }, + "PhoneMain": { + "key": "PhoneMain", + "value": "Основной" + }, + "PhoneMobile": { + "key": "PhoneMobile", + "value": "Телефон" + }, + "PhoneNumberAlert": { + "key": "PhoneNumberAlert", + "value": "Пользователи будут видеть Ваш новый номер, если он есть в их телефонной книге или если это разрешают Ваши настройки конфиденциальности: Настройки > Конфиденциальность > Номер телефона." + }, + "PhoneNumberChange": { + "key": "PhoneNumberChange", + "value": "СМЕНИТЬ НОМЕР" + }, + "PhoneNumberChange2": { + "key": "PhoneNumberChange2", + "value": "Сменить номер" + }, + "PhoneNumberChangeTitle": { + "key": "PhoneNumberChangeTitle", + "value": "Сменить номер" + }, + "PhoneNumberFlood": { + "key": "PhoneNumberFlood", + "value": "За последнее время Вы слишком часто удаляли и создавали свой аккаунт заново. Пожалуйста, подождите несколько дней перед повторной регистрацией." + }, + "PhoneNumberHelp": { + "key": "PhoneNumberHelp", + "value": "Здесь Вы можете сменить номер телефона. Ваш аккаунт и все данные (сообщения, медиа, контакты и т. д.) будут перенесены на новый номер." + }, + "PhoneNumberSearch": { + "key": "PhoneNumberSearch", + "value": "Номер телефона" + }, + "PhoneOther": { + "key": "PhoneOther", + "value": "Другое" + }, + "PhoneWork": { + "key": "PhoneWork", + "value": "Работа" + }, + "PhotoCaption": { + "key": "PhotoCaption", + "value": "Подпись к фото" + }, + "PhotoEditorDiscardAlert": { + "key": "PhotoEditorDiscardAlert", + "value": "Вы точно хотите сбросить все изменения?" + }, + "PhotoSavedHint": { + "key": "PhotoSavedHint", + "value": "Фото сохранено в галерею" + }, + "PhotoSavedToDownloadsHint": { + "key": "PhotoSavedToDownloadsHint", + "value": "Фото сохранено в загрузки" + }, + "Photos": { + "key": "Photos", + "zeroValue": null, + "oneValue": "%1$d фото", + "twoValue": null, + "fewValue": "%1$d фото", + "manyValue": "%1$d фото", + "otherValue": "%1$d фото" + }, + "PhotosSavedHint": { + "key": "PhotosSavedHint", + "zeroValue": null, + "oneValue": "%1$d фотография сохранена в галерею", + "twoValue": null, + "fewValue": "%1$d фотографии сохранены в галерею", + "manyValue": "%1$d фотографий сохранено в галерею", + "otherValue": "%1$d фотографии сохранено в галерею" + }, + "PhotosSelected": { + "key": "PhotosSelected", + "zeroValue": null, + "oneValue": "выбрана %1$d фотография", + "twoValue": null, + "fewValue": "выбраны %1$d фотографии", + "manyValue": "выбрано %1$d фотографий", + "otherValue": "выбрано %1$d фотографий" + }, + "PinAlsoFor": { + "key": "PinAlsoFor", + "value": "Также закрепить для %1$s" + }, + "PinFolderLimitReached": { + "key": "PinFolderLimitReached", + "value": "У Вас закреплено максимальное число чатов." + }, + "PinInTheList": { + "key": "PinInTheList", + "value": "Закрепить в списке чатов" + }, + "PinMessage": { + "key": "PinMessage", + "value": "Закрепить" + }, + "PinMessageAlert": { + "key": "PinMessageAlert", + "value": "Закрепить сообщение в группе?" + }, + "PinMessageAlertChannel": { + "key": "PinMessageAlertChannel", + "value": "Хотите закрепить это сообщение в канале?" + }, + "PinMessageAlertChat": { + "key": "PinMessageAlertChat", + "value": "Хотите закрепить это сообщение в чате?" + }, + "PinMessageAlertTitle": { + "key": "PinMessageAlertTitle", + "value": "Закрепить сообщение" + }, + "PinNotify": { + "key": "PinNotify", + "value": "Уведомление всем участникам" + }, + "PinOldMessageAlert": { + "key": "PinOldMessageAlert", + "value": "Закрепить более старое сообщение, сохранив закрепленным более новое?" + }, + "PinToTop": { + "key": "PinToTop", + "value": "Закрепить" + }, + "PinToTopLimitReached": { + "key": "PinToTopLimitReached", + "value": "Можно закрепить не больше %1$s. Чтобы упорядочить список чатов, можно использовать архив: в нём можно закрепить неограниченное число чатов." + }, + "PinToTopLimitReached2": { + "key": "PinToTopLimitReached2", + "value": "Вы можете закрепить не более %1$s чатов в основном списке. В Архиве и папках можно закрепить больше чатов." + }, + "Ping": { + "key": "Ping", + "value": "пинг: %1$d мс" + }, + "Pink": { + "key": "Pink", + "value": "Розовый" + }, + "PinnedMessage": { + "key": "PinnedMessage", + "value": "Закреплённое сообщение" + }, + "PinnedMessages": { + "key": "PinnedMessages", + "value": "Закреплённые сообщения" + }, + "PinnedMessagesCount": { + "key": "PinnedMessagesCount", + "zeroValue": null, + "oneValue": "%1$d закрепленное сообщение", + "twoValue": null, + "fewValue": "%1$d закрепленных сообщения", + "manyValue": "%1$d закрепленных сообщений", + "otherValue": "%1$d закрепленных сообщения" + }, + "PinnedMessagesHidden": { + "key": "PinnedMessagesHidden", + "value": "Панель скрыта" + }, + "PinnedMessagesHiddenInfo": { + "key": "PinnedMessagesHiddenInfo", + "value": "Вы снова увидите её, если будет закреплено новое сообщение." + }, + "PinnedPoll": { + "key": "PinnedPoll", + "value": "Закреплённый опрос" + }, + "PlacesInThisArea": { + "key": "PlacesInThisArea", + "value": "Места поблизости" + }, + "PleaseDownload": { + "key": "PleaseDownload", + "value": "Сначала загрузите медиафайл" + }, + "PleaseEnterCurrentPassword": { + "key": "PleaseEnterCurrentPassword", + "value": "Введите пароль" + }, + "PleaseEnterCurrentPasswordTransfer": { + "key": "PleaseEnterCurrentPasswordTransfer", + "value": "Введите пароль, чтобы подтвердить передачу прав." + }, + "PleaseEnterFirstPassword": { + "key": "PleaseEnterFirstPassword", + "value": "Введите пароль" + }, + "PleaseEnterNewFirstPassword": { + "key": "PleaseEnterNewFirstPassword", + "value": "Введите новый пароль" + }, + "PleaseEnterPassword": { + "key": "PleaseEnterPassword", + "value": "Введите новый пароль" + }, + "PleaseLoginPassport": { + "key": "PleaseLoginPassport", + "value": "Чтобы использовать Telegram Passport, войдите в аккаунт Telegram." + }, + "PleaseReEnterPassword": { + "key": "PleaseReEnterPassword", + "value": "Повторите пароль" + }, + "PleaseStreamDownload": { + "key": "PleaseStreamDownload", + "value": "Пожалуйста, дождитесь полной загрузки видео." + }, + "Points": { + "key": "Points", + "zeroValue": null, + "oneValue": "%1$d", + "twoValue": null, + "fewValue": "%1$d", + "manyValue": "%1$d", + "otherValue": "%1$d" + }, + "Poll": { + "key": "Poll", + "value": "Опрос" + }, + "PollAnonymous": { + "key": "PollAnonymous", + "value": "Анонимное голосование" + }, + "PollCantForwardSecretChat": { + "key": "PollCantForwardSecretChat", + "value": "Публичные опросы нельзя пересылать в секретные чаты." + }, + "PollCollapse": { + "key": "PollCollapse", + "value": "Скрыть" + }, + "PollExpand": { + "key": "PollExpand", + "value": "Развернуть" + }, + "PollMultiple": { + "key": "PollMultiple", + "value": "Выбор нескольких ответов" + }, + "PollOptions": { + "key": "PollOptions", + "value": "Варианты ответа" + }, + "PollQuestion": { + "key": "PollQuestion", + "value": "Вопрос" + }, + "PollQuiz": { + "key": "PollQuiz", + "value": "Режим викторины" + }, + "PollResults": { + "key": "PollResults", + "value": "Результаты" + }, + "PollSelectOption": { + "key": "PollSelectOption", + "value": "Выберите вариант ответа" + }, + "PollSubmitVotes": { + "key": "PollSubmitVotes", + "value": "ГОЛОСОВАТЬ" + }, + "PollTapToSelect": { + "key": "PollTapToSelect", + "value": "Выберите правильный ответ" + }, + "PollViewResults": { + "key": "PollViewResults", + "value": "РЕЗУЛЬТАТЫ" + }, + "PopupDisabled": { + "key": "PopupDisabled", + "value": "Отключены" + }, + "PopupEnabled": { + "key": "PopupEnabled", + "value": "Включены" + }, + "PopupNotification": { + "key": "PopupNotification", + "value": "Всплывающие уведомления" + }, + "PostingMembers": { + "key": "PostingMembers", + "value": "Отправляли сообщения" + }, + "PreviewFeedback": { + "key": "PreviewFeedback", + "value": "Сообщить об ошибке в превью" + }, + "PreviewFeedback2": { + "key": "PreviewFeedback2", + "value": "Ошибка в превью?" + }, + "PreviousPinnedMessage": { + "key": "PreviousPinnedMessage", + "value": "Предыдущее сообщение" + }, + "PrimaryLinkHelp": { + "key": "PrimaryLinkHelp", + "value": "Пользователи Telegram смогут присоединиться к Вашей группе, перейдя по ссылке." + }, + "PrimaryLinkHelpChannel": { + "key": "PrimaryLinkHelpChannel", + "value": "Пользователи Telegram смогут присоединиться к Вашему каналу, перейдя по ссылке." + }, + "PriorityInfo": { + "key": "PriorityInfo", + "value": "Уведомления с максимальным приоритетом будут срабатывать, даже когда устройство в режиме «Не беспокоить»" + }, + "PrivacyAddAnException": { + "key": "PrivacyAddAnException", + "value": "Добавить людей или группы" + }, + "PrivacyAdvanced": { + "key": "PrivacyAdvanced", + "value": "Продвинутые настройки" + }, + "PrivacyBots": { + "key": "PrivacyBots", + "value": "Боты и сайты" + }, + "PrivacyBotsInfo": { + "key": "PrivacyBotsInfo", + "value": "Сайты, где Вы авторизовались через Telegram." + }, + "PrivacyCallsP2PHelp": { + "key": "PrivacyCallsP2PHelp", + "value": "Если выключить peer-to-peer, все звонки будут идти через серверы Telegram. Собеседник не сможет узнать ваш IP-адрес, но качество звука и видео немного ухудшится." + }, + "PrivacyCallsP2PTitle": { + "key": "PrivacyCallsP2PTitle", + "value": "Peer-to-Peer" + }, + "PrivacyClearPayment": { + "key": "PrivacyClearPayment", + "value": "Платёжная информация" + }, + "PrivacyClearShipping": { + "key": "PrivacyClearShipping", + "value": "Информация о доставке" + }, + "PrivacyDeleteCloudDrafts": { + "key": "PrivacyDeleteCloudDrafts", + "value": "Удалить черновики" + }, + "PrivacyExceptions": { + "key": "PrivacyExceptions", + "value": "Исключения" + }, + "PrivacyFloodControlError": { + "key": "PrivacyFloodControlError", + "value": "Действие выполняется слишком часто. Не удалось изменить настройки приватности, пожалуйста, подождите." + }, + "PrivacyForwards": { + "key": "PrivacyForwards", + "value": "Пересылка сообщений" + }, + "PrivacyForwardsContacts": { + "key": "PrivacyForwardsContacts", + "value": "Ссылка, если это разрешают настройки ниже" + }, + "PrivacyForwardsEverybody": { + "key": "PrivacyForwardsEverybody", + "value": "Ссылка на Ваш аккаунт" + }, + "PrivacyForwardsInfo": { + "key": "PrivacyForwardsInfo", + "value": "В отправленных Вами сообщениях не будет ссылки на Ваш аккаунт, если переслать их в другой чат." + }, + "PrivacyForwardsInfo2": { + "key": "PrivacyForwardsInfo2", + "value": "Вы можете добавить пользователей или целые группы в список исключений из настроек выше." + }, + "PrivacyForwardsMessageLine": { + "key": "PrivacyForwardsMessageLine", + "value": "Чем ворон похож на письменный стол?" + }, + "PrivacyForwardsNobody": { + "key": "PrivacyForwardsNobody", + "value": "Без ссылки на аккаунт" + }, + "PrivacyForwardsTitle": { + "key": "PrivacyForwardsTitle", + "value": "Кто может ссылаться на мой аккаунт при пересылке сообщений?" + }, + "PrivacyLastSeen": { + "key": "PrivacyLastSeen", + "value": "Последняя активность" + }, + "PrivacyP2P": { + "key": "PrivacyP2P", + "value": "Звонки через Peer-to-Peer" + }, + "PrivacyP2P2": { + "key": "PrivacyP2P2", + "value": "Использовать peer-to-peer" + }, + "PrivacyP2PHeader": { + "key": "PrivacyP2PHeader", + "value": "Peer-to-Peer" + }, + "PrivacyPayments": { + "key": "PrivacyPayments", + "value": "Платежи" + }, + "PrivacyPaymentsClear": { + "key": "PrivacyPaymentsClear", + "value": "Удалить данные о платежах и доставке" + }, + "PrivacyPaymentsClearAlert": { + "key": "PrivacyPaymentsClearAlert", + "value": "Удалить данные о доставке и запросить удаление сохраненных кредитных карт у платёжных провайдеров? Обратите внимание, что сам Telegram не хранит информацию о Ваших кредитных картах." + }, + "PrivacyPaymentsClearAlertText": { + "key": "PrivacyPaymentsClearAlertText", + "value": "Вы точно хотите удалить данные о платежах и доставке?" + }, + "PrivacyPaymentsClearAlertTitle": { + "key": "PrivacyPaymentsClearAlertTitle", + "value": "Очистить платежные данные" + }, + "PrivacyPaymentsClearInfo": { + "key": "PrivacyPaymentsClearInfo", + "value": "Вы можете удалить свою платёжную информацию и запросить удаление сохраненных кредитных карт у платёжных провайдеров. Обратите внимание, что сам Telegram не хранит информацию о Ваших кредитных картах." + }, + "PrivacyPhone": { + "key": "PrivacyPhone", + "value": "Номер телефона" + }, + "PrivacyPhoneInfo": { + "key": "PrivacyPhoneInfo", + "value": "Пользователи, которые уже знают Ваш номер и сохранили его в телефонную книгу, будут видеть его и в Telegram." + }, + "PrivacyPhoneInfo2": { + "key": "PrivacyPhoneInfo2", + "value": "Вы можете добавить пользователей или целые группы в список исключений из настроек выше." + }, + "PrivacyPhoneInfo3": { + "key": "PrivacyPhoneInfo3", + "value": "Пользователи, которые сохранили Ваш номер в телефонную книгу, будут видеть его в Telegram, только если Вы добавили их в контакты." + }, + "PrivacyPhoneTitle": { + "key": "PrivacyPhoneTitle", + "value": "Кто видит мой номер телефона?" + }, + "PrivacyPhoneTitle2": { + "key": "PrivacyPhoneTitle2", + "value": "Кто может найти меня по номеру?" + }, + "PrivacyPolicy": { + "key": "PrivacyPolicy", + "value": "Политика конфиденциальности" + }, + "PrivacyPolicyAndTerms": { + "key": "PrivacyPolicyAndTerms", + "value": "Пользовательское соглашение и конфиденциальность" + }, + "PrivacyPolicyUrl": { + "key": "PrivacyPolicyUrl", + "value": "https://telegram.org/privacy" + }, + "PrivacyProfilePhoto": { + "key": "PrivacyProfilePhoto", + "value": "Фотографии профиля" + }, + "PrivacyProfilePhotoInfo": { + "key": "PrivacyProfilePhotoInfo", + "value": "Вы можете выбрать, кому разрешаете видеть фотографию в своём профиле." + }, + "PrivacyProfilePhotoInfo2": { + "key": "PrivacyProfilePhotoInfo2", + "value": "Вы можете добавить пользователей или целые группы в список исключений из настроек выше." + }, + "PrivacyProfilePhotoTitle": { + "key": "PrivacyProfilePhotoTitle", + "value": "Кто видит фото и видео в моём профиле?" + }, + "PrivacySettings": { + "key": "PrivacySettings", + "value": "Конфиденциальность" + }, + "PrivacySettingsChangedAlert": { + "key": "PrivacySettingsChangedAlert", + "value": "Вы изменили настройки приватности. Применить изменения?" + }, + "PrivacyTitle": { + "key": "PrivacyTitle", + "value": "Конфиденциальность" + }, + "PrivateShares": { + "key": "PrivateShares", + "value": "Поделились непублично" + }, + "ProfileJoinChannel": { + "key": "ProfileJoinChannel", + "value": "Присоединиться" + }, + "ProfileJoinGroup": { + "key": "ProfileJoinGroup", + "value": "Вступить в группу" + }, + "ProfilePopupNotification": { + "key": "ProfilePopupNotification", + "value": "Всплывающие уведомления" + }, + "ProfilePopupNotificationInfo": { + "key": "ProfilePopupNotificationInfo", + "value": "Новые сообщения от этого контакта будут всплывать поверх экрана, когда Вы не в приложении." + }, + "ProximityAlertCancelled": { + "key": "ProximityAlertCancelled", + "value": "Оповещение отменено" + }, + "ProximityAlertSet": { + "key": "ProximityAlertSet", + "value": "Оповещение установлено" + }, + "ProximityAlertSetInfoGroup2": { + "key": "ProximityAlertSetInfoGroup2", + "value": "Вы получите оповещение, когда кто-то из участников будет в %1$s от Вас." + }, + "ProximityAlertSetInfoUser": { + "key": "ProximityAlertSetInfoUser", + "value": "Вы получите оповещение, когда %1$s будет в %2$s от Вас." + }, + "ProximityTooltioGroup": { + "key": "ProximityTooltioGroup", + "value": "Уведомление о приближении других участников" + }, + "ProximityTooltioUser": { + "key": "ProximityTooltioUser", + "value": "Уведомление о приближении %1$s" + }, + "Proxy": { + "key": "Proxy", + "value": "Прокси" + }, + "ProxyConnections": { + "key": "ProxyConnections", + "value": "Подключения" + }, + "ProxyDetails": { + "key": "ProxyDetails", + "value": "Прокси-сервер" + }, + "ProxySettings": { + "key": "ProxySettings", + "value": "Настройки прокси" + }, + "PsaHide": { + "key": "PsaHide", + "value": "Скрыть" + }, + "PsaHideChatAlertText": { + "key": "PsaHideChatAlertText", + "value": "Вы точно хотите скрыть этот чат?" + }, + "PsaHideChatAlertTitle": { + "key": "PsaHideChatAlertTitle", + "value": "Скрыть чат" + }, + "PsaInfoDefault": { + "key": "PsaInfoDefault", + "value": "PSA info test" + }, + "PsaInfo_covid": { + "key": "PsaInfo_covid", + "value": "Это экстренная новость о пандемии COVID-19. Подробнее об этой инициативе: https://telegram.org/blog/coronavirus" + }, + "PsaMessageDefault": { + "key": "PsaMessageDefault", + "value": "Важное уведомление" + }, + "PsaMessageInfoDefault": { + "key": "PsaMessageInfoDefault", + "value": "Это важное уведомление." + }, + "PsaMessageInfo_covid": { + "key": "PsaMessageInfo_covid", + "value": "Это экстренная новость о пандемии COVID-19. Подробнее об этой инициативе: https://telegram.org/blog/coronavirus" + }, + "PsaMessage_covid": { + "key": "PsaMessage_covid", + "value": "Новость о COVID-19" + }, + "PsaTypeDefault": { + "key": "PsaTypeDefault", + "value": "PSA" + }, + "PsaType_covid": { + "key": "PsaType_covid", + "value": "COVID-19" + }, + "PublicChannelsTooMuch": { + "key": "PublicChannelsTooMuch", + "value": "У этого пользователя максимальное число публичных групп и каналов. Пожалуйста, предложите ему сперва удалить одну из публичных ссылок на его группу или канал." + }, + "PublicLink": { + "key": "PublicLink", + "value": "Публичная ссылка" + }, + "PublicPoll": { + "key": "PublicPoll", + "value": "Опрос" + }, + "PublicPollCantForward": { + "key": "PublicPollCantForward", + "value": "Опросы с открытым списком результатов нельзя пересылать в каналы." + }, + "PublicShares": { + "key": "PublicShares", + "value": "Поделились публично" + }, + "PublicSharesCount": { + "key": "PublicSharesCount", + "zeroValue": null, + "oneValue": "%1$s поделились публично", + "twoValue": null, + "fewValue": "%1$s поделились публично", + "manyValue": "%1$s поделились публично", + "otherValue": "%1$s поделились публично" + }, + "Purple": { + "key": "Purple", + "value": "Фиолетовый" + }, + "QRCodeLinkHelpChannel": { + "key": "QRCodeLinkHelpChannel", + "value": "Пользователи смогут подписаться на канал, считав этот код камерой телефона." + }, + "QRCodeLinkHelpGroup": { + "key": "QRCodeLinkHelpGroup", + "value": "Пользователи смогут присоединиться к группе, считав этот код камерой телефона." + }, + "QRCodePermissionNoCamera": { + "key": "QRCodePermissionNoCamera", + "value": "Чтобы Вы могли сканировать QR-коды, Telegram нужен доступ к камере." + }, + "Question": { + "key": "Question", + "value": "Вопрос" + }, + "QuestionHint": { + "key": "QuestionHint", + "value": "Задайте вопрос" + }, + "QuickReplyCustom": { + "key": "QuickReplyCustom", + "value": "Ваше сообщение..." + }, + "QuickReplyDefault1": { + "key": "QuickReplyDefault1", + "value": "Извини, сейчас не могу ответить." + }, + "QuickReplyDefault2": { + "key": "QuickReplyDefault2", + "value": "Перезвоню, как только смогу." + }, + "QuickReplyDefault3": { + "key": "QuickReplyDefault3", + "value": "Перезвоню позже." + }, + "QuickReplyDefault4": { + "key": "QuickReplyDefault4", + "value": "Не могу ответить. Перезвони, пожалуйста." + }, + "QuizAnswers": { + "key": "QuizAnswers", + "value": "Варианты ответа" + }, + "QuizInfo": { + "key": "QuizInfo", + "value": "В викторинах есть правильный вариант ответа, а пользователям недоступна возможность переголосовать." + }, + "QuizPoll": { + "key": "QuizPoll", + "value": "Викторина" + }, + "QuizWellDone": { + "key": "QuizWellDone", + "value": "Верно!" + }, + "QuizWellDoneInfo": { + "key": "QuizWellDoneInfo", + "value": "Вы выбрали правильный ответ." + }, + "QuizWrongAnswer": { + "key": "QuizWrongAnswer", + "value": "Неверный ответ!" + }, + "QuizWrongAnswerInfo": { + "key": "QuizWrongAnswerInfo", + "value": "Вы выбрали неправильный ответ." + }, + "RaiseToSpeak": { + "key": "RaiseToSpeak", + "value": "Запись голоса при приближении" + }, + "RateCallDistorted": { + "key": "RateCallDistorted", + "value": "Звук был искажён" + }, + "RateCallDropped": { + "key": "RateCallDropped", + "value": "Звонок оборвался" + }, + "RateCallEcho": { + "key": "RateCallEcho", + "value": "Слышно свой голос" + }, + "RateCallInterruptions": { + "key": "RateCallInterruptions", + "value": "Голос собеседника пропадал" + }, + "RateCallNoise": { + "key": "RateCallNoise", + "value": "Шум на заднем фоне" + }, + "RateCallSilentLocal": { + "key": "RateCallSilentLocal", + "value": "Собеседника не слышно" + }, + "RateCallSilentRemote": { + "key": "RateCallSilentRemote", + "value": "Собеседник не слышал меня" + }, + "RateCallVideoDistorted": { + "key": "RateCallVideoDistorted", + "value": "Видео было искажено" + }, + "RateCallVideoPixelated": { + "key": "RateCallVideoPixelated", + "value": "Видео низкого качества" + }, + "ReEnterYourPasscode": { + "key": "ReEnterYourPasscode", + "value": "Введите код-пароль ещё раз" + }, + "Recent": { + "key": "Recent", + "value": "Часто используемые" + }, + "RecentFiles": { + "key": "RecentFiles", + "value": "Недавние файлы" + }, + "RecentFilesAZ": { + "key": "RecentFilesAZ", + "value": "Файлы А-Я" + }, + "RecentPosts": { + "key": "RecentPosts", + "value": "Недавние посты" + }, + "RecentStickers": { + "key": "RecentStickers", + "value": "Недавние" + }, + "RecentlyViewed": { + "key": "RecentlyViewed", + "value": "Недавние" + }, + "RecentlyViewedHide": { + "key": "RecentlyViewedHide", + "value": "СКРЫТЬ" + }, + "Recipient": { + "key": "Recipient", + "zeroValue": null, + "oneValue": "%1$d получатель", + "twoValue": null, + "fewValue": "%1$d получателя", + "manyValue": "%1$d получателей", + "otherValue": "%1$d получателей" + }, + "RecordingAudio": { + "key": "RecordingAudio", + "value": "записывает голосовое сообщение..." + }, + "RecordingRound": { + "key": "RecordingRound", + "value": "записывает видеосообщение..." + }, + "RecoveryEmail": { + "key": "RecoveryEmail", + "value": "Электронная почта" + }, + "RecoveryEmailTitle": { + "key": "RecoveryEmailTitle", + "value": "Электронная почта" + }, + "Red": { + "key": "Red", + "value": "Красный" + }, + "RegisterText": { + "key": "RegisterText", + "value": "Укажите имя и фамилию" + }, + "RegisterText2": { + "key": "RegisterText2", + "value": "Введите своё имя и загрузите фотографию." + }, + "Regular": { + "key": "Regular", + "value": "Обычный" + }, + "RemindDayAt": { + "key": "RemindDayAt", + "value": "'Отправить' d MMM 'в' HH:mm" + }, + "RemindDayYearAt": { + "key": "RemindDayYearAt", + "value": "'Напомнить' d MMM yyyy 'в' HH:mm" + }, + "RemindTodayAt": { + "key": "RemindTodayAt", + "value": "'Отправить сегодня в' HH:mm" + }, + "Reminders": { + "key": "Reminders", + "value": "Напоминания" + }, + "RemoveFromListText": { + "key": "RemoveFromListText", + "value": "Нажмите и удерживайте имя пользователя для удаления." + }, + "RemoveStickersCount": { + "key": "RemoveStickersCount", + "value": "УДАЛИТЬ %1$s" + }, + "RemovedFromFavorites": { + "key": "RemovedFromFavorites", + "value": "Стикер удалён из избранных" + }, + "RemovedFromRecent": { + "key": "RemovedFromRecent", + "value": "Стикер был удалён из списка недавних" + }, + "RemovedUser": { + "key": "RemovedUser", + "zeroValue": null, + "oneValue": "%1$d пользователь в чёрном списке", + "twoValue": null, + "fewValue": "%1$d пользователя в чёрном списке", + "manyValue": "%1$d пользователей в чёрном списке", + "otherValue": "%1$d пользователей в чёрном списке" + }, + "RepeatDisabled": { + "key": "RepeatDisabled", + "value": "Откл." + }, + "RepeatList": { + "key": "RepeatList", + "value": "Зациклить список" + }, + "RepeatNotifications": { + "key": "RepeatNotifications", + "value": "Повтор уведомлений" + }, + "RepeatNotificationsNever": { + "key": "RepeatNotificationsNever", + "value": "Никогда" + }, + "RepeatSong": { + "key": "RepeatSong", + "value": "Зациклить трек" + }, + "ReplacePhoto": { + "key": "ReplacePhoto", + "value": "Заменить фото" + }, + "Replies": { + "key": "Replies", + "zeroValue": null, + "oneValue": "%1$d ответ", + "twoValue": null, + "fewValue": "%1$d ответа", + "manyValue": "%1$d ответов", + "otherValue": "%1$d ответа" + }, + "RepliesChatInfo": { + "key": "RepliesChatInfo", + "value": "Этот чат поможет отслеживать ответы на Ваши комментарии в каналах." + }, + "RepliesTitle": { + "key": "RepliesTitle", + "value": "Ответы" + }, + "Reply": { + "key": "Reply", + "value": "Ответить" + }, + "ReplyToGroup": { + "key": "ReplyToGroup", + "value": "Ответить %1$s" + }, + "ReplyToUser": { + "key": "ReplyToUser", + "value": "Ответить %1$s" + }, + "ReportChat": { + "key": "ReportChat", + "value": "Пожаловаться" + }, + "ReportChatChild": { + "key": "ReportChatChild", + "value": "Детская порнография" + }, + "ReportChatDescription": { + "key": "ReportChatDescription", + "value": "Описание" + }, + "ReportChatFakeAccount": { + "key": "ReportChatFakeAccount", + "value": "Ненастоящий аккаунт" + }, + "ReportChatOther": { + "key": "ReportChatOther", + "value": "Другое" + }, + "ReportChatPornography": { + "key": "ReportChatPornography", + "value": "Порнография" + }, + "ReportChatSent": { + "key": "ReportChatSent", + "value": "Жалоба отправлена" + }, + "ReportChatSpam": { + "key": "ReportChatSpam", + "value": "Спам" + }, + "ReportChatViolence": { + "key": "ReportChatViolence", + "value": "Насилие" + }, + "ReportHint": { + "key": "ReportHint", + "value": "Комментарий..." + }, + "ReportInfo": { + "key": "ReportInfo", + "value": "Вы можете указать дополнительную информацию в комментарии." + }, + "ReportMessages": { + "key": "ReportMessages", + "value": "ПОЖАЛОВАТЬСЯ НА СООБЩЕНИЯ" + }, + "ReportMessagesCount": { + "key": "ReportMessagesCount", + "value": "ПОЖАЛОВАТЬСЯ НА %1$s" + }, + "ReportSelectMessages": { + "key": "ReportSelectMessages", + "value": "Выберите сообщения" + }, + "ReportSend": { + "key": "ReportSend", + "value": "Отправить жалобу" + }, + "ReportSentInfo": { + "key": "ReportSentInfo", + "value": "Вашу жалобу проверят модераторы.\nСпасибо!" + }, + "ReportSpam": { + "key": "ReportSpam", + "value": "СООБЩИТЬ О СПАМЕ" + }, + "ReportSpamAlert": { + "key": "ReportSpamAlert", + "value": "Хотите сообщить о спаме от пользователя?" + }, + "ReportSpamAlertChannel": { + "key": "ReportSpamAlertChannel", + "value": "Хотите сообщить о спаме из этого канала?" + }, + "ReportSpamAlertGroup": { + "key": "ReportSpamAlertGroup", + "value": "Хотите сообщить о спаме от этой группы?" + }, + "ReportSpamAndLeave": { + "key": "ReportSpamAndLeave", + "value": "СООБЩИТЬ О СПАМЕ И ВЫЙТИ" + }, + "ReportSpamLocation": { + "key": "ReportSpamLocation", + "value": "ГРУППА НЕ СВЯЗАНА С МЕСТОМ?" + }, + "ReportSpamTitle": { + "key": "ReportSpamTitle", + "value": "Сообщить о спаме" + }, + "ReportSpamUser": { + "key": "ReportSpamUser", + "value": "ЗАБЛОКИРОВАТЬ" + }, + "ReportTitleChild": { + "key": "ReportTitleChild", + "value": "Детская порнография" + }, + "ReportTitleFake": { + "key": "ReportTitleFake", + "value": "Ненастоящий аккаунт" + }, + "ReportTitlePornography": { + "key": "ReportTitlePornography", + "value": "Жалоба на порнографию" + }, + "ReportTitleSpam": { + "key": "ReportTitleSpam", + "value": "Жалоба на спам" + }, + "ReportTitleViolence": { + "key": "ReportTitleViolence", + "value": "Жалоба на насилие" + }, + "ReportUnrelatedGroup": { + "key": "ReportUnrelatedGroup", + "value": "Жалоба на группу" + }, + "ReportUnrelatedGroupText": { + "key": "ReportUnrelatedGroupText", + "value": "Пожалуйста, сообщите нам, если группа никак не связана с местом, где Вы находитесь:\n\n**%1$s**" + }, + "ReportUnrelatedGroupTextNoAddress": { + "key": "ReportUnrelatedGroupTextNoAddress", + "value": "Пожалуйста, сообщите нам, если группа никак не связана с местом, где Вы находитесь." + }, + "ReportUserLocation": { + "key": "ReportUserLocation", + "value": "Пожаловаться" + }, + "ResendCode": { + "key": "ResendCode", + "value": "Отправить ещё раз" + }, + "ResendCodeInfo": { + "key": "ResendCodeInfo", + "value": "На Ваш email отправлен код подтверждения." + }, + "Reset": { + "key": "Reset", + "value": "Сброс" + }, + "ResetAccount": { + "key": "ResetAccount", + "value": "Сброс аккаунта" + }, + "ResetAccountButton": { + "key": "ResetAccountButton", + "value": "СБРОСИТЬ АККАУНТ" + }, + "ResetAccountCancelledAlert": { + "key": "ResetAccountCancelledAlert", + "value": "Ваши недавние попытки сброса аккаунта были отменены его активным пользователем. Попробуйте снова через 7 дней." + }, + "ResetAccountInfo": { + "key": "ResetAccountInfo", + "value": "Поскольку аккаунт **%1$s** используется и защищён паролем, в целях безопасности мы удалим его только через неделю.\n\nВы можете передумать и остановить отсчёт в любой момент." + }, + "ResetAccountStatus": { + "key": "ResetAccountStatus", + "value": "Вы сможете сбросить свой аккаунт через:" + }, + "ResetAllNotifications": { + "key": "ResetAllNotifications", + "value": "Сбросить настройки уведомлений" + }, + "ResetAutomaticMediaDownload": { + "key": "ResetAutomaticMediaDownload", + "value": "Сбросить настройки автозагрузки" + }, + "ResetAutomaticMediaDownloadAlert": { + "key": "ResetAutomaticMediaDownloadAlert", + "value": "Вы точно хотите сбросить настройки автозагрузки?" + }, + "ResetAutomaticMediaDownloadAlertTitle": { + "key": "ResetAutomaticMediaDownloadAlertTitle", + "value": "Сбросить настройки" + }, + "ResetChatBackgrounds": { + "key": "ResetChatBackgrounds", + "value": "Сбросить все фоны" + }, + "ResetChatBackgroundsAlert": { + "key": "ResetChatBackgroundsAlert", + "value": "Вы точно хотите сбросить все фоны?" + }, + "ResetChatBackgroundsAlertTitle": { + "key": "ResetChatBackgroundsAlertTitle", + "value": "Сбросить фон чатов" + }, + "ResetChatBackgroundsInfo": { + "key": "ResetChatBackgroundsInfo", + "value": "Удалить все загруженные фоны и восстановить предустановленные фоны для всех тем." + }, + "ResetMyAccount": { + "key": "ResetMyAccount", + "value": "СБРОСИТЬ МОЙ АККАУНТ" + }, + "ResetMyAccountText": { + "key": "ResetMyAccountText", + "value": "Если Вы сбросите аккаунт, все чаты, сообщения и файлы будут утеряны." + }, + "ResetMyAccountWarning": { + "key": "ResetMyAccountWarning", + "value": "Внимание" + }, + "ResetMyAccountWarningReset": { + "key": "ResetMyAccountWarningReset", + "value": "Сбросить аккаунт" + }, + "ResetMyAccountWarningText": { + "key": "ResetMyAccountWarningText", + "value": "Это действие необратимо.\n\nЕсли Вы сбросите свой аккаунт, все сообщения и чаты будут удалены." + }, + "ResetNotificationsAlert": { + "key": "ResetNotificationsAlert", + "value": "Вы точно хотите сбросить настройки уведомлений и использовать настройки по умолчанию?" + }, + "ResetNotificationsAlertTitle": { + "key": "ResetNotificationsAlertTitle", + "value": "Сбросить настройки уведомлений" + }, + "ResetNotificationsText": { + "key": "ResetNotificationsText", + "value": "Настройки уведомлений сброшены на стандартные" + }, + "ResetStatistics": { + "key": "ResetStatistics", + "value": "Сбросить статистику" + }, + "ResetStatisticsAlert": { + "key": "ResetStatisticsAlert", + "value": "Хотите сбросить статистику использования?" + }, + "ResetStatisticsAlertTitle": { + "key": "ResetStatisticsAlertTitle", + "value": "Сбросить статистику" + }, + "RestoreEmailSent": { + "key": "RestoreEmailSent", + "value": "Мы отправили код восстановления на указанный вами адрес электронной почты:\n\n%1$s" + }, + "RestoreEmailSentInfo": { + "key": "RestoreEmailSentInfo", + "value": "Пожалуйста, проверьте почту и введите 6-значный код, который мы на неё отправили." + }, + "RestoreEmailSentTitle": { + "key": "RestoreEmailSentTitle", + "value": "Код для восстановления" + }, + "RestoreEmailTrouble": { + "key": "RestoreEmailTrouble", + "value": "Нет доступа к %1$s?" + }, + "RestoreEmailTroubleNoEmail": { + "key": "RestoreEmailTroubleNoEmail", + "value": "Нет доступа к электронной почте?" + }, + "RestoreEmailTroubleText": { + "key": "RestoreEmailTroubleText", + "value": "Если Вы не можете восстановить доступ к Вашей электронной почте, то оставшиеся варианты — вспомнить пароль или сбросить аккаунт." + }, + "RestorePasswordNoEmailText": { + "key": "RestorePasswordNoEmailText", + "value": "Так как Вы не указали адрес электронной почты для восстановления пароля, то оставшиеся варианты — вспомнить пароль или сбросить аккаунт." + }, + "RestorePasswordNoEmailTitle": { + "key": "RestorePasswordNoEmailTitle", + "value": "Сожалеем" + }, + "RestorePasswordResetAccount": { + "key": "RestorePasswordResetAccount", + "value": "СБРОС АККАУНТА" + }, + "Restrictions": { + "key": "Restrictions", + "zeroValue": null, + "oneValue": "%1$d ограничение", + "twoValue": null, + "fewValue": "%1$d ограничения", + "manyValue": "%1$d ограничений", + "otherValue": "%1$d ограничения" + }, + "Retry": { + "key": "Retry", + "value": "Повторить" + }, + "RetryCall": { + "key": "RetryCall", + "value": "Попробовать снова" + }, + "ReturnToCall": { + "key": "ReturnToCall", + "value": "ВЕРНУТЬСЯ К РАЗГОВОРУ" + }, + "ReverseOrder": { + "key": "ReverseOrder", + "value": "Обратный порядок" + }, + "RevokeAlert": { + "key": "RevokeAlert", + "value": "Вы точно хотите сбросить ссылку? После этого никто не сможет использовать ее, чтобы присоединиться." + }, + "RevokeAlertNewLink": { + "key": "RevokeAlertNewLink", + "value": "Прежняя ссылка-приглашение больше не действует. Создана новая." + }, + "RevokeButton": { + "key": "RevokeButton", + "value": "Сбросить" + }, + "RevokeLink": { + "key": "RevokeLink", + "value": "Сбросить ссылку" + }, + "RevokeLinkAlert": { + "key": "RevokeLinkAlert", + "value": "Вы точно хотите сбросить ссылку **%1$s**?\n\nГруппа \"**%2$s**\" станет частной." + }, + "RevokeLinkAlertChannel": { + "key": "RevokeLinkAlertChannel", + "value": "Вы точно хотите сбросить ссылку **%1$s**?\n\nКанал \"**%2$s**\" станет частным." + }, + "Revoked": { + "key": "Revoked", + "value": "Сброшена" + }, + "RevokedLink": { + "key": "RevokedLink", + "value": "Неактивная ссылка" + }, + "RevokedLinks": { + "key": "RevokedLinks", + "value": "Неактивные ссылки" + }, + "RoamingUsage": { + "key": "RoamingUsage", + "value": "Использование сети в роуминге" + }, + "SETTINGS": { + "key": "SETTINGS", + "value": "Настройки" + }, + "Satellite": { + "key": "Satellite", + "value": "Спутник" + }, + "Saturation": { + "key": "Saturation", + "value": "Насыщенн." + }, + "Save": { + "key": "Save", + "value": "Сохранить" + }, + "SaveChangesAlertText": { + "key": "SaveChangesAlertText", + "value": "Применить выбранные Вами новые цвета?" + }, + "SaveChangesAlertTitle": { + "key": "SaveChangesAlertTitle", + "value": "Сохранить изменения?" + }, + "SaveLink": { + "key": "SaveLink", + "value": "Сохранить" + }, + "SaveTheme": { + "key": "SaveTheme", + "value": "СОХРАНИТЬ ТЕМУ" + }, + "SaveToDownloads": { + "key": "SaveToDownloads", + "value": "Сохранить в загрузки" + }, + "SaveToGIFs": { + "key": "SaveToGIFs", + "value": "Сохранить в свои GIF" + }, + "SaveToGallery": { + "key": "SaveToGallery", + "value": "Сохранить в галерею" + }, + "SaveToGallerySettings": { + "key": "SaveToGallerySettings", + "value": "Сохранять в галерее" + }, + "SaveToMusic": { + "key": "SaveToMusic", + "value": "Сохранить в музыку" + }, + "SavedMessages": { + "key": "SavedMessages", + "value": "Избранное" + }, + "SavedMessagesInfo": { + "key": "SavedMessagesInfo", + "value": "Сохранить на память" + }, + "ScamMessage": { + "key": "ScamMessage", + "value": "SCAM" + }, + "Schedule": { + "key": "Schedule", + "value": "Запланировать" + }, + "ScheduleMessage": { + "key": "ScheduleMessage", + "value": "Отправить позже" + }, + "ScheduleWhenOnline": { + "key": "ScheduleWhenOnline", + "value": "Отправить, когда %1$s будет в сети" + }, + "ScheduledMessages": { + "key": "ScheduledMessages", + "value": "Отложенная отправка" + }, + "ScheduledOrNoSoundHint": { + "key": "ScheduledOrNoSoundHint", + "value": "Удерживайте кнопку, чтобы отправить позже или без звука." + }, + "ScreenCapture": { + "key": "ScreenCapture", + "value": "Разрешить снимки экрана" + }, + "ScreenCaptureAlert": { + "key": "ScreenCaptureAlert", + "value": "Ваши чаты не будут видны в окне переключения задач, но Вы не сможете делать скриншоты в Telegram.\n\nДля вступления настроек в силу может потребоваться перезапуск приложения." + }, + "ScreenCaptureInfo": { + "key": "ScreenCaptureInfo", + "value": "Если выключено, Вы не сможете делать скриншоты приложения, но чаты не будут видны в окне переключения задач." + }, + "SdCard": { + "key": "SdCard", + "value": "Карта памяти" + }, + "Search": { + "key": "Search", + "value": "Поиск" + }, + "SearchAllChatsShort": { + "key": "SearchAllChatsShort", + "value": "Чаты" + }, + "SearchBackgrounds": { + "key": "SearchBackgrounds", + "value": "Поиск фонов" + }, + "SearchByColor": { + "key": "SearchByColor", + "value": "Поиск по цвету" + }, + "SearchEmojiHint": { + "key": "SearchEmojiHint", + "value": "Поиск эмодзи" + }, + "SearchEmptyViewFilteredSubtitle2": { + "key": "SearchEmptyViewFilteredSubtitle2", + "value": "Попробуйте снова." + }, + "SearchEmptyViewFilteredSubtitleFiles": { + "key": "SearchEmptyViewFilteredSubtitleFiles", + "value": "Здесь будут показаны все файлы из Ваших чатов." + }, + "SearchEmptyViewFilteredSubtitleLinks": { + "key": "SearchEmptyViewFilteredSubtitleLinks", + "value": "Здесь будут показаны все ссылки из Ваших чатов." + }, + "SearchEmptyViewFilteredSubtitleMedia": { + "key": "SearchEmptyViewFilteredSubtitleMedia", + "value": "Здесь будут показаны все фотографии и видео из Ваших чатов." + }, + "SearchEmptyViewFilteredSubtitleMusic": { + "key": "SearchEmptyViewFilteredSubtitleMusic", + "value": "Здесь будет показана вся музыка из Ваших чатов." + }, + "SearchEmptyViewFilteredSubtitleVoice": { + "key": "SearchEmptyViewFilteredSubtitleVoice", + "value": "Здесь будут показаны все голосовые сообщения и видеосообщения из Ваших чатов." + }, + "SearchEmptyViewTitle": { + "key": "SearchEmptyViewTitle", + "value": "Нет результатов" + }, + "SearchEmptyViewTitle2": { + "key": "SearchEmptyViewTitle2", + "value": "Нет результатов" + }, + "SearchForChats": { + "key": "SearchForChats", + "value": "Поиск чатов..." + }, + "SearchForPeople": { + "key": "SearchForPeople", + "value": "Поиск людей..." + }, + "SearchForPeopleAndGroups": { + "key": "SearchForPeopleAndGroups", + "value": "Поиск пользователей и групп..." + }, + "SearchFriends": { + "key": "SearchFriends", + "value": "Поиск контактов" + }, + "SearchFrom": { + "key": "SearchFrom", + "value": "от:" + }, + "SearchGifs": { + "key": "SearchGifs", + "value": "НАЙТИ GIF" + }, + "SearchGifsTitle": { + "key": "SearchGifsTitle", + "value": "Поиск GIF" + }, + "SearchImages": { + "key": "SearchImages", + "value": "НАЙТИ ИЗОБРАЖЕНИЯ" + }, + "SearchImagesInfo": { + "key": "SearchImagesInfo", + "value": "ПОИСК В СЕТИ" + }, + "SearchImagesTitle": { + "key": "SearchImagesTitle", + "value": "Поиск в сети" + }, + "SearchInSettings": { + "key": "SearchInSettings", + "value": "Поиск по настройкам и FAQ" + }, + "SearchMembers": { + "key": "SearchMembers", + "value": "Поиск участников" + }, + "SearchMessages": { + "key": "SearchMessages", + "value": "Сообщения" + }, + "SearchMusic": { + "key": "SearchMusic", + "value": "Поиск музыки" + }, + "SearchRecentFiles": { + "key": "SearchRecentFiles", + "value": "Поиск по недавним файлам" + }, + "SearchStickersHint": { + "key": "SearchStickersHint", + "value": "Поиск стикеров" + }, + "SearchTipToday": { + "key": "SearchTipToday", + "value": "Сегодня" + }, + "SearchTipYesterday": { + "key": "SearchTipYesterday", + "value": "Вчера" + }, + "SearchTrendingStickersHint": { + "key": "SearchTrendingStickersHint", + "value": "Поиск популярных стикеров" + }, + "Seconds": { + "key": "Seconds", + "zeroValue": null, + "oneValue": "%1$d сек.", + "twoValue": null, + "fewValue": "%1$d сек.", + "manyValue": "%1$d сек.", + "otherValue": "%1$d сек." + }, + "SecondsBold": { + "key": "SecondsBold", + "zeroValue": null, + "oneValue": "**%1$d** сек.", + "twoValue": null, + "fewValue": "**%1$d** сек.", + "manyValue": "**%1$d** сек.", + "otherValue": "**%1$d** сек." + }, + "SecretChat": { + "key": "SecretChat", + "value": "Секретные чаты" + }, + "SecretChatContextBotAlert": { + "key": "SecretChatContextBotAlert", + "value": "Учтите, что боты создаются сторонними разработчиками. Всё, что Вы введёте после имени бота, будет отправлено его разработчику." + }, + "SecretChatName": { + "key": "SecretChatName", + "value": "Telegram" + }, + "SecretChatTimerDays": { + "key": "SecretChatTimerDays", + "value": "д" + }, + "SecretChatTimerHours": { + "key": "SecretChatTimerHours", + "value": "ч" + }, + "SecretChatTimerMinutes": { + "key": "SecretChatTimerMinutes", + "value": "м" + }, + "SecretChatTimerSeconds": { + "key": "SecretChatTimerSeconds", + "value": "с" + }, + "SecretChatTimerWeeks": { + "key": "SecretChatTimerWeeks", + "value": "нед" + }, + "SecretLinkPreviewAlert": { + "key": "SecretLinkPreviewAlert", + "value": "Вы хотите включить предпросмотр ссылок в секретных чатах? Учтите, что предпросмотр создается на серверах Telegram." + }, + "SecretWebPage": { + "key": "SecretWebPage", + "value": "Предпросмотр ссылок" + }, + "SecretWebPageInfo": { + "key": "SecretWebPageInfo", + "value": "Предпросмотр для ссылок создается на серверах Telegram. Мы не храним данные об отправленных Вами ссылках." + }, + "SecurityTitle": { + "key": "SecurityTitle", + "value": "Безопасность" + }, + "SelectAccount": { + "key": "SelectAccount", + "value": "Выберите аккаунт" + }, + "SelectChat": { + "key": "SelectChat", + "value": "Выберите чат" + }, + "SelectChats": { + "key": "SelectChats", + "value": "Выберите чаты" + }, + "SelectColor": { + "key": "SelectColor", + "value": "Выберите цвет" + }, + "SelectColorTitle": { + "key": "SelectColorTitle", + "value": "Выбор цвета" + }, + "SelectContact": { + "key": "SelectContact", + "value": "Выберите контакт" + }, + "SelectContacts": { + "key": "SelectContacts", + "value": "Выбрать контакты" + }, + "SelectFile": { + "key": "SelectFile", + "value": "Выберите файл" + }, + "SelectFromGallery": { + "key": "SelectFromGallery", + "value": "Выбрать из галереи" + }, + "SelectImage": { + "key": "SelectImage", + "value": "Выбрать изображение" + }, + "Send": { + "key": "Send", + "value": "Отправить" + }, + "SendAnonymously": { + "key": "SendAnonymously", + "value": "Анонимное сообщение" + }, + "SendAsFile": { + "key": "SendAsFile", + "value": "Отправить как файл" + }, + "SendAsFiles": { + "key": "SendAsFiles", + "value": "Как файлы" + }, + "SendAsNewPhoto": { + "key": "SendAsNewPhoto", + "value": "Отправить как новое фото" + }, + "SendByEnter": { + "key": "SendByEnter", + "value": "Отправка по Enter" + }, + "SendContactTo": { + "key": "SendContactTo", + "value": "Отправить контакт %1$s?" + }, + "SendContactToGroup": { + "key": "SendContactToGroup", + "value": "Отправить контакт %1$s?" + }, + "SendContactToGroupText": { + "key": "SendContactToGroupText", + "value": "Хотите отправить этот контакт **%1$s**?" + }, + "SendContactToText": { + "key": "SendContactToText", + "value": "Хотите отправить этот контакт **%1$s**?" + }, + "SendDayAt": { + "key": "SendDayAt", + "value": "'Отправить' d MMM 'в' HH:mm" + }, + "SendDayYearAt": { + "key": "SendDayYearAt", + "value": "'Отправить' d MMM yyyy 'в' HH:mm" + }, + "SendDice": { + "key": "SendDice", + "value": "ОТПРАВИТЬ" + }, + "SendGameTo": { + "key": "SendGameTo", + "value": "Поделиться игрой с %1$s?" + }, + "SendGameToGroup": { + "key": "SendGameToGroup", + "value": "Поделиться игрой с группой %1$s?" + }, + "SendGameToGroupText": { + "key": "SendGameToGroupText", + "value": "Хотите поделиться этой игрой с **%1$s**?" + }, + "SendGameToText": { + "key": "SendGameToText", + "value": "Хотите поделиться этой игрой с **%1$s**?" + }, + "SendGifPreview": { + "key": "SendGifPreview", + "value": "Отправить GIF" + }, + "SendItems": { + "key": "SendItems", + "value": "Отправить %1$s" + }, + "SendLiveLocation": { + "key": "SendLiveLocation", + "value": "Транслировать мою геопозицию" + }, + "SendLiveLocationFor15m": { + "key": "SendLiveLocationFor15m", + "value": "15 минут" + }, + "SendLiveLocationFor1h": { + "key": "SendLiveLocationFor1h", + "value": "1 час" + }, + "SendLiveLocationFor8h": { + "key": "SendLiveLocationFor8h", + "value": "8 часов" + }, + "SendLiveLocationInfo": { + "key": "SendLiveLocationInfo", + "value": "Обновляется в реальном времени" + }, + "SendLiveLocationMenu": { + "key": "SendLiveLocationMenu", + "value": "Транслировать мою геопозицию" + }, + "SendLocation": { + "key": "SendLocation", + "value": "Отправить свою геопозицию" + }, + "SendMessage": { + "key": "SendMessage", + "value": "Отправить сообщение" + }, + "SendMessageLocation": { + "key": "SendMessageLocation", + "value": "Написать" + }, + "SendMessageRestricted": { + "key": "SendMessageRestricted", + "value": "Администраторы группы запретили Вам отправлять сообщения до %1$s" + }, + "SendMessageRestrictedForever": { + "key": "SendMessageRestrictedForever", + "value": "Администраторы группы запретили Вам писать в ней." + }, + "SendMessageTitle": { + "key": "SendMessageTitle", + "value": "Отправить сообщение" + }, + "SendMessageTo": { + "key": "SendMessageTo", + "value": "Добавить людей..." + }, + "SendMessagesTo": { + "key": "SendMessagesTo", + "value": "Отправить сообщения %1$s?" + }, + "SendMessagesToGroup": { + "key": "SendMessagesToGroup", + "value": "Отправить в %1$s?" + }, + "SendMessagesToGroupText": { + "key": "SendMessagesToGroupText", + "value": "Хотите отправить это сообщение **%1$s**?" + }, + "SendMessagesToText": { + "key": "SendMessagesToText", + "value": "Хотите отправить это сообщение **%1$s**?" + }, + "SendSelectedLocation": { + "key": "SendSelectedLocation", + "value": "Отправить выбранную геопозицию" + }, + "SendSticker": { + "key": "SendSticker", + "value": "ОТПРАВИТЬ СТИКЕР" + }, + "SendStickerPreview": { + "key": "SendStickerPreview", + "value": "Отправить стикер" + }, + "SendTodayAt": { + "key": "SendTodayAt", + "value": "'Отправить сегодня в' HH:mm" + }, + "SendWithoutCompression": { + "key": "SendWithoutCompression", + "value": "Отправить без сжатия" + }, + "SendWithoutGrouping": { + "key": "SendWithoutGrouping", + "value": "Отправить без группировки" + }, + "SendWithoutSound": { + "key": "SendWithoutSound", + "value": "Отправить без звука" + }, + "SendingAudio": { + "key": "SendingAudio", + "value": "отправляет аудио..." + }, + "SendingFile": { + "key": "SendingFile", + "value": "отправляет файл..." + }, + "SendingGame": { + "key": "SendingGame", + "value": "играет в игру..." + }, + "SendingGif": { + "key": "SendingGif", + "value": "Отправка GIF..." + }, + "SendingPhoto": { + "key": "SendingPhoto", + "value": "отправляет фото..." + }, + "SendingSms": { + "key": "SendingSms", + "value": "Отправка SMS..." + }, + "SendingVideo": { + "key": "SendingVideo", + "value": "Отправка видео..." + }, + "SendingVideoStatus": { + "key": "SendingVideoStatus", + "value": "отправляет видео..." + }, + "SentAppCode": { + "key": "SentAppCode", + "value": "Мы отправили код в приложение **Telegram** на другом Вашем устройстве." + }, + "SentAppCodeTitle": { + "key": "SentAppCodeTitle", + "value": "Проверьте сообщения в Telegram" + }, + "SentCallCode": { + "key": "SentCallCode", + "value": "Наш робот звонит на номер **%1$s**.\n\nОтвечать на звонок не требуется, Telegram автоматически получит код для входа." + }, + "SentCallOnly": { + "key": "SentCallOnly", + "value": "Мы звоним Вам по номеру **%1$s**, чтобы продиктовать код." + }, + "SentSmsCode": { + "key": "SentSmsCode", + "value": "Мы отправили SMS с кодом проверки на Ваш телефон **%1$s**." + }, + "SentSmsCodeTitle": { + "key": "SentSmsCodeTitle", + "value": "Введите код" + }, + "September": { + "key": "September", + "value": "Сентябрь" + }, + "ServiceNotifications": { + "key": "ServiceNotifications", + "value": "Служебные уведомления" + }, + "SessionsInfo": { + "key": "SessionsInfo", + "value": "Управление сеансами на других устройствах." + }, + "SessionsTitle": { + "key": "SessionsTitle", + "value": "Активные сеансы" + }, + "Set": { + "key": "Set", + "value": "Установить" + }, + "SetAdditionalPassword": { + "key": "SetAdditionalPassword", + "value": "Установить дополнительный пароль" + }, + "SetAdditionalPasswordInfo": { + "key": "SetAdditionalPasswordInfo", + "value": "Вы можете установить пароль, который будет запрашиваться при входе с нового устройства в дополнение к коду из SMS." + }, + "SetAdmins": { + "key": "SetAdmins", + "value": "Назначить администраторов" + }, + "SetAdminsAll": { + "key": "SetAdminsAll", + "value": "Права администратора у всех" + }, + "SetAdminsAllInfo": { + "key": "SetAdminsAllInfo", + "value": "Все участники могут добавлять новых участников, закреплять сообщения, изменять имя и фото группы." + }, + "SetAdminsNotAllInfo": { + "key": "SetAdminsNotAllInfo", + "value": "Только администраторы могут добавлять и удалять участников, закреплять сообщения, изменять имя и фото группы." + }, + "SetAdminsTitle": { + "key": "SetAdminsTitle", + "value": "Администраторы чата" + }, + "SetAsAdmin": { + "key": "SetAsAdmin", + "value": "Сделать администратором" + }, + "SetAsMain": { + "key": "SetAsMain", + "value": "Сделать основной" + }, + "SetBackground": { + "key": "SetBackground", + "value": "УСТАНОВИТЬ ФОН" + }, + "SetColor": { + "key": "SetColor", + "value": "Задать цвет" + }, + "SetPasscode": { + "key": "SetPasscode", + "value": "Установить код-пароль" + }, + "SetPasscodeInfo": { + "key": "SetPasscodeInfo", + "value": "Включите код-пароль для разблокировки приложения на Вашем устройстве." + }, + "SetProfilePhoto": { + "key": "SetProfilePhoto", + "value": "Выбрать фотографию" + }, + "SetRecoveryEmail": { + "key": "SetRecoveryEmail", + "value": "Указать адрес электронной почты" + }, + "SetReminder": { + "key": "SetReminder", + "value": "Задать напоминание" + }, + "SetTimeLimit": { + "key": "SetTimeLimit", + "value": "Выбрать срок действия" + }, + "SetTimer": { + "key": "SetTimer", + "value": "Включить удаление по таймеру" + }, + "SetUrlAvailable": { + "key": "SetUrlAvailable", + "value": "Ссылка %1$s доступна." + }, + "SetUrlChecking": { + "key": "SetUrlChecking", + "value": "Проверка..." + }, + "SetUrlInUse": { + "key": "SetUrlInUse", + "value": "К сожалению, ссылка уже занята." + }, + "SetUrlInvalid": { + "key": "SetUrlInvalid", + "value": "Эта ссылка некорректна." + }, + "SetUrlInvalidLong": { + "key": "SetUrlInvalidLong", + "value": "Максимальная длина ссылки — 64 символа." + }, + "SetUrlInvalidShort": { + "key": "SetUrlInvalidShort", + "value": "Минимальная длина ссылки — 5 символов." + }, + "SetUrlInvalidStartNumber": { + "key": "SetUrlInvalidStartNumber", + "value": "Ссылка не может начинаться с цифры." + }, + "SetUrlPlaceholder": { + "key": "SetUrlPlaceholder", + "value": "Ссылка" + }, + "Settings": { + "key": "Settings", + "value": "Настройки" + }, + "SettingsDebug": { + "key": "SettingsDebug", + "value": "Отладка" + }, + "SettingsFaqSearchTitle": { + "key": "SettingsFaqSearchTitle", + "value": "Часто задаваемые вопросы" + }, + "SettingsHelp": { + "key": "SettingsHelp", + "value": "Помощь" + }, + "SettingsNoRecent": { + "key": "SettingsNoRecent", + "value": "Нет недавних запросов" + }, + "SettingsNoResults": { + "key": "SettingsNoResults", + "value": "Ничего не найдено" + }, + "SettingsRecent": { + "key": "SettingsRecent", + "value": "История поиска" + }, + "SettingsSearchFaq": { + "key": "SettingsSearchFaq", + "value": "FAQ" + }, + "Shadows": { + "key": "Shadows", + "value": "Тени" + }, + "ShareComment": { + "key": "ShareComment", + "value": "Оставьте комментарий..." + }, + "ShareContact": { + "key": "ShareContact", + "value": "Поделиться контактом" + }, + "ShareContactTitle": { + "key": "ShareContactTitle", + "value": "Отправить контакт" + }, + "ShareFile": { + "key": "ShareFile", + "value": "Поделиться" + }, + "ShareLink": { + "key": "ShareLink", + "value": "Поделиться ссылкой" + }, + "ShareLocation": { + "key": "ShareLocation", + "value": "Геопозиция" + }, + "ShareLocationAlertButton": { + "key": "ShareLocationAlertButton", + "value": "Поделиться" + }, + "ShareLocationAlertText": { + "key": "ShareLocationAlertText", + "value": "Чтобы получить уведомление, необходимо поделиться геопозицией в этом чате." + }, + "ShareLocationAlertTitle": { + "key": "ShareLocationAlertTitle", + "value": "Поделиться геопозицией" + }, + "ShareMyContactInfo": { + "key": "ShareMyContactInfo", + "value": "Отправить свой телефон" + }, + "ShareMyPhone": { + "key": "ShareMyPhone", + "value": "ПОКАЗАТЬ МОЙ НОМЕР ТЕЛЕФОНА" + }, + "SharePhoneNumberWith": { + "key": "SharePhoneNumberWith", + "value": "Показать %1$s мой номер телефона" + }, + "ShareQrCode": { + "key": "ShareQrCode", + "value": "Поделиться" + }, + "ShareSendTo": { + "key": "ShareSendTo", + "value": "Искать..." + }, + "ShareTelegram": { + "key": "ShareTelegram", + "value": "Пригласить в Telegram..." + }, + "ShareTheme": { + "key": "ShareTheme", + "value": "Поделиться темой" + }, + "ShareYouLocationInfo": { + "key": "ShareYouLocationInfo", + "value": "Это отправит боту Вашу геопозицию." + }, + "ShareYouLocationInline": { + "key": "ShareYouLocationInline", + "value": "Бот хочет получать Вашу геопозицию каждый раз, когда Вы отправляете ему запрос. Это может использоваться, чтобы показывать нужную выдачу в зависимости от того, где Вы." + }, + "ShareYouLocationTitle": { + "key": "ShareYouLocationTitle", + "value": "Поделиться геопозицией?" + }, + "ShareYouLocationUnable": { + "key": "ShareYouLocationUnable", + "value": "Приложению не удалось определить Вашу геопозицию" + }, + "ShareYouLocationUnableManually": { + "key": "ShareYouLocationUnableManually", + "value": "Выбрать вручную" + }, + "ShareYouPhoneNumberTitle": { + "key": "ShareYouPhoneNumberTitle", + "value": "Поделиться номером телефона?" + }, + "Shared": { + "key": "Shared", + "zeroValue": null, + "oneValue": "%1$s поделился", + "twoValue": null, + "fewValue": "%1$s поделились", + "manyValue": "%1$s поделились", + "otherValue": "%1$s поделились" + }, + "SharedAudioFiles": { + "key": "SharedAudioFiles", + "value": "Аудиофайлы" + }, + "SharedContent": { + "key": "SharedContent", + "value": "Общие материалы" + }, + "SharedContentTitle": { + "key": "SharedContentTitle", + "value": "Общие материалы" + }, + "SharedFilesTab": { + "key": "SharedFilesTab", + "value": "ФАЙЛЫ" + }, + "SharedFilesTab2": { + "key": "SharedFilesTab2", + "value": "Файлы" + }, + "SharedGIFsTab2": { + "key": "SharedGIFsTab2", + "value": "GIF" + }, + "SharedGroupsTab2": { + "key": "SharedGroupsTab2", + "value": "Группы" + }, + "SharedLinks": { + "key": "SharedLinks", + "value": "Ссылки" + }, + "SharedLinksTab": { + "key": "SharedLinksTab", + "value": "ССЫЛКИ" + }, + "SharedLinksTab2": { + "key": "SharedLinksTab2", + "value": "Ссылки" + }, + "SharedMedia": { + "key": "SharedMedia", + "value": "Общие медиа" + }, + "SharedMediaTab": { + "key": "SharedMediaTab", + "value": "МЕДИА" + }, + "SharedMediaTab2": { + "key": "SharedMediaTab2", + "value": "Медиа" + }, + "SharedMediaTabFull2": { + "key": "SharedMediaTabFull2", + "value": "Общие материалы" + }, + "SharedMediaTitle": { + "key": "SharedMediaTitle", + "value": "Общие медиа" + }, + "SharedMusicTab": { + "key": "SharedMusicTab", + "value": "МУЗЫКА" + }, + "SharedMusicTab2": { + "key": "SharedMusicTab2", + "value": "Музыка" + }, + "SharedPhotosAndVideos": { + "key": "SharedPhotosAndVideos", + "value": "Фотографии и видео" + }, + "SharedPlace": { + "key": "SharedPlace", + "value": "Место" + }, + "SharedToPrivateMessagesAndGroups": { + "key": "SharedToPrivateMessagesAndGroups", + "value": "в личные сообщения и группы" + }, + "SharedVoiceTab": { + "key": "SharedVoiceTab", + "value": "ГОЛОС" + }, + "SharedVoiceTab2": { + "key": "SharedVoiceTab2", + "value": "Голосовые" + }, + "Shares": { + "key": "Shares", + "zeroValue": null, + "oneValue": "%1$s поделился", + "twoValue": null, + "fewValue": "%1$s поделились", + "manyValue": "%1$s поделились", + "otherValue": "%1$s поделились" + }, + "SharesPerPost": { + "key": "SharesPerPost", + "value": "Пересылка постов" + }, + "SharingLiveLocationTitle": { + "key": "SharingLiveLocationTitle", + "value": "Вы транслируете геопозицию в %1$s" + }, + "SharingYouAndOtherName": { + "key": "SharingYouAndOtherName", + "value": "Вы и %1$s" + }, + "Sharpen": { + "key": "Sharpen", + "value": "Резкость" + }, + "Short": { + "key": "Short", + "value": "Короткий" + }, + "ShortMessageLifetimeForever": { + "key": "ShortMessageLifetimeForever", + "value": "Откл." + }, + "ShowAllFiles": { + "key": "ShowAllFiles", + "value": "Все файлы" + }, + "ShowAllGIFs": { + "key": "ShowAllGIFs", + "value": "Показать все GIF" + }, + "ShowAllMedia": { + "key": "ShowAllMedia", + "value": "Показать все медиа" + }, + "ShowAllThemes": { + "key": "ShowAllThemes", + "value": "Показать все темы" + }, + "ShowAsGrid": { + "key": "ShowAsGrid", + "value": "Показать в виде сетки" + }, + "ShowAsList": { + "key": "ShowAsList", + "value": "Показать списком" + }, + "ShowInChat": { + "key": "ShowInChat", + "value": "Показать в чате" + }, + "ShowNearbyPlaces": { + "key": "ShowNearbyPlaces", + "value": "Потяните, чтобы выбрать место" + }, + "ShowNotificationsFor": { + "key": "ShowNotificationsFor", + "value": "Показывать уведомления" + }, + "ShowNotificationsForInfo": { + "key": "ShowNotificationsForInfo", + "value": "Отключите, если хотите получать только уведомления активного аккаунта." + }, + "ShowStickers": { + "key": "ShowStickers", + "value": "Показать стикеры" + }, + "ShowVotes": { + "key": "ShowVotes", + "zeroValue": null, + "oneValue": "Показать больше (%1$d)", + "twoValue": null, + "fewValue": "Показать больше (%1$d)", + "manyValue": "Показать больше (%1$d)", + "otherValue": "Показать больше (%1$d)" + }, + "Shuffle": { + "key": "Shuffle", + "value": "Случайный порядок" + }, + "ShuffleList": { + "key": "ShuffleList", + "value": "Перемешать список" + }, + "SignUp": { + "key": "SignUp", + "value": "Зарегистрироваться" + }, + "SinglePhotosHelp": { + "key": "SinglePhotosHelp", + "value": "\nНе группировать фотографии" + }, + "SlideToCancel": { + "key": "SlideToCancel", + "value": "ВЛЕВО — ОТМЕНА" + }, + "SlideUpToLock": { + "key": "SlideUpToLock", + "value": "Вверх — продолжать запись" + }, + "SlowModeHint": { + "key": "SlowModeHint", + "value": "Включён медленный режим. Вы сможете написать через %1$s" + }, + "Slowmode": { + "key": "Slowmode", + "value": "Медленный режим" + }, + "SlowmodeHours": { + "key": "SlowmodeHours", + "value": "%1$d ч" + }, + "SlowmodeInfoOff": { + "key": "SlowmodeInfoOff", + "value": "Выберите, как часто каждый участник сможет писать в группу." + }, + "SlowmodeInfoSelected": { + "key": "SlowmodeInfoSelected", + "value": "Участники не смогут отправить больше одного сообщения за %1$s" + }, + "SlowmodeMinutes": { + "key": "SlowmodeMinutes", + "value": "%1$d мин" + }, + "SlowmodeOff": { + "key": "SlowmodeOff", + "value": "Нет" + }, + "SlowmodeSeconds": { + "key": "SlowmodeSeconds", + "value": "%1$d сек" + }, + "SlowmodeSelectSendError": { + "key": "SlowmodeSelectSendError", + "value": "Включён медленный режим. Вы не можете выбрать больше элементов." + }, + "SlowmodeSendError": { + "key": "SlowmodeSendError", + "value": "Включён медленный режим. Вы не можете отправить больше одного сообщения за раз." + }, + "SlowmodeSendErrorTooLong": { + "key": "SlowmodeSendErrorTooLong", + "value": "К сожалению, текст слишком длинный для одного сообщения. \n\nВключён медленный режим. Вы не можете отправить больше одного сообщения за раз." + }, + "SmartNotifications": { + "key": "SmartNotifications", + "value": "Умные уведомления" + }, + "SmartNotificationsAlert": { + "key": "SmartNotificationsAlert", + "value": "Частота звуковых уведомлений" + }, + "SmartNotificationsDetail": { + "key": "SmartNotificationsDetail", + "value": "%1$s в течение %2$s" + }, + "SmartNotificationsDisabled": { + "key": "SmartNotificationsDisabled", + "value": "Откл." + }, + "SmartNotificationsInfo": { + "key": "SmartNotificationsInfo", + "value": "%1$d / %2$s" + }, + "SmsText": { + "key": "SmsText", + "value": "Мы отправим Вам SMS через %1$d:%2$02d" + }, + "SoftUserLimitAlert": { + "key": "SoftUserLimitAlert", + "value": "Вы сможете добавить больше участников после создания группы." + }, + "SoftenSkin": { + "key": "SoftenSkin", + "value": "Гладкая кожа" + }, + "SortBy": { + "key": "SortBy", + "value": "Сортировать по" + }, + "SortFirstName": { + "key": "SortFirstName", + "value": "Имя" + }, + "SortLastName": { + "key": "SortLastName", + "value": "Фамилия" + }, + "SortedByLastSeen": { + "key": "SortedByLastSeen", + "value": "Сортировка по времени входа" + }, + "SortedByName": { + "key": "SortedByName", + "value": "Сортировка по имени" + }, + "Sound": { + "key": "Sound", + "value": "Звук" + }, + "SoundDefault": { + "key": "SoundDefault", + "value": "По умолчанию" + }, + "SoundMuted": { + "key": "SoundMuted", + "value": "Звук отключён" + }, + "Speaking": { + "key": "Speaking", + "value": "говорит" + }, + "Start": { + "key": "Start", + "value": "Начать" + }, + "StartEncryptedChat": { + "key": "StartEncryptedChat", + "value": "Начать секретный чат" + }, + "StartMessaging": { + "key": "StartMessaging", + "value": "Начать общение" + }, + "StartText": { + "key": "StartText", + "value": "Пожалуйста, укажите код страны и свой номер телефона." + }, + "StartVoipChat": { + "key": "StartVoipChat", + "value": "Начать голосовой чат" + }, + "StartVoipChatAlertText": { + "key": "StartVoipChatAlertText", + "value": "Начать голосовой чат в этой группе?" + }, + "StartVoipChatPermission": { + "key": "StartVoipChatPermission", + "value": "Управление голосовыми чатами" + }, + "StartVoipChatTitle": { + "key": "StartVoipChatTitle", + "value": "Голосовой чат" + }, + "StatisticOpenProfile": { + "key": "StatisticOpenProfile", + "value": "Открыть профиль" + }, + "StatisticOverview": { + "key": "StatisticOverview", + "value": "Общая" + }, + "StatisticSearchUserHistory": { + "key": "StatisticSearchUserHistory", + "value": "Посмотреть сообщения" + }, + "StatisticViews": { + "key": "StatisticViews", + "value": "Просмотры" + }, + "Statistics": { + "key": "Statistics", + "value": "Статистика" + }, + "StickerSets": { + "key": "StickerSets", + "zeroValue": null, + "oneValue": "%1$s набор стикеров", + "twoValue": null, + "fewValue": "%1$s набора стикеров", + "manyValue": "%1$s наборов стикеров", + "otherValue": "%1$s наборов стикеров" + }, + "Stickers": { + "key": "Stickers", + "value": "СТИКЕРЫ" + }, + "StickersAndMasks": { + "key": "StickersAndMasks", + "value": "Стикеры и маски" + }, + "StickersArchived": { + "key": "StickersArchived", + "value": "Стикеры архивированы." + }, + "StickersArchivedInfo": { + "key": "StickersArchivedInfo", + "value": "Набор %1$s перемещён в архив." + }, + "StickersBotInfo": { + "key": "StickersBotInfo", + "value": "Художники могут создавать собственные наборы с помощью бота @stickers." + }, + "StickersCopy": { + "key": "StickersCopy", + "value": "Копировать ссылку" + }, + "StickersHide": { + "key": "StickersHide", + "value": "Архивировать" + }, + "StickersName": { + "key": "StickersName", + "value": "Стикеры и маски" + }, + "StickersRemove": { + "key": "StickersRemove", + "value": "Удалить" + }, + "StickersRemoved": { + "key": "StickersRemoved", + "value": "Стикеры удалены" + }, + "StickersRemovedInfo": { + "key": "StickersRemovedInfo", + "value": "Набор %1$s удалён из Ваших стикеров." + }, + "StickersReorder": { + "key": "StickersReorder", + "value": "Изменить порядок" + }, + "StickersReorderHint": { + "key": "StickersReorderHint", + "value": "Передвиньте нужные наборы." + }, + "StickersShare": { + "key": "StickersShare", + "value": "Поделиться" + }, + "Stop": { + "key": "Stop", + "value": "Остановить" + }, + "StopAllLocationSharings": { + "key": "StopAllLocationSharings", + "value": "ОСТАНОВИТЬ ВСЕ" + }, + "StopDownload": { + "key": "StopDownload", + "value": "Остановить загрузку" + }, + "StopLiveLocation": { + "key": "StopLiveLocation", + "value": "Остановить трансляцию" + }, + "StopLiveLocationAlertAll": { + "key": "StopLiveLocationAlertAll", + "value": "Вы точно хотите остановить трансляцию геопозиции?" + }, + "StopLiveLocationAlertAllText": { + "key": "StopLiveLocationAlertAllText", + "value": "Хотите перестать транслировать геопозицию?" + }, + "StopLiveLocationAlertToGroup": { + "key": "StopLiveLocationAlertToGroup", + "value": "Вы точно хотите прекратить транслировать свою геопозицию в чат %1$s?" + }, + "StopLiveLocationAlertToGroupText": { + "key": "StopLiveLocationAlertToGroupText", + "value": "Хотите перестать транслировать геопозицию **%1$s**?" + }, + "StopLiveLocationAlertToTitle": { + "key": "StopLiveLocationAlertToTitle", + "value": "Остановить трансляцию" + }, + "StopLiveLocationAlertToUser": { + "key": "StopLiveLocationAlertToUser", + "value": "Прекратить транслировать геопозицию в чат с %1$s?" + }, + "StopLiveLocationAlertToUserText": { + "key": "StopLiveLocationAlertToUserText", + "value": "Хотите перестать транслировать геопозицию **%1$s**?" + }, + "StopLoading": { + "key": "StopLoading", + "value": "Остановить загрузку?" + }, + "StopPoll": { + "key": "StopPoll", + "value": "Остановить опрос" + }, + "StopPollAlertText": { + "key": "StopPollAlertText", + "value": "Если остановить опрос, никто больше не сможет проголосовать в нём. Это действие нельзя будет отменить." + }, + "StopPollAlertTitle": { + "key": "StopPollAlertTitle", + "value": "Остановить опрос?" + }, + "StopQuiz": { + "key": "StopQuiz", + "value": "Остановить викторину" + }, + "StopQuizAlertText": { + "key": "StopQuizAlertText", + "value": "Если остановить викторину, никто больше не сможет ответить в ней. Это действие нельзя будет отменить." + }, + "StopQuizAlertTitle": { + "key": "StopQuizAlertTitle", + "value": "Остановить викторину?" + }, + "StopShowingMe": { + "key": "StopShowingMe", + "value": "Не показывать меня" + }, + "StopVerification": { + "key": "StopVerification", + "value": "Вы действительно хотите остановить подтверждение номера телефона?" + }, + "StoragePath": { + "key": "StoragePath", + "value": "Путь для сохранения" + }, + "StorageUsage": { + "key": "StorageUsage", + "value": "Использование памяти" + }, + "Streaming": { + "key": "Streaming", + "value": "Стриминг" + }, + "Strike": { + "key": "Strike", + "value": "Зачёркнутый" + }, + "Subscribers": { + "key": "Subscribers", + "zeroValue": null, + "oneValue": "%1$d подписчик", + "twoValue": null, + "fewValue": "%1$d подписчика", + "manyValue": "%1$d подписчиков", + "otherValue": "%1$d подписчиков" + }, + "SuggestContacts": { + "key": "SuggestContacts", + "value": "Подсказка людей при поиске" + }, + "SuggestContactsAlert": { + "key": "SuggestContactsAlert", + "value": "В этом случае информация о том, каким пользователям Вы часто пишете и какими ботами обычно пользуетесь, будет удалена." + }, + "SuggestContactsInfo": { + "key": "SuggestContactsInfo", + "value": "Показывать пользователей, которым Вы часто пишете, вверху в разделе поиска." + }, + "SuggestContactsTitle": { + "key": "SuggestContactsTitle", + "value": "Отключить подсказки" + }, + "SuggestStickers": { + "key": "SuggestStickers", + "value": "Подсказка по эмодзи" + }, + "SuggestStickersAll": { + "key": "SuggestStickersAll", + "value": "Любые стикеры" + }, + "SuggestStickersInstalled": { + "key": "SuggestStickersInstalled", + "value": "Стикеры из своих наборов" + }, + "SuggestStickersNone": { + "key": "SuggestStickersNone", + "value": "Нет" + }, + "Support": { + "key": "Support", + "value": "Поддержка" + }, + "SupportStatus": { + "key": "SupportStatus", + "value": "поддержка" + }, + "SyncContacts": { + "key": "SyncContacts", + "value": "Синхронизировать контакты" + }, + "SyncContactsAdded": { + "key": "SyncContactsAdded", + "value": "Контакты с этого устройства были добавлены к Вашему аккаунту." + }, + "SyncContactsDelete": { + "key": "SyncContactsDelete", + "value": "Удалить импортированные контакты" + }, + "SyncContactsDeleteInfo": { + "key": "SyncContactsDeleteInfo", + "value": "В этом случае Ваши контакты будут удалены с серверов Telegram. Если включена опция «Синхронизировать контакты», контакты синхронизируются заново." + }, + "SyncContactsDeleteText": { + "key": "SyncContactsDeleteText", + "value": "В этом случае Ваши контакты будут удалены с серверов Telegram.\n\nЕсли включена опция **Синхронизировать контакты**, контакты синхронизируются заново." + }, + "SyncContactsDeleteTitle": { + "key": "SyncContactsDeleteTitle", + "value": "Удалить контакты" + }, + "SyncContactsInfoOff": { + "key": "SyncContactsInfoOff", + "value": "Включите, чтобы добавлять контакты с этого устройства к Вашему аккаунту." + }, + "SyncContactsInfoOn": { + "key": "SyncContactsInfoOn", + "value": "Контакты с этого устройства будут импортироваться в Ваш аккаунт." + }, + "SyncContactsOff": { + "key": "SyncContactsOff", + "value": "Контакты с этого устройства не будут импортироваться для этого аккаунта." + }, + "SyncContactsOn": { + "key": "SyncContactsOn", + "value": "Контакты с этого устройства будут импортироваться для этого аккаунта." + }, + "SystemRoot": { + "key": "SystemRoot", + "value": "Корневой каталог" + }, + "TapForVideo": { + "key": "TapForVideo", + "value": "Нажмите для фото, удерживайте для видео" + }, + "TapHereGifs": { + "key": "TapHereGifs", + "value": "Нажмите для доступа к сохранённым GIF" + }, + "TapOnThePencil": { + "key": "TapOnThePencil", + "value": "Нажмите на карандаш для начала общения" + }, + "TapToChange": { + "key": "TapToChange", + "value": "Нажмите для изменения" + }, + "TapToChangePhone": { + "key": "TapToChangePhone", + "value": "Нажмите, чтобы изменить номер телефона" + }, + "TapToDownload": { + "key": "TapToDownload", + "value": "Нажмите для загрузки" + }, + "TapToEditWidget": { + "key": "TapToEditWidget", + "value": "нажмите для изменения" + }, + "TapToEditWidgetShort": { + "key": "TapToEditWidgetShort", + "value": "нажмите для изменения" + }, + "TapToSendLocation": { + "key": "TapToSendLocation", + "value": "Нажмите для отправки геопозиции" + }, + "TapToTurnCamera": { + "key": "TapToTurnCamera", + "value": "Нажмите здесь, чтобы включить камеру" + }, + "TapToViewAsList": { + "key": "TapToViewAsList", + "value": "Перейти к списку" + }, + "Teal": { + "key": "Teal", + "value": "Цвет морской волны" + }, + "TelegramCacheSize": { + "key": "TelegramCacheSize", + "value": "%s кэша Telegram" + }, + "TelegramContacts": { + "key": "TelegramContacts", + "zeroValue": null, + "oneValue": "%1$d контакт в Telegram", + "twoValue": null, + "fewValue": "%1$d контакта в Telegram", + "manyValue": "%1$d контактов в Telegram", + "otherValue": "%1$d контактов в Telegram" + }, + "TelegramFAQ": { + "key": "TelegramFAQ", + "value": "Вопросы о Telegram" + }, + "TelegramFaq": { + "key": "TelegramFaq", + "value": "Вопросы о Telegram" + }, + "TelegramFaqUrl": { + "key": "TelegramFaqUrl", + "value": "https://telegram.org/faq" + }, + "TelegramPassport": { + "key": "TelegramPassport", + "value": "Telegram Passport" + }, + "TelegramPassportCreatePassword": { + "key": "TelegramPassportCreatePassword", + "value": "ЗАДАТЬ ПАРОЛЬ" + }, + "TelegramPassportCreatePasswordInfo": { + "key": "TelegramPassportCreatePasswordInfo", + "value": "Чтобы защитить свои данные оконечным шифрованием, пожалуйста, задайте пароль.\n\nЭтот пароль также будет запрашиваться при входе в Telegram с нового устройства." + }, + "TelegramPassportDelete": { + "key": "TelegramPassportDelete", + "value": "Удалить Telegram Passport" + }, + "TelegramPassportDeleteAlert": { + "key": "TelegramPassportDeleteAlert", + "value": "Вы точно хотите удалить свой Telegram Passport?" + }, + "TelegramPassportDeleteTitle": { + "key": "TelegramPassportDeleteTitle", + "value": "Удалить Telegram passport" + }, + "TelegramVersion": { + "key": "TelegramVersion", + "value": "Telegram для Android %1$s" + }, + "Terminate": { + "key": "Terminate", + "value": "Завершить" + }, + "TerminateAllSessions": { + "key": "TerminateAllSessions", + "value": "Завершить все другие сеансы" + }, + "TerminateAllWebSessions": { + "key": "TerminateAllWebSessions", + "value": "Отключить все сайты" + }, + "TerminateSessionInfo": { + "key": "TerminateSessionInfo", + "value": "Нажмите на сеанс, чтобы завершить его." + }, + "TerminateSessionQuestion": { + "key": "TerminateSessionQuestion", + "value": "Завершить этот сеанс?" + }, + "TerminateSessionText": { + "key": "TerminateSessionText", + "value": "Вы точно хотите завершить этот сеанс?" + }, + "TerminateWebSessionInfo": { + "key": "TerminateWebSessionInfo", + "value": "Нажмите на сайт, чтобы отключить его." + }, + "TerminateWebSessionQuestion": { + "key": "TerminateWebSessionQuestion", + "value": "Отключить %1$s?" + }, + "TerminateWebSessionStop": { + "key": "TerminateWebSessionStop", + "value": "Заблокировать %1$s" + }, + "TerminateWebSessionText": { + "key": "TerminateWebSessionText", + "value": "Вы точно хотите отключить %1$s?" + }, + "TerminateWebSessionTitle": { + "key": "TerminateWebSessionTitle", + "value": "Отключить сайт" + }, + "TerminateWebSessionsTitle": { + "key": "TerminateWebSessionsTitle", + "value": "Отключить сайты" + }, + "TermsOfService": { + "key": "TermsOfService", + "value": "Пользовательское соглашение" + }, + "TermsOfServiceLogin": { + "key": "TermsOfServiceLogin", + "value": "Регистрируясь,\nВы принимаете *Пользовательское соглашение*." + }, + "TextCopied": { + "key": "TextCopied", + "value": "Текст скопирован в буфер обмена" + }, + "TextSelectionHit": { + "key": "TextSelectionHit", + "value": "Удерживайте нужное **слово**, затем выделите курсором текст, чтобы скопировать его." + }, + "TextSize": { + "key": "TextSize", + "value": "Размер текста сообщений" + }, + "TextSizeHeader": { + "key": "TextSizeHeader", + "value": "Размер текста сообщений" + }, + "Theme": { + "key": "Theme", + "value": "Тема" + }, + "ThemeArcticBlue": { + "key": "ThemeArcticBlue", + "value": "Холодная" + }, + "ThemeBlue": { + "key": "ThemeBlue", + "value": "Моно" + }, + "ThemeClassic": { + "key": "ThemeClassic", + "value": "Классическая" + }, + "ThemeCreateHelp": { + "key": "ThemeCreateHelp", + "value": "По этой ссылке тему может установить любой пользователь. Когда Вы редактируете тему, она будет автоматически обновляться у всех, кто её использует.\n\nНовая тема будет создана на основе темы и фона, которые Вы используете" + }, + "ThemeCreateHelp2": { + "key": "ThemeCreateHelp2", + "value": "Вы можете выбрать другую ссылку для темы.\n\nМинимальная длина ссылки — 5 символов. Можно использовать символы a-z, 0-9 и подчеркивание." + }, + "ThemeDark": { + "key": "ThemeDark", + "value": "Тёмная" + }, + "ThemeDarkBlue": { + "key": "ThemeDarkBlue", + "value": "Тёмно-синяя" + }, + "ThemeDay": { + "key": "ThemeDay", + "value": "Дневная" + }, + "ThemeGraphite": { + "key": "ThemeGraphite", + "value": "Графитовая" + }, + "ThemeHelpLink": { + "key": "ThemeHelpLink", + "value": "Когда Вы редактируете тему, она будет автоматически обновляться у всех, кто её использует.\n\nПо этой ссылке тему может установить любой пользователь:\n%1$s" + }, + "ThemeInfo": { + "key": "ThemeInfo", + "value": "Выбрать свою цветовую схему" + }, + "ThemeInstallCount": { + "key": "ThemeInstallCount", + "zeroValue": null, + "oneValue": "Число установок: %1$d ", + "twoValue": null, + "fewValue": "Число установок: %1$d ", + "manyValue": "Число установок: %1$d ", + "otherValue": "Число установок: %1$d " + }, + "ThemeNameInvalid": { + "key": "ThemeNameInvalid", + "value": "Некорректное название темы." + }, + "ThemeNamePlaceholder": { + "key": "ThemeNamePlaceholder", + "value": "Название" + }, + "ThemeNight": { + "key": "ThemeNight", + "value": "Ночная" + }, + "ThemeNotFound": { + "key": "ThemeNotFound", + "value": "Тема не найдена" + }, + "ThemeNotSupported": { + "key": "ThemeNotSupported", + "value": "Эта цветовая тема пока не поддерживается на Вашем устройстве." + }, + "ThemePreview": { + "key": "ThemePreview", + "value": "Предпросмотр темы" + }, + "ThemePreviewDialog1": { + "key": "ThemePreviewDialog1", + "value": "Ева" + }, + "ThemePreviewDialog2": { + "key": "ThemePreviewDialog2", + "value": "Дух Соревнования" + }, + "ThemePreviewDialog3": { + "key": "ThemePreviewDialog3", + "value": "Майк" + }, + "ThemePreviewDialog4": { + "key": "ThemePreviewDialog4", + "value": "Квентин" + }, + "ThemePreviewDialog5": { + "key": "ThemePreviewDialog5", + "value": "Старые пираты" + }, + "ThemePreviewDialog6": { + "key": "ThemePreviewDialog6", + "value": "Вероника" + }, + "ThemePreviewDialog7": { + "key": "ThemePreviewDialog7", + "value": "Ник К" + }, + "ThemePreviewDialog8": { + "key": "ThemePreviewDialog8", + "value": "Adler Toberg" + }, + "ThemePreviewDialogMessage1": { + "key": "ThemePreviewDialogMessage1", + "value": "Есть китайская мудрость об эт..." + }, + "ThemePreviewDialogMessage2": { + "key": "ThemePreviewDialogMessage2", + "value": "Кстати, обновил исходный код." + }, + "ThemePreviewDialogMessage3": { + "key": "ThemePreviewDialogMessage3", + "value": "Стикер 🤷‍♂️" + }, + "ThemePreviewDialogMessage4": { + "key": "ThemePreviewDialogMessage4", + "value": "Ну что, есть идеи?" + }, + "ThemePreviewDialogMessage5": { + "key": "ThemePreviewDialogMessage5", + "value": "Йо-хо-хо" + }, + "ThemePreviewDialogMessage6": { + "key": "ThemePreviewDialogMessage6", + "value": "Салют!" + }, + "ThemePreviewDialogMessage7": { + "key": "ThemePreviewDialogMessage7", + "value": "Это не те дроиды, что вы ищете." + }, + "ThemePreviewDialogMessage8": { + "key": "ThemePreviewDialogMessage8", + "value": "Кто-то упомянул арахисовую пасту?" + }, + "ThemePreviewLine1": { + "key": "ThemePreviewLine1", + "value": "Райнхардт, надо тебе подобрать музычки посвежее 🎶" + }, + "ThemePreviewLine2": { + "key": "ThemePreviewLine2", + "value": "Ты серьёзно?" + }, + "ThemePreviewLine3": { + "key": "ThemePreviewLine3", + "value": "А что не так с классикой? Обожаю Хассельхофа!" + }, + "ThemePreviewLine3Reply": { + "key": "ThemePreviewLine3Reply", + "value": "Лусио" + }, + "ThemePreviewLine4": { + "key": "ThemePreviewLine4", + "value": "Эпическая фраза!" + }, + "ThemePreviewSongPerformer": { + "key": "ThemePreviewSongPerformer", + "value": "David Hasselhoff" + }, + "ThemePreviewSongTitle": { + "key": "ThemePreviewSongTitle", + "value": "True Survivor" + }, + "ThemePreviewTitle": { + "key": "ThemePreviewTitle", + "value": "Райнхардт" + }, + "ThemeResetToDefaults": { + "key": "ThemeResetToDefaults", + "value": "Восстановить по умолчанию" + }, + "ThemeResetToDefaultsText": { + "key": "ThemeResetToDefaultsText", + "value": "Вы точно хотите сбросить размер текста и настройки цвета?" + }, + "ThemeResetToDefaultsTitle": { + "key": "ThemeResetToDefaultsTitle", + "value": "Сброс настроек" + }, + "ThemeSetUrl": { + "key": "ThemeSetUrl", + "value": "Задать ссылку" + }, + "ThemeSetUrlHelp": { + "key": "ThemeSetUrlHelp", + "value": "Можно использовать символы a-z, 0-9 и _.\nМинимальная длина ссылки — 5 символов." + }, + "ThemeUrl": { + "key": "ThemeUrl", + "value": "Ссылка на тему" + }, + "TimeLimitHelp": { + "key": "TimeLimitHelp", + "value": "Вы можете выбрать срок действия для этой ссылки." + }, + "TimeLimitHint": { + "key": "TimeLimitHint", + "value": "Выбрать другой срок" + }, + "TimeToEdit": { + "key": "TimeToEdit", + "value": "%1$s" + }, + "TimeToEditExpired": { + "key": "TimeToEditExpired", + "value": "Время на редактирование истекло." + }, + "Times": { + "key": "Times", + "zeroValue": null, + "oneValue": "%1$d раз", + "twoValue": null, + "fewValue": "%1$d раза", + "manyValue": "%1$d раз", + "otherValue": "%1$d раз" + }, + "TintHighlights": { + "key": "TintHighlights", + "value": "СВЕТ" + }, + "TintShadows": { + "key": "TintShadows", + "value": "ТЕНИ" + }, + "TodayAt": { + "key": "TodayAt", + "value": "в" + }, + "TodayAtFormatted": { + "key": "TodayAtFormatted", + "value": "в %1$s" + }, + "TodayAtFormattedWithToday": { + "key": "TodayAtFormattedWithToday", + "value": "сегодня в %1$s" + }, + "TooManyCommunities": { + "key": "TooManyCommunities", + "value": "Максимум сообществ" + }, + "TooManyCommunitiesHintCreate": { + "key": "TooManyCommunitiesHintCreate", + "value": "У Вас максимальное число групп и каналов. Пожалуйста, покиньте какую-нибудь группу или канал, прежде чем создавать новые." + }, + "TooManyCommunitiesHintEdit": { + "key": "TooManyCommunitiesHintEdit", + "value": "У Вас максимальное число групп и каналов.\nПо техническим причинам для изменения этой настройки нужно покинуть какую-нибудь группу или канал." + }, + "TooManyCommunitiesHintJoin": { + "key": "TooManyCommunitiesHintJoin", + "value": "У Вас максимальное число групп и каналов. Пожалуйста, сперва покиньте какую-нибудь группу или канал." + }, + "TooManyTries": { + "key": "TooManyTries", + "value": "Слишком много попыток.\nПожалуйста, повторите через %1$s." + }, + "TopAdmins": { + "key": "TopAdmins", + "value": "Администраторы" + }, + "TopDaysOfWeekChartTitle": { + "key": "TopDaysOfWeekChartTitle", + "value": "Активные дни недели" + }, + "TopHoursChartTitle": { + "key": "TopHoursChartTitle", + "value": "Просмотры по часам (UTC)" + }, + "TopInviters": { + "key": "TopInviters", + "value": "Приглашения" + }, + "TopMembers": { + "key": "TopMembers", + "value": "Участники" + }, + "TosAgeText": { + "key": "TosAgeText", + "value": "Нажмите «Принять» для подтверждения, что Вам %1$s лет или более." + }, + "TosAgeTitle": { + "key": "TosAgeTitle", + "value": "Подтверждение возраста" + }, + "TosDecline": { + "key": "TosDecline", + "value": "К сожалению, это означает, что Вы не сможете зарегистрироваться в Telegram.\n\nВ отличие от других сервисов, мы не используем Ваши данные для рекламы и других коммерческих целей. На серверах хранится только та информация, которая позволяет Вам полноценно пользоваться Telegram. Вы можете регулировать доступ к своим данным в настройках приложения, в разделе Конфиденциальность и безопасность.\n\nЕсли Вы не готовы предоставить минимальные нужные данные, увы, мы не сможем обеспечить работу Telegram." + }, + "TosDeclineDeleteAccount": { + "key": "TosDeclineDeleteAccount", + "value": "Внимание: в этом случае Ваш аккаунт в Telegram будет необратимо удален вместе со всей информацией, которую Вы храните на серверах Telegram.\n\nВажно: Вы можете отменить удаление и сначала экспортировать данные аккаунта, чтобы не потерять их. (Для этого зайдите в аккаунт через свежую версию Telegram для ПК и выберите Настройки > Экспорт данных из Telegram.)" + }, + "TosUpdateDecline": { + "key": "TosUpdateDecline", + "value": "К сожалению, в этом случае придется отказаться от использования Telegram. \n\nВ отличие от других сервисов, мы не используем Ваши данные для рекламы и иных коммерческих целей. На серверах хранится только та информация, которая позволяет Вам полноценно пользоваться Telegram. Вы можете регулировать доступ к своим данным в настройках приложения, в разделе Конфиденциальность и безопасность.\n\nЕсли Вы не готовы предоставить минимальные нужные данные , увы, мы не сможем обеспечить работу Telegram. Вы можете удалить аккаунт — или сперва осмотреться и удалить аккаунт позже, если останутся сомнения." + }, + "TotalDataUsage": { + "key": "TotalDataUsage", + "value": "Всего" + }, + "TotalDeviceFreeSize": { + "key": "TotalDeviceFreeSize", + "value": "%s свободно" + }, + "TotalDeviceSize": { + "key": "TotalDeviceSize", + "value": "%s других данных" + }, + "TurnPasswordOff": { + "key": "TurnPasswordOff", + "value": "Отключить пароль" + }, + "TurnPasswordOffPassport": { + "key": "TurnPasswordOffPassport", + "value": "Внимание! Все данные, сохранённые в Вашем Telegram Passport, будут потеряны!" + }, + "TurnPasswordOffQuestion": { + "key": "TurnPasswordOffQuestion", + "value": "Вы точно хотите отключить пароль?" + }, + "TurnPasswordOffQuestionTitle": { + "key": "TurnPasswordOffQuestionTitle", + "value": "Отключить пароль" + }, + "TwoStepVerification": { + "key": "TwoStepVerification", + "value": "Двухэтапная аутентификация" + }, + "TwoStepVerificationPasswordReturnPassport": { + "key": "TwoStepVerificationPasswordReturnPassport", + "value": "Вернуться к паспорту" + }, + "TwoStepVerificationPasswordReturnSettings": { + "key": "TwoStepVerificationPasswordReturnSettings", + "value": "Вернуться к настройкам" + }, + "TwoStepVerificationPasswordSet": { + "key": "TwoStepVerificationPasswordSet", + "value": "Пароль установлен" + }, + "TwoStepVerificationPasswordSetInfo": { + "key": "TwoStepVerificationPasswordSetInfo", + "value": "Этот пароль потребуется вводить при авторизации с нового устройства в дополнение к коду из SMS." + }, + "TwoStepVerificationSetPassword": { + "key": "TwoStepVerificationSetPassword", + "value": "Задать пароль" + }, + "TwoStepVerificationShowPassword": { + "key": "TwoStepVerificationShowPassword", + "value": "Показать пароль" + }, + "TwoStepVerificationTitle": { + "key": "TwoStepVerificationTitle", + "value": "Двухэтапная аутентификация" + }, + "TypeLocationGroup": { + "key": "TypeLocationGroup", + "value": "Ссылка" + }, + "TypeLocationGroupEdit": { + "key": "TypeLocationGroupEdit", + "value": "Нажмите, чтобы добавить ссылку" + }, + "TypeMessage": { + "key": "TypeMessage", + "value": "Сообщение" + }, + "TypePrivate": { + "key": "TypePrivate", + "value": "Частный" + }, + "TypePrivateGroup": { + "key": "TypePrivateGroup", + "value": "Частная" + }, + "TypePublic": { + "key": "TypePublic", + "value": "Публичный" + }, + "TypePublicGroup": { + "key": "TypePublicGroup", + "value": "Публичная" + }, + "TypeScheduleMessage": { + "key": "TypeScheduleMessage", + "value": "Отложенное сообщение" + }, + "Typing": { + "key": "Typing", + "value": "печатает..." + }, + "URL": { + "key": "URL", + "value": "URL" + }, + "Unarchive": { + "key": "Unarchive", + "value": "Вернуть" + }, + "Unavailable": { + "key": "Unavailable", + "value": "Недоступен" + }, + "Unban": { + "key": "Unban", + "value": "Разблокировать" + }, + "UnbanText": { + "key": "UnbanText", + "value": "Чтобы разблокировать пользователя, нажмите на его имя и удерживайте." + }, + "Unblock": { + "key": "Unblock", + "value": "Разблокировать" + }, + "UnblockText": { + "key": "UnblockText", + "value": "Нажмите и удерживайте имя пользователя для разблокировки" + }, + "Underline": { + "key": "Underline", + "value": "Подчёркнутый" + }, + "Undo": { + "key": "Undo", + "value": "ОТМЕНА" + }, + "UndoAllCustom": { + "key": "UndoAllCustom", + "value": "Сбросить особые настройки уведомлений для отдельных контактов, чатов и каналов." + }, + "UnhideFromTop": { + "key": "UnhideFromTop", + "value": "Закрепить" + }, + "UnknownError": { + "key": "UnknownError", + "value": "Неизвестная ошибка" + }, + "UnlockFingerprint": { + "key": "UnlockFingerprint", + "value": "Разблокировка отпечатком пальца" + }, + "UnmuteNotifications": { + "key": "UnmuteNotifications", + "value": "Включить уведомления" + }, + "UnofficialApp": { + "key": "UnofficialApp", + "value": "неофициальное приложение" + }, + "UnpinAllMessages": { + "key": "UnpinAllMessages", + "value": "Открепить все сообщения" + }, + "UnpinFromTop": { + "key": "UnpinFromTop", + "value": "Открепить" + }, + "UnpinMessage": { + "key": "UnpinMessage", + "value": "Открепить" + }, + "UnpinMessageAlert": { + "key": "UnpinMessageAlert", + "value": "Хотите открепить это сообщение?" + }, + "UnpinMessageAlertTitle": { + "key": "UnpinMessageAlertTitle", + "value": "Открепить сообщение" + }, + "UnreadMessages": { + "key": "UnreadMessages", + "value": "Непрочитанные сообщения" + }, + "UnsupportedAttachment": { + "key": "UnsupportedAttachment", + "value": "Вложение не поддерживается" + }, + "UnsupportedMedia": { + "key": "UnsupportedMedia", + "value": "Сообщение не поддерживается Вашей версией Telegram. Пожалуйста, обновите приложение, чтобы его увидеть: https://telegram.org/update" + }, + "Unvote": { + "key": "Unvote", + "value": "Отменить голос" + }, + "Update": { + "key": "Update", + "value": "ОБНОВИТЬ" + }, + "UpdateApp": { + "key": "UpdateApp", + "value": "Обновить приложение" + }, + "UpdateAppAlert": { + "key": "UpdateAppAlert", + "value": "К сожалению, Ваша версия приложения устарела и не может обработать этот запрос. Пожалуйста, обновите Telegram." + }, + "UpdateContactsMessage": { + "key": "UpdateContactsMessage", + "value": "Обнаружено много несинхронизированных контактов, хотите синхронизировать их? Нажмите «ОК», если сейчас Вы используете своё устройство, SIM-карту и аккаунт Google." + }, + "UpdateContactsTitle": { + "key": "UpdateContactsTitle", + "value": "Обновить контакты?" + }, + "UpdateNow": { + "key": "UpdateNow", + "value": "ОБНОВИТЬ СЕЙЧАС" + }, + "UpdateTelegram": { + "key": "UpdateTelegram", + "value": "Обновление Telegram" + }, + "UpdatedMinutes": { + "key": "UpdatedMinutes", + "zeroValue": null, + "oneValue": "обновлена %1$d минуту назад", + "twoValue": null, + "fewValue": "обновлена %1$d минуты назад", + "manyValue": "обновлена %1$d минут назад", + "otherValue": "обновлена %1$d минут назад" + }, + "Updating": { + "key": "Updating", + "value": "Обновление..." + }, + "UpgradeGroup": { + "key": "UpgradeGroup", + "value": "Сделать супергруппой" + }, + "UploadImage": { + "key": "UploadImage", + "value": "Загрузить изображение" + }, + "UploadItems": { + "key": "UploadItems", + "value": "Загрузить %1$s" + }, + "UsbActive": { + "key": "UsbActive", + "value": "Передача по USB активна" + }, + "UseDifferentTheme": { + "key": "UseDifferentTheme", + "value": "Использовать другую тему" + }, + "UseDifferentThemeInfo": { + "key": "UseDifferentThemeInfo", + "value": "Вы также можете взять за основу для темы уже существующую пользовательскую тему." + }, + "UseLessDataAlways": { + "key": "UseLessDataAlways", + "value": "Всегда" + }, + "UseLessDataNever": { + "key": "UseLessDataNever", + "value": "Никогда" + }, + "UseLessDataOnMobile": { + "key": "UseLessDataOnMobile", + "value": "В мобильной сети" + }, + "UseLessDataOnRoaming": { + "key": "UseLessDataOnRoaming", + "value": "Только в роуминге" + }, + "UseProxyAddress": { + "key": "UseProxyAddress", + "value": "Сервер" + }, + "UseProxyForCalls": { + "key": "UseProxyForCalls", + "value": "Использовать прокси для звонков" + }, + "UseProxyForCallsInfo": { + "key": "UseProxyForCallsInfo", + "value": "Использование прокси может ухудшить качество звонков." + }, + "UseProxyInfo": { + "key": "UseProxyInfo", + "value": "Настройки SOCKS5-прокси" + }, + "UseProxyPassword": { + "key": "UseProxyPassword", + "value": "Пароль" + }, + "UseProxyPort": { + "key": "UseProxyPort", + "value": "Порт" + }, + "UseProxySecret": { + "key": "UseProxySecret", + "value": "Ключ" + }, + "UseProxySettings": { + "key": "UseProxySettings", + "value": "Использовать прокси" + }, + "UseProxySocks5": { + "key": "UseProxySocks5", + "value": "Прокси SOCKS5" + }, + "UseProxySponsor": { + "key": "UseProxySponsor", + "value": "Спонсор прокси" + }, + "UseProxySponsorInfo": { + "key": "UseProxySponsorInfo", + "value": "Этот канал показан прокси-сервером. Чтобы убрать канал из списка чатов, отключите прокси в настройках Telegram." + }, + "UseProxyTelegram": { + "key": "UseProxyTelegram", + "value": "Прокси MTProto" + }, + "UseProxyTelegramError": { + "key": "UseProxyTelegramError", + "value": "Подключенный Вами прокси-сервер использует некорректные настройки и будет отключен. Пожалуйста, выберите другой." + }, + "UseProxyTelegramInfo": { + "key": "UseProxyTelegramInfo", + "value": "Настройки прокси MTProto." + }, + "UseProxyTelegramInfo2": { + "key": "UseProxyTelegramInfo2", + "value": "Этот прокси-сервер может показывать канал спонсора в списке Ваших чатов. Это не раскрывает Ваш трафик." + }, + "UseProxyUsername": { + "key": "UseProxyUsername", + "value": "Логин" + }, + "UserBio": { + "key": "UserBio", + "value": "О себе" + }, + "UserBioDetail": { + "key": "UserBioDetail", + "value": "Напишите немного о себе" + }, + "UserBioEmpty": { + "key": "UserBioEmpty", + "value": "Не заполнено" + }, + "UserBioInfo": { + "key": "UserBioInfo", + "value": "Вы можете добавить несколько строк о себе. Они будут видны всем, кто откроет Ваш профиль." + }, + "UserBlocked": { + "key": "UserBlocked", + "value": "Пользователь заблокирован" + }, + "UserChannelTooMuchJoin": { + "key": "UserChannelTooMuchJoin", + "value": "У пользователя максимальное число групп и каналов. Пожалуйста, предложите ему сперва покинуть какую-нибудь группу или канал." + }, + "UserRemovedBy": { + "key": "UserRemovedBy", + "value": "Исключил(а) %1$s" + }, + "UserRemovedFromChatHint": { + "key": "UserRemovedFromChatHint", + "value": "**%1$s** исключен(а) из **%2$s**" + }, + "UserRestricted": { + "key": "UserRestricted", + "value": "К сожалению, Вам запрещено это действие." + }, + "UserRestrictions": { + "key": "UserRestrictions", + "value": "Разрешения" + }, + "UserRestrictionsApplyChanges": { + "key": "UserRestrictionsApplyChanges", + "value": "Применить изменения?" + }, + "UserRestrictionsApplyChangesText": { + "key": "UserRestrictionsApplyChangesText", + "value": "Вы изменили права пользователя в **%1$s**. Применить изменения?" + }, + "UserRestrictionsBlock": { + "key": "UserRestrictionsBlock", + "value": "Заблокировать и удалить из группы" + }, + "UserRestrictionsBy": { + "key": "UserRestrictionsBy", + "value": "Ограничил(а): %1$s" + }, + "UserRestrictionsCanDo": { + "key": "UserRestrictionsCanDo", + "value": "Пользователю разрешено:" + }, + "UserRestrictionsChangeInfo": { + "key": "UserRestrictionsChangeInfo", + "value": "Изменение профиля группы" + }, + "UserRestrictionsCustom": { + "key": "UserRestrictionsCustom", + "value": "Другой" + }, + "UserRestrictionsDisabled": { + "key": "UserRestrictionsDisabled", + "value": "Это действие отключено для всех участников в настройках группы" + }, + "UserRestrictionsDuration": { + "key": "UserRestrictionsDuration", + "value": "Срок" + }, + "UserRestrictionsEmbedLinks": { + "key": "UserRestrictionsEmbedLinks", + "value": "Предпросмотр для ссылок" + }, + "UserRestrictionsInviteUsers": { + "key": "UserRestrictionsInviteUsers", + "value": "Добавление участников" + }, + "UserRestrictionsNoChangeInfo": { + "key": "UserRestrictionsNoChangeInfo", + "value": "без изменений профиля" + }, + "UserRestrictionsNoEmbedLinks": { + "key": "UserRestrictionsNoEmbedLinks", + "value": "без предпросмотра ссылок" + }, + "UserRestrictionsNoInviteUsers": { + "key": "UserRestrictionsNoInviteUsers", + "value": "без приглашений" + }, + "UserRestrictionsNoPinMessages": { + "key": "UserRestrictionsNoPinMessages", + "value": "без закрепления" + }, + "UserRestrictionsNoRead": { + "key": "UserRestrictionsNoRead", + "value": "без чтения" + }, + "UserRestrictionsNoSend": { + "key": "UserRestrictionsNoSend", + "value": "без отправки" + }, + "UserRestrictionsNoSendMedia": { + "key": "UserRestrictionsNoSendMedia", + "value": "без медиа" + }, + "UserRestrictionsNoSendPolls": { + "key": "UserRestrictionsNoSendPolls", + "value": "без опросов" + }, + "UserRestrictionsNoSendStickers": { + "key": "UserRestrictionsNoSendStickers", + "value": "без стикеров и GIF" + }, + "UserRestrictionsPinMessages": { + "key": "UserRestrictionsPinMessages", + "value": "Закрепление сообщений" + }, + "UserRestrictionsRead": { + "key": "UserRestrictionsRead", + "value": "Просмотр сообщений" + }, + "UserRestrictionsSend": { + "key": "UserRestrictionsSend", + "value": "Отправка сообщений" + }, + "UserRestrictionsSendMedia": { + "key": "UserRestrictionsSendMedia", + "value": "Отправка медиа" + }, + "UserRestrictionsSendPolls": { + "key": "UserRestrictionsSendPolls", + "value": "Отправка опросов" + }, + "UserRestrictionsSendStickers": { + "key": "UserRestrictionsSendStickers", + "value": "Отправка стикеров и GIF" + }, + "UserRestrictionsUntil": { + "key": "UserRestrictionsUntil", + "value": "Срок ограничений" + }, + "UserRestrictionsUntilForever": { + "key": "UserRestrictionsUntilForever", + "value": "Навсегда" + }, + "UserSetAsAdminHint": { + "key": "UserSetAsAdminHint", + "value": "**%1$s** назначен(а) администратором" + }, + "UserUnblocked": { + "key": "UserUnblocked", + "value": "Пользователь разблокирован" + }, + "Username": { + "key": "Username", + "value": "Имя пользователя" + }, + "UsernameAvailable": { + "key": "UsernameAvailable", + "value": "Имя пользователя %1$s свободно." + }, + "UsernameChecking": { + "key": "UsernameChecking", + "value": "Проверка имени пользователя..." + }, + "UsernameCopied": { + "key": "UsernameCopied", + "value": "Текст скопирован в буфер обмена." + }, + "UsernameEmpty": { + "key": "UsernameEmpty", + "value": "Не задано" + }, + "UsernameHelp": { + "key": "UsernameHelp", + "value": "Вы можете выбрать публичное имя пользователя в **Telegram**. В этом случае другие люди смогут найти Вас по такому имени и связаться, не зная Вашего телефона.\n\nВы можете использовать символы **a–z**, **0–9** и подчёркивания. Минимальная длина – **5** символов." + }, + "UsernameHelpLink": { + "key": "UsernameHelpLink", + "value": "По этой ссылке открывается диалог с Вами:\n%1$s" + }, + "UsernameInUse": { + "key": "UsernameInUse", + "value": "Такое имя пользователя занято." + }, + "UsernameInvalid": { + "key": "UsernameInvalid", + "value": "Такое имя пользователя недоступно." + }, + "UsernameInvalidLong": { + "key": "UsernameInvalidLong", + "value": "Имя пользователя не может быть длиннее 32 символов." + }, + "UsernameInvalidShort": { + "key": "UsernameInvalidShort", + "value": "Имя пользователя должно содержать не меньше 5 символов." + }, + "UsernameInvalidStartNumber": { + "key": "UsernameInvalidStartNumber", + "value": "Имя пользователя не может начинаться с цифры." + }, + "UsernamePlaceholder": { + "key": "UsernamePlaceholder", + "value": "Ваше имя пользователя" + }, + "Users": { + "key": "Users", + "zeroValue": null, + "oneValue": "%1$d пользователь", + "twoValue": null, + "fewValue": "%1$d пользователя", + "manyValue": "%1$d пользователей", + "otherValue": "%1$d пользователей" + }, + "UsersCount": { + "key": "UsersCount", + "zeroValue": null, + "oneValue": "%1$d пользователю", + "twoValue": null, + "fewValue": "%1$d пользователям", + "manyValue": "%1$d пользователям", + "otherValue": "%1$d пользователям" + }, + "UsersCountTitle": { + "key": "UsersCountTitle", + "zeroValue": null, + "oneValue": "%1$d человека", + "twoValue": null, + "fewValue": "%1$d человек", + "manyValue": "%1$d человек", + "otherValue": "%1$d человек" + }, + "UsersPluralized": { + "key": "UsersPluralized", + "zeroValue": null, + "oneValue": "%@ пользователь", + "twoValue": null, + "fewValue": "%@ пользователя", + "manyValue": "%@ пользователей", + "otherValue": "%@ пользователей" + }, + "UsesLimitHelp": { + "key": "UsesLimitHelp", + "value": "Вы можете выбрать, сколько пользователей смогут присоединиться к группе по этой ссылке." + }, + "UsesLimitHint": { + "key": "UsesLimitHint", + "value": "Выбрать другое число" + }, + "VerificationCode": { + "key": "VerificationCode", + "value": "Код подтверждения" + }, + "ViaBot": { + "key": "ViaBot", + "value": "via" + }, + "Vibrate": { + "key": "Vibrate", + "value": "Вибросигнал" + }, + "VibrationDefault": { + "key": "VibrationDefault", + "value": "По умолчанию" + }, + "VibrationDisabled": { + "key": "VibrationDisabled", + "value": "Откл." + }, + "VideoCall": { + "key": "VideoCall", + "value": "Видеозвонок" + }, + "VideoCallAlert": { + "key": "VideoCallAlert", + "value": "Начать видеозвонок **%1$s**?" + }, + "VideoCallAlertTitle": { + "key": "VideoCallAlertTitle", + "value": "Видеозвонок" + }, + "VideoCallViaTelegram": { + "key": "VideoCallViaTelegram", + "value": "Видеозвонок через Telegram" + }, + "VideoCaption": { + "key": "VideoCaption", + "value": "Подпись к видео" + }, + "VideoDoesNotSupportStreaming": { + "key": "VideoDoesNotSupportStreaming", + "value": "Это видео не рассчитано на потоковую загрузку. Возможно, для просмотра потребуется скачать его." + }, + "VideoMessagesAutodownload": { + "key": "VideoMessagesAutodownload", + "value": "Видеосообщения" + }, + "VideoQualityIsTooLow": { + "key": "VideoQualityIsTooLow", + "value": "Качество видео слишком низкое для изменения настроек сжатия." + }, + "VideoSavedHint": { + "key": "VideoSavedHint", + "value": "Видео сохранено в галерею" + }, + "VideoSavedToDownloadsHint": { + "key": "VideoSavedToDownloadsHint", + "value": "Видео сохранено в загрузки" + }, + "Videos": { + "key": "Videos", + "zeroValue": null, + "oneValue": "%1$d видео", + "twoValue": null, + "fewValue": "%1$d видео", + "manyValue": "%1$d видео", + "otherValue": "%1$d видео" + }, + "VideosSavedHint": { + "key": "VideosSavedHint", + "zeroValue": null, + "oneValue": "%1$d видео сохранено в галерею", + "twoValue": null, + "fewValue": "%1$d видео сохранено в галерею", + "manyValue": "%1$d видео сохранено в галерею", + "otherValue": "%1$d видео сохранено в галерею" + }, + "VideosSelected": { + "key": "VideosSelected", + "zeroValue": null, + "oneValue": "выбрано %1$d видео", + "twoValue": null, + "fewValue": "выбрано %1$d видео", + "manyValue": "выбрано %1$d видео", + "otherValue": "выбрано %1$d видео" + }, + "ViewChannelStats": { + "key": "ViewChannelStats", + "value": "Просмотр статистики канала" + }, + "ViewContact": { + "key": "ViewContact", + "value": "ПРОСМОТР КОНТАКТА" + }, + "ViewDetails": { + "key": "ViewDetails", + "value": "ПОДРОБНЕЕ" + }, + "ViewDiscussion": { + "key": "ViewDiscussion", + "value": "Просмотреть обсуждение" + }, + "ViewExceptions": { + "key": "ViewExceptions", + "value": "Показать исключения" + }, + "ViewInChat": { + "key": "ViewInChat", + "value": "Просмотреть в чате" + }, + "ViewMessage": { + "key": "ViewMessage", + "value": "Открыть сообщение" + }, + "ViewMessageStatistic": { + "key": "ViewMessageStatistic", + "value": "Статистика сообщения" + }, + "ViewPackPreview": { + "key": "ViewPackPreview", + "value": "Посмотреть набор" + }, + "ViewReplies": { + "key": "ViewReplies", + "zeroValue": null, + "oneValue": "Просмотрeть %1$d ответ", + "twoValue": null, + "fewValue": "Просмотрeть %1$d ответа", + "manyValue": "Просмотрeть %1$d ответов", + "otherValue": "Просмотрeть %1$d ответа" + }, + "ViewStats": { + "key": "ViewStats", + "value": "Просмотр статистики" + }, + "ViewThread": { + "key": "ViewThread", + "value": "Просмотреть ответы" + }, + "ViewingMembers": { + "key": "ViewingMembers", + "value": "Читают" + }, + "Views": { + "key": "Views", + "zeroValue": null, + "oneValue": "%1$s просмотр", + "twoValue": null, + "fewValue": "%1$s просмотра", + "manyValue": "%1$s просмотров", + "otherValue": "%1$s просмотров" + }, + "ViewsBySourceChartTitle": { + "key": "ViewsBySourceChartTitle", + "value": "Источники просмотров" + }, + "ViewsPerPost": { + "key": "ViewsPerPost", + "value": "Просмотры постов" + }, + "Vignette": { + "key": "Vignette", + "value": "Виньетка" + }, + "Voice": { + "key": "Voice", + "zeroValue": null, + "oneValue": "%1$d голосовое сообщение", + "twoValue": null, + "fewValue": "%1$d голосовых сообщения", + "manyValue": "%1$d голосовых сообщений", + "otherValue": "%1$d голосовых сообщений" + }, + "VoipAnswerCall": { + "key": "VoipAnswerCall", + "value": "Ответить" + }, + "VoipAnsweringAsAccount": { + "key": "VoipAnsweringAsAccount", + "value": "ответить как %s" + }, + "VoipAudioRoutingBluetooth": { + "key": "VoipAudioRoutingBluetooth", + "value": "Bluetooth" + }, + "VoipAudioRoutingEarpiece": { + "key": "VoipAudioRoutingEarpiece", + "value": "Наушники" + }, + "VoipAudioRoutingHeadset": { + "key": "VoipAudioRoutingHeadset", + "value": "Наушники" + }, + "VoipAudioRoutingSpeaker": { + "key": "VoipAudioRoutingSpeaker", + "value": "Динамик" + }, + "VoipBusy": { + "key": "VoipBusy", + "value": "Линия занята" + }, + "VoipCallEnded": { + "key": "VoipCallEnded", + "value": "Звонок завершён" + }, + "VoipChatJoin": { + "key": "VoipChatJoin", + "value": "Вступить" + }, + "VoipConnecting": { + "key": "VoipConnecting", + "value": "Соединение" + }, + "VoipDeclineCall": { + "key": "VoipDeclineCall", + "value": "Отклонить" + }, + "VoipEndCall": { + "key": "VoipEndCall", + "value": "Завершить" + }, + "VoipErrorUnknown": { + "key": "VoipErrorUnknown", + "value": "Не удалось позвонить через Telegram." + }, + "VoipExchangingKeys": { + "key": "VoipExchangingKeys", + "value": "Обмен ключами шифрования" + }, + "VoipFailed": { + "key": "VoipFailed", + "value": "Не удалось соединиться" + }, + "VoipFeedbackCommentHint": { + "key": "VoipFeedbackCommentHint", + "value": "Ваш комментарий (необязательно)" + }, + "VoipFlip": { + "key": "VoipFlip", + "value": "Повернуть" + }, + "VoipGroupAdd": { + "key": "VoipGroupAdd", + "value": "Добавить" + }, + "VoipGroupAddMemberText": { + "key": "VoipGroupAddMemberText", + "value": "Добавить **%1$s** в **%2$s**?" + }, + "VoipGroupAddMemberTitle": { + "key": "VoipGroupAddMemberTitle", + "value": "Добавить участника" + }, + "VoipGroupAllCanSpeak": { + "key": "VoipGroupAllCanSpeak", + "value": "Все участники говорят" + }, + "VoipGroupAllowToSpeak": { + "key": "VoipGroupAllowToSpeak", + "value": "Разрешить говорить" + }, + "VoipGroupConnecting": { + "key": "VoipGroupConnecting", + "value": "Соединение..." + }, + "VoipGroupCopyInviteLink": { + "key": "VoipGroupCopyInviteLink", + "value": "Копировать ссылку" + }, + "VoipGroupCopyInviteLinkCopied": { + "key": "VoipGroupCopyInviteLinkCopied", + "value": "Ссылка скопирована в буфер обмена." + }, + "VoipGroupEnd": { + "key": "VoipGroupEnd", + "value": "Завершить" + }, + "VoipGroupEndAlertText": { + "key": "VoipGroupEndAlertText", + "value": "Вы точно хотите завершить голосовой чат?" + }, + "VoipGroupEndAlertTitle": { + "key": "VoipGroupEndAlertTitle", + "value": "Завершить голосовой чат" + }, + "VoipGroupEndChat": { + "key": "VoipGroupEndChat", + "value": "Завершить голосовой чат" + }, + "VoipGroupEndedStartNew": { + "key": "VoipGroupEndedStartNew", + "value": "Голосовой чат завершён. Начать новый?" + }, + "VoipGroupInviteAlreadyParticipant": { + "key": "VoipGroupInviteAlreadyParticipant", + "value": "Этот пользователь уже есть в голосовом чате." + }, + "VoipGroupInviteMember": { + "key": "VoipGroupInviteMember", + "value": "Пригласить участников" + }, + "VoipGroupInviteText": { + "key": "VoipGroupInviteText", + "value": "Присоединяйся к нашему голосовому чату: %1$s" + }, + "VoipGroupInvitedToVoiceChat": { + "key": "VoipGroupInvitedToVoiceChat", + "value": "un1 пригласил(а) un2 в голосовой чат" + }, + "VoipGroupInvitedUser": { + "key": "VoipGroupInvitedUser", + "value": "Вы пригласили **%1$s** в голосовой чат." + }, + "VoipGroupJoinAnonymousAdmin": { + "key": "VoipGroupJoinAnonymousAdmin", + "value": "Анонимные администраторы не могут участвовать в голосовых чатах." + }, + "VoipGroupJoinCall": { + "key": "VoipGroupJoinCall", + "value": "Войти в голосовой чат" + }, + "VoipGroupLeave": { + "key": "VoipGroupLeave", + "value": "Выйти" + }, + "VoipGroupLeaveAlertEndChat": { + "key": "VoipGroupLeaveAlertEndChat", + "value": "Завершить голосовой чат" + }, + "VoipGroupLeaveAlertText": { + "key": "VoipGroupLeaveAlertText", + "value": "Вы точно хотите выйти из этого голосового чата?" + }, + "VoipGroupLeaveAlertTitle": { + "key": "VoipGroupLeaveAlertTitle", + "value": "Выход из чата" + }, + "VoipGroupMute": { + "key": "VoipGroupMute", + "value": "Выключить микрофон" + }, + "VoipGroupMuteForMe": { + "key": "VoipGroupMuteForMe", + "value": "Выкл. звук для меня" + }, + "VoipGroupMuteMemberAlertText": { + "key": "VoipGroupMuteMemberAlertText", + "value": "Выключить микрофон **%1$s** в этом голосовом чате?" + }, + "VoipGroupMuteMemberAlertTitle": { + "key": "VoipGroupMuteMemberAlertTitle", + "value": "Выкл. микрофон" + }, + "VoipGroupMutedForMe": { + "key": "VoipGroupMutedForMe", + "value": "Без звука для Вас" + }, + "VoipGroupOffline": { + "key": "VoipGroupOffline", + "value": "Вы не в сети. Чтобы присоединиться к голосовому чату, пожалуйста, подключитесь к интернету." + }, + "VoipGroupOfflineAirplane": { + "key": "VoipGroupOfflineAirplane", + "value": "Активирован режим полёта. Чтобы присоединиться к голосовому чату, отключите режим полёта или подключитесь к Wi-Fi." + }, + "VoipGroupOnlyAdminsCanSpeak": { + "key": "VoipGroupOnlyAdminsCanSpeak", + "value": "Новые участники не говорят" + }, + "VoipGroupOpenProfile": { + "key": "VoipGroupOpenProfile", + "value": "Открыть профиль" + }, + "VoipGroupOpenVoiceChat": { + "key": "VoipGroupOpenVoiceChat", + "value": "Открыть голосовой чат" + }, + "VoipGroupRecordCall": { + "key": "VoipGroupRecordCall", + "value": "Начать запись" + }, + "VoipGroupRemoveMemberAlertText": { + "key": "VoipGroupRemoveMemberAlertText", + "value": "Исключить %1$s из группового чата?" + }, + "VoipGroupRemoveMemberAlertTitle": { + "key": "VoipGroupRemoveMemberAlertTitle", + "value": "Исключить участника" + }, + "VoipGroupRemovedFromGroup": { + "key": "VoipGroupRemovedFromGroup", + "value": "**%1$s** исключен(а) из группы." + }, + "VoipGroupSearchMembers": { + "key": "VoipGroupSearchMembers", + "value": "Поиск участников..." + }, + "VoipGroupShareInviteLink": { + "key": "VoipGroupShareInviteLink", + "value": "Ссылка-приглашение" + }, + "VoipGroupStopRecordCall": { + "key": "VoipGroupStopRecordCall", + "value": "Остановить запись" + }, + "VoipGroupTooMuch": { + "key": "VoipGroupTooMuch", + "value": "В голосовом чате максимальное число участников." + }, + "VoipGroupUnmute": { + "key": "VoipGroupUnmute", + "value": "Включить микрофон" + }, + "VoipGroupUnmuteForMe": { + "key": "VoipGroupUnmuteForMe", + "value": "Вкл. звук для меня" + }, + "VoipGroupUserCanNowSpeak": { + "key": "VoipGroupUserCanNowSpeak", + "value": "Теперь **%1$s** может говорить." + }, + "VoipGroupUserCanNowSpeakForYou": { + "key": "VoipGroupUserCanNowSpeakForYou", + "value": "Теперь Вы слышите **%1$s**." + }, + "VoipGroupUserCantNowSpeak": { + "key": "VoipGroupUserCantNowSpeak", + "value": "**%1$s** не сможет использовать здесь микрофон." + }, + "VoipGroupUserCantNowSpeakForYou": { + "key": "VoipGroupUserCantNowSpeakForYou", + "value": "Вы больше не слышите **%1$s** в чате." + }, + "VoipGroupUserRemove": { + "key": "VoipGroupUserRemove", + "value": "Исключить" + }, + "VoipGroupViewVoiceChat": { + "key": "VoipGroupViewVoiceChat", + "value": "ГОЛОСОВОЙ ЧАТ" + }, + "VoipGroupVoiceChat": { + "key": "VoipGroupVoiceChat", + "value": "Голосовой чат" + }, + "VoipGroupVolume": { + "key": "VoipGroupVolume", + "value": "Громкость" + }, + "VoipHangingUp": { + "key": "VoipHangingUp", + "value": "Завершение" + }, + "VoipHoldAndTalk": { + "key": "VoipHoldAndTalk", + "value": "или удерживайте кнопку, чтобы говорить" + }, + "VoipInCallBranding": { + "key": "VoipInCallBranding", + "value": "Звонок Telegram" + }, + "VoipInCallBrandingWithName": { + "key": "VoipInCallBrandingWithName", + "value": "Звонок %s через Telegram" + }, + "VoipInVideoCallBranding": { + "key": "VoipInVideoCallBranding", + "value": "Видеозвонок через Telegram" + }, + "VoipInVideoCallBrandingWithName": { + "key": "VoipInVideoCallBrandingWithName", + "value": "Видеозвонок %s через Telegram" + }, + "VoipIncoming": { + "key": "VoipIncoming", + "value": "Входящий звонок" + }, + "VoipMute": { + "key": "VoipMute", + "value": "Выкл. звук" + }, + "VoipMutedByAdmin": { + "key": "VoipMutedByAdmin", + "value": "Без микрофона" + }, + "VoipMutedByAdminInfo": { + "key": "VoipMutedByAdminInfo", + "value": "Вам не разрешено использовать микрофон" + }, + "VoipMutedByAdminShort": { + "key": "VoipMutedByAdminShort", + "value": "Выкл." + }, + "VoipNeedMicCameraPermission": { + "key": "VoipNeedMicCameraPermission", + "value": "Чтобы Вы могли совершать видеозвонки, Telegram требуется доступ к камере и микрофону." + }, + "VoipNeedMicPermission": { + "key": "VoipNeedMicPermission", + "value": "Telegram требуется доступ к микрофону, чтобы Вы могли пользоваться звонками." + }, + "VoipNotificationSettings": { + "key": "VoipNotificationSettings", + "value": "Звонки" + }, + "VoipOffline": { + "key": "VoipOffline", + "value": "Вы не в сети. Чтобы позвонить, пожалуйста, подключитесь к интернету." + }, + "VoipOfflineAirplane": { + "key": "VoipOfflineAirplane", + "value": "Вы в режиме полёта. Чтобы позвонить, пожалуйста, отключите его или подключитесь к Wi-Fi." + }, + "VoipOfflineAirplaneTitle": { + "key": "VoipOfflineAirplaneTitle", + "value": "Режим полёта" + }, + "VoipOfflineOpenSettings": { + "key": "VoipOfflineOpenSettings", + "value": "Настройки" + }, + "VoipOfflineTitle": { + "key": "VoipOfflineTitle", + "value": "Не в сети" + }, + "VoipOngoingAlert": { + "key": "VoipOngoingAlert", + "value": "Завершить разговор с **%1$s** и начать новый с **%2$s**?" + }, + "VoipOngoingAlert2": { + "key": "VoipOngoingAlert2", + "value": "Завершить звонок с **%1$s** и начать голосовой чат в **%2$s**?" + }, + "VoipOngoingAlertTitle": { + "key": "VoipOngoingAlertTitle", + "value": "Другой вызов на линии" + }, + "VoipOngoingChatAlert": { + "key": "VoipOngoingChatAlert", + "value": "Покинуть голосовой чат в **%1$s** и начать новый в **%2$s**?" + }, + "VoipOngoingChatAlert2": { + "key": "VoipOngoingChatAlert2", + "value": "Покинуть голосовой чат в **%1$s** и позвонить **%2$s**?" + }, + "VoipOngoingChatAlertTitle": { + "key": "VoipOngoingChatAlertTitle", + "value": "Идёт другой голосовой чат" + }, + "VoipOutgoingCall": { + "key": "VoipOutgoingCall", + "value": "Текущий звонок Telegram" + }, + "VoipOutputDevices": { + "key": "VoipOutputDevices", + "value": "Устройства вывода" + }, + "VoipPeerIncompatible": { + "key": "VoipPeerIncompatible", + "value": "**%1$s** использует приложение с несовместимой версией протокола. Пользователю нужно обновить приложение, чтобы вы могли созвониться." + }, + "VoipPeerOutdated": { + "key": "VoipPeerOutdated", + "value": "**%1$s** использует приложение, которое не поддерживает звонки. Пользователю нужно обновить приложение, чтобы вы могли созвониться." + }, + "VoipPeerVideoOutdated": { + "key": "VoipPeerVideoOutdated", + "value": "**%1$s** использует устаревшую версию приложения, которая не поддерживает видеозвонки." + }, + "VoipPeerVideoOutdatedMakeVoice": { + "key": "VoipPeerVideoOutdatedMakeVoice", + "value": "Голосовой звонок" + }, + "VoipQuickReplies": { + "key": "VoipQuickReplies", + "value": "Ответить сообщением" + }, + "VoipQuickRepliesExplain": { + "key": "VoipQuickRepliesExplain", + "value": "Напишите здесь подходящий текст, чтобы быстро отправлять его в ответ на звонок через Telegram." + }, + "VoipRateCallAlert": { + "key": "VoipRateCallAlert", + "value": "Пожалуйста, оцените качество звонка через Telegram" + }, + "VoipReconnecting": { + "key": "VoipReconnecting", + "value": "Переподключение" + }, + "VoipRequesting": { + "key": "VoipRequesting", + "value": "Запрос" + }, + "VoipRinging": { + "key": "VoipRinging", + "value": "Вызов" + }, + "VoipRingtoneInfo": { + "key": "VoipRingtoneInfo", + "value": "Вы можете настроить рингтон, который используется, когда этот контакт звонит Вам в Telegram." + }, + "VoipSettingsRingtone": { + "key": "VoipSettingsRingtone", + "value": "Рингтон" + }, + "VoipSpeaker": { + "key": "VoipSpeaker", + "value": "Динамик" + }, + "VoipStartVideo": { + "key": "VoipStartVideo", + "value": "Вкл. видео" + }, + "VoipStopVideo": { + "key": "VoipStopVideo", + "value": "Выкл. видео" + }, + "VoipSwitch": { + "key": "VoipSwitch", + "value": "ПЕРЕКЛЮЧИТЬ" + }, + "VoipSwitchToVideoCall": { + "key": "VoipSwitchToVideoCall", + "value": "Переключиться на видеозвонок?" + }, + "VoipTapToMute": { + "key": "VoipTapToMute", + "value": "Вы в эфире" + }, + "VoipUnmute": { + "key": "VoipUnmute", + "value": "Вкл. звук" + }, + "VoipUseLessData": { + "key": "VoipUseLessData", + "value": "Экономия трафика" + }, + "VoipUserCameraIsOff": { + "key": "VoipUserCameraIsOff", + "value": "Камера %s отключена" + }, + "VoipUserMicrophoneIsOff": { + "key": "VoipUserMicrophoneIsOff", + "value": "Микрофон %s отключен" + }, + "VoipVideoUnavailable": { + "key": "VoipVideoUnavailable", + "value": "Видео" + }, + "VoipVoiceChat": { + "key": "VoipVoiceChat", + "value": "Идёт голосовой чат" + }, + "VoipWaiting": { + "key": "VoipWaiting", + "value": "Ожидание" + }, + "Vote": { + "key": "Vote", + "zeroValue": null, + "oneValue": "%1$d голос", + "twoValue": null, + "fewValue": "%1$d голоса", + "manyValue": "%1$d голосов", + "otherValue": "%1$d голосов" + }, + "WaitMore": { + "key": "WaitMore", + "value": "Подождать ещё" + }, + "WaitingForNetwork": { + "key": "WaitingForNetwork", + "value": "Ожидание сети..." + }, + "Warmth": { + "key": "Warmth", + "value": "Теплота" + }, + "WebSessionsTitle": { + "key": "WebSessionsTitle", + "value": "Авторизованные сайты" + }, + "Weeks": { + "key": "Weeks", + "zeroValue": null, + "oneValue": "%1$d нед.", + "twoValue": null, + "fewValue": "%1$d нед.", + "manyValue": "%1$d нед.", + "otherValue": "%1$d нед." + }, + "WhenConnectedOnWiFi": { + "key": "WhenConnectedOnWiFi", + "value": "Через сети Wi-Fi" + }, + "WhenRoaming": { + "key": "WhenRoaming", + "value": "В роуминге" + }, + "WhenUsingMobileData": { + "key": "WhenUsingMobileData", + "value": "Через мобильную сеть" + }, + "White": { + "key": "White", + "value": "Белый" + }, + "WhoCanAddMe": { + "key": "WhoCanAddMe", + "value": "Кто может добавлять меня в группы?" + }, + "WhoCanAddMeInfo": { + "key": "WhoCanAddMeInfo", + "value": "Вы можете выбрать, кому разрешаете приглашать Вас в группы и каналы." + }, + "WhoCanAddMembers": { + "key": "WhoCanAddMembers", + "value": "Кто может добавлять участников?" + }, + "WhoCanAddMembersAdmins": { + "key": "WhoCanAddMembersAdmins", + "value": "Только администраторы" + }, + "WhoCanAddMembersAllMembers": { + "key": "WhoCanAddMembersAllMembers", + "value": "Все участники" + }, + "WhoCanCallMe": { + "key": "WhoCanCallMe", + "value": "Кто может мне звонить?" + }, + "WhoCanCallMeInfo": { + "key": "WhoCanCallMeInfo", + "value": "Вы можете выбрать, кто сможет Вам звонить." + }, + "WiFiUsage": { + "key": "WiFiUsage", + "value": "Использование Wi-Fi" + }, + "WidgetChats": { + "key": "WidgetChats", + "value": "Чаты" + }, + "WidgetLoggedOff": { + "key": "WidgetLoggedOff", + "value": "Аккаунт не авторизован." + }, + "WidgetPasscode": { + "key": "WidgetPasscode", + "value": "\n\nОбратите внимание: код-пароль приложения **не влияет** на виджеты." + }, + "WidgetPasscodeEnable": { + "key": "WidgetPasscodeEnable", + "value": "\n\nКод-пароль приложения **не будет влиять** на виджеты, добавленные на главный экран." + }, + "WidgetPreview": { + "key": "WidgetPreview", + "value": "Предпросмотр виджета" + }, + "WidgetShortcuts": { + "key": "WidgetShortcuts", + "value": "Ярлыки" + }, + "WillUnmuteIn": { + "key": "WillUnmuteIn", + "value": "Через %1$s" + }, + "WithinAMonth": { + "key": "WithinAMonth", + "value": "был(а) в этом месяце" + }, + "WithinAWeek": { + "key": "WithinAWeek", + "value": "был(а) на этой неделе" + }, + "WrongCountry": { + "key": "WrongCountry", + "value": "Некорректный код страны" + }, + "WrongNumber": { + "key": "WrongNumber", + "value": "Неправильный номер?" + }, + "Years": { + "key": "Years", + "zeroValue": null, + "oneValue": "%1$d год", + "twoValue": null, + "fewValue": "%1$d года", + "manyValue": "%1$d лет", + "otherValue": "%1$d лет" + }, + "Yellow": { + "key": "Yellow", + "value": "Жёлтый" + }, + "Yesterday": { + "key": "Yesterday", + "value": "вчера" + }, + "YesterdayAt": { + "key": "YesterdayAt", + "value": "вчера в" + }, + "YesterdayAtFormatted": { + "key": "YesterdayAtFormatted", + "value": "вчера в %1$s" + }, + "YouBlockedUser": { + "key": "YouBlockedUser", + "value": "Вы не можете добавлять этого пользователя или бота в группы, так как Вы его заблокировали. Чтобы продолжить, нужно его разблокировать." + }, + "YouCreatedBroadcastList": { + "key": "YouCreatedBroadcastList", + "value": "Вы создали список рассылки" + }, + "YouHaveNewMessage": { + "key": "YouHaveNewMessage", + "value": "У вас новое сообщение" + }, + "YouLeft": { + "key": "YouLeft", + "value": "Вы покинули группу" + }, + "YouWereKicked": { + "key": "YouWereKicked", + "value": "Вы больше не в группе" + }, + "YourCode": { + "key": "YourCode", + "value": "Проверка телефона" + }, + "YourContacts": { + "key": "YourContacts", + "value": "Ваши контакты в Telegram" + }, + "YourEmail": { + "key": "YourEmail", + "value": "Адрес электронной почты" + }, + "YourEmailAlmostThere": { + "key": "YourEmailAlmostThere", + "value": "Почти готово!" + }, + "YourEmailAlmostThereText": { + "key": "YourEmailAlmostThereText", + "value": "Пожалуйста, проверьте почту (не забудьте о папке со спамом), чтобы закончить настройку двухэтапной аутентификации." + }, + "YourEmailCode": { + "key": "YourEmailCode", + "value": "Код из письма" + }, + "YourEmailCodeInfo": { + "key": "YourEmailCodeInfo", + "value": "Пожалуйста, введите код, который мы отправили на %1$s, чтобы подтвердить свой адрес электронной почты." + }, + "YourEmailInfo": { + "key": "YourEmailInfo", + "value": "Пожалуйста, добавьте настоящий адрес электронной почты. Это единственный способ восстановить забытый пароль." + }, + "YourEmailSkip": { + "key": "YourEmailSkip", + "value": "Пропустить" + }, + "YourEmailSkipWarning": { + "key": "YourEmailSkipWarning", + "value": "Внимание" + }, + "YourEmailSkipWarningText": { + "key": "YourEmailSkipWarningText", + "value": "Нет, серьёзно.\n\nЕсли Вы забудете пароль, Вы потеряете доступ к своему аккаунту. Не будет никакого способа его восстановить." + }, + "YourEmailSuccessChangedText": { + "key": "YourEmailSuccessChangedText", + "value": "Почта для двухэтапной аутентификации изменена." + }, + "YourEmailSuccessText": { + "key": "YourEmailSuccessText", + "value": "Адрес для восстановления пароля двухэтапной аутентификации активирован." + }, + "YourLocatedChannelsTooMuch": { + "key": "YourLocatedChannelsTooMuch", + "value": "Вы создали максимальное число групп с геопозицией. Пожалуйста, сперва удалите одну из уже созданных групп." + }, + "YourName": { + "key": "YourName", + "value": "Ваше имя" + }, + "YourPassword": { + "key": "YourPassword", + "value": "Пароль" + }, + "YourPasswordChangedSuccessText": { + "key": "YourPasswordChangedSuccessText", + "value": "Пароль двухэтапной аутентификации изменён." + }, + "YourPasswordSuccess": { + "key": "YourPasswordSuccess", + "value": "Готово!" + }, + "YourPasswordSuccessText": { + "key": "YourPasswordSuccessText", + "value": "Ваш пароль для двухэтапной аутентификации включён." + }, + "YourPhone": { + "key": "YourPhone", + "value": "Ваш телефон" + }, + "ZoomOut": { + "key": "ZoomOut", + "value": "Уменьшить" + }, + "_tg_cancel": { + "key": "_tg_cancel", + "value": "Отмена" + }, + "_tg_open_google_play": { + "key": "_tg_open_google_play", + "value": "Открыть Google Play" + }, + "chatDate": { + "key": "chatDate", + "value": "d MMMM" + }, + "chatFullDate": { + "key": "chatFullDate", + "value": "d MMMM yyyy" + }, + "download_telegram_text": { + "key": "download_telegram_text", + "value": "Чтобы авторизоваться в **%s**, требуется Telegram. Хотите установить его сейчас?" + }, + "formatDateAtTime": { + "key": "formatDateAtTime", + "value": "%1$s в %2$s" + }, + "formatDateSchedule": { + "key": "formatDateSchedule", + "value": "d MMM" + }, + "formatDateScheduleDay": { + "key": "formatDateScheduleDay", + "value": "d MMM, EEE" + }, + "formatDateScheduleYear": { + "key": "formatDateScheduleYear", + "value": "d MMM yyyy" + }, + "formatterBannedUntil12H": { + "key": "formatterBannedUntil12H", + "value": "dd MMM yyyy, h:mm a" + }, + "formatterBannedUntil24H": { + "key": "formatterBannedUntil24H", + "value": "dd MMM yyyy, HH:mm" + }, + "formatterBannedUntilThisYear12H": { + "key": "formatterBannedUntilThisYear12H", + "value": "dd MMM, h:mm a" + }, + "formatterBannedUntilThisYear24H": { + "key": "formatterBannedUntilThisYear24H", + "value": "dd MMM, HH:mm" + }, + "formatterDay12H": { + "key": "formatterDay12H", + "value": "h:mm a" + }, + "formatterDay24H": { + "key": "formatterDay24H", + "value": "HH:mm" + }, + "formatterMonth": { + "key": "formatterMonth", + "value": "dd MMM" + }, + "formatterMonthName": { + "key": "formatterMonthName", + "value": "MMM" + }, + "formatterMonthYear": { + "key": "formatterMonthYear", + "value": "MMMM yyyy" + }, + "formatterMonthYear2": { + "key": "formatterMonthYear2", + "value": "MMM yyyy" + }, + "formatterStats12H": { + "key": "formatterStats12H", + "value": "dd MMM yyyy, h:mm a" + }, + "formatterStats24H": { + "key": "formatterStats24H", + "value": "dd MMM yyyy, HH:mm" + }, + "formatterWeek": { + "key": "formatterWeek", + "value": "EEE" + }, + "formatterWeekLong": { + "key": "formatterWeekLong", + "value": "EEEE" + }, + "formatterYear": { + "key": "formatterYear", + "value": "dd.MM.yy" + }, + "formatterYearMax": { + "key": "formatterYearMax", + "value": "dd.MM.yyyy" + }, + "items": { + "key": "items", + "zeroValue": null, + "oneValue": "%1$d элемент", + "twoValue": null, + "fewValue": "%1$d элемента", + "manyValue": "%1$d элементов", + "otherValue": "%1$d элементов" + }, + "login_with_telegram": { + "key": "login_with_telegram", + "value": "Войти через Telegram" + }, + "messages": { + "key": "messages", + "zeroValue": null, + "oneValue": "%1$d сообщение", + "twoValue": null, + "fewValue": "%1$d сообщения", + "manyValue": "%1$d сообщений", + "otherValue": "%1$d сообщений" + }, + "telegram_passport": { + "key": "telegram_passport", + "value": "Telegram Passport" + }, + "Activity": { + "key": "Activity", + "value": "Активность" + }, + "AnimalsNature": { + "key": "AnimalsNature", + "value": "Животные и природа" + }, + "Archived": { + "key": "Archived", + "value": "Архив" + }, + "BioAbout": { + "key": "BioAbout", + "value": "Любые подробности, например: возраст, род занятий или город.\nПример: 23 года, дизайнер из Санкт-Петербурга." + }, + "ChannelInfo": { + "key": "ChannelInfo", + "value": "Информация о канале" + }, + "ChatInfo": { + "key": "ChatInfo", + "value": "Информация о чате" + }, + "ChatsAndContacts": { + "key": "ChatsAndContacts", + "value": "Чаты и контакты" + }, + "ChooseDefaultSkinTone": { + "key": "ChooseDefaultSkinTone", + "value": "Выберите тон кожи по умолчанию" + }, + "ContactJoinedDisabled": { + "key": "ContactJoinedDisabled", + "value": "Выключено" + }, + "ContactJoinedEnabled": { + "key": "ContactJoinedEnabled", + "value": "Включено" + }, + "CopyMessageLink": { + "key": "CopyMessageLink", + "value": "Копировать ссылку на сообщение" + }, + "Country": { + "key": "Country", + "value": "Страна" + }, + "Custom": { + "key": "Custom", + "value": "Пользовательские" + }, + "DeletedMessage": { + "key": "DeletedMessage", + "value": "Удаленное сообщение" + }, + "DragToReposition": { + "key": "DragToReposition", + "value": "Перетащите, чтобы изменить положение" + }, + "EditProfile": { + "key": "EditProfile", + "value": "Редактировать профиль" + }, + "EnterPassword": { + "key": "EnterPassword", + "value": "Введите пароль" + }, + "Flags": { + "key": "Flags", + "value": "Флаги" + }, + "FoodDrink": { + "key": "FoodDrink", + "value": "Еда и напитки" + }, + "GeneralSettings": { + "key": "GeneralSettings", + "value": "Основные настройки" + }, + "GoToMessage": { + "key": "GoToMessage", + "value": "Перейти к сообщению" + }, + "KeepMeSignedIn": { + "key": "KeepMeSignedIn", + "value": "Сохранить авторизацию" + }, + "LeftChannel": { + "key": "LeftChannel", + "value": "Канал покинут" + }, + "LeftGroup": { + "key": "LeftGroup", + "value": "Группа покинута" + }, + "LogInByPhone": { + "key": "LogInByPhone", + "value": "Вход по номеру телефона" + }, + "LogInViaQR": { + "key": "LogInViaQR", + "value": "Быстрый вход по QR-коду" + }, + "More": { + "key": "More", + "value": "Ещё" + }, + "NotEmojiFound": { + "key": "NotEmojiFound", + "value": "Емодзи не найдены" + }, + "NotificationsDisabled": { + "key": "NotificationsDisabled", + "value": "Выключены" + }, + "NotificationsEnabled": { + "key": "NotificationsEnabled", + "value": "Включены" + }, + "Objects": { + "key": "Objects", + "value": "Предметы" + }, + "PhoneNumber": { + "key": "PhoneNumber", + "value": "Телефонный номер" + }, + "PhotosTitle": { + "key": "PhotosTitle", + "value": "Фотографии" + }, + "PollQuizOneRightAnswer": { + "key": "PollQuizOneRightAnswer", + "value": "В викторинах только один правильный ответ." + }, + "PreviewDisabled": { + "key": "PreviewDisabled", + "value": "Выключено" + }, + "PreviewEnabled": { + "key": "PreviewEnabled", + "value": "Включено" + }, + "QRHint": { + "key": "QRHint", + "value": "1. Запустите Telegram на телефоне\n2. Откройте настройки > Устройства > Сканировать QR-код.\n3. Сканируйте этот код для авторизации" + }, + "Saved": { + "key": "Saved", + "value": "Избранное" + }, + "SearchMessagesIn": { + "key": "SearchMessagesIn", + "value": "Искать сообщения в" + }, + "SearchResults": { + "key": "SearchResults", + "value": "Результаты поиска" + }, + "SelectChatToStartMessaging": { + "key": "SelectChatToStartMessaging", + "value": "Пожалуйста, выберите, кому хотели бы написать" + }, + "SendAsPhoto": { + "key": "SendAsPhoto", + "value": "Отправить как фото" + }, + "SendFileConfirmation": { + "key": "SendFileConfirmation", + "value": "Вы действительно хотите отправить файл?" + }, + "SendFilesConfirmation": { + "key": "SendFilesConfirmation", + "value": "Вы действительно хотите отправить файлы?" + }, + "SignInToTelegram": { + "key": "SignInToTelegram", + "value": "Вход в Telegram" + }, + "SmileysPeople": { + "key": "SmileysPeople", + "value": "Смайлики и люди" + }, + "Symbols": { + "key": "Symbols", + "value": "Символы" + }, + "Text": { + "key": "Text", + "value": "Текст" + }, + "TravelPlaces": { + "key": "TravelPlaces", + "value": "Путешествия и местности" + }, + "UnpinAllMessagesAlert": { + "key": "UnpinAllMessagesAlert", + "value": "Хотите открепить все сообщения?" + }, + "UpdateDraftConfirmation": { + "key": "UpdateDraftConfirmation", + "value": "Вы действительно хотите обновить черновик сообщения?" + }, + "VideosTitle": { + "key": "VideosTitle", + "value": "Видеозаписи" + }, + "ViewChannelInfo": { + "key": "ViewChannelInfo", + "value": "Информация о канале" + }, + "ViewGroupInfo": { + "key": "ViewGroupInfo", + "value": "Информация о группе" + }, + "ViewProfile": { + "key": "ViewProfile", + "value": "Показать профиль" + }, + "VoiceTitle": { + "key": "VoiceTitle", + "value": "Голосовые сообщения" + }, + "YourAccountProtectedWithPassword": { + "key": "YourAccountProtectedWithPassword", + "value": "Ваш аккаунт защищен дополнительным паролем." + } +} diff --git a/dev/perf/globals/0c46207b-1000.json b/dev/perf/globals/0c46207b-1000.json new file mode 100644 index 000000000..8ee21c69d --- /dev/null +++ b/dev/perf/globals/0c46207b-1000.json @@ -0,0 +1,22051 @@ +{ + "isChatInfoShown": true, + "isLeftColumnShown": true, + "fileUploads": { + "byMessageLocalId": {} + }, + "recentEmojis": [ + "grinning", + "kissing_heart", + "christmas_tree", + "brain", + "trophy" + ], + "stickers": { + "setsById": {}, + "added": { + "setIds": [] + }, + "recent": { + "stickers": [] + }, + "favorite": { + "stickers": [] + }, + "featured": { + "setIds": [] + }, + "search": {} + }, + "gifs": { + "saved": { + "gifs": [] + }, + "search": {} + }, + "globalSearch": {}, + "messageSearch": { + "byChatId": {} + }, + "topPeers": {}, + "mediaViewer": {}, + "audioPlayer": {}, + "forwardMessages": {}, + "pollResults": {}, + "chatFolders": { + "byId": {} + }, + "settings": { + "byKey": { + "animationLevel": 1, + "messageTextSize": 16, + "messageSendKeyCombo": "enter", + "language": "en" + } + }, + "errors": [], + "users": { + "byId": { + "454000": { + "id": 454000, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Telegram", + "lastName": null, + "username": "dmcatelegram", + "phoneNumber": "42454", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "1087749393156453034", + "avatar": { + "hash": "1949915608623048" + } + }, + "656567": { + "id": 656567, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Антон", + "lastName": null, + "username": "naukaiprogress", + "phoneNumber": "79024827183", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "7087438295025146936", + "avatar": { + "hash": "2819934248875858" + } + }, + "777000": { + "id": 777000, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Telegram", + "lastName": null, + "username": "", + "phoneNumber": "42777", + "status": { + "type": "userStatusOffline", + "wasOnline": 1565655224 + }, + "accessHash": "-7788485269605279038", + "avatar": { + "hash": "3337190045231023" + } + }, + "914597": { + "id": 914597, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Markus", + "lastName": "Ra", + "username": "MarkusRa", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "8487464354880985091", + "avatar": { + "hash": "3928164660266503" + } + }, + "2317363": { + "id": 2317363, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Ivan", + "lastName": "Zelenin", + "username": "MayneX", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-2380928966981891772", + "avatar": { + "hash": "9952998754200395" + } + }, + "2676926": { + "id": 2676926, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "М", + "lastName": "R", + "username": "rovkin", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "6274207358605821778", + "avatar": { + "hash": "11497310080051238" + } + }, + "3247289": { + "id": 3247289, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alexey", + "lastName": "Kulichevskiy", + "username": "akulichevskiy", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "4208922841455209314", + "avatar": { + "hash": "13947000511900060" + } + }, + "3412850": { + "id": 3412850, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alex", + "lastName": "Shakun", + "username": "sashashakun", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579004927 + }, + "accessHash": "-2124314261317387467", + "avatar": { + "hash": "14658079592392679" + } + }, + "3718260": { + "id": 3718260, + "isSelf": true, + "type": "userTypeRegular", + "firstName": "Alexander", + "lastName": "Zinchuk", + "username": "zinchuk", + "phoneNumber": "79150942395", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006794 + }, + "accessHash": "-3710819038313911682", + "avatar": { + "hash": "15969805554263980" + } + }, + "4274761": { + "id": 4274761, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "hlomzik", + "lastName": null, + "username": "hlomzik", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007484 + }, + "accessHash": "-2310230662522467761", + "avatar": { + "hash": "18359959149456360" + } + }, + "8179415": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007689 + } + }, + "27803002": { + "id": 27803002, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Игнат", + "lastName": null, + "username": "phexq", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-6189636805781011085", + "avatar": { + "hash": "119412984776861704" + } + }, + "38016217": { + "id": 38016217, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Konstantin", + "lastName": "Darutkin", + "username": "kdarutkin", + "phoneNumber": "", + "status": { + "type": "userStatusOnline" + }, + "accessHash": "5387369175054348315", + "avatar": { + "hash": "163278409188879933" + } + }, + "40907434": { + "id": 40907434, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Vlad", + "lastName": null, + "username": "vsha10", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006379 + }, + "accessHash": "340901894473091634", + "avatar": { + "hash": "175696091649518932" + } + }, + "44588451": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007642 + } + }, + "53759108": { + "id": 53759108, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "kirill.e", + "lastName": null, + "username": "kiririn", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-1895854267611186346", + "avatar": { + "hash": "230893611178371256" + } + }, + "54158593": { + "id": 54158593, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Лиза", + "lastName": null, + "username": "pseudoliza", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "6983116929695588742", + "avatar": { + "hash": "232609386188614561" + } + }, + "56240484": { + "id": 56240484, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Vlad", + "lastName": "Ponomarev", + "username": "vponomarev", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006264 + }, + "accessHash": "1516515623735745502", + "avatar": { + "hash": "241551039947450467" + } + }, + "63238467": { + "id": 63238467, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Lev", + "lastName": "Rogozhin", + "username": "leoreijii", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-8508649651002820821", + "avatar": { + "hash": "271607148070415054" + } + }, + "68539483": { + "status": { + "type": "userStatusOnline" + } + }, + "71715671": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007509 + } + }, + "73285792": { + "id": 73285792, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Олег", + "lastName": "Семёнов", + "username": "SatoAV", + "phoneNumber": "79067384823", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007881 + }, + "accessHash": "2308517068116032973", + "avatar": { + "hash": "314760080357698567" + } + }, + "81549896": { + "status": { + "type": "userStatusOnline" + } + }, + "83835125": { + "id": 83835125, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Денис", + "lastName": "Хананеин", + "username": "zloylos", + "phoneNumber": "79955031313", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578996285 + }, + "accessHash": "-816665157367596786", + "avatar": { + "hash": "360069120587311032" + } + }, + "84871351": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007587 + } + }, + "85210904": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007616 + } + }, + "85436674": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007835 + } + }, + "88036873": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007809 + } + }, + "88888263": { + "id": 88888263, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Mike", + "lastName": null, + "username": "merqry", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "7721366673927234508", + "avatar": { + "hash": "381772183039486263" + } + }, + "89182674": { + "id": 89182674, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Лёша", + "lastName": "Чудинов", + "username": "alekseich", + "phoneNumber": "420777007652", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007211 + }, + "accessHash": "7037550407740169389", + "avatar": { + "hash": "383036668656070124" + } + }, + "101724799": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007644 + } + }, + "103443200": { + "status": { + "type": "userStatusOnline" + } + }, + "105945096": { + "id": 105945096, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Anton", + "lastName": "Gorshenin", + "username": "AntonyHatchet", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-3974496029461846214", + "avatar": { + "hash": "455030722947820211" + } + }, + "108649628": { + "id": 108649628, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Aleksandr", + "lastName": "Ostanin", + "username": "", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006414 + }, + "accessHash": "3622299070914801810", + "avatar": { + "hash": "466646599438804906" + } + }, + "112068266": { + "id": 112068266, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Денис", + "lastName": "Матюнин", + "username": "alckbstrd", + "phoneNumber": "79037565660", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-1726647209696382847", + "avatar": { + "hash": "481329537845667768" + } + }, + "115255727": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007743 + } + }, + "117061025": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007488 + } + }, + "117155430": { + "status": { + "type": "userStatusOnline" + } + }, + "119344766": { + "id": 119344766, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Антон", + "lastName": "Корзунов", + "username": "thekashey", + "phoneNumber": "79267390739", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578987456 + }, + "accessHash": "7645370836604316659", + "avatar": { + "hash": "512581867375012116" + } + }, + "120566766": { + "id": 120566766, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Виталик", + "lastName": "Панарин", + "username": "", + "phoneNumber": "79031361264", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007357 + }, + "accessHash": "-2595694477288040447", + "avatar": { + "hash": "517830317410723755" + } + }, + "121657549": { + "id": 121657549, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Сережа", + "lastName": "Константинов", + "username": "twirl", + "phoneNumber": "79152025751", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "818814331837259358", + "avatar": { + "hash": "522515194722757292" + } + }, + "121754413": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007878 + } + }, + "122196269": { + "id": 122196269, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alex", + "lastName": null, + "username": "tom8opot8o", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-7480239332980307483", + "avatar": { + "hash": "524828979504457650" + } + }, + "124920404": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007911 + } + }, + "126920812": { + "id": 126920812, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Яков", + "lastName": "Лысков", + "username": "YakovLyskov", + "phoneNumber": "79263529362", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "2715341103751301834", + "avatar": { + "hash": "545120737178003733" + } + }, + "132050387": { + "id": 132050387, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Дмитрий", + "lastName": "Бондаренко", + "username": "", + "phoneNumber": "79654237473", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007693 + }, + "accessHash": "-2285872714920985879" + }, + "136294554": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007838 + } + }, + "136817688": { + "id": 136817688, + "isSelf": false, + "type": "userTypeBot", + "firstName": "Channel", + "lastName": null, + "username": "Channel_Bot", + "phoneNumber": "", + "status": { + "type": "userStatusEmpty" + }, + "accessHash": "3779054650090625737", + "avatar": { + "hash": "587627495930570665" + } + }, + "139432426": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007932 + } + }, + "140267078": { + "id": 140267078, + "isSelf": false, + "type": "userTypeBot", + "firstName": "Giphy GIF Search", + "lastName": null, + "username": "gif", + "phoneNumber": "", + "status": { + "type": "userStatusEmpty" + }, + "accessHash": "1201383718420955299", + "avatar": { + "hash": "602442513171720105" + } + }, + "141185012": { + "id": 141185012, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Natalia", + "lastName": "Asaul", + "username": "shmtvn", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579004105 + }, + "accessHash": "-7860424863173868031", + "avatar": { + "hash": "606385009681608535" + } + }, + "143235707": { + "id": 143235707, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "James", + "lastName": "Franko", + "username": "Nizarius", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-9111830739567183612", + "avatar": { + "hash": "615192677640677303" + } + }, + "146406074": { + "status": { + "type": "userStatusOnline" + } + }, + "146686085": { + "id": 146686085, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Nataliya", + "lastName": "Dzhariani", + "username": "dzhariani", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007070 + }, + "accessHash": "-7784178486997672340", + "avatar": { + "hash": "630011938309515177" + } + }, + "149266234": { + "id": 149266234, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Krolone", + "lastName": null, + "username": "Krolone", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007306 + }, + "accessHash": "3203268560126386402", + "avatar": { + "hash": "641093593883322286" + } + }, + "165916816": { + "id": 165916816, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "IᒪYᗩ", + "lastName": "ᗩᖇᗩᒪIᑎ", + "username": "EVERYDAYHER0", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579005965 + }, + "accessHash": "5782462503497143230", + "avatar": { + "hash": "712607299032688704" + } + }, + "177121435": { + "id": 177121435, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Лиза", + "lastName": null, + "username": "lizazhdan", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-7543401176279961954", + "avatar": { + "hash": "760730771201829799" + } + }, + "185357627": { + "status": { + "type": "userStatusOnline" + } + }, + "190601014": { + "id": 190601014, + "isSelf": false, + "type": "userTypeBot", + "firstName": "LikeBot", + "lastName": null, + "username": "like", + "phoneNumber": "", + "status": { + "type": "userStatusEmpty" + }, + "accessHash": "4575312890980331016", + "avatar": { + "hash": "818625122170677161" + } + }, + "193824343": { + "id": 193824343, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Толя", + "lastName": "Янот", + "username": "tolyayanot", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "8622400639054286002", + "avatar": { + "hash": "832469214809925560" + } + }, + "193986593": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007719 + } + }, + "194771934": { + "id": 194771934, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Kos", + "lastName": "👀", + "username": "thadjbullet", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-4717428187206294319", + "avatar": { + "hash": "836539087164909483" + } + }, + "204715787": { + "id": 204715787, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Vladislav", + "lastName": "Bachevsky", + "username": "vbachevsky", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579004021 + }, + "accessHash": "1909872570995119725", + "avatar": { + "hash": "879247610596141335" + } + }, + "205372114": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007805 + } + }, + "205688700": { + "id": 205688700, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Aleksey", + "lastName": "Leshko", + "username": "alekseyleshko", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006831 + }, + "accessHash": "-4946811484285447900", + "avatar": { + "hash": "883426240112994218" + } + }, + "234480941": { + "id": 234480941, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "<[GNU/std::twit]>", + "lastName": "💩⭐️ [now with more fame]", + "username": "tWiTfAcE", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-3547900009735628302", + "avatar": { + "hash": "1007087973586544810" + } + }, + "237316136": { + "id": 237316136, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Сережа", + "lastName": "Братик", + "username": "szotin", + "phoneNumber": "79629614499", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578998201 + }, + "accessHash": "4932076153316541218", + "avatar": { + "hash": "1019265043389327273" + } + }, + "241647476": { + "id": 241647476, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Andrey", + "lastName": "Mayorov", + "username": "frandsaw", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006960 + }, + "accessHash": "-3681507183641315877", + "avatar": { + "hash": "1037868007037183979" + } + }, + "246748014": { + "id": 246748014, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Дима", + "lastName": "Ляпин", + "username": "dmlyapin", + "phoneNumber": "79263027874", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "7011827349957199464", + "avatar": { + "hash": "1059774650939189166" + } + }, + "276328880": { + "id": 276328880, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Марина", + "lastName": "Жарова", + "username": "", + "phoneNumber": "79057131493", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578995568 + }, + "accessHash": "6797515757248553586" + }, + "276892535": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007942 + } + }, + "287698835": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007520 + } + }, + "290281303": { + "id": 290281303, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Aleksandr", + "lastName": "Proskurin", + "username": "aleksProsk", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006107 + }, + "accessHash": "6510216211306064703", + "avatar": { + "hash": "1246748703481505706" + } + }, + "290394546": { + "id": 290394546, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Анечка", + "lastName": null, + "username": "AnaZharova", + "phoneNumber": "79266987141", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007897 + }, + "accessHash": "-3867594960753582949", + "avatar": { + "hash": "1247235078463006898" + } + }, + "310552513": { + "id": 310552513, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alexander", + "lastName": "Balashov", + "username": "alexanderbalashov", + "phoneNumber": "34625991013", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006187 + }, + "accessHash": "1895194792035722844", + "avatar": { + "hash": "1333812887481853866" + } + }, + "314552265": { + "id": 314552265, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Мама", + "lastName": null, + "username": "", + "phoneNumber": "79031166005", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579003726 + }, + "accessHash": "-5029148124725908474" + }, + "327556368": { + "id": 327556368, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Tanya", + "lastName": null, + "username": "tanyatakida", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-296977702523430050", + "avatar": { + "hash": "1406843888612779946" + } + }, + "332648262": { + "id": 332648262, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Алексей", + "lastName": "Осипов", + "username": "atomSmart", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579000938 + }, + "accessHash": "-2663974177952274895", + "avatar": { + "hash": "1428713406817478569" + } + }, + "343593401": { + "status": { + "type": "userStatusOnline" + } + }, + "344577595": { + "id": 344577595, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alex", + "lastName": null, + "username": "a2xchip", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "1454634979100337092", + "avatar": { + "hash": "1479949501915572145" + } + }, + "345833115": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007544 + } + }, + "356765513": { + "id": 356765513, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Артём", + "lastName": "Дикмаров", + "username": "adikmarov", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "5936825635256377207", + "avatar": { + "hash": "1532296211131901887" + } + }, + "381155062": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007938 + } + }, + "400319287": { + "id": 400319287, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "painor", + "lastName": null, + "username": "painor", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578976704 + }, + "accessHash": "8575777610547612403", + "avatar": { + "hash": "1719358246079276972" + } + }, + "407368531": { + "id": 407368531, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Дашка", + "lastName": "Прохватилова", + "username": "", + "phoneNumber": "79269439980", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578913597 + }, + "accessHash": "-4153575517386691895", + "avatar": { + "hash": "1749634518520801195" + } + }, + "419136265": { + "id": 419136265, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Игорь", + "lastName": "Шемятенков", + "username": "Xor1024", + "phoneNumber": "79856617290", + "status": { + "type": "userStatusOnline" + }, + "accessHash": "3213993671925160653" + }, + "420851400": { + "id": 420851400, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Олег", + "lastName": "Братик", + "username": "", + "phoneNumber": "79779773756", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578930868 + }, + "accessHash": "864263979199890906", + "avatar": { + "hash": "1807542999932053417" + } + }, + "427775494": { + "id": 427775494, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Guess", + "lastName": "Who", + "username": "surgie", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "-2877652694018983893" + }, + "471433401": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007859 + } + }, + "514132543": { + "id": 514132543, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Alex", + "lastName": "Khokhlyavin", + "username": "xoxai", + "phoneNumber": "", + "status": { + "type": "userStatusRecently" + }, + "accessHash": "7241435135577866481", + "avatar": { + "hash": "2208182458450552749" + } + }, + "524900290": { + "id": 524900290, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Анна", + "lastName": "Дьякова", + "username": "", + "phoneNumber": "79170809871", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578862192 + }, + "accessHash": "3217371758289283304", + "avatar": { + "hash": "2254429579667154857" + } + }, + "542350852": { + "id": 542350852, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Артём", + "lastName": "Виталика", + "username": "", + "phoneNumber": "79165528671", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579000680 + }, + "accessHash": "-271058820642766154" + }, + "714226506": { + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007795 + } + }, + "715284311": { + "id": 715284311, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Бабушка Лора", + "lastName": null, + "username": "", + "phoneNumber": "79150692260", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578937545 + }, + "accessHash": "2986785013254352469" + }, + "802771524": { + "id": 802771524, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Julia", + "lastName": "Belokrinitskaya", + "username": "bel_julia", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579006149 + }, + "accessHash": "382680019298981651", + "avatar": { + "hash": "3447877442196318122" + } + }, + "860139781": { + "id": 860139781, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Yana", + "lastName": "Petruk", + "username": "PetrukYana", + "phoneNumber": "", + "status": { + "type": "userStatusOffline", + "wasOnline": 1579007482 + }, + "accessHash": "1422737909874001325", + "avatar": { + "hash": "3694272229839841215" + } + }, + "903250362": { + "id": 903250362, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Сергей", + "lastName": "Кощеев", + "username": "", + "phoneNumber": "79295760645", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578181782 + }, + "accessHash": "-2230752646882991078" + }, + "938430445": { + "id": 938430445, + "isSelf": false, + "type": "userTypeRegular", + "firstName": "Витя", + "lastName": "Устинов", + "username": "", + "phoneNumber": "79883402813", + "status": { + "type": "userStatusOffline", + "wasOnline": 1578998705 + }, + "accessHash": "-8521819193925892158" + }, + "974851635": { + "id": 974851635, + "isSelf": false, + "type": { + "type": "userTypeDeleted" + }, + "firstName": null, + "lastName": null, + "username": "", + "phoneNumber": "", + "status": { + "type": "userStatusEmpty" + }, + "accessHash": "-7500710878276106389" + } + } + }, + "chats": { + "listIds": { + "active": [ + 3718260, + 777000, + -1036855149, + -208483550, + 656567, + -1186709966, + -1322215945, + -1267450324, + 407368531, + -398751458, + -264075795, + 419136265, + -1180212174, + -1453798102, + 314552265, + 276328880, + -1406145223, + 193824343, + 290394546, + 938430445, + 524900290, + 237316136, + 112068266, + 715284311, + 454000, + 400319287, + 73285792, + -1038976893, + 38016217, + 427775494, + 246748014, + -227209700, + 903250362, + 126920812, + 420851400, + 120566766, + 132050387, + -1344059810, + -1330843177, + -380899033, + 119344766, + -287980009, + -1416855018, + 89182674, + 974851635, + -219517351, + -300045230, + 83835125, + 310552513, + 914597 + ] + }, + "isFullyLoaded": {}, + "orderedPinnedIds": {}, + "totalCount": {}, + "byId": { + "454000": { + "id": 454000, + "type": "chatTypePrivate", + "title": "Telegram", + "lastReadOutboxMessageId": 357521, + "lastReadInboxMessageId": 391658, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "dmcatelegram", + "isPinned": false, + "accessHash": "1087749393156453034", + "avatar": { + "hash": "1949915608623048" + }, + "lastMessage": { + "id": 391658, + "chatId": 454000, + "isOutgoing": false, + "content": { + "text": { + "text": "Hello! Congratulations on winning the JavaScript Contest - https://t.me/contest/146!\nCould you send your full address and your bank account details in the following format please?\nYour full name\nName of your bank\nBank account number (or IBAN)\nBank SWIFT code", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 59, + "length": 24 + } + ] + } + }, + "date": 1578704314, + "senderUserId": 454000, + "replyToMessageId": null + } + }, + "656567": { + "id": 656567, + "type": "chatTypePrivate", + "title": "Антон", + "lastReadOutboxMessageId": 392455, + "lastReadInboxMessageId": 392454, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "naukaiprogress", + "isPinned": false, + "accessHash": "7087438295025146936", + "avatar": { + "hash": "2819934248875858" + }, + "lastMessage": { + "id": 392455, + "chatId": 656567, + "isOutgoing": true, + "content": { + "text": { + "text": "👌" + } + }, + "date": 1579006182, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "777000": { + "id": 777000, + "type": "chatTypePrivate", + "title": "Telegram", + "lastReadOutboxMessageId": 374571, + "lastReadInboxMessageId": 392447, + "unreadCount": 1, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-7788485269605279038", + "avatar": { + "hash": "3337190045231023" + }, + "lastMessage": { + "id": 392457, + "chatId": 777000, + "isOutgoing": false, + "content": { + "text": { + "text": "Код подтверждения: 83247. Никому не давайте код, даже если его требуют от имени Telegram!\n\nЭтот код используется для входа в Ваш аккаунт в Telegram. Он никогда не нужен для чего-то еще. \n\nЕсли Вы не запрашивали код для входа, проигнорируйте это сообщение.", + "entities": [ + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 0, + "length": 18 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 26, + "length": 6 + } + ] + } + }, + "date": 1579007453, + "senderUserId": 777000, + "replyToMessageId": null + } + }, + "914597": { + "id": 914597, + "type": "chatTypePrivate", + "title": "Markus Ra", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 0, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "MarkusRa", + "isPinned": false, + "accessHash": "8487464354880985091", + "avatar": { + "hash": "3928164660266503" + }, + "lastMessage": { + "id": 384308, + "chatId": 914597, + "isOutgoing": true, + "content": { + "text": { + "text": "Hi Markus, how are you? I wanted to ask, is there any chance to remove the sourcemaps from my JS contest submissions? I did not notice they went to the bundle, and now all my source code and project structure is exposed to everyone in the community. Quite disappointing, considering the fact the other contest rounds are to follow. I am Jolly Cobra and Shiny Yak. Thank you!" + } + }, + "date": 1576180720, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "3718260": { + "id": 3718260, + "type": "chatTypePrivate", + "title": "Alexander Zinchuk", + "lastReadOutboxMessageId": 829, + "lastReadInboxMessageId": 392210, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "zinchuk", + "isPinned": true, + "accessHash": "-3710819038313911682", + "avatar": { + "hash": "15969805554263980" + }, + "lastMessage": { + "id": 392210, + "chatId": 3718260, + "isOutgoing": false, + "content": { + "text": { + "text": "https://www.udacity.com/course/browser-rendering-optimization--ud860", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 68 + } + ] + } + }, + "date": 1578913104, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "38016217": { + "id": 38016217, + "type": "chatTypePrivate", + "title": "Konstantin Darutkin", + "lastReadOutboxMessageId": 391483, + "lastReadInboxMessageId": 391482, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "kdarutkin", + "isPinned": false, + "accessHash": "5387369175054348315", + "avatar": { + "hash": "163278409188879933" + }, + "lastMessage": { + "id": 391483, + "chatId": 38016217, + "isOutgoing": true, + "content": { + "text": { + "text": "Понятно)" + } + }, + "date": 1578670067, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "73285792": { + "id": 73285792, + "type": "chatTypePrivate", + "title": "Олег Семёнов", + "lastReadOutboxMessageId": 391525, + "lastReadInboxMessageId": 391524, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "SatoAV", + "isPinned": false, + "accessHash": "2308517068116032973", + "avatar": { + "hash": "314760080357698567" + }, + "lastMessage": { + "id": 391525, + "chatId": 73285792, + "isOutgoing": true, + "content": { + "text": { + "text": "Ага" + } + }, + "date": 1578686330, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "83835125": { + "id": 83835125, + "type": "chatTypePrivate", + "title": "Денис Хананеин", + "lastReadOutboxMessageId": 384501, + "lastReadInboxMessageId": 384499, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "zloylos", + "isPinned": false, + "accessHash": "-816665157367596786", + "avatar": { + "hash": "360069120587311032" + }, + "lastMessage": { + "id": 384501, + "chatId": 83835125, + "isOutgoing": true, + "content": { + "text": { + "text": "Для конкурса как раз, для другого разработчика" + } + }, + "date": 1576263888, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "89182674": { + "id": 89182674, + "type": "chatTypePrivate", + "title": "Лёша Чудинов", + "lastReadOutboxMessageId": 387451, + "lastReadInboxMessageId": 387444, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "alekseich", + "isPinned": false, + "accessHash": "7037550407740169389", + "avatar": { + "hash": "383036668656070124" + }, + "lastMessage": { + "id": 387451, + "chatId": 89182674, + "isOutgoing": true, + "content": { + "text": { + "text": "Ок" + } + }, + "date": 1576946008, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "112068266": { + "id": 112068266, + "type": "chatTypePrivate", + "title": "Денис Матюнин", + "lastReadOutboxMessageId": 392028, + "lastReadInboxMessageId": 392033, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "alckbstrd", + "isPinned": false, + "accessHash": "-1726647209696382847", + "avatar": { + "hash": "481329537845667768" + }, + "lastMessage": { + "id": 392033, + "chatId": 112068266, + "isOutgoing": false, + "content": { + "text": { + "text": "Заработался)" + } + }, + "date": 1578790141, + "senderUserId": 112068266, + "replyToMessageId": null + } + }, + "119344766": { + "id": 119344766, + "type": "chatTypePrivate", + "title": "Антон Корзунов", + "lastReadOutboxMessageId": 389287, + "lastReadInboxMessageId": 389290, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "thekashey", + "isPinned": false, + "accessHash": "7645370836604316659", + "avatar": { + "hash": "512581867375012116" + }, + "lastMessage": { + "id": 389290, + "chatId": 119344766, + "isOutgoing": false, + "content": { + "text": { + "text": "Вроде как совершенно естественно что одни и теже грабли, одни и те же ямы" + } + }, + "date": 1577479949, + "senderUserId": 119344766, + "replyToMessageId": null + } + }, + "120566766": { + "id": 120566766, + "type": "chatTypePrivate", + "title": "Виталик Панарин", + "lastReadOutboxMessageId": 389873, + "lastReadInboxMessageId": 389875, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-2595694477288040447", + "avatar": { + "hash": "517830317410723755" + }, + "lastMessage": { + "id": 389875, + "chatId": 120566766, + "isOutgoing": false, + "content": { + "text": { + "text": "В целом можно:)" + } + }, + "date": 1577911018, + "senderUserId": 120566766, + "replyToMessageId": null + } + }, + "126920812": { + "id": 126920812, + "type": "chatTypePrivate", + "title": "Яков Лысков", + "lastReadOutboxMessageId": 390301, + "lastReadInboxMessageId": 390302, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "YakovLyskov", + "isPinned": false, + "accessHash": "2715341103751301834", + "avatar": { + "hash": "545120737178003733" + }, + "lastMessage": { + "id": 390302, + "chatId": 126920812, + "isOutgoing": false, + "content": { + "text": { + "text": "Пилим) не без проблем:), но куда без них))" + } + }, + "date": 1578137127, + "senderUserId": 126920812, + "replyToMessageId": null + } + }, + "132050387": { + "id": 132050387, + "type": "chatTypePrivate", + "title": "Дмитрий Бондаренко", + "lastReadOutboxMessageId": 389845, + "lastReadInboxMessageId": 389846, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-2285872714920985879", + "lastMessage": { + "id": 389846, + "chatId": 132050387, + "isOutgoing": false, + "content": { + "text": { + "text": "Неее" + } + }, + "date": 1577909217, + "senderUserId": 132050387, + "replyToMessageId": null + } + }, + "193824343": { + "id": 193824343, + "type": "chatTypePrivate", + "title": "Толя Янот", + "lastReadOutboxMessageId": 392316, + "lastReadInboxMessageId": 392317, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "tolyayanot", + "isPinned": false, + "accessHash": "8622400639054286002", + "avatar": { + "hash": "832469214809925560" + }, + "lastMessage": { + "id": 392317, + "chatId": 193824343, + "isOutgoing": false, + "content": { + "text": { + "text": "это хорошо" + } + }, + "date": 1578932628, + "senderUserId": 193824343, + "replyToMessageId": null + } + }, + "237316136": { + "id": 237316136, + "type": "chatTypePrivate", + "title": "Сережа Братик", + "lastReadOutboxMessageId": 392158, + "lastReadInboxMessageId": 392159, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "szotin", + "isPinned": false, + "accessHash": "4932076153316541218", + "avatar": { + "hash": "1019265043389327273" + }, + "lastMessage": { + "id": 392159, + "chatId": 237316136, + "isOutgoing": false, + "content": { + "text": { + "text": "Запутать)))" + } + }, + "date": 1578860382, + "senderUserId": 237316136, + "replyToMessageId": 392156 + } + }, + "246748014": { + "id": 246748014, + "type": "chatTypePrivate", + "title": "Дима Ляпин", + "lastReadOutboxMessageId": 391390, + "lastReadInboxMessageId": 391388, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "dmlyapin", + "isPinned": false, + "accessHash": "7011827349957199464", + "avatar": { + "hash": "1059774650939189166" + }, + "lastMessage": { + "id": 391390, + "chatId": 246748014, + "isOutgoing": true, + "content": { + "text": { + "text": "Ладно, во втором разберемся с ними)" + } + }, + "date": 1578666126, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "276328880": { + "id": 276328880, + "type": "chatTypePrivate", + "title": "Марина Жарова", + "lastReadOutboxMessageId": 392331, + "lastReadInboxMessageId": 392330, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "6797515757248553586", + "lastMessage": { + "id": 392331, + "chatId": 276328880, + "isOutgoing": true, + "content": { + "text": { + "text": "И мы вас!" + } + }, + "date": 1578948807, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "290394546": { + "id": 290394546, + "type": "chatTypePrivate", + "title": "Анечка", + "lastReadOutboxMessageId": 392292, + "lastReadInboxMessageId": 392291, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "AnaZharova", + "isPinned": false, + "accessHash": "-3867594960753582949", + "avatar": { + "hash": "1247235078463006898" + }, + "lastMessage": { + "id": 392292, + "chatId": 290394546, + "isOutgoing": true, + "content": { + "text": { + "text": "ок" + } + }, + "date": 1578931954, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "310552513": { + "id": 310552513, + "type": "chatTypePrivate", + "title": "Alexander Balashov", + "lastReadOutboxMessageId": 384435, + "lastReadInboxMessageId": 384432, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "alexanderbalashov", + "isPinned": false, + "accessHash": "1895194792035722844", + "avatar": { + "hash": "1333812887481853866" + }, + "lastMessage": { + "id": 384435, + "chatId": 310552513, + "isOutgoing": true, + "content": { + "text": { + "text": ")))" + } + }, + "date": 1576254055, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "314552265": { + "id": 314552265, + "type": "chatTypePrivate", + "title": "Мама", + "lastReadOutboxMessageId": 392327, + "lastReadInboxMessageId": 392332, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-5029148124725908474", + "lastMessage": { + "id": 392332, + "chatId": 314552265, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну.. это было предсказуемо (" + } + }, + "date": 1578949927, + "senderUserId": 314552265, + "replyToMessageId": null + } + }, + "400319287": { + "id": 400319287, + "type": "chatTypePrivate", + "title": "painor", + "lastReadOutboxMessageId": 391650, + "lastReadInboxMessageId": 391656, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "painor", + "isPinned": false, + "accessHash": "8575777610547612403", + "avatar": { + "hash": "1719358246079276972" + }, + "lastMessage": { + "id": 391656, + "chatId": 400319287, + "isOutgoing": false, + "content": { + "text": { + "text": "no errors." + } + }, + "date": 1578689969, + "senderUserId": 400319287, + "replyToMessageId": null + } + }, + "407368531": { + "id": 407368531, + "type": "chatTypePrivate", + "title": "Дашка Прохватилова", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 0, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-4153575517386691895", + "avatar": { + "hash": "1749634518520801195" + }, + "lastMessage": { + "id": 392440, + "chatId": 407368531, + "isOutgoing": true, + "content": { + "sticker": { + "id": "1391391008142393371", + "emoji": "🥳", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14252, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1579001312, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "419136265": { + "id": 419136265, + "type": "chatTypePrivate", + "title": "Игорь Шемятенков", + "lastReadOutboxMessageId": 392416, + "lastReadInboxMessageId": 392414, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "Xor1024", + "isPinned": false, + "accessHash": "3213993671925160653", + "lastMessage": { + "id": 392416, + "chatId": 419136265, + "isOutgoing": true, + "content": { + "text": { + "text": "Перечитаю" + } + }, + "date": 1578991419, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "420851400": { + "id": 420851400, + "type": "chatTypePrivate", + "title": "Олег Братик", + "lastReadOutboxMessageId": 390077, + "lastReadInboxMessageId": 390212, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "864263979199890906", + "avatar": { + "hash": "1807542999932053417" + }, + "lastMessage": { + "id": 390212, + "chatId": 420851400, + "isOutgoing": false, + "content": { + "text": { + "text": "Часов до 8 утра сидели болтали" + } + }, + "date": 1578082141, + "senderUserId": 420851400, + "replyToMessageId": null + } + }, + "427775494": { + "id": 427775494, + "type": "chatTypePrivate", + "title": "Guess Who", + "lastReadOutboxMessageId": 391414, + "lastReadInboxMessageId": 391413, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "surgie", + "isPinned": false, + "accessHash": "-2877652694018983893", + "lastMessage": { + "id": 391414, + "chatId": 427775494, + "isOutgoing": true, + "content": { + "text": { + "text": "Спасибо, и тебя" + } + }, + "date": 1578667052, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "524900290": { + "id": 524900290, + "type": "chatTypePrivate", + "title": "Анна Дьякова", + "lastReadOutboxMessageId": 392157, + "lastReadInboxMessageId": 392160, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "3217371758289283304", + "avatar": { + "hash": "2254429579667154857" + }, + "lastMessage": { + "id": 392160, + "chatId": 524900290, + "isOutgoing": false, + "content": { + "text": { + "text": "Спасиииибо (  ͡  ߜ  ͡  )" + } + }, + "date": 1578862156, + "senderUserId": 524900290, + "replyToMessageId": null + } + }, + "715284311": { + "id": 715284311, + "type": "chatTypePrivate", + "title": "Бабушка Лора", + "lastReadOutboxMessageId": 392020, + "lastReadInboxMessageId": 388530, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "2986785013254352469", + "lastMessage": { + "id": 392020, + "chatId": 715284311, + "isOutgoing": true, + "content": { + "text": { + "text": "Привет, как у вас дела? Скучаю!" + } + }, + "date": 1578786713, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "903250362": { + "id": 903250362, + "type": "chatTypePrivate", + "title": "Сергей Кощеев", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 390332, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-2230752646882991078", + "lastMessage": { + "id": 390332, + "chatId": 903250362, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% joined Telegram" + } + }, + "date": 1578152955, + "senderUserId": 903250362, + "replyToMessageId": null + } + }, + "938430445": { + "id": 938430445, + "type": "chatTypePrivate", + "title": "Витя Устинов", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 392162, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-8521819193925892158", + "lastMessage": { + "id": 392162, + "chatId": 938430445, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% joined Telegram" + } + }, + "date": 1578875535, + "senderUserId": 938430445, + "replyToMessageId": null + } + }, + "974851635": { + "id": 974851635, + "type": "chatTypePrivate", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 387425, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "-7500710878276106389", + "lastMessage": { + "id": 387425, + "chatId": 974851635, + "isOutgoing": false, + "content": { + "text": { + "text": "❗️Не переплачивай больше за стафф, покупай аккаунты с балансом со скидкой до 70%.\n\n🚫Вывод средств с гидры невозможен, средства могут быть использованы только для покупок.\n\n🎦 Предоставим доказательства входа в аккаунт на фоне диалога.\n\n🔺В наличии почти всегда есть аккаунты с балансом. Данный канал носит чисто информационный характер. Наличие нужного баланса уточняйте у нашего менеджера.\n\nПриобрести можно по контактам -> @acc_drugsbot\nОстерегайтесь мошенников - фейков.", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 427, + "length": 13 + } + ] + } + }, + "date": 1576909987, + "senderUserId": 974851635, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + } + }, + "-1036855149": { + "id": -1036855149, + "type": "chatTypeSuperGroup", + "title": "Главчят", + "lastReadOutboxMessageId": 252775, + "lastReadInboxMessageId": 252758, + "unreadCount": 22, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "5356397661100462170", + "avatar": { + "hash": "2-230113312-293114" + }, + "lastMessage": { + "id": 252780, + "chatId": -1036855149, + "isOutgoing": false, + "content": { + "text": { + "text": "уходил)" + } + }, + "date": 1579007922, + "senderUserId": 62391846, + "replyToMessageId": 252778 + } + }, + "-208483550": { + "id": -208483550, + "type": "chatTypeBasicGroup", + "title": "Anyway Labs · Crew", + "lastReadOutboxMessageId": 392462, + "lastReadInboxMessageId": 392456, + "unreadCount": 6, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-250938229-102594" + }, + "lastMessage": { + "id": 392463, + "chatId": -208483550, + "isOutgoing": false, + "content": { + "text": { + "text": "Окей" + } + }, + "date": 1579007880, + "senderUserId": 73285792, + "replyToMessageId": null + } + }, + "-1186709966": { + "id": -1186709966, + "type": "chatTypeSuperGroup", + "title": "Moscow Office OSOME", + "lastReadOutboxMessageId": 2726, + "lastReadInboxMessageId": 2726, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "8403662618272069678", + "avatar": { + "hash": "2-246929396-29410" + }, + "lastMessage": { + "id": 2726, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "перестали принимать много карточек?" + } + }, + "date": 1579005939, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "membersCount": 43, + "onlineCount": 22, + "fullInfo": { + "about": "", + "pinnedMessageId": null + } + }, + "-1322215945": { + "id": -1322215945, + "type": "chatTypeSuperGroup", + "title": "Telegram Contests", + "lastReadOutboxMessageId": 65452, + "lastReadInboxMessageId": 65450, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "contests", + "isPinned": false, + "accessHash": "-9023057957488876765", + "avatar": { + "hash": "1-806625367-105295" + }, + "lastMessage": { + "id": 65450, + "chatId": -1322215945, + "isOutgoing": false, + "content": { + "text": { + "text": "🤣🤣🤣🤣" + } + }, + "date": 1579005472, + "senderUserId": 344577595, + "replyToMessageId": 65427 + } + }, + "-1267450324": { + "id": -1267450324, + "type": "chatTypeSuperGroup", + "title": "Конкурсы Telegram", + "lastReadOutboxMessageId": 28958, + "lastReadInboxMessageId": 28953, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "contests_ru", + "isPinned": false, + "accessHash": "-9158153993949327243", + "avatar": { + "hash": "1-806624804-266198" + }, + "lastMessage": { + "id": 28953, + "chatId": -1267450324, + "isOutgoing": false, + "content": { + "text": { + "text": "Эх, теперь я никогда не узнаю, как это сделать" + } + }, + "date": 1579001553, + "senderUserId": 514132543, + "replyToMessageId": null + } + }, + "-398751458": { + "id": -398751458, + "type": "chatTypeBasicGroup", + "title": "AnywayLabs · Wearable Coach", + "lastReadOutboxMessageId": 392438, + "lastReadInboxMessageId": 392437, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-250821924-336781" + }, + "lastMessage": { + "id": 392438, + "chatId": -398751458, + "isOutgoing": true, + "content": { + "text": { + "text": "Ответил" + } + }, + "date": 1579001141, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "-264075795": { + "id": -264075795, + "type": "chatTypeBasicGroup", + "title": "Stunt Channel", + "lastReadOutboxMessageId": 392431, + "lastReadInboxMessageId": 392436, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-263701105-361361" + }, + "lastMessage": { + "id": 392436, + "chatId": -264075795, + "isOutgoing": false, + "content": { + "text": { + "text": "))) заценю обязательно, прям интрига" + } + }, + "date": 1579000674, + "senderUserId": 542350852, + "replyToMessageId": null + } + }, + "-1180212174": { + "id": -1180212174, + "type": "chatTypeSuperGroup", + "title": "Gram JS Chat", + "lastReadOutboxMessageId": 8031, + "lastReadInboxMessageId": 8031, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "gramjschat", + "isPinned": false, + "accessHash": "-2017644511911141514", + "avatar": { + "hash": "1-806022188-353689" + }, + "lastMessage": { + "id": 8031, + "chatId": -1180212174, + "isOutgoing": false, + "content": { + "text": { + "text": "You can check recent actions" + } + }, + "date": 1578967369, + "senderUserId": 234480941, + "replyToMessageId": 8028 + } + }, + "-1453798102": { + "id": -1453798102, + "type": "chatTypeChannel", + "title": "Живи там хорошо!", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 76, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "zhivi_tam_horosho", + "isPinned": false, + "accessHash": "3523347799747927492", + "avatar": { + "hash": "2-263838104-263574" + }, + "lastMessage": { + "id": 76, + "chatId": -1453798102, + "isOutgoing": false, + "content": { + "text": { + "text": "Бисквитки. Понимаете, бисквитки! \n\n«Граждане, принимаем печеньки, не задерживаемся» :-)" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDR37nyGfHXFSeaB2NVxn+HFPNVZEXZIZx6GoHmQyhi2MdqZPIIkyT9Krq6vzuxn1qZwTVhpsvi6iGfnX86Kpl4kxubr7UVNn3KLaoAmKU8Annj0pcj/IqneRyzkBGUIOx7n8qslJjZBLK27DhfTYpx+tUnfDnr+IxU4tLlPuPGPoMf0p0VjIZlaUqR1+tAyxaRBYtzr8zdfYdqKsiNh6UVzzg+Zlp6CnAPQ/8AfNKFHp+lFFU3LuKwuwen6UBQO36UUUuaXcLC0UUVom7CP//Z", + "width": 1110, + "height": 1206 + }, + "sizes": [ + { + "width": 294, + "height": 320, + "type": "m" + }, + { + "width": 736, + "height": 800, + "type": "x" + }, + { + "width": 1110, + "height": 1206, + "type": "y" + } + ] + } + }, + "date": 1578955674, + "senderUserId": 0, + "replyToMessageId": null + } + }, + "-1406145223": { + "id": -1406145223, + "type": "chatTypeSuperGroup", + "title": "Футбол по понедельникам", + "lastReadOutboxMessageId": 1440, + "lastReadInboxMessageId": 1438, + "unreadCount": 2, + "unreadMentionsCount": 0, + "username": null, + "isPinned": false, + "accessHash": "5770593500960833105", + "lastMessage": { + "id": 1440, + "chatId": -1406145223, + "isOutgoing": false, + "content": { + "text": { + "text": "по 500р мне или @riadwaw, у меня +79161967673 Тинькофф сбер или авангард", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 16, + "length": 8 + }, + { + "className": "MessageEntityPhone", + "classType": "constructor", + "offset": 33, + "length": 12 + } + ] + } + }, + "date": 1578948236, + "senderUserId": 108649628, + "replyToMessageId": null + } + }, + "-1038976893": { + "id": -1038976893, + "type": "chatTypeChannel", + "title": "Telegram Contests", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 147, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "contest", + "isPinned": false, + "accessHash": "3138075399534869952", + "avatar": { + "hash": "1-802208040-73728" + }, + "lastMessage": { + "id": 147, + "chatId": -1038976893, + "isOutgoing": false, + "content": { + "text": { + "text": "The second round of the VoIP Сontest will start on Tuesday, January 14. Contestants will have two weeks to complete the task. \n\nEveryone will be able to participate, including contestants who didn’t take part in the first round of the VoIP Contest.\n\nStay tuned!\n\nP.S. Note that the second round of the JavaScript Contest, also starting next week, will have different rules: only the 32 winners of round one will be able to participate.", + "entities": [ + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 4, + "length": 12 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 24, + "length": 12 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 60, + "length": 10 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 93, + "length": 11 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 115, + "length": 1 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 128, + "length": 8 + }, + { + "className": "MessageEntityItalic", + "classType": "constructor", + "offset": 302, + "length": 18 + }, + { + "className": "MessageEntityTextUrl", + "classType": "constructor", + "offset": 383, + "length": 10, + "url": "https://t.me/contest/146" + } + ] + } + }, + "date": 1578671169, + "senderUserId": 0, + "replyToMessageId": null + } + }, + "-227209700": { + "id": -227209700, + "type": "chatTypeBasicGroup", + "title": "Anyway Labs", + "lastReadOutboxMessageId": 391182, + "lastReadInboxMessageId": 389808, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-255431668-114862" + }, + "lastMessage": { + "id": 391182, + "chatId": -227209700, + "isOutgoing": true, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP3nYBtXjvTTk+n4U4dOSaaWPQ/wA6YhMUlLkegoyPSmAlFFFADgKNv1ptLQAlFLRQAlFFFAH/2Q==", + "width": 1280, + "height": 800 + }, + "sizes": [ + { + "width": 320, + "height": 200, + "type": "m" + }, + { + "width": 800, + "height": 500, + "type": "x" + }, + { + "width": 1280, + "height": 800, + "type": "y" + } + ] + } + }, + "date": 1578550688, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "-1344059810": { + "id": -1344059810, + "type": "chatTypeChannel", + "title": "TON.Dev", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 32, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "TON_DEV", + "isPinned": false, + "accessHash": "8717337303364720758", + "avatar": { + "hash": "2-263836324-205447" + }, + "lastMessage": { + "id": 32, + "chatId": -1344059810, + "isOutgoing": false, + "content": { + "text": { + "text": "https://www.youtube.com/watch?v=oMWIJHs0dEo\nWe know that many of you (like us) will continue to work on these holidays, even those who have them longer than usual ;)\nSo if you' try our Solidity compiler, here is the second part of tips and tricks for gas optimization.\nPrevious part is here. \nMerry Christmas and Happy New Year for all TON community! See you next Year!", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 43 + }, + { + "className": "MessageEntityTextUrl", + "classType": "constructor", + "offset": 286, + "length": 4, + "url": "https://t.me/TON_DEV/29" + } + ] + } + }, + "date": 1577735026, + "senderUserId": 0, + "replyToMessageId": null + } + }, + "-1330843177": { + "id": -1330843177, + "type": "chatTypeChannel", + "title": "TON technical overview", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 37, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "ton_overview", + "isPinned": false, + "accessHash": "-5709475904498515540", + "avatar": { + "hash": "2-263907397-120621" + }, + "lastMessage": { + "id": 37, + "chatId": -1330843177, + "isOutgoing": false, + "content": { + "text": { + "text": "Viewst Creative Ad Builder viewst.com (with me as the developer) released pyTON: python wrapper for tonlibjson. https://github.com/viewst/pyTON\nThere are functions for getting account states, transactions, sending messages to blockchain, and running getmethods.\nAlso, there is embedded webserver, and now you can run your own local analog ton.sh or toncenter.com via two commands:\npip3 install pyTON && python3 -m pyTON\n(python 3.7+ is required)\nWhile we keep web server API close to presented on ton.sh, our service is more functional. For instance, there are no limits for requested transactions, and it is possible to request all transactions which happened after the known one. Also, you may send BOC's to network both as serialized cell and in object format: {\"data\": {\"b64\": \"...\", \"len\": int }, \"refs\": [...subcells...]}. It is also possible to turn on API for running getMethods (although we do not recommend to open this API for public servers since it is possible to crash liteclient by maliciously constructed getMethod).", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 27, + "length": 10 + }, + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 112, + "length": 31 + }, + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 339, + "length": 6 + }, + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 349, + "length": 13 + }, + { + "className": "MessageEntityCode", + "classType": "constructor", + "offset": 381, + "length": 38 + }, + { + "className": "MessageEntityItalic", + "classType": "constructor", + "offset": 420, + "length": 25 + }, + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 497, + "length": 6 + }, + { + "className": "MessageEntityCode", + "classType": "constructor", + "offset": 764, + "length": 63 + } + ] + } + }, + "date": 1577553717, + "senderUserId": 0, + "replyToMessageId": null + } + }, + "-380899033": { + "id": -380899033, + "type": "chatTypeBasicGroup", + "title": "GROUP WITH ME", + "lastReadOutboxMessageId": 389297, + "lastReadInboxMessageId": 381740, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "lastMessage": { + "id": 389297, + "chatId": -380899033, + "isOutgoing": true, + "content": { + "text": { + "text": "уиуиуи" + }, + "video": { + "duration": 2, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSxjvTN3LAEEj0qEyiG3ZsE7egzWfFdSI7F8jdnqOlIo2BsUZZh+dFYm4lyDk8ZHtRSCxZuGLwso4HXNUPMdyoLFsHpmrkpyjD1FVYYX8wEjaBzzTQmEqPG24A7W7mirb7Su0nAzmigYpUMKXaT3oopAKYye1FFFAH/9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 419567, + "mimeType": "video/mp4", + "fileName": "IMG_8007.MOV" + } + }, + "date": 1577496082, + "senderUserId": 3718260, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": 177121435, + "origin": { + "senderUserId": 177121435 + } + } + } + }, + "-287980009": { + "id": -287980009, + "type": "chatTypeBasicGroup", + "title": "Anyway Labs · FVTransport", + "lastReadOutboxMessageId": 388814, + "lastReadInboxMessageId": 388812, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-246929220-414259" + }, + "lastMessage": { + "id": 388814, + "chatId": -287980009, + "isOutgoing": true, + "content": { + "text": { + "text": "Пора вызывать Ночной дозор)" + } + }, + "date": 1577340991, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "-1416855018": { + "id": -1416855018, + "type": "chatTypeChannel", + "title": "Telegram Designers", + "lastReadOutboxMessageId": 0, + "lastReadInboxMessageId": 133, + "unreadCount": 0, + "unreadMentionsCount": 0, + "username": "designers", + "isPinned": false, + "accessHash": "4395592559835756670", + "avatar": { + "hash": "1-806010698-157266" + }, + "lastMessage": { + "id": 133, + "chatId": -1416855018, + "isOutgoing": false, + "content": { + "text": { + "text": "Suggested by @kirillorlov", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 13, + "length": 12 + } + ] + }, + "video": { + "duration": 71, + "width": 820, + "height": 626, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDZprnAHOOadTX6D60AICxPBFOA55pinJ45/wA/WpKACiiigApr9OKdSEZFADRzTgKAMDFKBigAooooA//Z", + "width": 320, + "height": 244 + } + }, + "document": { + "size": 7497413, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1577277792, + "senderUserId": 0, + "replyToMessageId": null + } + }, + "-219517351": { + "id": -219517351, + "type": "chatTypeBasicGroup", + "title": "Winning 🏆 Telegram Lightweight Client Contest", + "lastReadOutboxMessageId": 386318, + "lastReadInboxMessageId": 382536, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-257715944-115885" + }, + "lastMessage": { + "id": 386318, + "chatId": -219517351, + "isOutgoing": true, + "content": { + "text": { + "text": "And one more time" + } + }, + "date": 1576701202, + "senderUserId": 3718260, + "replyToMessageId": null + } + }, + "-300045230": { + "id": -300045230, + "type": "chatTypeBasicGroup", + "title": "Криптостая Smart TV", + "lastReadOutboxMessageId": 362233, + "lastReadInboxMessageId": 385579, + "unreadCount": 0, + "unreadMentionsCount": 0, + "isPinned": false, + "avatar": { + "hash": "2-235140631-137735" + }, + "lastMessage": { + "id": 385579, + "chatId": -300045230, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCQanOU3i1O0jOd/wD9amSavJGdr2+CR/z0H+FY4cgYy350b/mzlvzoA1f7cI/5Yn/vv/61FZJ5OeaKAEz7UuCRnFJS4OOnFACUUUUAW4LiKMAG1WQ4/WpXvIdvNii+hz/9aiigClI6tIWVAoPQelFFFAH/2Q==", + "width": 591, + "height": 1280 + }, + "sizes": [ + { + "width": 148, + "height": 320, + "type": "m" + }, + { + "width": 369, + "height": 800, + "type": "x" + }, + { + "width": 591, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576557069, + "senderUserId": 120566766, + "replyToMessageId": null + } + } + }, + "scrollOffsetById": { + "-1186709966": 50000 + }, + "replyingToById": {}, + "editingById": {}, + "draftsById": {}, + "selectedId": -1186709966 + }, + "groups": { + "ids": [], + "byId": { + } + }, + "messages": { + "byChatId": { + "-1186709966": { + "byId": { + "1718": { + "id": 1718, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "5161485537902736", + "emoji": "🔪", + "isAnimated": false, + "width": 512, + "height": 365 + }, + "document": { + "size": 16786, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573226544, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1719": { + "id": 1719, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCseKtxSwcfNjHYiqlNPTkA1DVyk7GriN/uHP0NQlG3YBrPOQOCQauWLSOrFnJ5wO9TyFcxGACKiI+cHHFW3gZOcVC4I6jitCBjqdgb16VbtAiwLxljzwRkfnioAwxSg/jQBOLoFfnyD71DOygA+tFFABGgkXIpxiI6UUUgP//Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573230151, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1720": { + "id": 1720, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "рип ин пис" + } + }, + "date": 1573230155, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1721": { + "id": 1721, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "штопора нет" + } + }, + "date": 1573230167, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1722": { + "id": 1722, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Пора корпоративный заиметь" + } + }, + "date": 1573230228, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1723": { + "id": 1723, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Титановый" + } + }, + "date": 1573230233, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1724": { + "id": 1724, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Osome 2:0 Штопоры" + } + }, + "date": 1573230331, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "1725": { + "id": 1725, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "да хотя бы нарзанник нормальный купить" + } + }, + "date": 1573230551, + "senderUserId": 177121435, + "replyToMessageId": 1723 + }, + "1726": { + "id": 1726, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а на это говнище" + } + }, + "date": 1573230556, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1727": { + "id": 1727, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "фу" + } + }, + "date": 1573230561, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1728": { + "id": 1728, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "179482044735160948", + "emoji": "😕", + "isAnimated": false, + "width": 128, + "height": 96, + "thumbnail": { + "width": 128, + "height": 96, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRlQIAABXRUJQVlA4IEgIAAAQKgCdASqAAGAAPlEgjkUjoaETqjaUOAUEtIALZpVr/GXxJfS/1/8jfUo/nele/pfIp9pPuf5W7+7/H+oF6k/uX5e/2H9wPbNzAP8r6gXsB85/uX5af4f0EP4D8gPcf5gPcA/lP82/xX5Z/BvfeeTewB/K/6b/mP6v+Wn0tfwn/N/xXnf/NP8R/w/8F8Av8k/oP+b/v37t/4z//+J70bP3WOZrm61ZxHyrd+Ql2VajRhkgCx+k957ENNjbZcsKUhuIvpBfaDLEN+L5hzLe3HZfDz+/2w5XcNCHcEDZIIIpDZAaMAVnChVw4BoEWtElszxD/jPDeT562/1Dya0XAokaAGmppwjewBMb9rDKwx3YAUkJ9wz6Eun3gyuyHJdddKnHrV0MBYE/rQjdS1fWZsYvB7RpVMbETu/bAa+XqCuiq+R4LDIwOzWMkcsCZx8Q9ZcfsU7dfiu5GAAA/v+7IBtp0Nc8PATlfwmfDNywlRQo65SUOO6fmzOrhY8enSY1r+HOVwmRKNJGPLv+rC7k9T/LPYxkePECHKF3t16xyF9tfF9d4iulh9zU86ajz1WX8bA9nbYkEbf2uaTchH5Xn1x/Oixu0ZR2JG8vn//MIgc7xUmVD/UsPsTyEh7jIqT4VyvNzNWc6xbo8f+TUQv/753OHos+9wmAeuVfwVhLDcRMQTj6fICQqMde5fOTQe6V716ImpBpRDvftbAvbNCFTT5/fgigUHvD0+11BANqf8QsSsDOeiAcvm3iEQQE0crzZkfprobx9Hd4G1oicu2YX/nFTMrZCgcXxsX2/HCcSw5dd4hVWR10tIybYYSMTZ5DTUhz11FDk/fZl/hJ6WccNukcM7xuHI0F6uf84dAOeDTeTvlmkHaObuz4NHvLbRFee6DURvuzrxWq3KFLjx3VDs4K0jdxOxNnbPU0QY1opWt+wXGk/UGjShVRnyJLjA6W2aXZ2rGOO1RQlfnsh86Gc3b0Pc+THI090bZXifx9X802QDxQdFz3bxOnct0T4dvgmZAXs/KI3H/0utnZrm7q3Po7ARgq+LxwpQM/LAfZOcxJQ3bw7zAT+y25OQFxa6WxkEPUD8A5E5HGalTUv5mIWkWeMhO28LOUG/o9ZJLYwJCdbIpkOwm5ZBCW3yPuHw0LkvDie7mYZ2IjFvxrC+9IFdddSufbYc9kRLK0slfwPqPR/zdZ4b2EPxP9CY2Jz8jt5gkasyrZZr8PxWhzHdGhrYl+tZzGfJX8E13BGpvf1J3XvoK5j6urxzKTM0H3nv95ZlRKeghp4+xfW0orV9s8PWbohMKYcZ86ur6kTRVYBwreyoEMTgDxBsjoQArzvuuRqA/tKHE2I9AcDlbN9MIS28voouADSuS4z0QZI8H/NPBsEbVPPA3rieC4jCs5SauMywbyvc/hK6+ALdjVP4WfljrScw7e86tWj0g34VQCi3jTMdr1jX8Dx4NtLQlttO88N8d6KiNhW+byIt8fFJdEKRPAtYvw9nYGlzd5hzta+12oP2UmegMHqRhWbCyIHgozrHEhvwviHKDCXiS/qiROi6r6lVrdV+GW3svFPAsa2MyGWJzukKDQ998YSLgjJM9w98ZyzVYtzGYV+SrfRlK2cr+I3uvZkHGMP9IWR14cuVRyze3/teOUXco2oz1Dkh4+ND58kD1Z8OWa/OhUF5RoECJOkywnClDqhr+vt4+AI7GaqnxWfiJuijJjjKI42VCpi2uwmDlDcSO92fM/FfJMJfv4X2en43ACDzFv91uNZuI6+XX27TXTBzdkyd6m2owIXQkFt/QZm+jllC5p44Xg7WQl1jTaI62xNGFWu8KdwZS2zzhCLul45hkWfrk/ScxQRUYEchsLmN09SZV63DW3bHrUdolvxGOmSzLkFu3dmadZVPEcwp7Nu2dkJ5HSs0shDm0CjqN4f+FNwjmdrP2SDtiIWSlPY0eQxsyWy21OsMOvT8f/hzfPwd0jAT/OU2+ewcstaXzY2CoiC1yQ3aNo5V3iTqs6NlFmFmT6jxP9W5UzIqhwp9aF0NTkl00hEM61U5aMlF+b5S7N4AO8WdFWMtsccLKZkqy2kaCu3Z9icOtZ2+j+rsPe0mPh2F8WUCVRLSFsI3+g1VhcG4Ckz7fvvRq70TQXU8lqMFEWvigpvkNR7oDLBubZCiv1RNbKN+oTwvfb+B1996FpPper28nMT14kvDVGalj2lB0Bq+XFzOfhVRm3585Lqz9Uv18YORZHJAtFlT8F6jzSsFrcU5X70b8tuNbYxHkZq9eZDoFaaRvg8snfftmRpefQGeSc8Vngxt3iOjrC0ygMZD7Dsy4Dl0GEn+MYVwd1JFCCunBilnh+ZQ2WVEbcvEXYFLP/qlHJLdftMm0zBKYVL82sOOTBqRqeZ3WR+21XEEq1d9zDqERan4AeuGYinkVvb8GEvO780Fqn30mQ3HAa/+XIprLG9gDE2zFauyxn9J7fVNgfZYzWJVJUZEETEkhoMUfuWqBusTcDUFxANYo/VB94ItrNtlPqAsyvsjDWE2qbFP4Yha9qYDpsAqIKnj2xjxBAtIWd+rZ+1Qw6Ln/jt2oBqT8eetkHCvlwd208ZHvDPEJz9zRWLuAjsEz4VTFQIvTCaXT5LOJn2SjKu/gvLBQJDtY6P6knNmmiAEiFn9P6HF6/wpKRUuJA/0QLDliPSs6zBDs4dkQQZheBzOO8VMfnJM80XgT9nDdO+K/e8NAUZar9INBJzUQ3eMtmTAIROaxY+huYN7laU6fQziYCnfrMO3zeiVFc7iAwymmk0aZcFhHgst0/YbCGHt/nlTIzwixuW0geiNBBuQAexgAAAA==" + } + }, + "document": { + "size": 10902, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573230573, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1729": { + "id": 1729, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А вот для киселя он не нужен" + } + }, + "date": 1573230578, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1730": { + "id": 1730, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234178", + "emoji": "😄", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14636, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573230590, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1731": { + "id": 1731, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а у меня особый кисель" + } + }, + "date": 1573230596, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1732": { + "id": 1732, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "э" + } + }, + "date": 1573230596, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1733": { + "id": 1733, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1112358875685716016", + "emoji": "👁", + "isAnimated": false, + "width": 128, + "height": 22, + "thumbnail": { + "width": 128, + "height": 22, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 8840, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573230602, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1734": { + "id": 1734, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "виноградный" + } + }, + "date": 1573230602, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1735": { + "id": 1735, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "с пробкой" + } + }, + "date": 1573230605, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1736": { + "id": 1736, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кстати, сегодня я припёр два штопора. Один лежит в стеллаже в B7, второй отдал на ресепшн таблицы" + } + }, + "date": 1573493013, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1737": { + "id": 1737, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 1, + "width": 480, + "height": 326, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 112414, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1573493066, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1738": { + "id": 1738, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Человечище!" + } + }, + "date": 1573493079, + "senderUserId": 4274761, + "replyToMessageId": 1736 + }, + "1739": { + "id": 1739, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "348373043715768484", + "emoji": "😊", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 16336, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573493153, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1740": { + "id": 1740, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кто рано придёт, тому больше миндального пирога с имбирными грушами в карамели достанется" + } + }, + "date": 1573506966, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1741": { + "id": 1741, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Яяяяя" + } + }, + "date": 1573506975, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "1742": { + "id": 1742, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "179482044735160948", + "emoji": "😕", + "isAnimated": false, + "width": 128, + "height": 96, + "thumbnail": { + "width": 128, + "height": 96, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 10902, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573506989, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1743": { + "id": 1743, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "179482044735160957", + "emoji": "😔", + "isAnimated": false, + "width": 512, + "height": 487 + }, + "document": { + "size": 7044, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573507021, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "1744": { + "id": 1744, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1360886329340072497", + "emoji": "✊", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 12369, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1573537917, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1745": { + "id": 1745, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это могло бы быть ваше утро" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCULk5NSqYwpyce1IB61HKgfp1FQkU2SrkjKbdvvxTZPlPFRsj/AGfanU9aWESBdroeO+6qtcVxss/l5VfvevpVUO5YvuOfXNJKds7jpzQpHlnLjGcVDuUrFyKYnjv/ADqYSN/c/Ws+D5plAOe9XxwapN2JaRW2R3RDKcMOopr2aiMhTznOTRRVNCTHWsaISQQSeMirR60UVKKZ/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573542136, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "1746": { + "id": 1746, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Буду через 16 минут" + } + }, + "date": 1573542232, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1747": { + "id": 1747, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://m.facebook.com/100000379272171/posts/2621163677906249/?app=fbl", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 70 + } + ] + } + }, + "date": 1573730696, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1748": { + "id": 1748, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "интердастинг" + } + }, + "date": 1573730709, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1749": { + "id": 1749, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У меня уже бомбануло по этому поводу" + } + }, + "date": 1573730801, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1750": { + "id": 1750, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "интересно, много им людей написало, и сколько они потеряют клиентов?" + } + }, + "date": 1573730818, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1751": { + "id": 1751, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "(я уже знаю 7)" + } + }, + "date": 1573730826, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1752": { + "id": 1752, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "еп\nу меня довольно сильно горит, стала бы восьмой, но куда идти, не знаю\nвсе российские банки — такое себе)" + } + }, + "date": 1573731020, + "senderUserId": 177121435, + "replyToMessageId": 1749 + }, + "1753": { + "id": 1753, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я пойду в Альфу" + } + }, + "date": 1573731042, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1754": { + "id": 1754, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Либо тупо на точке останусь" + } + }, + "date": 1573731060, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1755": { + "id": 1755, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я в альфе, но хз, не думаю, что они чем-то отличаются" + } + }, + "date": 1573731079, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1756": { + "id": 1756, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В этом плане" + } + }, + "date": 1573731082, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1757": { + "id": 1757, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а смысл? кмк, шило на мыло" + } + }, + "date": 1573731145, + "senderUserId": 177121435, + "replyToMessageId": 1753 + }, + "1758": { + "id": 1758, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Клиент Тинькова смотрит на тебя с недоумением" + } + }, + "date": 1573731236, + "senderUserId": 3412850, + "replyToMessageId": 1752 + }, + "1759": { + "id": 1759, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCPTLNJf30hBA6L/U1Nd6WJAXgAD/3ex/wqhDcGIgxvirdxqbeTtjOJG6kdB9KANd27cj6GhDwRkn60hB3cBvwpwLdxgfWgDIbRcdLjJ/3B/jSjRCRzOR/wD/69abH5/wAPXFOQjn/GgDMfVGdQBGUx6N1/SiPVWQENGXJ9X/8ArVWAT7vG7/PvTHQBu+fpTFc3ZRjDBGYnjg0sOSpyhT60UUhnOjAlEmGLDoMVK0xZs7CMUUUxH//Z", + "width": 1024, + "height": 1280 + }, + "sizes": [ + { + "width": 256, + "height": 320, + "type": "m" + }, + { + "width": 640, + "height": 800, + "type": "x" + }, + { + "width": 1024, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573731274, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1760": { + "id": 1760, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "пойдет" + } + }, + "date": 1573731288, + "senderUserId": 177121435, + "replyToMessageId": 1759 + }, + "1761": { + "id": 1761, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "868996962018394191", + "emoji": "👍", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 17112, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573731302, + "senderUserId": 860139781, + "replyToMessageId": 1759 + }, + "1762": { + "id": 1762, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Тинек тоже известен своим многочисленным говном\nкак и любой российский банк)" + } + }, + "date": 1573731339, + "senderUserId": 177121435, + "replyToMessageId": 1758 + }, + "1763": { + "id": 1763, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а зачем вообще банк в 2к19?" + } + }, + "date": 1573731365, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1764": { + "id": 1764, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "надо деньги в биткоинах хранить" + } + }, + "date": 1573731374, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1765": { + "id": 1765, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я тоже читал эти офигительные истории, но со мной такого ничего не происходило 🤷‍♀️" + } + }, + "date": 1573731377, + "senderUserId": 3412850, + "replyToMessageId": 1762 + }, + "1766": { + "id": 1766, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "(или лешкоинах)" + } + }, + "date": 1573731378, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1767": { + "id": 1767, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кукоинах" + } + }, + "date": 1573731381, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1768": { + "id": 1768, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Опередил" + } + }, + "date": 1573731384, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1769": { + "id": 1769, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Долго терпел" + } + }, + "date": 1573731388, + "senderUserId": 3412850, + "replyToMessageId": 1766 + }, + "1770": { + "id": 1770, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Смотрю на клиента Тинькова с презрением" + } + }, + "date": 1573731399, + "senderUserId": 194771934, + "replyToMessageId": 1758 + }, + "1771": { + "id": 1771, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "На самом деле вкусовщина" + } + }, + "date": 1573731438, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1772": { + "id": 1772, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "*очевидная шутка с отсылкой про разбан в чате, который я буду эксплуатировать годами*" + } + }, + "date": 1573731463, + "senderUserId": 3412850, + "replyToMessageId": 1770 + }, + "1773": { + "id": 1773, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Тиньков мне не нра, хотя есть карта (и сегодня привезут с Риком и Морти)." + } + }, + "date": 1573731488, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1774": { + "id": 1774, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Деньги в битховены, битховены в холодный кошелек, кошелек на флешку, флешку в землю)\nи сиди довольный" + } + }, + "date": 1573731504, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "1775": { + "id": 1775, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "*сделал вид, что не заметил*" + } + }, + "date": 1573731522, + "senderUserId": 194771934, + "replyToMessageId": 1772 + }, + "1776": { + "id": 1776, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Главное пароль распечатать, порезать на буквы и закопать в разных местах" + } + }, + "date": 1573731565, + "senderUserId": 194771934, + "replyToMessageId": 1774 + }, + "1777": { + "id": 1777, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нет, деньги зло. Закопай их и наслаждайся)" + } + }, + "date": 1573731589, + "senderUserId": 205688700, + "replyToMessageId": 1776 + }, + "1778": { + "id": 1778, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У Альфы есть фича в детализации платежей" + } + }, + "date": 1573731700, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1779": { + "id": 1779, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP8hz2pPJk/u/rXTIGUtuYtk8cdKfRcDlvJl/uj8xRXVUU7gMzzyBTtwpCgJ6mlCgHgUgF/CiiigAJAGTxSBgehB+hoooAWiiigD//2Q==", + "width": 591, + "height": 1280 + }, + "sizes": [ + { + "width": 148, + "height": 320, + "type": "m" + }, + { + "width": 369, + "height": 800, + "type": "x" + }, + { + "width": 591, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573731707, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1780": { + "id": 1780, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не Облагаетсян! Армян какой то?" + } + }, + "date": 1573731742, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1781": { + "id": 1781, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ахаха" + } + }, + "date": 1573731762, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1782": { + "id": 1782, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ору" + } + }, + "date": 1573731763, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1783": { + "id": 1783, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "sooooqa" + } + }, + "date": 1573731780, + "senderUserId": 177121435, + "replyToMessageId": 1779 + }, + "1784": { + "id": 1784, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мы с Лизой на весь офис орем" + } + }, + "date": 1573731787, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1785": { + "id": 1785, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мне кажется, Яна сейчас заплачет" + } + }, + "date": 1573731820, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1786": { + "id": 1786, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "868996962018394191", + "emoji": "👍", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 17112, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573731880, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1787": { + "id": 1787, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В Ростелекоме все как армяне пахали" + } + }, + "date": 1573731995, + "senderUserId": 356765513, + "replyToMessageId": 1780 + }, + "1788": { + "id": 1788, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Навар Евгеньевич Необлагаесян" + } + }, + "date": 1573732065, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1789": { + "id": 1789, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1685141920508018879", + "emoji": "👺", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 18438, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573732080, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1790": { + "id": 1790, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1137162165791227928", + "emoji": "😂", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 11493, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1573732140, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1791": { + "id": 1791, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "проорал" + } + }, + "date": 1573732581, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1792": { + "id": 1792, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "157750352030991019", + "emoji": "☺️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 11576, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573732655, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1793": { + "id": 1793, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "причем как бы\nкейс Рокета очень стандартный\nс сотнями клиентов так поступают и они, и другие банки" + } + }, + "date": 1573732716, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1794": { + "id": 1794, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "просто грустно в принципе" + } + }, + "date": 1573732721, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1795": { + "id": 1795, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и опять-таки, они не то, чтобы добровольно это делают" + } + }, + "date": 1573732746, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1796": { + "id": 1796, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да вот не сказал бы. У меня очень много прилетает денег от вообще разных людей" + } + }, + "date": 1573732834, + "senderUserId": 194771934, + "replyToMessageId": 1793 + }, + "1797": { + "id": 1797, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "но меня никто ни о чем не спрашивал" + } + }, + "date": 1573732842, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1798": { + "id": 1798, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "тут явно политика" + } + }, + "date": 1573732847, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1799": { + "id": 1799, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну блин ровно в день когда я выпустила вторую карту у них)))))" + } + }, + "date": 1573732884, + "senderUserId": 141185012, + "replyToMessageId": 1747 + }, + "1800": { + "id": 1800, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не знаю, как работает финмон, но сомневаюсь\nпросто если вот представить, что это не Волков, а просто чувак, который получает прям много-много переводов с других карт, то вполне себе ясно становится, почему ему кинули запрос\n\nя таких встречала много" + } + }, + "date": 1573733247, + "senderUserId": 177121435, + "replyToMessageId": 1798 + }, + "1801": { + "id": 1801, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я сейчас не оправдываю Рокет" + } + }, + "date": 1573733274, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1802": { + "id": 1802, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я просто говорю, как оно примерно работает" + } + }, + "date": 1573733280, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1803": { + "id": 1803, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ситуация обычная, так-то. Просто так много грустных новостей" + } + }, + "date": 1573733320, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1804": { + "id": 1804, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "272479773299573627", + "emoji": "😉", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 24734, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573733729, + "senderUserId": 149266234, + "replyToMessageId": 1801 + }, + "1805": { + "id": 1805, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "есть достаточно распространённое мнение среди sme, что банки злоупотребляют и манипулируют 115фз" + } + }, + "date": 1573736517, + "senderUserId": 54158593, + "replyToMessageId": 1800 + }, + "1806": { + "id": 1806, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "да, тоже так думаю" + } + }, + "date": 1573736534, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1807": { + "id": 1807, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А некоторые банки это мнение укрепляют" + } + }, + "date": 1573736536, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1808": { + "id": 1808, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "“лишь бы чего не вышло\"" + } + }, + "date": 1573736539, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1809": { + "id": 1809, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "658767117562151061", + "emoji": "🥴", + "isAnimated": true, + "width": 512, + "height": 512 + }, + "document": { + "size": 6902, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1573736541, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1810": { + "id": 1810, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кстати, Сбербанк в этом вопросе у всех на хорошем счету" + } + }, + "date": 1573736561, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1811": { + "id": 1811, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAOACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwChycEZppY5pA5AwO3tTc9615mTyoduNJ1NJUkA3Sqp6E0pSuhxjqHl5HAOaKvrAqkHJ4orHnOj2R//2Q==", + "width": 1125, + "height": 390 + }, + "sizes": [ + { + "width": 320, + "height": 111, + "type": "m" + }, + { + "width": 800, + "height": 277, + "type": "x" + }, + { + "width": 1125, + "height": 390, + "type": "y" + } + ] + } + }, + "date": 1573738523, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "1812": { + "id": 1812, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кто то промахнулся" + } + }, + "date": 1573738529, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "1813": { + "id": 1813, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мне тож пришло ахаха" + } + }, + "date": 1573738582, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1814": { + "id": 1814, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "+1, люблю отладку в проде" + } + }, + "date": 1573738707, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "1815": { + "id": 1815, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Собираемся (не)много выпить этим славным вечерком, давайте грешить вместе, коли возжелаете. Хотя, может, и так все собираются, а я опять все пропустила 🌚" + } + }, + "date": 1573814095, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1816": { + "id": 1816, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну как все... не все😁" + } + }, + "date": 1573814121, + "senderUserId": 860139781, + "replyToMessageId": 1815 + }, + "1817": { + "id": 1817, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "830557752043504127", + "emoji": "👋", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 19544, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573814147, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1818": { + "id": 1818, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1057263438939553868", + "emoji": "😡", + "isAnimated": false, + "width": 128, + "height": 99, + "thumbnail": { + "width": 128, + "height": 99, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 56458, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573814195, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1819": { + "id": 1819, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "+1" + } + }, + "date": 1573814209, + "senderUserId": 53759108, + "replyToMessageId": 1816 + }, + "1820": { + "id": 1820, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а мы потом устроим свою вечеринку, с блэкджэком так сказать" + } + }, + "date": 1573814241, + "senderUserId": 860139781, + "replyToMessageId": 1819 + }, + "1821": { + "id": 1821, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я за, если кто-то разделит со мной бутылочку рислинга" + } + }, + "date": 1573814422, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1822": { + "id": 1822, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я выпью за твое здоровье сегодня вечером😻 считай, разделю" + } + }, + "date": 1573814447, + "senderUserId": 860139781, + "replyToMessageId": 1821 + }, + "1823": { + "id": 1823, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "40599651539223283", + "emoji": "🐢", + "isAnimated": false, + "width": 512, + "height": 511 + }, + "document": { + "size": 28280, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573814493, + "senderUserId": 327556368, + "replyToMessageId": 1821 + }, + "1824": { + "id": 1824, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "забились" + } + }, + "date": 1573814523, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1825": { + "id": 1825, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "спасиба" + } + }, + "date": 1573814531, + "senderUserId": 177121435, + "replyToMessageId": 1822 + }, + "1826": { + "id": 1826, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Airbnb в России всё?" + } + }, + "date": 1573820727, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1827": { + "id": 1827, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В России запретили посуточную аренду квартир\n\nДимон душит малый бизнес" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC4syFm2yLwTnluKPNBBxIOnHLVnIAb1uecnj161cSIEA+1KV0xx1RIs6h8eanH+01P+1Hu8fX0NVZBHG2DuJ9hml8sYU1PMVymgs0bDIbI+lFQwAeXRVkGUpIvCcZO44/WrCMy/wASoScAetPWxInLlhnJ59KmW1AA3OGIOQStKd2xx0RXc+Z82ADjGc0LMiqI33ZXA4BNWVtlC8kbvXBpIYpEQKzA46Hn/CpSZVySAjZ17+lFSJGwXkiirJEIfJ4NGH9P50UUCF2P/k0BZAeg/OiigCUZxyMfjRRRQB//2Q==", + "width": 683, + "height": 768 + }, + "sizes": [ + { + "width": 285, + "height": 320, + "type": "m" + }, + { + "width": 683, + "height": 768, + "type": "x" + } + ] + } + }, + "date": 1573820727, + "senderUserId": 356765513, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "1828": { + "id": 1828, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "неверно, в россии запретили гостиничные услуги" + } + }, + "date": 1573820953, + "senderUserId": 54158593, + "replyToMessageId": 1827 + }, + "1829": { + "id": 1829, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "посуточная аренда квартир != гостиничные услуги" + } + }, + "date": 1573820971, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1830": { + "id": 1830, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 17, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSkuYox8z8j0qt/aUBOMMPc1mlxkHbjA596YvzvgnA5wKQ7Ggb9A7bAQPXPJorLZgGIopgSy8qGHeoweRg0xXLJtzU1tIIGLMgJP3WPakgY8wYbdIhBbnBookusMTnzGPUk8UUWKUl2KY4NTkb1HrRRQxIhZcHFFFFAmf/2Q==", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 2569320, + "mimeType": "video/mp4", + "fileName": "IMG_1489.MOV" + } + }, + "date": 1573823486, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1831": { + "id": 1831, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCAJ5l6wJI4PSpHgeMFgQwHPPBqDYJbkA85b+tXBbDO1XdVPGN2f50MEQMjBSXQgd8jP8qFY4wrH6DmpVLmKZHOSuRmpJI1kA3KD9RSuOxTtsPdIPep7meMJ8jjfnqD0qrZ83S/Wnz2brMRGMg8inu7C2RF57l2+bbu6gVpxq0sasrcEVlm3kU5YYxzVm0lcArvYDrwM0pKw07lS1fbOD15/oa0fM8wg4wOnWiirjuRLYivY5BtYcrtz9KZbZkj2xsARyaKKmTuUlY//9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573823517, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "1832": { + "id": 1832, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBsCCTfGThsgr+lJNGyKyOMMKdAwEj5GehqzelWiBAI7ZJzSYFGZPkLL0xyKRFPlJ9BU8iEQyjPIXmqVwQgjCMR8vNLyKLAkVAZgMjIGDSTzvhU4KEA5HvVZI5WTeg4Bz1/pTjIWHUJxjimItGVHtp9jE8d6oSJhyoOakSKRozsYY70+SHact8uffFEVaQMuIhlkVVO3dnJxUv9jr/z1/SiihAxJbE28JZZMgHpiql15k0g2ZwBRRQ9AWp//9k=", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1573823522, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1833": { + "id": 1833, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCeNUlt1DZBGcGomG2VMnt1qS2I8lc+mevtSSACZd3SpGRXXJgH/TQVLkqdpBNRXGd8OMYEg/Clt7reh80AkHHy0mNDY5RGIosBmJApTIXlRj8gPc1XhhkDo7lSuRg561NcW8qwOZQFXPyktmqEJdlhGpVudxPB9qgtFbaxx1NSLBtjRZWUru6Z70qxSfMkboec856VLWmgJkMxxeMyHCxkYyc8/wD66Lq9kuYlR2GM5IAooqxFm2kja1UyEZAwc1JHLCo+VwBnI5oorNlo/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573823528, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1834": { + "id": 1834, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "11942135091696674", + "emoji": "🙄", + "isAnimated": false, + "width": 320, + "height": 193, + "thumbnail": { + "width": 320, + "height": 193, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 16876, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573823557, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1835": { + "id": 1835, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFRtUCpYMCTc3QVEDkcGgSDbUSTasjRW6k8jA7gp4NRSFUjUck1P5kL42jnHNSO8TIAPvd6FCwnK5SJwKKlkYAEYoqybkDoBxG5YeuMUiKzA87QO9K8hKjmodxGRk4PalcCR/kAIcmm/aCRyM/jTQcqV/EVIsKnrRzWBRvsOR3k4Ubsdfb8aKCHRcKciii9x8rRBG4MeD1puRn3oooEWoo4li3sSz56UyUgNgH6r6UUUtyouw3zSoxmiiilYpt3P/Z", + "width": 1280, + "height": 1280 + }, + "sizes": [ + { + "width": 320, + "height": 320, + "type": "m" + }, + { + "width": 800, + "height": 800, + "type": "x" + }, + { + "width": 1280, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1573823621, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1836": { + "id": 1836, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "чо за флешмоб" + } + }, + "date": 1573826066, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1837": { + "id": 1837, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Эээээ!! Как всегда все пропускаю интересное" + } + }, + "date": 1573827110, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1838": { + "id": 1838, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Шо такое" + } + }, + "date": 1573827112, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1839": { + "id": 1839, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кто там хотел кьянти? я в симпле, брать тут?" + } + }, + "date": 1573827869, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1840": { + "id": 1840, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "тик ток" + } + }, + "date": 1573827987, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1841": { + "id": 1841, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ток" + } + }, + "date": 1573828127, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1842": { + "id": 1842, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "все в холодосе" + } + }, + "date": 1573829572, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1843": { + "id": 1843, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBUICYBzz6Yp0asSdwwRUb3Aj/5Z5x9P8Kmjn8yFpChXNSU2ROMMSUH5ml2BuNg9e9LOFZSvzbj3A6frTI2UNt3Hgc7lP8AQ0CFaJZOrY/CpxsEQQEHBqGJ0dckjmph5ZPDr+dAyCRJXd3jcDP5io4oJ3kdmXbnngg1cCDsaeq7aBGdiW3T9y5Ck9Dg1C085OSwP/ARRRSTKaAXDLwY4z9QaeLzH/LP8nIoop7k7H//2Q==", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1573829581, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1844": { + "id": 1844, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ждёт своего часа" + } + }, + "date": 1573829582, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1845": { + "id": 1845, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1112358875685716113", + "emoji": "😁", + "isAnimated": false, + "width": 512, + "height": 184 + }, + "document": { + "size": 12066, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573830080, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1846": { + "id": 1846, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребят, не на улице так тепло" + } + }, + "date": 1573848634, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1847": { + "id": 1847, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "747903279685435596", + "emoji": "😂", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 26030, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1573848634, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1848": { + "id": 1848, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "из метро выбегал одинокий молодой человек с криками «сука, чё так холодно!»" + } + }, + "date": 1573851975, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1849": { + "id": 1849, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "в Испашке тоже необычный для этого времени холод пришёл" + } + }, + "date": 1573887760, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "1850": { + "id": 1850, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "+18?" + } + }, + "date": 1573889977, + "senderUserId": 2676926, + "replyToMessageId": 1849 + }, + "1851": { + "id": 1851, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Сейчас 8 утром, ночью 4 по прогнозу" + } + }, + "date": 1573890257, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "1852": { + "id": 1852, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Но дело не в градусах, по прогнозу непонятно, что сильный ветер холодный и влажный, охлаждает как будто снег в лицо" + } + }, + "date": 1573890981, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "1853": { + "id": 1853, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всем привет. Доделал немного концептов. Посмотреть и залайкать можно тут ;)" + } + }, + "date": 1574269837, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1854": { + "id": 1854, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://www.behance.net/gallery/88411489/Sci-Fi-concepts", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 56 + } + ] + } + }, + "date": 1574269839, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1855": { + "id": 1855, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ничеси у тебя там киберпанк" + } + }, + "date": 1574269907, + "senderUserId": 860139781, + "replyToMessageId": 1854 + }, + "1856": { + "id": 1856, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Панкуем" + } + }, + "date": 1574270412, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1857": { + "id": 1857, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "доброе утро!" + } + }, + "date": 1574322910, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1858": { + "id": 1858, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Сбербанк отправил клиенту сообщение с паролем «Плачь, убивай евреев», который нужно было сообщить при получении кредита в офисе.\n\nНа встречный вопрос компания сначала заявила, что SMS «отфотошопили», а потом извинилась и переложила ответственность за ошибку на генератор кодов.\n\nhttps://tjournal.ru/127204", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 279, + "length": 26 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTdyrbQue9N80twU4/H/CknAMn4UwEKQaALCcDGMfjmpMVDG+/tgVNQAmKKWigCtNjf1x/n60zIHGfwz/9enyuN/BoV1OMbifrQARMA20YJPvVmowcnoakoAKKKKAIJGAfGwH86EkHQpj8DRRQA9WBPA/SpKKKACiiigD/2Q==", + "width": 640, + "height": 771 + }, + "sizes": [ + { + "width": 266, + "height": 320, + "type": "m" + }, + { + "width": 640, + "height": 771, + "type": "x" + } + ] + } + }, + "date": 1574322910, + "senderUserId": 177121435, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "1859": { + "id": 1859, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "782981450117939469", + "emoji": "😬", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 22354, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574323051, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1860": { + "id": 1860, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "272479773299573703", + "emoji": "😆", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 26548, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574323086, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1861": { + "id": 1861, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это серьёзно такая проблема, за которую банку нужно извиняться?😨" + } + }, + "date": 1574323797, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1862": { + "id": 1862, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "извинити, мы не призываем убивать евреев" + } + }, + "date": 1574323829, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1863": { + "id": 1863, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это же нормальная история, когда на капче что-то читается" + } + }, + "date": 1574323863, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1864": { + "id": 1864, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мдааа" + } + }, + "date": 1574323906, + "senderUserId": 4274761, + "replyToMessageId": null + }, + "1865": { + "id": 1865, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У нас такой прикол был, когда по случаю редизайна Ростелекома нагенерировали промокодов, а один был RTK.OLOPIDOR\nЖаль, что его вовремя заметили" + } + }, + "date": 1574323937, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1866": { + "id": 1866, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "олло" + } + }, + "date": 1574323959, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1867": { + "id": 1867, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А кто-нибудь из присутствующих делал такие скрипты? Реально их пропускают через регулярки, чтобы отсеять оскорбительные слова?🤔" + } + }, + "date": 1574324033, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1868": { + "id": 1868, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Сразу вспоминаю историю, как в эппл поступили жалобы, что их шаффл недостаточно рандомно перемешивает песни." + } + }, + "date": 1574324076, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1869": { + "id": 1869, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "911454474675945689", + "emoji": "😁", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 37612, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574324081, + "senderUserId": 860139781, + "replyToMessageId": 1865 + }, + "1870": { + "id": 1870, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я однажды в Я.Такси отправил какой-то смешной код, сгенерированный по правилам. Но доманаться до него могли только те, кто правда бы начал на компоненты раскладывать" + } + }, + "date": 1574324614, + "senderUserId": 2317363, + "replyToMessageId": 1858 + }, + "1871": { + "id": 1871, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "«Сбербанк» подтвердил, что отправлял клиенту пароль для кредита «плачь и убивай евреев» и пообещал пересмотреть процесс формирования кодов. Об этом изданию «Подъём» сообщили в пресс-службе банка. \n\n«Данный код представляет собой набор случайных символов. Мы используем сгенерированные коды в регулярных рассылках персональных предложений по потребительским кредитам для максимально быстрой консультации клиентов. В год мы формируем около 13 млрд паролей, механизм генерации такого большого количества уникальных сочетаний символов осуществляется системой автоматически и не предполагает участие сотрудника. Мы приносим свои извинения и в ближайшее время пересмотрим процесс формирования кода участника».\n\nРанее клиент «Сбербанка» Александр Шишов сообщил «Подъёму», что получил смс от банка с предложением по кредиту. В сообщении был указан код «CRYVKILLJEWS». Шишов подчеркнул, что с этого номера ранее получал и другие сообщения от банка, например, с кодом для онлайн-оплаты. \n\n@pdmnews", + "entities": [ + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 0, + "length": 140 + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 147, + "length": 17 + }, + { + "className": "MessageEntityItalic", + "classType": "constructor", + "offset": 198, + "length": 507 + }, + { + "className": "MessageEntityTextUrl", + "classType": "constructor", + "offset": 746, + "length": 7, + "url": "https://pdmnews.ru/7143/" + }, + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 754, + "length": 9 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 979, + "length": 8 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDUlbYcjvTWkKkY2jIzzRcHauajmfCpg4JFADw7Nx8pqVSQMHHHpVIbsghjn/PvU8TloySeQD2oAnByaKbGd2DRQAy4G4YqOZCUXGcgDtU0qM3cU14nbHK8DFAFbJL9P0/+tU8UbKjZPUcU5Y2zkv8AlT1XAIyaAEhUqME5op6jmigD/9k=", + "width": 1013, + "height": 768 + }, + "sizes": [ + { + "width": 320, + "height": 243, + "type": "m" + }, + { + "width": 800, + "height": 607, + "type": "x" + }, + { + "width": 1013, + "height": 768, + "type": "y" + } + ] + } + }, + "date": 1574326534, + "senderUserId": 54158593, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "1872": { + "id": 1872, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Рандом не знает жалости" + } + }, + "date": 1574326894, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "1873": { + "id": 1873, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Госдума запретила продажу смартфонов без российских приложений\n\nБудем надеяться, что это говно можно будет удалить после первой активации устройства" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC8Q2fvYH1/+ypdpJ5fb9WP/wAVWaxRi8TgnByDnpUU9kAAyli390/40kwsbHlkn/XD8z/jSqpQ5Eq498n+tc2cxEjawOMcip0HnryANowxpsEdEG4++tFZsSxeUmFbG0d6KAKzNiUE8gEj9astPlDH2xxn1qz9ngyfkPJ/vGneTDx8mcf7R/xqLMdzFcTtjKBvQ8EColkYKw47DFdCyROMMgPGOtRfY7R2y0Y9OGNWIpRyHyk57CitMWVuAAI+PqaKAF289qMUUUAL5ZoEZB6A0UUAS0UUUAf/2Q==", + "width": 769, + "height": 906 + }, + "sizes": [ + { + "width": 272, + "height": 320, + "type": "m" + }, + { + "width": 679, + "height": 800, + "type": "x" + }, + { + "width": 769, + "height": 906, + "type": "y" + } + ] + } + }, + "date": 1574335569, + "senderUserId": 54158593, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "1874": { + "id": 1874, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234095", + "emoji": "🤔", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 45470, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574335583, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1875": { + "id": 1875, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "366064958900804654", + "emoji": "🌈", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 7016, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574335618, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1876": { + "id": 1876, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "366064958900804629", + "emoji": "😎", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 13986, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574335621, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1877": { + "id": 1877, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну все, айфоны, пока" + } + }, + "date": 1574336541, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "1878": { + "id": 1878, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "пополнили список запрещенки вместе с телеграммом и пармезаном" + } + }, + "date": 1574336578, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1879": { + "id": 1879, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а как же наши дебилы в думе будут юзать свои айфончики? сами себе вставляют палки в колеса" + } + }, + "date": 1574336581, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1880": { + "id": 1880, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "так они только в россии запретили, сами могут и за бугром отовариваться:)" + } + }, + "date": 1574336634, + "senderUserId": 54158593, + "replyToMessageId": 1879 + }, + "1881": { + "id": 1881, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "разве уже приняли точно это? мне казалось, что еще нет. не думаю, что примут. но инициатива тупая в наивысшей степени." + } + }, + "date": 1574336644, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1882": { + "id": 1882, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "приняли уже ж" + } + }, + "date": 1574336668, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1883": { + "id": 1883, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну чо, пиздос" + } + }, + "date": 1574336828, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1884": { + "id": 1884, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Госдума приняла закон об обязательной предустановке российских приложений на смартфоны, ноутбуки и телевизоры с функцией Smart TV.\n\nЗакон должен вступить в силу 1 июля 2020 года. Список устройств и обязательных приложений определит правительство: vc.ru/legal/93732", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 247, + "length": 17 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCi0OA205zUiKWeMAZJQjipobZ5MFvlX9auxxpEMIPx7miwylbW5DDLDc3Yc/maS1yjSxngqavqAgwoA71E0Q87zh1PDe9DQIpEbbx07OKKddgo8UnocGipA0etOITjaSfrRRWghDgDNZ9zf790UQ4PBY0UUgIDl02sTt9KKKKkZ//Z", + "width": 2000, + "height": 1125 + }, + "sizes": [ + { + "width": 320, + "height": 180, + "type": "m" + }, + { + "width": 800, + "height": 450, + "type": "x" + }, + { + "width": 1280, + "height": 720, + "type": "y" + }, + { + "width": 2000, + "height": 1125, + "type": "w" + } + ] + } + }, + "date": 1574336915, + "senderUserId": 53759108, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "1885": { + "id": 1885, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Яндекс видать не хило бабла занес им, Яндекс фоны то толком не продавались" + } + }, + "date": 1574336926, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1886": { + "id": 1886, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "еще нет, с 1 июля" + } + }, + "date": 1574336934, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "1887": { + "id": 1887, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Еще успеем вальнуть отсюда 😂" + } + }, + "date": 1574336949, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1888": { + "id": 1888, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мдааааа" + } + }, + "date": 1574336957, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1889": { + "id": 1889, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну у нас есть пол года что бы обновить все свои гаджеты и жиь спокойно 2-3 года)" + } + }, + "date": 1574336995, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "1890": { + "id": 1890, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "как будто горбушку отменили" + } + }, + "date": 1574337065, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1891": { + "id": 1891, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://meduza.io/feature/2019/11/21/v-moskve-otkryli-moskovskie-tsentralnye-diametry-s-nerabotayuschimi-validatorami-korotkimi-poezdami-i-medlennym-ekspressom-v-aeroport", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 170 + } + ] + } + }, + "date": 1574338235, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1892": { + "id": 1892, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну как всегда" + } + }, + "date": 1574338298, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1893": { + "id": 1893, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "интересные новости" + } + }, + "date": 1574338309, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1894": { + "id": 1894, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "никогда такого не было" + } + }, + "date": 1574338369, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1895": { + "id": 1895, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну как всегда - интересные новости" + } + }, + "date": 1574338385, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1896": { + "id": 1896, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вот к чему это относилось)" + } + }, + "date": 1574338401, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1897": { + "id": 1897, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "О том, что «Тройку» надо обновить, мэрия начала активно предупреждать всего за день до запуска — но валидаторы все равно не заработали." + } + }, + "date": 1574338524, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1898": { + "id": 1898, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "обидно, когда прод упал" + } + }, + "date": 1574338576, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1899": { + "id": 1899, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "интересно получается, аэроэкспресс теперь едет со скоростью собаки?" + } + }, + "date": 1574338922, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1900": { + "id": 1900, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "но по цене аэроэкспресса, ну" + } + }, + "date": 1574339171, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "1901": { + "id": 1901, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребят, все тут готовы стать иностранными агентами?" + } + }, + "date": 1574340631, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1902": { + "id": 1902, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "канешн" + } + }, + "date": 1574340681, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1903": { + "id": 1903, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "272479773299573635", + "emoji": "😏", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 49180, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574340693, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1904": { + "id": 1904, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Гайз, а вам обязательно постить новости из России?" + } + }, + "date": 1574341956, + "senderUserId": 2317363, + "replyToMessageId": 1884 + }, + "1905": { + "id": 1905, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не я начал =_=" + } + }, + "date": 1574341984, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "1906": { + "id": 1906, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я вот тоже сейчас ленту полистала, и захотелось хороших новостей" + } + }, + "date": 1574341985, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1907": { + "id": 1907, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "может, где-то панда родила, я не знаю" + } + }, + "date": 1574341996, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1908": { + "id": 1908, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну мы тут живем как бы" + } + }, + "date": 1574342006, + "senderUserId": 860139781, + "replyToMessageId": 1904 + }, + "1909": { + "id": 1909, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "что такого?)" + } + }, + "date": 1574342009, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1910": { + "id": 1910, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не в России, я вас уверяю =)" + } + }, + "date": 1574342010, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1911": { + "id": 1911, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, это же Москоу офис" + } + }, + "date": 1574342021, + "senderUserId": 54158593, + "replyToMessageId": 1904 + }, + "1912": { + "id": 1912, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ты хотел сказать “я вас умоляю“?" + } + }, + "date": 1574342043, + "senderUserId": 332648262, + "replyToMessageId": 1910 + }, + "1913": { + "id": 1913, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Новости из России != хорошие новости?" + } + }, + "date": 1574342044, + "senderUserId": 54158593, + "replyToMessageId": 1906 + }, + "1914": { + "id": 1914, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDLVGdggq/Y7o7oxt3HB9arJhM7SatWrfOGY8DPJ+lK5VhZZ5Le+zuYrnOM8YrVEiyRhwcqRnNZWoKCiSDAxwc07TrrH7h2BB+7QSXX60UnbFFIoxV37cEH8qlTOQMEVcidGUHsD/dHSnkLz7dPkFJtD0InQtalVPJGetUQHByJV4/261RtY4BwMkY2CmGKIZyi8gYwg60KS7khFN5kYORnvg0UKqLnGB9EFFHMu4z/2Q==", + "width": 960, + "height": 729 + }, + "sizes": [ + { + "width": 320, + "height": 243, + "type": "m" + }, + { + "width": 800, + "height": 607, + "type": "x" + }, + { + "width": 960, + "height": 729, + "type": "y" + } + ] + } + }, + "date": 1574342057, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1915": { + "id": 1915, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вооо, крутая новость" + } + }, + "date": 1574342081, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1916": { + "id": 1916, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вань, и ты уже не в России живёшь?" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAANACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDQid2Zw6FcHAOetS8/5aoLbcTKGbOHwKsYIOQf0oAQ4A4J/M0byO1KS3PP6UoJ9aAGliRRSs3y0UxH/9k=", + "width": 771, + "height": 255 + }, + "sizes": [ + { + "width": 320, + "height": 106, + "type": "m" + }, + { + "width": 771, + "height": 255, + "type": "x" + } + ] + } + }, + "date": 1574342117, + "senderUserId": 54158593, + "replyToMessageId": 1910 + }, + "1917": { + "id": 1917, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Москва - не Россия" + } + }, + "date": 1574342131, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1918": { + "id": 1918, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так тут все новости из Москвы" + } + }, + "date": 1574342147, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1919": { + "id": 1919, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Госдума же все законы принимает" + } + }, + "date": 1574342155, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1920": { + "id": 1920, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну и мцд" + } + }, + "date": 1574342171, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1921": { + "id": 1921, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я жила в России (Брянск) 26 лет) Я могу постить?" + } + }, + "date": 1574342174, + "senderUserId": 860139781, + "replyToMessageId": 1910 + }, + "1922": { + "id": 1922, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Москва не Россия - это да)" + } + }, + "date": 1574342192, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1923": { + "id": 1923, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я не тебе отвечал, а Лизе, которая писала про то что возможно Панда где-то родила :)" + } + }, + "date": 1574342221, + "senderUserId": 2317363, + "replyToMessageId": 1916 + }, + "1924": { + "id": 1924, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Окец" + } + }, + "date": 1574342231, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1925": { + "id": 1925, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHII6girqlXj+WzQDPBLVppeQzsYJVUsD0IyDURW3jmzcHk8hR2FAFIxk8/ZY8ez0EbSV+xKd3TBJrYDWn2Uyqo8sd8VUtriJpHeH5MDkHpigDLezuI4jI8RVR1Joqze6gZozCudvcnvRQMgsdj3KpISM9GHUGtO8tVe6ViDtIx2rEVirAg4IrRjvpJU2EA8c570gCa7ETGGIDyV4Kn+L1qezij+eUKPLZcAZ/SqgSGMZON3vzipZHk8nYvyKf7vQ0wM5/vt9aKm8jdkYwfWikBFDGZZAoIHue1atnZwqoclmYjgjtRRTAb5AhABZSepY8VK5hKHEi89QXG00UUCKbDy5CAcr+dFFFIZ//2Q==", + "width": 600, + "height": 600 + }, + "sizes": [ + { + "width": 320, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 600, + "type": "x" + } + ] + } + }, + "date": 1574342248, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1926": { + "id": 1926, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ихиххии" + } + }, + "date": 1574342253, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1927": { + "id": 1927, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Чо хотите делайте, если вас это веселит. При чём тут чат таблицы вообще не понятно" + } + }, + "date": 1574342260, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1928": { + "id": 1928, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вас поняли" + } + }, + "date": 1574342280, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1929": { + "id": 1929, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "no more" + } + }, + "date": 1574342284, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1930": { + "id": 1930, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А это и не я писала, а Яна" + } + }, + "date": 1574342286, + "senderUserId": 54158593, + "replyToMessageId": 1923 + }, + "1931": { + "id": 1931, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "❤️" + } + }, + "date": 1574342308, + "senderUserId": 2317363, + "replyToMessageId": 1930 + }, + "1932": { + "id": 1932, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это не чат таблицы🌝" + } + }, + "date": 1574342313, + "senderUserId": 54158593, + "replyToMessageId": 1927 + }, + "1933": { + "id": 1933, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "272479773299573625", + "emoji": "🤷‍♀️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 30082, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342325, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1934": { + "id": 1934, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 4, + "width": 640, + "height": 576, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuYvNYKeCR+tJEGGUIwc457VFOxWRQD07ip7NpZZcNls9zU2OhztIWH/WuvY80jpIG2rvZT261ZEaI77xg7ecGmJN5YDclRxx60LcU7Si2jOmBEuCMECinzN507uvT8qKoxH3a8LJjr6U2K7liACOQB2qWOQOjI3U8CqskbRNhvzpI1qLW6LcM5ldgxyXBp8RBiZcZI6DOKr2aM1wmBxWhewiN/NVRsbrjsaTCDXwsrLOkURGzbuyCPQ0VDOQTuABHfiimmRKNnYiU1Zi/eIUbkGiikbLYWA+W3y1pxHcpDcgjpRRTMGZ7RIs7IBwKKKKk36H/2Q==", + "width": 320, + "height": 288 + } + }, + "document": { + "size": 377983, + "mimeType": "video/mp4", + "fileName": "IMG_6746.MP4" + } + }, + "date": 1574342326, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1935": { + "id": 1935, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "40599651539223277", + "emoji": "🐵", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRj4PAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSPwCAAABr6CgjSTlGJ79q0UREZGwdrGJE7WsX+va8C3bdt3Wtm0VoKND6iSug7X8/6/6SlZUVzyNl4j+J+5Pfk7sXPmVsW/k9xWxrfCHJOwZJn8f2HLyRv7Fhpm3cmK/wYcXdmt8Gtgs8nFir3TxuWCrRoVkbJSoKnAWsVKo6vBU5sV3ilAXqgSOGn/OA8pCXYabgzc9QDWoO+El8FZahGJQN+Cl8UnGGY6A20HdhJNM3cStUJnhQ6jEbaWywsVJbcJdoTbBw0FtxV2h9oCHg1rBXaG2w0EQqhNuMtUZf9+pz7jJVBf8/UX1xF2mWhL+OlL/wl2mXl7440J1x23mSoRuyBs2k8qKh8wFCVCcvPgpCRHLhdqCh8yVA4+p8qbVgKUg1BY8RC69cJ8ovJeEzyof0J1UFzwNLmXcnnyMIYbKj46PceBxUl3wNLg0cdv4WPLs/Bz4aAGP1Bc8pc6lFPEjxI9ARee3vAJbuVpCxK9jUt/xGLh0tXLgS7h0ffBXxVc8B1cGnrna8ZGEZi8k4SqeBxcrPk7aXRQu4/nNRamNvjKehXtB0bkXFAf3giJyL2gmt4Lmza2gidwKqoMbCVSBG1XouI8k6C5uc0I5uMuAtnITCdBGblKhF24hAfrCLU4sBOEGE0uVG7ywlOm/Y3HSfcJipfeK1UznF5YLnb+wHIWuCwz+o+f/wYSe/4HJIXRbYVToNsDoTbewmnQbYBPpN8Gm022GzZt+T9gIHWdYHPTcYDHp+YTFoOcOg3jRs8AghUnPMJn0HGAh9HudCRYX/b5hk+gXVoVeL5gJvcKMbgOs6PYNK7otsKLXEmFFpw12QpeSYEefHYb0OWA46HLCcNAnDIU+A+wuumww7HR5wLDQ4wXLQo8dlgc9FlgGeiwwFfqTDLv4UemwwC7IRYcNhm+6hGEQehQYVrqUALtBlz3C7qLHBsNIlwWGgS4HLOlywJI+E+wSXc4Au0yXBwwLXQbYhUmXBXadTmEVBr1GGDW6PWGT6DfCJhS/Cf/XAFZQOCAcDAAAEDgAnQEqgACAAD5JHoxEIqGhmbt+jCgEhKAM1GClu+kH7XzruU/FTpdy6QpuAfM15qHpa3pD0AOldyHPwB/QO0n/N+CvlEh9YX+wnUd71/5HnV4CzBmIPcpf6z12/3PmLRm/8D1b/9L7gPgb9T/933Bv5Z/Qf+N/bPZA9jP7gewX+vofUcVMbhl7JYDcr9G8MTSyqnJF332T1T6ndfHx7cpPvBqJjPGpKqTHChu9jGnhMU297aZbUrzd6hrIze28r6fw5Xj9fqLjQrsWB/ccE1esAM5Z+u8RXR7qpu/8DjgbNbpFpF6QPmLMWiYTsgRRNWVcqpMQXgrhZ3V/3GXkQDruEjhNtvivEY3g4odTYRaVk4xCoZViibzYqtOqqkWG32xAQuIj+MzwXRCuhN7EvkP1uGhYC/B+S/AMjLltMERRzb2S9LeXr4OlZNq15sB7/q6YDwk1Djw8Z8z3ptlCsfvH3ZuYgWRqKDjG30fDwnsqO/Wxl3g+cSjSL1JaJJw/s7xaLP6dpMStRiayGbRFnsHAb7bMppEmvMu6LMlYN3EOtEuube+45Y6uvIQbM38qQgKqaTDxGq+S9pvyTfG/6MSW9puEp2xwgAD+8LS3Anf9Dfw1OACU14y/vqckX6LkJx1Gn03BrP20dxzeywenSaSDYERIEe0JQgCL8yDoDQRH9zf+9FlqOplPHhecPllczqTNuE0CTuB3hKNsY26U8sAZeTlz9s6trhY9Km65/PGCyRmkByAEmAI1X3+XxxRcZOWHbqKpAA32/ozcLV+GR/yd1y025X34/tv2XpkS+Trv0fq3iwRg57SegAwtT/PxPt31pfxHZvynv4bSZkQ2t7N73or130+V+OjZ9jqToYO+fGFVA42sFW9Red+MNZX3T//n/OHkoyVuMuAQfSRO3aXg7HYtmOwc02uKE+hZhdM7xHzYieKJKSAehva4tHdbIl6ABICtFlI3y67HQTIkGJBXljR85QAp/OkJVIPoMD7h7ArzycD0zaGT8R66um/a7fqqfziUKPlVTAbg/59bTqzCQt0zzR8WlmmQinRQxNDNVpmwripCD4+5c+jX0eStcsrL/tCPHvvsrDkV8tnJL5+zgvfJxFjgIrgu1C97L4iOQoc1/AhnMsWAWqHhNNOgde8GX1aQQs38thvf2vS/yKer45mZiKtOOu11Rf2VVv+Q/uztDUzYTj/DXkrbAqMZOw1MJwGs8yS5Z4i3g7wvgt7pgYYaNVj32GkW7bdMYTC6193Qi9ksj45rsdMNG57AYZiAuJaf0jlGJv9yPXJ0eiKUSoTL0NtICC6vBI1mejioQgZJT/mCNQl5QHdhUjPskToRt4zoo/MuEx4xaRFa7ulqrBsQh45Eea/V2MxvBEmBMMZenYLqS25spB/K/AAZEmI+FCkccCbVE+mnbpsEdRwL/Melwt2eS4lDrcWlSfYzcZNZavskuwAxgPt9WFARiCu3dMFjPe9005ymPu565js1yp4z7q9efK8focY/2jyaEgaZzDbx6QIOOltaUjvLzGxS8OahSqJDIlGfnkpoGKsyVeWtcXf24A1n1xJnvBEGjK2T/PsdUD/cFCbvRUdP3/9dVc2+pQ8gJZ1xth4sp8Q9bk2QqGOMDGFbImbgdMmtfXkW0o1E0FENWpQkwLXNdjUkelZt4IRD3+0wS2vhEFskiKT12XWV41qIXHR3f/nIdGUy8CIq3pv9xFfr9v/jcP4dJxAwJNaHkSRADpfQsPXMmhCeXFw8ZXVR3mT1ycZWGoSbBeG4/ZCnU/Uw1FIEzovVo+D3+XgfA6tYcQdaEQo4n8cJUHAp9/kdE6L4A0+ihXene8n4iltRNYj9dZXgQwRVBrDka1ydqnWNPkPzcxjd1TEO3ZJ4UqwN1FtRhUM1duwwDjQKm0yJzn+K4Yv5InJoBLA774PZX33GoBp93DD5r7etlF7gYPJI0WoBPGZRnNRtUihHW1yT+Fdc9YfbNKsDks/GKuJafBztVY9ECNmKz36TkePGVNd4cB884oYCDByZseib8DHjOHLSHXEgoEiV4S49iVNXi0jN1dSkcSLJuzfyHnwFBt8oEBslX+nF/+n0HywsTtrjTmEpnjzzcDM0K/ReD6Swk6gjGSmO9dF3JvLr0czhTzqy70X5lbw021n0wlY/YicG8omZ5vHzfMKusuZ3uPSDCEIhz6eLvrwj4N38avf2+qLaBOPeQezqY4PPi/XjdnqEN/OcO57P7SPBveOwfReLcfYoFR0/A2Q5YDeRnBMGe/k/1iwpt9wTWhLvIShV6K5ai/S+MmGTP51WjdiT3zzYQt6Ui75upLQc03qrub1lQ5txuayT0yh0MnSMnSlqc6spQenCoffjguyRzIP9pOwMhRHAReD6H4xFgfwLuB/YqZEKzpbgQhrSqTFCRdp8S9ZB2xNo9KEfB+Dr57wjMRJT9lllgLI1p3EaZlMw86g+6Zm+EfV4CYZGKzqTeCmUTqg0Tc9zENtBRGQb3WVIn5JQ1TN/bmHQyYt9/MoLJ172w7lPAaghpugT7S72r1AsMyUGMfEzr5BscQqlmj7+MTBtSKwssZVlrCCJekAs7/0V1JZpieE4NCse/8+GJPjG5nWepTBRoZNedmYN8WXwpl1K+rQ0IM7Ucs2Lc7GBMBTBwe10plV/xe1yfFynzj7NdQH7qUO5H7s6/N8KPgdIKNrcPo/1aVL4OM29yF7VJsfU4SKYVm5Ya4LJRzCqUHzafUhHBD6AYKgx6KhumnZZ3RKGtNWWggpXf3i8M/IlxEPMQb+s0jbD8Xt05iqdVSC/fktnVwWpKrYnYEoLdTErxIfhkKmLv4DZz1CoXlIMLA2O/Zis0j0g/Otb1jGgOUpII2Qj0kw8omLks4F/QGXntH5hHjn5oMkll0cUNXjkbE8nI26hPf5JF9bXIA5KMSnC3sG8bbrAu3/NXWHMMAKyhTjxo6G9msgf4tvIFLxzs4kV9HS9ltbNmIBR9uku7rydqyOSgOXVqOrapCSdynjTW8+CO610V0ptWufXwOirIeiecrvb2Hs3QVKKmtC21lmEYlu/grGBw0o/QrWwf/c/LOL4HH6F0FVnW4Ht8EzhY5pVZytsYHPiT9/BYLZvaa2vsWMCed+3TK1/pzCaPIFgPOcsNjXjzWVhDCqX8tHHQYCDdIzwEewTu0bfXYK+JFCe/8fAa8IfGGHG5vvw+sUxbsCdycC2YpUkvY2grDReblBGXf8/TsPlZWnPiM5eBb7vR3/syl0GVQ6YAMQZzPs1SGl+/kZAYq8aAjFIoGNcCc8agyC9sKn8zXv4e/d1END8SK8JiBwREdP7/3/zJ0JqU9juol/YQNi5xOnp20Ja6r4WgnpEtmERlk+jpCpDnLGfxi1bdkn/w8hcY0f/4pIjuilBeCQV9/yv9qZEUUn/w2FQrqo4B9knTmRURO9A1/H8qJdu8zf8XTq3OqXZgwW0SBPhWjmSRuxXknEFRe5wM9q4ItdEKj3uJEmBAznuWaNNnRiN/KYaa8G1DWeafm8YJ7vxg76sZJAUw6E0juib+39Vit/RA+n485inBwVLjT9loVJenODzjIFv2VvvnkcMdhwXQEW9hzkZkYGrLT0lXG0oCuBpC4KEAtpGQlcf0id+E+vjxG5w01NdEOgXh1XqK+GMbL4Xv0KOzrca54ULszzVbpKojpCAdSMC85U0Sx/cH667Ayg3O12ph+KapOtnH/5FM1gZcXIqbT0J235c8Y1b+iOnFWmuWNyPOfDf//FpRwiP84b+xQLqs/qTsb/wvnH9S2V8NUZ5yDGoE4EZSkhzHxqO+7Nh+iHTKZ+Pld8AyxQwlN1Lr00VIBAiTW3pjKAJ1FaI6G0XdsBtHeT7U03Fn1+puOZ6PzgA3Isyib6+r0jrOxiNcJ0j7nTDOkRJsxXJ6NvCiXl3y8OHfjhDupomwkJAIGvu2bophh2AKm7IIDRpRjH652p/Gg8yEKruCECjdYr715cvyOS63yVnkzCIKd1WoakssY/MbOTZRMp9kNGPBFJadQRwEHUf8PwS3+tJCFTn1BnBAGgz3P3Ju0Q+6QT9zp5q4EqYlPUWZiNeJBRl4BeEP9NCsvK/3RgFoCDXIEmd5WOtv+YY3UPYbLLLgAAAAA==" + } + }, + "document": { + "size": 17342, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342329, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1936": { + "id": 1936, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я вообще-то" + } + }, + "date": 1574342372, + "senderUserId": 177121435, + "replyToMessageId": 1930 + }, + "1937": { + "id": 1937, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я тоже Лиза" + } + }, + "date": 1574342374, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1938": { + "id": 1938, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ахахах" + } + }, + "date": 1574342379, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1939": { + "id": 1939, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 320, + "height": 210, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 37141, + "mimeType": "video/mp4", + "fileName": "_eJwFwTkOwyAQAMC_0IflMJd_gKz06Sy.mp4" + } + }, + "date": 1574342379, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1940": { + "id": 1940, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "868996962018394128", + "emoji": "😬", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 25256, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342388, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1941": { + "id": 1941, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я знаю" + } + }, + "date": 1574342395, + "senderUserId": 54158593, + "replyToMessageId": 1937 + }, + "1942": { + "id": 1942, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Но отвечал Ваня все-таки Яне" + } + }, + "date": 1574342406, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1943": { + "id": 1943, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "сложно" + } + }, + "date": 1574342410, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1944": { + "id": 1944, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1370278228815511561", + "emoji": "❤️", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 31426, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342443, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1945": { + "id": 1945, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1370278228815511554", + "emoji": "😘", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 21174, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342448, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1946": { + "id": 1946, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребят, там небо красивое!" + } + }, + "date": 1574342534, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1947": { + "id": 1947, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ваня даже не выдержал новостей одного сегодняшнего дня ..." + } + }, + "date": 1574342537, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1948": { + "id": 1948, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "достаточно хорошая новость, по-моему" + } + }, + "date": 1574342542, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1949": { + "id": 1949, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was removed from the chat" + } + }, + "date": 1574342553, + "senderUserId": 204715787, + "replyToMessageId": null + }, + "1950": { + "id": 1950, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCMqUPIwauxfPGDURmicbSRjNPinhjTbvHWpUiuUk2UbKPtMP8AfX86PtEP99fzp84uQaUopxni/vr+dFPmFymYuwdefrUbSiO53LggYqMHfnPSmsMk0DNMm2mHJX+RqnOsCn907E/pUJPHHXFMycdaLCJTkDrRUYJooA//2Q==", + "width": 1104, + "height": 828 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 600, + "type": "x" + }, + { + "width": 1104, + "height": 828, + "type": "y" + } + ] + } + }, + "date": 1574342562, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1951": { + "id": 1951, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Влад тоже не выдержал" + } + }, + "date": 1574342581, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1952": { + "id": 1952, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не дождался заката" + } + }, + "date": 1574342590, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1953": { + "id": 1953, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "868996962018394187", + "emoji": "😜", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 20460, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342614, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1954": { + "id": 1954, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Он дождался заката этого чата" + } + }, + "date": 1574342622, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1955": { + "id": 1955, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а мне нравится чат" + } + }, + "date": 1574342629, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1956": { + "id": 1956, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ушел в закат!" + } + }, + "date": 1574342630, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1957": { + "id": 1957, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "АХАХАХ" + } + }, + "date": 1574342631, + "senderUserId": 54158593, + "replyToMessageId": 1954 + }, + "1958": { + "id": 1958, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ахахах" + } + }, + "date": 1574342632, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1959": { + "id": 1959, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1685141920508018842", + "emoji": "😫", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 22082, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342645, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1960": { + "id": 1960, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1370278228815511576", + "emoji": "❓", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 17708, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342690, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1961": { + "id": 1961, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "топ чат" + } + }, + "date": 1574342706, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1962": { + "id": 1962, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1685141920508018879", + "emoji": "👺", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 18438, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574342709, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1963": { + "id": 1963, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCZLRHYKOAY1b9TUUUCbFZwxGfXjGant7lA0Zwf9SB+RoiINrGfr/M0AQXEa+WxUADIGB9aR4UIyADSzFChwfmDD+dSM8CHDNg/Q0rjsilAx/d/7hH60+3lkKhEGQuf50yJ3eO3CcEbuT35qIwkqzDkgn+dAEzpMozIeCw5qORzJIdjbgO5qEh8AEnGRwaGOcDnAoQE9qsmY8DIyRVyKImAtjA3HH50UVDZSILgcJ67qruoDYxg0UU0Jn//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1574343894, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1964": { + "id": 1964, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@denbl", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 6 + } + ] + } + }, + "date": 1574343896, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1965": { + "id": 1965, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ни кого... переживаю" + } + }, + "date": 1574343906, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "1966": { + "id": 1966, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB8IzECak2VWN5sGBHge9SC4k2g+SSPao5maJIl20bKrtfbfvRkfWk+3jH3KOZ9h2RZKUVWN+P7tFO7JsijM+XyM1PDdskagjOO+aqldxzmlAwMUCTLUt2WBUAD681W3AA85NNK96aaEDY4GimqcUUxH//Z", + "width": 1280, + "height": 960 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 600, + "type": "x" + }, + { + "width": 1280, + "height": 960, + "type": "y" + } + ] + } + }, + "date": 1574343946, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "1967": { + "id": 1967, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "красотааа" + } + }, + "date": 1574343958, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1968": { + "id": 1968, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://youtu.be/0tEv8OFHH8s", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 28 + } + ] + } + }, + "date": 1574422445, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1969": { + "id": 1969, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я что-то так орала, что не могу не поделиться" + } + }, + "date": 1574422460, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1970": { + "id": 1970, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "aw! saw british! Ни слова не понял сначала :)" + } + }, + "date": 1574423349, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1971": { + "id": 1971, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "wot iz u" + } + }, + "date": 1574423391, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1972": { + "id": 1972, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "но с my mum don’t fall over я просто визжала" + } + }, + "date": 1574423410, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1973": { + "id": 1973, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, чувак классно отыгрывает. Я бы посмотрел полный стендап с ним :)" + } + }, + "date": 1574423635, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1974": { + "id": 1974, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ребятки. Си ю сам дей. Всех чмаки. Вы крутые!!!! Спасибо за все" + } + }, + "date": 1574442324, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1975": { + "id": 1975, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "document": { + "size": 9525248, + "mimeType": "audio/mpeg", + "fileName": "2517 - 03Комната (ЕЕВВ 2017).mp3" + } + }, + "date": 1574442452, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1976": { + "id": 1976, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@EVERYDAYHER0 планшет и стилус у тебя на столе ;) вспомни былое", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 13 + } + ] + } + }, + "date": 1574442581, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "1977": { + "id": 1977, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нашел" + } + }, + "date": 1574443571, + "senderUserId": 165916816, + "replyToMessageId": null + }, + "1978": { + "id": 1978, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "всем чудесных выходных!" + } + }, + "date": 1574455483, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1979": { + "id": 1979, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 480, + "height": 360, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFRxQ7bAPenKuMGllVWQjNMQgyUPyHPXimKVJxyPrUazuox1FSxKNuX5Lc0kMVlwKKVSCCvGR3opgJ1xQ5Cxsfao1OcU2duAPXmkBGvzMB61cC5Gcge1U9pRgc1Y8zCj5VOfUZoEOdTG/Uc+lFNd9xBwBx2FFMZ//Z", + "width": 320, + "height": 240 + } + }, + "document": { + "size": 91487, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1574455490, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1980": { + "id": 1980, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1360886329340072505", + "emoji": "👋", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRmgLAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSLIEAAABoATJtmnbmvfcZ9u2bX/btm3btm3btm3b1sN5vu9VjMbZOmuu3/q/ERETYP9HP/mAXbv9m7V7UlLdfv9eE3+iUqdEqskul16wef2qrLIQJIGOjNLYXyTpp3WrsN4SUCUsnxGhAWUSdW6DQkodVr1RoGT4pX10Su8ISQK9OzBL7ZBtzrjxifd/Wy4BSkdP1MRmE6FEYOE1s0pmTcduf9ErCyWJZGVGB8fmVVIkkJjzmySRrAJhQbe4dBLKSEZVEd0Rl12yVaKqoxWj8jC5AoRP6kek6WIUPto+IhvIBe9H5GwXQjPj8YyX+zK0GdfA12x8QJ+UbRfqm16eegm5RIcn1J4j0KtXnNnezQYBAWTh2YSzhEDS7ElejgsGkLKIpc3MrLdAAtC8VZxcGo6UR2ub2aFCiUjLd/FxB1UCirvQzF4iDaRJgbWY2c7MnkZ5SU4TJCVm4luzNYQywmlBzXoeLZtl9nEBqkxBEoCKRGMnzSXH+QG1ulYCfVFTu6Q6VEqCYh4rgzJph2Ba7va7QKCNJqsAkEACEBLFCZQVvVAK5cDFEkiCL28tQAIkCUlJoGJAGUGvtrZQfxOgSqRC0gEEAhUJoEx6oqkF+zsolepIIlFFAigreqaBhfsWyoCgKsUDKCv82sEC3h/SBHIBoKywfIaF3KEMaQLwoWy60MLeEiBFAOEJZYZ57QOztX4UpAggvJzoKAu+6eXKIABXsKBFeGa3iDQBuNLV5rGPIE3uxrmwx5RFruAr87luNtfoPCe1P0AsVnJiRykOUG7gpWMdREF3m9vbFYnt/awci45+an8Df/CWOb5AMdCJnibGYZIn+xr8/V1ydbLcwS3mekgEtI0v+xDcDXF2lvx1cbZmBMY7axGBXZzZPHdc7e1L8CXe9fam3P3j7SN/auLsuwgMcPYX/sY5W4zcTfZVqwjM8NUiBjN9tY/BCF/dY9DNV/8YNPU1LAJ/me9xEXjF2TR3cL2zlfzpAGdrRmC0s9X9zSk5W9nfA+Z8ljd0gLfp/kZ7m+xudsnbeGdwtXkf7U0ruBvu7eeSu5m+0Fnm/ghvo9ytWOcKPjXnjU5bhi8d5Ktmrc+EKyi39NRix08ECE8635y2HLnu0S8uEyB5gqW9QiuN3fPUG57+rCxJAKoE3OgiC3vWnbMlka5U5AUWdAxq7XclKpXbkY6zkM8SoGLdwJcNQ9pNoKK9gFaygOv/DoqNbrKQxwlVERcwu0NQK0QHtIsF3RkoDORCL9SEZXcICgGQB1jY1wJv/Y6APABS+a55HrSfBd/o5LmiMolK6YeLVm1g/4SHXiqFZ9bi8F8liWRpydOHj7DKpcHBov7ms2b4/g+8/0udZn/9xvX7z2xsqd+GpwPNd8ny3i3CgndKzvLvWBTJRWiSRbZpGQoAtPSXOkEuuNqie4bygX49f0qN1W5RBzlgdrv4tJkHOWDJCY0s8WLl0u4W4d0EWYC3+lvq0DzwdilG9qggDfRAE8v4FGQAFg62KLd6WUAFoHNKlrXHP0ASSDtZpJvcJpGo8iaWc/CnEonS3E0t3jOeqpOkv05sb7lrVtztgN1OeWWJfrmyj0W9+Urrb9ivxqpY3/5rCVZQOCCQBgAAsCQAnQEqgACAAD5RJI9Fo6IhEYqt7DgFBLSACvIv5R+F/ff/UvyN6vvvl7GZwb6m/ZvyS/K3nT9O3qBfjH8Y/vP9F/Y3+oftjx7YAPzv+Uf5f80v65zk96r+X/6T8wve//D+DR9M/0/sAfyn+xf8r7o/pX/gP9r/k/yw9nf5n/eP+j/mPgH/kf9C/1n9w/eX4gPXl+vfsY/raXVSPwriWqjsNlb06iXcJOLd4eII9YTdn49TXDCkSKh3pONNoPHG6B+7Iivf2ijow9yzlgYOlSpNGsrTkg8Y9YP7rohMQUv/IJ0I4bGZHHkybnoiP2/fm5aIq/KSftrEI4s0LUZAzinLzFbgZsQPAH5Jc0VmwU/IPr3Lbs5h4o3s+r1QvYgyYjUdsTh+9s+f43ctqAAA/v4G0Wt2IM86wMFhzj6+iyQAK+ASb7fuWrCPggb1qP7Z3Pfm5e20b7H5l8hFAJVzTAVRgAExQA3Uc91v8EDS6A8npr3VEgPG/O8tvGEhOKN+tP3BrCmedb3p14SntTbmAe9kJj//zzFS/HXlw7pSFQMmIn0LAdPP7K+gptbpL37kU+Pubo+CeMWMh6KEmwrxgC8GYusx/4ORDtEmmEr53tegh2fBTpGDk/hjUQw/bSVuL6s6Tm5owGJzzn39c373AR7xKnAI0iRxoHIcJ0cZzDFe0byLhQc2fVKLmleUtXmXZCSvjG7G77+OKcwTahkRrmyje2M6ihqpp0y3PgH6zIvHNXdPWekbYH2cOtEA9Es/Px+6o+mYvHjJbV2FqoS5GTwHv39YDYBugxVO31IriF4JcHtOergN1XAf0usqgAP0wyRZg7PTRCeziHDqAVFmvCVAuRSMPjKwKY/W475ZAPVxLJFI+nADzhp3zShOkjeCF31RzDWBrU+L5gutQP6Zi3MjMP736g7Uy8tNlf8Tuqx8QjLWNT6kaUm0V8TgwzTrtd4DEBy/sDwHCpQ/f6emoCvC8DER4lK3G2X/NTyU452BJ8075pTEbzel5Pvpsf1q15vdGUJ/Kdz5jPE5+DzR5kG0VZQJ9a3Gat6q8yvJG0qC25ALt8HlnxDqY9g5IterAagQSeY3jiA0HLh3HEiq/frWXYtJReLoeV+2vryAely5WVcTLEt0EQdIebGAjOlZz+kk+nv7W4TZ1F9c4PiZz7/9rAaQG/JctdITR7EW406+ZQNoP228NFPSz+iAVirIjB/WDf1dxRtG6UbuJTNjlu+VnTHXh/o076aCyhdi6M9kp+JWx3zLc6RNMZHt6I2tajy6Rdxlf94akcug8NE6tKcxEkB8NRf0+WxqUbKvy7JpvMXpRiFYcwo8IZjE2RpATshIYQC29Zspf9+c5l1FrxAK+er33MFQj3x8sk7VBbXjk3l3X86C1CL+0TrPofuGAnbhFh3Q60ND//QVLCRpMNbAAg0tsGbmj+G0z0qdgFTOqNhztuzcxuVxAhJ8iQhyCcmc3d3AhN8UrV+toZHB9viVsgWTjaaWgOOM8MpyjpWbg20JQtF3JuKQiZ0t1nNHhxMqT8zGwWd/wUGC+acy4F0olYuwtDp9EJNjkjttGW/D5jVUfwFJoMmwguJIAzn9upUogNB0+t0NSZRr6neSy1Azch8/bvBTrDqP6QDNSztf7w41/wM0IpKQd1Io+diCx1uIr2xocMlwmm0jxaWe/PR6/Ht7PF+VPbX7uJQr3cne6dThIeGLU5+7jFz0x/3tTBryIdcn9APX1Haohhnjqj7ggIVIHz0TdNAB8BSvEpxdzkP+2rCATGMuNUK3d/LXl/ZMiGybxCX/mI7MgogYB7iYiEUs7EaFmpfpzrfIXp6D7zE0PJ1hfL8ytx3Qt5fDBtfSF8g10rNxcBEcfYgEedUwsJWY4QdYp3Q/p/Gc0PY3vKC2njTEJLE9xhS2QJohf7lGuD3jU1wY80CVpv24fVyR7yZPWRyJdvZcRozvZsIRRO4vnRJMkeoLw9n2mvYLtK6iQ/LE8VlVqpPaJVJlg0hwTQpkmGcHQKDgIS/Hf3ZyZkFfjCvmFqnhlnAs2MONZ9ZNE9fYz7plfW+umMv4LLZ3zujp2J/7H/9rQNeTnojKUFKTJV+wl5Esl1MdfonGHDNpemZz65gkCBdFqcVwu0OkdROGtD3PG3RzkH/7QVDMX/JiEpFTHDOFOWkSj+z3/c2YK0EA/6qqt36qAQyo/BwAcE9t4B+5CKeVvxRUppixD5JKFM1vpCs2uE1wkOAA" + } + }, + "document": { + "size": 13178, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1574455758, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1981": { + "id": 1981, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1269403972611866824", + "emoji": "😉", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 13460, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1574461332, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "1982": { + "id": 1982, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребят, там очень красивое небо" + } + }, + "date": 1574688308, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1983": { + "id": 1983, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 7, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjy4U8kHPapo54wgBYZxWY0mT7U9XJGKFdFOzNRWDAnPeiqCzFBgZPuaKrmYuVFQ5Iz71JjYMls/SnypEhXGSA/PPUZpr4dsRjqeBUgAO45oqI9fSimIfI27rTM9DRRSGITk0UUUCP/9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 1132990, + "mimeType": "video/mp4", + "fileName": "IMG_6606.MP4" + } + }, + "date": 1574688398, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1984": { + "id": 1984, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCrRRSgE5x2qrhYCoIwRxVaW3K8pyPSrYpcVLZXKZlFXLmFAhfof50UCaaDeg/iFKJkzjdVXdk9BQR3oC5fDJ/fH50ryIiEhgT6ZqipG3kUhPNTYrnJpbguhTaAD3oqGinYlts//9k=", + "width": 1276, + "height": 956 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 599, + "type": "x" + }, + { + "width": 1276, + "height": 956, + "type": "y" + } + ] + } + }, + "date": 1574688412, + "senderUserId": 177121435, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": 177121435, + "origin": { + "senderUserId": 177121435 + } + } + }, + "1985": { + "id": 1985, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBRS1GsiscAgml3qDgsB9TT5h8pIKeBUYdOzL+dSrz/ABA/jUuRaiKMCinqvvRUcxVjHCKe/P1oaIYJBqNQMA96Ypyy5qzIeVI/umkAJOCMCns4XjmozIT7UwHl3CY3tj0zRURJPfiigR//2Q==", + "width": 1280, + "height": 960 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 600, + "type": "x" + }, + { + "width": 1280, + "height": 960, + "type": "y" + } + ] + } + }, + "date": 1574688426, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1986": { + "id": 1986, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "произошёл лимонный тарт" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDXV1b7rA/SlzWaHOMYxSlpcYVsUAaWarXb4KD61S82YZGWqC4mfjlvxoAcZOgV+vr2oeRlGFcmpIraNjnHA6571Y2RqOFFRKaTKUSpG42Dcear3Lb34PArSKRt1UVXnt0bBFJTT0BxIY7wLznHqDU4vIj1yKKKcoq4k2KbuEdDn8KqTXu84XgD0oopRirjcmf/2Q==", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1574754511, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1987": { + "id": 1987, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "311503369409659028", + "emoji": "❤️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 27436, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574754702, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1988": { + "id": 1988, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1269403972611866823", + "emoji": "😘", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 10364, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1574754715, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1989": { + "id": 1989, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Тарт огонь 🔥" + } + }, + "date": 1574757510, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "1990": { + "id": 1990, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 7, + "width": 640, + "height": 480, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 1915973, + "mimeType": "video/mp4", + "fileName": "DASH_2_4_M.mp4" + } + }, + "date": 1574757518, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1991": { + "id": 1991, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "399338500039639313", + "emoji": "👍", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 7084, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574757526, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "1992": { + "id": 1992, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "399338500039639317", + "emoji": "💁", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 10676, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574758487, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1993": { + "id": 1993, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@lizazhdan", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 10 + } + ] + } + }, + "date": 1574758496, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "1994": { + "id": 1994, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 5, + "width": 640, + "height": 640, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvlin+NCQPOQoQdcBh2pDC4UDdz3wK27SIQ26r3xk0ALchls5AnJCEVzi7FXJY7vQV0yyBjgZNY+qWuyYNFHw3oKAKG8sMHkUUiKS4XBBoouBeacYGDwOtWINRjCBGcr9azAMr71A1AHRwXEbZ8uQNU7Ksow4BrmrWbyZlbsDzXSRuHjVx0IzSegyrdQQwQs4HOOAe1FUdUufMk2L0HpRTAqIRkemKjkwTRRQIWBPMmROxNdHkRRccKB0ooqWNGDO6PdM54BPaiiiqEf/Z", + "width": 320, + "height": 320 + } + }, + "document": { + "size": 521525, + "mimeType": "video/mp4", + "fileName": "50842765_343692752901993_1160566442930294085_n.mp4" + } + }, + "date": 1574758554, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "1995": { + "id": 1995, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нашёл тут более дешевый аналог Apple Watch, но непонятно насколько качество ок. Кто-нибудь что-то слышал про этот бренд?" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDVZ8SAZ4xnFZhv5pnbyWKcEgFR2/8ArVpsMyYyeR6VipE1pM3ntwqtjjrkYpiRqWFw1xb7nxuBwcUUmmxlLbLZy53YopDLDZzwSPwpQTwCCfemuMtnjOPSgFjwGH5UrhYkooopgIVyc5P50bR6n86KKAFooooA/9k=", + "width": 292, + "height": 545 + }, + "sizes": [ + { + "width": 171, + "height": 320, + "type": "m" + }, + { + "width": 292, + "height": 545, + "type": "x" + } + ] + } + }, + "date": 1574760409, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "1996": { + "id": 1996, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Отличный бренд! Полностью оправдывает своё название! Берите, не пожалеете!" + } + }, + "date": 1574760757, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "1997": { + "id": 1997, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Только свистни, он появится! @dzhariani", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 29, + "length": 10 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB4tkxygpRbqFzzn6moklmLlBJhgehUVIrzh8Oy49aLhYdGyLNtDsOO+ahvDh+GLduTmrMeCzEPvI4OO1ULpiZCe1ADIbhxcbyN2TyPWrkjGOyLyAeb0BrPiYxyZBYDuAakuJ3l2gZVfTNIYyG5lSXj5gTyCM5qSdvmHHr/ADqsqMr5yKklPI+gpiNL7PFnll/MUG1hx95f0/xoopAR/ZItpJYZ/wA+9UZSokYZ4ziiigZ//9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1574765050, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "1998": { + "id": 1998, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "наверное я слоупок" + } + }, + "date": 1574765082, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "1999": { + "id": 1999, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://vc.ru/finance/94434-finteh-startap-osome-soosnovatelya-roketbanka-viktora-lysenko-privlek-3-mln", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 103 + } + ] + } + }, + "date": 1574765082, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2000": { + "id": 2000, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "911454474675945663", + "emoji": "🎉", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 22842, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1574765122, + "senderUserId": 327556368, + "replyToMessageId": 1998 + }, + "2001": { + "id": 2001, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вряд ли, новость только вышла сегодня" + } + }, + "date": 1574768588, + "senderUserId": 146686085, + "replyToMessageId": 1999 + }, + "2002": { + "id": 2002, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "там первый же коммент — ну такое..." + } + }, + "date": 1574768790, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2003": { + "id": 2003, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это же виси, там всегда в комментах можно даже панамку не протягивать, хуёв гарантированно напихают" + } + }, + "date": 1574768842, + "senderUserId": 146686085, + "replyToMessageId": 2002 + }, + "2004": { + "id": 2004, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В целом, годный срач только увеличивает просмотры" + } + }, + "date": 1574768857, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2005": { + "id": 2005, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "он не первый раз реально пишет, мы ему правда не помогли? или просто по инерции написали \"ой, сорри, что не ответили\" в прошлый раз?" + } + }, + "date": 1574769147, + "senderUserId": 40907434, + "replyToMessageId": null + }, + "2006": { + "id": 2006, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "если человеку реально не помогли, было бы классно исправить это и подарить ему бесплатное обслуживание" + } + }, + "date": 1574769398, + "senderUserId": 143235707, + "replyToMessageId": null + }, + "2007": { + "id": 2007, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@shmtvn говорит, что кидала его агентам в прошлый раз, надо бы посмотреть, что там случилось", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 7 + } + ] + } + }, + "date": 1574769438, + "senderUserId": 146686085, + "replyToMessageId": 2005 + }, + "2008": { + "id": 2008, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вот да, я поэтому и сказала, что такое себе" + } + }, + "date": 1574769494, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2009": { + "id": 2009, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "надо глянуть" + } + }, + "date": 1574769503, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2010": { + "id": 2010, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://mobile.twitter.com/SumLare/status/1196906838404599808?s=20", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 66 + } + ] + } + }, + "date": 1574774357, + "senderUserId": 3412850, + "replyToMessageId": 1999 + }, + "2011": { + "id": 2011, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "cc @AntonyHatchet ^", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 3, + "length": 14 + } + ] + } + }, + "date": 1574774371, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2012": { + "id": 2012, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я приставала к агентам с этим чуваком, насколько я помню" + } + }, + "date": 1574775805, + "senderUserId": 141185012, + "replyToMessageId": 2005 + }, + "2013": { + "id": 2013, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Какой у него email?" + } + }, + "date": 1574780215, + "senderUserId": 40907434, + "replyToMessageId": null + }, + "2014": { + "id": 2014, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Осом с лета не видел такой тусни в 11 утра" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBeGdcetSsAFz0qvt2Sjc+D1zip5CqxMHXDYJHoaAI1KuMijbU9oii1yQMHk07yVcBkbAI/z1pWGZ8shViXGWxx7UsUzmLDnMfcU75JDtdtzn9abLtjQgJjgimIc8ioP3EjbX4IPUU97gGBEXIK9apxh2+4Mkc1NNL5uCUw3cjjNIZXkBFxsQcelXEBYfvevQH/ABoooEKGED4KY9aglcySFsdaKKBn/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575014157, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2015": { + "id": 2015, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кальян что ли сейчас вынесут?" + } + }, + "date": 1575014436, + "senderUserId": 54158593, + "replyToMessageId": 2014 + }, + "2016": { + "id": 2016, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребят, я знаю, немного странно, но у меня есть кусок теста для печенек, потому что уже некуда его девать. Если кому надо дома наделать печенюх, заберите" + } + }, + "date": 1575018965, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2017": { + "id": 2017, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "продано" + } + }, + "date": 1575019005, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2018": { + "id": 2018, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "потрачено" + } + }, + "date": 1575019114, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2019": { + "id": 2019, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Пропечено" + } + }, + "date": 1575019786, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2020": { + "id": 2020, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не прожрато" + } + }, + "date": 1575019802, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2021": { + "id": 2021, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "476885410174206223", + "emoji": "🍷", + "isAnimated": false, + "width": 512, + "height": 384 + }, + "document": { + "size": 13868, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575019822, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2022": { + "id": 2022, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "476885410174206242", + "emoji": "😂", + "isAnimated": false, + "width": 128, + "height": 96, + "thumbnail": { + "width": 128, + "height": 96, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 23454, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575019830, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2023": { + "id": 2023, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я совершенно случайно оказался в магазине, надо кому что под/для глинтвейна?🤔" + } + }, + "date": 1575041397, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2024": { + "id": 2024, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Сыр камамбер можна пожалуйста" + } + }, + "date": 1575041429, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2025": { + "id": 2025, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И помидорчики Черри" + } + }, + "date": 1575041436, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2026": { + "id": 2026, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Спасибо не случайно" + } + }, + "date": 1575041447, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2027": { + "id": 2027, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "368147511233217103", + "emoji": "🎁", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 26090, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575041449, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2028": { + "id": 2028, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Принято" + } + }, + "date": 1575041491, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2029": { + "id": 2029, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ожидайте" + } + }, + "date": 1575041501, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2030": { + "id": 2030, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@MayneX а ты где? Вы случайно телефон не потеряли?)", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 7 + } + ] + } + }, + "date": 1575053322, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2031": { + "id": 2031, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну Таня точно потеряла" + } + }, + "date": 1575053537, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2032": { + "id": 2032, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@kiririn проверьте пож че там делает посудомойка на кофейной кухне \nИ не расплавила ли она то что я туда засунула", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 8 + } + ] + } + }, + "date": 1575053591, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2033": { + "id": 2033, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1192705477432049733", + "emoji": "🙏", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 4687, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575053607, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2034": { + "id": 2034, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А что/кого ты туда засунула?" + } + }, + "date": 1575053756, + "senderUserId": 53759108, + "replyToMessageId": 2032 + }, + "2035": { + "id": 2035, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "😱😱😱" + } + }, + "date": 1575053762, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2036": { + "id": 2036, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "186649756741665195", + "emoji": "🤡", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 7333, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575053771, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2037": { + "id": 2037, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "476885410174206236", + "emoji": "😡", + "isAnimated": false, + "width": 512, + "height": 397 + }, + "document": { + "size": 30600, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575053797, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2039": { + "id": 2039, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я ЗАБЫЛА ВИНО" + } + }, + "date": 1575054572, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2040": { + "id": 2040, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "в пакете инвизибл два красных\nпоставьте там у меня где-то" + } + }, + "date": 1575054598, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2041": { + "id": 2041, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я заеду заберу потом" + } + }, + "date": 1575054608, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2042": { + "id": 2042, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "дайте знать, что все ок...." + } + }, + "date": 1575054688, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2043": { + "id": 2043, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 16, + "width": 480, + "height": 480, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCO6u5o7gjbgY6GpomLxr6YpUXzUAkQEdiajNzHbHygM470FEySeUrBhgY61XW5gIWMOcA8nGM1K4F2ox9zPzYqEWsUcu7O9R2NMDSCAqCv50VReZkkBjf5T1XOcUUAOM6I/lkgehqrcozSZKZ9/WptQjy4kVeo5xVdLt4xt4I96TKLluytGFUY9RTpYEIzjn61TN4/O3A+gpnnyN1Y5oEOfKnB5xRQoz8xDYP5UUAaKvTJLeCX7yDPqOKKKYyB9OHHlvx6NTBZyg8gEexoooEWU3gBCm0epFFFFAH/2Q==", + "width": 320, + "height": 320 + } + }, + "document": { + "size": 1502333, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1575054760, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2044": { + "id": 2044, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://music.apple.com/ru/album/glaubeliebetod/268837275", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 57 + } + ] + } + }, + "date": 1575054857, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2045": { + "id": 2045, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "буду думать, что это ок" + } + }, + "date": 1575054936, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2046": { + "id": 2046, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "640414812500656491", + "emoji": "🎄", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 33164, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575054940, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2047": { + "id": 2047, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "спасибо, блин, большое" + } + }, + "date": 1575066161, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2048": { + "id": 2048, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was removed from the chat" + } + }, + "date": 1575066168, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2049": { + "id": 2049, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was removed from the chat" + } + }, + "date": 1575076431, + "senderUserId": 241647476, + "replyToMessageId": null + }, + "2050": { + "id": 2050, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "F" + } + }, + "date": 1575094747, + "senderUserId": 356765513, + "replyToMessageId": 2048 + }, + "2051": { + "id": 2051, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ребятки, а дайте кто-нибудь промокод в Invisible" + } + }, + "date": 1575094766, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2052": { + "id": 2052, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ща найду" + } + }, + "date": 1575096662, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2053": { + "id": 2053, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "NDZHA" + } + }, + "date": 1575096823, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2054": { + "id": 2054, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Спасибо!" + } + }, + "date": 1575098516, + "senderUserId": 356765513, + "replyToMessageId": 2053 + }, + "2055": { + "id": 2055, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хэй! Есть извращенцы?)" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB4uEA2yNgH2phdU5LcHpUDR5UnjBPSniE7QpIIHTNTdFJNk25c85/ChZISOGOB1quS7TGPjbyP0pVh2g5wQeuKLoLMtCWJ04Jx0oqAYAJ+baO5xRTWonoIsU6xBWjBx3z70pWXgmPkH1pE1Eg4EXX/AGv/AK1NbVMN/qf/AB//AOtRZBdgIpxOZNmRknH4U8CbHEJ6561E2qFjnysf8C/+tQdV+QKYTx/tUWQXZJLHMyFVhCk96KQaqCuDEf8AvqiiyC7P/9k=", + "width": 1280, + "height": 960 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 600, + "type": "x" + }, + { + "width": 1280, + "height": 960, + "type": "y" + } + ] + } + }, + "date": 1575104829, + "senderUserId": 4274761, + "replyToMessageId": null + }, + "2056": { + "id": 2056, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Или может кому ещё чего привезти? @AntonyHatchet что там за вафли?", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 34, + "length": 14 + } + ] + } + }, + "date": 1575104842, + "senderUserId": 4274761, + "replyToMessageId": null + }, + "2057": { + "id": 2057, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кто-то сказал вафли? Какие вафли?" + } + }, + "date": 1575104953, + "senderUserId": 860139781, + "replyToMessageId": 2056 + }, + "2058": { + "id": 2058, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот я не знаю. Но как минимум есть Manner. А Антон какие-то круглые хотел" + } + }, + "date": 1575105020, + "senderUserId": 4274761, + "replyToMessageId": 2057 + }, + "2059": { + "id": 2059, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну так и быть, привези пожалуйста вафли какие-нибудь😳" + } + }, + "date": 1575105088, + "senderUserId": 860139781, + "replyToMessageId": 2058 + }, + "2060": { + "id": 2060, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вафли? Не помню ничего про вафли )" + } + }, + "date": 1575105983, + "senderUserId": 105945096, + "replyToMessageId": 2056 + }, + "2061": { + "id": 2061, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ттцсс, ты что, вафли не хочешь? 😀" + } + }, + "date": 1575106014, + "senderUserId": 860139781, + "replyToMessageId": 2060 + }, + "2062": { + "id": 2062, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ты был пьян и громок) ну и ладно)" + } + }, + "date": 1575106053, + "senderUserId": 4274761, + "replyToMessageId": 2060 + }, + "2063": { + "id": 2063, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это могло быть, но про вафли не помню ))" + } + }, + "date": 1575106105, + "senderUserId": 105945096, + "replyToMessageId": 2062 + }, + "2064": { + "id": 2064, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ты в Чехии? Вафли мне!" + } + }, + "date": 1575106816, + "senderUserId": 3412850, + "replyToMessageId": 2056 + }, + "2065": { + "id": 2065, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нугу захвати" + } + }, + "date": 1575108914, + "senderUserId": 194771934, + "replyToMessageId": 2056 + }, + "2066": { + "id": 2066, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А это не Лёша был?)))" + } + }, + "date": 1575109024, + "senderUserId": 141185012, + "replyToMessageId": 2062 + }, + "2067": { + "id": 2067, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "1. Ведутся переговоры по возвращению Лизы в чат 😱\n2. Я вчера уходила, там шапочка лежала и в ней ещё много было бумажек, многие не вытянули? 🤔" + } + }, + "date": 1575110322, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2068": { + "id": 2068, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И немного футаджа ещё есть" + } + }, + "date": 1575110381, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2069": { + "id": 2069, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB8c0UhLLGAw5HOangjSQbiTuJ6ZrKhYrICp6AmpYpyGJJJA5IHc1Nir6FecK07np8xooeUPy0eG9QcZoqiRgZhkKOcVGGYHOamYcFlwSRgqaiEbMQuAKQyQFnGQM+tFSRqEG3rRQASo0cmyXr2f+99aABuwRgiiigBSOaKKKAP/9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 508326, + "mimeType": "video/mp4", + "fileName": "IMG_1968.MOV" + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2070": { + "id": 2070, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCDzk3feq417EbUIJPm9MGqiafcSDPlKoPqcUyS0eKRUcxqzdBupDJY5FLj5qt3lzH8gVxgDtWcIHx8oXj3qcQwMo895GIHAXAAoAtQXEYYrG/y54GazLu5M1yzcBc8cU6FH8xWkOO+SajuArSOy49sUAT2rq77TwGPX3q61kR0NZdujhsjg9jVxY7t/mVs/Ug/zpDKHmue+PpQCcUUUyRy5qRXdDlSQfrRRQM//9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2071": { + "id": 2071, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCFpk3feq6t7F9kK+Z83pg1SisJ5QGEShT0yetNlsnhKiRolJOPvGkMkWRS+d1XLm5QJGFcYx1rO+zMc4MeR7mplhh2ASs7kdg2AKAJ7e4hR9kb8YHX171T1C5MlyQMbRgdOaYiMZAX6Z7nOKLrY8uQc4FHUQ62lG8BsYOATWi1onGHH51jwxtvByB71bCTHkTHPThxx+dIopb36ZOKUFiKKKZI5c5pxyKKKBn/2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2072": { + "id": 2072, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwAklkSchgGweuaYZiZdxCqM5welacbjGRVS6eGTzPkYyqMA1IynOcylsAA8jHSrkEi/ZMMwGG7n2qr9meeIEEAjjDGqrwSRkgg5BxwM0AzTM/l4XBJNRNPld2OT1OKAS2XC8r3PaomQyMGGOnNCY7DxOS6DtnHFM1IlXXBIzzS25gUb872B49KrXU5lk6Dj2piNeQKLYqo+tUY1y4ySaKKyuaDzZNtJiYA+9VHtJ4z80bc9xzRRTUmJxR//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2073": { + "id": 2073, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBZpkWY4dTz2OakmvIZLdV35cdsGs6WIxTeWdufxx+tTQ2bNMsbOqsy7hxkVIx0cyb+tX/tHmgNHGSMd6oy2sUcm0z5cdhHgVbhuPIjCAKccdKBmVNJJ56kscgCpLWZlug2c9uvaomKkkkZPrSDAOQ36UxFm4lP2gk4B44rR8q37hj9AayAvmTKeoJ5q69rJER5bEBhnBIyKRW5RKc8CjZ7UUUEgMqwxxV+VYA3zSMpoooYI//Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2074": { + "id": 2074, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB0ziOY8gYPrT7m6heBB5gLdxWc8flyBGUbjwBn/CpY7N2mETMiORkA81Ix8Uqh+tXjP52GjRiMd+KoS2kcb7WnXf8A3QlW47jyIwoC8cZxRYdzOvJfMulfHQDjFIlw6zhg2NvAx6U1tjEnv2poAByGHFMRauJWNwztgEgcVfENvgbt2cdMGsnHmTKTyOKutbSQkFGOGGcHqKRW5SKc8Ck2e1FFBIZKnitCRYVwWlK8etFFDBH/2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2075": { + "id": 2075, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBLOcKCAAx9KmImkGUTH61VRoo5/wBwJEdeu4g1M19OMgsRj2FSMY9tdN1B/QUi6e5+8QD+dOjuyZN0jHAFaG6gDGcbLx2JxyaYJ2UYPPOc1ZJtpH3sxBPamulmqsGDFhnHNA1oRSShtoQAcc1bt7zdhHHQdfWszG0D3qVD8vXFMRJbEK9NdxJNsIGM44FFFICV7YPQLcAd/wA6KKLjsf/Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2076": { + "id": 2076, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 6, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBl3dRyylk3EfSo4bmNHBOeParkenwFTl5SR23D/CqDfZyzCOOUbT3Yc0hmp5cs5LglVPIGMUVV+1usa7HYD3NFLQeo43QMUjxkjrg1m52ndvB+lTudiKM9evvUCIGfDZxnqKYI0bdo3Qboiw7FRRVZLSZifLXkepANFIb3KoFPRyp49RRRTJLTMTOytJgYyDmiiikM/9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 948092, + "mimeType": "video/mp4", + "fileName": "IMG_1957.MOV" + } + }, + "date": 1575110384, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2077": { + "id": 2077, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я тоже скину футадж попозже" + } + }, + "date": 1575110395, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2078": { + "id": 2078, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Какие все сладкие" + } + }, + "date": 1575110817, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2079": { + "id": 2079, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3323402743993723", + "emoji": "❤️", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRqwVAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSMUIAAABsEVb2zFJ0pddZtu2bdvW2LZt27Zt27ZVZkZkZmREojIj8b5nPRf/9/3xI/JqbiJiAsL/t57xodcdtKAdO4JvXVO1fa/eq4+8fQamnlW133UaHz2kL1z4ogcc/mOAf1ZtA7KhV+yWa/mdb/zCr/75y6+8+9FnL63QdW0mRwVorGr3bSEm/3NK6pofDnaIzw4NbvjITasq8hMkgWoQrto8jhh+w+LMPt9podzQafzjRSdU4RcZSahduTBw+zcGW8yOXxTCPYPzEnmVZb65/RPXLS3r4R0i0mj1QggDD//CDzfZ6x/RQqCcAOZI0Gn88tH7lxI+0CFCsxYXNZkda7QdUK9gZsrSbfzv9WeWEB7Umibz/Vqc2AQmDFB+wMExUBYb2vCElYWF1a8ZHoXJR9QinPLsTz5/E0L5wV1gjjBDWaYaHz22qBAGrv1Wq7WiHiGEB7dFL46y4GQNJAkb+sjqomr+V4R6BDLCFMVA2ZmtJ/ahPQdFTzIcJPeYwECSaJ7Rf+6aEMqPAzjZHFlJYvPKvvNcesDNDEeSTGkwMCTNvq7vfLgHmAfHPQMJEAiQ2NZ3vtqDOwIDJCmHJLKSBvftN5/uAZMkMI8QISMQSI2j+s37U7gjQNmYRFRppMHV/ebNCSLugCQn1jNifei3L005WXeyVtzM99/35hdcvKifPCOXuWTgQGFYFxgZ/M1dA+Utu/+HX39kFR7lQjigiIQ7eDHg8zgC62x5wtKS1v5jnLnR4ytw/66QJchkoSB34bgBtmv7DeW8aVpgjUXl3TohhCtLjqLn3ZAEbgJrfWX3MloIMXHf8q4czUAlMBMgyTAEczuuLm7VtDL8qbwrMjJwwEsyJAmQ5JjARh5ewOKHv/t5t+y352RselFpV7czEvPmGJSAIQEIJIEhbPRlPS351xhz7ckfSQLUOaO0azsJlC2BeUlCAgkk3BHW+Ugvz5iUJHxOEmjsttJuHE8oTlFuSggkkOSOYOLNPfyCTBy06yGl3W+mEhjKIZBAkrkJRh+Ub1Mvs08q7QlEUCmYkiBJSAJJhgkbPifX56yHqUeU9sqYKMgAHOXMIZBkLmE7Dspz7Bg5JI3dXdr7e6EXcJtDuUlJSHKT4Pd5wsUT5GpfXtqXU8TUi5BjuQQgIkgwL9G+b55wzvYpckzvUdpPEwIEvWGGeb4sIEkggQnbvjJPWP6OyVliDIfS/5ySAPXKLCoWRQSSOWLm3blCOOD9u8ZBkn2qvH/nKRBT0RATknxeYuj4fCGsuM+PpyZh/KLyNqgER8WbW0RIYMJ+0EsIYe1DvrThB6H8zSU4KhEghuQm0divt6puLc5RJYQEJuZeUZfNhTkq1RHEkNwk2zZQk3UICsBVMi48IiQw0bmxJt9Dgp4wlQjggCCG5CbsVzV5xqwkgFyYSnHhuMs9IiRADC6tx94NlIUUjsrFEQhSSD4vRi+vR3hxh4wAJOGmsnEQjkRESLiwt9QkvGGYrCSwOTNVkKxkWEog+1ddwmmf+/uI4YAZogoSDgg8guQmBlfWJYTwUcPdDUlQCUlgApMkJFx0rqrR103SvCtbGYELSCB4Uo1+ZiCrmnDHPYME8MEa/SVCjMpIBkgSkpvsVzX6b0ZORlVKI2FiY43+GDGLUQ9HgzX6vlnGI8oFFUECNZbX51NkgBgpwCuhxNr6vDki84jyOO5V2qc+z0qQIJW1ijhqHFyfe6aQJCCilNwFVMTVPLI+JzYjmveYkIS7g8m8GtRrUQMyBgkkdxyEsKo0VtUn/DfGvMcUk0ACKoEaocZvi8kgJiQDR0gOFRDaVqfLRmPMewpJODgIrAq2vk6LdkBGBjGBsuAgsCp8o07hTXMxDGKCjCQwAaX53ONqdVADMsI9oZRwwMtrn1Kr8LOEDBIiIVVkoF7XtCCCQUKkSs/wt1Dz/yXEPKSoCJFv1+2iYYgI94SgIsr8rm7hC3MJ4Z4QVIGIttVuj51GTLgnJCgJQNHGqrqFh7chYe4kBGWAcravql34URciAoeEgBKUl8/Wb8W/DCICg4QEFEQPO3arXdh/e0oAlpKAIkD5xx9Uv3DyEBAR4JCSAPIBqEc29oFw9TAQEchwUlnyq8Cxeyuz7+v+9u9XrygmnLLdICIQDrlKZ31Vjh2cg+6/VxQT9v9XV5ARknCMkiCl9h0V+T0Cpj5UUFj+3TZZkZFwnKqwbWUljhuRkKy9e0Eh3LZ9GgmlcRzKIKXuByvxqOkI3ecWFpa/edhQbnDcKEi5NHJ2SQOZ5xPjL8WFcMSbto1AjiwOTkHkYN2iEg7+VrvT+ulDFr8h1SkjhHDuR/6zY7DZGJ0DMpJsaktjDHpSLk2+srjV2+YkGGtOIAlQ69ByogOHXPaIt/9o/c5Gs9lsNLe8ctHymz+/o0MvcsvByDmFvW5aUaYz2dYFFci7ePXei0J04I6/DtHDPKTEllVF/YNYHFD7qkr1eOqXG3O5pLEcmvlKUS31IDR2S31C2PtjQ+SZ3jWZQ6MPKGg9PYDGaxXCib8bJcW6H3dz0Dy0mCdN5Mu2zq9XCLftmEuoud/fLSX+ulsh4fvdnkaOrFvY4/ttYu0r9t5MShOvLWbFf7v00F5ZuxAeM0yEl4YjB0kxcl4hYeXnx8jFztAPT9w0G3lfCGcPkxDrFhUSwgNaXfJ8pS+ENT/qIE0/NoRwa4uEJp9XUFjzxvYcie6j+0MIj23uml23JIQQ7h0hQXP/gkLY762jE2To7NMvwpo7Hr0yRG8YJib7RGEhLH3QX9tTwHdCP76kSUyDS4oLIez9yG8Oti8o47qPPHVNTcKx67qxoVNLKf3+LWZ+v6gmYdln2kSOqdMmYPz2uoRw1+Yx6P4i1PSQx96975KmgO/VJyy68VPfefKKmpzQnB0f+suEZGypUa0/hyS6EgwtTL/NxNsL02u6KUYXpuXrLPWvhSns+5cpYp9foMKiV44YkibvWqhCOORDw1MwtHrhCmHF4/49+s6wwC8J/2cKAFZQOCDADAAAEDkAnQEqgACAAD5RIo5FI6IhE0p2vDgFBLMbkB/5pQBggPwr0gD8AIDl/APwAuEj1gs/G/lV+R3zU2B+6/03zQd1HWHm48/f8v7qvg5/jvYl+fvYH/U/pR/tj6hP2+9WL/S+sP/E+ox/gOop9AzpZv3Q9HXNOP7J2e/2n8dOuc9ZSQ+7K/T/J/l7yO8AL8c/n/+Z/LfgbQBfnP9J/3/22c5P2K/1XuAfqT/uPKk8EX7T/ivYA/M//G/wHuw/zn/W/zX5ce2L6T/6PuDfyb+m/7b/A+0B6+v2k9jP9bm/PuUHTjsJaXr5DDDwZBb3TuYxZYOSb+OBJeWnQdtcheRBj7alLpyzq16oZUu6nhk6v7SO5ZqhuooILs4HTP5tENVQl8nDtLkPO5XWTciYbB3XlDL3CbeUKobtp2mFd8dsgBiLJWlyEXBiT5fnUeGI67aoUvW/U9zQM9h6IB6bkAeedk4Or2HSYQQVqs9FaJqG/Yecnj2GcHiLZ/Cf+m97Glhu2gLe9R0dXXi3hV2BGqogIu+cFdY7smbFOfSNxQtTW1Z3ePOdqUNS6HUf+4+nc/ZowzP8XR7VTKNzd+/P+dc97Vn560m9k1mYOD6A9QciUUzAAP7ueme3RC5UusssAr9ZbmDeJMURDOIonSJP4kgPqXL5TvTpX3EGYG/1QlcXxoULKKJezxrPekHhjqB7lf/06g6N8luqqHE/51X6Lm+OyDn3mVmbW/pEEMX90XPzuCOJKlKcf2sbpeDr52PgQuJO48fIgRFHVOYvRt2FhAhhhcwan/BRagh/8EZ94G0/xTdnkAIuGov4niXD6Xl3/877Lll3C8wN37qZyBY54BYuvvQj8CjrE7g7fYtwjVl8SuTzPB/96VWLjyKKN/8OUY+DmM+hzqVDsQh796dbivTZN+I7VBe/ideLXwMxkUuHkp0zarpOSTAkKeHyVA5ufh1r3bWwj/mX/kI2hEf5Q/ofVVKNfff7cOuDiyniNXBWv+A1tMWMyDex52QdXNolhwhL+COpgOt7RUEMdqqOKQe7fGXKLlPy+vlgOheotBc/X6S/o1vIk7gp+Fg1dP5Clx3k6HSMzbX5TRZn8o0VUhdxpa4q4pt71wmVszhdSqeGhroGPik/2E5yJERBH0/prJ9cvms7F5Bi7JqkBLVdRY15j7qf90pCcZrn45dJ/SwXZ9ql7z71RZLYE1huJnu+Ov5za6PK8iouSYswSVpz8xXRW4QzqtQj8GiM/IPPm3iLAWqU/zhRYw2H8+XUzU9rQ+mSZdy4+fPkQJVP3wuLCKyOjFLsmeYWRAPr+Pu0ugvZtKGxUNhsR9AFVPpRgFogiQ/R6ppyYYuwPb8OT/CIfu1HOwdaJ4paOA4B3jEHwSqVmvsDjVPkG530STB4pLI3a6v46X2ftF7p7eoU3aL8umpDvNQRXZjAHHrKCc1KVp0RWDXE2cP3jsHkgVZL/ZwtnVu5eTGp8y2DHkHcAPTmM+s3XuhQA/HpCwrxwu/ZvSvBeCck/8d7N6vlwLPgQEOO3X6xwWFQm7r9uEz/Kmht/HshfbpP2U5Did4+BOBjIuMQucUjoUM2ovI0yauHf/85R53xhZ4pEtP5DCn1DCk73Z3Ee+ffZW5J8IZ7s+fnQ7JX+osm4AiigPrT7fOxOg0Kc7Prvp0nuXDo1UbB7HvXkdF3Sm7fFsmSg1Ly4UckKA9qgmzyyoc391QaaXR/OJGnniAILiGiwsDyXn2bo/lG7Z5cioRJorANxrj2pr/KvhHsITfN7LhjU+mU/xTB1R9Zj/nrubybYSsUh7SxtbpEVusv4ZhXv3DATubafNJTLUBEyXlkCVTzl9eosZyOy9NyjD6GtDkY1OV0FE1ri0Itr1EzK6UQsoUejOJg5xXYZJuOm3lmYs+SdmGLqcj2jr1ud7uWU3bqDbeGjaYHVv1YS8lmfJwvwMW6XI9H5iLxRLVfmdJICIwAeKiGWL5z1bwLq8tq/W5yFlxx7mPvwn2ee9IrYEq36d6CrYZ1fKWLk7O6BralxbQjwJnU18z+V9/v1n0GinV+v/DGeC/oknZRx8i+TOLTfyhQ8EvdauoLt42QOjvpa7rRvp5DcjrkIY9kirFhi8PYxqfVQ8IGmuDjAeH4Pp9ucc/gaRvAmKj3ZuXPz3rbaZYAxghL6hYVzyF3Nt7kbikVJf4tvgFIFjaddLHzUnlVaaG4mokOl3EGo6DoU6D6/7grXPmruWHvFi1j6BBx/mCDZs1Nw2Y8JgXHeU1NcpLMG/YEP2X6Z529RXqOiM0oQyjWHKQcakKpTmdTR7DdVzfA8snC0qmD3R9Ong+51FTYr2hDMAB5Sjjb+merw2cEzaDSkZuUxk3mQJAgKGeXQDiZAZbtdePQH/ddX9nbGAKGYcDpRHC1OdgqLJqeI5J9/d/UArNlRaO+jd9IzG/NZ8drgR/4Qo1qy4z/JnM7k26cfHxguEjUnaLmqm7YP2Xw4skzClKDvy9snYwqZA5olMyLLgao4StMNyc8zyaM8/64TWIaA6cZKPcGgwrcEnNMEyvDu3sCr6vYsrdy+nmg5kzELsPzwtTIqoN5kwUnfz82oq+qJTxKsZr/lnwB05jSQMSuN4dg0w093zOtMFcK7Wd/8EKzfWvchFYfcqlfqyKfQ7j9NJjBiTJ4ZN95z8m0gkfxJuxKh23sFwHlcCV2R0sJr8KgdBzNw+MVBITuDq9rmGuQrcUEXUNJfwU+gMgy1c7zi4YZjAnElwCWDnw/xtmVn4AJYDrnipYbbsVB6FEdz1ffWqUEHkMlpHwYH1nK/KkADVpeMwjWnHPPZv5psaox5ATErXhS1yyuZOH/MvngW6tPhT05wnrLqqq0tftaaOrD9YauXhxc2QPV0nnMhs1kwA+vxzxWWKP7P4vQI+flqXe1pP09SZsVsJfJNjoVAdfzFmPVMOAtSSQbzOry0GLc9kVWjc0M/sIMsJVgEDI/5BI9OG9xeWw0hlFyoW2aJ1ztrDuEnct8Yr1D8xvpjXMnW7k/ZxuH04XanYRei8T+MW9XCOwDU6ScPRpSf4tkdqF3S/yYWW/TyybYE9AKIF//5PVgXO5+/jii59zf6sU323f7/K/3wxqtXvzQUL4Mk1aMn+SnYzLcztW5KrSWhyU3vJVl/kr/5MUo9oi7gEJmVYm2I5EF75+SPK5ExqqDV5eeNt8KuxGHHT9o+1UxqrEiw8Jf9J9fc8vDDoS9435CK+AVH0ldwXXaeI4OlenKnIFq4L4i3n4ROOBPMAKb84+g7miQNF4KYFGoOGw0UtRqlTr3n15+ipRZHxpp4kupdfZ5iyWhewvElskECLvFnZmMTuPx8CSAHYPKEzsmNnjuDOkDJa5hu6clfAfbZZ6rvobF0Z7qTka7eefrMn0XdZ2YEYwyN0U7HwBGehRc84GjmyjnzvJfyc3XaPJFZ/mQIYOsjg8YyBrnK34o0MpCk+TIRmQPf5mRRhCPXpWpK7wgTkSDyPdi3T4vp0+WIRqKdLqi3G+MZYIUJu1ReAc2ls5nHKqJJhCfjY7T8LEC/2/xeOgfJXzVi0IMi/ksZg3QTIqJshSxDaHjcL1ZDCC0GsydlbnNU67tsr1N7QlkwKT0PNZqH0+sHCAPjCxzy9EW/W0sDz8OuldHpfZQ02Z6fmf3D52uBfv/Fz4e+jHkKPk8HBk1FV/48ELrBJjVikd/3Lh1b7znz6UpRBzhvEQLCSk1cqOqm6lkiGCyhymqmEWVd4SbW1Nv40A6Ib+8xKML/QNdhrXokVF26ZDbD/9qqILs07NwAPPC87P6bxYl2ZL8JrO39tzCinLMiqkxcaoa/CAqPBu5Np6zA50r6FY2vkkaAvMWsNpL4Zf4bnJL5DYRyfTa/IQJqh/3u9Otwm3cjylmW1UCn23Tx3lXqy/RE1tyCFJyNy0pH3ySPvZbr9uinPf+Lch0pdrzhcx/xJJMNQK8IRH/drxW+yRI7VI/RECRSi2QjFyqGH69CKr2sJ2pv/Ms2bc6FyAOq74S90/4p+TbEqWQCHahTxvSYn4G3Fg1HUaKBXCUBgyoaS1bgnCGq5U6YarXDsPHhviqWsldJ1/4eTj6DEM+Dwnpo1gtOYtC7FXVxOK7mTe3SM/axYIw1sdAijhBN6XMg4nPyypddwDnQCh/ZxEfR2jy67paW5Wv/x5nSo/L+zCPdtrO3q/GvZ0EJYUiBXQ4D7PGy8DFbzcyqjqALRfzlgpDUMvcObrrxQB7Cjqr0fLTpXxXjJQmywEHW3+xjo0d9cbTlDDkaILkRGhx+dKtky9CWajoe25Isb93hzngrhIzNrHhmuXS247qweJfeS5oQDD05NpOwh5/4qv25evQAAAAAAAA" + } + }, + "document": { + "size": 31522, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575110831, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2080": { + "id": 2080, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Германия) покажи, какие, а то я каких-то не тех взял, кажется" + } + }, + "date": 1575110853, + "senderUserId": 4274761, + "replyToMessageId": 2064 + }, + "2081": { + "id": 2081, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBxtcDLFQB70zykJwjKx9jmnHLbjMxZOflHsab5pSNFVNgbOCT3pK7G7Id9kY9qKkt5JHgVmDEnvRStILoum3jww2n5uuO9Ne1jKfc3t2zVRftLq48x1fPBPGOakX7YVXqeB3A7VWwtyzHEAg3KFPpnpRTYjceWPMX5ue4ooAz/ALfcdjz9B/hQb6fcN+duOg4zRRR0ETjUzgZiz+NFFFAz/9k=", + "width": 591, + "height": 1280 + }, + "sizes": [ + { + "width": 148, + "height": 320, + "type": "m" + }, + { + "width": 369, + "height": 800, + "type": "x" + }, + { + "width": 591, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575110933, + "senderUserId": 3412850, + "replyToMessageId": 2080 + }, + "2082": { + "id": 2082, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Если попадутся, бери пару пачек любых кроме тех что самые простые без начинок" + } + }, + "date": 1575110972, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2083": { + "id": 2083, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Интересные! Вот две недели назад бы точно привёз" + } + }, + "date": 1575111019, + "senderUserId": 4274761, + "replyToMessageId": 2081 + }, + "2084": { + "id": 2084, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Такие?" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCYuinBYD2zUckkZQ4dfzqFGXzH3Y5pvkl3+RSazsXcjVvmOSMduadv96SSBk+8hFQyRshAIA+lOwiSQ7X44rSjxHEEHYc+5qlLEWfK4IAyeae1xGBnfyRV2uTclkYEGs+UhXOPwyavB43iJGCOlUZhmQ7R04pclgU7mvNArqxKgkCsqSc/c8pBj60UVKKJIYS0e49+lOEAFFFS2x2P/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575111778, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2085": { + "id": 2085, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А мне больше из Амстердама вафли нравятся, чем из Праги 😊" + } + }, + "date": 1575113983, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2086": { + "id": 2086, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Они" + } + }, + "date": 1575115088, + "senderUserId": 3412850, + "replyToMessageId": 2084 + }, + "2087": { + "id": 2087, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нам всем интересны новости из Туркменистана" + } + }, + "date": 1575270393, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2088": { + "id": 2088, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Trent Reznor and Atticus Ross in the studio" + }, + "video": { + "duration": 75, + "width": 640, + "height": 352, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBkVwn3QcHPFT7qpwxxG4C7yf8Aa7VaVSzFVOcd6lDeo8PSCQMxGOlRtI6D5RnPXjOaIjnhjy3I4pk2JmII6Cio5FaP7wIopXCzIlkijkKCEbenWpIpPLmBAoopxGyzdARIzr35Yev/ANeoSimNXTIJIPX1ooqZboa2I7mU7FwSOTRRRVFLY//Z", + "width": 320, + "height": 176 + } + }, + "document": { + "size": 7096228, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1575270393, + "senderUserId": 2317363, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2089": { + "id": 2089, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Джон Оливер делал про него очень смешной выпуск в этом сезоне" + } + }, + "date": 1575270793, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2090": { + "id": 2090, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это ещё круче отряда Путина" + } + }, + "date": 1575270795, + "senderUserId": 356765513, + "replyToMessageId": 2088 + }, + "2091": { + "id": 2091, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Он там покупает рекорды Гиннесса" + } + }, + "date": 1575270808, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2092": { + "id": 2092, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Чо вы прикопались к творческому человеку" + } + }, + "date": 1575270851, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2093": { + "id": 2093, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Какие-то кони, огромные торты, в общем, дичовая дичь" + } + }, + "date": 1575270851, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2094": { + "id": 2094, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "🙈" + } + }, + "date": 1575270860, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2095": { + "id": 2095, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://youtu.be/-9QYu8LtH2E", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 28 + } + ] + } + }, + "date": 1575270894, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2096": { + "id": 2096, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 40, + "width": 1280, + "height": 720, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCZX4pS1QrwxFPJMZBYYz03VMdgluIspZiMYAOM07dUKHJLEjJ6AVIFY9qdxWBmopsisnWii6CzEtpv3qgLz65qS6zLcRq5wOc4oopIuQ6Tam1EUBs49jVjYIUMjYZgOwwB9KKKaJZTe4G7zJE3Y5C0UUUMD//Z", + "width": 320, + "height": 180 + } + }, + "document": { + "size": 54879987, + "mimeType": "video/mp4", + "fileName": "Турк.mp4" + } + }, + "date": 1575272039, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2099": { + "id": 2099, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "227521399969809651", + "emoji": "🎃", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRlQNAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSFADAAAB18WwbdtIJxndf+UkfW6FiMiPVzjDSKSlRUZ+pK2wKJGWirxF2kK2i0iosG1GYiNBZEJLyRXKYeQF2ZJkm7bVm8fn2rZt27Zt27Zt29ZGf93FnvfOM0fv1xsR/U/8z6Fq1xZR5HHns/z1uHKlIauOnDm1ZmRD5Fv8Pf/cSNPZW4w8qjdjygL+ez/yZvB1+n0vQn7UPkHfTF3kRZ939N6JvKj3lv5H2iIPkrdZoRNNId+YFUzvaATxyDNWNHOwBrQnsuLPe0K55AwDPIfyDoZ4D+FeDDIHwpcZ4mQMuv0ZpDeETzJId+jWyzJId+guYphB0L3JMNMgW5+BVkN2PgO9vnpgVkMItp93hSEvDIlAqvKCxwx+uR10ypZ/pEV6AVQaPqbV7jgk+n6g3cE4BKakaLkT9jNoPBfWwzI0TrWHbavPNL+XhGXZAwosg+V2KnysCrt6aUqsgN02arwtgFW1rxQZDquFVDkOq7tU+VoIm0bU6QmbSdRZCJvd1FkPm9vUuV8LFrEfFLqZhEE9Sm2BQTdqTUD49tT60grBF1HsYTkCN0hR7TACH6PeZAQdQMFPDRAw8ZCKZyMIN5eaIxGs7B01jyHYdIo+QLArFLvOnMw0BPtOra+13vD3o+YIt4NaZ9DxDi+NjiNgYmGaSnPxK4nQXR7z5xeKpGvCJDmm9VaKHIJZN4r0gN1jSpyD4SIqZDvCsPonCuyB6Qrav68J07JXNB8F41G03gbryFnankzAvM4HWl4tg8DAL7Q7UQaJzi9plF4Zh0jNszS51hY6sfGvGPzd7DikymbeZ9Av6ypBr9ve9ymGWpKE6C6GGgnVDXTfvWHO29M7zz98+zXF1MnNn+n2gepauqeT9Zu1+tmkGv56lG4PqK6guwk+s+l2hupSulPh04VuW6guoNsbPuV0m0J1Kt0q8HpBpyZUh9J5Ar/TdEqh2o/OCfhtoFMI1a50NsJvLJ0iqLakMxN+zenUhmotOoPhF//G3JZQjf5g7uEY/K4y91AZVO/T2QC/bXQedYLoXjqplvCaQfd+ZWh2eELnHLw68C/bIFr9BnNvw2/EJzq3oFq4OcM/4+BZb/Ez5iyEbvN93/jzWAze0S6rL357OgfSZV3aRPE/CVZQOCDeCQAAcC0AnQEqgACAAD5RKI9Fo6KhEsl1lDgFBKCHABH8/27sZNK9h5NvrKKK8m276Xn5t9EDpLeYD9YP2i7DPoAf27qOPQA8s39uPg9/bn0t8wA6tHQ1+MfYfzM/F5ER+HfaH7/+UfmwdUb6gX4h/Lf7NvwtZv8B6gXqV8t/vv5r/5LnY+WD0N/8Z+Znqc+GV9c/xH+Z9wD+Pfzb/OfjL/dP//89H9B/d/3H/w3to/Kv6r/pv7V+7f0B/xX+Zf4v+u/ul/hf///5PHv+yPsY/q6XynxDNCzVD1XBFFexuAxNKo8sjdfULWKF3iYMiyVdQm8hGAgxNzHc0oKRqRkh8l052b/jPYxsZpTaml//rvvi57nNIjZSs+Gs3McNYAjRO8AH9OfWZuG4Gmc6FY0/pnzuEfYe0ld6pMjM2KlV0Hq4J3BI/3G2tDFdjGQMjScP6MKstUdnI7j5D03vNGuGOHs0/sXjuOIFuyqZj6As4OQALhsqTmQAAP7kJYDR65/RrxZAhY8oZnzz8HIEygfOI/SGbLC9A76YLHB+lc6upbSPW/u75OSTf/+VB+WdLfei8Sh2wJlPj36p5T8Sj6RvrKC/5DiHL8LYYIfK7mfmuZf7Q8pmHfhGJ/ouYHX3f2R5Z5b5DKKVjKiQwEi+nK9hcwc6IcKJu1P5Gs16tXat6S/kP98Tm/vM7yo19P8RwBMEpOvzQcqZuzH4uYFS5rPlHvcwp/9OrRy/IrdMuAxfQ0ZSwz8jXPZCMCZZv/5mVxZH/s4GP292j82oL/Ah9yeuJXuxGvOsk1/oOPr897fc/NjuQ3KCqFR9zD+cR91t7M+nwF8C5fbejf7SO3qPc08ietU36u7Vr6skXDiCE5fxyUN6Nv5yeSeIHtOx6RSU+vy1K/Wk1S86vWdWpV+Hb9W/XQMHspXAtY1pGtYQPN50a7HrPjA3YSiDzfmO5Is0f0pb2Pwh+0CbmYX7dVVuRu5UJYSiYsnw0WjC6XPiJFKKlSanPt6Er1x3cgjvUUHAMu394GwWg3WYYj+0MXqUSLpO7Pu7RSD10n7viazNJZ7a5u238/lDFmaYNsalJrf7Xxx0GFOetxClGPFHQVFZuHMwDFGZRpxaSi98fEPi7RxouPENt1bNQIiHZ3TDZf7dN7pIgyO+aedvWKcoBl1hC9Sz916jxCW38ghpGlwfBxWCkKUUtEj0uOjw5qUPKk6F+jgMDflq4x5DDdwrUyuPfAnqfmizvN496Ylwburu4oniC7fw3Gmvo9ja4n7wzPHeDMlTEIiq+SBX14hhFDTzkUooi/Le6DFqEOQAe94NgMwIjWej8oypHBt7523nIuDeQaN2EHBw9xhdbn42E/w/8UqX2LEEEUhxJkVM3ecEn2hd5eUZ/E11l/iW2P/61kno49dIUonBm/y9QoRAivz24Pk/h0bHMdPsLYLpCRdAOo7kV/mJGld8vwf8wMyJorzdIpjw9g32T8GzkP+xtE3E0DuxKe8OldQKus75cbKHE+ElcWq+sZifw4vGRnnk7S8ViHDmU3h8Dr0SncHO/j+oDG2Grhy6z18nnLakG9EefIVMtIyDX/wgxwbl1XU6nfSH2cMZXq8XUKI0bJLmO4xdmwVCpTGg3hDrw8S91z2l94WsJR/xxAFqPZOeUwljB0vDzQuTg/xTeb5baEVlfkIiVQFI4+YqBhQY4q8XsYdqNDGRiFuaB64jIeD7lrQB7Luc8nyhUNBYe6Hw1jcTIY0FPLYhu/+4FbgQrmtFYjmtiwiY4j4/fktSShewCBfHKjb4ymwqEw7yxsw+yxeiBuFIA3EHCgk7QjnASQpAyqMq7oDfldXdumYarBEkMjZZovyyuCRQEtzU9YMb/gHI+uJL1Y2quYAx4TOYRyJtPQ8kOYp64S9eiGaygyU5MENIpu8sjkqiclYKBMkcQGYBL0mGC5gvqF82YEg9Xy54kZ2A1zyCFIynXCbfKre4fxp09PMNYhwGD3lq18NXEJ+TuoeHfMTDi+n/Aql6SougrmWMhQeJjeHKwJo0+hetedi8QHMAjuqGIqH0q3sJihnc0D8E/VTJfRHqYX7A33i9O4d6XwZlRjkH5BWCLonugAPzQouwyhjyTL7a1a7oUS3f8EAUyVZdrBwWW/1mgqhQYZi5tAzqe72S0DqLxnzxBcCjpyCPQKGD2UlMRO2NLJcD7I6fDmMvVjt9pT0nLjoXiAfnkAQw7uEyCvcxZqWCHt7ATeT3JoyosQl8wCU1ET99Fu0mnfiNEzf1Y+wNkVzzq6ejTI18kJWUwuk+/j/H8DIWv9CWrFAIrzRCK6jGrC+sQDB+GdKAkRS8v6tbpssEnMfSIcWpXvLT6O1qufLid0R3ihqus/yYk2L0wml0IQvSgLN8YWZGCOaicxEZi7hqPGGTgbxgzPbWhY7bTcsZXJ+LUkBg2uFCQBDvamY/AWL1m0DFq7EnEqy1Mynr1nyzMSYP0Azba5hG/6DH2RsW47EPQPajsunPDfb71p4NSe5tCPUvoHTic7g8JsAGAjiI778/6t4LdVHHuXGdQn3dB9zsO7Wqp4kNcBeoBfRZqyQ/3yrF66X2Wj4uBB9FbFCuaDXS6rdybQsQFz+03UfZfKzaxq550iHwxu7IQ7i1clqtFTKA4dCn6rRxwBhL1gHF8j3/+8IJteKDb6x9Ih3vhQ/ajUM/fWZJLkUN332vwP5jOxF4qsNBaDPQNswsmGFIG/gi+vJ6xmy3HncFGs/nvitBE+5zFUopu7gPriG3OAWcO9csdFOND32A4g04FBYe5B+otubzZyTcmu8LPq7pP9ZplcPohuVdQA61HGjCt49Jh9g79R5B1LAYAhJCmxMeiIKP0m8ZaIS6DgVBxl55DyiIWuzQvs0GofhNLrbMJM/wu9t2SeaZbaJLExVMVHlj4TWfa/VEcTveL/m9ThDXJVaLyqLChy38+BEFf/cl7jlFyjabN2b68W0+r+plgmbv3AXDVt3qlqTsmptRDnyQue3QSgDNNVgf4AX87MXBlSXXFFuQ8fSJrq3hu41fpFPfVbkrwOSBwifVjymRpZg5AQY3bth83vOrAvxSTlmBJRFiOyTyTexmxUoJ+dkh+QvnVjO0kHL0zLb2+pOPoStnbCNVT7vYbHzo5L5nyXyyZNEhTfGBddp2pWRpK9SVPsCROb8LDoWUaZcxT9+IuNfOgXFp50nx0xezPEZdFE+f8YrD/87x41XZYIq0HCnYuCOxET/X4pfu2fJmrkEfzL9uZas3f5dVSsp+fDCQL8dKbb8n8nShgWJaTM5EiMfEYskmSjSnuSm2tmvBLHzd9EsU8LV/NqVH0pm0JQgu2iF4kIA5trL19q9vaASps075g6hWIKtj2AAAAAAA" + } + }, + "document": { + "size": 14960, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575292890, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2101": { + "id": 2101, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И кто-то ещё один не тянул \nКто же интересно" + } + }, + "date": 1575292939, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2102": { + "id": 2102, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мы все видели Лёш" + } + }, + "date": 1575292958, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2103": { + "id": 2103, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "fuf" + } + }, + "date": 1575292965, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2104": { + "id": 2104, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ага" + } + }, + "date": 1575292966, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2105": { + "id": 2105, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC9aWqxZZhls1JdgfZ2NNlu44MBslj2FMnnWW1LJ0NIDJc/vSM456VetbSRgSdoH51TZE+ZyOav6bMDCVJzigZVuZFnfI42naD61FHOy5gcdTkGqzyMGVeBtp8LtNtQkfKc80ATzXGyExDGSck1XimKZwame1WR2xOu/wBMVUxtJGc00xNDnjcdVI+tLbnZL83Qg0UUgI8kNkE5pBRRTA//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575293256, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2106": { + "id": 2106, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Эльфы Санты за работой" + } + }, + "date": 1575293604, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2107": { + "id": 2107, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "677815138606121559", + "emoji": "🤗", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 25598, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575293646, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2108": { + "id": 2108, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCwaTFOwaKQxAKeKBnnI4ooAsQAYJopkL4ooAr/ADk9Rt7CnDsPSmgkdKeMGgCGaciXYuM4yc0QTmTCvjJ6e9V2JkkJGBhj1HvinXBPkAjgqcikO2heU4NFVbW4M6btuDnFFMR//9k=", + "width": 1280, + "height": 961 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 601, + "type": "x" + }, + { + "width": 1280, + "height": 961, + "type": "y" + } + ] + } + }, + "date": 1575294548, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2109": { + "id": 2109, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "368147511233217067", + "emoji": "🎅", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRkwSAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSKQDAAABR+WgjSRH+qr+xB/xJP1TiIh88CustEhZRDqUkTJOMFzpl8XxSb2wnqyEk2IsnpSE8+J+qdiMyFh02PAHsm3bNh1rlu1r27Zt27Zt2yybSc78zGJyzt5rvkf0P+FnyJzNx268+FzV2BkPYq11v98+Or9nxcRcSBQtOPS0jiFjn69umZAGy2lTD7yJM2r1jbVlMDr19D86ij1bXwxzZbu+0Gnb9VkwNe5SG91/XJ8DK1PuJ+inckc+LIy9E9Bf1dYs+C49F6PfbwvgNW1dHf0/GAZ/o57TROO2dHja1EIrL4fDR8k9GmpYAvdTftNUcDITjle30drLMjjdF9De99Fwl3mFJmumwVXuAxptmQs3eU9otn0+XOQ8puGOeYieeZemW2ci8gUabxiPiHto/u9gRFqUoP3XOYgwtokKlxG+4As11iH0FYq0jEXIZZR5n41QFbXUOYBQtynUNREhFlDqTTpS5v6i1kak3EOxmiKkKG+k2lGkOEW51iFIOqSdemeQ9BQF2wcjSVkzFY8gyX5K1udjQEYlNTdgwGqKvkP/2VVUnYi+JXHKHkdvfg11/6ehZxWVZ6DnAJWPoecIlT+jZy+Vg6HoXkDptegeSemL6F5K6U/oPkrpeAEeU3saKqm9oTCg9onJFH+wmOIftlO8/iDFgwtUv0X1R1R/RvWXVH9J9WdUf0T1W1S/QPWDFA+2U7x+McU/TKb4g8KA2idQSe0NeEzt6ThK6XgBllL6E7qHUvoien5SeS16LlE4GIqe5RT+jN6iLuoeQ99T6s5A30bK/k9DX1knVY+j/z2qTkT/hRR9hwEZf6m5AQN3U7I+HwNLm6l4BMlOUbB9MJINaafeWSQ/TbnWIUhe3kS1o0i1h2I1RUiV+4taG5F6AaXepiPEbQp1TUKYQbXUOYhwyyjzPhshr1CkZSzCFnyhxjqEH9tEhcuIsihB+69zEGkPzf8djIgXaLxhPKJm3qXp1pmInvOYhjvmwUXeE5ptnw83uQ9otGUuXGVepcm66XCXdjCgvR9j4HRNG629LIPjKX9oKjiZCecl92ioYQm8bG6hlVfD4WnUK5po3p4Ob2nr6+j/4Qh4LTsXo99vC+B97N2A/qq2ZcHClPsJ+qncmQ8r4y+10f2n9TmwVLbrK522X58Fe1NP/6Oj2LP1xbCZNvXA2zijVt9YWwbTxQsOP6tjyNjna1smpEFi6JzNx26+/FzZ2JlgrLXu19tHF/asnJgLL1ZQOCCCDgAA8D0AnQEqgACAAD5RIo5FI6IhFInOhDgFBLIAYZYAQ+vmvOftb+P4GJEVgT1Qfpn9W/gG55HmH/mf+h/cD3rPSb/i/UA6Sf0AOlT/sv/e9MLNg/7X1h+m7+AKHHy38e/oflu8yv9M/b/47f3/oL/yL/N8P2AL8s/pf+d/tf7pfkB02dtL5N/+d8kHx72AP5Z/Wf9h/Y/Xc/1P8b+0v+m9rn57/fP+3/gvgH/ln9K/1n9k/e//H/Mp///cT+0XsT/qq3rMx/2qTb9f3b9A0Zn2QEXpPl2V2Hkr46uAlH9ZsdSgZG7vTJVG7vkUzdpcm/jgINyC6KtcAxZCW7SmO1XDg7rJqSp25KGdgB41CspitRZhq719pYxi8e1WXBNVaZK/LQ7INwvD3Ldj+CDin6NVjg9lLKNpjaC0pmS/QJKalUS/BzQHfSu26BsGyTppHw+qCsTtrzKuCnA+O7ofKMCV9kxrnQjOYrzo0QnwJaDvtAxNJVBsCEaktLLsvEOyesawvuITzf8s29Ud/yEeXLWtj1kCSSfyZLmJLKWGVDRDlMCdBuCbs5cWJ6SYJSjlY4daeAi1QaGDHFUFFIJTE98cyW04yefAOb3PXLnkfeKkKuaIkvaEdra/Hwb/0h6A2z1LXQcTcwg8AUKTf60/xstjDFv//Rfc3CeAAP7+0BwhgJb6pg5S15G4q/llkn3Jp9PXf1Sm8mebEPBWiyn8wlqOegtESu+J0G/hA65pCTpE+yBSvEYkQf5OeK9/7e69clUlI1JOp79dfcvh0v6n5m/2QJRDLW37jUMRiF+/GpJYf0pT+0v7K77smLmKEqiOgjOpECPn3Mi2vVA9bOhRuqgZKy/6dgo1sIXKe6s66aQ0mxewvmGs4AIKPsSSQGPV0gOOtO7uYcFqmN194Uf+ei21aH83Euqh0TzxzxGBF7VFeifLM1M8sy4d/aT+IjoEs3YOm/XolmNsViSmuThJGrVxHg5hrv/FWk7+3iatH/Ilb9ZGfIQ8ATtWKshhtFg8q0gGQiOKse/I37Fa7mlMB//xiL2ecyiT2EwDbiGinfpNZrvvhTZKeB2c3zoGUV433pYwsF8nP/WAyIYvZLfC7uXoeocTB1GCffSgMKAcQDVI7ma+svVMmrRMjmysGVZrGGflqc+yLgBv380l9f7GN1F574Et+9yhK7FQH7uqUdAjx1fklas0IucrFNiDs265NuZag0TIFYeHMY5xti+lb7M9D7GOEH705+PLir84rUhpLPGcwBG4zW8t/W0a19FX62HoYGQFzpFFUE8ic2oZFW/OtEpW3/8aKootP6lJ7jCSYTABgXFdswTL2RML27sJUgPinF62c2FV2SiRZU44+Xvp5qIO8C/FV1bquEUYJO7X8ldfJjFXw1X0ZxBYWnTsP7oXpZCm3WdV/2MI2FNGg5QZz4Wllltunp5f/CPM0le6x3F0/PHgR4L/GUbCPDrGvyXk56jsriylrdCTqfj/LakzCMugB7PJptOGw+GECZ8e8zwoICWMF3sNE0XSuHm8LpaZbmQuYKn+vJyrSx2PWmp4HE8VSK4QVMnpvCTyrF+67nQU9jigBPJk2Ta+3xAcoL2g/g7dVqK3EtsRDoGrvTioLHNbBISgMjKx4/djQH9OoNTukrQ91TB4bWPCvPeIX3gUKOB0NN+VFoTcNt+boNuKzodVzIk9mKgHNcQpwWnRZOtgPlO9vSMvZ+nbT3T6jGxEWQkk7slhkUvC+T1gVObe4cYqhwofrQMs/MzBAeBRfykDkemJstUVH+mNpWbybqD5xN2jWM0QQRhXd9Lz1QUlHHV0quonOsxVpcbHh2gnZOIBGNKVqL/bdixszQXPi5S9HCyWxp/PdN83uEeGIKakjiHcTXfJXZC7+92+3wwH1RodM7giVQ0qFK8A+vQw/QSMoIxGhJ7DyNskXYbzL5AVkhdUEcSPMKOpmc3IV1jL25hreVgLUtWWNi9qQam5NWg/FGA/vKXFz77dDMWjO6D6aY5iXfMjaUeH0T8jf52x9zgjQM/8xaYYAdlMEzsOt8Dov9Kg5CFVZlsuYCcPZI0YEVtSK1H+Pl3IQbgTRCAaC9qVf//2N+zwySDy7SVSgVpAYROf6iyKdJ/jVPw5PzOLUCU84Pq//REFlEYMOIDj5dd/6xZZl2BnrJVlfe/LejtOzMQkbtHHrfvvB0v1V+UT6I1L5za1cQzOyckvKvd6Gv7ZG5ZlQ/yd1kiaaAnqmxEoCRuwNA63lB4OG/WsAzsZvmPALBK+1fCBN9dj/gRAKzH5Xub3/3Vo1M9UbdJmQ3I2t4ZScgDhDTJ4FTMr7LoXGHjDz6SoTM0yB58A2uU8WOff1J/9GTw+OqZgQDqz+MRegk9MpPGc0azLmmBYL1UL/zkf46u3EjNYioAMZH1WqOnW6lSKFgaECYOOXfSZRkQM9B6BbNi1yO2O0GsaxI7FxKbOXinK71HQaVJBDkuvWbDEBXNuVQzgwUrCZJ9no8xVzQHOvlmX/BXSOoJJtW1xxC3X5ecl75QwQ4iJWcwW0mF+W1blTARpusM1DZ+AKAE6NDlCfIiJlrftirqUM4sRPArY6gnqUNbfvEs3M479z0B+G9efSOTpzMawpFo+3UPP4eex3uj+erkCxgYVNGCsgEV85cO5mmltOT8mPzbkRZJ7C2gRNVfk0/SCrATJfu4A4jDs4xGl26Ov5LMYG4bNCwnWadk3Tv9s7WHL+c3lUFAOTG28rbG33Be80TZ31H5a8OGQsM/x6jMqpL1Cgjui4+X5Qhliws3ijizQisX2oQ87Bw4eMLqvWGraHCVvsem4qB6Dz2g8iJYrRDGWz8bCz1ELH06Net8FO+ubGe4XEwzPbjZLZvRznp3tv5o4yUi4IddYecvt+1+zg4HrW8c2/yN3UOSkkxO3XWN35qlXT3CxVaaY3nRajdqJo+2XzVrsaolF5V6E4uq8g8+eMPm0v76VGovYylvfVQtif938oTwpkJDp44vSKUT4oyr/S+UH+kwLOPfuWAk8/XrTbq0hjyuLNMi9MZrtm/fCCupI4lvhaugjdxv9N/+eEDQLhktYGhqEdfHFyVgQE0V6UGd/7MUxE0nAr+J2X4qe/usbPq6JrZ0WFPaeKzHKw+9hFOggBNx7c746X1oyyUzccJRCOrdiACEysfOksXdtzBC9qv8xky49gW8Vl/FVvN29eUt2A43fqBCSetf0jtxOyeR52gff0ONv/PJf5kVn2W8DeeqBhuP2l4Zq986zVTDs/42kTtsQmMbyZGwAZPVbb0DtM4WwbMmLc2gSWQWYRqp6QorBd6dhNnGchsJx2l0NyW+pBqXVtWpWMW1OBX0xcuilwKpFijx/20tF7S5vVdjfKetQcP+gZrXe1Y3ezYI1jWtJBsg6aIBOymtVCZRdq3uIVj5KIAfSUZIBiYSF6As/SvbWM9ajy7kfujx0p83H13/YdVB5HFCkbjx8o/VNO9p7pbWxd0ikR4jJ9xXX3yHxSvJcgR63N0GCuLW2Bn4K9AmoNu3nR7Ox/qLEXiclzjAP93dYOa85G2T9nDk8m7f5bkcNV9sWtM1je5GtBeXvxBKigUt0djLSMbZkT0aKE8PPKfpzv5LzxA8wSu2W1FNGBvb2aSHlqvfrkRjNqByruJ/pY0IH+pJTeG68GWecSTnUSQ5jwcPsbd0fY/8VXC+j7bKG0/p9wW0bmfOKhqbgIgg6FdPUO36LxlR8Ufg3C17B96WDR0ossZqzC5v+Sc8sav2dB6r+EdpG92VjpPGrXbrveN2KQ/5PtaDFuYeNQQ+CybT7lgYwDW2x1dSZvmpQ72dQX4QY+D7VHEE/+zmtTQnfaSsHOFl87qgyJGzL8CogMSCAvQcYV2EMkw55LKsSqgW7f/Vl/8FfhjKvvYnOM3/a/epTDyAFWV7Pwddt3BLOO3e1R3b/OlTJNLE1kFGq+pr6qJGhwHOjTx6es+0hoOnDsJWrzZ1CWVARgnLWVIMpbdd9GzrI5yVKo1vN0878kPridgGuJFI+3H1C+NJNLtsr6AolH6Kg3cP1T51bgf1YfJN4PTuUJyw1b0T0UAECe14aGEvJ0VaNrWXoi6eAVt2opPg5vJVypBhpyEyMpCdg+QRc6Vb0IiLYu9b85s7ZADP8RonJSLjzCADqppa06Zj5RTn7hslbx41RdNKiiCxFW5t9ZB3dw3u9Wv6i2N/Cy0Z3yNb79z35Jhp3oO2FZMAAN0WI8f8tnIDpLLJX8lq37RyZeQiIHhttGZVsFhds4VGZETumGOGkxbRHqsEIidCIE+TCaqC6nZ8JUxpsYsEXA6aeM1/IzD7v1RrNIDF38KnpmiYitTNuJYC0NErF1E6EnogTugTgfT7ccUuIjWcqYNUObNoqClI6AXNirNPCQbVV+yHBBL+gFoFbTmcQUpawKAw6Ccx1NXnTTRcrsd91/cUe3AXwlOhP9V+Fn6/9Ybrn0o9bb3gIgYy9pFVaABmTi/qAj4VRrH/BC+38RYRQhsYbp6sLhidFoPYeZbLOg96QGpPafRGHs9hmKWhNDylI8deJ6kDVKc6AGldB19L7Onkj+15Yk3OnQTBKlbngCiaRqaqRwh1A8W0AiV/pl+RzS0QEf8oKdo4guqLlIqz4g2BQJlNkSTbWWU0huM2Hun8KKb7M3g/xo+oTTamw18SyjPKk8rEuPBr+Fjt7VQn74JqJAQpDDoZT1D7WEC0gsS0yRqY3yIycvKvVvEKxvEpNp1GZWOeCs9gkDM3QmzYkcUq4/7B3dmVRsigDk0zCxsbG88minlwYFbUb+tOdvT6zxRAxfi2B+KdlH1N+uYrb65YV2/pvF/h//SrMxKMW1KjvSIfR6M0MZdeIu0Nkj56qdgUU2fEsdInhDVFmu+3tlbIRMroM2GJ00CwJbiERZ6TPIyGPJgwBAO77iMc1N/M6/pQooZ/gN+OWbvLaeagAAAAA" + } + }, + "document": { + "size": 29878, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575294788, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2110": { + "id": 2110, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я никому не давал свою зарядку для mi band 3? потерял (\nи наоборот — если у вас есть своя в офисе, можно на пару часов одолжить?" + } + }, + "date": 1575360885, + "senderUserId": 4274761, + "replyToMessageId": null + }, + "2111": { + "id": 2111, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А там какая-то нестандартная зарядка?🤔" + } + }, + "date": 1575361043, + "senderUserId": 54158593, + "replyToMessageId": 2110 + }, + "2112": { + "id": 2112, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А блин, там же капсула" + } + }, + "date": 1575361062, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2113": { + "id": 2113, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну специальная) да" + } + }, + "date": 1575361066, + "senderUserId": 4274761, + "replyToMessageId": 2111 + }, + "2114": { + "id": 2114, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "обидно, что 2 и 3 версии различаются. для 2 нашел, для 3 нет" + } + }, + "date": 1575361084, + "senderUserId": 4274761, + "replyToMessageId": null + }, + "2115": { + "id": 2115, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, бесит" + } + }, + "date": 1575361093, + "senderUserId": 54158593, + "replyToMessageId": 2114 + }, + "2116": { + "id": 2116, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "может я слоупок, но все же вот https://invisible.coffee/offers/", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 31, + "length": 32 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCT+yYif9a/5Uv9jx/89X/KrxfnqKN59RQBUGlx4+//AOOimf2PH/z1f8qvbz6ijefagCj/AGPH/wA9X/KitANntn3FFACY5+6fzox/sn86KKAFC57EfjRtH+TRRQAoGKKKKAP/2Q==", + "width": 1214, + "height": 686 + }, + "sizes": [ + { + "width": 320, + "height": 181, + "type": "m" + }, + { + "width": 800, + "height": 452, + "type": "x" + }, + { + "width": 1214, + "height": 686, + "type": "y" + } + ] + } + }, + "date": 1575384558, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2117": { + "id": 2117, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вау!" + } + }, + "date": 1575384849, + "senderUserId": 356765513, + "replyToMessageId": 2116 + }, + "2118": { + "id": 2118, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дайте промокод 😂" + } + }, + "date": 1575384914, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2119": { + "id": 2119, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://invisible.coffee/i/INU.GREY?from=page_account_invites-copy_link велкоме!", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 71 + } + ] + } + }, + "date": 1575385107, + "senderUserId": 53759108, + "replyToMessageId": 2118 + }, + "2120": { + "id": 2120, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нннаклейки ннннада?" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCG2t47kSEgrgjhasLZRRYILgn3qcRxxqdoxznrQANpwue9TutCiruljG5rfCgE/fFTQIzTSkE4470txGXRiMZKYA96biVWfY+3nnijQQsZO1i7ZPHXtTwNyjjp0wTVNpjE7Z5yMkfyq8uDGmBjIB4oWwPcrXCHzATKyZ42jmoriSWOYquSAB+PFW7hvLQkAZz9ahuMecaTuNFAsTJknOTzmtGIzMgKFdo4FFFJuxVh5EjKd7Y9sA1AyHcS7ZNFFTdsLH//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1575560078, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2121": { + "id": 2121, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "нада" + } + }, + "date": 1575560095, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2122": { + "id": 2122, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "забрали" + } + }, + "date": 1575560131, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2123": { + "id": 2123, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ной не ныл и мы не ноем😔" + } + }, + "date": 1575560169, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2124": { + "id": 2124, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "675168768736887041", + "emoji": "😭", + "isAnimated": false, + "width": 128, + "height": 104, + "thumbnail": { + "width": 128, + "height": 104, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 36402, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575560179, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2125": { + "id": 2125, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616504", + "emoji": "😭", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRiwFAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSJUAAAABDzD/ERHCbWRbrfPlQ0qgFEqD0iiFEghlGK7Ms0iZkoj+T8D2p9sQFANZAWAnqgAuog4giq4AkmgAgAifO0FRVeIgaMRF0IkguBpFwSCSYLqBzFxxq1bgmltndmZX5qC6MMMsmE0muiUGZtmqfA9WqVz+Fc0uLReprrraBWqopqZAUwUXorl11dVtOARiLhQJLJQ+AABWUDggcAQAALAXAJ0BKoAAgAA+USaQRSOiIZQKhNQ4BQS0gBHmdAUdhH+A6Kr0X7DckR5b7WxOLXG6mwA+uOsbx2f7H2Uf579nfNf9OewJ+uHVG/cT2Hv2RK3KlFbHSquNdVsdKq4zEXaxcB/pbDykDXSZLp0Uoawv8T7xHCKX4N8hI28/DlLPub8xyZizn6yEfQHWfYYFK3hGLTQpq+6UcC6OiqxVJrazWbaXNN/96c8827irbhWyZSw+LCl7dtIHheUu2mScQtJ6PVAkAAD+/bToAAA2vo9sh4fge15EKXL1u/b5+dbvamOEUtTalpYZj35fgJgkIAx1RdbdFkzvEBQQR8ay4NxbJ4ytHiZbeDmuL7tE0wbaAEymC55RZeT5B6iz7nX7V4YTXQJvG6QkmN1gUs+F8VTOndu3kiheYtVixQqMvQdcE9Klj+Y204FWaVCsRRZFnu4/Vv5MR6DrzwfBZWw5Qe1ssQ00QwOMrJ7AMm3J5BopVrhaebKpNQ+iZIYNCsv1WiJee821/cj2OkcbpvhbcGyc9O2Vf6O/VgBCuE9BhHL2m12wnD8Z6oHzhqpL+DBve9QwWOoiQ6A+pAM7EUGTZT50JYXqcpfKonJuDdd4kuXTThmIUR7NDYpedabDqM49pE+BX1ywakHYRRbfZILuQRoSQ2L649L9U5zRC/pT18zEckTmliQShc+lx/qYRnnB0eaziUdanprueQOxAIzbBgxVxDrzbGpq0gVTKeLjrv/DTx0ejW0aJxjABdHt8fX3t6znCAeR912P/q9A2vbxu5f2O7Dj9JrKkosX94ysDyrrxIM4N+oHHi9C/4+DGPFMFDErbf5jOp8QqJlMDrklNioe6hHMKSk2Kj2wJRw39b2/fj8hKb+0o/bEGB8msnd/K1uLt3mCfOZ85DNTzhW9uNLjAZhtCIr+fVs5gyD97479NlvMS/EFg1f2iMhzlyhyT+k0/BLqTK+v9wnsf8TGHX9YH/xHta/N4cgZMfjM94gntsHVoxmsGp982uT5SsuMefb5122pV7xz2+rAXZ6D0JL4aQ2dW/zC3IrCwT7vbR+R/+LKr+a94q4OpqByzoTXPSKPoC7SAavVf6lGi6u25LUWB01FRji0TQLkkGMQnZkQUa58aCNWiDlw+yXM9U9vDHtT/1cEVfeXbxcTmlwiCWwB0keoW9+IkB2xrURfjBgUpams3jeIgNRYKmh50YqTi5TwPVoPGG3M0YqM7Ai3WQBtrocO1o4OWcWwRaUgeiHFUQwyIBIYgqAMYQeiVgvDzqO5/XphtCukT/0e5gLtyNCL1cC72cDCrfGDUh/V49/VtOYL4ucA8Zeib7YqMpnreHCHJkvvMrzz7taA8fEvKqfbUJt6Ge5420D76Wf//5Ns1q6lkfb45oSDKD+bFGf1liu9oPHHyDAxsklZgP3kYIrPqxZnzerqyrgEe1a1+TFiPkrR6PFUpHExOx/dDR+22EFLvIptMfchyej+tLRYPnfHdLxiDSNJrlazbed/UgAA" + } + }, + "document": { + "size": 29081, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575560182, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2126": { + "id": 2126, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616502", + "emoji": "🦜", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 64821, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575560266, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2127": { + "id": 2127, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вколоть путешествия внутривенно 🤔" + } + }, + "date": 1575560991, + "senderUserId": 54158593, + "replyToMessageId": 2120 + }, + "2128": { + "id": 2128, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "так сингапурщики" + } + }, + "date": 1575643086, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2129": { + "id": 2129, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "реквестуем ящик" + } + }, + "date": 1575643089, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2130": { + "id": 2130, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://vc.ru/marketing/96156-coca-cola-v-singapure-vypustila-ogranichennuyu-seriyu-butylok-po-zvezdnym-voynam-s-oled-panelyu-v-vide-svetovogo-mecha", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 148 + } + ] + } + }, + "date": 1575643090, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2131": { + "id": 2131, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Уже уже" + } + }, + "date": 1575643153, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2132": { + "id": 2132, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616502", + "emoji": "🦜", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 64821, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575643156, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2133": { + "id": 2133, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 1, + "width": 480, + "height": 480, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCoFp68HGaVRSXCZUHPSoNnoSqw6Z5qaJBIxUnHHWqcA2uVz2qzFwX/ANw0wvoSNatuwDn3wcUVGbdgikTKuRnBOKKBXZXQ06Y5iz6GmbWU4Iwfc1KI3KH5eCKBvYrE4XIPNXrRC9v87H5j261nqrSMFUZJq8HeNRGgHA5NUZEksYC5kPCjC+9FVppi2FznHX60UhqwhXzWyTkgdzirSJmPDEHjGA1FFAMFjVBiMBc+9NkjPJJGfSiii4rFJutFFFA7H//Z", + "width": 320, + "height": 320 + } + }, + "document": { + "size": 106779, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1575643179, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2135": { + "id": 2135, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 5, + "width": 480, + "height": 660, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCkTgUB8dKfFH5k209BVspD90RdBnvU3sa2bZRMmeopQQRmnTRjsMCmRDg0boI3TsXIAFYt3qRpSd+3aO2DUOdvNP8ANAjIZTz6VBtJWImkzDt79DTFX5RxTXkHQCnrKhHXFN3sTFq+oxfvAtT2fc21jxjrRRVMyjIjcKxAUYA70BQKKKfQlu7uf//Z", + "width": 233, + "height": 320 + } + }, + "document": { + "size": 165744, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1575643743, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2136": { + "id": 2136, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "красиво глазками стреляешь" + } + }, + "date": 1575643768, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2137": { + "id": 2137, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Все как в жизни" + } + }, + "date": 1575643782, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2138": { + "id": 2138, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "499916253176007419", + "emoji": "😑", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 15016, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575643838, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2139": { + "id": 2139, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBttBG5uJJS21fSrVvbxSAs0UqYPAc8mobQg2j84Lv+mBUsZmEahZMhQAeOv+RQOw2/iiit8ouGLYzms7DGr9yWNtCJCCx5JqvtB+6aBCxpJG4jI5B4xVrlWC9PbinqQuQOWJyaefLLhz1FSncbM+6ScSdyo+6Paowsw/gP5VpFt59hSfSpcrDSuG1FBAP/ANeo8HPPC+9FFSmW0WBGwjHpimYINFFDJR//2Q==", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1575643854, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2140": { + "id": 2140, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Он тоже умеет" + } + }, + "date": 1575643857, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2141": { + "id": 2141, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "186649756741665188", + "emoji": "😱", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 16133, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575643897, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2142": { + "id": 2142, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "60854042997294705", + "emoji": "👁", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 46448, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575644438, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2143": { + "id": 2143, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "лол" + } + }, + "date": 1575644786, + "senderUserId": 141185012, + "replyToMessageId": 2139 + }, + "2144": { + "id": 2144, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так как я в пятницу был охуеннейшим фотографом, держите дозу расфокуса и смазанности" + } + }, + "date": 1575800625, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2145": { + "id": 2145, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCyl9z/AKof99VILvzGePYQdpOQ2e1ZcUpKKSD8uS2PSgSeW5ZeQU9emaAHSSnnEkw/4FShl+zHzC7KSBz1qqPmfHPWp5gsce3II3DODnsaQCFIwyld3OcA0U5oyI4pc8Zxj05opoBz2jDkcDFR7NkYYc59eKuyffI9AKhnGHgA6en40h3KzYCK3c9qTAYMHbC9R9afMAYge+ajxkpn2piLnlM0BiUZ28q3v6Ciq73EsZARyBiipYz/2Q==", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800652, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2146": { + "id": 2146, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqgRSHk5UHp68imzPE7gom0Bj3q5YtbSwKJAu8HAB60X2wXUeAORg8Vn7RXsOxQI4OOmePzpfmIGASBzVmBIZojGRhyTgj60ltEHlNvJuRs9RVXCxWdgVIFFOuIGgkZH6j9aKYiwIwlus4ZSY8ADGKgnneQo7Yzz0p9vyJUPK7CcUwKDJECOCTSaVxjrRX8yMhTgk81dQ/vfNdlXaOfXFTxgBV+tUbxiVUE8U7WYiC7uDMxPJHOCaKcCfsxHbBooA//9k=", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800653, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2147": { + "id": 2147, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqYkEayYxk4602SPdIB7dqgzzWjAIiplkYcDGM0AQRbBKqnAwQSTU0aA4UP8mThvaoblAk5IGARxjpTrWWIgRSNhW/i9KTAWcQ+X8rktkfljmirN1ZwwwqVBJBAJJ60UlOLCxnGJEU53F/boKIxz8/3faonJMhOeaQM3qaoC3OjttZP9XgYGeB7UWtn9ogIGA5PBzVcyMbYjPBYf1qxYMVkXBx1pDJp7vzLXywpGwDk0VXl480Dp/9eipjFILn/9k=", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800654, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2148": { + "id": 2148, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCkgXAA+9mnAnkAcntUsbqohLLuAJ/rUzx+VcxzRgGNjkjpile4WIFJEYBGCOOauwHNlB9D/OqbvBLI8xA35xtP86nib/Roh6Z6H3pgTL3opEPWigDNiiklchOgz/WpdQDxxQq/BwcinWjEOearXzN5pUkkL0z2osBBn2q3avui2H+E1SqxaHlqANGJvvUVFGT81FNAf//Z", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800655, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2149": { + "id": 2149, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBR5RAO7bz0NOVwdOnA9R/MVU3F7oCVgFJ5xUwZcTog/d5GKLhYrgpvBcEgehxVmF0eGVGHBIJ9e1U3/dsBnJxT4XPly464H8xQApBZDgc0U+3uzGChjUj39aKNRqwklsY4y+f0poBBC7jzV2R2MUgJ/hqlkkRk9cUkDZYW3BXDc89elLIUSDycbh9arbm+9k5PcVKWLQAscnNAhk/+rjAIOBjpjFFMn/1dFUgP/9k=", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800656, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2150": { + "id": 2150, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvAUjDkbW6dRkGrcd5IIWIWIAYGAtZ0fEeSRhh/WprRd77XICnknvRcLEs8zu+4+WrEDnoelVDIxDEnJA7nPep7iPMrBMheoqH7O3lM6kEHj9aAImOWGOn0xRSbSMknlcUUAJJMzE44FPR8EVEoBlAPTNWLtVjmIQYAFAD1UmMvn9aSOYRx4PzZPTHSlh5iNVWJzQBfF1C+AI2B7gAUVRDFWypwaKmw7n/2Q==", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800657, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2151": { + "id": 2151, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDM8tgecfmKkl3JIRjgUm/5uGbGfWnmRg7fMepxQAMxRsACnxAySAHODx1xTl2O4jwNzY+cngVNGg81kAJYfdxQwIrl1QCOMkgdTk/MaKJbeREBMeNx6k0UlYZAsatKqk4zTntzvOPmOe1RNxgjjBrS09i4+Y55oegJXKvlPHLvIOF4z+FFuzwz9QG7enNW7+RocCPCj6CmWyhrxSwySmTnnmle4WEursSRKCTuB54+tFVbziaQf7dFSoJBc//Z", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800658, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2152": { + "id": 2152, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDN354KqPwFDBSxPPFMCHcMU4hs4x1NAFmGxkuAWT8BTYkMR3kZxkEH1q3ZzlGVFzn+dStAhlm8zIRiMY9TUt2HYy5meRy7nJPNFWLuOJJyqDAwO9FCkrBYqbh15z2qV5VYYAwT1NV+1PTpVCJ7YkOJA3IPSrbEiDcScnvmqNr96r0v+oP1H86QzOdnLHcSTRWrFGhU5RT07e1FTcLH/9k=", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800659, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2153": { + "id": 2153, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuHjMK465596WR1ZwSM8Ac/TH9Kh8kjB6DPerSoCQS+cDBouFioucsMdjSb+n4VcgRHmdCoAxwe9Ojs13B+Qvp60rhYoSgmYgZoq/9lKEnd1PHWijmHYW6ZWtyyfWo42UwpGo+bBJNS2wD24Dc8VVtyfN/A0kO2gHKzNuJyPQ4pVvZI+Iztj6YPNExJOaiQDzOnf8ApTsSWZrsbP3ZyR/HRVKbhiBRTSC5/9k=", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800660, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2154": { + "id": 2154, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAbACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDOhCl1zlfepUGwk5DH1FQqflwPTNSIf3ZoAufZZWIKIenXsarvE4kwUIP0rSiuj5ewLyqdc+1VZ8eXvyeeuKzjJvcdilIcYGOhopJDuOfeitBFh4zHIGXgY/KpIrXeDhdwJzVVZHZgCxIreiAWMADAArOUmh2KyQ+U+wtnI/L/ADilaFGhlQYAI49qiVmLyEnJouWK2rkHHFVFaAzJJw5A6ZoqxIihIyAOWFFO4j//2Q==", + "width": 1280, + "height": 853 + }, + "sizes": [ + { + "width": 320, + "height": 213, + "type": "m" + }, + { + "width": 800, + "height": 533, + "type": "x" + }, + { + "width": 1280, + "height": 853, + "type": "y" + } + ] + } + }, + "date": 1575800661, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2155": { + "id": 2155, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616502", + "emoji": "🦜", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 64821, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575800701, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2156": { + "id": 2156, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "можно порезать на мемасы" + } + }, + "date": 1575800703, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2157": { + "id": 2157, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Пхаха" + } + }, + "date": 1575800713, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2158": { + "id": 2158, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Супер атмосферно" + } + }, + "date": 1575801673, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2159": { + "id": 2159, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "На 50% атмосферно, на 50% размазано" + } + }, + "date": 1575801832, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2160": { + "id": 2160, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "главное, что моники и рюкзаки на переднем плане в фокусе" + } + }, + "date": 1575801904, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2161": { + "id": 2161, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Можно сделать фотовыставку «как видят мир люди с близорукостью: ч.1 вечеринка»" + } + }, + "date": 1575802205, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2162": { + "id": 2162, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "😁" + } + }, + "date": 1575802271, + "senderUserId": 860139781, + "replyToMessageId": 2161 + }, + "2163": { + "id": 2163, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У меня -1.5!" + } + }, + "date": 1575802746, + "senderUserId": 356765513, + "replyToMessageId": 2161 + }, + "2164": { + "id": 2164, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Но главное — это стойка фотографа" + } + }, + "date": 1575802760, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2165": { + "id": 2165, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "+" + } + }, + "date": 1575802933, + "senderUserId": 860139781, + "replyToMessageId": 2164 + }, + "2166": { + "id": 2166, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDY2j0rB1GRhfSKGYAY4B9q36wdSAF+/wCB/SgBtlMwu4tzMQTjrW+QAOlc9a/8fcP++P510VABXOXxf7bJvyDu/TtXQYUNuyc/WmS28M/+tjDY796AOdjdkkV0+8DkV0quCFDcMRnFRJZW8f3IgD696l8tdwOOlAETdTweT6f/AFqReM4B568f/WoooAcpYkhcg/h/hUilxgEZ980UUAf/2Q==", + "width": 750, + "height": 930 + }, + "sizes": [ + { + "width": 258, + "height": 320, + "type": "m" + }, + { + "width": 645, + "height": 800, + "type": "x" + }, + { + "width": 750, + "height": 930, + "type": "y" + } + ] + } + }, + "date": 1575806271, + "senderUserId": 860139781, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2167": { + "id": 2167, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дружочки, давайте устроим вечеринку в четверг" + } + }, + "date": 1575892125, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2168": { + "id": 2168, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Меня не покидает фантазия сделать эггног" + } + }, + "date": 1575892138, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2169": { + "id": 2169, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 480, + "height": 302, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDJqRI2YAgcepq7Bp52AyqNzHoTjaPWp0tI4xtjdmHfFU32GkUj5ghUk/IG6DsabMqGNWUktj5uKuXFiSjvDLuUclD1FVFOwYdFII79xRGVmDRVoqfyUc4WUAnsRgfnRW3OhcrLaXJupljUnLdSa1FHlRhev1rD0z/j+j/H+VbT/drnasUtSAukcjHaAGGCO1ZMmPOZcggHAOas6h/rk+lU5P8AWNSBh0NFOk/1jfWiqGf/2Q==", + "width": 320, + "height": 201 + } + }, + "document": { + "size": 516753, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1575892172, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2170": { + "id": 2170, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "*спойлер — я никогда не делала эггног" + } + }, + "date": 1575892191, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2171": { + "id": 2171, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я б за, но меня не будет" + } + }, + "date": 1575892278, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2172": { + "id": 2172, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ууу, очень жаль!" + } + }, + "date": 1575892293, + "senderUserId": 146686085, + "replyToMessageId": 2171 + }, + "2173": { + "id": 2173, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну опишете потом впечатления от эггнога" + } + }, + "date": 1575892314, + "senderUserId": 860139781, + "replyToMessageId": 2172 + }, + "2174": { + "id": 2174, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616502", + "emoji": "🦜", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 64821, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1575892317, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2175": { + "id": 2175, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ром и сливки. Что может пойти не так? 🧐" + } + }, + "date": 1575892337, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2176": { + "id": 2176, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1222077027897573530", + "emoji": "😳", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 21418, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575892350, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2177": { + "id": 2177, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дело хорошее" + } + }, + "date": 1575892358, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2178": { + "id": 2178, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Знаете ли вы, что история Эгг-ног (просто ужасное название) уходит корнями в английский напиток 14-го века, называемый Поссет (еще одно восхитительное название)? Поссет был напитком из свернувшегося горячего молока с Элем или пивом, со временем в него начали добавлять яйца; так шаг за шагом он превратился в Эгг-ног который мы знаем сейчас. В то время молоко, как и яйца были весьма недешевыми, от чего Эгг-ног быстро терял популярность. Но все изменилось, с открытием Американских колоний. Благодаря весьма сомнительным торговым операциям между тремя континентами Америкой, Африкой и Европой у нас появился Ром, которого нам так не хватало." + } + }, + "date": 1575892380, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2179": { + "id": 2179, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Если бы меня кто-то поддержал кроме Яны, которой не будет" + } + }, + "date": 1575892380, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2180": { + "id": 2180, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Которого нам так не хватало..." + } + }, + "date": 1575892387, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2181": { + "id": 2181, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 4, + "width": 480, + "height": 360, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBgm6fuWPP0qOW4JbYsRBPvWpC4EYJ7d6p3HzSmQDjNDBEEbNkFo/l3cZbkcVNvH9z9ajc42leOf6UkkjBF5wTnpQgYS/PHgLg+uaKiWWQsBuyCe9FMRcLMg2MwOOuKcvIqtC5VRjuKnhmJPIH5UCE8jzI1bJ69qbLGgUbs8d6Wa6aCXbgEHnpTheDaTsHAFAyCOOLzFKv36GipfNQnIhXI96KAP//Z", + "width": 320, + "height": 240 + } + }, + "document": { + "size": 324811, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1575892434, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2182": { + "id": 2182, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мысленно я с вами буду!" + } + }, + "date": 1575892434, + "senderUserId": 860139781, + "replyToMessageId": 2179 + }, + "2183": { + "id": 2183, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "При рассмотрении данного вопроса, прошу учесть, что Наташи не будет с нами 20го!" + } + }, + "date": 1575892505, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2184": { + "id": 2184, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Просто режешь без ножа" + } + }, + "date": 1575892527, + "senderUserId": 860139781, + "replyToMessageId": 2183 + }, + "2185": { + "id": 2185, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1222077027897573508", + "emoji": "🙄", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 20396, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1575892532, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2186": { + "id": 2186, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А ещё 20-го не будет Антона Рослова" + } + }, + "date": 1575892550, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2187": { + "id": 2187, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Антон так вообще светит для нас только неделю 🌝" + } + }, + "date": 1575892583, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2188": { + "id": 2188, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И в пятницу не может ☝️" + } + }, + "date": 1575892602, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2189": { + "id": 2189, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я тут узнала, что 20го у втб корпорат в таблице. Party battle!" + } + }, + "date": 1575923129, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2190": { + "id": 2190, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 480, + "height": 342, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAcACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCs7kHaoyaVSTkMMGkkGGDZpV5Ynk8VBY4dqO9KO1HekIQ9KKU9KKAKkM7ibcSDkFcN05qzeWskESyiRTzghexqjGNzAGrKsfsMqk5HmA1YhLaV3k2scjFWP4qrogivAq5xt71ZPWpe40IelFKelFID/9k=", + "width": 320, + "height": 228 + } + }, + "document": { + "size": 320087, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1575923147, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2191": { + "id": 2191, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "опана!" + } + }, + "date": 1575923162, + "senderUserId": 356765513, + "replyToMessageId": 2189 + }, + "2192": { + "id": 2192, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "можем подкосить под втбшников" + } + }, + "date": 1575923172, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2193": { + "id": 2193, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Автоматизируем третий этаж" + } + }, + "date": 1575923192, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2194": { + "id": 2194, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "у меня в ртк был проект, с которым мы мутили совместную интеграцию по страхованию" + } + }, + "date": 1575923195, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2195": { + "id": 2195, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Запустим тебя первым!" + } + }, + "date": 1575923208, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2196": { + "id": 2196, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "главное надо как в прошлый раз" + } + }, + "date": 1575923216, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2197": { + "id": 2197, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "отпустить меня на пару часов, на пре-пати, чтобы я уже набрался духа" + } + }, + "date": 1575923236, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2198": { + "id": 2198, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а потом с втбшниками будем кредитки разыгрывать, пенсионные накопления в дёсна переводить" + } + }, + "date": 1575923248, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2199": { + "id": 2199, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "попросить Нику скачать дискографию сердючки" + } + }, + "date": 1575923260, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2200": { + "id": 2200, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хотя, это будет слишком" + } + }, + "date": 1575923264, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2201": { + "id": 2201, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 480, + "height": 480, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCukkTfdOcegNPBX+61VrQLhiM/jVguoG7nbnGfepKHbh/cb9KM/wCwfxNOBHWh9gk+8MkZwKQyMsf7g/76opzFeh60UAQQKsa4DEkgE5GOopTJ5HnQ7vmzwcZFLbRtMcL2UfyqvfKy3T7hjPSn1F0LEs4CjYCQR1x0qHzWLlzyfSozKWgVNx4PT29aQ4UZ5z60wLBmzOODjFFVN7j+I/nRRYVyaK5ki/1bEHjtSyhpkWSRvnLYJ9aKKGVHUiYbTtyDg46UmSW6Z9qKKBdRyx7jjYx/3RmiiigD/9k=", + "width": 320, + "height": 320 + } + }, + "document": { + "size": 1346910, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1575923480, + "senderUserId": 327556368, + "replyToMessageId": 2198 + }, + "2202": { + "id": 2202, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Твой дух всегда с тобой 💪🏻" + } + }, + "date": 1575923505, + "senderUserId": 327556368, + "replyToMessageId": 2197 + }, + "2203": { + "id": 2203, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "да" + } + }, + "date": 1575923527, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2204": { + "id": 2204, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хмм, скажем, что мы из «Отдела по компетенциям реализации Digital проектов»" + } + }, + "date": 1575923587, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2205": { + "id": 2205, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Реализуем их компетенции полностью" + } + }, + "date": 1575923738, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2206": { + "id": 2206, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "реализуй мои компетенции себе в отдел" + } + }, + "date": 1575961387, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2207": { + "id": 2207, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вокалистка группы Roxette Мари Фредрикссон умерла в возрасте 61 года. В 2002 году у неё обнаружили опухоль головного мозга.\n\nhttps://tjournal.ru/news/130505", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 125, + "length": 31 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAZACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIxU5mbyDEQCNuBx05zUYp5XKDHXJoASPzYtsyAjB4ahXYxsjPtQ/Nj1NP8zMXltgAHrTNhbscCgBiMy5KkjIwcelFOIx2ooAXYRz2qTrEPTkcUsn+q/GiP/VL/vH+lAELIVHOPzqWL5gVBAFNm6/iakg6fjQAjIcndyBRUsn3jRQB/9k=", + "width": 1200, + "height": 750 + }, + "sizes": [ + { + "width": 320, + "height": 200, + "type": "m" + }, + { + "width": 800, + "height": 500, + "type": "x" + }, + { + "width": 1200, + "height": 750, + "type": "y" + } + ] + } + }, + "date": 1575981617, + "senderUserId": 356765513, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2208": { + "id": 2208, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "😭😭😭😭" + } + }, + "date": 1575981673, + "senderUserId": 860139781, + "replyToMessageId": 2207 + }, + "2209": { + "id": 2209, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Люблю эту группу :(" + } + }, + "date": 1575981684, + "senderUserId": 860139781, + "replyToMessageId": 2207 + }, + "2210": { + "id": 2210, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "так" + } + }, + "date": 1575981834, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2211": { + "id": 2211, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а у кого-нибудь остался вичат?" + } + }, + "date": 1575981840, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2212": { + "id": 2212, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "О да" + } + }, + "date": 1575982720, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2213": { + "id": 2213, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "о наташа" + } + }, + "date": 1575982920, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2214": { + "id": 2214, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 10, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBRVm0Hz5NUwatWrcGpGW5XAHJoqrd7HQCQ9+KKYGdC37sZOTVu3fFU8Ac46U+OUYYFD0pDLNyylRk96KzJ2ZcAEiimJl6NDIMMDxTjAuCMUUVBRAY1YcpuA4zRRRVAf//Z", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 1568191, + "mimeType": "video/mp4", + "fileName": "IMG_2255.MOV" + } + }, + "date": 1575984282, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2216": { + "id": 2216, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хотя" + } + }, + "date": 1575984353, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2217": { + "id": 2217, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "норм" + } + }, + "date": 1575984354, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2218": { + "id": 2218, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "норм", + "entities": [ + { + "className": "MessageEntityUnderline", + "classType": "constructor", + "offset": 0, + "length": 4 + } + ] + } + }, + "date": 1575984370, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2219": { + "id": 2219, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Короче у меня обнаружилась тысяча рублей на счету в инвизибле и я взяла ящик игристого на чевтержок 🤷‍♀️" + } + }, + "date": 1576004947, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2220": { + "id": 2220, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вдрхновение на эггног меня покинуло, в лучшем случае я найду Крем де кассис и будем эффектно потягивать Кир Рояли, в худшем — безыдейно выпьем креман)" + } + }, + "date": 1576005042, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2221": { + "id": 2221, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А все потому что @adikmarov с моим промо кодом заказал себе что-то. Берите мой код NDZHA и будьте как Артём, чтобы я могла побольше заказывать игристого 👌", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 17, + "length": 10 + } + ] + } + }, + "date": 1576005256, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2222": { + "id": 2222, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Артем еще хочет заказать!" + } + }, + "date": 1576005280, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2223": { + "id": 2223, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Давай давай!" + } + }, + "date": 1576005286, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2224": { + "id": 2224, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Артём, будь как Артём!" + } + }, + "date": 1576005310, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2225": { + "id": 2225, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я пытаюсь" + } + }, + "date": 1576005323, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2226": { + "id": 2226, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это что за игристое по косарю за ящик?🤔" + } + }, + "date": 1576005324, + "senderUserId": 54158593, + "replyToMessageId": 2219 + }, + "2227": { + "id": 2227, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не, скидос был тыща" + } + }, + "date": 1576005333, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2228": { + "id": 2228, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Если б там было игристое по косарю за ящик я б взяла вагон" + } + }, + "date": 1576005348, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2229": { + "id": 2229, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я тоже уже разбежалась" + } + }, + "date": 1576005361, + "senderUserId": 54158593, + "replyToMessageId": 2228 + }, + "2230": { + "id": 2230, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1244850129911939461", + "emoji": "😳", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 13868, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576005377, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2231": { + "id": 2231, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот такое лицо у меня было" + } + }, + "date": 1576005383, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2232": { + "id": 2232, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Когда увидела, что ящик игристого за косарь" + } + }, + "date": 1576005405, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2233": { + "id": 2233, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "За косарь, Вот вы там кутите" + } + }, + "date": 1576005410, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2234": { + "id": 2234, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ой, Саша, у вас там в Испании за 7 евро можно магнум кавы взять!" + } + }, + "date": 1576005444, + "senderUserId": 54158593, + "replyToMessageId": 2233 + }, + "2235": { + "id": 2235, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В худшем случае!" + } + }, + "date": 1576005463, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2236": { + "id": 2236, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кстати кроме шуток я как-то была на дегустации русского игристого ХОРОШЕГО, которое в Краснодаре продают за 300р. Только до мск оно с таким ценником не доезжает, кончено" + } + }, + "date": 1576005466, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2237": { + "id": 2237, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это какое" + } + }, + "date": 1576005486, + "senderUserId": 54158593, + "replyToMessageId": 2236 + }, + "2238": { + "id": 2238, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://napolke.ru/catalog/alkogolnaya_produktsiya/vino/product/napitok_el_labrador_vinny_j_gazirovanny_j_polusladkij_9-abcf4d0a-f585-4735-9435-58c2ff4ac8cb", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 156 + } + ] + } + }, + "date": 1576005499, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2239": { + "id": 2239, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "76.5 рублей!" + } + }, + "date": 1576005503, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2240": { + "id": 2240, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Белорусских?" + } + }, + "date": 1576005518, + "senderUserId": 54158593, + "replyToMessageId": 2239 + }, + "2241": { + "id": 2241, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "на косарь можно 13 бутылок взять" + } + }, + "date": 1576005522, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2242": { + "id": 2242, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну это наверн бормотуха" + } + }, + "date": 1576005524, + "senderUserId": 146686085, + "replyToMessageId": 2239 + }, + "2243": { + "id": 2243, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "русских!" + } + }, + "date": 1576005525, + "senderUserId": 356765513, + "replyToMessageId": 2240 + }, + "2244": { + "id": 2244, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А то я бы прям пила как просекко" + } + }, + "date": 1576005549, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2245": { + "id": 2245, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ща найду" + } + }, + "date": 1576005555, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2246": { + "id": 2246, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А за 300 рублей я б его пила вместо кофе прям с утра" + } + }, + "date": 1576005591, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2247": { + "id": 2247, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хмм. Придется 162 бутылки покупать" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAASACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDYJwM9aRXz/CR9aU9Kbt9jQA7j1oLKOrAfjTcccqfzpwUY6fnQAtFFFABRRRQAUUUUAFFFFAH/2Q==", + "width": 744, + "height": 334 + }, + "sizes": [ + { + "width": 320, + "height": 144, + "type": "m" + }, + { + "width": 744, + "height": 334, + "type": "x" + } + ] + } + }, + "date": 1576005595, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2248": { + "id": 2248, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCKW5ikttq7sl8sT/F701UMv3QMA4PNRLCwVx6EHFDSeW4xlR3ANS/IZbt4gl0FfBVjtIq68MNt91zGW7gHn8qyIZmedSW53Zz9Ks3FwtzGp3EMDgnpRFPZgaN9EZYgFAzmsaaI5xsOeuc1u3SF7dwOuMisCZ2DHJ5odwQ60tPPlaMkjC5JFTNppT/lpn68VBaSOpdkJBPHFWftUo4LZ/CjUNDbqrPYW8xJZCG9QaKKYisdNCZ8t+PcVGbGX++lFFTcpH//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576005599, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2249": { + "id": 2249, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хммм, не пробовала. Я посоветую ознакомиться с Лефкадией. Там не 300 рублей, но игристое отличное." + } + }, + "date": 1576005719, + "senderUserId": 54158593, + "replyToMessageId": 2248 + }, + "2250": { + "id": 2250, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Темелион называется" + } + }, + "date": 1576005876, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2251": { + "id": 2251, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Правда не знаю, где его в Москве найти, мы были в хозяйстве." + } + }, + "date": 1576005919, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2252": { + "id": 2252, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вот, а я на дегустации русских вин, и там чувак спецом это вино привез, он сам из Краснодарского края" + } + }, + "date": 1576006040, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2253": { + "id": 2253, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTcEqAOxzmqz30EM22WU7h1GD3qeWdYnVSCS3pTJIYmly1uj5OCxXJrOMn1GOWQS/NGQysOo/GgAEjElJDEkYMafdx27ZJ/wAacxRHC7huPQHPNNS6ASDOBk5oqn9mIlLpcTB8g7WbjGeeMUVDi+4E8qs4wQQQeCpPH6VA8NzuBW5Iz1DL1/ICp3GCAKbLcLbopKOxPHyLmr2V0BHawzW5kMj+azck5xipJCz4IG1h0brj9KIpUuCWAbAGCGGCDSpy4znH0FCV9WBA0V44YC5AU/7PIoqT7dEJPLZJFwcbinGaKlyl0QFl92w7MbscZqoblET97MEk/iwOn4UUUobgS28scsshjOcY3cd6J2ZGUkqIv4iaKKH8QET3duA5aYMo7YzjniiiitUkB//Z", + "width": 828, + "height": 828 + }, + "sizes": [ + { + "width": 320, + "height": 320, + "type": "m" + }, + { + "width": 800, + "height": 800, + "type": "x" + }, + { + "width": 828, + "height": 828, + "type": "y" + } + ] + } + }, + "date": 1576006057, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2254": { + "id": 2254, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was added to the chat" + } + }, + "date": 1576006128, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2255": { + "id": 2255, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "так" + } + }, + "date": 1576006164, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2256": { + "id": 2256, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 1, + "width": 480, + "height": 326, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 112414, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576006165, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2257": { + "id": 2257, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "2 Лизы в чате" + } + }, + "date": 1576006167, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2258": { + "id": 2258, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616505", + "emoji": "😘", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRiwOAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSBoFAAABoLz//5rIYZVTvSd3d/kHenXvWN3b9d1j3d3d3XVwGOaXhOzAJDM/IGXJsCQNC8s8KX3arKZy+o588yNkMiw9NSIguJGkSEpLeTjaXIYnAMBXASQIAAIASAA7AovIvj+iKL7Th/SLohgSRTEiium+vr4L5nJhH3J5X1/flawJV/Ux7OeP2gyIDQw7AOCtuXCAEABQWBNUYDi5B0w2m92cQ7K5OawJj83lw2x2NJfL/ZjL5SK5XDqXy43N/x5PGM5ms8M//fTKgpdLrDJZVQcGHa1BSt0+f7v3ejAYjNn2Ntu2R2zbnrDtqs2g2radtG17j21PBoPBZb4sHgDy0DENoAoA9/Vyybj3vSAIUUHgMpkMcTPMsSYiCAlBEJ66adZ+PiykBQAcuEMAQGdNOL5Xi+RORpblHyVJikkSJ8uyJDMMy7KckqSR+WGOCZIk5WRZ/joef9U/ZTmKAphuLmwVQHNM0AAqgBkAE105O9wxLMtKWZY1ZllVy7L+3MGQtCxL3rGjuGPHjsQOdALFHVjJsvgDZgV9UNJ8tcEBUndZwHoKLAPApp4rfBtpnud/4vkkz0B4ng/xSJzn+e/xjDDP88M8PgHHGsLzEZ7n71jgygCA3KZaHRwG7arm+KHnCqU0QhGJUvozpTSaz9N8Ph+mlCYozeTz+RBl+JFSGqdUpthkHpmglBJKJ/L5/Occxx3qdYmA/O0s5usex/Ne+3Knxhp2eFeNaZqJFrLdNM2IaZpCq/Vbq9VKmqYptlpb0QSGeKvVGm+5o+C5MdM0Dwt4rM9RgUDgJlw7AABYBZ5VyVm9Vs59CXl+3axHCSFRQlIc9jPHJbk2vkdr3EngQSFCyIZ1664NeKrd5z6wUAXzhTUBxF4sKxVFGVYUJaEokoIlFCX3y6ywwvCzoihpxbWUggmK8vVCluSiuAX5oRtnRb1ejzUajXSjUWlgQqNRqtfrkQayrV6vRxuNxuaGa2MNrFCvh4+etd+CFoPZ7nUnoOoIAaQIAKt6rawkhHxHCPmBkDTB4oREHWsShITxEjJM3HNsdGy7aeGKIe8o1ud+xNsfeq2sVFU1rKpqYmqqoGJbVDWrqmp5iiGkquqo2pH5YeN46u0+OYx5sXpX04Cs6rZZqet6VNf1lK6XdIZJvY2IrusZzbWtmqZFNE2jOrLx5JNPXuaPIoA0nBM6fN5jFQcAh/RSWeF41I7NP8g74AnfEiRKCImQjvzsGJckJO7YeN9DD93geUGbAnZ1rMTaWADsd4CRnilLTj755Ls1TUtrmqK1UdGQqt4xXtO0sIakNU2L4q0jU1NT1wQ8wX7f6ZLnxQEyCQC3dc0MVKvVkWpVqVQqU1WvVFj4SqUSriKkWq1Gq8hopVJZfTpylKfFg1cq7e8jbfwBCA9IuPfJtYSQnwhJoYf/joUJkmS9RifsuYxVMceaFCGfPjbrbP8cRqANAzAXNQHYLoBxABjqbTJoGEbaMLbUarW40THNaOPXmjuGYeiGYcQMw1BrtXStVuvz8DBfEQBgj+OH7paBcrmcLJdpuVyOlnwlUi6XC+VyslQq3Xv+LI+e9/xYSAYAlu3748njfpj4SpygD1OijhfyTz333I1eHOZH44D9C/Bdj5KhaURrNpvbp/0o3Ww2U81mszY9ndo+6yKXBY7DfFsirjEAuLoLpb+ISAW/ihUKhUihUJCLxWixWLzMVS0GzB96kJyyapG4Z9Wqm1etWnV8YNH73//8J0gAVlA4IOwIAADwLwCdASqAAIAAPlEijkSjoiEVijYAOAUEoA0fZGYB6ldsH6Z9S70R4A5hcwfYh+s+4j6M+jXzBv1M/zvVP8w/6zfsl7p3+w9b3oAfzr+8daR6BX7Z+mN+0/ww+T5mjv9A/EDwV/s343/tp63+RP0L7d8jBm7+R/rn7WeyPgT8NP7D1AvV3+Y3tEAH5B/U+JL67eVt6df63xa/q/+U9gD+K/2b/v+n7/w+ar6w/8/uH/zX+4/9bgIEWN55+MZwd/DjiLCBfmaPaQOSWPum0ifeh2LsgyLLSjLxLSNFNVuEcT043kSBSND6F/WDTziB/KgaYhWrv1y7qY+BfhIPqaEcNJoWC/nr1lwJIF7aGg/fyLfxieGR1Nydmvfa4Znj4W8eBMDDDdGT6j+orSdNU475mxdQYqEuoQWRHfAGsfpXiWaUPnAr5DOeIRLp+R/OsdL703nf4DoS1pR+VZHfmLbJxeAcCz0T6PLvGGI5HrH0u0Okn0NiXS+STrPiwklfcUsd3jwTJY+RgAD+7/6Q8sH/6GQ48qq+2FCp3nPG7RSdBScp58Hb/Wiw3MCRISwah1vsRNPnpuKrNqoAyxavQ+azqhjUMCmqydjotCjUiRAcVZX1KS6shPnWAmAQ/AvngwFAGExs2iQc/MnkbyVygWBaHeVCSACGZVIKPOMfF2GmAT1xRvLRrzHadXQ7DRUtxvjrOlg3FwyjP0zp6XH1XoATVo3TQwUv7zyejSA1InhWcRaChxDB5Jf7ak56sH5qT3g14ew9faqt4DUolxUoKcDLMYrpT+/h6SxcNm+iYxL59nkeMKs8ztKul2LurciNOgazJnpJ0UuHvNZRgNvClzZNG2YIKS31T34ziMFKCWVz16rm1lvDD8/NiaypddJhbigORWtY7vvy27c17oY9NEKm3K3O9aeuW8VEtmigc//eS46/eKxN+fCDULVRyYJTbt+v81vkZdDWpn1lvt3bpH5k50iO513/iBkwzr5BVQpi7dTyK+1tc5LTzk1N2H4R2ygfCvg/dqOJwufDNT2VKVzbBnNt2HA50UNLBLgmua7n6UCVhOCGwK5CJIgWENYcpWyHuYDAyutZbUBKgxTA7oZeaZS5rM+duxwa8E6GfwlD6y6Z9iRFfB1ICh4J9IoRWd7x0uDLiYYNqoGSkHPGlNwOAl46cNZi/uk3J4ZaAFsG3+3PBMR6h+Xy9gITOQFQdSOkuHHfmkm7QGJpTgHkHR2gwgaC1GrUlfQtgsS9mcIlHjDCD9VL0zV4bYkggJ9drCZ3tN0pEFPEqpKrjcZEIVBMcxuY2r1M/s31JHWT9KFFqowbdoI17sismRqKafLZ3xYxvfsYJfrJ8zlJTqRyxmF72asDUH4DRcpSvr0nmkb2cBTI6V9SqHt/E3ScNEwGytl/qtqnW9G43mNVdPgxrrLfylmqCIxqI31B//uwNgIYUoaIcWeBVhbnQLo0ok7xuLlgWPXmHFT5+HGwNZGtGu9cRLvm/LVNZ3b82m95U5SLhKhhsHBEm1cU6Z8ve9mLTYDZPd7JFVV/9w7x4NTr7/D2CZfec0bkiP2Bg3tKcUHD5UzWsWChztSI/fiZK9ximEj8IUUN18R9nbL2mkMG5IaYkRgZ+DQDYgu14/xHOg3bEL/DT+DdyDOP/+NreL9yNlJp/5qa+xLy7J2VuuErGrOSjnLsx4DRVe9zJUWo8L1i3yPxWj46TUWfOntLivw1AycM2RD0PvRtdXwtWXyseQs1vWQ7kQidGEkHs5/kaYbpd6MN8sm5ZNUOOTW9c6orIvsAyNM0vrYDcJ/1e/wtzU1YcDl4qU/52QrxuSdrzjcclumi80858iYY4kPLhWHs2B+9c6rxr4Rtu3EIpAYoRBGlsyqagZBx+vXu+o9Tj8tjUvp9sw9wnaXa//QPCNuSHaEURxfJH3syEnigw94zAGWvAEKLpKOUfLokcVRoHUl8B9tSSzYlfJRVo3Xiy6295wuzEFLMxpt5bGTNJIbyszZD6saJYthyfTtLytPsx6XZ13TWbC+ab2p2NEO+ufQ+BHvL8nXj3+nb8QF7whskOVd3OPL/SL9jDk81t3gSEMsXs9eWNvrW/QFQroed1a62XF5UA7JpC4Kignkcth/R/oUbtapi1D0sguAsP3ugRLI2lAPNNjllvM//4PP7jmPq+VHjBFT6yNI9UB2rxivYAd2LCsj5W97Pf0e3GNP3awingbVRcK+36zVFY6gxbJPTWcs2E/XAryRCxclDmqgY0MX4W2OYL1yeORwfBMcDCgKP/7PEHsbQGPWUGA5cfh6qTbhfuZLkxorkL9RTU52R+FT8CRx40EOKk/ySyOdkQkcME5gKdpjmgY5d9tYT6Wwf2/m/Mffg8rFq6DNIOZwL7YNUJ6hH9RoeHs/Szk31I54YoVR7LkdagGNXC91tRXLwMUFcKHN3PgOAGv8DYNcthxdo/ZnCm+33NidyQkBZWpz4NZMPidoVoMzH2/yNiuHCEw8BJuWyeu0ulMfX0OLfLW65qn1nzwRzUHvuzjr/OoYUuQh8v1SCzOyGGJ4xXLMtK15/4SCsUMjf+R6Tlhhcc6Jpfzd83Se0cH76E4iJip0oT9tQf2lYBEiBgVUAke/gjiIYcVvgQFmeiQs0TFYvrj1OaX4dlvoIA/Ykd+eTdd7sNWDHj6cVKdQpTHJP6szL2syYkwpf8sYx7jXitkOq0aPoaU2qvWaa8K0NcQ/B2uQue0eTpI5B3nOaXXdqDKlMfXN1btpR00Jp3Fb0hZshHhhNcpoZwm10VADy5m2Rb/51Hu5bqA7TSLWkwCbzsGXGRmQ2rtlP1kwCJnNyzWrwDmjln2LnAlrIDt/zhrfDx25f0KZPdyLn8nAgVhqIkXiQWBfP9P4PdiGeobgfY5ZNTLATRSxAMwHUcV3bkH9a37rnLk76O3UqyNajfvmpyvtMZgkmIHhaOaYmsQhzNZgwD2hZNEbqEwLvtHOPT/Ph0sMRKf/vnattqI9/nXXq2+CuyXgRc5g4Go7pZdxoCzHNz/dD/9FYAAAAAAAAAAAA" + } + }, + "document": { + "size": 21072, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576006183, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2259": { + "id": 2259, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "загадывайте желание" + } + }, + "date": 1576006184, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2260": { + "id": 2260, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Краткий пересказ предыдущих серий" + } + }, + "date": 1576006191, + "senderUserId": 146686085, + "replyToMessageId": 2219 + }, + "2261": { + "id": 2261, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мне нужно написать сообщение между ними" + } + }, + "date": 1576006193, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2262": { + "id": 2262, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так ты и написал" + } + }, + "date": 1576006205, + "senderUserId": 146686085, + "replyToMessageId": 2261 + }, + "2263": { + "id": 2263, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Надо чтобы ровно" + } + }, + "date": 1576006211, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2264": { + "id": 2264, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "сначала @lizazhdan а потом @pseudoliza", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 8, + "length": 10 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 27, + "length": 11 + } + ] + } + }, + "date": 1576006221, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2265": { + "id": 2265, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А галицкого вино пробовал кто?" + } + }, + "date": 1576006225, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2266": { + "id": 2266, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хочу чтобы стас Барецкий выступал на корпоративе!" + } + }, + "date": 1576006229, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2267": { + "id": 2267, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 320, + "height": 240, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 109712, + "mimeType": "video/mp4", + "fileName": "raw.gif.mp4" + } + }, + "date": 1576006231, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2268": { + "id": 2268, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ееееееее" + } + }, + "date": 1576006234, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2269": { + "id": 2269, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Куда ровнее?" + } + }, + "date": 1576006244, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2270": { + "id": 2270, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC1c3qWe0SBmLEkbfSoDrMHaKT/AD+NM1aPfJF7A1VEMajDtjuOM1LlZ2KjC6uW/wC2Yf8AnnJ+lXoJknhWUZCt0zWBJCoBIfI+lbWmjbYxA+/8zVJ3FKNge1Wb5mkY7SRxzTDpqOR+8cYH92pbsSeWDG20g1WimlG2R5CVJx0pNK402loPfS49oHmE/hVmKIRRKgOQvrUlFNJIlyb3GECRCMkc0w26nqxP5UUU7JhdokjGEAyWx3PWnYNFFAj/2Q==", + "width": 922, + "height": 1280 + }, + "sizes": [ + { + "width": 230, + "height": 320, + "type": "m" + }, + { + "width": 576, + "height": 800, + "type": "x" + }, + { + "width": 922, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576006250, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2271": { + "id": 2271, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "186649756741665199", + "emoji": "😏", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRrgPAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSGIHAAAB8IZtmyFJ27bladu2bZuXbdu2bdu27evqao5bY53TV9e0Ma05e6oqYlv2HxkZEZmVl7FExAQk/6fp4VffdMcDrtr7b9Tud36ge35dV6Vt7ULPF++NsfeRB5TbM7b0tayuSzLsWlNZs+YZe/mc84LvDS6ObJ6ZWvmFm8vqtLaeHqUBpdd1Vu917fn4jumutm01STvWV/q2PamUrh9rVRpQ9rLhD6eeXF25tCHf3jVf2698bphYIUkg/+k13z/wqs6lWxVaq6zYr2xOHV8pSaDQmf6F4aWK2fbNsmltlwTKxHNmqKKou7beXi5Prc5JIDegTJiZJG57a6nstmWFJOQE5A2Ku2v+hDJ56FJJKA1IhMZh2SNKZI+2IYkUIEIlCCG9c81fTi6No37fLglJZMsXtwvfdRtnBr5+ZyncO1SRBBJuhaeQyJQTaVvr2uVXNN3eHxvplgQSacUmU54gSctHHtdkR3d1TkoCgQDFB6FAQNJ9Q7c01cWb2yQJBAIUCpAhCJIAqWPjXk30oIE+SQKBBMomXBIQJAFafXnzPHr7FkkggbzINCnjACkAt2YG//CEpnni0BZJIIF8SAsLYC1gHekMvC1LPtEsTxraKgkE8iZtwRoDSBgL1iEnYKyxKdOoW/jBbs1x28hWpQTyBozFIiGQAITFAqTAWCzGNBrGWGzDsOHAZjh/rFeSAOQNxmKRUpJAIAmLNYDAABICCcCahc82wVED7ZKEQf5gsMiJQAKHhMUAGJBSEoBEY+YXTfCbFknCIH9ogDIhJWVIYIQBechhB44q3kuXkbIKxYCcpI11gkuAQBk4JVg4u3AXjY1IEgTJggALWGtJp7AWJFlAGYAkx+Kni7bH6lZJAoVjASwgf7CAtYBNARibNhaoz+xRsBd3y6G4KBtfSQKLAAtgLYC1gMSO84p1WHUgRSw3vpIA5MZaUCiz9xbrky1yyJtMB065ycyIy+w9hTp5ZiKFfPF3KZx8Ti3Uh1okCR8AZeJUTLIgwvxwUuT9R0YdygbkHwe8IGj0i9/63ffeevcBBXlhpwIAhWaAB4C88GPyfoCFtVu+cUEhupel8FI4uPzlmQKywCL32MA7CnDiZM2hTHKQvBQgnA5r5cnoq/J7YauCFE6WO0yAJJwCfMTU4bn9ritFXvIlrVBAaQBj5c9X89pjcdShfOSPYpKWExOyNa/zBxWkJvUQAVpzbk6P7wijSXwBv+WPyum9LSmi4SyaBF4rHpnTT9oiQBZOa4DigCTAY9WDcqosDxKAjzGkDekikGk9qkfm1L0hLJS6TfnnAMYYAxhBBtUk563bHSKaMBiXcRmDrwO3MRjcUlbjvXmNV3OTUsLXy7gdBqcFSQKH3bhXXoMDLpGDwFhQOpWnAYPcCCw7v5zkvXprVjqWJMCQVmaYAAMoG4y1bPpLbp3rM5y4Y0gibciUJC9jDCjm6Fhuv1nq5ybTD5CEMcZaa8EYg7+iTx+V1xcrMbLxNmCtQcXvuy2vl7XkEYpnAO54bS/O686lxUk7RETl2PK2vI4dL1aaYOXc8sG8komBwhW98tncftxecm3fyO35bSVX+XJuZ040JFFeLR/MLenrLrnX5/fqSrl1PiPanqdeedPlpydJcty2ctt2eZzj3tKxOLp22cbxkc9flvzlfqHSnqntHePgLzTW9owrDfO/f/1Cma3qSSJeXu2dlidjO8fLrP2NES6cWqnAnXOmvCbnjg3bb6CiUGyJtfw0CX9/t8KhUVZTgxeFHb24LYIwlFTHS5PwVyxTXKCMVvcnEXtGI0kCysbauQ2XBB26i3gSUCbGAiy+MeSOqvIFysJYrJFE4y0Br5vLSQID0HQWjJzUb/L7sc1NAongomGsUTYbdvcaoCDBRI4FyJ+pJ3rN5weosMRW8OD3vExOgJoZRTbTPvsrF0DNHQ0d6HFMDoCa3gP8tHCUx0nRAJVgNBrHeuwTCVSOWQTVEt+ZKNaoLMhSwGavtYsxaJSFYtW+6vXHkb8BBE0/yutTg+VGyiJ/agd7PWI8iikNObABtR8n3ofUiGFLBAlMwOQ9fsmaOJSGkKzFj8ndAt47VnZg5N/4QBJ4/g4iUCLCgh+LJ4Ukv1pfcgR9Lwm+eaYewVAamBDuPz4s+e3GIJVK2st8LYl4eHUuzJaHAeTL4tExkqtqBAFlYa28WHhYEvfu+RolBXgx/4Ek9okrh8bwM1AO1goP5n+zW7Rkz+d2D7WsXgSoTQ6Oa5LxcUPzAUKZ7Hr3bkmuV3xqyYy00P+9dz71jgtPu+PZn+2pj20aWKSZDFYZ1GdHbkkKv8+1L/3OlsbQ+vXb6xQPwApMHdi5WP/JHUmzHnbPm7+zfEd9YPW66i4oAvXRLRvvmzDzPd96yUOf/JgHP/et73vFvefumzT74Vc/6W3fXjaj2aHq0MQCobXp6qbepZU//Lmje/OE0WzXF156+zFJOe91zHk3PPipL3/3N/6wdM1fh0cnpmcX5ia3b13ft/T33//8+1///Mffe+15xyT/Rg1WUDggMAgAAHAlAJ0BKoAAgAA+USKORSOiIRXJDag4BQSxgGlzIC9vUHOD7Jc/QR/5da71X/nresc8H5x+/d71HgDf927Z+gM91ye6XfEDvX2uN4XAB+bf1v0fpkCrbIB6Geet6m9g3+bf3jrAejn+0CD0uCCQGVELVivEf71ba+wE6zK/o4NH4qIMDLS0x9Fm3NmqKDTMKqkYsJNlfg2K9XarhfUzyfWRGDktrZ1UbmBohIWwmdudx1790WyRzuZev5IVca+XY8Drj+lrOZSossED+PnEIN2HZzScQryTV0wPSZoMBq9PiHoT1xj89WoAR8dgzvfAQP1xXP/oDb14VMP+nkmI0kWkvAEHgYNUjoUhi4LziMvwW2M9799GQdknwa7hS2WphjvEREYjyzP54aVox/hRsfHrfiQAAP7+BtAABKtVGECwCbWGOYE7AUiww/cF14br0k9mWVU9k4f2Wpx/WzRGzl3s3lod+IsClK7MhJupvYsTNTJJLZUCPo0NUPHV7INtrhU7VjAuF7hu2Ou5fq/n1VyaQnRBfdv+wAyqQXNa6KPw2CI3xtF19EwoWY3KEqrydJIDai9mr2KNA/dOYC3JbBzAAlCFsMAeGkuFgjzcYhJGPOgxqo450ZpOtoy5fP6NOY6IR5pD5cXGhV5iNhsgCnqV9dTaDhY+hvaRBoyZTKZV+CH+0QGlUNrfzEtHt4dz5hf+LCB+04bBvVmmGPXoSbKldknAvkp3Tt+csp80cE8vS3yd3F3oF4XdNRBF3uV+xDrr6/Ufs0ydIs++LlBK7GChg8rRS7dikDTlRdQgyj3HDbKmxNPEGwL376VeHy1wVURXRL5+xFlTa1YglySoUQLmq/r4tqwYoDO1DFKErxx1JF5hp70vxRf2NtOMKBnf7v/cW9rY0MeHyd072OI1vsyc2D5/CNhbQBq896XE9jc2YtvwKgxUjLviaMePFgThqhoJ0ji2syBnLQOPtfU62ymzts/7q0FwZ1xumaeNomX5lxZls1m0dx6Y+jh4v5B5MVJ4HAh4x10lGqX/i+jBWkl1Cz99HbP7xsPwO95LDBzWKas3Xsy+2T9DNMHkjffmrEpq3sxINZ5DRmjonNkVt8Fk39YL6KV33B1yskANpXMZhXV9N1v6WTFvUc1y1IivunacRT9TgnrZzhgc1qNWsZUr7yDVF+qd3//ybFBP8aWxH3K/nege+P08BzgF6Y3luo/NOO6h/sZrEfoJoSnbUdQTwxgpL8dJeve1U7rrFpAlB7PkyCd0H0PHJAcAxJ5Fgoss8eu/2hTXDYVV7wtP/S5dIrU/Cavj//M8Xoq/k2+64BN2QGdw731loJCmbdN+sC6zc51h9F7Z6ko3PV9RQw7aEjhso0WF7OVTrQEv27yMFyEiboKIaUJDOtBoRY8nETNs46eScl5niEmmK07nv4gKaLpJ0MU8r+2np1gjrnHX2Me9Bi+If+fnUV1NY39Oh1gRiEL25HeZZHD8JPzUaEY7WJFr6OFzL+/PgbaPafiuwyv8bDnBN8XhcX2idhOZVBKDqE6MPyKYBT9GVFzjFZnMX/7Xz/8HYjrL12X1UGTW9Mxb4+bJ3mF/0GnlwOPKqJzmiPA4tRVDfG5PkUF//uMsODUbcAxAWI4TwM9g09gDl9MwPntLav1cyrH2zMy/0laYpvDbQTtuBc5Qw+qQwyZuW7KFIamFQgNXBj2rZ63fOW8QIiSFAZJwKaf07/bTeOjV+UbiDyN3ei6sNzUPtuJkPAyUNsqoXBSfFNOJ/ivA3yI/YOt//JLD7XbE1zoqIVLA38r8bjYKei727dK6CgclSlvZMgZWp1SiL/5jaMcrX2gurPEbNoUKe/CXiPo/fuxkhYw0UWCGEJaNhmgXTSUqWwEwyrYayGo48ApXgTTrkQ75JhAWqb9HnYeqa6Hj3rFaVccivx4GdKJPrV9UsiT0QFydmAB4v62KrxnuWBgO4+Ig8bevBlY2tqxCrfc6O74PZQBQUaUQXYtmE3dwxikzb4Sk7qrFQSBlBr4O6lh4UnZDN2gxRkljooieS3E7SdKyu3Yzn3k2KRsuZ3vf1TN0RXR+D3TaPRJXouLNSwc7tjYCnD1Ag6X/0LgtYhf48X/Uwr1JXFm+BkYWrlKDph2RN5t1+X9dfOPquqqOHRK1UYh+Xq9YC++4HI4ghsfvUZj5ZRhc9cbmi+JpJbSCngwDZTSXxpBwKlLghQAAAUnIaoEv38qSZkBnsyld1FS+WXpLGjG6l8GaCR5AODPQarAddpDISpl+DIcCzjIrm9Y10Qdd5jFc3c5Zd65sza2F1x37khP/5Exve1+gWTSdHMF2qlmdVjeE3XNCjavty1Vju5mL27u6cHx5J+nRSj8cscdYzcYYYSocXM6giw3VYTpqklJtgmsQqftgc8g6OBde1pnGaZCBloxpibsZegHdo9EafZgPuQrt46WplVAxDKFE/MdrL00LtXS5lSbdmv5SMda287iUhG/oHm36+OLwo/Mpmxbzv/yrYR+GxynQ9ely8TSjxP31/ii2c24s93xsqBO490WkheIcBKWuL8sb1dbLivzdlE0D4YWYTQqrg57gT3EGFrnwHOqJo4f/XhKuRiPad8bRMbraduHLu3hifOy0/lbsBJYyAnhz3G6D6wUQPZ9M53IC0SQWZigeg2QqkpCA/toQdFajwVM1bZflDThwsI8UGDyNqcFFi+32KIm/755GJzrZp4h9z2I8yZi9cZLvB1uJVsBe1lKUv66kCAK4FszkjI3sJFzh+M5ncsOgfpL9/erGhUMZnm4IAAAA" + } + }, + "document": { + "size": 18874, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576006261, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2272": { + "id": 2272, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это уже комбо" + } + }, + "date": 1576006265, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2273": { + "id": 2273, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "надеюсь что сбудется" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpImIoiYdoI6561Fgeh/MVJEiysqhmBxzUv2Nv+ex/KmIq/L2VvzpuParTW0gJyzY9cUq2pYZEx59v/r0AVKKluIzE4UuW4zRQA+y/1/4VolcJnqTVDTxm5/A1auLrY+1UJxSb6DsPDySKp+UE9ajiBDuh7HIqH7YwJOwgdhS29x85MnU8cUloN6kV9/rl/wB2ilvyDKhHQpRVXJIIpGicsvXGKGdmYknkmiikMBO4GAeKUSMfTr6UUUDGu5fbnsMUUUUyT//Z", + "width": 854, + "height": 756 + }, + "sizes": [ + { + "width": 320, + "height": 283, + "type": "m" + }, + { + "width": 800, + "height": 708, + "type": "x" + }, + { + "width": 854, + "height": 756, + "type": "y" + } + ] + } + }, + "date": 1576006292, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2274": { + "id": 2274, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "от души" + } + }, + "date": 1576006315, + "senderUserId": 177121435, + "replyToMessageId": 2273 + }, + "2275": { + "id": 2275, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хотя бы на ВТБшном" + } + }, + "date": 1576006347, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2276": { + "id": 2276, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "надеюсь, ты загадал чтоб мы чудесно посидели в четвержок ❤" + } + }, + "date": 1576006354, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2277": { + "id": 2277, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я могу принести вкусни в четверг" + } + }, + "date": 1576006369, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2278": { + "id": 2278, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "если это актуально" + } + }, + "date": 1576006374, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2279": { + "id": 2279, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ОЧЕНЬ" + } + }, + "date": 1576006380, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2280": { + "id": 2280, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "принесу вкусни" + } + }, + "date": 1576006390, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2281": { + "id": 2281, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "на самом деле, если у нас была полноценная кухня с плитой и духовкой (то, что нужно в офисе), я бы давно забросила основную работу" + } + }, + "date": 1576006413, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2282": { + "id": 2282, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "у меня ситуация: вы ничего непонятное делаете в слаке, а меня точно не будет 20-го, поэтому я хочу вечериночку на этой неделе ЧТОБЫ НАВЕРНЯКА" + } + }, + "date": 1576006415, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2283": { + "id": 2283, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и еще Антон будет в четверг!!" + } + }, + "date": 1576006420, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2284": { + "id": 2284, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "можешь договориться с нашей текущей кухней, на пол ставочки" + } + }, + "date": 1576006432, + "senderUserId": 356765513, + "replyToMessageId": 2281 + }, + "2285": { + "id": 2285, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "за завтра успеешь медкнижку оформить" + } + }, + "date": 1576006439, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2286": { + "id": 2286, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А мы 20? Вроде ж 27?" + } + }, + "date": 1576006444, + "senderUserId": 860139781, + "replyToMessageId": 2282 + }, + "2287": { + "id": 2287, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я делаю такие вкусные ребрышки, что считаю нужным всем не веганам их отведать" + } + }, + "date": 1576006445, + "senderUserId": 177121435, + "replyToMessageId": 2281 + }, + "2288": { + "id": 2288, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "НИЧЕГО НЕ ПОНЯТНО!!!" + } + }, + "date": 1576006461, + "senderUserId": 146686085, + "replyToMessageId": 2286 + }, + "2289": { + "id": 2289, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ааааааа😁😁😁" + } + }, + "date": 1576006468, + "senderUserId": 860139781, + "replyToMessageId": 2288 + }, + "2290": { + "id": 2290, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Но если что я просто бухну в четверг и 27-но" + } + }, + "date": 1576006473, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2291": { + "id": 2291, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вообще не вижу проблемы 🤷‍♀️" + } + }, + "date": 1576006483, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2292": { + "id": 2292, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Sounds like a plan" + } + }, + "date": 1576006484, + "senderUserId": 860139781, + "replyToMessageId": 2290 + }, + "2293": { + "id": 2293, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 480, + "height": 368, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 164918, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576006502, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2294": { + "id": 2294, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 480, + "height": 360, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCHGBnNN69jV/ZGAOBSMUUcAVFyrFEqcZx+dSRr0yPxpx3MeaUkAgGrsTccF96KarIe9FAE9MIJOTj6VIKCM1kaEBQ5pGQY/wAKsbaTZ81VdisQquKKnwBRS1A//9k=", + "width": 320, + "height": 240 + } + }, + "document": { + "size": 1254120, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576006521, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2295": { + "id": 2295, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 1, + "width": 480, + "height": 664, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjKS454FNCOeOckjvUtTR2xnTOQBnvUxqNaGsorcq7CD82c49e9PUYUZ696mnTy5SCR61FUym5aFRilqJUsdy0ahTGSueD71AzhRu6jPSlJypAJVSc4B6UglroSysWfceSR1ximZoD7osMcupxz3FNzSGtioqSDd8pPHBJqzvP8SnPtRRVmN2hikmUttIG3HNPziiiiw7s/9k=", + "width": 231, + "height": 320 + } + }, + "document": { + "size": 302550, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576006524, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2296": { + "id": 2296, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 19, + "width": 480, + "height": 270, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 1200633, + "mimeType": "video/mp4", + "fileName": "gif.mp4" + } + }, + "date": 1576006585, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2297": { + "id": 2297, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "жалко, что у нас нет отдела бухгалтерии!" + } + }, + "date": 1576006592, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2298": { + "id": 2298, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 8, + "width": 320, + "height": 256, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAgACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCBQDjA6DrUhIKY3HPpiotxVSSMYqD7W47KahGki2cHrRgAGo45g4z0NSdQaBDMUU8cUUAV1lWRD83OKpU5lKnB/Sm1SViW7jlcqcir0M6OMd8VWhSNkbcRn609YFDArKBSY0WyPlBBoppKgY3j86KWo3Y//9k=", + "width": 320, + "height": 256 + } + }, + "document": { + "size": 243888, + "mimeType": "video/mp4", + "fileName": "663.gif.mp4" + } + }, + "date": 1576006631, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2299": { + "id": 2299, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А разве вся эта фирма это не отдел бухгалтерии?🤔" + } + }, + "date": 1576006653, + "senderUserId": 54158593, + "replyToMessageId": 2297 + }, + "2300": { + "id": 2300, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 5, + "width": 480, + "height": 268, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAWACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCiVUAep9ai6tjb+NT3E/2jbiIKQP4RTUjfP3G/KgBoSkKVa8tTGOcue2KhYH+6fyoTuBCSF5xRSMrEcg9fSigZ0CIqjCqBSsAwKkZBooqQKz87VwMjHNIVG7nrRRTAVo0x0/SiiimI/9k=", + "width": 320, + "height": 179 + } + }, + "document": { + "size": 383527, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1576006656, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2301": { + "id": 2301, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "прочитала “ферма”" + } + }, + "date": 1576006663, + "senderUserId": 177121435, + "replyToMessageId": 2299 + }, + "2302": { + "id": 2302, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Это наш отдел бухгалтерии." + } + }, + "date": 1576006663, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2303": { + "id": 2303, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну да" + } + }, + "date": 1576006666, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2304": { + "id": 2304, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ЯЯМЫБУХГАЛТЕРИЯ" + } + }, + "date": 1576006690, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2305": { + "id": 2305, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "502972616328347710", + "emoji": "👍", + "isAnimated": false, + "width": 512, + "height": 148 + }, + "document": { + "size": 6046, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576006693, + "senderUserId": 327556368, + "replyToMessageId": 2299 + }, + "2306": { + "id": 2306, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну каммон, у нас какая-то нетрадиционная бухгалтерия: ни одной фрау за 45" + } + }, + "date": 1576006727, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2307": { + "id": 2307, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ля ребята мне так надо работать, а тут с одной стороны вы, с другой — бутылка ркацетели, которая манит отмечать, что мне пока не надо пить антибиотики (но это не точно)" + } + }, + "date": 1576006755, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2308": { + "id": 2308, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Уже второй раз за день высказываешь этот консерн, ничего не хочу сказать, но уже сказала" + } + }, + "date": 1576006759, + "senderUserId": 327556368, + "replyToMessageId": 2306 + }, + "2309": { + "id": 2309, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCBLjMnf86SecTMvGKdFaYlUlsjPIpslrtkwCeDU6blakcr+VjHOars5c5Y1amgJAweRUQgA+/1ouhWZok+nWmvKByTgnrU0cKlOSSfrUUnXGOQazfZGi7jGzKoZWHHY96iJ4+ZT+WacQQSepqykyNGFcZK+tPmsK1xASrFBwOuKbJtUZPrRRQtwKzSHt0pKKK1SsB//9k=", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1576006788, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2310": { + "id": 2310, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я поделала немножко крисмас шопинга и очень устала" + } + }, + "date": 1576006801, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2311": { + "id": 2311, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 1, + "width": 320, + "height": 192, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 42057, + "mimeType": "video/mp4", + "fileName": "file_2018-09-19_22-00-35.gif.mp4" + } + }, + "date": 1576006806, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2312": { + "id": 2312, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "пусть будет" + } + }, + "date": 1576006814, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2313": { + "id": 2313, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ой тоже надо" + } + }, + "date": 1576006830, + "senderUserId": 177121435, + "replyToMessageId": 2310 + }, + "2314": { + "id": 2314, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а я так многим людям хочу столько всего подарить" + } + }, + "date": 1576006839, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2315": { + "id": 2315, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "что тяжко" + } + }, + "date": 1576006843, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2316": { + "id": 2316, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мужчина мечты белоруски😁" + } + }, + "date": 1576006847, + "senderUserId": 54158593, + "replyToMessageId": 2311 + }, + "2317": { + "id": 2317, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Потратила все деньги, даже с пропуска таблицы" + } + }, + "date": 1576006871, + "senderUserId": 54158593, + "replyToMessageId": 2310 + }, + "2318": { + "id": 2318, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а на нем деньги лежат?" + } + }, + "date": 1576006884, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2319": { + "id": 2319, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Основную часть денег я потратила на себя, так что как насчёт получить немножко моей любви и принятия на Новый год?" + } + }, + "date": 1576006898, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2320": { + "id": 2320, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "тут вам не Яндекс" + } + }, + "date": 1576006898, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2321": { + "id": 2321, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "звучит прекрасно" + } + }, + "date": 1576006913, + "senderUserId": 177121435, + "replyToMessageId": 2319 + }, + "2322": { + "id": 2322, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кто знает..." + } + }, + "date": 1576006916, + "senderUserId": 54158593, + "replyToMessageId": 2318 + }, + "2323": { + "id": 2323, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "УЖЕ НЕТ" + } + }, + "date": 1576006929, + "senderUserId": 146686085, + "replyToMessageId": 2318 + }, + "2324": { + "id": 2324, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "так вот почему всякие Иваны постоянно пропуска теряют 🤔" + } + }, + "date": 1576006957, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2325": { + "id": 2325, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ля помните старый мем про Ивана?" + } + }, + "date": 1576006973, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2326": { + "id": 2326, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "нет" + } + }, + "date": 1576006978, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2327": { + "id": 2327, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "🙁" + } + }, + "date": 1576006982, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2328": { + "id": 2328, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нет" + } + }, + "date": 1576006982, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2329": { + "id": 2329, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нет" + } + }, + "date": 1576006986, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2330": { + "id": 2330, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "сами знаете, чей ответ" + } + }, + "date": 1576006988, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2331": { + "id": 2331, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ты тут главный мемолог" + } + }, + "date": 1576006996, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2332": { + "id": 2332, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "оох, обожаю чат" + } + }, + "date": 1576006997, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2333": { + "id": 2333, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "скоро будут вопросы в стиле 150 + 150" + } + }, + "date": 1576007005, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2334": { + "id": 2334, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я удивилась, что на вино за 300 никто не стриггерился" + } + }, + "date": 1576007024, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2335": { + "id": 2335, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAdACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDTeaMowEgyRVfHIPmqcDuenSrUwBibJIHXpmo44lcpIGJIAHTFA07EHp86j0+bp0/+vRjhh5qgYwADUpt2XcxfjnoKQ+WzxfvPmI+X5ePWlYfMyZZogoHmDgUUsUYjXAopkkOoSyRWxMQ+b1IyABz/AEqvp13NPId2GjI4KjoRj/Grt1CLi3eIsVDdxUNjZCzDBZGYNg89qALIPJz0rPt5Xj1A2oOY0BxnrWlWRGT/AG3jjlj0Ht/9agDXopqnJIPaigD/2Q==", + "width": 1258, + "height": 908 + }, + "sizes": [ + { + "width": 320, + "height": 231, + "type": "m" + }, + { + "width": 800, + "height": 577, + "type": "x" + }, + { + "width": 1258, + "height": 908, + "type": "y" + } + ] + } + }, + "date": 1576007028, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2336": { + "id": 2336, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "там где просто поп орет ИВАААН" + } + }, + "date": 1576007039, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2337": { + "id": 2337, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, чот взгрустнулось" + } + }, + "date": 1576007065, + "senderUserId": 146686085, + "replyToMessageId": 2334 + }, + "2338": { + "id": 2338, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "типа\nскрин из ассасина\nИВАААН СЛЕЗЬ С КОЛОКОЛЬНИ ОКОЯННЫЙ" + } + }, + "date": 1576007076, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2339": { + "id": 2339, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ладна" + } + }, + "date": 1576007082, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2340": { + "id": 2340, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Лиза, это больше грустно, чем весело" + } + }, + "date": 1576007097, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2341": { + "id": 2341, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "102120784561964351", + "emoji": "😞", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 16864, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576007110, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2342": { + "id": 2342, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "2112768758786293799", + "emoji": "😰", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 19364, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576007118, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2343": { + "id": 2343, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 316, + "height": 320, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIbBY7RgZ4zT5cnDZzj5SQe4qxcWIUFon3YOGBGCPSoIV3SGJyFDcHPY0k09UFhiruOMgcdTUhVWYneoB7AdKQLtJUnacEENT8gMMuh/CrRLI2wCADniihwD824EnsKKYF+AyvbwlMnDYb+lXEtEO5pEG/uRzWXZ3n2ZGUqWB5FaNnfJP8p4fuPWs0i29ChqEEiSb3U7PuhvWqe1uTg49cV0k0g2YABzVC4leFd4QMM9u1DdtASvqZI9KKvG5t3HzQgn2FFO4WRQ7ZpyuyFWU4K9CKKKBFo6hMQMhM+tOhvWXPmjOPSiiiwXFd7OXk5Qn0GKKKKVh3P//Z", + "width": 316, + "height": 320 + } + }, + "document": { + "size": 107667, + "mimeType": "video/mp4", + "fileName": "oie_oie_glitters (1).gif.mp4" + } + }, + "date": 1576007139, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2344": { + "id": 2344, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "в копилку @lizazhdan", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 10, + "length": 10 + } + ] + } + }, + "date": 1576007152, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2345": { + "id": 2345, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 320, + "height": 220, + "supportsStreaming": true, + "isRound": false + }, + "document": { + "size": 35801, + "mimeType": "video/mp4", + "fileName": "oj-oj-oj.gif.mp4" + } + }, + "date": 1576007166, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2346": { + "id": 2346, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "пасиба" + } + }, + "date": 1576007167, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2347": { + "id": 2347, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "всё, я ушла работать, а то у меня всё горит" + } + }, + "date": 1576007202, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2348": { + "id": 2348, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "всес чмоки" + } + }, + "date": 1576007213, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2349": { + "id": 2349, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "муа" + } + }, + "date": 1576007214, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2350": { + "id": 2350, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У меня тож все горит и однако я здесь" + } + }, + "date": 1576007244, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2351": { + "id": 2351, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мне кажется, если я к завтра не сделаю то, что должна, меня попрут ссанными тряпками" + } + }, + "date": 1576007280, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2352": { + "id": 2352, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а тебя" + } + }, + "date": 1576007283, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2353": { + "id": 2353, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "?" + } + }, + "date": 1576007284, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2354": { + "id": 2354, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вот вот" + } + }, + "date": 1576007286, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2355": { + "id": 2355, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ой ой иди тогда" + } + }, + "date": 1576007296, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2356": { + "id": 2356, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "На всякий цитирую Наташу из слака: \nhttps://ooosome.slack.com/archives/CA39G3BUM/p1576065259269300\n\nДрузья, в холодильник отправился ящик игристого, который я предлагаю уничтожить завтра вечером. \n\nОриентировочно в 18.30-19.00: провожаем @anton в Сингапур, едим вкусняшки от @Liza Zhdanovskikh и решаем вселенскую проблему правильного дня новогодней вечеринки под предводительством @Natasha Asaul\n\nЕсли вы уезжаете скоро и не уверены что вы или ваш адресат будете 20-го или 27-го, приносите свои подарки Secret Santa\nну или просто выпить-потрещать", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 36, + "length": 62 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 238, + "length": 6 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 382, + "length": 8 + } + ] + } + }, + "date": 1576072324, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2357": { + "id": 2357, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а я повторюсь тогда и тут: принимаю заявки на вкусняшки, только не что-то шибко сложное, а то я херово себя чувствую мальца(" + } + }, + "date": 1576072386, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2358": { + "id": 2358, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я отправляю заявку на звоночек мне во время попойки, хотя б на 2 минутки! Чтоб мне не так скучно было дома лежать и болеть😁" + } + }, + "date": 1576072577, + "senderUserId": 860139781, + "replyToMessageId": 2357 + }, + "2359": { + "id": 2359, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://meduza.io/amp/shapito/2019/12/11/v-kaliningrade-politseyskie-v-shutku-razoslali-prikaz-s-trebovaniem-vyrezat-snezhinki-v-nakazanie-oni-vyrezali-snezhinki-dlya-vsego-mvd?utm_source=twitter&utm_medium=main&__twitter_impression=true", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 237 + } + ] + } + }, + "date": 1576088528, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2360": { + "id": 2360, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мой болеющий мозг захотел поделиться с вами новостью про снежинки" + } + }, + "date": 1576088557, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2361": { + "id": 2361, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1181259883509448740", + "emoji": "❄️", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 29066, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576088580, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2362": { + "id": 2362, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У меня дома такой же стул, как в таблице. Я потрес его, похлопал сидушку, и вот что получилось" + } + }, + "date": 1576137009, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "2363": { + "id": 2363, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDI5o5qUxSsciIj2ApRBP8A88z+VAEQyaKuRQTIdzQ5B7BqKAH7pPUUGaQdWFR4b0pNjH+E0ASi6fpvH5UUxYQeqUUhl2+gWAqUyM+tPs4lkjJZNxHviiimItLDb52lNp9CTRRRQB//2Q==", + "width": 720, + "height": 1280 + }, + "sizes": [ + { + "width": 180, + "height": 320, + "type": "m" + }, + { + "width": 450, + "height": 800, + "type": "x" + }, + { + "width": 720, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576137012, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "2364": { + "id": 2364, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABMDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpeuJLklTkYFRRLmQClunV7hnTO0+tT6equ7b1JPbjIpDKzxkuSAMUVseSv90UUrjsUjaYRncdO2elWrNlUbAuATSfOkoSUYBGD9Kljixnvg9qq1yW7FjbRTqKkoYTvPzYNOFFFFxC0UUUAf/Z", + "width": 605, + "height": 1280 + }, + "sizes": [ + { + "width": 151, + "height": 320, + "type": "m" + }, + { + "width": 378, + "height": 800, + "type": "x" + }, + { + "width": 605, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576137031, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "2365": { + "id": 2365, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот теперь, когда сидите в таблице, вы будете знать ;)" + } + }, + "date": 1576137059, + "senderUserId": 2676926, + "replyToMessageId": null + }, + "2366": { + "id": 2366, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "272479773299573681", + "emoji": "😳", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 31184, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576137155, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2367": { + "id": 2367, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Пипец" + } + }, + "date": 1576137159, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2368": { + "id": 2368, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "That’s a drama......" + } + }, + "date": 1576137455, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2369": { + "id": 2369, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://www.the-village.ru/village/food/food-news/369709-profsouyz", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 66 + } + ] + } + }, + "date": 1576160540, + "senderUserId": 177121435, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": 27803002, + "origin": { + "senderUserId": 27803002 + } + } + }, + "2370": { + "id": 2370, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так" + } + }, + "date": 1576162322, + "senderUserId": 146686085, + "replyToMessageId": 2369 + }, + "2371": { + "id": 2371, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 480, + "height": 360, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCHGBnNN69jV/ZGAOBSMUUcAVFyrFEqcZx+dSRr0yPxpx3MeaUkAgGrsTccF96KarIe9FAE9MIJOTj6VIKCM1kaEBQ5pGQY/wAKsbaTZ81VdisQquKKnwBRS1A//9k=", + "width": 320, + "height": 240 + } + }, + "document": { + "size": 1254120, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576162332, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2372": { + "id": 2372, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "плывет" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwA0vDROp6g1c8oA8dKp2ME0SNlSGPSpw0wPLfpSKtYkNuMk9qa1umARTw+BjOc0q5KjnmgQ5JBs6/So3Jc84+tVlDfgOlKzuCTUtjRJJFuIO9gR3zT1kVRhzgjuRjNRrLkYz+dP3IQM8/WhAypu24wSPXFG880UU7CuGfzoLmiimB//2Q==", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1576165382, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2373": { + "id": 2373, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1014850808690245757", + "emoji": "😆", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 32984, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576165424, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2374": { + "id": 2374, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 480, + "height": 360, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDT3ilDCq6k08GrsZk+4U0sKjz70hNFguSbhRUDMRRTsBXjuRgBh+Ip4lHY5qkmDVhQMYqpRRKk0WJn27do+tJHJu471X8pAelPUlGyMZqOV9ylNbNDppSCQF/E0UzcJJWBUcAGirjtqTLfQ//Z", + "width": 320, + "height": 240 + } + }, + "document": { + "size": 489286, + "mimeType": "video/mp4", + "fileName": "giphy.mp4" + } + }, + "date": 1576165424, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2375": { + "id": 2375, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дружочки пирожочки, с вами было вчера чудесно! Спасибо всем кто скинул мне баблец за шампанское! Кто ещё не скинул но очень хочет, номер Карты 5321 3046 8801 7638 \n500 рэ\n💚" + } + }, + "date": 1576223469, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2376": { + "id": 2376, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вам спасибо" + } + }, + "date": 1576223578, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2377": { + "id": 2377, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616505", + "emoji": "😘", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21072, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576223581, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2378": { + "id": 2378, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCu0AB5JphiX+8fzq5fKBHuRgwHcVmGQ0rDuT7EHc/nR8o71X3MaMtRqBp/YLgKQAAD/tCqv2aSS4eE7QyjOM1fy57ms65d45zIjdeCaSY2rBDatMWAZVK8HJqb+zWxzJH+dQWbEu59s077a2eE/WjUWhrpeWchATbk9ttUL+AyOqwhQqj8/wDOaKKTdmUlcNOH2Zn8xQSeKqXCvNKXWEKD2QcUUUJhY//Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576224392, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2379": { + "id": 2379, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqjcYNSNGPLDdQe9Qo6KPmBLU97jeMAYUnp6UACyuVKBjjpn0FCoQp+tNgK7uQc5GfzqZJFEZIXgucd6ACWP52lcEKScYFV0G89gO/PSty6AaIpgdOKxZfLhG1Sxc9c9KlO5TQCIpJjenryaJVMaKrnBzng1EzcCpY7hAgEhzjjmmI1ZpNxJHNY0mXnY47miioiVIjc/NzUeKKK0IP/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576224393, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2380": { + "id": 2380, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwByuTweParJk3Wz5x0OayEuGB+c7gKDO8jYB49KVh3JxGVhMhHDHrSwQiXJyR+FK9xuEcQXgCrEMgjXiiQIxu340biPu8DGKsSxJHbnBJPFVu4yeOlFwJY3IdR26Vahd2jB6mm2zpEkj7QwAAI+tSSlIDzna3IxSbuOxQDsV2liV9KfDEJHYYOAjHj1Aoooegi3BblLKUyMFLFSo9cVDckPjBPFFFLqM//Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576224397, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2381": { + "id": 2381, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "368147511233216721", + "emoji": "🐱", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 19044, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576224424, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2382": { + "id": 2382, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Безудержное веселье!!!" + } + }, + "date": 1576229303, + "senderUserId": 146686085, + "replyToMessageId": 2378 + }, + "2383": { + "id": 2383, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мало фоток = трули безудержное))" + } + }, + "date": 1576229500, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2384": { + "id": 2384, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ребятки, знает кто, где можно в Москве купить вкусный чай? без всяких там фруктов и трав, просто хороший черный или зеленый чай? и чтобы не стоил совсем как крыло от самолёта. Или любой хороший чай будет стоить как крыло…" + } + }, + "date": 1576243509, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2385": { + "id": 2385, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Новая серия из жизни президента Туркменистана Гурбангулы Бердымухамедова подъехала, готовьте сладкую булочку и чай", + "entities": [ + { + "className": "MessageEntityBold", + "classType": "constructor", + "offset": 46, + "length": 26 + } + ] + }, + "video": { + "duration": 92, + "width": 816, + "height": 464, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCNjhjUit83+faoZD81LHIqhRtJcnoKztcq+haWXgHPFKZAY1IIIx/SoyrGBwIHU9ASvSo3VooUEi4b1zxQ42GpEoYGXPpRVZHy/UUUgYFS6FeFFMSN4G8xHG7B7UUU72EPW7u1yBIPypxM1wm2WVmB5xRRQ2CQ37Kg7sfxooopXYz/2Q==", + "width": 320, + "height": 182 + } + }, + "document": { + "size": 9188083, + "mimeType": "video/mp4", + "fileName": "IMG_4173 (online-video-cutter.com).mp4" + } + }, + "date": 1576507315, + "senderUserId": 356765513, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2386": { + "id": 2386, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://music.yandex.ru/album/4434084/track/35526360", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 52 + } + ] + } + }, + "date": 1576507486, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2387": { + "id": 2387, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Какой новогодний мотивчик!" + } + }, + "date": 1576518215, + "senderUserId": 327556368, + "replyToMessageId": 2386 + }, + "2388": { + "id": 2388, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was added to the chat" + } + }, + "date": 1576580395, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2389": { + "id": 2389, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "welcome!" + } + }, + "date": 1576580403, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2390": { + "id": 2390, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Велком!" + } + }, + "date": 1576580740, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2391": { + "id": 2391, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всем привет 🤘" + } + }, + "date": 1576580807, + "senderUserId": 88888263, + "replyToMessageId": null + }, + "2392": { + "id": 2392, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3323402743993703", + "emoji": "👋", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 20711, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576580842, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2393": { + "id": 2393, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Привет и велком" + } + }, + "date": 1576580851, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2394": { + "id": 2394, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "828321890853453889", + "emoji": "👍", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 22310, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576580878, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2395": { + "id": 2395, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was added to the chat" + } + }, + "date": 1576581076, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2396": { + "id": 2396, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1360886329340072505", + "emoji": "👋", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 13178, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576581098, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2397": { + "id": 2397, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "welcome tozhe" + } + }, + "date": 1576581156, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2398": { + "id": 2398, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "👋👋👋" + } + }, + "date": 1576581199, + "senderUserId": 802771524, + "replyToMessageId": null + }, + "2399": { + "id": 2399, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Раз уж мы тут все активизировались, приходите в б6 за чашкой чаю если хотите минут через 5 принесу" + } + }, + "date": 1576581206, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2400": { + "id": 2400, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так говорят \n\nhttps://incrussia.ru/news/mat-na-rabote/", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 14, + "length": 40 + } + ] + } + }, + "date": 1576588229, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2401": { + "id": 2401, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "action": { + "text": "%user% was added to the chat" + } + }, + "date": 1576662980, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2402": { + "id": 2402, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "¡Hola!" + } + }, + "date": 1576662990, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2403": { + "id": 2403, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "30651055582740949", + "emoji": "👋", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 38478, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576663074, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2404": { + "id": 2404, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "источники приближенные к коворкингу сказали, что 25го на третьем этаже уапще ничего не планируется, так что 🎅🏻🤶🏻" + } + }, + "date": 1576669895, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2405": { + "id": 2405, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "806062690265989140", + "emoji": "🌧", + "isAnimated": false, + "width": 512, + "height": 120 + }, + "document": { + "size": 5016, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681649, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2406": { + "id": 2406, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "^ офигенный стикерпак" + } + }, + "date": 1576681658, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2407": { + "id": 2407, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "806062690265989158", + "emoji": "🙏", + "isAnimated": false, + "width": 512, + "height": 296 + }, + "document": { + "size": 2538, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681668, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2408": { + "id": 2408, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "806062690265989150", + "emoji": "🇱🇻", + "isAnimated": false, + "width": 320, + "height": 135, + "thumbnail": { + "width": 320, + "height": 135, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 7386, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681676, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2409": { + "id": 2409, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "хорошо!" + } + }, + "date": 1576681683, + "senderUserId": 177121435, + "replyToMessageId": 2408 + }, + "2410": { + "id": 2410, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "806062690265989154", + "emoji": "🍕", + "isAnimated": false, + "width": 512, + "height": 132 + }, + "document": { + "size": 5812, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681759, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2411": { + "id": 2411, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "806062690265989187", + "emoji": "👍", + "isAnimated": false, + "width": 320, + "height": 172, + "thumbnail": { + "width": 320, + "height": 172, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 5036, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681760, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2412": { + "id": 2412, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "582458961895096470", + "emoji": "👌", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 20814, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576681769, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2413": { + "id": 2413, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кажется у меня появился второй любимый стикер пак" + } + }, + "date": 1576681780, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2414": { + "id": 2414, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "884547634142912994", + "emoji": "😊", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 32112, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576682341, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2415": { + "id": 2415, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В Москве у метро «Новослободская» появился первый филиал Сбербанка, совмещённый с «Макдоналдсом».\n\nНа самом деле там стоит одна кофе-машина, а еду, судя по всему, будут доставлять из соседнего ресторана в 300 метрах от банка.\n\nhttps://tjournal.ru/moscow/132076", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 227, + "length": 33 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAXACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCERgcvx7VZhiXcrr2NVJXIKJgZ2gmrNpOvCdzyKQ+hLOxWY4OMelK4jcIwBPvjGTUFw/75znoAcUjTiNgpK44PNAi20SS7U2sMDGfSio1u/k/drn1P5f40UxFIOqhNw6rtz7/5NTwKiKGIBPODRRSK6DZFYyFlIBPB4pn2UOwZjk4oooAlizbxKOCKKKKQj//Z", + "width": 1200, + "height": 675 + }, + "sizes": [ + { + "width": 320, + "height": 180, + "type": "m" + }, + { + "width": 800, + "height": 450, + "type": "x" + }, + { + "width": 1200, + "height": 675, + "type": "y" + } + ] + } + }, + "date": 1576828386, + "senderUserId": 356765513, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2416": { + "id": 2416, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Зацените что у нас на первом этаже замутили" + } + }, + "date": 1576828397, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2417": { + "id": 2417, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 4, + "width": 200, + "height": 100, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAUACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBvmBM5wCD0JqaWRRbE5wWHFVSjSynOOepNLcgMsY3dBSKHrtD+W2Vf0NQXMeJB9KT5pblcSAuMc/StTyo3GSoYijYRmxwK/Q4OKKueXE0W9U2/hRUspNGUZGMhUnjNTyMdxooqiRlqxabJ64rRjlZRxiiihgOLHye3SiiikB//2Q==", + "width": 200, + "height": 100 + } + }, + "document": { + "size": 65692, + "mimeType": "video/mp4", + "fileName": "200w.mp4" + } + }, + "date": 1576828477, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2418": { + "id": 2418, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "157133981274342170", + "emoji": "😨", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 24366, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576830829, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2419": { + "id": 2419, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@alexanderbalashov возвращайся, тут и бигмаг затащил, и пенсию перевел", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 18 + } + ] + } + }, + "date": 1576830905, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2420": { + "id": 2420, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хлопнул бургер, как говорится" + } + }, + "date": 1576830929, + "senderUserId": 54158593, + "replyToMessageId": 2419 + }, + "2421": { + "id": 2421, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "у фейса?" + } + }, + "date": 1576830941, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2422": { + "id": 2422, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не совсем" + } + }, + "date": 1576830956, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2423": { + "id": 2423, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 37, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCSRdsoPHDd6nd4/JCgZ/qaZc4AJ/Wokkjjk+d0HHFJDY8WwIywyaKsZySAQSOoFFMRSgffYMxOSM9arM8TYZ0LYHY0lo4+zTLU0UGbeN8DvyaQxbWUvM5QAZH8RxRULTurYUR8egop6jVirE2N2TgYq3CnmWqfvDweh6UUUm7CRYigQDITdnu3eiiiuV15XK5Uf//Z", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 5697250, + "mimeType": "video/mp4", + "fileName": "IMG_0078.MOV" + } + }, + "date": 1576831028, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2424": { + "id": 2424, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Няяяяяяяя" + } + }, + "date": 1576831177, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2425": { + "id": 2425, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3323402743993745", + "emoji": "☺️", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 23491, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576831196, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2426": { + "id": 2426, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "643524467607209995", + "emoji": "🤝", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRuoaAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSMEEAAABx8agbSNJ5yx/zrv33yGIiNz8ltus7HnKMeQ0rOSUc7JnNtKycptTmk5NM0dTck3OwyNoS7Jt2rZan2NqafPYtm3btm3btm3bxvWxudU/Z22vNefo9zmi/4n/cQomlyxbqXL50kUiJmRRUosxaw/f/+dbFudNe/Pk/JYZPctbEGBUHr398W+O9dWZea1D0NntsOEFx/3x5LjS0NNqu+Ude5R2ZXwqtCsx9zl7+nVPSwWdam37xt7fGmxDl7qH0tmfZyNt6FBhVxr796iPgt+hxV/Z3wt14St1fs6+/1oVhn9JWzNZhyetCD61esmapC114Yc55xfrc7UivE86zlq96kTwuPIT1uzXJAOetnrF+q204GG376zjvgA86/WT9Twdgke9frKuZ4LwpNtP1ve4Cw9af2edN5mIu8pr1nuRgTiTn7LmGQMJcZmnWPtvDQjxzGcBz1MQR9vfLGG/iZhT/mQZowzESNtZyMcqhNh6ZLGU0xZiCv/BcoYaiGUFC/o3FTFU+c6SVisUSvtZ1LeqhMIaZbCsHQqF0AkW9rs2oeAGGSxtu0LBe1nc94qEgsr9ZHkrFApawgJfJxLyO/+yxKEG8ndhkect5D/IItMqEfJGPrHM6Qp5+7LQqzbybmehv8oQcs1/Wepwhdw6LHa3hdzJLPaPICHnEIvNrGIgW/3NcocqZJfKYrlrLWR3ZcHnHGRPY8F/BwnRzSw4rZSB6EWW3NhA9BlLHqjgfGDJE0ykZLHkZRbKsuiNNqqx6O0OarHo3Q4asuj9Lhqz6AMu6rPofS5qsOhdLqqw6K0uirHodQ4SfrHk2Q7Ufyx5jI3oA5bczUL0CEuuZSK6hgV/LKYQHcmCH4YNRBux4ANBQjTyneXOcQnZd1luZxs561ns19IKOf1Z7PWIgZziaSx1RZCQQzdZansbeRay0FdFTeSpx0J3hgzkUY9ZZj+HkHcxi3xV3ES+aukscX3IQD66yAIzWjqE/ANY4NUkhQLcv1jesAChoBks7mlREwUmvWNpk0MGCqT5LOxFCQuFJL1iWWNDBgqhSSzqTlELhQYesaCMbgEDhXfJYjn7kkzEoPaymHc1HEIspd6ylPFhhZhoMAs5lWIhRrWLRbyq6RJiTX7OAtIHhRVipsbfWf81SSbiMIZnse7nituEeNRK1vxZ5YCB+JxjrPV/TYMK8UYusMafO4YV4qaUa6ztjwEREx5QsRus6Y8hCSbBCyp6hbX8OjDBJHhDiWdZw9ddIybBKwpvZu3+aBYxCd6RPfs363W5esgkeElm99esUeaGUgEFr1WVy6zN+xHJjgHvjdCCn6zHpYYRm+AHmU3vsQafZxULKoJPKjLzM/ucdbJhgm3APzKr7E5nPx8NSg0ogq+G3fx0Jvv199SSIcuA78ptczqD/fhjZtmIraADKbfJti/sceaN0SXDjiJoQsouM/12Fnv3dku71JCtCBqRYYWaLH+QyV683TeodELANKAdKTtca8rx1xzXj9tre5RKDNqKoCcpO5DceOLWm2+zuPBvz44u7l0xORywFEFnMkw7EEqt1mH07PXbDx+LHj92ZPeWJZP6Ny6bnBBybWUQBJARVZbtBIKhaDgnFA0GHNtSBkXhAwBWUDggAhYAAPBJAJ0BKoAAgAA+TR6MRCKhoZgKxtwoBMS2AGJoBQOz4fzQK4/c/xvx7pnu3P+Z6yPQt+n/+h7g36wdLXzAfsd+2PvG+j7+zeoB/PP7t1m/oAfuF6cHsm/13/fft37Sf/lzlL+zeg3vd/Lfk554+QX257bewBkP65dSz5d97P1P5c+zXeP8f/771Avx/+af4T8xuD8s36AvtD9J/zP97/cz/H+nvqd+Av99+WP0Afq9/pPzR5nbyX/k+4J/Nf7r/v/7d/ff25+Qb/Q/xX5T+336V/5f+k/x//Z+gf+U/0T/Qf3v/K/9X/B//v6y/YP+1XsifrM65aqCROHE2+3rfqd9PpnYqfEorcimhcfWub9Adn/IGTKvSh39qiSi7bxR42rYyS5i90NWdzNQ/8lNvQIIHVxzVYHsC5mmOLA6lUTKk1L1OG49UaD66/+YPxq4mfo6dNTqvUMQfn8/orICNJO5ybgn1aTsjc1HhNTrzLE1jmGpc41touNRlSsAyc6Z2En6u7+OCTF2E//SZQOCXnN/7Q3Sy0Rsn/AoI2kyo2JJY4IKlHp8p3aB5ij8Uq0SwZGJ+Wp4xVOZEVA1vVBWTcQAsy1ajU2y6uCqWbXt3p7TR0RSHdMW1/MUS/R63JuSnqwCRNUq1IEszUAKygUnH+QexZbMjcXz6EmKGM268PlBtVnf7bObomYowIXUaU4CSWVSASUQ0tPOfRnA2nl+I8w3MVpK8nTjcTnsXrOiSTod0Kbz6EI/zsJdz5CY0SadnHRjAJ+rrvaOaxCM7ZT1w8Fbv/xGoP8KAAD+/w1kThif5TPg8rRf2LSHe6uYJQ4Jo/zmcS9zIDMaGntLKEHDQTB0k2RfTUz8E0UZ98r0J/njy7TBKGCdNmM7AIh9fPkx98nVnklUuCSRc1fL/GM/lPMGbigxS6L9Z4SfKnqcHHnaBw3XrVrQvTYi5MtUDzuqAnCL3R2AqmPaApV2CfeVS9P4a0TyQLX58qMq95NDhEjSLR9qXdzNMbQNX+LAjes+CBGACIco5WTFZUeflh5uMbrZMgeFXj79BQfkixbutPsciijWP7P/3/Uv5Afl+siI1pm75Ze1HK/aWoyrF7iFBAyhsuxG4UZeMbNjZ4c2kNVvUq3CHd0jamgkReNnm+43nBU8dsji+Kkf//FxSbk0I3FtJqmS+9J+xMNayB0+6BaszCYu5ewnWv8DOrS2iHqW5egBU/qHFaBAfWAE952nB/sFlKKRkuIJ0Bw+CvSeXZCD/hl4wflix1tkvDl9nJljoy3FPwz0KkguiOwS0PhGqzZfzXJr6KYrUyseS7dP9aN1MAskibF1NDQ7+ryieDkEx/JgFdWmId3TBng15MeKlNI1D2CnpKHH4zypR+as5ydmFdGT/8pPlPqTw0twLvPESFP5othtXMXkcr7MipWRXF5AH/hV834lZtuxy8VFMsXqK99WuPqGMioRPbDBsq1t4AUH/za/5iXvYK91EX7g7bO9akCiKhn1EaY59qP9ghiitcDUc6LJzTW2Wla9amqFwhreMzlO8qd8Jip51aICqbiE1AqhFQUknceHxRnrxGVYwZYTyq5v1O3MMuAllWbqzsQsgm2DHuSo+z1zc9qjDnQCjWINIOPoo4eJaTlOT5btsYuMH+azkxRf5joMCcDJJC1TBcYD0Yh5XUOw+Kc05ofvHDJSGJx+hv241OgNcvG168tGFQCAaUE93s1SWbxcA4l+5kO/kNPrnqhR1QZiD63yCK6sHGYYWJTe0mPuy0nssm8uERckllpCWH4F63BLKiDgr8phezQVoi6i7PSMKruQeV/CSonRSZT3BMiqGDT9Yrj+EoXowTP6SGxEswpEm5yYzOeIY9fWgSbheJZo4gdOGX2nhfqNcXdZS0FH9jT7LWzg5viGh60Ed1MQksP3RO7jX31LoQ9H+/eueVegLOPW2zXobXMlhjtgst3MZgRQxMRybzDwP3RA2ncNNvF6rIcyIsboenbSXtzfnYjEHfE6LANrifKV3rxxmfGsSaFi8KrqiEPPm3ZZejoZeKKpKW1bkLiPR3g5ihW29c0oGu4m8aFQAVaY+1Vun+qCFReaoHJVBviAgjbxIX7oeVj17ueX8zMELc64IwUCI12T4mpSaDRQ2MJdwEcVchnjm+xP/i1gidr88FxOIWBj4dGH/DLK+9HKVSq9cyQLP3tRRn+60UHIhY7N1RRxh+erfEytuZB8v2n3tpviu9/PZ5uEIjG1uAT6OtKTpeOxLx8ms09UbR7Pgdxl5gZwueBiD2dQf842unxf4rrOllhcKiB/XoZf+oz6vQeE5L03F8Gc17seFJXGFyi/0SBDzGdSFmZFIz86QlV4j/4t1mN6zrL/nHhE1NxjmLKPSrMw1gnL4OrePR7rDg91NkLUUaEXjJWQijS9WsS8eFxXcP6PCHhpk5FhjtkcBMl2/MNYvj1A5deAa8gvHgp70rdkgUpJuZEeTveG2GvwdljzYYlW/F6rQxX3dEkeu4KCkHl/A66r4a23I624pNk6+XxyuwibceoHllgOy0K689xNVklXDbxrpLrhpl7MPfCBfAtto/dT39t+oRcYp88HBxMsdNHVJR8Cn0gEW7wfGbGwtMIonipHDeCEOUNlP17owdOEsv5c+napaLhKN4A2Sw5h/VufZ95AN5q+7mY0rSSoX9GztXMjZnzMZrOIz6W8GxXGYFVQaQCpJlC8tfEi2Brgld37zKmC2IMuAdvja2eeQxO33vQLzScDwOwsWRDRbh9sTRgBdhQPIz1Bm520nJS0AePuGnSdyxXrlicGpjB/TV82qqTnghzkzb0Ck6gyyDqhbKe/RUQb+n7AqRxXvox4rgrypiSKilO6dkDG99l9mMvtKSjhschsoOUmGIWYpzA7KxdYuuguRsk3s7d00P128gL3hFxLe+txhhH0itrb2o4Z+KsSAlwshc/XaY/D0CIkNeGyVKjHxGDuTiDEeXRYVi+Kewap+4AuRVZS4/h8Rh5b5dG4y0qGc8/8bPPHUPFG3NYYZFIncb+7oL/A+wlXlXUaXR1Z2vM9ae8cfk2IirpI4fTZHzF+bCRXOC2zFGkp7re2guPjjz8grzb3jcQpRDq+5H9OEfVYL1wTFjG3PjaVkzQ3mVesj3C2Q1zhOs7DiNd7gLueyaoWcFsx9nQdt284RLoRibjzYPok1uCtl3A+2NvJaekKVNHQddV/4YWE8KXt3CfBav/wnXexr3M/1ZkpAh8kbY8VWbADYaTSZrkwy8tbpRwHNuLfO+orsuwo0eU/SIXfhJ6dvcgzGRb0DdgkzXp2beBxxlmxEbwXFtOVgUyApZPsayXKqDIKXLUCG8ak/ZybulnvAFi+hYjB7S4+P9qmK+e8RwmXSvXn2y/HUaJeXxFNL0dUWNHafXhFobkM8ufVXm4BwQM3PTawbgCUU+sQ+mI+jeNBsJ2tAGXIM1OF0fQ0uoPOtzJU3z7DdGPK8PzG45am83pk8/cwYwxX7t8DhkQR5Js8uvgmw3O/t66RVROXBBpAKY9UD4br1Qov6MbxmyY8n4iARW7wvAUZc5rOz1+UYvpg7gZyLrNcwE+PxoyHQOUX4NOi/BSnIL1iak99LDcVORiCMrglkiP5MGijzsLg7mGDG4nIleuMV77AmIrYlqkVthOzQmbvKbq61kTM17AnmC1KB+lfqjzCaR6CsCAXxXB/fSo+o5rOwk7hxUEbyS2p6SdccDAF4/jTSZFbUWxgCKdWDB6WN+eA0FyzxIv/fUW23+/o6p9OeXci7K/1DwGcMLnaklwu5cJyNemGWgtmeRIFYKraH0QvTV0mRo848MBKG7Gabo3fwlnw5fMws05QpldIGPmZZIABGxq3stfGL9W2jAUyoKz9pvwYqpqUEzvw3wehuUesqtSXzQIYwyfYZWAazOtDox6y8a5SBiCG8ETHlliEufk861SJKwXwEOe7C/OVlaVPEY/4Zw1lmqCTt5enYxsFvS9E5hkkj8d0Yxtvv5B7abzBU+aAlgA0geWiL+1hjZ+I18Ikv6geCdfhkc2GoB2sqxhgX4Ahae7BB9wtV2HKnuKt8ICos+R7VzM6KxTIq/Z/mRg4VbujcH74GIl39xr0C5NEjYW4jSX6a77X+et5Nf/QVk+vGf0jjVATkDOZjJQJt9MXIj5fB6IHf8m/Qz+1wGaTF/nzdb8XnzJyB/R2GszCzeCEZ5rw+vfcA9v9N90QsA9P1N5iaV5yFEDpAHHc3KLrWRNhvP5Z4Q2F31RH9VdOrf3burPRzolKxv5LXWmkXE2+VkBsOo10Aj0zkrRZzC1k7XoGKq1GYzZ+OlzW57qp2Ci0VZCW0YJLVdlbrjmBUKhM5Z5ii5Gq7JrxJf6YTj3xLt3Gx+R/ZPvHpqdREWt7dXIIhQ0OMiAgjCgP0196cTaK480mlWz9//5HAZ5AS/4nmHH81+JWxaBsn5ef3C/eUtf5HWvK7K2/pWTrNBhiecnK8etIxMHQqzBxOjZQOrfXMNmh4adKgBSJZ/gXxemqS4o8/+BGG6qrMxmaF6aRyF7aznnbg/LgpdVnmGAckxkePS6Qhe2PFdiA0sBk4Vl9E96ToaYGBiMRGwuccyP4PfGviQcBLzbsMEBrq5LJEY+tjmYyETWeOhHGIcgvxnzHxv4aeByGXrYqIsFPw0m/TGCReszXCdsByzlTKPw4YnPuS7bW0Eh4/1JGx9HGOAK2N3FIxkNbxWGv/Tl80ynVCDM4M5gSu/NMNWi0aBaQ/5XdC0WwwkS0E00d6HeaBaeL/ys/g0Blh8mujkMJxNK7WqXWn/TaL598f43iH8pj0T+RBOBuhwK0uFZT56ohTgefZyfcm7Pb5+kaXkGV9t1f9FQeVGge3cYLAMLxXebHgtlP/G6xepzWOajhqpr5sdrKDQZ5t7TilOQs7+mr5Fj5dthuaFdpww08+foiH/GcARtpv77siU3USlXEXQtA3CnMORbMcvaNmZPP4dNM/CbbptFeJkjYVuJv+Mf5ntJOFx+GO73PUaVwhV4ZErBZNe1/SxTfnLbEnsY/cTyKnZBm8vHJTtjm/VjqdhhWulQKBm0jsZ4uEy65Vmg8zPvhQQ43pJlyJZSxBrYTM8kkwb5ARwnVrBWN/pJlWs9e5KAWJ6EYzA//58kzFQj1tfJvHDSLNtTF0mu6+J6xoWixPYjzAo3F6+t3Bjp5K9NFMP4H8kyECIwmH2pcOxhZJfyRrcJyo3Dfn1lFet+zTV81JWt2D9V645Bq5mppwermqf5xMhbz9ONpsGv4myejfE6MqYfN8lWJoG19OEWj6ReohNMPA5njan9huqCrxya3RnXDupU76UDopPLz+1fxOh12CK+9nHWDGqJ4NJ+mqk0ZQAMS57Z5F8cFt7h//tcw8qEv4eydBGMcKg/ahbD8I3UpX8mI0c4hOwNhjUtywGcOMn2UK2Pci3BRgB5ljiC2Re8t2C+qhcjUpYMbZC8NfCoeFFOvnb+L9oyCJkASNkveT0rWcYwC4ExH13zWHYVeMF94uREnrrtGrlSgEnllE5Od1X6BRrZZlVeOtGQI4aTqZVg7TFbY8+gxYdk1NZlE7P61iJssKhHzcgWsqH+jnaa4y+cKbwA5v5flwQebK6KWY8KjXU7EYFTgTCjU/sJ4/jkumuCNap6PEWCELUh/64IB7cc1+bkr8Px+enEsZhr5pFc6K/YCY9kj+xga8brTKE8tELUkCjyn05Q8REAtS5CxKJHOsHimx9f8RsfhrIfvkHZ8UPs+H1dSzttUaQhjng12z237g75QAWkvUPXbHpxCJTqR9znn822PCHVI3e9OwAri0MiCKH0R1jAaYcpw8CEZPubtA5ooQS07deoPDSoodV7jMLz9C22AzLx0Gh9hB9rog0Il/flTBfw/wgO0jWNh+OpQ9WDB9tszvt6LtKSQEWDZdEuoEZU4N9DXR5q2HgDbqdoxmKZJzQ3FPYWGsses2fwiFnJBbc8b+qC6rBlXF4sPVNwo8B67qCuUCH4eW1aGI9lRHcdMPZ/xSZ9xMTPQ3QjPBf0GFoL1R2QnIoN/EBWmqC0gJYjRc/tMuo+5bU6Z/MIuxLS/k3pCebtIAOFJVM3WPtJXWKKFdSxGilTk+Ehq7fDBHUXZhkmeoIZsH6DIR5b4MLJfN6yeNfxo6Py4lqymi0xD/ZLL4k+/CoJFqoZ7M9xRIr1t/O/CQ4L4WFTb0nRAtCD+C9XZXsIgAL4fE2xVSZHd5LEwZPIu+rHvR26Oa35hRR9MyZ2p9hAq7dgGrZrg4sYLRpdD+z22uLtOcdUVrDcUq9uUfxuprdPZRmQrFV6kKPxeDpaJjNAaV8ZtW/4aVI7k9tTxMkzFdiqtwhfn3nmaU3mAb4Zrn98+G6EDBuYnGl0CDkB0Qnyzv7Low5GIVSRqS+mPACY663zcAlHvcARREOWkybB5H9BzPopvDjJ24qxxuSWdz1Tj5Lz3pV1fmwZfa/j2bC0QxhzibpoW+n3WVI6RdqiBjuC0e2IC5Orr/HWiQXdx7rTLk0cmJmu48yBJdEOo7RDAnKshke8guGSLvYzsuVj+/xDL8aRNbU4qkFIdDlkRi/4Vwj4iwm3PDPp8FaR8DaxgbB4jrlxmFS9bQf1zBYD/uC2BXGnE+k83m2fXcr3sk+nUdSYWZVqqCSDOwhkm2AwSUgPweiZBYwyApZTL5Tsdt83cQMoXOy6uC79aKdUl9vT5MrMiw3W14ULt53ag9jmxzw0hBRpDHO8FOslPCHEd/snwc8anj7E4tVnOm3yiOO2/37clzGAsr/z20GWXfvzMm4qeP9WgEk0LNa/VjDqK5e/10pXnXvbdt4dMf1tek2baJIrfDcrcO0ZhlE3ibFGT5ptP3EKZ2erZQ0GuRD1pXv9au85TNFX/J2wyfUq9XOMuXcb2wRG+51DA75l2TrJQaGwUewHrQcWLKs91n96v5DaVl6/PSqEcff8JkREXA+2Na7d+ur+K0jgv6YbPOR6XQ3MLIuB3UDQoHyytttDccmHgVdJfsfYqhMsvRTdSs/GQ/W3Id6jwih0C89h39GVUryaKsk8C3RSEIBy6NAa89/FlGDNoU4xa4ycBi8BdSANzRwAd5Eam4hej1JLNvfbTLIuCnLjDg899w5N+4jru02/jMBsZdhSwBsxcZl+ftwNwAb+J1VPfUJQx4g4OGYmeXw2fov8NhrRTaIsWgoNlM5KRt3A29J3xRAvz7HeOmjfRcL7psfzH8KvSECwb2a5cg20p0wpjQ/GLLBFWrRUwQrsM/zcQH9snmv2jBlIi5+XEvKPTY0XGzZ6szBBZnX5BCA1Rr3fADasfmUfOTjdUlU25KeDMmK8FQ+0SfJ1yLdJ3Xwf6xpBymiCf4rgzJ9JKJwA5fYQgzYMSAKtkU5MtSmz0BPinjtINkeGgMrSBfJ+tHRlKoKSlK/y1gkn5RcH0dubXnsBnuYfok5/EH93yqHwtNEAAdYZdxqXsaeQeZN2LyI6ZSBJoA4Jaue/MWpHx9VyTklwAAAAAAA==" + } + }, + "document": { + "size": 43072, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576831271, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2427": { + "id": 2427, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAcACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDW74pcH2pB94UEgOMtj2oGLg+1GD7Ur42nJx70KQQCDmgLje+KKD940UAA4akYAtkMBSmjAoAONmNwz603bg8SD9f8adgUYFAWD+KigUUAf//Z", + "width": 757, + "height": 531 + }, + "sizes": [ + { + "width": 320, + "height": 224, + "type": "m" + }, + { + "width": 757, + "height": 531, + "type": "x" + } + ] + } + }, + "date": 1576833788, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2428": { + "id": 2428, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ахахах" + } + }, + "date": 1576833808, + "senderUserId": 54158593, + "replyToMessageId": 2427 + }, + "2429": { + "id": 2429, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Во сколько у нас рождественский сикрет Санта? Часа в четыре?" + } + }, + "date": 1576844804, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2430": { + "id": 2430, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "О_О 25 декабря же?" + } + }, + "date": 1576844833, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "2431": { + "id": 2431, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "почти: 25 декабря" + } + }, + "date": 1576844835, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2432": { + "id": 2432, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Время" + } + }, + "date": 1576844841, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2433": { + "id": 2433, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А не дата" + } + }, + "date": 1576844846, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2434": { + "id": 2434, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "только не в 4, давайте хотя бы в 5, я с 7 до 16 работаю из дома в чатах, и в офисе смогу быть в 5" + } + }, + "date": 1576844880, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2435": { + "id": 2435, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я только за. Мне главное чтобы не раньше трёх =)" + } + }, + "date": 1576844922, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2436": { + "id": 2436, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "B7" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCLS0Ee6V8hjwK0laN16ZBqgXMdsq7M554pbeZ1ZVxhPWpvqOxpeYAOKiaYDsaiZ23kDpijeNuetNgQPeQsc+XIT7LRVlSDRSukNNoqD50xupjo2RtojOKe3J6kEUgHR5EeCTnoaeOmKai4Xqaf2oAbnbgc0Uj80UAf/9k=", + "width": 1280, + "height": 960 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 600, + "type": "x" + }, + { + "width": 1280, + "height": 960, + "type": "y" + } + ] + } + }, + "date": 1576845005, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2437": { + "id": 2437, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "570116660405469204", + "emoji": "😐", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 18150, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576845037, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2438": { + "id": 2438, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "570116660405469205", + "emoji": "😟", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRgwlAABXRUJQVlA4WAoAAAAQAAAAPwEAPwEAQUxQSBQQAAAB8Mf//yol/v89z5lgBoYGSbEFWykLXOu1Zet22K1sd9itL18GdmB3B/vatQMXaSxSaoCBAamRmZPP84c1zJw55/FnREwAkoSk2tnDxz+4bffYMVN/WL3t0PnrqY8Ky2uamimGYylTfU1l2dNHyf8/lbB5xQ9TRvYLCwny93HXqggEhaSuY+ykH9fsv5yc+SCnsLSiqqau6bmZolmOx5jnWZamKPPzxmdGQ3lpYc6D9KRze9b8+EW/NlpC/incOw0cF7do476ztzMLqpp4wTYx21CZn3nr1J71f84bN7CDjpRppFtw9wFjZyzalZhbx2LBLjFT8zhx14Ipo/p1DXYj5ZXKtVWb8FFfb7xYUFvf1Mxw2F4wR5ub6mqenFkfN6pXiK+LUhYRKvfArsNn/+9SaZ3JTPOCKHK02VRXdH7N1MFhge5K2aMKGrHgdpGxwcxhQVQx19xQXXhz4Xv+SjlDuHafsf7M3ZwmVhBptjH37snVU7q4ELKE9I0c/118UiWDBVHHtP7Wpm/GRXiTMoN0axMxKf5eDc3yWOwwz1LGpE1f9m7tSsgG0j10UNzBhwzPY8ExYszzTOae2bGhbqQ8cB6UUMEIDpgpT4jRSj/CJeqb46kGindEPGVIOTyvt1bSKbze+uNwej0nOGy2NuXAr7FeCqmmbR07PaGCERw8o98zPSbYSYIRHt2nbM2geUEC8nTa5i+7uBHSitT6/WdDpSAh9WuG+mlJ6USo2kzYmWqgpQRVmbJjQoiakEqeg+KTKmhBYtIVdzcP8pJEpHv07ANVgiQ17J/bz1MhdQiP9xf8beAFiYqrry0d7U1KGULXadyFBl6QsqZ/PujoQkgWTeB78ZkNHJY0fGPWhrf9NVIlYvFdA40FiYupiluLoySJwv393Y/NgiRufrx3tI9ScviN3pBiESQzlbF1vL+00PSaebqREyQ0bzo/q4eTdCA9orfkmngspTBvytkU6UlKBd34E3UMFiQ2ZupOfOAmDZw6/HSlCgsSnDdc+yNUIwE8ZybqaUGiM5X/zPVydOqwGXcYLEh2zCbNDFM7MtIt8s9MDks5zGUtiHQjHZdzzKkGTpD4XMPJWGeH5TLtqpHDUg9zxqszdI5J1WFhPo0FGYjp/KWdVA5IF/PfbEaQiezDDYPdHY7vu1urGEE2sjW73vd1ME5jEylBVlJ/j1c7EkIz9nY9Ly/4+psjNYTDUHb8PYUW5CamUv7srHIQZLclj54LMrT58YqeSoegiFzykBVkKftkVT+lA1CGrCtlBZnKGTa1VYqeU8cfn9JYrmCm+Mf2anEjtLH79JwgY7my3QOcCTHT9jpYwQqyli0/0EsrYqr+O8tYQeayZbvfchItVYf1TZwgeznT1lC1SCnbz63gsfzBvPGbTkoxItTha/S8IItx+do+KkJ8VO02lbOCTGb164NVokN2XpvLYLmE6cerOpMiQ3h+n08LMprK+8mHEBeXYWkWLKcwlfW+q6h4jrhKYUFWY/rOWG8RIYZeacKCzMamm8MJ0SCH7qvjBNnNNewbSopFxKYSQZaXbOgjEu6LcwSZ/niBhxiQzpOKsVzDpdN1pP05977KCrKdu9lXZ3eq3kcNWL7h6lPhanvruKiCEWQ8Y1ja2c78p6Ywgqxn0qYH2JVuTjItyHz6/hydHZG9L3JY7mHuYm/Sbki/H6qw/MPGH/1Je9F+cZUVAJC99oXWTpTRB40CCBoPRCntQtVuZ6UAhBXb2qjsIWBWHgcFXO60ADtQvX2/CUMBbrr3jsr2/P9r4QUw5C2bA21OO+SxAIq5w5xtbeAhDha4gwNsLPjnEgEYi38ItCnFhEQaGuiLYxU2RHrsaMLQgBu3eypsx3P6fRYe2JRZXjajGpr0XABIc/LbKlvxWGPEECHUrPWwEVWvNFoASSqlp9I2vOY9E4Dy2RxPm1B2v0hBBXW+u9IWwpaVY6jA5cvCbEAzIcssgKU5e4KmxYiwVRYeLnhqTVeipdQT7wqgeW+KuqWCN9XDRkN86xYi5qfzsMGnzSNaRneqQQDO+hMuLRP7gIcOLmtAiyh+NwrgafxN2QKq4HM0fDDnQ9TWC/g5H8MHLvwz0GpEjySTAKCmf3sQ1vL+spKFENbwmbe1emw3CyDaHN/dSuqR6SyMsCkj1NYJW9GIYQQ3LA+zzvgrFgFIqesfWEX1ezUHJVzNnyprhBxkMZRg7lCINd76VwDUe4OsoImrg5Rn8zVvpGi3UQDVjW0Vb6IZ9xesJI7VvInroqew8nSR6xsQ7Y80w0rz0Q7E6zl9mioAa+pnTq+nW1UCLSWrdK9F+F5ogpamC77E6zhHZXDQwmVEal8nYHaxAK5FM/xfp/elenipO9frNYjhZRS8UMXDiFdpJjEYXjAzRfsqn2UCyK5u9ap2J2HmdPtXhT+FmcLwV2jeM8PM8/+oX+Y/G8MMnur7sm5rBKBd0eVlg05CzYlBL/skB2ryP3uJJq4Oahq+1r4QuIyGGnpZ4AvRe1ioYXaGvzDqItiwZ997YX4WBzVc+pwXllXyUMPrFyNEOG1vxlCDn29TE0r/EwLgHvdTaqMSIScxSuv+8T3Iufehu8/X2ZCTNd/bf0UB5OQv9QtOMEBOxY6gdomNkFN/tk3XTBZymPuh/XMw5ODHfUcUCKCbN/KLItgpmhhXBjulccsqYadi0RYj7BjWH6yFHeOus/Ww8+z43w2w0/DXvybYMSVnm2HH/KjQAjuW/HIadqhiIwM7tL6ehR2muomDHbaumYcdzkQDD0+xGHYwCz4cxQMPa+Jgh6fqWOAxVzOwwzWV07DDGEso2KH1+RbYsRQ+MsOO+XHyc9h5nprYADuNV44/g536c7trYKf24P+qYad665JK2Klc8XUZ7JR+PakYdoomjSiAnbxRfZ/wkIMf9w9NYSCHuR/a5nwd5NSdaRO8qwJyyrcH+S8vgJy8xa18vsmGnMy53h6f3IOcpAlu2ojLkJMYqVX4HoOcEwFKpNr6HEMNbt7mRCC0WM9DDV++BCGE5mZwUMOlzX5hxAUWatgz774QtQdsmO29XwhaTkMNvdjvBW1cHdTUxzm9gD7OgZqCz9BLY49Bzam3XtZlBdSs7Poy32kYZvgpPi9Tv90MM6bh6peh8CKYyeuDXtn+NMwcb/cq3+UYQ8xyn1dpJtI8vGBmivZVxNCnFnihSoaTr0I9zzyDl7rzvdBr+s8sgpeiaf6v4xydwUELlx6ufR2i1SUTtDSe9SVeB+lWl0BL0TIdem2nj1KgJeUj9esRbQ+ZYKX5aDvi9ZDrggJYKVriht5QMyYRVv4ap3kTRbuNsLKhjeJNkOarekipneeE3nxwMqTciUFWDDnAYijB7L4ga6h+r+KghDP+obIGGvuPBUqoGx8iq3Ze1ohhBDes7God1YhUFkaYlBFq66Ae25phpHlTN2Rln4kGFkLY8k+8rEX0/NcEIU23uyGrB/ySj+ED5/0YYD1V0GkaPpjzwWrrIcUv1fBh/EOJWnJANg8dXHYMalGXU43QUX/cpWWIrzN42OBT5hAtg9rE18PGsw1BqIWdvrwNGzc/V7UU0Xm5mYcLnlrRmWgppBqTYYYLy8PxatTyYUsrMFTgipVdkQ0qe1ymoIK60ENpC8j76zqoqJ3tiWxS1TuFggnLvR5K20AeK6sxROCq5e7IRpWDk55DRPO9wUpbQZ7TklkMDZhLmeWFbJZ0394ED6Zd3grbQYoJiTQ00JfGKZEtB/9cCg1Pvw9Eth1ziIMFNqEfsnHt4Eew8Ogtra0hv7VmHg54yzo/ZPPK4UmNGApw0/23lbaH/KfnclDA5c0KQHaoarvbAAUVO9qp7AEp+x0ywkDVvkglsk/tF1dZCGD//kSL7JRs9W0lxnIPY8M3PqS9ILLHOU7+ced7kMh+Xeak0HKPTpvnguw5cFYWK++YjJmByL7DVhkYOcdULu+M7FwdcaoKyzdsON5HbW/IJfIaK9/Yq+EuyO5Jl4lFWK7hoonOpP0h5L7gsVx7ssgdiWOfzWXyrGxzBBJJ8u1DDZz84uoPDCfFApFv3zJhuYWbbgwnkHh6j7lBYXmFqeujvJCY6t5Ot2A5hS3pw12QqBJeP+bTcorO/9GLEBdEhq7LY7BcwkzuulASia2qXXwlK5fY8s1tVUh0CXXkunJeHvH6NeFqQnwQUnaMM/BY/mDeML+DEomzutNGEyd/ONOGjiok1urYveWs3GH1e2PUSLydI45UsvKGrTwS7oxEnHAetK+MkzNcWUKsMyFmCDl1+LGIxnIF04U/tHdCYq9su76ckytc2boQJRJ/RfTKXFaesE+WRymQI1T2Wp1rliPm3JU9FMgxqsOWpFFYbmAqbWmoCjlKQjPqRh0vL/i6m6M1BHKgTqMuU/KCShzthByrz3u7aln5wNbues8HOVq3IfFPWLnAPtk82A05XqcuKwtoLAcwXbAqzAk5ZN2Mf6pYLPUwW3Vlpg45am300Xpe6vENx/pqkcMmdeELHnAYSzeMuYcLI1xJx4WQuuu8ZE7KccnzuqmRg/f56koFLdXoiitf+SDHr+n86xUDL8V4w5VfQzVIEurGnahnsdTCbP3JCTokEUmPqO2FJh5LKcybCrZFe5BSASFNn3kXTLyU4k3n5/bRIilJBE6IT7NIJ0t6/PgAAklMhefIhByLNLLk7h/lpUBSNHpZkoHGUgdTlUkr+iOJqgl6Pz67kcOShmvM2vhuoEaqIELXecLlRmlj+uuDTi4EkrCk18gl14xYquCam8tHeZFI4io8+8cdrpImlQfjBnorkBT2GRp/R09JDbrizqbBXkgik+rWo7fer6SlBG1I3T66tZqQSgiRWr9h68qlRPmGd/y1JJLUhFvXqVvTKV4K8FTq5kndPQkkvbUhMZN3lDGOjqncOzUmWIMkusJt4K+H0+o4x8XWph7+Y5CHAkl554ivj6dUWnhHxFOG+4fnR7gQSPJrB+wspR0RU76nvxbJQtKt88DZCQ8YnsfYQWCeZ7L3xw0OdSXlAUKIcG0dPnnT7SqK5TEWN4x5ljbe2fBFeIgbieQl2Spi7Ncbb5czYkfr72z5fly4D4nkKOEcNnXdmaScekas2KacOyfXTuvuSiAZqwp8/49rhcZGM4fFBXPNjTXFd/58x0+BZC6hcg8IGzxt3eWyOpOZ5sSBo82muqILa2cM6xropkSyWOnSqk2fEfPWncmprTeZaQ5j+8CYY8ym+trc85u+Gdmrja9OiWQ16RrUtf/oaYt3X35kpO2FeZabuHPB1NEDurd2I5E8V7h2ihkz98/1CWduZ+RVNLDYNjDbaCjIvHk64X8L48YN6KAjkfzXtBkw8YdVu8/cTXuQU1Cir6yubTQ1my00w/I8z7MMTVmaTY21RkN5aUHOg7Sk8wlrf/isXxstgaCQUGndffyCQkL7j576/bKNe07+lfyooKSipt5kYVnK1FBbqS98mPz/U/viV30/eWS/sJAgPx93rYpAkhBWUDgg0hQAANCHAJ0BKkABQAE+USaQRiOiJaqjUlq5UAoJY25YqsaTYo4aJdbhjSciPCRsk90OvmS9ZGYn2X5U9Sx4N4n+NzM+6dtH/5X9l/MLuF+YF+lv62dj7zBfs7+6nvRfxj/AfwD3K/1/1AP51/of//7R3/Q9gD0Bf45/ovVU/6H7P/A9+3/7ne0J///3z+AD//+oB/5eGs/CD9APqV7FZwMADr4yUrOQhJiu77dQD+HdMf0AP1yJUdpsnl4h4gaO8v5ISL7gfvMj/rRt/K1WxawQ/Rotp/OTE5KvTg/ufvcs+NE/pvImJ4SWmCm0WXlBfJVNe7e/mBSXUwC2FUBJe6LH9zlPXtkBPOUt22s72K7ugHL4S2UDqqaj7wt7/+xYh6kuebRKA/OFPG5rM2rCFn8o90RF8duZUqqEYHl0VsZNt/+og93k+FJ6h6ZJh8IWK8PikDUl3+0u95c3Cy3BjKnWRYFeD38p9mYS3eFXU1ViMKW+VZPWfYzFhl2Gfesd/tOF1PnukEj0g+LiVtHfSavFAjft1MxcqE4srPkVvm2/YDhIhm/DNZ5yc/wM0i7ukQyBnwTxap8zMoTRc01pfnkxEIqjLN+LuCiBzYCja7/WLvzDFeSaRcZ9K8x6Bgnx2XIUZhO/B7+gS0Xg0IzGxaAFNFC5AMJ38XS81mvdzmNTcLn77XhOnnZlMEJphFAdOJ1JflAwJuWLSiWF52mUT0SEmZd5NLYcea4rhmEutDGS/kNqBGv/nXu5pkPAUkJlhXrrZNskDVHcxd0iw1xF5KxjV0kgHoMu+BJ868PmxFHIYXkZ/3QDG2lhrFZeftxvyMeXZhiszyVx/UpmyXIi4pHCV+OxloCTTMT2hShUdsRVtxoRR554kWAi6ntG+TeaHbTREp8Jyrs1U9coeme+/oyMgbmIqzLAMO5fqrlF0XUKjTRBqQ3w8er6LnFjS4X4FOG2QAG7lK8vStIarrAqiJNuaSjCARP2dl1+3dyG8XG3RUGIvr3mSFCQyvn5Js0rJ79WoFDm/lYkDZtFsncu5l+HASAR2UcAovu2Fy4Q/D76gkSJC7l8ZPHv69qXX+fBRQkXqvHL2rLQyT+6/nWgnQRijBUctNiZtrMmxKmE3mcgSVnqJT6eIkvp+50xPPMl/4mj8ent/ZvoZ9XyyhlI9sEUL7F385Pfw0R1dzg7bxVvE0+u997lG12cXJOKGORCkwiJrMbGZD4kmnYjb6NbnYq2q7Y11aQsB2DNbhUr3HGvYbBDT9QXsliN7xAff2oWXhS9Zk2KDuSIJR0+zvpQURbolmt6/aPYeNpWdpZmEGVuWj6kS3jzDnlEHl772oH3IcW7aBQ2cSrfifruk4Xkn+FGzLan29lhwPmUoQTojxKcmr6ve4CtVqLkjmUVTCj452scN/HK1W0r4A6sRK0zWrVbGSQ7fylFwOrdyCZa+vAx3ioBxLXoNzlaSAD+/bToAAS/mmb//qyXwrj7rIbTIGu14MQlTvCkhwviT+btMeD+z4ssXThTnbcLWMU3klem94G6SzzhZAfDhCmj3PBF/ADG9oKYUnXW3IwTOWvUMhyYbqGB2P/g6nfytRaDqXzWgxXjQnYBwgwJPLOBe5I4qc/hnGtNaWhhHInseF8yWsvtISAIvbWTRepEB8ylw8vAsl9b3NBPGG8b5abmbT0FCkiOf8W8YU/FHyAMqrTypmy5fOXJyEmdi1hqerP+lQKi6adHYliGSyKUqepHOkP0Omxoc9zxBCNGr1az06GEo//ElNc0TQIcXMZFMEndhz/+n7MAAAAAAG/+jbwwoCvWc44bwfyUnZ+YVO3EYsZL7p1spwXw3gvPcERd3W8t2ZyNX57cXCu9IGhDX6xFFqdXUq9WRU+RfnSQVtUArBiMG4p+o+3S4bIUINekSHBOqbTh3ft5yT6qmOhrQzEgQW13CpC9qIUWQGbiYBftLkXc32r4cVSTxs0unUT/FEnZP74S6vjgbQAfJPJ5LMSPsOyjIC1xg1tJf8ffL/nkCNYcLpnuR7zZAAADf/KTdqBUZoqH3n17+MB9epJcNc33DuT/s//P6+UUEjbFdRGCzvwWxvnY0GLkOUrakfNBW2StleMm6A4CUCoU48awI+RZAVY2oRA8d60rPdsxhk21BnliZNZiZQaV9HqTmo6Z53G3w/L7+0rl0AgNeiFhfMeHmGnJFOG4kH064e7SwrZ5vQ6K0yK92Vax4CNC3CSzr3wOZmmLxTCeRiXBYoQGlERMaF8lf+4JMjfi6P+pVXW5bKruoKLEAfP5aQmy0h5+x9M6TWFN/4K2GxcUQGGA9HHvO2dr1gV/uT2qFAJ+C+9DNxQS/dIe1PTnyihsN0GOZBq9i9bdIFN3ZwiK9q6oZPyEqXJX62bV0+cU3YawttclbafRc6SmGD+NcWLj1BTwoKgBFItaTGTB1czgxJOALreR48+lmzg/NqPdDtyolZncvLxNkhPJfJC/JWVTeMhxGYgNeaCvalaTgKBBEhaH8keh7iO9TACDt+7uYDgYxrerGuOw8qNxT0jbTkBfu1T6BCb3z6WOrhKIfEfDL8+lleT0Uj4NkjaC4OAUpgb42H8OskHeiH2hwIXjdwBNS9qYh1fgV2n4l4bvNHAO/V4r/rMwgP1h4tVa6uuq76FR1uugZBgbR22HN3VxzW3PqRkeljoXRss8sdv72t+1sWkfITceYEQXm9YqQ3hm4RQMdTMil0y2QLcXMexhRWAA8NdxUl8OVQAGAtpAWfZwpV3F1YOAmRUeVQClcwwCLA6GZwm82ZUT39LG8+ZONnT1QyV+IXOeEER0dVG/JxsDP/AC//+Ef7wuRJfq6/9EtKWjDHXCliSEiMelwm6yDkuU66XxgXoPuEYabUBDXDyDqSWd54ggPsueyhdUtgNkXdy40bE1SPfBLcCkRgrIRta3G9QFzH0B1cPC1bJwpXdhXUaOX0phtwZbFVApp5zrBQBv4D+1a+5yRT6tkDL//ZpFgLjAOlToiZAVI7kvVMpPKSyy4C+tNeBquQvVeWwzZ2/qLe50HADuoRDxV6nkb0m/k04K3HC2d8wIIPaoNCaWdavxPMU/kmKRHIA51ZL9nJzfAnOKy0BGtk3TZMfx6ACE4HYYuU9GgzQYwYMI/KkIH3L6xO1I43nB/Vwbm0/aMndID72i3rbTrxVpXn2/SMaGFT6EWN7dzBOrlx1EsmPIsk4k2LVRziTIPJFHZrtsjG6dZBwL0R5cbgoT5aqSX8HyjWh2fk8vW/bMvXLPTfnCz3veBwYlKs8sPg7F7IBiGuCT5K/2BxwPXPIyORkE9Ehoa+vkL4Pl0hEukkx88Y0RNAhTihaBl+6EBasNTRrzoiRoyBAUzJmQfbqvYv1eGlpTQqYD1Q/HmADbm69JH0V7Su7S0/EKq4EmA1LhQRHskV158mRs70Y74oyVLnuuV+ZQfg1+k5QvGHEA7pc5KFK7ts0L8EDTBNk86/I4GQ9c3cXSAzNlE8g/scpQaj3Y58rFsisXyrSRhqg9CX81SGGtJRB1/O33TaAJ/5Cx2W9nVsQJdirwg/t8kicx/hjwu8X+0zlPYrVueqlFL3iMR7fUxmwaBAgNsAWRSDMkFbv0xAC1E3/3IA8F7KFtcnAj5l+zkH7tLhVF0v32gBCVTgKokbWZBTz8RPKWA5AbKbo5Uek/ezqZlEtTs2QpCXvr+O+UMHC5y/YgoQVh82ODTIKnTnDiJJv9nva9NoU/5qF29PPUq3/u64/rmc5YdnUyD7ZikCfBLO9+b0Xy8IuJ2o3fOfOY6jFPoevLUSPCUmnmG6vR6A99tM6NuJyQ5SUamW/SCD7ka2lg724jo/JI0EA+QlL/7fzSGpWKoOTo6QjzfFRHW3yBQZKt4nqafQ/WguHFTIcpyOqkaauu/kq1n2pQyHlqTKbPZp/mFByPXg3nI5Jyq26rWHdCQaAwzcImDDxLDKfadTZv/pvG7BB/NogK4C/lt2IParXjMqBRecX5xDzKYFXw9bI+ITIb+GPCqCAlQBEVt/2SXyMPG1X2M/g0iOqfswXHWRSszT5zpN0hI0sLPwORRSmvpbncWyVayLgt5JqKzlSLPGpr+VRjpaFvRLb16YuM3QRsD/CmPKRr3qVsoajEpDm+XLHiMMR5o3YbO/OUhWUuB9r2uIrjNE3833rESkqJdZhyKQBeBiiMWnisw1B0jUfdd5NyQ+u5RWOzAECd6Wg5xoJS2HZdMZEKwDeWlxS/xwGkRAoR6su9ry3Twwp0dBSWjk4h475Dr8ed7FG8KdiBQktZ5aJmstbnhrvgap7Be5xltgJRzSMMmvO5MTdfmJ5YtcCG8UIo6EHjEjGzkvCO0vYR/Qia/Wjup5Ql//lQRUGbysOF4Df6qJfmhIEEgvz69s++sPOPOldNmtOAjSiiMcCRg7996NkO4g5FOKRqz53g+nM6xnz5B7uqQ7MpcHEPu3S9TB7Ek+D5UROFImn8zKtIPCvxXgGHfYH/7Jp3b8qgX/zFfiuT3aGNGI6aQ+0R0spoXusmHKsKFc9Z5lDurIXjG7PDe66leC4H06uDKwHsJXzCroLYny9Q5UQkGD7wewUG0C6+Ykf591SpLoE+Wion/z1gBBNOcO5aS13CEbTZWxz0iUOGdk5ZOrSav/Knt1PDHNA4YnrOFNdm9wfJ/jP2pQaCw6Ilc9U7B8yBowKUXrfKjzeK9z4iVSTR1WMG1sIXit8Viz3jgjYmx3fHAfLvvUkQkbQ7aMXX9m2mZGL+9s2Qr2NCMuMXRxg1vMwT6mSE4J5tIcDHfXunaXVYHhOhjVcJXpASly/+KSabiOy4lWO3C1U083ZcWsnZSfi60uKzB0F4z3GtzL3JaigDpnIa0ZnCWQbrYjqdI+CftePQzqHR9EeVBnBlSrPE1wMnjmyDFEr0Vw4O2ahYfnXvPIbi8IX6tAsuLs08Wz7vGPrrhtHZ3K1ZxPA15o3U8rV3xChUygMxqALYnN1+5RHQzIci2oUR/QIO4NQvdP19DQaQQ+1p8/9NOHKVhoXE2XZetwGSYwGoHAOlKQkSolWnPG4HdwuomvJn7yHyFSgwW2U3tqOeU31oBMgEDEvv8pb8VNi8IEYleWyaVB0Rg+rsFaKd/bVmt+Hl+cOW7vidRSJRDfpXwVrS9WjvcCXxvfW6CPzC8cIMVuxXKRnKSQ8GdTORkUAIQY+A7CfXgjDL/R2aiecAic9VQLPPpe0O6TxbwJnZIWz4DDNlBXY5UlDiG7ofJRkZXC6WsfmAAsSYER4tsrJwIbjVJk4x645+oHkdYWYNgBBm7rWicU7NSvXdFPCEgLy7t9BA2mFfPZZN7QJcYRjPIi8xMAs78wZ8tmOe/FGfVWpsl+McmREO95+Xh4fBOqb99C28AuvK4cFUM5Hv5HiuyWv5BrTLHxkJFJDgA1hdRJjrmpqErELq8nYRrdeGLL0Jh19/DQqI30YGSS9zllTOxH7Badj5QuI+gnxkQqq0KAEKIrm8cXpuhf//1Q6e/0ll3Ub/9wD0OVpBJw7lOih6ktDjSBplYHpLk4gLIuv0W8OO6KW87lKXfZUt1KtPNz/lxqwX9Cu7TJ5KH2fLDDptAWPivKJDQxMV13L0mXviaBV3ch+YWKhsxix1VFc0ODgj5wSdB/7UJUxFZmkSrVsJT9TTQ8v3n5p6nvD2eCNtv+b9WanfYYsuC7ogMtB75B4d5UoC5DAOP9uWGb0NRpvM1dyW3WE2epqzBG4dje4btDMkP48xP3v74Z69UIBE2DJodswKywFOoHkKF4lYYOK/Uc0N5fk5YTDMkYg7ezqPeWVMDkh+Os+h7K/u7q+onb7UUznFcqFZqhKmoM74rHCA1IdIGkS6jAvTcjRVqNFM0yJLYp/++yQMAALcUa6DR8h5K84lb8G6UrAaqd3DVwv6i0RsP+x1v9nn7DGimh6gaWP/co/qizv2/0/b9ygdc+A56UgKQiN5nwiVZxibZi3Gg4IZ4o30ELBm67V8/djBOTsb7kn84Lnm8mjx7+y39gat/l3opQ4tU+UwF/xpUuol+uI/YX8OWhQD9wsxMsIacgmAGyVjmYd3xX1OUJZey8SyFzwCih5lGmEc/5Un4NBeJPXLPrWuDzYMbqBaR996tUzX1zvEDHKphpK1mTC/eEhma2GmxKvt3dDZSX+OePWXcKVPsgeP/3bY7Faacx2MG+yvSq+UrHDZYAAjhDgAICMjOpZ2gwOa3uRtLq3uf62xFbEjhsIf96O/MD2Qz1m3XGaNVYKU8o/v6ClkqDQYt38siRAR+uel4sbmPDl9cYDbu18G3L6akaldt2BBWuMXJYhzZ9w8M9hk9VH8I8+cgZNRDVtF0FOgSBxwNhLHlIiclZVP9gnduo83E7hyEpvnqdtCyll1W77HSTkcHSvWp6fh6NKNcreRh3D5PMrx8PGSiaJYgMQaz/+5PS/PHxmZgzt+/RB547I1HzAgD8S37V8AAACi2XkO10Gj5DyV51xlD1g6ktTXz7wrP+rQkUL49GFWJl40FqohdJvdHfbYBO18WTIXkxSxm9y/YDCClEfsZOSEEFJPGzloxagX8j0CcpYLornmjZD1ARA40lvEaSkUq8Dr008Tje3K8Dnn3nKMtV82Yeef7H72QwTwv98Iid/9zrC2+oyn+JUmJoYPJtIkT3XRgbtPOl9hFgi2u6G/rLH87FfFANtH2rgGvQ28J2vao09R8LPs5+9X0MRy7+pWm3XlwgAAAAAAAChx4NvOtNig5iXtI45/CygXZJMacbcdF+EYCQgH8u3NY2fIIYOWQlx4KIpQxyO2TYC098XcLRD3Jnk1NoMq9+cJstFYv5RVIq1KQiJNy9JOMc+DPvSoySE/GJ9fD5Ug/S9ZY5zY3af+MGBr2sNNpMDvo1hrTP45IX73CkmdUfjtccxB0QI9cWcrS7wWVrMBr9jyQSSteDHuwPZcFNM0xrl3UAr+uztkmIMYug9wD2PVZ3MWg273/zaB+7F3SRgzjHlSD81o2Nvjob+Lf/D9ao3Z4/m/wXodyihz9PcR5ohedSjub3fPwxOGjcw/Fkk5vnrcAnn+XfqCpYXX+kmiTTGz4vrDjnQzem+bUlrjbf/YiysngAAAAAAA" + } + }, + "document": { + "size": 17384, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576845039, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2439": { + "id": 2439, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "675168768736887083", + "emoji": "🙂", + "isAnimated": false, + "width": 128, + "height": 103, + "thumbnail": { + "width": 128, + "height": 103, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 31310, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576845124, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2440": { + "id": 2440, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кто-то пьет, а кто-то спит, кто-то секси (я про Сталина), кто-то вышел на дело" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwB04zcvj1pQvFP27pWJPenyBFiYg/MBUsZX2EnAGaZdJmJVxznpUiSOMgP+IGKjaRXdQGyQDn160lLWwNECTupO9zkjIzTpEnlf7wwBnINNktpBE0jr0HFVJ18uQgcU1qBOu8zBCxzkD6UwExyMCN2OMio04b52KjHUVMsY6t9BVCLBMsyGNCST2zUc0UglMkqEjHrRRUbMroWVtLZ0DbTkjrk002cr+ijt70UVQj//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1576845317, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2441": { + "id": 2441, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вы там болтайте болтайте, я посплю" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDRAFRXQ/0Z/wAP50SybI8jrkAUy7kAt3GemM1D2GVIoDJ3AHvQUKHmmo7bVQHkDOaXJLZzkd6hxSRSHqPeilFFc7GF0zOoRMbgQevqaoSzyPIwDHBIzj2pshkHXPPc0kMRdZGDAbBnB712ogmaTbKCOQMfjTZro+YQvAHSmLGxQNxj0pgw5+biiyYaomE8g53de1FMYq5GSeOOlFHIuwrl6SOP7h+cep61YhWOOIARj/Giik2XuU5Ufedse1OwFVJWCXB24K5z60UU4hMNh7A0UUVZkf/Z", + "width": 1280, + "height": 1273 + }, + "sizes": [ + { + "width": 320, + "height": 318, + "type": "m" + }, + { + "width": 800, + "height": 796, + "type": "x" + }, + { + "width": 1280, + "height": 1273, + "type": "y" + } + ] + } + }, + "date": 1576845611, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2442": { + "id": 2442, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAkACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCdR8wqlLM4lcBzjJ71JdSMX8tePWo1hTyzuzu6g0thvUR5Xz1GMDqB6VYhy8RAxkgfzNVcJ0Ytn2q1BgRHbnoP5mmIQxkR7/fGKKc7lhg0VKuUPdMS5AyG60FR6DHeiRCfmB+amRuWchwM+lDQ1sQtEWk6EDHXFTRcRkHjjv8AWpPlXJAwKaGV1LHpTuTYQiioHnJbCce9FFh3LYOc0hQMwJHIoopsSEb7wFQjJJyTz7/SiikgIHG1gR3GaKKKaEz/2Q==", + "width": 500, + "height": 450 + }, + "sizes": [ + { + "width": 320, + "height": 288, + "type": "m" + }, + { + "width": 500, + "height": 450, + "type": "x" + } + ] + } + }, + "date": 1576845631, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2443": { + "id": 2443, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я за то, чтоб отставить разговоры" + } + }, + "date": 1576845632, + "senderUserId": 327556368, + "replyToMessageId": 2436 + }, + "2444": { + "id": 2444, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1360886329340072497", + "emoji": "✊", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 12369, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1576846265, + "senderUserId": 860139781, + "replyToMessageId": 2443 + }, + "2445": { + "id": 2445, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А че, отчёт с корпората втб будет ваще?" + } + }, + "date": 1576850777, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2446": { + "id": 2446, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "там шумно" + } + }, + "date": 1576850809, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2447": { + "id": 2447, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "119412984320622620", + "emoji": "💃", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 27778, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576850821, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2448": { + "id": 2448, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "954082055153516571", + "emoji": "🐊", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 45080, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576850824, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2449": { + "id": 2449, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Они пока драмы разминают" + } + }, + "date": 1576850887, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2450": { + "id": 2450, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Там группа с барабанами" + } + }, + "date": 1576850895, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2451": { + "id": 2451, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я просто надеюсь на вас, котята, что вы выпьете их бухло и утанцуете их сотрудниц" + } + }, + "date": 1576850925, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2452": { + "id": 2452, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "442315385912426582", + "emoji": "✋", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRmgTAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSI4EAAAB58agbSRHl+zdP3/G1wuDiMjElVS5DWaRLu8yDKqMnyrSZMgks0ENVpGDlW3mGdRu2zYeTfvGKSRVr23btm3btm3btm3bZVdST557fky77/M8537q0WNE9D/x361we/2hcFKx35PDvwW9bugk4opVaDx4ydYT12/9dvuPWzdPbpjTrXaZkBc6JDboOG3H9U+ZeUUm/VMskpv+4uiybnV8YO0rNWTVqfc5JinLvFf7p5bzgqko3W3v62xJlgvfbmxZDAx9TWfdKjDJnljmyZElwCy+w54PMbKz4NqEYgJ84jscS5Nkd96tfmEw8bTdmy3Jiby91QQYiOprvpJT5tPRcXA8NPxJjBzMXlcSzorKe/LI2di55i446O14N0aOv+3vgWPB6b8kMfg+2guHkpZnEY+UyV44UnxXhLikTfbCgeJ7DOKTMtEL24sfNIhTykQvbC6+1yBeKZO8sDV5h0HcUsZ7YGPC+ijx+znCA9sCC/KI45fuAnb1TCOeT2rCpurPiKm5OwxbwgdM4low3Q0bxMAc4vuhAWyoeJcYmwcCsOxeYhDnjD4CVhu+J97XysBiYK1JvAvGu2Ct0WfifqUELHlXmsQ9ZwAsVXlL7OVRL6xMKSD+n5rBQtJp0kAuFFBv95N0OF8cyq5FknRIbQDlUtdJC2OMC6pNskkLeSgARfd8g/R4UhyKwYukyc/mUCz7njTJHQXF3umkSdFiKM6MkCZyrwtKYq0kXc4EoRQ6Q9rcKw+livdImxd1oNTgLWnzoRmUmn0ibbK6QqljBmmT3wdKQ6KkTWFfKE0gfSIDoDSB9CkaDqUJpI8xBEoTSJ/oUChNIH0i/aE0oJC0KegLpfbppE1ODyg1+0zafG4JpfpvSJuXdaFU9RFpc68clEpcJm1OBqDkOUi6yE0CSmKlJE0is6E4r4g0yegFxdG5pMnXBlBs8IU0uR+GYtIz0sPc4Ydi4LgkLYzZbii65xmkRW5TKLfOJy3eVIVyxRekxYEEKMftJh3kXFiYFSMNMnrBQqsvpMHjcrAQukT85T4XrCyMEvv8IbDU6BOxf1sGlvzrTeK+LQhrjT4Q86zOsOhbFiPex0OwWvmBJM45w2BZ9E0jxvJsPKzHrTOIb04nARsq3Sa2cncC7HANTCeuH5vDHv/SCPEsWuKBTSWOm8RRXisG2xo+JY6f2wnYJtq8I355k9ywUfT+QdyMnQmw1TshlXiZ58vDZu/0TOIkr9SA7f5Z6cTHvFEPDvgmfyUu8kptOOLp+px4mBdqwSHR5HQhMTCOVIZzxeZ9J8ezNpWCk94OhwvJUflprB8OJ427kyPJsaJb7d1w3FV+9JkUcujbivICHFxJnbZ8i5DtMu9wOzfYBKuPv54SIzvNlLN9QmAlwl2WXvpmkmVpGtFItOD+5q5hAXaiRIvZO95mFkpSjuV+enh2/+bVM/pX9IGpiCvTavKBW0+/FEj69+iHc8uGtK5RMjHoAm/hji/XeuS87fuuPv+ckhkt+iPy8/Pzc8t61gi5oJEvWLpK7QbtBg7+bdBvfVvXrlLSj/9nAVZQOCC0DgAA0DcAnQEqgACAAD5RII1EI6IhFgpW5DgFBKAM+d8/8B1mIe0U9cn1W+GGP7iM7P+b9Sm2i8wvm7f739gPd9/eN9M9A/pdf7nkuflX+k9q3+X/pPj74a/UGal/VeA3yj+E8yP4/9sPxv9l82e9X4G/3PqBfkH82/zO8i2V/2fqEe2H0v/Vf3L92PMl/nfQb6w+wB+oP+v/rntj/a/BM8j/2H9G+AL+Y/2v/lf3n3Zv6z/y/5f8s/bv9Jf9b/M/AV/MP6d/tv7p/jv/f/nvnG9k/7lexB+pymMHfIVtpQil8K8q3K9WjGeKR4u5J8OBRy/t+xs1g6en1oTQRSwaXbCCqs9Vw1iVWf/SFKEmMsMhv0m9dvre9DfmibJVV4LcuIB0/TVG4mQ7L/C54AiAFjNROrZfwBP4byK0rH6O2YE/5gauFsV3UH1Q3AwIuLrecuttLl/xfYCXRrMjq5UOwDm0KFPsL39k3iUZJX4DqQgkeyrcnVlO6RfhrnS0l8AtqL2NLsdQjYMbwlBsMtCoqU1Nr5sdn84Iz+q+5FHF9y73k6LENed6ZjwCU8MPkPZopgXdYmXxV3/rC5ahTpoUozeFO+CR3Qo3BkAA/v5HgWsa4z6KmO2fPswRkK9m9TvIh4wnOlMD6InTUVZ6YS9yA61L/kKV9gVrK9Zj9Dues2o1ITkbO2iIxZi0Gn8xKo/Bsmv4weqeVhnAH2GW6IjIQ87IodzlUdkoSQt5pbz8jmI517TyUgfbDxapH7kV5c14IcWYaUf2L+DOqDCG4V7sYnB2NN7hS9L1klY3OPlBBKPuTLXI0jLCAT4qVoZk+7HslhHMuKCi5IezO5A7GJwHKjG3yeWa10rEqKKFeonq3jyKH/vSle6cJIKHbhnIE6hPKQRNsdQ3MKQFxcD9AW2lSVsrj8BN4frI+0zf+HF/HumtGHBoROWUJw4ghQ6J9iucXwfB4MgyYg/zoTw7IgVyajmZVoKTIv2dAZ+tw/sArbb0PtHdW1l8bvq5ey7O23BAT3jfuqxylF8Cjz1Ri2qytbtS1hc0vSmPF4nCXjLR4QAd9YfyqavrpX5c49bfoY0oov9MzQ/6oEWtblnRz6zr+RugHpuFK+21wME9nYZjyEAXPVmKaUtYt/Xu2fj95yz5ZgARhINZZc387pB9mxgQ/tmawxIx10GZI9MOP1X6ehH4CHwD58IPsnHJC7H9GHP5nAjUo+Qmqo0YQJSc7A9W8eRofQMEoZ8bAqNF+mbYi9d4wLLgQMX1Ls/CvmiiiI3x/Ue/MJvvqYpmio62UxiWIuwXb4z5GQyr+rGY3r9APiKVPo/pdcdN7w0xL3zYodTU1RTdX7EAPBIAwzqn9ZDJGC84Hse1oQ2tZ2oXowto+bn0N0mpP1UOYkpU+5sAQJtGjzQPajgmDeweWXDZLtpEH/TkK1ekLlXIo/RdZHOW65VhxxIgeO5f6zszRx/hX2S6atkAlxiRAH+zgarX3/1JIc0A/B5Xv8WuzGVTk6tM4u+hVaoIeJ438PgqfsHH49RM5c1x/CO3Lx389pJ65g0nO1+shykpry5wgMvM6Cyx2uoHRR5IVclXH7IKtjzgFMtWGYeBoJa0tIhL9Omx62rnECQh2iFtCaudfD06WTqdq0zb9ndCCngvhITKGeMG4AFBWgzZ3OWvLC21LA/c0sp9nuaGyFnHufsBf2iR+unRlnwWeJSYXvRrm20KvmKcl6vdLjlEVi3Uhdu4C6RC3HMsGmWavK9ow7rvFC0SUYz2fDQWZM0xahlurYv74xYlqe/mDX1JWQpMPUauR/F+5ILKhdoAzLcdLXDUo+DHIaVY2MoTHFjLKIA9KPlNzx8rDQpQoks1Xljkb5hBggy/yzsdH7/S3CztdZuTigCjlAjuzpMsMdImipNdmvSKOnvJTXO593A+VWpgdTh9ukuqwSg97avdm2fOIpMHEEP5GI0USD97AdKH9ZJ+EAzIvjMzMoKG3nvsOQLVkbmqXAdPs+TbPforTYLokN/EOQx4FLMyKSom0zx3wF38BF1BnrZAior/9YsEF5rV2xNNTl0y9LiZ1j8KfvDZOHZXIHgyEH0E8dlmuwSOa5iKloUAax0yoa8jMsF91laJawiqMIIuJd7n+iM6M14Q2RwvXglv0aqLKkHVuDCUKhYNxO9Rex6vX9TJuPlMAaZ+rskBFM3jRYS5EcTHhUZaX303ZCFh9y15wFoWEg90uIvaUg8Pf7ENXL8RHYMhYgQP7QpEUAYdpxEbBOGsJzyRAdfQsaZA5oDWaDZ+cc3p+4PSPxuta6QjXUSUkCAAL/FuLl2INtcGO/5dFD20Le+PHBbOYIdhNe8AdpGnEQxRSyp/Nmuxp22xDVhaG8uVOrX6GjqPLy+w01JibxNP/SEEmoN50Qbdc5hn8RcqglTxqXLrZ6/zkTIZMRx1DOWJflO7Gxu9VVPgGQzI0Q7xfDtMExm6b7gwnb2stdPPp/URjjqH2HlNus3J9N3cXd6ZtFId5RGZ9zihc/uzVoeaDSWosSDfclaogrUQeANXGPF8ExT1tC5rvEtrWVndzRmrSGNzuSkc2O79y4kYqd9XSA/Rmew2QapU3Ax/eU/WjDbpAznE/K5MVD2BW4D2rN5Uaova8PJdq2/wI1tBUkqoDawxcwby48iSUH70+uTe4apNPOUm7MoaUcO9MB1BbcxccKozRFFHwrw6je37/GbLm75SUkxnyiLEzvTZ3jXCDzuXQ0aUht7c5gdl31x0PXlcugXrvjQ3ctGhFEOZAjZwLaGryzaQa0RV8cw1K258DlulQg/46Z+j+fJlObHrCOVPyzMGa0cpScEN0Day0NX/GQAwGFJX4iG5QkR95bVDPJ5QspgDHImJf35HfoPrJxTdPODLgbydF2znS43sbp+64Z1Lzi22OWA3H/GGf7PORJIvQzbYkebaDeGpS78jJtk7KkXH8M3k5eVwUoDfYOPuTebEFOyntNOQWbJdjWfxzPLehKOn+OvHR20F2YyYFMfj8Cx+aL6mBpyhahfp5Gf2yLd5h5JFC6NXVJdb49Aiea4WfCWe46VQysQaXv20ZQZqJQ2VTF4ae2P9CPMjkAOzx/ylIUNNgpqBVhJB4GV/g19e2vP5itp2j4v74v7nRPIx5IWcjZP0Jctux40twJtZ6ptwvTw2ZdXBuKNccgHNFjJ6oKbdKzRgrXx6xoXgrYVEy3Jvge8WVn1VOaKrQCErM0iwxn6UwF/rftGEAfZ86BQzvmVRJE5o8NBFp9iZus9oqeSeIn+m/sNePk6P+VPTp3zpp+Tc4VczZLSc95CuIfIM/ijRabi/rd8Puu7PtOFVHRRfI9hPY5tTCLWVODN35uIYib1E9BHt+kBTfoZnBFabbozloWk8XrhJ1GyMU9l9NCJ1KrsqEZPJ4beaI+OYYoVDlT4iRgihVl1ebJ+WR3SAvfitg0+EjFA75YztmE6QO3pjG2oyQfzFE3eHOokEuYtwGYirNibHMwVYwGwHYfA6BVRLCprDz3mFe2T44QeQEQyDUjMEeZwckdFeP4AbH9ufboqGdWe0zbIz740MRtUZOrd9iHTCJEjOYuHSVY2u15MuTyXxU26YLDnfMa8R/o94wEr9jpEqrZ024ck03Y57i+cuDQg/iGZJbQPLDWbh/kZEUBwVxOqoRrLYM3ZZy2EdVJAQUljk6oLn7HkNG1qrE1o5T0KQ8NK5Z0QJ+l2l68sFrDb/xta6Be+LrrrDMdDOUh6mmkDk2x3tAESycBCNABuY+PEUqJUm8AXathpGnalWEl/OHS5Wx6svHH2UKsilvVjAY6W0C5MuhpNmLRk6QU+OPYFzNLmho0VlMnnekJH/5ULxYi82CDkVU7v2abWfFoDNg/u23jQ051g2AeS3Sva05nNlUuse7rHt59tYsIFXr9CBmCLGL9F2bdRhsrI/A3yr/yKcrNDcvH7/1AbfCaC0UM4Yc+1YJ9VK6M076fvHDyMaMAoEwtLreWiYR/PzsjpHQNY3wJLtlzv5ry89OW43imZii+PJ83rnFQC8N/jyGU+vI+oPES7TwmIj0Bi74AsIA9OT6F4hslB8AnaezT3lfoHYa37j/zVFcmtivjguuwilfe9nQRAgBE9Ez+8UUhHl5WEiSM/IDW7Sr4e+sTNxeuakVkGg3Vw5dcA8o8vOrO/DWbSPL8N4jA5UZXrNy0Ji3qBuQH+HS/A7rMsFIHSGgrW0Fu77pEfNYD/NSl9OaxFsuoWWbrAnVumvES1QCYPJNaRY4aRaKacY2NMHfyUbg3SvC7skfzFSf5bq9iZSa/GeQIEMwbl+kB46aMbyWYOiRrh/es4rkXYT7NVH+eF1Ou5EchMfK/Dle8xHiJA+a745HWpBS9jG/aK+dFxy/L4ORXvwyxUm30Em5yjTEgsnMWXQ7NDCOi429UXuydnLioZRwP8hFghFRItiMlBtfZg6l91gZkDIVOALn055f1k73EooQL8iOOde6aDPrJWn8k6gNYOznhxaZ2zddxht7zEEHF/ss0YMou1IOya23hFKaxvMThjZdvtR+2eLZoCIMEfid/koYfQt22+YW2xvoskZizLDZbrGSpHQvl19VFkuFjrO8efR4D7Odsp4avOh03BI2AeUPbA1yz08c67GIbX4P4OfFKS2wd/c1XjFDOmkNALxxKbiCMBZqEmQpHEG7/VwkHIXpXIqk9hbBAs883rWmbd41ffg9053yH2RzOU5myLoBLtnt7Zh3g4lp0kbK77Sy4Kgm3n3t8DhSSs3WKDEJgy9VwhD/X1jwMIXzJyyiONlkCNztpCfE0eVqNihu7H5Wv/VcXRG3ty9HvONY+0TQBqPGtQtd2P8nxxQQmpT6wEAmjFRi0BKvpELExuEtGPqjNFQk/6btDbqBjqgDawQ4y3+T46CID1hTuCpb7z0YiW1QYdyblxGBjj8obgbzqoAZ4cg4vxo7bFdixikHqrao0mBO+88EryJ6LXimcS4kTE6NRzxjN3mHIENVRqVwr56Ii2u4RC4hcL/wAAAAAA=" + } + }, + "document": { + "size": 23300, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576850933, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2453": { + "id": 2453, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "582458961895096488", + "emoji": "🤝", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 42802, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576850949, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2454": { + "id": 2454, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "60854042997295645", + "emoji": "✈️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 29242, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576850970, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2455": { + "id": 2455, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не знаю, зачем, но говорю\nесли что, я в профсоюзе в двух шагах\nесли кто хочет, велком" + } + }, + "date": 1576869807, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2456": { + "id": 2456, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "тут пиво, вино, коктейли и радость души" + } + }, + "date": 1576869863, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2457": { + "id": 2457, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234188", + "emoji": "☺️", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14682, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576869866, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2458": { + "id": 2458, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Норм там?))" + } + }, + "date": 1576869985, + "senderUserId": 141185012, + "replyToMessageId": 2455 + }, + "2459": { + "id": 2459, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "да" + } + }, + "date": 1576870099, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2460": { + "id": 2460, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "там много баров" + } + }, + "date": 1576870106, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2461": { + "id": 2461, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и вот\nберёшь, что хочешь" + } + }, + "date": 1576870120, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2462": { + "id": 2462, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и хорошо" + } + }, + "date": 1576870129, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2463": { + "id": 2463, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "нашла два бара со вкусными коктейлями" + } + }, + "date": 1576870157, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2464": { + "id": 2464, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и один бар с вином" + } + }, + "date": 1576870172, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2465": { + "id": 2465, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234188", + "emoji": "☺️", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14682, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1576870174, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2466": { + "id": 2466, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Есть предложение сходить покурить кальяна, тут за углом в мяте.\nГде-то после 19\nесть желающие?" + } + }, + "date": 1577193985, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2467": { + "id": 2467, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я очень желаю, но не могу сегодня :(" + } + }, + "date": 1577194196, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2468": { + "id": 2468, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я смогу к 20" + } + }, + "date": 1577194309, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2469": { + "id": 2469, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я смогу, часов до 20:30~21)" + } + }, + "date": 1577194581, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2470": { + "id": 2470, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "можно будет тогда где то в 19:30 выйти и до 21 точно закончим" + } + }, + "date": 1577194649, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2471": { + "id": 2471, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "+" + } + }, + "date": 1577194931, + "senderUserId": 860139781, + "replyToMessageId": 2467 + }, + "2472": { + "id": 2472, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Отпишите все, кто не могут, мы поплачем вместе с вами" + } + }, + "date": 1577196074, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2473": { + "id": 2473, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "есть у кого жвачка?" + } + }, + "date": 1577196081, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2474": { + "id": 2474, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "675168768736887048", + "emoji": "🙂", + "isAnimated": false, + "width": 128, + "height": 98, + "thumbnail": { + "width": 128, + "height": 98, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRqYGAABXRUJQVlA4WAoAAAAQAAAAfwAAYQAAQUxQSDUAAAABN6CobRuo57Maf2aDFhHxR82ForaNpDkwDJETyQyEXf48+l5tRP8nYBbczgXv/7/3mwe4AgBWUDggSgYAAJApAJ0BKoAAYgA+TR6LRCKhoRqK1awoBMSygGCpK24PW4onBtGIYWwK0KRDAlWuYMZGnXZTx7/JbuOTn/5u3dTIt8hnhOPAOFX9UcBBgnt1YWwYYiOeciG1WEQAsdmY+nKNbZU/GaRulPtbzV4dk59xyb+KsvMWYmCbMA9ka5KytMtlRWsOvLova8QQfSyH+YR9CvkTP6yyTrZmUk5zmSo9UyfX3QKOkw3xmvNB7twvnIYYdprAWycx50qGzU9KgYgZPQlxHlTeBTzovSo5nTfo3A0+/lVnRxYsYUiLMtzo5RbIjoah5vXOpNRbzco7nXBibyKejgH6LuEXKYfQF4T8JVz0ueFomSX/4LE4MPWTPItaMG69l7fsX8Bk16UwRjzwxglVRekBLNLBLGKFUV5cAmByNP86/UXUK4ZZZpUkEgOcjLjwKjAL1fFbC59dEhUA2N6kAP6vnwoeabFXJwgmvoU/8fh8n/lPqXv+SyXuf/1/GA2cZPOdeP5RZC1rEeGXbqRYXhd4qK0zMXnu0yjdcIGJuGr7OrQtHy9TU+aVhEpCejEOUbL5oFfCIm3+SY/Qhg8SR3zh9XpYE8fKSyL1+gaiumysVqlAONl9ct0w76+VLCT6pfvE5/FXBN9o/4bUjywAc1TJrPSwww/aA6pPEFj0o88JIqlc3vePDce+SmNq5v5MdWab+zaVTiFV3Xr82k9c0M6vCXF/DG6jtzo9H1v90w05Aa2bMkgi1U/LvBTEE4W3F8kvBPadvIFt9EZcLuunrQkmPiKn6j/nMSEEYb9sOy8urheEcz6bS9xNPvJZ7qotlQR/hz5CJ+++b/3mbVTurHZIWMJauQ06VpmyIwNM8CyANMpRS8k3X/wmvaCfKRB3+J9l/1NvppZRHS0mtW0R7Z6ugrMVP8m0Utr+SYH47c6G/gYFyPJpKoIH3aGZSpfC8gwfuqM2UfIp+GeweCkbbsyxTJ3rL+8kl0IiJUyumP8hFDG+VnlAETd06zNkXbBAutXC/ZZA3RNJSiH1pg33IX/zMVohQOC6LS4u4yCHqdaRo+19ZVthCxqDKbibqG/0idGW/A6tf0ct+ypJv5cJo/i/trqNQYLeIJJdOTqte0M64S8qAYn4hsYX/1NSIIQBMN2AXFSakqtURpx2gHne22YSmcPm2QQsX8QhgXOUopxGA5vIsAfy8uCIGf98/AdxB7znxk5n/KQzxAglndYaG93kk359/MEIwE/uydmHChPBFx3uMs38gPY06rEPico/JhljHlKi5AdJRqRno7FXirczbyCfpg7UCY0WUmdARgdQsCDXKmYyMju5VVIesmObiOEF/a5PV/yc2hzlcdiYuget8SoBqIrOeh2bCn8mUs16JnpYCXp3LGWl/KZxcgjM0AUsXMaCMcEu9Nj0s3+xBRg57KnKSZb/Rkw3Ak/GglUjKraPbn/kUEkkampp+2hNlLCPx4/V2x8QAYczBTTRN7Q2mGtf+fPN4mvrEUWqLZGYo2D21UzcUpjapnODBkIWCbjQ5gn03F41snqb7R8ucoGYTeJrB5imSTdNmpCoo9O0mhmu3vUgIad6f9SR33o8kohQOIYfVdsUWQVGveoUnhU7j4nM+WYne+lrkdLOpJr5cmZywXF1AFM2xW5yyzjy2zBsluzACzKXHPRJ4bW4EnABkh7/lHbrmW0PsAZmWyjPQuRMzOQutq8MvSFKPeoUIx8EJq3EM7Q0IBGURYLAu/1rpUPGBgFKVcBR6J28J75tqEpQxlAeMFFwwUEYBL5pKtFbcbk/V3orjY8BwVVBA/tJeNUWPcizX6iJQK06boFhrZkDLJO049p3UEdXd7XTjzC395XQO8D/EBtRPbwvBlhduQg7B+3DxAzuzRdl/vjOnHFd4gtGbWDmg5IZZqDqNypc8VVK3bmWNOyaTib+JnmQ3UPPyir+oD6xH3ztMmcBUH7PxPVuGERdSow80vVFm/tq/xUY/zf2FpQZyu9MxcJP5ojFFL9OKyzFcWreIMRZVbQDejZRVKwp28/1c5Hi3vXrbOyHFbOyGo/zosjPbnIiunUp4C7KKfD4ER6ExIzXdgRbcpsvt3MHADzgru8LKvk4ZqaB3lQv6R7sx5H5fEIFfACopSHKWAhYKKQnwhh/YAAA" + } + }, + "document": { + "size": 9530, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577196086, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2475": { + "id": 2475, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "заходи" + } + }, + "date": 1577196092, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2476": { + "id": 2476, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мерси" + } + }, + "date": 1577196144, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2477": { + "id": 2477, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "если б пошли прям щас, я бы да" + } + }, + "date": 1577196413, + "senderUserId": 177121435, + "replyToMessageId": 2466 + }, + "2478": { + "id": 2478, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Че такой говнистый?🤔😁" + } + }, + "date": 1577196415, + "senderUserId": 860139781, + "replyToMessageId": 2472 + }, + "2479": { + "id": 2479, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1048388279864393831", + "emoji": "👋", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21669, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577196487, + "senderUserId": 141185012, + "replyToMessageId": 2472 + }, + "2480": { + "id": 2480, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ну шо вы там" + } + }, + "date": 1577204160, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2481": { + "id": 2481, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3323402743994165", + "emoji": "☕️", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21255, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577204163, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2482": { + "id": 2482, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не могу" + } + }, + "date": 1577204256, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2483": { + "id": 2483, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1112358875685716016", + "emoji": "👁", + "isAnimated": false, + "width": 128, + "height": 22, + "thumbnail": { + "width": 128, + "height": 22, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 8840, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577204258, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2484": { + "id": 2484, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "288465753244434475", + "emoji": "😁", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 18244, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577204348, + "senderUserId": 860139781, + "replyToMessageId": 2482 + }, + "2485": { + "id": 2485, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Еще сидите?" + } + }, + "date": 1577206920, + "senderUserId": 3412850, + "replyToMessageId": 2466 + }, + "2486": { + "id": 2486, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да" + } + }, + "date": 1577206934, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2487": { + "id": 2487, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Зашли только по факту" + } + }, + "date": 1577206941, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2488": { + "id": 2488, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@sashashakun @vponomarev @lizazhdan за кальную вчера отдали 1700 на 5-х по 340 с человека\n5536 9137 6690 0399 тинек", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 12 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 13, + "length": 11 + }, + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 25, + "length": 10 + } + ] + } + }, + "date": 1577258003, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2489": { + "id": 2489, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ушло)" + } + }, + "date": 1577258082, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2490": { + "id": 2490, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAYACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuiM5wqkn2qRIZAcmEn8Km05S0j49K0PLb0rKdSSdkhpJmWY3KgeQRTDBJ2iYVq7f3m3bz607y29Kn2s+w+VGKyMhwwIPvRVrUVKumfSit4NyV3oQ7XHaWwEz5IGVrTZwOhB/GiigY3f8AT8xSq+euB+NFFAGbqrAypgg4FFFFNCP/2Q==", + "width": 1125, + "height": 690 + }, + "sizes": [ + { + "width": 320, + "height": 196, + "type": "m" + }, + { + "width": 800, + "height": 491, + "type": "x" + }, + { + "width": 1125, + "height": 690, + "type": "y" + } + ] + } + }, + "date": 1577259219, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2491": { + "id": 2491, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "дан" + } + }, + "date": 1577259496, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2492": { + "id": 2492, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "348891755506040995", + "emoji": "❤️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 20786, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577259516, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2493": { + "id": 2493, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Разработчик из Нидерландов запрограммировал гирлянду и светящиеся шары, чтобы сыграть в классическую «Змейку» прямо на рождественской ёлке. Теперь в его планах — такой же «новогодний» Tetris.\n\nhttps://tjournal.ru/internet/132851", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 193, + "length": 35 + } + ] + }, + "video": { + "duration": 31, + "width": 720, + "height": 1280, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwAuD5cTFSTjoTVG1kIk2nOGqzfEeSAD1PWqCna6nPSkM0G60UhIIBz1oqBlBnLKMngdqaeRmlcYxj0pvpWhJZScLGA2c/Siq3JopWHcueWO4496b5S+lFFRcoPLWiiincD/2Q==", + "width": 180, + "height": 320 + } + }, + "document": { + "size": 3329149, + "mimeType": "video/mp4", + "fileName": "043203be-b9bb-4719-b9cc-3d09dcacd187.mp4" + } + }, + "date": 1577277545, + "senderUserId": 177121435, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2494": { + "id": 2494, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "с наступающим :3" + } + }, + "date": 1577277553, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2495": { + "id": 2495, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1685141920508018866", + "emoji": "🙈", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 10682, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577277574, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2496": { + "id": 2496, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мой знакомый только чат-ботов для секс игрушек писал" + } + }, + "date": 1577278971, + "senderUserId": 356765513, + "replyToMessageId": 2493 + }, + "2497": { + "id": 2497, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "типа вибратор разговаривал азбукой морзе?" + } + }, + "date": 1577279060, + "senderUserId": 141185012, + "replyToMessageId": 2496 + }, + "2498": { + "id": 2498, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Типа пишешь вибратору: «сильнее»" + } + }, + "date": 1577279073, + "senderUserId": 356765513, + "replyToMessageId": 2497 + }, + "2499": { + "id": 2499, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вот это одиночество..." + } + }, + "date": 1577279613, + "senderUserId": 54158593, + "replyToMessageId": 2498 + }, + "2500": { + "id": 2500, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "2112768758786293804", + "emoji": "☹️", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 29482, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577291168, + "senderUserId": 2317363, + "replyToMessageId": 2498 + }, + "2501": { + "id": 2501, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Оттащите садюгу от пульта пожалуйста" + } + }, + "date": 1577300154, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2502": { + "id": 2502, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Постараюсь" + } + }, + "date": 1577300873, + "senderUserId": 356765513, + "replyToMessageId": 2501 + }, + "2503": { + "id": 2503, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ребята" + } + }, + "date": 1577301758, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2504": { + "id": 2504, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А дайте карту ароматного мира" + } + }, + "date": 1577301765, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2505": { + "id": 2505, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да лана, весело же(" + } + }, + "date": 1577301815, + "senderUserId": 290281303, + "replyToMessageId": 2501 + }, + "2506": { + "id": 2506, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Все кто сидит на 4ом этаже, посвящается эта песня" + } + }, + "date": 1577302970, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2507": { + "id": 2507, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Мы вас любим и помним" + } + }, + "date": 1577303024, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2508": { + "id": 2508, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хоть давно не живу уже с вами" + } + }, + "date": 1577303057, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2509": { + "id": 2509, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну вы поняли" + } + }, + "date": 1577303070, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2510": { + "id": 2510, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Шалость удалась" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCf+KlBzJj0qMzIsqIeWPSlbJkJA4I61V0KzKssu24cRdSaegkxuK845NQCN0uTnGccGr0AL4+bgjkVmzRBuj9aKb9lT/LUVFkMbGIpXBGCR3qO6Z4rmNEfCsB/OrMYgRcohz7CqupOnmRlGBZeorVaoh6MrecTJvZiTnFX7QkuBjGO+ays85NWo7vZ0H60mgTNH7K3+TRVL+0X96KOVjuT/wDLKTkEHgAc5rKZsuaKKIhIKMc0UVRJb8hf7i/99/8A16KKKVwP/9k=", + "width": 749, + "height": 911 + }, + "sizes": [ + { + "width": 263, + "height": 320, + "type": "m" + }, + { + "width": 658, + "height": 800, + "type": "x" + }, + { + "width": 749, + "height": 911, + "type": "y" + } + ] + } + }, + "date": 1577307515, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2511": { + "id": 2511, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "(с)" + } + }, + "date": 1577307561, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2512": { + "id": 2512, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "☺️" + } + }, + "date": 1577307575, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2513": { + "id": 2513, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "посебо" + } + }, + "date": 1577307801, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2514": { + "id": 2514, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCuL1wSNq0ovJO4WqZWQk/K2fpTwkuPuN+VAi8Lx/LK8VA9xID9/wDQVGI5sHCHNMME56o1Fxk0LF5lUMVQ5ANXFEasoxnbwQf4qrRW7+cvGEU9fWr5Q5yFyKTeoW0KZZVcrh81HISfu7gKszRxpyyZY571CAn9wfrSUUO7LafKnYgVKJ487d2D6Giik0WiK4iMuCvaq7QOO1FFCYmj/9k=", + "width": 828, + "height": 1104 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 828, + "height": 1104, + "type": "y" + } + ] + } + }, + "date": 1577353060, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2515": { + "id": 2515, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ТЕПЕРЬ Я ЗНАЮ КТО ТЫ))" + } + }, + "date": 1577353123, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2516": { + "id": 2516, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "642449759415567212", + "emoji": "❤️", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 50752, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577353124, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2517": { + "id": 2517, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "128866271763628532", + "emoji": "🐝", + "isAnimated": false, + "width": 128, + "height": 94, + "thumbnail": { + "width": 128, + "height": 94, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 17738, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577353233, + "senderUserId": 141185012, + "replyToMessageId": 2514 + }, + "2518": { + "id": 2518, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "640414812500656510", + "emoji": "❤", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 33422, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577353253, + "senderUserId": 54158593, + "replyToMessageId": 2515 + }, + "2519": { + "id": 2519, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всем привет!\n\nМы с @aleksProsk вчера пару раз ходили за винчиком, плюс пиццы заказывали. Вышло все примерно на 13700.\n\nПредлагаю как взрослые и самодостаточные люди скинуться примерно по 1000 (нас было около 13 человек) на номер карты:\n5536 9138 1895 1812\n\nИли по номеру: +79774116966", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 19, + "length": 11 + }, + { + "className": "MessageEntityPhone", + "classType": "constructor", + "offset": 272, + "length": 12 + } + ] + } + }, + "date": 1577354353, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2520": { + "id": 2520, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Тинькофф удобно?" + } + }, + "date": 1577355091, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2521": { + "id": 2521, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, удобно все. Кроме лешкоинов" + } + }, + "date": 1577355108, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2522": { + "id": 2522, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAmACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDXLYPVfxNG7pyvPvSFULZOM0eWnYd89aAHfN7Unz+1LuHqKWgAGcc9aKKKAI23bj8gI9c0nz8ZiGcjvUmTntS0AJtHoKWiigAooooAYYlZskZNHkoOgx070UUAPooooAKKKKAP/9k=", + "width": 364, + "height": 346 + }, + "sizes": [ + { + "width": 320, + "height": 304, + "type": "m" + }, + { + "width": 364, + "height": 346, + "type": "x" + } + ] + } + }, + "date": 1577355131, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2523": { + "id": 2523, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "помотала меня жизнь" + } + }, + "date": 1577355158, + "senderUserId": 356765513, + "replyToMessageId": 2522 + }, + "2524": { + "id": 2524, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "✅" + } + }, + "date": 1577355177, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2525": { + "id": 2525, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "сейчас скину" + } + }, + "date": 1577355418, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2526": { + "id": 2526, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@adikmarov 💸💸💸", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 10 + } + ] + } + }, + "date": 1577355427, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2527": { + "id": 2527, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "отправил)" + } + }, + "date": 1577355454, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2528": { + "id": 2528, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Перевела" + } + }, + "date": 1577358113, + "senderUserId": 802771524, + "replyToMessageId": null + }, + "2530": { + "id": 2530, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кофелюбы )) у меня вопрос, сраный кофе будете пить? Или взять обычного?" + } + }, + "date": 1577380642, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2531": { + "id": 2531, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Для непросвещённых - https://ru.m.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8-%D0%BB%D1%83%D0%B2%D0%B0%D0%BA", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 21, + "length": 87 + } + ] + } + }, + "date": 1577380712, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2532": { + "id": 2532, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В сортах дерьма не разбираемся 😂😂😂" + } + }, + "date": 1577380773, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2533": { + "id": 2533, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я тоже, по этому и советуюсь)" + } + }, + "date": 1577380859, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2534": { + "id": 2534, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "\"Копи Лувак — один из самых дорогих сортов кофе в мире: его стоимость порядка 550 евро / 700 долларов за килограмм.\" кажется ответ очевиден) бери" + } + }, + "date": 1577383223, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2535": { + "id": 2535, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Так себе кофе, кстати :)" + } + }, + "date": 1577383517, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2536": { + "id": 2536, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Будем жрать дорогое дерьмо )" + } + }, + "date": 1577383831, + "senderUserId": 105945096, + "replyToMessageId": 2534 + }, + "2537": { + "id": 2537, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот я тоже слышал )" + } + }, + "date": 1577383845, + "senderUserId": 105945096, + "replyToMessageId": 2535 + }, + "2538": { + "id": 2538, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Но раз один псих нашелся, возьму попробовать )" + } + }, + "date": 1577383858, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2539": { + "id": 2539, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "дорохо-бохато)" + } + }, + "date": 1577383872, + "senderUserId": 205688700, + "replyToMessageId": 2536 + }, + "2540": { + "id": 2540, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ага)" + } + }, + "date": 1577383890, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2541": { + "id": 2541, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Все как мы любим" + } + }, + "date": 1577383894, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2542": { + "id": 2542, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а это не тот кофе, который нужно под губу закидывать?" + } + }, + "date": 1577384206, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2543": { + "id": 2543, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Антон, если ты на Бали и хочешь привезти хороший кофе, лучше заедь в Seniman Coffee в Убуде" + } + }, + "date": 1577384645, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2544": { + "id": 2544, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И там купи чего-нибудь местного лёгкой обжарки" + } + }, + "date": 1577384669, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2545": { + "id": 2545, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот это будет збс" + } + }, + "date": 1577384678, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2546": { + "id": 2546, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну и пока там, сядь, съешь шакшуку и колбасками — она охуенная" + } + }, + "date": 1577384735, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2547": { + "id": 2547, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я, конечно, не была на Бали и ничего не знаю, но послушала бы Лешу и не пила б кофе из каках🤔" + } + }, + "date": 1577384855, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2548": { + "id": 2548, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "http://maximilyahov.ru/generator-new-year/", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 42 + } + ] + } + }, + "date": 1577385341, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2549": { + "id": 2549, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234143", + "emoji": "😌", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 27108, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577385378, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2550": { + "id": 2550, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не, ну он нормальный, на самом деле. Просто неинтересный. Это больше развлекуха для туристов. На Бали настолько богатая кофейная культура, что на эту фигню даже жалко время тратить 🙂" + } + }, + "date": 1577389164, + "senderUserId": 3247289, + "replyToMessageId": 2547 + }, + "2551": { + "id": 2551, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот вот" + } + }, + "date": 1577389941, + "senderUserId": 860139781, + "replyToMessageId": 2550 + }, + "2552": { + "id": 2552, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Кстати, чуваки, так что Ведьмака-то смотреть?" + } + }, + "date": 1577390246, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2553": { + "id": 2553, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а то только только чеканные монеты все обсуждают" + } + }, + "date": 1577390263, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2554": { + "id": 2554, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Слушай, средней консистенции говно если честно" + } + }, + "date": 1577390282, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2555": { + "id": 2555, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ясн, спасибо 🙂" + } + }, + "date": 1577390291, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2556": { + "id": 2556, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "а то рейтинг 8.7 удивил" + } + }, + "date": 1577390303, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2557": { + "id": 2557, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кстати, 4 сезон мистера робота — очень добротно" + } + }, + "date": 1577390329, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2558": { + "id": 2558, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "прям хорошо я бы даже сказал" + } + }, + "date": 1577390342, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2559": { + "id": 2559, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "только начала 4 сезон, кстати\nуже нравится, я скучала" + } + }, + "date": 1577390384, + "senderUserId": 177121435, + "replyToMessageId": 2557 + }, + "2560": { + "id": 2560, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну это от любви, наверное. Но игра плохая, мотивация персонажей проработана на троечку, и вся славянская хтонь проебана. Это такие польские недели в Макдональдс с ровным и бесхарактерным сиджиаем" + } + }, + "date": 1577390395, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2561": { + "id": 2561, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "меня напрягает именно сам Геральт\nвидно, как актёр ПЫТАЕТСЯ ИГРАТЬ" + } + }, + "date": 1577390426, + "senderUserId": 177121435, + "replyToMessageId": 2560 + }, + "2562": { + "id": 2562, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "прям вот не верю я ему как-то хз" + } + }, + "date": 1577390437, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2563": { + "id": 2563, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Он ужасный. Ну то есть это боль, потому что по-хорошему я смотреть начала именно чтобы на бёдра Кавилла пялиться, но прям больно за то что он с ролью делает" + } + }, + "date": 1577390472, + "senderUserId": 146686085, + "replyToMessageId": 2561 + }, + "2564": { + "id": 2564, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "эти его вечные ХМММ КХМММ" + } + }, + "date": 1577390483, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2565": { + "id": 2565, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Очень хуево играет, прям удивительно хуево" + } + }, + "date": 1577390491, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2566": { + "id": 2566, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну ещё когда он сопит кстати ничего 😂" + } + }, + "date": 1577390521, + "senderUserId": 146686085, + "replyToMessageId": 2564 + }, + "2567": { + "id": 2567, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "никто:\nабсолютно никто:\nГеральт: https://youtu.be/Wdi-VDtQ8gY", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 33, + "length": 28 + } + ] + } + }, + "date": 1577390525, + "senderUserId": 177121435, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": 177121435, + "origin": { + "senderUserId": 177121435 + } + } + }, + "2568": { + "id": 2568, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Там просто диалоги ещё супер пафосные, без игры это получается такая какашка" + } + }, + "date": 1577390563, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2569": { + "id": 2569, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "но мне пока все же интересно" + } + }, + "date": 1577390575, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2570": { + "id": 2570, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну мне тоже остался последний эпизод" + } + }, + "date": 1577390589, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2571": { + "id": 2571, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Нормальный в Польше Макдональдс. Только что из него" + } + }, + "date": 1577390605, + "senderUserId": 194771934, + "replyToMessageId": 2560 + }, + "2572": { + "id": 2572, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Оказывается, я многое могу перенести чтобы пялиться на красивого мужика 🤷‍♀️" + } + }, + "date": 1577390615, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2573": { + "id": 2573, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234188", + "emoji": "☺️", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14682, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577390637, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2574": { + "id": 2574, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCISEPtzU8DFxknHt3qkVLTYP3c1Ys2xGRxnPb6UgJbqQ+YgB4xS/agZfLwQOmahuObiIfT+dR3X7u5JXB70FFyQ/LRVdpg6dSD6UUCJhawA53CmyRxxpmNuc9BV7I9BVa/ZRbEdyeMDvQBUZt8qN1wKgkbfIzdeag3Yb5gT7ZxTjKCCNp+u6mIN2GoqPPNFAHRAjuap3SSSP8AIcr6GiikBUktn6kL+FQNA4I44PeiimA14ypOe1FFFAI//9k=", + "width": 1280, + "height": 1273 + }, + "sizes": [ + { + "width": 320, + "height": 318, + "type": "m" + }, + { + "width": 800, + "height": 796, + "type": "x" + }, + { + "width": 1280, + "height": 1273, + "type": "y" + } + ] + } + }, + "date": 1577390658, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2575": { + "id": 2575, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А я начал смотреть и пока норм :D" + } + }, + "date": 1577390707, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2576": { + "id": 2576, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Еще положительный отзыв от Зиннура, вроде, слышал" + } + }, + "date": 1577390733, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2577": { + "id": 2577, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я не сразу вдуплила, где там ЧЕКАННАЯ монета, тому шо в оригинале смотрела\nсижу и думаю, ДА КТО ТАКАЯ ЭТА ВАША МОНЕТА НАХУЙ" + } + }, + "date": 1577390802, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2578": { + "id": 2578, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ахаха да я тоже))" + } + }, + "date": 1577391121, + "senderUserId": 146686085, + "replyToMessageId": 2577 + }, + "2579": { + "id": 2579, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Может надо было в переводе смотреть, тогда не так плохо?))" + } + }, + "date": 1577391168, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2580": { + "id": 2580, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "и гореть, что Геральта озвучивает не Кузнецов!" + } + }, + "date": 1577391416, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2581": { + "id": 2581, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1222077027897573503", + "emoji": "😳", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 40142, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577391419, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2582": { + "id": 2582, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я на его месте все время The Hound представляю. И все реплики обретают смысл" + } + }, + "date": 1577391446, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2583": { + "id": 2583, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 2, + "width": 480, + "height": 224, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAATACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDMHFTwsHXafvDoarGnwvscHuDTJLJUljtBOKhDZLcgYpzsdx2sApPTNRHGeD9aASHHoD60UArsHPNFAiGgUUUFBRRRQACiiigR/9k=", + "width": 320, + "height": 149 + } + }, + "document": { + "size": 154959, + "mimeType": "video/mp4", + "fileName": "File" + } + }, + "date": 1577391483, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2584": { + "id": 2584, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "@akulichevskiy шакшуки больше нет! что делать?", + "entities": [ + { + "className": "MessageEntityMention", + "classType": "constructor", + "offset": 0, + "length": 14 + } + ] + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvDCWG9unapxvWLG0devtUmMgAc56VOqKsJDAEgd+a5k3Jmr0KTyGQg9hxTTnParqWsRRTg8jmq95GsUihRwVzzWvLYV0FnJ++WP0BJqyXfLDkrg1R07/XE/7NWkdyZNxJUqdtOMbEtllR+7Tp0qnqfDx844q1Gf3KfSq+ogFYz16iqYkVLCREdi7BeO5q6ZodnDx5A45oopDHxTxCFAZlBx2NRX0sckShHDENRRQB/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1577428840, + "senderUserId": 122196269, + "replyToMessageId": 2546 + }, + "2585": { + "id": 2585, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Шакшука это эгг стайл!" + } + }, + "date": 1577428899, + "senderUserId": 146686085, + "replyToMessageId": 2584 + }, + "2586": { + "id": 2586, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не, говорят, убрали из меню" + } + }, + "date": 1577428962, + "senderUserId": 122196269, + "replyToMessageId": 2585 + }, + "2587": { + "id": 2587, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ну бери ранчерос" + } + }, + "date": 1577429000, + "senderUserId": 146686085, + "replyToMessageId": 2586 + }, + "2588": { + "id": 2588, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "таки взял, а шо еще оставалось" + } + }, + "date": 1577429036, + "senderUserId": 122196269, + "replyToMessageId": 2587 + }, + "2589": { + "id": 2589, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Провал!" + } + }, + "date": 1577429124, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2590": { + "id": 2590, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я в Сайгоне, а вьетнам вроде как на третьем месте по экспорту кофе в мир." + } + }, + "date": 1577439832, + "senderUserId": 105945096, + "replyToMessageId": 2543 + }, + "2591": { + "id": 2591, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "https://www.meme-arsenal.com/memes/3fe6dbdb91fbdc15b42c6f726f2ece9f.jpg", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 0, + "length": 71 + } + ] + } + }, + "date": 1577440263, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2592": { + "id": 2592, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Про Вьетнамский кофе ничего не знаю 🙂" + } + }, + "date": 1577441532, + "senderUserId": 3247289, + "replyToMessageId": 2590 + }, + "2593": { + "id": 2593, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "У кого есть 8к прямо сейчас? Альфа померла" + } + }, + "date": 1577450909, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2594": { + "id": 2594, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хелп" + } + }, + "date": 1577450964, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2595": { + "id": 2595, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дай номер" + } + }, + "date": 1577450981, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2596": { + "id": 2596, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Наличкой" + } + }, + "date": 1577450987, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2597": { + "id": 2597, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "А 🤷‍♂️" + } + }, + "date": 1577450994, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2598": { + "id": 2598, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ожидаемая шутка, есть но в ульске)" + } + }, + "date": 1577451055, + "senderUserId": 205688700, + "replyToMessageId": 2593 + }, + "2599": { + "id": 2599, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "В нске)" + } + }, + "date": 1577451081, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2600": { + "id": 2600, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Спикер российского МИДа Мария Захарова зажгла на корпоративе с каким-то дядькой.\n\nТраволта и Турман нервно курят в сторонке\n\nВидео: mzakharovamid/Instagram" + }, + "video": { + "duration": 18, + "width": 540, + "height": 540, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBiyEcHOMninedlTgHHFQCRT04OaV3O1TkDsMd6QEvmjycEYBIOTSrOPMBVRnpioSyM23PTqaQME/iHSiwycO0DAhTz60VVactIDnI96KLBciDKBznPbFSqd+0kdyaLuARMCvQ09LdzGpweR60xELRyhiwXGBu/CmtE/PHQc4q75R2gFO2OtQyptjPy4B44NAFZAMEsCQPSinujRpgZwRzRRYLl+6QyR8DvxUyfdAPWiigBSuc+1QXIHlc88iiigQRrmNQ4GQMUUUUAf//Z", + "width": 320, + "height": 320 + } + }, + "document": { + "size": 5437621, + "mimeType": "video/mp4", + "fileName": "video_2019-12-27_18-16-48.mp4" + } + }, + "date": 1577460959, + "senderUserId": 356765513, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": null, + "origin": { + "senderUserId": null + } + } + }, + "2601": { + "id": 2601, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вот это я понимаю корпорат!" + } + }, + "date": 1577461800, + "senderUserId": 356765513, + "replyToMessageId": 2600 + }, + "2602": { + "id": 2602, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "It's a usual thing for her, personal experience :)" + } + }, + "date": 1577469488, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2603": { + "id": 2603, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "всем хороших выходных и чудесных праздников\nпусть у всех всё сбудется" + } + }, + "date": 1577469712, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2604": { + "id": 2604, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Чот люблю вас очень, ребят ❤️" + } + }, + "date": 1577469720, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2605": { + "id": 2605, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "я вас люблю" + } + }, + "date": 1577469722, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2606": { + "id": 2606, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "186649756741665171", + "emoji": "😍", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRggWAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSMoIAAABwIXtnyHJtnKwbdu2bV/ZOLZt27Zt2z7LXuPF1nB5DTvz//vid5GRkRFZs6/OuYiICej+D/buJ7/o1a95zqM+Ne16zQ9csH/tyInbbj+2eeOVf/Cue36Keftf33AHuJC7bvrdp8/a/fzP+o1/+u8L/+3XvuoZ55vdX3jgTjyfw3/6iJInf9PFN58IsIGjB3/8geeTT7/+NK7L2idzD/j6PUfAxcPN33feeNS/3Iarc+tv7+i6J/3ZzT2ef+rCR54f3rgmNz39d4/9gw1cl0OPPh98xlG5cX8KV+fAQ1fvy29RamWpnvmvlXv3iZTcXlHPd3/zir3wiBYB1PP6Q1bq3jcoJc+kfMJSA35jpf6wT8nFZJ0nmwHqef2BK/S6W1MZY89kbFvRYPimFdqrMgBXZGzUgD2r88m7U0qeBlwYEZGzASxsQhIqBttbD1+Z/SoCPI5QcUTYBoYBJMDTQGh89qOr8oJbU0ousO0IFOHCiJAibNh2bdDJ//nKx6/En6tsPDC4FDyOAfX0BFASgyYjoo+tvd9x/8XdZz3NGhSeBjCAbYcUgMnaIRQRth1jKWL7pl95yMK+6FxKycWDwtPgPHg8MAAe04d6z41BGjj01GVdpjk94WmwYWTAtkPqcz3hUsa2HVJ/YFH3Wk8zgvA02Iw9ztihAdsD4ULAtsG2QyefuKQ335VScmEQLrGN7ZzJeIjBDsKF4Emw7eGi5ex+wb+orCc8azxBxoN6q3ch2MDIYNun9izkSb+7dlukiYgIKTwrD9ie8BAhF9nGMDLY9qlvXsKO79xUkiYGIobwzAIwlFj9UELOOYPtOPmIdg+44FRKOduOcMUS22Wh7SKPYMIj9//b7BF7h5RSigKiGjbM8XbMygJM+K5W99urNNaUIxTzsI2xAZsSq69jY5vRybe32X1Rn2bBtmKOwQacx6XbUctMxB+3+eNzaSLlAHtbswwupCxUgm0gg40z/9Hko3ekMsDjiGGWYQJwufopZzyCkitaPGhdJZI8yTYxy0x7bhRhA84zsafFbw1pOpRSmrJ6xaz6RQYXgrPDbzR4/OE0ewoNilWwIQc4f/L9Df5K9SwNxEJEmZn09Ml71HvWsdTAUs+wiF5uHDd09f9dTSz1wbCA6FudfEO9559IbRwQwdAqRKNY6+r/pVoZiRARLUJ9tIm7n1DvYeupmY1EDGiIWqEhhiZx+tVd/R8almAjRIQUERV6BgfRYDj93q7hgbQM2wjRRwhFRExFoLA9qFro9IO6hq+8rYprg5AgIlQ6hLOhqBLSsUd3Lf9ASxqDhBQQEZ45EDEnAp299kldy103pJpuD8rGjP7cIEWhJMXZm3/6nl3TN921GrUHRd/HMBUwbPzg/bvGv6YazoNgWXZIgxQAGsfGs7rWe1I9ECIWZoMiJAXYNjc8ttGjjtRwXmEbaWk24FL2P6TN5/YVnAdnJZbmGeY/2/y96oVylhY3+84vbbI3zfekmLDEavmmBzbYtbkIC1Zr+PkGL7h9nqs4YKW89oB6XxjtGBmJVdr+inp/qFkuDOXA44AV4up6F7QARgZGRmJlvPngalenmaLEUsbAyEZiVU6/q9q+MmkK2QYyBhjZIbEa/Gy1/TPCilGgsA1kbCBjhyRW4S+q7SsSNhoJZNv9QM4AGRshlkbs+6lXV7q6KDQh2aOQBnI2QMY2QrAchODIU+tcUCRsy04hG6dBJsSEGedsI0mwBERg+8w76vyZqgijlIRNwIRtgAnbICFBC4TC2dNfWOdLhhKcScIjybaAKLABprKEJpk0eUkocB79e51nHSuQMimFcmSMRIHNuCQPoNngUogfqNMdqCFsIsk5O4gS24xntIc4+d5K3ztMBRmFPFKJkSiyyS8GEd58ctftuGeFh27MQXImIuN8IIrGTDZiLNm+408vv25t6+vndX+vCWUmCVFmB2LGeFRYwkwrbIPtsx+v8KxjlSTPMSEFc/ITNZ1HznNwV4Xux8/UgXm2kSQqtJ/i8Au7mjv2KBNlxjnKbBNCsDBF7vi7u7pP3tRIKpusMEZCChYDjDj6+V3t52ypHqoyBgmkgGYBts36W7r6L9lUSokqlqiUB0kgSQAVQAjbvvvKp3Utn30uUhJVHJKg2iSAKiJJeBw3f2XX9p7rGtexQUI0mQ22jeTJU//1kK71P2SoNCaIBWVRePK2n+/a3v/7rrpxfVtJg6hno1hWEM5z7Ku6ti+7eTulFFJKvVoYsSAkPHn2a7u2T9lSGktKKdTCaDEo8DQ37Wr0P0p5SbJEA7MQFL0L4WDX9p23p8LQ4EDU0xIQ6kUBxHqjfSpJisCBqEYjEIqQ8CQSXmvznFvSTEmBVAtXB2UhpG2cBSlsH2rz05qTjNAQddCYfKgUKcBGEkiAhITH17TZk+bZjkFUiQBQnmlnQUIDzoMLL22zVscKVRGuCiEhBUauyb81ecyRWR4nWaqA6oOzijq/0+TZR6tZYpaC+Z4r6nxvk3uva4azku1AFKHBzZHrfFaT7o1bqpAyNkICkISCdoo6Z9/epnvKvjMlzkVkbBOSBNgWzaDOrS9o1O38ieOakVIwVd4Oue7Ww1p13TP/6zbNUK1opah0U7fEV15xm8pcF7WCStcuoute9A9Heq0Ycl3+dyFd9+AfOnRiYKRappGi1u8spuu6Z/74ns1tVgZqfc2Sum7HMz/nT645FrVEE+TKZ96+rK7rdnbfw/IgTkWto09dXNf9ZLXQDIC4+/jm2sEr/uknPu0QtW7csQLfX41br7x27959+/bt33vNFZdc8C9//vPf8OE3Pvuh3fiJh12Zi7sV/JZqvqpr+D1R7adX4SNna3Fti7+j1sm3rML9r++pwm2f1eJlG1CFG+67Ct3DP+uv9qwdOQ2Qg7h144r3dk0f8V3/ePWNmydOU3z7xv8+o1vZHU965zf/7l//2wUXX37lpf/7dz//GS9/QLfEhzz/nV/4nT/2S7/7F3/2B7/5Sz/zZS+/d/f/GQNWUDggGA0AAJA4AJ0BKoAAgAA+USKORSOiIROJJvQ4BQSyBDgAxhYWXj5q/rP6h6Stp/rH4X/J7mtzSdtX8/1qeiXzCP1S8671i/uF6k/1r/6X+n96X0u/5j1AP7N1OnoAeXP7SH7ielHmpf9V/FDwd/0/Siegva7kBs4P2Xl33n/GrUC9cf6reWQAfmP9I/339z/Hv5Gpi96t/w+On829gD+df3n/r/cB8fX/X/oP3A9eP0f/5v9H8Bv81/rn+4/wHthev79wfZZ/YlzEByIeHsCSuquPT46hfUWNTiVyR10ynf4UgMbtGXtHcsVEDaUtYc3HyuZZdd1vVPgPFbg32ZDrg5nTmYYQhic2egIBHxdvBxR89YO60eN5rFgnu9uKjYA8wMXwfvwYenpgLCXJ05aMtKOzP5niSSvyzMOKJIC5fC+bwAUOxY2wRC4h+E8roe3Sbq3tcwmTgycHJuQLmxInXRAf7U6qYW0BLGaeSpuSH3z+IF4IPyg9cHxCZegdBKYe295tLbrhE1rmyLOD+H751DJwy4Z/fwtBXiO8de20JV9unhGYlY67eWhJFid+slWP49PSMRmUnEn2InawIHTifEusTxZ6S63lxhVfvOM90t0AAP7uekKDD1SgumyO8BvnKHfxcgXuMFCtjnE+IhpPAm1mLmU3DI7ARzNPmgmVR7aJ7MSDdhoF0ANiWpKaXnbHbm2BO75Ww9m4eKoZuu109pB+HrbuiD0qLz0pDww4qqb51pxsiM7S4auTXKmcuvQdkE9lXyem3b91kVXf5sT/9D2TKHFl6ftmfHqoH6s0uIAgb71HLHGU7f3OUB+DxuJaFk9ag21GcBMi4KBpLMyHhCIZT/I5cgOl3s0Sl54gQwqx6gBMWPd3qJ/ClkBUfFcQNFKSJ79/6nMFWqeRDcEqVaJqR/M25yu9p5C1rPEd4pLHfDHfFTOvQo9cDwcATR2X70Vgh8S6qFkgwjOVtYb0Wp5uFIGwo51zKU8fkAWtM6SbF+PeRBsVpOgQEjj1yAbbsLZVp9eDE3ihjLvJ5h7XsVmBVKlwvPXFsXm7mfSujl1LAyXvldkHlQ9z312P0f8xwoo3AR8V5I+PVwuZiEj1tPHfIjx2/0j+FcSjP/UwfTkLL7bUcbYBFjgivCrjHVlM70LoGyq4YJUvat+w93Y8t/78vGHjlcELtnKfUfxNfUR0YjAasGx6XsmRNKcNbJQ9YkIXSQ5KO3XiBkHkBQzHL4e3pF5i3Vr3BkXm8sBlEfM3wQNNenwNlZYuBK/C0zdf2M/9Pu9AKO3bs5cSdW5mb7HagMfcdM8eF2Q2w1Vz5iaZ/JM3TODXxf53C5rYAKpt2w5+F+mXcLHa75kKjgz647FBkhpCIX/W0mJ3RU6MbcYFSUArUr4r931DHfB034qXGeCVv6mOxgf+CJHyKcc6GwDQ3vxnlr0Rj1PdyRlImcGAbjqrb9Lm7gVZTkQOZLASqt71l2VwSDv6VyhpPNNffqTkqiQcB2ApOH5EI0TXdHsuq///pYf+yf/6WJsvUeUXYymbnr+AYIYIZOc1ivyXy7KFojXm9vXHw/htYjYU4zWtZwUSJF5E2uJ6Bv2lwPwCXVAULlhL8DpgxQgYhqLN3eQixR+ybcRko0SctJZCIgX3rJljWbrH3c41LYA03/PrP+fSfAN5ab8eiYYoh+laJOdqA8MMi5e+ttEiC/1Aw+iWxaGTL7hvin8idvYWXfyUsc+6MlIjEbbd1u8U0oActa84TYZ7uDCbeseyfHg0Q6luUamqsB4godTextiHL53+TL/KcW5XmaUPWAkOAf+GpebEN21PuW7TyqUAJH1Bv+0M4XhEinbuTJw3Q/9HOl6loN/Mq1GBfqutREop3KgoYUbKZ46bHbrNbwaIkITZzaiU5AB6QMMXYq12krmA0JYw/SvVo1DhqlHviYuPHP4k9mHNveGivjFLk/lnM7VJ//O0l74Mt/L4XLwtiO+vErLeX/7X5VqWTHKHES+o6lr96q5YFeGdskEmo8JevX5sq2Xx1swZ8O1DYAPsfKG/UQJkrDFV+Y9xvxpHczDbkuEvfnhk3eLmeF91lbcWQtF3g63z1F+sto6X/5I5i+Y9+R26gGdK2wxnykRtBUwKfFeIZ3jJP0Aui+Hc3ZwMpRP8pwWw2OBpggZdhW7MB03j53vvzt2cP5gW28+p2in62da0t4n5eRpGtZO0/B0RL8+S4y2DIcUDOG+u7KMNaItdzDCW+Oe6jdtL1Bmwt+YV8rpQnJEXC0JE1Dq4V/RvFYaLy2FR2iumbk01Rp/eQmCUe67v3cIBeEFPWBxq2cW/7fSEzhBrev5VCOXBTWcAz/TsA0CbLHBwvHpUZjsT7dSR7U8+NaFh5qUUCC+oKAicS1SXh5zE8U1/V3LGSTdkNpJcQOhbbYKThMcm4tjfBEKAK1NA4RKECIXaxoV8nbglwM/jGD46ppBueu43x1gt3eoScEnhxD6ojMRDo8tRNtzUVIjCPKw9as/KyRV1Qd7xCgeo/WL49w36uSD4oQqajFiieFKM1+3tHXokQBPIj+Z/Ppsm3lgrOTFW82ta8xI1E7w9XOvFr7ezsJESmn/fYUHxPcxx2WOcpP074qyiTYIB1WUzWVOltKZqSwMNRZLPoKLBvQf12pOkk8V0AMTupiYm35+Yu//Mp/HW/b/+0gFiiGUs9BSEh9kwFXuzBvFf1XWXigtUJOF05BuwG1R8mYkMwgAbF6yL+3cxwwUjg3F/n4sH0O6Ucxez67XfIqgIQNsSBCGH3Gaup4OdBAZrNiwQqIM7xMt+oXAhhStyURRujhZbBQnAgg7ctPTfhTl+k+/KGbdNrvsPADWZzRHW4BKfpEmCvk2xu/8eJCI9f6khLg6C6wOV9Td1L0SGo8uZwvV3H+dKRVN/r7Pw/19rX0TA7ule4lkrr/nOkUDfIBwf99ABR0F3MAnXdsnAkT1drNz0NshL7W6C/pprP1Sj0EAXeITDnul0WS0JhWTeZ9hh67t0Hr2QZ70XIfyUSSVRwG4PJ/39m9PzXXCUpvmaPgO381YKgOpayyLcXS0rhfJ3oA79ntXvgfelEpo6yUCUmwDn75QG2uveKhmclBI/Cz1M1GQXXCRyIfEbjR+hSnmBk9V3miSVZAPw5Z4HYrkHBQSYB0TnGoNfSKRovzZiCWhs4CJYqNydPynM/K/J5WU0OyIE/+x/ltI+mppXH6D53NyUTqJemTAeut7N9UcBelfrSC+Dfn6HucBcG3/rtbOO7bDqPYIixtLSfN0UuYCwIts4Lt8jaNMC12XsnqUUybpe4SiYo6QvHVI9hAa+riT+G/u2w4iN27HrY27UD+Br7xhBToW/vZ0DfDqhS6YxxAHUUhcykI2IXA0iHSf9kXqbobT5asel/zXIcnkWVbEFD8btjdJLWzFjWY8jL0jX2Ro9W3GuSA0AhYeYq5iokCE7xPWTR8GNHCxGZb8ajfPUFHRAn9JkX/AMP+/u0iz/rtksUZYTwMF3lH8yWQbuc4y2Es5z2ChZUtMnV8mkeOcaMtWV1KF6HrpTFZLvFh4X18cygpEV9E0R3oZC9mr4P+zKGVtIRIiEILsaIloA11r36T+5ZBVv/dTmo73HGcqt6vHO6BXR2uxRB8eKvR68AUR+nHFHYLNvhaZlGSpMUrYhkEG9Df8M8R6ZkCkCbg3hE+nT+wNCndEKvXR8NFnUpRoh9ntgfhJ8hCVNjFS9/63+MbxFuOFWGOJ6kzeVeb3kYdOMOKdL8DBORskoO/EUMWfOTApgylr8vSsqKXxZgC6WMHniHemsZN7Kq+9wM4mll2noRuDwNafTaB0T6Ss1jkrJNpDtovOdFZFJIpKifsL4oJdKh/iw7GunpvikqnKsSNJ2pJ7BrWlFiKD6J3YWfGZtV7HXnpfHh6HWyVZ/zu5JrH0pfTN41lm6lJbosH5nf1pVMDi5RXIWVxrSAGZ/3LoWIh/GQn+K+7Xj9e3V/csjzb1KWNNV7viK44dKjCoIOReiXhAdYHQzNFSJ8UVPDI6jHDo5lWV0gNH/35N8tVcT/xJXCAcvwZHz37FlQ04ZEOrzQTDE+3RLIPH/j5T1YgbEc//TbwIODIIhhJw7JzmX8luQX2XAxZP3KTyPH3wvKV4xxl6h9t5+cPpo16/SYEX3LXIp0/qQmojqTu79YlWiIcdbJYDvXm5kgKl4SBclayAngvQvgkLm0IMhi9cP2pceenlb6vwjamYe3wIF3Rix+9d589uqqLGQY8/18MB4fyB3rUwS2+RoX+Sa8k2FJv8e9R+Vf5O5f37w8DvkTqeZNRKnXfg1t4fU/WO4rorKpwJ/Wcmq05rrmNIEnzFEXngRTJz/W+CqTsKzihTnbP50C11pJupV8XA6Ibr99Ufp+GgKQnvcPBO6uCP/J6LBa6/zGEblHnXbTO5fpy3b5eRmIDzOCiXQFdnQjClZBDIfj3//xh4Hf1vad6PnM2+AAAA=" + } + }, + "document": { + "size": 10397, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577469731, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2607": { + "id": 2607, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И яяяяя" + } + }, + "date": 1577469786, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2608": { + "id": 2608, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "848105717104813", + "emoji": "❤", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRuoQAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSK8DAAABJ8YwkiQRZpb8U96/f6QQEXnxLR/y7yAN+5F1Gz7DkSJL6gSLLMuIvA1SCaeIfIWxVEZGTvmEbEmyTdvqzWvbtm3btm3btm3bxz7nbvSHbe+F2e8R/U+41GrYrNW7Tl2+e+/1y7t3Lh7dumJy/wYQ8faYt/9JCS3l3N46qRUMb7XwfD5tfjs0oS5M7bD2JZ35f2N+A5hXa87DKB2sPD/aC6Pa7yyi419X1IMxPc+E6Erx5qYwosuZCF0r2VwfrjfcE6KrBUsDcNW7IJ+uvx8OF7s+pAnRI/XgkndZBQ35NRKuNLtJc6I7gnB++F8a9bQNnF4SomE5w+Bo4ADNq5oHB2tdo5EbPHCqwRMaut8HZxq/obGnfHCi8RsafMoH+3Wf0uj9HtgN3qLhG2DTc4LGz4O9NTS/ahjsjIlQIKcNrLcroMTTIKwGnlBkO6xupEp0BKwNCFPmVz1YqfaBQodhZT2VosORvUMFpd4HkPUixZYi2xCq5ddDlseU24zMI6lX0ggZH1NwMzINo2JxXWS4TMnlSG8foeRXL9K2UHQ0Uv1/KXoOqaOpWlkfKScoOwfJakWUvYbkKOpW1UViN4XHI/GJwgcRb0nlz4hPo3QLxPZSeiJizyi9Ff4KSt9CV2r/xTiK119J8X57KT7xEsWXPaX4li8UP1xA8Qshit+i+l2q36P6A6rfpfrdQopf/EnxEy8pvv0axVcdoviMdRQfMpXiLfpQuxg1wpR+hNgHSu9D7Dil5yC2iNLdEOtJ5RwPYp4cCp9D4iSF5yIxjbrRlkjU/0/Z50i5RtlVSJlN1Wg7pNQppeg9pB2l6GykDaRmQU2kv6DkNmSYTsVQW2Tw/6DgaWRcSL1Id2QM/qDcGWSZRbX/HZHF+5piu5B1aJRSuQ2Q/RSl5sFC0zwK3ffAynTqlHeBtQuUWQKLjX5T5LoHVoeGKfG7CayvpsL/IbDhOUuBxbBV8wWN3webzb/R8Cs+2O2cQ6Mf1YT9XkU0+HVdONG/iMa+aQxneuXQ0Cf14FTnbzTyRm041/wFDTwahJM1z9K08Co47FkVplH5o+D80N806FFruNHoPE0JbfDDpWl5NOJtX7jX5GSUrpevDcLVIa/o8rl2cNs78ztdfDAIJgQXfqdLj0bCFP+053Q+cnEwjBpwtJSO/tnUDsbVmXXtPx0qOjHSBzPrTT35j7Y/7hoRhMmenguPvQvRYtnj3VNaQqJ678lrD159/r0wzERl3ufHF3cvH9vJB1cAAFZQOCAUDQAA0DgAnQEqgACAAD5FHItEIqGhG3smcCgERLQAZA8I7t81f2H9O/Zn2Y7E/h/6v+r+QpNV3KZ0/8p6j/MA5zPmE/cv1Tv8B+yHui/uf+m9gD+ff7z1of9h7E37JewB/Lv9v6c/7sfCV/c/+5+6XthZqJ/be1H+6/k318XnCWKcf/H/sB+D/r37aci/AC9Yf7DfUwBfmP9K/4Hgaf33of9X/9V7gH8u/qX/E/q/sF/hv95/E/LD8X/TP4CP5J/WP+9/jPYP/zf8/+SXue+iP+9/ofgO/lf9R/5P927QH7b+wn+ubLTomwTWMzY+jZ5YDFHfnMjIgNf/ZMQ1obRYisNwjEUUTPfcivh7Xjr7zxU2+wFMPofbfO62tJKuOCkpgfqTGilQ9mr2umOEehc8FTP+DnBtbPBnWztrZyEBK7zf5Zv9tvB/8Gex196v8n3+Bn54Eydv3/7JvUetpaCjODV6LuHsnRXtUnpZ1BihKK4Ozh38F7mJdIbk4cHDZ/WyRNgXkNkShVr7K02ofEmwhaBDishJjUsTkDwR5bhW2jkNu2xIDGz+QpPeL9f2KqmOFRSP1a1sA5s73jaVe5mGPeLddiWioJFMBn3r+bR4sCN40AD+/qU2YLNvq/dc1Q9o2WRaYM2jMQOZBqlhsXizKs3lc/h6xYg3O067kMYj13G3CZLN3Mi2+vnR+X7rmqHtGywY4z1PKvTPA8utA79DHhyse9imXncdRJtW/lbKAELadE5Wrg0XS+JOm4ta429pNcFdE2EV+b/85t5fg4nvFKg/mCd+K9AMnIcCq0M7dN6KnTiazxvksT858fNivmBHmjOOaVyYsD1zBvWSpu42XOuTh7kB/gLElmFmk3gQsT0NiPyt4xtjh3ZpmuNPABgvYs+Ao8WyE/nXf/kdrDEpU+PrsmT1y+j9CswajQdyj0DEjYpb+OxmC/oXuL2u8sVwBwCjMfc6Y4hLoUBo+3rBUz4a84McqpXOZ8mQsWktr7kJS/9ak63EGQZH7cId3DfTB+4fzI+a5HWX8XvrkhreHpkT3vdR3WmEKIcM3m1731s4SDbE0pyHdWOAzE9xPl0EJGTNAVRbiyzAliaJqUpFH0znglTZSJXI9iXNjwYozIMk9dhOdcFVCAVBBp5dHSbVrgAVmDesgkBekdvf51+YcL49d2MaDEtAbbQ8nLt+ZBrsACdfMZ3x3JT4GeNMEIX0rr0h/S048pGSoS6Uwlr785KcEj59yxyLO+OjoRlH3x5dn/bGDJtEV9ihoFvZfUWsHOkdmIIwFsBU0j0mqrKXk8whZDyMMa1lbfMqQl6P1L3GbdUqV11a26J/9szfrY7INdFEmU0JjKp2huAw4AtUB30Ra6tYle5ZgPIdJvvqBgKtbJw4XyB/lbNxBTNnWFpgeQ2cPMtz0dUHRxhQuBq9L4armyhzYZeGVk8MtcMEILYeiHl/mKXQv+qM84Lo1c/Xz2PmoFvSKOmeeZOFIPyYOJd56SISNpELH3OLv+Lql8qDg5A/zr6ofQ0t/C/H/HDbQoJww7CRkjLnF7Mnf3KDKtg/Ptx5qrek3qHZwTill55okRiUJSQ9KTTRq/eQkZ188Fk131U7lMTRvtrn9KcbBxgA8rgB4J4wtytmt/K/DdbYcp26PNPynjy3ckrtOwoTxxJ07+eAHPQyOEV+AOl6Sh/Iot2PG9Trm34c83bxkQbQE9xNe442RzwzaNmxGaJszcshJbeABHNukib1qGO5L/QBoVp7THie/K0tFFeQ96EWzhh4D0MKRZj2eVmUZTxUNzr7+/IWbkmHiDNBfg4QoxkwNNfkHEcwhbMc/rp9hX5X8SrooQAOnzARYX6pn47qMIHjLSDjuwABljy4odn6jUo5uMXX/A2EKDJOLbY6dAY5ZjFzTwGPL3/qxTcP4sWaGbwWutTJ/H8wJw0KYxjL2gnWQtqPjky/Oh1KuAUtIibI0FR20xmSi3l8ODFgxVmLKvfCNWNuX0DZa40hoiBKI3KY8ubEAJ/9t+DOqRe4t2n6tYw1N+fh9PZeyJhhcfDrawEFCWwsuGXJrYAWtAmQxri8X0pEUtptDzh0tTP2If/Fk6S+VeitxFK/+Ojcukh/INiIsN4Uz95EE4dbZ/3ZV0vM2ZFqA2JP5fu+d/9fIzcVo/CQo7c/8RdeCWvF055pF217bhI4bqazHOsA19YE8LsNiBAqQ9Cta22tdEhxQRt/dBQimaKMpN2vB0GI1RtF/xY1I/+igq+V7WqrbZMpMv/+MhqnJYRoT2StUYOA5DZhOdmAZ/fpT2H73s/4swxBEcE9vnZbbopbgg2vMfCMvgRwdygGTV2LMsaotuJb4E6xgW0qp8ESUaDxRz5zp6xWwvt+YAPVkDxfCIis0BCFHz8UEjA94cdJHazVLVEqr02bfCxryacKtsaY3HY/vY8w/y0NEZ0QKVr5ewiRlRScLpoliqldPwuDRb/mo6gKPPHmL7AsmHEg7BUbck5nYIMTyYWP3xoyesZPxcbcwqUZG1acPIAXhwJSQvv8MQghGss8PD833s3WWNUZjS0qcX3UiI5gI/6BXR8RlLr6MsPyqinBKdrSTIIgF/wkRBxyDvNKKrCak34L+O6C3ZR/jhiqyjH+1AtCi4qLFw8mRQ5GBOnkFLA4OXy2yBBg30rWyY8LNTqbuwtzhyMIjftHWbqX0cuWCWIAYkdPVwUKgIm7cDhaYf3MtL3avWyVe/c6xMfq5d4wcdr798oDnIHKXaJNAiwHp7U7JO/zhiUULQGGB6eLiRfaUJr27cZYQMtsDhU35OaIj4jjxBpRGJpCQMn0/dZQXl5Slm0OdfA3jodK01GGpCsIxZ8Brl5kzeACMFEg3MjfMOa8NyE1fQFicdpUVXf1LKQqdSegu+zBxi3BUTeRIP1YanvhBhXtnj4+rsqD7Nhs8uftezn/NFdTob2QCVF3k+atGNAAV/6tyWNQrwwgK4jCPQ4XXYtu/jlEFt5ZaSw90MVHs4Cr/qNm4Zv8UAfHPK9+k/ZattnMkXaos2+Lr+ofcnw+CT0dP03AObTTFJ1tq9fSDici8LO5yZw/nVncoKn0QX0Mit6VWOkuxgQlJSde50eNy1lKF5YtjqkD1XQ/nCnwviHQ3B2Js5kOT5n/qmmSMbOWkmD3uRnHghpjX7wqIGQtq0c0Q/40ey4CV4nNhzrHZdHEBEVdyxciHYyLwrUxWolOfXtidWYz6o7DJu8jdWDm0fRt0B0GcxIb3f4weW2d01QieFbaCSI8zxirJdQRWR1qWTpOGcc7rZpWWB+oFhWbh7Hsp4X0qMv/5BFZv0MzZqQ8UzN5BeZ2mIVIXcoNlFQj4pZwU6X9mlghQZzu1hzUPY5ucPpXzNgiVHD6ItqXeRvNuNheg6S0NtuPFdzIdnB1mPnem2xvYekmMQ9M+wci0oTYN6ITEdrkVDq+q4pm8fLeS/jv983ciDw5B+eqC9rBt8sC/WZxd0GNJyFkL3VL0lBfPj/8XxYLo0ziJhdKsQuV2Umzf5AkTTaeV+egflUH6jRDBRXp6Z1OLN3euUshwA4e18ahiJWV5Y0Zl/T3EJr84i7xMF1DQUoU48aPPl4U5wG33DPzuRhb1Ddx3lJYymKtfUmsfxJf9U60Kg0d0x6SlR1Un10u8rODp/bDRu1+pdvTvzYIR20I73Xhjbxga4kei1JKvIkeSoKs0sFAEDrGb4N//DojVfaXCq7UR75zizoyCdHWmRM2xoce17f7g0kkBu2smpPlpLKX1Zb/Pxy/EuW7eTvxyTEHmTXtXXoLyHcxMxhbFy8wKge2NT2mNDlq2UH1e/Jrolc6kbiFsmbHXxvZMxA2FeEMt69U/iUZUgJeEQ5A0qSVQPnmYK26jM0FRmmc9LSrNw7jeDFGdwR5TP2knJ0myloIEt4v8C9xv4GhWELXAnAHF+8eGcI4aKYr7Lyax7VaqxXELVQBNuvxDfPdjCPX2cN90EvSguLdToH3la4cAjo7GvT+8tFaOTxlSxTixI2IAuMSnIT+TdFSOhTuj4eqZCaV5NNOf6wXgfQ2U0ngBMA18K7AhCG299sEaO0y5Z7FEb8IwUN14gE7hscETW9Hewpbkl+yUG6UYbq9SZeWY9zbBZ0lLqMboNS0JuBVzUuZJLw5s6jLcfnEm50CUTjEEpOWl9VbKR9hjWAUeL32nODaFWzD4LHLpupyXZou5o3IRyOsMVrVVwdGoUjkP033tNuyrormSdZs3vDYSqckmyDT12+PVFj13t/I6UW75GGZ1SUDaTlBWKV//8vT8j7moC6010mhqc7UsdxBFsco7pV4fMGcYkH6xYjWKd4aPpJFZpS3xlU1KKGThr/n//WooV78Rf4nPozRJtfNabu2hVXjnuGvh6I+kgxBJ3qzEf95zRQo06h0PqkgQgGGqE1TTUayy6e8Rl4Wel5X742FngYT315tJPw8JPfrbXz/pIiJ9iGCAAAA" + } + }, + "document": { + "size": 15388, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577469797, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2609": { + "id": 2609, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "правда, я тут встретила очень хороших людей\nвы замечательные" + } + }, + "date": 1577469871, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2610": { + "id": 2610, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И я чот довольно сильно" + } + }, + "date": 1577470151, + "senderUserId": 141185012, + "replyToMessageId": 2604 + }, + "2611": { + "id": 2611, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вы чудесные. ❤️ А ещё я всем благодарен за то что создали настоящий крутой праздник в среду. Мне очень тепло и круто работать и отдыхать с вами." + } + }, + "date": 1577472492, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2612": { + "id": 2612, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "675168768736887073", + "emoji": "🙂", + "isAnimated": false, + "width": 128, + "height": 106, + "thumbnail": { + "width": 128, + "height": 106, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 16396, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577472564, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2613": { + "id": 2613, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "810555256122377070", + "emoji": "❤", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 26970, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577472615, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2614": { + "id": 2614, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "уиуиуи" + }, + "video": { + "duration": 2, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDSxjvTN3LAEEj0qEyiG3ZsE7egzWfFdSI7F8jdnqOlIo2BsUZZh+dFYm4lyDk8ZHtRSCxZuGLwso4HXNUPMdyoLFsHpmrkpyjD1FVYYX8wEjaBzzTQmEqPG24A7W7mirb7Su0nAzmigYpUMKXaT3oopAKYye1FFFAH/9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 419567, + "mimeType": "video/mp4", + "fileName": "IMG_8007.MOV" + } + }, + "date": 1577484592, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2615": { + "id": 2615, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С наступающим, йо :)" + } + }, + "date": 1577807314, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2616": { + "id": 2616, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Новый год уже шагает по стране) с наступающим!" + } + }, + "date": 1577807597, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2617": { + "id": 2617, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С наступающим друзья ;)" + } + }, + "date": 1577808453, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "2618": { + "id": 2618, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCmBU0Nu8pwo6daRVq9BDLEhblc+gzWspWQ0rkJsZEGSOPbmoGQA4HNaiySBypHHWqctu0k7NGvHU1kptu5ooq1mVSMUU51Kkg8EUVspJmbTRNagNMgPStXaKxoJNkqt6VrLKCoOeDWU9wQNkd6qzTmM4QgeuamlkCoSTwKy33vmUnjP51Ba8wmbdkk5JoqJmyKKEhtkixyGIuFytOhneLAzlB2ooqpvUqmk9B81yx4jwB6kVTJPAzRRUJ3ZU4pLQARj3oooqzI/9k=", + "width": 1080, + "height": 1080 + }, + "sizes": [ + { + "width": 320, + "height": 320, + "type": "m" + }, + { + "width": 800, + "height": 800, + "type": "x" + }, + { + "width": 1080, + "height": 1080, + "type": "y" + } + ] + } + }, + "date": 1577808483, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "2619": { + "id": 2619, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всех с наступающим!!! )))" + } + }, + "date": 1577809272, + "senderUserId": 802771524, + "replyToMessageId": null + }, + "2620": { + "id": 2620, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С наступающим, котики" + } + }, + "date": 1577809298, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2621": { + "id": 2621, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1078212296544616505", + "emoji": "😘", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21072, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577809300, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2622": { + "id": 2622, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Наступающим!" + } + }, + "date": 1577810643, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2623": { + "id": 2623, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "311503369409659028", + "emoji": "❤️", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 27436, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577810654, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2624": { + "id": 2624, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым годом!) у меня уже 2020 🕺🏻" + } + }, + "date": 1577811804, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2625": { + "id": 2625, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Люди, поздравляю вас с наступившим(у меня) и наступающим(не у меня) новым годом. Вы самая крутая команда с которой мне доводилось работать! \n\nСчастья и развития вас в новом году!" + } + }, + "date": 1577815702, + "senderUserId": 105945096, + "replyToMessageId": null + }, + "2626": { + "id": 2626, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "3664822579234188", + "emoji": "☺️", + "isAnimated": false, + "width": 320, + "height": 320, + "thumbnail": { + "width": 320, + "height": 320, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 14682, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577815802, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2627": { + "id": 2627, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Люблю вас, ребят! Вы классные очень, спасибо за все в этом году и следующий, чувствую, будет тоже классный!" + } + }, + "date": 1577817564, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2628": { + "id": 2628, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "186649756741665171", + "emoji": "😍", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 10397, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577818076, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2629": { + "id": 2629, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "вы очень классные\nвсех с наступающим и кого-то уже с наступившим) пусть в 2020 всё сбудется\nпростите, если где-то обидела в 2019 \nлюблю вас ❤️" + } + }, + "date": 1577818381, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2630": { + "id": 2630, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С наступающим, ребят) Osome - это семья❤️" + } + }, + "date": 1577819842, + "senderUserId": 143235707, + "replyToMessageId": null + }, + "2631": { + "id": 2631, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всех с наступающим!!!" + } + }, + "date": 1577819887, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "2632": { + "id": 2632, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ребята, вы реально классные! Желаю вам самого лучшего в наступающем году! 🎁🎉🎊❤️" + } + }, + "date": 1577820056, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2633": { + "id": 2633, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С наступающим!" + } + }, + "date": 1577821644, + "senderUserId": 165916816, + "replyToMessageId": null + }, + "2634": { + "id": 2634, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да, вы и правда ничего так ;)" + } + }, + "date": 1577822453, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2635": { + "id": 2635, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Шучу, вы огонь ♥️♥️♥️" + } + }, + "date": 1577822467, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2636": { + "id": 2636, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всех с Наступающим!\nВы все невероятно крутые и я желаю всем всего всего самого лучшего! :3" + } + }, + "date": 1577822550, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2637": { + "id": 2637, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым Годом всех! 🍾🎄🎁" + } + }, + "date": 1577826243, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2638": { + "id": 2638, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С новым годом! 🎊" + } + }, + "date": 1577826275, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2639": { + "id": 2639, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "368147511233217011", + "emoji": "😌", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,UklGRhwMAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSEwDAAABD8agbSRHn8w/f8pbvkGIiDz4EXmRkhKRkgpPGQtpmXBekbtUGIsNLZOiQ8vNoqRlpWRF6uSSCd/yCtmSZJu21WvvY+Patm3btm3btm3b9kb/2dbCmXOM1xsR/U/8f8LJLy5yoDO384ydN97EmHw704G6/DHHftJrFZQVLfxEn2g9qOr9nP6joCi0NMYAQ6En7zCDfCmDmryzDPJ7ENQ4h+j/9tLqRtAzn97fDk/vUgGJeRNP3Tk6oRAB2kbodX1kHlwNR4xtBUEFN5l+2Re+zk16PB4Ad7erTF1rADEzmRkdB7/B9NhdBFf2hjgzHuRAynG6or2RzG/cfeSkBWu27D1y8iXdn1fNmzC8W+MCJIrO0d0PUo7T/Wr9hVdxViX+5spdeoyAlJW01QRCCufQ0hXI6HHwF209m5QL+20u0+rTYbAcXhyh7QNlsFl0kgIeNoG9oqsU8aENbIVPUsjHZrC0hGKeVMBK+yjlHIIN5xYlDYeFoRT1NBfmr1HWeBhvRmH3YHwBpbWC6cuUNheGs35R2ikYbkxxr2C4J8XFc2F2GOXVgNnRlFcfZkdSXi2YHUx5+TDbk+LewXALirsIw8UUtxymn1NaV5g+TGGvwzA9mcKWwXjdGEX9rglTdTr379uhpoPkeYpai4RTv/fI0f2ahFCVrjveMuPrhaU9hlDS++oDd75lxtfDI3MQsOUlen+JUdCjT/R8PTUHQSb/paL7HeHrrKOuyCz4raW6LSF4TqHC7Q48ukaocRnc5S+oMj4Erp1U+rE6MjrHqXU3Mq5Qbbw1Up2p+ABSu6n4XzUkCn5Q80QkBlD1CSRWUfVnBxeouzZeUXcnxKi7Z4jKe4WpvGeIyrshSt1N8ZyqI7k4Q9X3kFhK1ZuQ6E7Vw5HIekvFv4uRXE3F+5FqGKHerkjvotpryGjwh0rjXZC5iEr3wJV7lyrfVsLd/AcVRvvAa1iM+mbBewrVrYPftDh1rXPgO+Y3FcVmI0i7J1Tzti+CFW+MUkV8TyUCtz5FBVe6oEpttn2n6F/7OqPKBcN2f6XQLwdGl8BMds8Vt6MU9vn0/E5ZMFrcY8bWi4+/0/rfN/dOb549qIEDW6GcguKS0jIrpSVFBblh/P8MVlA4IKoIAACQJgCdASqAAIAAPlEijkSjoiGWSuVwOAUEoA0yHOXx5w/ifyN/I7q6OPfCH44c1uaHtk/Wfbd2mPMA/UTpWeYr9mfWM9L3+n9QD9Wusw9ADy6fY//sf/S9IP//6yh447C+f39Be0XJiiO/IfuLECwAvXv+P3lkAH1e4hNJT819gDxPM6n177A3SI9EBBaAo+AyLspUil2izMLfoHtInYDPgXxy5PoNyN1hcBpiWqBAs60//pUnRGXbfDjNO6jMcXjBls5PVWoftpicfWeon2za+MajnHGJaIvfTha302mdE63Bynh0tfp9nnuObeinhzkabq8uIrvyX0sEvyGZbETd/PBkEPfbsKPeRCyUZxmk7Y3OJoIWUHzpBsITjm1t7wQD4RC0EqHabYb4hlhj+euG307v+AD5OdGUlvowgAD+/gbQAAQUO5cCCEyy/Yt9rkPOMs/UpUxn/CrjZoihnt0unCWj3MQkDnfObbnCCMYpmIYEQIrj8yK+XZHaN5rnSfU2pJx55Udz25lrkPKGAmo3kz0nVVY3JhaiW5UDKll+yP3/G7sLsW4qz99+nJ6Nmhi8l5+C+iEqoF1Ntx7zPTDV0NK4+PoZm7uwlUdW7h/dx0blKBOYtocn8vltuPbTTbJoPI5p+Dem9kCqYTY3AKs4iQR6AIt5MSu1qoCz38KwGt4D7ZP8w1S/eM26GnYylygMy24DashgoRagVE6nOwQV1gvUHZ5fKfXf8jLUnkxdN4pQ/AIjim8hkEIOme3rp5c/+b85DR+V2IljuV1PhJ/1G8XcKIFYdxUBwZJhH+H19ModSgF0CnTTVF7Yf5wxLDl9yahN0bzpt56pPFiXgWK5W4V+axZYvbk5v3AHUzauGtM9Nubx0IW6Sz3W6e2TIMy8gawCrQc3Im/QzgxdEw1oiVFurScQ9IKrtLul33kMKy1o0cHtSLqnVuV/6cdVdnb8zPNykHTM7KlvpLzvaXpzucmnPkskgaxOV50GT1ool5ExnZZnkA3y6Dg94bTMf05sPilqRBszUuY8BdooI+8Adh8vNE8Xlh7ZWIp616tUpe8wgcGYVB4eC6XX+rpp5cbtHa19I25US/lmxKm4diEQCTb+YPUrCPjm6yoJPu6tPpNps3gOTGTThYWYrKqaGIrPPgEpenQiDZ6D3EHVPNqpu0iBN2SMpYOX0o9gPVC6WIMZIc91RRHnSEfMpP2aVcnH8xJSkk6jBDx9iaKADu1haeX8gQYSLkvMFOG82broqenrUuEIj0hBNsw1H0pGg3f3v7mDemsofZOmN26/4NVYN1Kvtu/l3DmX1qcZkOnI8XAFTPM+Z9fZvZMv1SPmIAIgo38dCo6Ew75kTSFBXbXqioYE++s77X0dVHzR3x9xXYVVGQHtOVXm6ssVwfF6O8Oc4oAMPfNajjdV/m0cbVD3IgirJqdADk09mt2xhAQVj2lje3zSnlXIGzN8G8oFQFZ4CUXz5nZs+pVz+vdAcMvDLPmCijb5K+IJlrish+57lc9WsGlodv3Sh2R9p1HE4xaN1gyjff2ifz9aCLcbeS6+5i9fd92ageuBLmrfb6Zla+guliP/QPZPcVtUe63KcRyVA3p7mWHVwukjOqeMZIPTiZzn8J7tKkz/G2nd+9RfWTC++BVFkTq+7vhCyvQzAeFSgeHRjvrybNYNSSXCBtTw2wGu342SR/i+6GOdr/gys4ds92LfrvBU6+3bKvkjx8UF0uazvxVasE/nVnhakJ8teNa5Da263uO+XL+ZiRSh1nDAv4LzUvAmI+I4fP/b8QKVtEXh1D+UENc+JWCIADAAi7Aqlz8dsr6r0Xy+YKCxTuwWMVFLoVoA2CAYNmsu837h+ffSMp3CszTS523CmR4mST305t9q+YNuU6I37oPbtbOYCzcyOG/oRXK4LHLC5WXgmwS2T4cWQ4zMtbOrLeVr+J7xA71Vg92toyOHkiUzYUd9ZiYzOvBK/5UzKGG40nZc/cT9LpPQFHNr1t465YN/T2qgzIobrK2WdaJjViQPrhfx+RpunC2vbMOat9XlLkIhnhHJroLsHIHU2CTE4Zo1SQGH3PY287UhKv/yv5dBnwPAr+WVZoqdaJXIT8z3rV9nVZ6STlxenfwh96jcn9yg97me0oiKuSNvPb/z4wckoACMb8I8Ntu5zYZLb61p9O5bLyAo1SibD2Nt6DLvQpFRGsfS0vA+c+EG1xKAZ8RFCDM+yU4wY3fxnvB5biqbLEp7f8rytkhR2ntoWusBxUF0WbMvxrHaftFIn9pmwxW9Ea/dMUmW6Xbp6MYQsMKIWSyOM+eht4j/Zu7fEkPHv6VSio7sVIXXEStV/IQ6YP+c9SBLDvM78jpx5y244zrdrafLphaMt644Z7EVHfCUJf7Jk/P3DiR1ssfDgjILuufFceaw8CgDQAzCOixoxIqbxIXnnge7FT/Xfr/Ufmd16MHHM06bei1GduNi793eHmays7zPYi6UaEmKWfB5v0uZ3H3ErwWn/cs8PPsQCmnS27JkxzNlbhuwn0JzzXHBH6mDVy62ggPpwZnwruWLOf7yB9c30vRQxH6+GAPk42dy1RG8475UCVldoG+C6jv167jbcvu7do/D0VCHXBe+zcOH9QBNAfbpwepd7llIDsIDlrm3AJQxryQGsIEvJlCifCVwdDaHvxWhYKgv1rxyOHU5yyLM0yoTK22irNLgp0NgzTlcRMB///EWgRyXWWOyGyERVNdMMTwY+d1o5qRTOrcN3wA/aiO5X21/KbiT26pw5SKBNzsSFUEqJt7iZdGsNoc6siFh5Cpxj23DtYQxVb7/8SsQN3ECA3N5+ZarQs2iFryOYS8wNmIhpuBDAJPN00gTf5+Q6cvbSIrkbvvX8LH3wboqIlOwAd+zryTPVpXfCzhscEHUO93gsTErNwg48wn3nHvWrVxPKu6nCL+gaOS++4wcbYQAAAAAAAAA" + } + }, + "document": { + "size": 13396, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577826280, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2640": { + "id": 2640, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым Годом всех! 🍾🎄🎁" + } + }, + "date": 1577826283, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2641": { + "id": 2641, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Вы все очень крутые, давайте зажигать в 2020 году!" + } + }, + "date": 1577826292, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2642": { + "id": 2642, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHoxUkce6pxb+qmmkK5UxRirxtgOqGorhY+DGpUe5zTsFx9ps2nd17c1orJAVxtYds5/8Ar1iBsVIJj/eP86lDNmQxGP5d4z7npWfdqqIoHJzUImfsw/KmSyO+M/pVXFYgpaKKkYUuT60UUAf/2Q==", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1577826309, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "2643": { + "id": 2643, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "405317292084167861", + "emoji": "👍", + "isAnimated": false, + "width": 480, + "height": 512 + }, + "document": { + "size": 40132, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577826323, + "senderUserId": 860139781, + "replyToMessageId": 2641 + }, + "2644": { + "id": 2644, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым годом!🎉🍾🎈" + } + }, + "date": 1577826416, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2645": { + "id": 2645, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым Годом!!! 🍾🥂🎄" + } + }, + "date": 1577826655, + "senderUserId": 802771524, + "replyToMessageId": null + }, + "2646": { + "id": 2646, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С НГ, РЕБЯТА" + }, + "video": { + "duration": 6, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCxLKsaZY8Cs+SdXkBGePWn37ESIuMg1TmBRxwQOoBqSy6rZGaKqrJtGTzntnpRSsFy5dx7lBXJ54zVVoyfvk/SrqyCPJk6MeB6UyR0kPbgE9KB2M7jH9KKac9uaKokusTKfehVIR8+lFFIa3K+BiiiikM//9k=", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 836471, + "mimeType": "video/mp4", + "fileName": "IMG_8072.MOV" + } + }, + "date": 1577826741, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2647": { + "id": 2647, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым Годом!! 😎" + } + }, + "date": 1577827287, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2648": { + "id": 2648, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "video": { + "duration": 3, + "width": 464, + "height": 848, + "supportsStreaming": true, + "isRound": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwByjNOlXDAfQ/pUasQfapbpgJPwH8qzNbEZNFRNKBRQKzF81duD3pZGBT5cE98mq+3IyTSK2eCKLFKXUaSWbnpRTgAOlFMhybYE/JxTQx9BRRTFcXdgYooooEf/2Q==", + "width": 175, + "height": 320 + } + }, + "document": { + "size": 464547, + "mimeType": "video/mp4", + "fileName": "IMG_0081.MOV" + } + }, + "date": 1577827296, + "senderUserId": 327556368, + "replyToMessageId": 2641 + }, + "2649": { + "id": 2649, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDIopcVJboXnQAd/TNMC9BaKbQo7bS/P5VnSRtHIUbqPStx/vZ3bR0+lVby3Erb1HzZ5x60gKshZoEXyVUL/EByaW2MaSZkIHoeeK0CoJII4xzVMRwhyc554BqVItxLW4FTtJ2v6GpYI8pwufU4/wAKhjAWNdgztzUzyFEXaSD3zTIM6W9dlAXhT+tR+YGI3rnHoaKKVkilJk8UqqeQQg6VLbTq4xL8vHBzRRTFuz//2Q==", + "width": 958, + "height": 1278 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 958, + "height": 1278, + "type": "y" + } + ] + } + }, + "date": 1577827608, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2650": { + "id": 2650, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "уиии" + } + }, + "date": 1577827664, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2651": { + "id": 2651, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBjDFRMasOM+1V5PkOCM1JVhtOztGBzSR/M2MVZ+xyH+E0ANTByD1B71Fc4BGBz3xUsREi7h3qvc7kA44pdS38JLYlRMC+MVuLIjDKsCK5gMRyKmiuJguVLY9RVGYy1n8sgHof0qS6mG7HUEUUUW1KvoU88Vdhfy4F25BPJoooYo7n/2Q==", + "width": 960, + "height": 1278 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 601, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1278, + "type": "y" + } + ] + } + }, + "date": 1577827962, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2652": { + "id": 2652, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Much fun!" + } + }, + "date": 1577827964, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2653": { + "id": 2653, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAeACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCKR8ptz1IqQxxCPoPrUV2AgXH86coQxgjofeoZoRxMQ5QHIpxcHmm8C4FNbhse9dNOKa2MZtpitIAcHrRTCC0/TOP0op1Iwg0NNsSYYY561NZnIYZIqqWLgkmnwsFIBzyO1cxY4KS5IPQ1KinIDc+hp0SDysjr1pVO+T0CmqjNrYTj3EWIBiecmipjRQ5N6tjSSP/Z", + "width": 1280, + "height": 959 + }, + "sizes": [ + { + "width": 320, + "height": 240, + "type": "m" + }, + { + "width": 800, + "height": 599, + "type": "x" + }, + { + "width": 1280, + "height": 959, + "type": "y" + } + ] + } + }, + "date": 1577828075, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2654": { + "id": 2654, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Май фан из фанниар зэн ерз!" + } + }, + "date": 1577828079, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2655": { + "id": 2655, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всех с Новым годом, чуваки!" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCC2ga6G+WRgD0Ap8Uj29yIZDlW6Gm2uREpaTapHAFJdKViRvM3MrDBqC7aFqUZZfTOKftBHODSS5GMDPOacuNo4qI7ilsZlvIFOw568Yp8zh5FGSADmk2DPHUU4hd5IGB6VrYz9r7pcMiOBjj60j3CQ4DHafTFVSd42g8GpjH5ijK5YewqWkgpyctGRQL5sqoO5pJV2SsnpRRV9SEvdI8bXIz3qxHKUGC350UUWuiG2ndH/9k=", + "width": 958, + "height": 1278 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 958, + "height": 1278, + "type": "y" + } + ] + } + }, + "date": 1577828407, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2657": { + "id": 2657, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1395202765847790103", + "emoji": "🥂", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21808, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577828423, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2658": { + "id": 2658, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым годом!" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDJqaAjeARk9s1KbZT0pht2BypqSixKkbQM207hmqSoz/dUn6CrtoHZ8PzWioSNdqKAPahAygChoOOxqln2q3b2zP8ANKSij1pWDcmgwOlWQagMC4zDJlh2NOil3LzTApYljlGBhge9XAjy8ysc47UUUpaBDUZK5gCoTu9G9KrJLlmOSATmiihDe5//2Q==", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1577830498, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2659": { + "id": 2659, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1395202765847790103", + "emoji": "🥂", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 21808, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577830564, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2660": { + "id": 2660, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "884547634142909749", + "emoji": "😊", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 47516, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577831002, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2661": { + "id": 2661, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Как там в 2020 году?" + } + }, + "date": 1577831744, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2662": { + "id": 2662, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Чего ждать?" + } + }, + "date": 1577831750, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2663": { + "id": 2663, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "1000 за 20 минут такси 😂" + } + }, + "date": 1577831782, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2664": { + "id": 2664, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Наших, конечно))" + } + }, + "date": 1577831791, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2665": { + "id": 2665, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Лешкоинов?" + } + }, + "date": 1577831805, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2666": { + "id": 2666, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Их 1,000,000🌚" + } + }, + "date": 1577831847, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2667": { + "id": 2667, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Слишком дорогое удовольствие" + } + }, + "date": 1577831866, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2668": { + "id": 2668, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Метро работает" + } + }, + "date": 1577833362, + "senderUserId": 860139781, + "replyToMessageId": 2663 + }, + "2669": { + "id": 2669, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Яндекс плюс от Ильи я могу позволить себе побыть королевой!" + } + }, + "date": 1577833441, + "senderUserId": 327556368, + "replyToMessageId": null + }, + "2670": { + "id": 2670, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Фигасе" + } + }, + "date": 1577833790, + "senderUserId": 860139781, + "replyToMessageId": null + }, + "2671": { + "id": 2671, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "бесплатно даже, вроде\nне?" + } + }, + "date": 1577834363, + "senderUserId": 177121435, + "replyToMessageId": 2668 + }, + "2672": { + "id": 2672, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не знаю, через часок другой выясню" + } + }, + "date": 1577834382, + "senderUserId": 860139781, + "replyToMessageId": 2671 + }, + "2673": { + "id": 2673, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1395202765847790100", + "emoji": "😀", + "isAnimated": false, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 17018, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577834387, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2674": { + "id": 2674, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Боже, Прага божественна в Новый Год" + } + }, + "date": 1577837391, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2675": { + "id": 2675, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С Новым годом дорогие люблю вас всех оч" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDKPWrkTssKYOBiqsw2yuPQkVatyrQhDnJ4B/GhgSxTMZlU4IPtUF/j7SQBjAFSWIL3Iz24qK9GbqQe9LqMivOLmX/eNLGJHAEaMwXngVdaK2lkYkrx1ZmIqpHIYg6xvwW4+lFwJYpfs8+Yj1/vCoWcvKztjLHJ9KQfNuZm+Yc0negC+Y4V4CFifemOieWVCYPqRiiipTKaKi8NyKkCo3aiimxI/9k=", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1577837392, + "senderUserId": 141185012, + "replyToMessageId": null + }, + "2676": { + "id": 2676, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Метро бесплатное" + } + }, + "date": 1577840330, + "senderUserId": 860139781, + "replyToMessageId": 2671 + }, + "2678": { + "id": 2678, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "884547634142912956", + "emoji": "😍", + "isAnimated": false, + "width": 512, + "height": 512 + }, + "document": { + "size": 45684, + "mimeType": "image/webp", + "fileName": "sticker.webp" + } + }, + "date": 1577842466, + "senderUserId": 327556368, + "replyToMessageId": 2675 + }, + "2679": { + "id": 2679, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "2562980648230846522", + "emoji": "😊", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 10174, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1577842508, + "senderUserId": 327556368, + "replyToMessageId": 2674 + }, + "2680": { + "id": 2680, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Как этот жест называется" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCknPTvUqg5qNR5jnHU808xkAHNQdV0kTxvirdvMoDbmxWcD0xx7VfsljKM0g5zjmla4p2sVbGB2O75RGOCWq6iZ3JIg2Z+V+mSfas6N3B/dMQScbRnmtUCQlAw5BzwOKZEkVJJ4LfKwxDcR94nNU4rh4Adv3TVm9tWEzuOhORSWUbHfnGPQ0AmreYlq0MEjySN8ykhVxTHvpWn8wNt9B2xRRQVFX3Jrm7SaJWR9kuOV9RUFjceVuLHO7miiixOzP/Z", + "width": 960, + "height": 1280 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 600, + "height": 800, + "type": "x" + }, + { + "width": 960, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1577992560, + "senderUserId": 63238467, + "replyToMessageId": null, + "forwardInfo": { + "fromChatId": 63238467, + "origin": { + "senderUserId": 63238467 + } + } + }, + "2681": { + "id": 2681, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Дэб?" + } + }, + "date": 1577992597, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2682": { + "id": 2682, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "ага" + } + }, + "date": 1577992652, + "senderUserId": 177121435, + "replyToMessageId": 2681 + }, + "2683": { + "id": 2683, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "❤️" + } + }, + "date": 1577992671, + "senderUserId": 63238467, + "replyToMessageId": null + }, + "2684": { + "id": 2684, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "меня программистом назвали 😂" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAGACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDV8vPcf98ijyz6j/vkUUUAHln1H/fIo8s/3h/3yKKKBB5Z9R/3yKKKKBn/2Q==", + "width": 695, + "height": 103 + }, + "sizes": [ + { + "width": 320, + "height": 47, + "type": "m" + }, + { + "width": 695, + "height": 103, + "type": "x" + } + ] + } + }, + "date": 1578550427, + "senderUserId": 165916816, + "replyToMessageId": null + }, + "2685": { + "id": 2685, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "один раз не считается" + } + }, + "date": 1578550647, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2686": { + "id": 2686, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "кинь всю статью)" + } + }, + "date": 1578552351, + "senderUserId": 205688700, + "replyToMessageId": 2684 + }, + "2687": { + "id": 2687, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "это не статья) https://en.planet.wikimedia.org/", + "entities": [ + { + "className": "MessageEntityUrl", + "classType": "constructor", + "offset": 15, + "length": 32 + } + ] + } + }, + "date": 1578552939, + "senderUserId": 165916816, + "replyToMessageId": null + }, + "2688": { + "id": 2688, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Класс, молодец)\n\nчитаю на странице Osmose как Osome", + "entities": [ + { + "className": "MessageEntityCode", + "classType": "constructor", + "offset": 35, + "length": 6 + }, + { + "className": "MessageEntityCode", + "classType": "constructor", + "offset": 46, + "length": 5 + } + ] + } + }, + "date": 1578554066, + "senderUserId": 205688700, + "replyToMessageId": 2687 + }, + "2689": { + "id": 2689, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ого!!! Круто круто!!))) Красавчик!" + } + }, + "date": 1578554873, + "senderUserId": 332648262, + "replyToMessageId": 2684 + }, + "2690": { + "id": 2690, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "congrats!" + } + }, + "date": 1578556772, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2691": { + "id": 2691, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAVACgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDVVRtXCKeKT/tmv+fwpf8AlmOOwpAq4OR16/L/APWoAUAfxIo+gz/SnYX+7+lN2rg9fypVUDpn8qABlXYflHT0opW+430ooAhEwKAFM8etKJVGAIxxRRQAvn/7P60ef/s/rRRQAjT/ACH5e3rRRRTEf//Z", + "width": 810, + "height": 424 + }, + "sizes": [ + { + "width": 320, + "height": 168, + "type": "m" + }, + { + "width": 800, + "height": 419, + "type": "x" + }, + { + "width": 810, + "height": 424, + "type": "y" + } + ] + } + }, + "date": 1578557526, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2692": { + "id": 2692, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "document": { + "size": 846584, + "mimeType": "image/jpeg", + "fileName": "IMG_2901.PNG" + } + }, + "date": 1578897171, + "senderUserId": 54158593, + "replyToMessageId": null + }, + "2693": { + "id": 2693, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "sticker": { + "id": "1896515373021265956", + "emoji": "😭", + "isAnimated": true, + "width": 128, + "height": 128, + "thumbnail": { + "width": 128, + "height": 128, + "type": "m", + "dataUri": "data:image/jpeg;base64,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" + } + }, + "document": { + "size": 17348, + "mimeType": "application/x-tgsticker", + "fileName": "AnimatedSticker.tgs" + } + }, + "date": 1578898706, + "senderUserId": 149266234, + "replyToMessageId": 2692 + }, + "2694": { + "id": 2694, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Рокет живет в сердцах !" + } + }, + "date": 1578898724, + "senderUserId": 149266234, + "replyToMessageId": null + }, + "2695": { + "id": 2695, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "мою знакомую бывшую сотрдуницу Рокета тоже так выкинули. Она тоже с крымской пропиской" + } + }, + "date": 1578907090, + "senderUserId": 177121435, + "replyToMessageId": 2692 + }, + "2696": { + "id": 2696, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "очень грустно" + } + }, + "date": 1578907121, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2697": { + "id": 2697, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "С другой стороны представьте сценарий, если ничего не сделать. Киви попадает под санкции, пропадает возможность привлекать капитал, в компании начинаются проблемы, в результате гулять отправляются все" + } + }, + "date": 1578907534, + "senderUserId": 3247289, + "replyToMessageId": null + }, + "2698": { + "id": 2698, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "да, так и есть" + } + }, + "date": 1578907578, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2699": { + "id": 2699, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "но в любом случае грустно, что страдают в итоге обычные люди" + } + }, + "date": 1578907630, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2700": { + "id": 2700, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "у меня сестра двоюродная живет в Севастополе, рассказывала мне истории, как она не могла нигде счет открыть, кроме какого-то местного банка" + } + }, + "date": 1578907666, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2701": { + "id": 2701, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Добро пожаловать в Россию!" + } + }, + "date": 1578908312, + "senderUserId": 63238467, + "replyToMessageId": 2700 + }, + "2702": { + "id": 2702, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Всем привет! Я редкостный растяпа и перевел деньги не на тот Тинькофф, но не могу вспомнить чей это конкретно😞 если кто-то из вас обогатился на 2200 прошу вернуть, буду очень благодарен и с меня пиво или шоколадка ( кому как больше нравится ) 😉\n\nНомер карты как видно из скрина заканчивается на 7511" + }, + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoABQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC99iiJIO/j3o+wwj+9+dWMEt1OKdQgK32GI92/OirNFABRSd//AK9LQBHub0P5UVJRWfI+47lP+0rPP+s/8dNO/tK0/wCe3/jp/wAKKK0ERR6lD82+dT8xxhT0/KiiigD/2Q==", + "width": 640, + "height": 1280 + }, + "sizes": [ + { + "width": 160, + "height": 320, + "type": "m" + }, + { + "width": 400, + "height": 800, + "type": "x" + }, + { + "width": 640, + "height": 1280, + "type": "y" + } + ] + } + }, + "date": 1578915450, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2703": { + "id": 2703, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Чот не хотят признаваться" + } + }, + "date": 1578919552, + "senderUserId": 860139781, + "replyToMessageId": 2702 + }, + "2704": { + "id": 2704, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Да уж( я на этот номер всего один раз до этого переводил деньги 14 октября 185 р. Я уже с вами работал и кажется это было после \"типичной пятницы\" в Осом ))" + } + }, + "date": 1578920364, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2705": { + "id": 2705, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Может, этот кто-то ещё в отпуске? Офис полупустой" + } + }, + "date": 1578920523, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2706": { + "id": 2706, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хз хз, буду ждать и надеяться на сознательность этого человека" + } + }, + "date": 1578920612, + "senderUserId": 53759108, + "replyToMessageId": null + }, + "2707": { + "id": 2707, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Я свои карты посмотрел, это не мои точно" + } + }, + "date": 1578920618, + "senderUserId": 3412850, + "replyToMessageId": null + }, + "2708": { + "id": 2708, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "И не моя 🙌 можем метолом исключения попробовать" + } + }, + "date": 1578920637, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2709": { + "id": 2709, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не моя" + } + }, + "date": 1578920647, + "senderUserId": 177121435, + "replyToMessageId": null + }, + "2710": { + "id": 2710, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "-" + } + }, + "date": 1578920883, + "senderUserId": 356765513, + "replyToMessageId": null + }, + "2711": { + "id": 2711, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Не моя" + } + }, + "date": 1578921166, + "senderUserId": 332648262, + "replyToMessageId": null + }, + "2712": { + "id": 2712, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "-" + } + }, + "date": 1578922216, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2713": { + "id": 2713, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "-" + } + }, + "date": 1578922266, + "senderUserId": 194771934, + "replyToMessageId": null + }, + "2714": { + "id": 2714, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "-" + } + }, + "date": 1578922309, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2715": { + "id": 2715, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "- также просмотрел телегу, и слак на предмет этого числа — нигде такого не использовал" + } + }, + "date": 1578922518, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2716": { + "id": 2716, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "не получал" + } + }, + "date": 1578925278, + "senderUserId": 310552513, + "replyToMessageId": null + }, + "2717": { + "id": 2717, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "photo": { + "has_stickers": false, + "thumbnail": { + "dataUri": "data:image/jpeg;base64, /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDACgcHiMeGSgjISMtKygwPGRBPDc3PHtYXUlkkYCZlo+AjIqgtObDoKrarYqMyP/L2u71////m8H////6/+b9//j/2wBDASstLTw1PHZBQXb4pYyl+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj/wAARCAAoAB4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCpFgnDnBPpU/2dP75qnbj96Ca0Ac8VCSKZUuYdiBgSRnFVsVeu+YiPQiqeMUbASQf6wVeSqcWBMqjk1bHFNAyO6/1R/CqWatznMTVSzQwRJEdjhjUxuR6/pRRQgZHJOGQgZ5qDvRRQB//Z", + "width": 956, + "height": 1276 + }, + "sizes": [ + { + "width": 240, + "height": 320, + "type": "m" + }, + { + "width": 599, + "height": 800, + "type": "x" + }, + { + "width": 956, + "height": 1276, + "type": "y" + } + ] + } + }, + "date": 1579002967, + "senderUserId": 205688700, + "replyToMessageId": null + }, + "2718": { + "id": 2718, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "4476 2461 3295 0946" + } + }, + "date": 1579003132, + "senderUserId": 165916816, + "replyToMessageId": null + }, + "2719": { + "id": 2719, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "595" + } + }, + "date": 1579003152, + "senderUserId": 2317363, + "replyToMessageId": null + }, + "2720": { + "id": 2720, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ушло 750" + } + }, + "date": 1579003181, + "senderUserId": 56240484, + "replyToMessageId": null + }, + "2721": { + "id": 2721, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "480" + } + }, + "date": 1579003253, + "senderUserId": 88888263, + "replyToMessageId": null + }, + "2722": { + "id": 2722, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "658" + } + }, + "date": 1579003280, + "senderUserId": 290281303, + "replyToMessageId": null + }, + "2723": { + "id": 2723, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "350" + } + }, + "date": 1579003812, + "senderUserId": 802771524, + "replyToMessageId": null + }, + "2724": { + "id": 2724, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Ушла слюна" + } + }, + "date": 1579003917, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2725": { + "id": 2725, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "Хоть бы звали!" + } + }, + "date": 1579003922, + "senderUserId": 146686085, + "replyToMessageId": null + }, + "2726": { + "id": 2726, + "chatId": -1186709966, + "isOutgoing": false, + "content": { + "text": { + "text": "перестали принимать много карточек?" + } + }, + "date": 1579005939, + "senderUserId": 310552513, + "replyToMessageId": null + } + }, + "listedIds": [ + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2099, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726 + ] + } + } + }, + "scheduledMessages": {}, + "authRememberMe": true, + "authIsSessionRemembered": false, + "connectionState": "connectionStateReady", + "authState": "authorizationStateReady", + "authIsLoading": false, + "authPhoneNumber": "+7 915 094-23-95", + "isLoggingOut": false +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 000000000..9752f1411 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,12 @@ +module.exports = { + setupFilesAfterEnv: ['./tests/init.js'], + moduleNameMapper: { + '\\.(css|scss|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/tests/staticFileMock.js', + }, + testPathIgnorePatterns: [ + '/node_modules/', + '/legacy_notes_and_workbook/', + '/client/src/stylesheets/', + ], +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..2120ddbfe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20860 @@ +{ + "name": "telegram-t", + "version": "1.0.0-0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@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/compat-data": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", + "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "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.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": { + "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.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", + "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", + "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-module-imports": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.1", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==", + "dev": true + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "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/helper-create-regexp-features-plugin": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "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/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.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", + "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "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/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "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/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "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/helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "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.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", + "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", + "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", + "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", + "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", + "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-numeric-separator": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", + "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", + "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", + "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", + "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz", + "integrity": "sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", + "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", + "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", + "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", + "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", + "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", + "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", + "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", + "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.1", + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz", + "integrity": "sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz", + "integrity": "sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", + "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz", + "integrity": "sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", + "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", + "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz", + "integrity": "sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-typescript": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", + "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-dynamic-import": "^7.10.1", + "@babel/plugin-proposal-json-strings": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-private-methods": "^7.10.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.1", + "@babel/plugin-transform-arrow-functions": "^7.10.1", + "@babel/plugin-transform-async-to-generator": "^7.10.1", + "@babel/plugin-transform-block-scoped-functions": "^7.10.1", + "@babel/plugin-transform-block-scoping": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.1", + "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-destructuring": "^7.10.1", + "@babel/plugin-transform-dotall-regex": "^7.10.1", + "@babel/plugin-transform-duplicate-keys": "^7.10.1", + "@babel/plugin-transform-exponentiation-operator": "^7.10.1", + "@babel/plugin-transform-for-of": "^7.10.1", + "@babel/plugin-transform-function-name": "^7.10.1", + "@babel/plugin-transform-literals": "^7.10.1", + "@babel/plugin-transform-member-expression-literals": "^7.10.1", + "@babel/plugin-transform-modules-amd": "^7.10.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-umd": "^7.10.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.10.1", + "@babel/plugin-transform-object-super": "^7.10.1", + "@babel/plugin-transform-parameters": "^7.10.1", + "@babel/plugin-transform-property-literals": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-reserved-words": "^7.10.1", + "@babel/plugin-transform-shorthand-properties": "^7.10.1", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/plugin-transform-sticky-regex": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-typeof-symbol": "^7.10.1", + "@babel/plugin-transform-unicode-escapes": "^7.10.1", + "@babel/plugin-transform-unicode-regex": "^7.10.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.2", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.1.tgz", + "integrity": "sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-transform-react-display-name": "^7.10.1", + "@babel/plugin-transform-react-jsx": "^7.10.1", + "@babel/plugin-transform-react-jsx-development": "^7.10.1", + "@babel/plugin-transform-react-jsx-self": "^7.10.1", + "@babel/plugin-transform-react-jsx-source": "^7.10.1", + "@babel/plugin-transform-react-pure-annotations": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/preset-typescript": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.1.tgz", + "integrity": "sha512-m6GV3y1ShiqxnyQj10600ZVOFrSSAa8HQ3qIUk2r+gcGtHTIRw0dJnFLt1WNXpKjtVw7yw1DAPU/6ma2ZvgJuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-transform-typescript": "^7.10.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz", + "integrity": "sha512-+a2M/u7r15o3dV1NEizr9bRi+KUVnrs/qYxF0Z06DAPx/4VCWaz1WA7EcbE+uqGgt39lp5akWGmHsTseIkHkHg==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@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.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" + } + }, + "@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" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@cryptography/aes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", + "integrity": "sha512-PcYz4FDGblO6tM2kSC+VzhhK62vml6k6/YAkiWtyPvrgJVfnDRoHGDtKn5UiaRRUrvUTTocBpvc2rRgTCqxjsg==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + } + } + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@peculiar/asn1-schema": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.26.tgz", + "integrity": "sha512-IKkHojZkiLgtqMpahDm5UENMGN3UUOj51Pq6yAkZxLaNjDFc7H14g3oxgwHS7c7w6j76HbL8Agm4xnmSmJtbhg==", + "dev": true, + "requires": { + "@types/asn1js": "^2.0.0", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.15", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@peculiar/webcrypto": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.1.4.tgz", + "integrity": "sha512-gEVxfbseFDV0Za3AmjTrRB+wigEMOejHDzoo571e8/YWD33Ejmk0XPF3+G+VaN8+5C5IWZx4CPvxQZ7mF2dvNA==", + "dev": true, + "requires": { + "@peculiar/asn1-schema": "^2.0.26", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.1.1", + "tslib": "^2.0.3", + "webcrypto-core": "^1.1.8" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@testing-library/jest-dom": { + "version": "5.11.6", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.6.tgz", + "integrity": "sha512-cVZyUNRWwUKI0++yepYpYX7uhrP398I+tGz4zOlLVlUYnZS+Svuxv4fwLeCIy7TnBYKXUaOlQr3vopxL8ZfEnA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/asn1js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.0.tgz", + "integrity": "sha512-Jjzp5EqU0hNpADctc/UqhiFbY1y2MqIxBVa2S4dBlbnZHTLPMuggoL5q43X63LpsOIINRDirBjP56DUUKIUWIA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.16.tgz", + "integrity": "sha512-S63Dt4CZOkuTmpLGGWtT/mQdVORJOpx6SZWGVaP56dda/0Nx5nEe82K7/LAm8zYr6SfMq+1N2OreIOrHAx656w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/croppie": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@types/croppie/-/croppie-2.5.4.tgz", + "integrity": "sha512-RLvmobcCzJAn15AZpfphzbDxAwbtEcs97XTxx1CCHFCrJJoYB0tMoUGDEVJ6MBjYbVLY+1EZWOvzUcmetMPAMQ==", + "dev": true + }, + "@types/css-font-loading-module": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.2.tgz", + "integrity": "sha512-zZTq/B1ZcJMepOfBIMEwOZ/g/jpSPUJoxP8zPtPizOKE/Q89SujK1BLYZBg+4LLW3IzJGOI67dbeePy8uPUs+g==", + "dev": true + }, + "@types/dom-mediacapture-record": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.3.tgz", + "integrity": "sha512-mhm2/YFH+oS+aTqLVdoj1CI1BBQy2CiZmpASRa3WMXi4O69IKjOZ3jBvw6o51UTA1qNM6P+Bl4Mx3Q0JI9uVOA==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "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/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/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.15", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", + "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", + "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + }, + "@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/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/react": { + "version": "16.9.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.35.tgz", + "integrity": "sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-dom": { + "version": "16.9.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", + "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/resize-observer-browser": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.3.tgz", + "integrity": "sha512-3tGjLIDH8L57fWOfC7NVn/BbGQD7pXwbkk2+8Z4hK/S7kOIv1MUN4nkKjfx0qg4ctkukjzp3Bgr/Z+Hq5ZQZTQ==", + "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/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", + "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", + "dev": true + }, + "@types/testing-library__jest-dom": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz", + "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/uglify-js": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.2.tgz", + "integrity": "sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/webpack": { + "version": "4.41.17", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.17.tgz", + "integrity": "sha512-6FfeCidTSHozwKI67gIVQQ5Mp0g4X96c2IXxX75hYEQJwST/i6NyZexP//zzMOBb+wG9jJ7oO8fk9yObP2HWAw==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "@types/webpack-sources": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.0.tgz", + "integrity": "sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "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 + } + } + }, + "@types/yargs": { + "version": "15.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.10.tgz", + "integrity": "sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.1.tgz", + "integrity": "sha512-Z0rddsGqioKbvqfohg7BwkFC3PuNLsB+GE9QkFza7tiDzuHoy0y823Y+oGNDzxNZrYyLjqkZtCTl4vCqOmEN4g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.6.1", + "eslint-utils": "^1.4.2", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.1.tgz", + "integrity": "sha512-EVrrUhl5yBt7fC7c62lWmriq4MIc49zpN3JmrKqfiFXPXCM5ErfEcZYfKOhZXkW6MBjFcJ5kGZqu1b+lyyExUw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.6.1", + "eslint-scope": "^5.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.6.1.tgz", + "integrity": "sha512-PDPkUkZ4c7yA+FWqigjwf3ngPUgoLaGjMlFh6TRtbjhqxFBnkElDfckSjm98q9cMr4xRzZ15VrS/xKm6QHYf0w==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.6.1", + "@typescript-eslint/typescript-estree": "2.6.1", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.1.tgz", + "integrity": "sha512-+sTnssW6bcbDZKE8Ce7VV6LdzkQz2Bxk7jzk1J8H1rovoTxnm6iXvYIyncvNsaB/kBCOM63j/LNJfm27bNdUoA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "glob": "^7.1.4", + "is-glob": "^4.0.1", + "lodash.unescape": "4.0.1", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@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 + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "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 + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "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-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.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "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" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "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": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "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 + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "asn1js": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", + "integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==", + "dev": true, + "requires": { + "pvutils": "^1.0.17" + } + }, + "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 + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "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" + } + }, + "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-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "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 + }, + "async-mutex": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.1.4.tgz", + "integrity": "sha512-zVWTmAnxxHaeB2B1te84oecI8zTDJ/8G49aVBblRX6be0oq6pAybNcUSxwfgVOmOjSCvN4aYZAqwtyNI8e1YGw==" + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.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" + } + } + } + }, + "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.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "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-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "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-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big-integer": { + "version": "github:painor/BigInteger.js#4e2a4f1c1e4bd1d7c5d65e08aab51ac9ec939601", + "from": "github:painor/BigInteger.js" + }, + "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": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "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": { + "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" + }, + "dependencies": { + "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 + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "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": "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "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" + } + }, + "browserlist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserlist/-/browserlist-1.0.1.tgz", + "integrity": "sha512-nYq9jiWv+qXcgrJxQzivfEc7Wo2GvAKkeRViE5L3cUJpq4SZO6NZR710I/8T+OjE5BPECbzpm8rpUkwslE3nTg==", + "dev": true, + "requires": { + "chalk": "^2.4.1" + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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 + }, + "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 + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", + "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "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-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "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" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "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" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "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" + } + }, + "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" + } + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "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.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "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" + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "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 + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "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": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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 + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.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": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "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 + } + } + }, + "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" + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "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.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "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 + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "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.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "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 + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "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" + } + }, + "croppie": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.4.tgz", + "integrity": "sha512-dK2gP7nmAuzMP8TU+JNPOmZJkMyp5VPMJxE/uvmiOC7Vzwon333eo2i9T40D5rqm9NrBJU/ovAyg7xDX2Swaiw==" + }, + "cross-env": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", + "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.27", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" + } + } + } + }, + "css-modules-loader-core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", + "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.1", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0" + }, + "dependencies": { + "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": "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 + }, + "postcss": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", + "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "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" + } + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", + "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==", + "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" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "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" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.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 + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "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 + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "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-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "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" + } + }, + "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": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "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-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-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "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 + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "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" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.464.tgz", + "integrity": "sha512-Oo+0+CN9d2z6FToQW6Hwvi9ez09Y/usKwr0tsDsyg43a871zVJCi1nR0v03djLbRNcaCKjtrnVf2XJhTxEpPCg==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-data-ios": { + "version": "github:korenskoy/emoji-data-ios#10073b1244de618a3e587ae1d91b5e46ec01fd06", + "from": "github:korenskoy/emoji-data-ios#10073b1" + }, + "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 + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "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.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "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.1.0", + "string.prototype.trimright": "^2.1.0" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "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 + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", + "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.0.0", + "eslint-visitor-keys": "^1.2.0", + "espree": "^7.1.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", + "dev": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-airbnb": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz", + "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.0.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-airbnb-typescript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-6.0.0.tgz", + "integrity": "sha512-jPAcwgOv9NXDnZsz40GziLW+oFrKu4e+xSVNnTo1BhjV6be2M4ugGssX4nOQvHhJqm3ylkjSjGmM7SxBBvkiBw==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^2.3.0", + "eslint-config-airbnb": "^18.0.1", + "eslint-config-airbnb-base": "^14.0.0" + } + }, + "eslint-config-react-app": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.2.tgz", + "integrity": "sha512-VhlESAQM83uULJ9jsvcKxx2Ab0yrmjUt8kDz5DyhTQufqWE0ssAnejlWri5LXv25xoXfdqOyeDPdfJS9dXKagQ==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.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 + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-import-resolver-webpack": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.1.tgz", + "integrity": "sha512-O/sUAXk6GWrICiN8JUkkjdt9uZpqZHP+FVnTxtEILL6EZMaPSrnP4lGPSFwcKsv7O211maqq4Nz60+dh236hVg==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^2.6.9", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.2.0", + "lodash": "^4.17.15", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.13.1", + "semver": "^5.7.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" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.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" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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 + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.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" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + }, + "dependencies": { + "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 + } + } + }, + "eslint-plugin-no-async-without-await": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-async-without-await/-/eslint-plugin-no-async-without-await-1.2.0.tgz", + "integrity": "sha1-wuZNrqB8sjNV/GGKFviRo7dO2lA=", + "dev": true + }, + "eslint-plugin-no-null": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz", + "integrity": "sha1-EjaoEjkTkKGHetQAfCbnRTQclR8=", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", + "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.12.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", + "dev": true + }, + "eslint-plugin-teactn": { + "version": "github:korenskoy/eslint-plugin-teactn#8fbd2b9824659da88a4c28d291e423512fdffd7a", + "from": "github:korenskoy/eslint-plugin-teactn#8fbd2b9", + "dev": true, + "requires": { + "eslint-plugin-react": "^7.16.0", + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", + "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==", + "dev": true, + "requires": { + "acorn": "^7.2.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.2.0" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", + "dev": true + } + } + }, + "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 + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "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 + }, + "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 + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "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==" + }, + "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" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "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" + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "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": { + "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" + } + } + } + }, + "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 + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "dev": true, + "requires": { + "reusify": "^1.0.0" + } + }, + "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" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "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" + } + } + } + }, + "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": "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "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.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.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": "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 + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": 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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", + "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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 + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz", + "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "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.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "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-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": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "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" + } + }, + "fast-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", + "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2" + } + }, + "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" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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" + } + } + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "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": { + "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" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "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" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "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" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "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" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + } + } + }, + "html-webpack-plugin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", + "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "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 + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz", + "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "ci-info": "^2.0.0", + "cosmiconfig": "^5.2.1", + "execa": "^1.0.0", + "get-stdin": "^7.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "read-pkg": "^5.2.0", + "run-node": "^1.0.0", + "slash": "^3.0.0" + } + }, + "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" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "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-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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "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 + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "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.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.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.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "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": "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-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-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": 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.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "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 + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "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-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" + } + } + } + }, + "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-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "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" + }, + "dependencies": { + "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-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "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-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "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-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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "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-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "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=" + }, + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.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 + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "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 + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.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" + } + } + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "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-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-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "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" + } + }, + "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" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.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 + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "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" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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 + }, + "lint-staged": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.2.tgz", + "integrity": "sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "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" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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 + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "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" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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" + } + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "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 + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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": "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" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.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" + } + }, + "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 + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.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" + } + } + } + }, + "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": "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" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "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" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "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" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "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" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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 + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "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" + } + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "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.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.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 + } + } + }, + "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==" + }, + "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" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "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-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "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": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "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": "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" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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" + } + }, + "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-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" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "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 + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "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-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.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "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" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "opus-recorder": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/opus-recorder/-/opus-recorder-6.2.0.tgz", + "integrity": "sha512-890khMXgmkqarxvocdTc9iADKIxbhzX8DyBcjVcE5nyuOVfVAkvyIAI1jF8qUscdsgaRM+tVy20QM6LZy1Gp9A==" + }, + "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-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-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "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": "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" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "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 + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "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" + } + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "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": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "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" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "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" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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 + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portfinder": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "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" + } + } + } + }, + "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.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "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" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.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" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "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-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "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-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.5.0.tgz", + "integrity": "sha512-KiAihzcV0TxTTNA5OXreyIXctuHOfR50WIhqBpc8pe0Q5dcs/Uap9EVlifOI9am7zGGdGOJQ6B1MPYKo2UxgOg==", + "dev": true, + "requires": { + "css-modules-loader-core": "^1.1.0", + "generic-names": "^2.0.1", + "lodash.camelcase": "^4.3.0", + "postcss": "^7.0.1", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "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-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + } + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "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-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "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-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + } + } + }, + "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": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "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 + }, + "pvtsutils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.1.1.tgz", + "integrity": "sha512-Evbhe6L4Sxwu4SPLQ4LQZhgfWDQO3qa1lju9jM5cxsQp8vE10VipcSmo7hiJW48TmiHgVLgDtC2TL6/+ND+IVg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qr-creator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/qr-creator/-/qr-creator-1.0.0.tgz", + "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==" + }, + "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 + }, + "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" + } + }, + "raw-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz", + "integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-is": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", + "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==", + "dev": true + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.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" + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "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 + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "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 + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + } + } + }, + "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" + } + }, + "replace-in-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.2.0.tgz", + "integrity": "sha512-Im2AF9G/qgkYneOc9QwWwUS/efyyonTUBvzXS2VXuxPawE5yQIjT/e6x4CTijO0Quq48lfAujuo+S89RR2TP2Q==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "glob": "^7.1.6", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "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": "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "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 + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "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" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "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" + } + }, + "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 + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sass": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", + "integrity": "sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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 + }, + "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" + } + }, + "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-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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "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" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "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": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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" + } + }, + "service-worker-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/service-worker-loader/-/service-worker-loader-4.0.2.tgz", + "integrity": "sha512-NQKP4O2Iln2jilQ8PgTI5J5k3jABCHchCbTV+Wj+5gqQ8gsLlnBUYSPyRXFQOyFZWMlKJ9mHT6vvIyQa3le6sw==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.9.6", + "loader-utils": "^2.0.0", + "schema-utils": "^2.1.0" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "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-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 + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": 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 + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "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" + } + } + } + }, + "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.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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 + }, + "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.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "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 + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "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.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "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-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "dev": true + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "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" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "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" + }, + "dependencies": { + "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 + } + } + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "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" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "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 + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.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 + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "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" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "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" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "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-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": "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" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-node": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.9.1.tgz", + "integrity": "sha512-yrq6ODsxEFTLz0R3BX2myf0WBCSQh9A+py8PBo1dCzWIOcvisbyH6akNKqDHMgXePF2kir5mm5JXJTH3OUJYOQ==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "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-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "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==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "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.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "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" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "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" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "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 + }, + "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-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.0.tgz", + "integrity": "sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.26", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "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" + } + }, + "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 + }, + "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": "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" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "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" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "dev": true, + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "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, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + } + } + }, + "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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "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" + } + }, + "webcrypto-core": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.1.8.tgz", + "integrity": "sha512-hKnFXsqh0VloojNeTfrwFoRM4MnaWzH6vtXcaFcGjPEu+8HmBdQZnps3/2ikOFqS8bJN1RYr6mI2P/FJzyZnXg==", + "dev": true, + "requires": { + "@peculiar/asn1-schema": "^2.0.12", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.11", + "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.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.3", + "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.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "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" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "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" + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "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": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", + "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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 + }, + "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" + } + }, + "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" + } + }, + "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-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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "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.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "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.3.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.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "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-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" + } + }, + "websocket": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.30.tgz", + "integrity": "sha512-aO6klgaTdSMkhfl5VVJzD5fm+Srhh5jLYbS15+OiI1sN6h/RU/XW6WN9J1uVIpUKNmsTvT3Hs35XAFjn9NMfOw==", + "requires": { + "debug": "^2.2.0", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, + "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 + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "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-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "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" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "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 + }, + "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 + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..17ef00ce6 --- /dev/null +++ b/package.json @@ -0,0 +1,110 @@ +{ + "name": "telegram-t", + "version": "1.0.0-0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "cross-env APP_ENV=development webpack-dev-server -d", + "build": "webpack -p", + "build:staging": "rm -rf dist/ && APP_ENV=staging npm run build && ./deploy/copy_to_dist.sh", + "build:production": "rm -rf dist/ && APP_ENV=production npm run build -- --env.noSourceMap && ./deploy/copy_to_dist.sh", + "deploy:contest": "./deploy/contest.sh", + "perf:serve": "APP_ENV=perf parcel src/index-perf.html", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "eslint . --ext .ts,.tsx --fix", + "gramjs:tl": "node ./src/lib/gramjs/tl/generateModules.js", + "test": "APP_ENV=test jest --verbose --forceExit" + }, + "engines": { + "node": "^12.13", + "npm": "^6.12" + }, + "husky": { + "hooks": { + "pre-commit": "tsc && lint-staged -- --fix" + } + }, + "lint-staged": { + "*.{ts,tsx}": "eslint" + }, + "author": "Alexander Zinchuk (alexander@zinchuk.com)", + "license": "GPL-3.0-or-later", + "devDependencies": { + "@babel/core": "^7.10.2", + "@babel/plugin-proposal-class-properties": "^7.7.0", + "@babel/preset-env": "^7.10.2", + "@babel/preset-react": "^7.10.1", + "@babel/preset-typescript": "^7.10.1", + "@peculiar/webcrypto": "^1.1.4", + "@testing-library/jest-dom": "^5.11.6", + "@types/croppie": "^2.5.4", + "@types/css-font-loading-module": "0.0.2", + "@types/dom-mediacapture-record": "^1.0.3", + "@types/react": "^16.9.35", + "@types/react-dom": "^16.9.8", + "@types/resize-observer-browser": "^0.1.3", + "@typescript-eslint/eslint-plugin": "^2.6.1", + "@typescript-eslint/parser": "^2.6.1", + "autoprefixer": "^9.8.0", + "babel-eslint": "^10.0.3", + "babel-loader": "^8.1.0", + "browserlist": "^1.0.1", + "buffer": "^6.0.3", + "cross-env": "^7.0.2", + "css-loader": "^3.5.3", + "dotenv": "^8.2.0", + "eslint": "^7.2.0", + "eslint-config-airbnb-typescript": "^6.0.0", + "eslint-config-react-app": "^5.0.2", + "eslint-import-resolver-webpack": "^0.12.1", + "eslint-plugin-flowtype": "^3.13.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-no-async-without-await": "^1.2.0", + "eslint-plugin-no-null": "^1.0.2", + "eslint-plugin-react": "^7.16.0", + "eslint-plugin-react-hooks": "^1.7.0", + "eslint-plugin-teactn": "github:korenskoy/eslint-plugin-teactn#8fbd2b9", + "file-loader": "^6.0.0", + "html-webpack-plugin": "^4.3.0", + "husky": "^3.0.9", + "jest": "^26.6.3", + "lint-staged": "^9.4.2", + "mini-css-extract-plugin": "^0.9.0", + "node-sass": "^4.14.1", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "postcss-loader": "^3.0.0", + "postcss-modules": "^1.5.0", + "raw-loader": "^4.0.1", + "react": "^16.12.0", + "replace-in-file": "^6.2.0", + "sass": "^1.23.3", + "sass-loader": "^8.0.2", + "service-worker-loader": "^4.0.2", + "style-loader": "^1.2.1", + "terser": "^4.7.0", + "terser-webpack-plugin": "^3.0.3", + "ts-node": "^8.9.1", + "typescript": "^3.9.5", + "url-loader": "^4.1.0", + "webpack": "^4.43.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-cli": "^3.3.11", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2", + "worker-loader": "^2.0.0" + }, + "dependencies": { + "@cryptography/aes": "^0.1.1", + "@types/jest": "^26.0.15", + "async-mutex": "^0.1.4", + "big-integer": "painor/BigInteger.js", + "croppie": "^2.6.4", + "emoji-data-ios": "github:korenskoy/emoji-data-ios#10073b1", + "events": "^3.0.0", + "opus-recorder": "^6.2.0", + "pako": "^1.0.10", + "qr-creator": "^1.0.0", + "websocket": "^1.0.30" + } +} diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..67fa2c78a702bd89bc2356c0a2b611d8f6a28077 GIT binary patch literal 1753 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 + + + + + #2b5797 + + + diff --git a/public/chartDummyData/followers.json b/public/chartDummyData/followers.json new file mode 100644 index 000000000..22d3eb6bc --- /dev/null +++ b/public/chartDummyData/followers.json @@ -0,0 +1 @@ +{"title":"Followers","type":"line","labelType":"day","labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000],"datasets":[{"name":"Joined","color":"#4fae4e","values":[1060,1330,930,1060,940,1190,1320,1180,1050,1210,1370,1330,950,1270,1130,1300,1170,1530,1110,1380,1240,1390,1150,1230,1340,1160,1140,1380,1690,1460,1240,1610,1320,1360,1320,1460,1450,1330,1080,1720,1600,1250,1570,1530,1610,1860,1450,1560,1690,1560,1730,1600,2170,1540,1940,1430,1410,1840,1790,1850,1620,1520,2190,1870,1550,2080,1560,1720,2040,1810,1890,2000,1900,2270,2060,1890,1930,1590,2030,1890,1810,1620,1690,1310,1700,1530,1970,2080,1620,1510,1990,1720,1750,1870,1740,1620,1840,1980,1910,1790,2080,1820,1530,2140,2440,2130,2430,2180,2080,2190,2090,1910,2440,1940,2680,3310,2510,2200,3020,2550,2450,2800,2450,2780,3020,2680,2210,2550,3160,2870,2690,3140,2820,2850,2160,2540,3050,2720,2540,3000,2630,2660,2780,2350,2510,2980,2650,2770,2220,3000,2950,2450,2610,2270,2200,2200,2920,2600,2470,2180,2480,2400,2450,2970,2830,2740,2680,2750,2200,2720,2270,3100,3510,3400,2920]},{"name":"Left","color":"#F06E66","values":[1240,1520,1120,1250,1040,1370,1140,1650,1840,1320,1860,1490,1680,1920,1190,1410,1180,1510,1490,1950,1700,1060,1630,1410,1230,1340,1640,1620,1610,1780,1320,1430,1510,1410,1660,1610,1320,1420,1360,1330,1300,1370,1590,1380,1580,1250,1460,1740,2250,1820,1670,1590,1710,1630,1770,1410,2100,1640,1670,1560,1820,1580,1560,1680,1520,1660,1570,1790,1560,1850,1670,2050,1660,1690,2110,1900,2280,1680,1770,2250,1910,2190,2070,2160,1810,1890,2130,2470,2150,2320,2420,2510,2390,2340,2260,2250,2250,2560,2090,1620,2340,2410,2270,2470,2360,2520,2380,2690,2590,2600,3010,2970,2480,2680,2910,2960,3150,3290,2380,2860,3130,2680,2980,3030,2900,3570,3340,2970,2910,3130,3180,3370,3590,3380,3720,3670,3480,3470,3770,3400,3060,3080,3090,3380,3040,3080,3410,3620,3320,2890,3570,3260,3100,3450,3490,3070,2640,3360,3260,3030,3250,3690,2950,2910,3540,3140,3090,3350,2960,2930,2940,3280,3080,2750,3370]}]} diff --git a/public/chartDummyData/growth.json b/public/chartDummyData/growth.json new file mode 100644 index 000000000..58482e908 --- /dev/null +++ b/public/chartDummyData/growth.json @@ -0,0 +1 @@ +{"title":"Growth","type":"line","labelType":"day","labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000],"datasets":[{"name":"Followers","color":"#54A4E7","values":[22800,19600,25000,26400,24000,26000,28400,26600,23800,29200,31000,33200,30400,30800,31400,29600,35200,35600,39200,35200,33200,41000,42000,38800,43800,36200,40800,41400,40600,39600,39000,40200,43600,39000,46000,48800,45200,39600,44400,44200,43800,47200,44000,50400,43600,52400,44600,48400,52000,52800,49800,54400,62400,59000,57400,65000,62800,54400,56200,60000,61000,69200,60200,64200,61400,64800,69400,70400,66000,63800,66400,70800,67600,71800,79000,71000,63400,67800,68800,66200,70800,72000,68800,59400,61400,58400,64400,58800,60600,68800,66400,62600,61200,65000,56600,58000,60600,61200,58600,64800,65800,65000,54800,60800,63600,61600,66800,60000,69800,73800,65000,72600,65400,76600,69400,72400,76600,74400,69000,81000,75400,81200,82600,83600,73600,75600,84200,90200,87000,89000,93400,91400,96000,94400,93800,100600,95200,103000,99800,96200,98600,112000,101800,115400,105800,111800,119200,114600,115800,132800,121000,133000,134800,130400,138200,149800,146200,152800,154200,153000,165800,155400,156200,161400,183800,178200,193200,187400,187200,192800,179000,192200,183400,193000,194000,195400,189800,185600,190400,197600]}]} diff --git a/public/chartDummyData/interactions.json b/public/chartDummyData/interactions.json new file mode 100644 index 000000000..c82b6f7ec --- /dev/null +++ b/public/chartDummyData/interactions.json @@ -0,0 +1 @@ +{"title":"Interactions","type":"line","labelType":"day","hasSecondYAxis":true,"labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000],"datasets":[{"name":"Views","color":"#54A4E7","values":[272400,311800,339600,335800,335800,328800,317600,299600,337200,366400,350200,349800,354400,348400,324200,329000,356200,356200,329000,352400,343800,308400,261400,364400,333600,380000,353600,345400,320200,355000,354400,365000,349200,353000,339200,320200,335800,381400,357000,355200,354800,332800,320600,329400,365800,363400,365000,361600,345200,300800,344200,370800,360200,362600,349400,357800,294800,349000,372200,368200,365600,365600,357000,320200,329800,383600,383600,382200,363000,361200,329200,351000,381400,364200,394600,372200,363000,335400,361800,379600,389000,382000,389000,370400,326000,363200,406400,392200,368400,398200,367200,326200,335600,386800,386000,378600,378800,387400,341600,349000,404600,379800,388600,393600,385200,345400,371600,419600,399800,422000,410800,410200,381200,380400,442600,457800,453000,459200,457200,411000,428600,465800,451000,459800,484600,461200,427000,421800,481800,466600,402400,477800,466600,467200,457200,517000,493000,482600,504400,505600,478800,491400,518800,520800,508800,522800,531400,492400,508400,557800,564200,528000,555200,537600,480400,520600,551000,566000,531000,531200,519400,499000,495000,553800,578000,553200,554800,532400,501800,540600,567600,567600,563000,542400,566600,486800,538400,621200,580800,574200,597200,584000,522200,589600,622800,623800,627800,595200,576000,366000,592200,655600,660000,640000,639600,638400,590800,675600,746600,708400,710400,722400,708600,632200,764400,840200,810200,667000,766800,766000,740400,850800,858400,857400,851800,851800,821000,757600,851400,883000,883600,879800,852800,804800,730600,805800,864000,844800,834800,838800,809200,722800,843800,894000,820400,819000,810000,793400,737600,818000,866800,830600,845000,819200,760000,728400,793200,830000,837600,811400,823400,752800,696400,770600,844800,823000,793400,812000,769400,723200,755600,764600,811200,826200,866800,833000,755000,770600,649800,740400,836800,833600,859000,796000,834800,858400,809000,853000,801400,763600,713600,799200,819200,818000,781800,809200,736600,689800,802400,828600,794200,813000,788400,755200,689200,777800,811200,766000,809400,776800,759000,684800,807400,830800,802800,786000,751800,745000,666400,773200,795200,743600,739200,714000,727600,654000,717000,751600,739600,757600,730600,705200,674400,730800,767000,751600,776600,712000,688000,637800,686000,748600,750200,765400,742400,701000,636800,720400,779000,765200,851200,793000,731400,651200,734800,825400,790800,763400,724200,723600,625800,714600,803600,742600,738000,745800,706600,613600,712000,767400,750800,821200,813400,757800,683800]},{"name":"Shares","color":"#E8AF14","values":[12360,16240,14210,14040,15190,13570,14020,15600,16080,15800,16740,15680,16790,15520,17410,17660,17000,15080,17190,17020,16620,15200,13210,16970,16030,16090,16800,15280,15450,15990,17130,14970,16020,15780,15770,15720,16210,15820,16080,14860,14210,14980,16200,15430,15510,16750,16460,15130,15120,15580,18040,16380,15940,16590,15950,15480,14940,16520,16570,15910,15950,16280,17120,15720,16600,17580,16260,17270,15660,16500,16410,17140,16240,17330,16320,17490,17220,17030,19130,17440,17350,17010,19050,16150,16350,18280,17670,19690,17470,16320,16180,16290,15440,16600,17430,17800,18110,16870,17200,16700,18010,18110,17850,17600,17870,18100,17300,19960,18340,19650,19710,21300,18930,20090,20240,21150,21020,21940,22350,22160,20800,22390,21450,22970,20690,23410,21490,21690,20650,22440,21630,23420,22860,23490,24460,23610,23810,22840,23540,24800,23460,24140,25050,23910,23790,23190,23390,23160,23830,23680,25940,23420,23330,23630,23400,26230,22690,24700,22010,23050,22460,24620,24960,26180,24540,24240,24690,24140,25140,29410,25900,25880,24600,25380,25090,24930,28930,26570,25270,26560,25520,27150,25130,25600,28580,25800,25500,27870,26320,18930,30390,27640,27790,28380,29230,28160,28490,31290,31710,32150,29840,29860,30240,30750,33300,34750,33250,31920,36940,36930,33360,38500,33700,34630,36580,36130,34960,35210,37600,37100,34640,36840,36150,33850,32800,35440,37510,36770,35560,35460,36650,35370,36990,39810,39340,36350,35350,33160,34440,36720,35200,37240,36030,36330,34940,34840,39350,37370,34040,33510,35270,32940,33310,34730,35760,37300,35190,33420,32550,33450,34360,41660,42960,38970,37080,37150,36460,41330,34220,34980,34840,39150,38110,35380,38760,36080,33790,36150,35960,32570,33180,36000,36390,33950,35390,36680,36540,31270,34720,35030,37090,38120,32870,34800,35000,34370,35070,35430,36830,37380,35390,33170,37300,34710,36450,37500,37820,31590,34370,37430,36650,35300,35520,35830,35650,32070,38700,34460,34450,32720,34900,35680,33340,37500,35730,35270,37150,35010,35260,33690,40330,36410,35540,35600,35480,37740,35600,44060,34610,37160,37880,36800,37940,35140,36900,40490,37740,36330,37730,35330,35800,39580,37590,35770,36430,36720,36860,33580,36830,35830,36600,37840,39450,35390,35310]}]} diff --git a/public/chartDummyData/languages.json b/public/chartDummyData/languages.json new file mode 100644 index 000000000..42383ff4b --- /dev/null +++ b/public/chartDummyData/languages.json @@ -0,0 +1 @@ +{"title":"Languages","type":"area","labelType":"day","labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000],"isStacked":true,"isPercentage":true,"datasets":[{"name":"English","color":"#54A4E7","values":[34310,38260,47440,42460,43740,43770,41720,35440,39770,42420,45930,42840,42080,41300,33430,34690,44450,41780,33570,40180,38560,33220,27930,44050,35100,47290,46580,43240,34810,39960,45820,43680,44660,46050,43560,32970,42450,47550,50150,45430,44740,41950,30010,38770,45030,50130,42960,43090,39330,35630,41110,46810,48720,49340,45190,38450,31440,37730,42390,48980,49870,43060,44800,32470,38350,46770,49570,49110,50510,43630,37390,42040,49600,49120,44440,48430,47780,39650,37610,47430,49810,47090,47960,42390,31880,38090,43410,47620,48660,49410,48980,33870,39340,52190,48170,48830,49110,44620,29840,34750,52870,44890,48690,50820,41630,32840,33220,45130,48770,40130,42330,39850,30770,30490,42370,44410,42050,45240,37590,28220,28460,43830,35120,37970,38080,33960,31170,33140,35170,31390,23890,35030,29560,27300,29170,41540,38970,40210,40290,42360,33160,37040,45390,43470,45240,48290,45280,39430,37240,46040,53750,52340,56740,48730,32760,35940,57580,48800,44720,47330,40000,37190,44400,53920,48080,42060,45650,41430,34950,35300,50860,44030,46780,43890,38240,29930,36670,43530,46970,47220,45550,38840,34260,39740,41650,45770,47930,44510,42120,20810,35470,41790,45670,44380,42660,40320,32480,40190,47830,47030,47340,42530,42240,37300,38980,49190,45440,37440,34270,46220,33960,44960,45250,43860,44340,44010,41790,34410,43200,46130,48550,43810,45360,50150,35320,39170,48970,48150,47340,48960,39830,32340,37610,49160,45110,41230,44360,44180,33100,37630,47340,46860,47800,43470,39480,36760,38750,46680,42040,41890,43630,39920,30640,37680,42650,42410,39520,38680,33620,26190,31120,31710,24600,29640,35580,33250,29090,31260,20900,25900,39520,38410,38970,37370,32060,41190,42710,42410,44490,42680,33690,38400,42230,44920,41980,42120,40250,35550,37400,48750,44870,45750,44020,41510,30420,37770,48420,42870,47080,47870,41520,33120,39320,52990,44150,49360,42200,42290,29470,41270,47010,42710,44330,39960,40600,30710,33290,44720,43690,42740,40440,40440,32720,37030,42310,42630,38830,39250,36590,26960,29320,41210,40850,40130,40860,38760,29040,33270,44720,44170,43990,42110,40370,30110,30340,46630,42680,41700,41820,43800,31090,33950,46700,43480,44790,41260,40460,28270,32880,42010,43890,45990,42250,39450,28870]},{"name":"Malay","color":"#2373DB","values":[13730,13690,15220,13820,13080,13870,13300,11290,14240,15260,15150,14600,13690,14460,12750,13510,15220,15070,12730,15170,14140,12650,11480,13980,14500,15550,15590,15470,14040,14770,16590,14470,14840,14910,14490,13380,14410,14170,14800,15700,15180,14010,13020,14750,14950,14350,14710,15120,14070,12520,14680,15510,14200,15610,15180,14540,11940,15190,16180,15670,13830,14800,14560,12850,13800,14890,16190,15610,15230,14770,13940,15450,15530,16340,16000,16880,15530,13800,14410,15520,16630,14890,14660,15540,14100,15960,15950,16010,16150,15500,13800,14030,14520,16270,16110,15870,15270,15810,13670,15600,16290,15610,16060,16400,16340,13810,14920,16820,16950,17530,17490,17050,14650,15670,19000,18680,18240,18210,17680,16420,16190,16760,16580,18300,20560,18760,16440,17800,18270,21800,16760,18260,18150,18100,18210,20350,20730,22270,21910,19380,17800,20190,19540,19730,19530,19810,21450,17920,19850,21320,22400,22700,22810,20180,19140,21540,21730,21580,22800,23640,19150,22070,22740,20730,23820,21880,22700,22450,21120,21180,24150,20920,23890,21320,22110,20860,21190,22710,22170,23680,23590,23760,23170,22360,24520,23830,24690,26700,22220,14530,22920,26310,24840,24910,27490,24910,23330,28350,29540,29300,28910,30530,27710,26870,31170,34050,32040,28070,31970,32860,30500,35250,34900,35680,34820,36470,36600,31880,37310,38540,37510,36470,37070,33790,32550,34480,35660,34840,35070,34430,33800,29450,32910,37250,34730,33970,33660,32470,29670,32120,35610,33620,35090,32780,30180,26990,32680,35540,33250,33070,31350,31500,29800,29620,32630,32060,31030,31850,31040,29000,31410,30880,34180,31390,31410,33940,30190,29970,27620,28530,31660,35190,34050,33360,33250,32930,33570,32310,31930,32520,31000,34450,35120,33320,32760,32310,32110,30030,32290,32180,34510,34630,33840,32850,29680,32390,35360,32350,33910,32170,31140,25910,31100,33070,31630,32140,32980,31910,26510,28700,32450,30350,30620,28170,27090,24020,26210,30630,30010,29060,28280,27480,25640,27380,31170,30140,29880,27080,27190,26540,26100,28950,28390,29580,28430,27180,26900,27890,30370,29010,37710,31070,28200,24050,29250,30280,30940,30400,29590,27840,25070,28680,30740,28600,30670,30550,28430,26900,27170,29890,30590,33270,31990,30770,27010]},{"name":"Indonesian","color":"#9ED448","values":[10200,11610,11210,11800,11010,10980,12360,9040,11290,10530,10530,9160,8920,10140,8700,8320,9860,9330,7450,9840,8710,6850,6500,8840,7640,8690,7730,7990,8020,7160,9640,7810,9740,8010,10200,7060,6570,8240,8260,8390,9060,7860,8050,6180,8160,8020,9000,8300,7980,6450,6700,7870,7820,7330,8520,8010,6940,7800,8480,8430,7360,7010,7310,6680,5940,7100,6890,8810,6600,7580,5680,6710,8530,9210,6170,6940,7760,6120,5890,9590,6340,6450,8990,7720,7650,6330,8120,7200,7620,8010,5930,8830,7360,8020,6730,7360,7870,8170,6520,6500,6820,9860,7160,7960,7270,6420,5610,7340,7070,6480,7090,6960,6440,5830,7230,8080,6980,7660,9220,5980,4930,6880,6920,6910,7140,6030,5800,7240,8090,5640,5530,6520,6230,6210,6200,8850,8430,9310,8930,8140,7330,7770,7820,7380,8020,7310,6790,6980,6910,8800,7250,9200,8440,8230,6710,7710,8430,7780,7290,9210,8000,8170,7140,8060,7360,6840,7850,6650,6150,7120,8510,9020,9750,9200,9320,7500,6820,8560,9350,9020,8150,8610,6740,8500,8330,7170,8790,7090,6870,4910,7700,8490,9190,10100,7720,7850,8530,7970,9480,8170,9900,9190,8690,10060,10280,10930,9470,9840,11210,11240,7870,10100,11280,10970,11100,10590,10920,8850,9130,11280,10410,10530,10560,10150,11230,8580,9660,10010,10990,10560,7710,7710,9290,10680,9030,8690,9440,8860,7170,9130,10090,9080,9240,9090,8760,8070,8520,9110,9240,9110,9500,9080,7810,9090,10110,9700,10770,9580,8390,8100,7840,9530,9590,8820,9140,9580,9610,8950,7980,8180,9920,9730,9940,8990,9600,9830,9680,9840,8840,9030,9090,10470,9820,10730,9900,10470,11100,7790,10320,10060,11450,10110,10020,10170,10540,11910,11290,11040,9940,10240,9850,9610,9920,10440,10880,10290,9930,10560,10560,9590,11160,10660,10540,9800,9490,9350,9440,10260,11180,9980,9590,9240,8560,9170,9290,9370,9420,10210,9640,8780,11220,10440,9800,10500,10420,9840,8990,9410,10860,10710,13840,13700,10680,8830,11480,12140,11130,13350,11750,9780,9150,9820,11100,10890,11930,10630,10490,8880,11000,11480,12160,10660,11210,10410,9850]},{"name":"Arabic","color":"#5FB641","values":[2000,2540,3540,3380,3190,3530,3190,2160,2520,3770,3360,3300,3130,2810,1710,2210,3490,3370,2270,3070,2870,1750,1430,2340,2210,3470,3380,3470,2150,2210,3540,3450,3280,3360,2890,2130,2250,3940,3480,3380,3470,2920,1920,1950,3600,3440,3450,3540,2940,2070,2050,3430,3610,3290,3320,2770,1880,2280,3690,3360,3490,3060,3120,2080,2220,3390,3290,3580,3330,3160,2160,2140,3290,3010,3540,3280,3060,2350,2490,3260,3430,3160,3860,2730,1890,2300,3050,2940,3150,3380,2840,1870,1940,3020,3050,3310,2960,2760,1730,2330,3610,3390,2790,2930,2840,1750,1910,2990,3190,2620,2940,2190,1580,1490,2430,2490,2350,2270,2030,1240,1510,2550,2100,1900,2290,1770,1450,1560,1790,1670,1110,2060,1530,1600,1620,2470,2760,2390,2260,2200,1690,1590,2630,2580,2500,2780,2280,1810,1970,2880,2970,2830,3030,2910,2150,2150,3090,2950,2850,3120,2540,1830,2290,3110,3210,2950,2670,2940,1800,1820,3130,3180,3690,3030,2940,1780,2080,3120,3470,3220,3240,3140,2080,2510,3300,3260,3390,3490,2970,1780,2260,3610,3280,3540,3620,3020,2110,2360,3120,3420,3440,3430,3050,2630,2670,4080,3320,2980,2400,2920,2240,2010,3290,3880,3480,3180,3750,2200,3050,3160,3590,2890,3580,3510,1790,2610,3930,3540,3660,3280,2900,2100,2580,3660,4100,3340,3590,3050,2390,2360,3880,3870,3910,3230,2690,1990,2280,3710,3540,3350,3150,2870,2290,2280,3230,3520,2990,2590,2390,1890,2170,1950,1360,2060,2650,2430,1920,1820,1400,1540,2900,3080,3560,2360,2710,3960,3900,3660,4000,3550,2930,3770,4240,4490,4760,4160,3410,2350,3210,3420,3980,4010,4000,4150,2390,3060,3830,4060,3700,3510,3530,2380,2430,3640,4550,3700,3310,3870,2130,2480,3650,3820,4180,3500,3380,1970,2640,3970,3800,3830,3400,3110,1820,2370,3860,3650,3650,3620,3270,2100,2440,3520,3290,3470,3210,3210,2020,2360,3910,3700,3650,3200,3250,2220,2420,4010,3870,3620,3620,3010,2410,2530,3820,3630,3870,3510,3190,1880,2460,3500,3750,3880,4140,3320,2260]},{"name":"Chinese(Simplified)","color":"#F5BD25","values":[5480,5930,10490,9460,11790,9530,9690,5500,5810,8090,9510,8830,8350,8490,5130,5550,9110,9850,5800,8930,8280,4540,4350,6630,4490,9810,9130,8680,5040,5120,9100,9520,8670,10550,8860,5140,5050,9510,10390,10290,10130,9700,4150,5270,9790,9670,9120,10030,9790,5250,5530,9280,9610,9870,9580,9410,4700,6340,10490,10390,10850,9680,8600,4920,5050,10960,10680,10500,10070,8270,5410,5730,10780,10250,10470,9690,9640,5080,5630,10050,11060,8290,9540,8070,5380,5310,9710,9750,10760,9870,9080,5030,6720,9830,10500,9190,9550,9580,6040,6360,10720,9090,10170,9570,9750,4810,5280,9420,9310,8830,9050,8400,4480,3990,7880,8890,8320,8770,7420,5210,3960,7940,7750,8310,8070,6670,4590,4500,6150,5190,3850,5940,6310,4300,4370,9240,7760,7810,7700,7790,4380,4990,8640,9060,8870,9760,8780,6250,6250,10460,10520,10970,10430,9440,5390,5270,10630,10740,10160,10030,9180,4620,5290,9080,11090,9930,10520,9910,5120,5360,9810,9170,9120,10310,8460,4200,4390,9770,9800,10000,9530,9130,4830,4820,9390,8900,8820,9390,8480,3240,4990,9510,9060,8840,9480,8970,4800,5620,9750,10350,9890,9510,9170,5790,6960,10760,9780,8790,6010,8560,5550,5710,9910,9130,9630,10250,9720,4930,6080,9760,10140,8950,10930,9040,5390,6260,9570,10320,9450,10200,8570,5630,5230,10030,10220,9690,10240,9500,5680,5970,9350,9710,9090,9760,8630,4730,5930,9900,10220,9480,8960,7940,5080,4910,9060,8490,10270,9200,7350,4800,5420,4580,3820,4200,6850,7120,5040,4870,4070,3590,7720,7710,7330,5230,5980,8450,10610,9030,9480,8870,5010,5210,10050,9270,9770,9290,9480,5280,4770,9320,10050,9310,9650,8280,4880,5350,10050,9730,9880,10130,9120,5140,5840,9820,9870,9770,8920,9010,4810,5480,10440,9540,9450,9540,9390,5380,5460,10590,9370,10240,9790,9370,5140,5630,9530,9240,9440,9760,8500,4900,4850,9890,8650,9450,9820,8880,5050,5000,9100,9690,9630,9870,8570,4840,5130,9910,9760,9930,10210,9010,4990,5580,10040,10630,10260,10610,8240,5080,4530,10140,9920,9670,10590,10600,4970]},{"name":"Russian","color":"#F79E39","values":[4770,4760,4910,5490,5560,5270,4900,4520,5420,5750,5640,5290,5090,5670,4290,4160,4990,5170,4380,5370,5840,4710,3600,4560,4640,5000,4660,4800,3900,6400,4150,5100,5190,5950,4670,3940,4070,4490,4750,4760,4910,4730,3780,3760,4860,4730,4960,4330,5320,4700,4390,5570,5470,4330,4250,4070,3500,3790,5020,4630,5070,3930,4360,3470,3730,4130,4910,4670,4100,4240,3660,3360,4430,4090,3860,4180,4420,3540,4120,4180,4330,4000,4450,3460,3090,3600,3720,4190,3890,3900,4340,3150,3210,3940,4150,4310,4300,3600,3380,2970,3320,3520,3570,4010,3400,3210,3130,3670,3740,3790,2910,3230,2280,3030,2770,3310,3640,3050,3090,2810,2880,3470,3120,3270,3140,2460,2950,2690,3000,2950,2430,3210,3500,2230,2620,3030,3010,3150,3110,3170,3680,3020,3380,2600,3180,3240,3690,3150,3200,2860,3320,3290,3200,3240,2760,3100,3660,3180,4120,3110,4100,2950,2360,3590,3320,3410,3220,3200,2510,2800,3490,3050,2830,3100,3000,3030,2800,3670,2890,3320,2640,2660,2410,2720,3370,3230,3070,2920,3010,2240,2510,2970,2750,2560,2700,2630,2660,2700,2890,3030,2430,3300,3700,2830,3010,2990,2850,2850,3290,2400,2890,3000,2640,2900,2970,2980,2430,2450,2960,2990,2940,2950,2900,2670,2300,2610,2670,2760,2440,2960,2740,2290,2820,2330,2690,2420,2780,2110,2180,2040,2740,2960,3230,2880,2680,2180,2380,2560,2890,2540,2660,2450,2440,2450,2590,2930,2960,3030,2380,2220,2390,2520,2650,2490,2590,2450,2200,2340,2150,2520,2140,2100,2240,2150,2770,2740,2240,2080,2480,2090,2230,2180,2390,2390,2670,2920,1960,1910,2420,2180,2860,2800,2460,2700,2360,2320,2750,2520,2690,2580,2270,2370,2190,2440,2120,2360,2110,2170,2200,2370,2110,2280,2410,2640,2240,2380,2090,2620,2570,2510,2320,2390,1970,2190,2340,2340,2310,2290,2450,1960,2140,1930,2400,1980,2290,2160,1840,1700,2110,2540,2390,2150,1800,1990,2130,2040,1910,1740,2290,2030,1820,2090,2200,2340,2010,2200,2030,2340,1630,2010,1910,1980,1970,1640,1660]}]} diff --git a/public/chartDummyData/notifications.json b/public/chartDummyData/notifications.json new file mode 100644 index 000000000..616ab1dfe --- /dev/null +++ b/public/chartDummyData/notifications.json @@ -0,0 +1 @@ +{"title":"Notifications","type":"line","labelType":"day","labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000],"datasets":[{"name":"Muted","color":"#F06E66","values":[1060,990,1140,1090,1210,1160,1450,970,1400,1140,1230,1440,1660,1130,1390,1410,1110,1060,1100,1340,1140,1340,980,1390,1190,1350,1390,1230,1280,1250,1360,1470,1540,1170,1500,1330,1330,1190,1280,1370,1460,1160,1490,1300,1240,1370,1330,1360,1780,1470,1300,1390,1420,1450,1520,1270,1180,1270,1440,1470,1500,1440,1710,1460,1390,1510,1510,1730,1630,1440,1690,1480,1340,1550,1410,1470,1380,1550,1280,1550,1500,1350,1280,1270,1430,1330,1190,1380,1790,1610,1240,1520,1120,1250,1040,1370,1140,1650,1840,1320,1860,1490,1680,1920,1190,1410,1180,1510,1490,1950,1700,1060,1630,1410,1230,1340,1640,1620,1610,1780,1320,1430,1510,1410,1660,1610,1320,1420,1360,1330,1300,1370,1590,1380,1580,1250,1460,1740,2250,1820,1670,1590,1710,1630,1770,1410,2100,1640,1670,1560,1820,1580,1560,1680,1520,1660,1570,1790,1560,1850,1670,2050,1660,1690,2110,1900,2280,1680,1770,2250,1910,2190,2070,2160,1810]},{"name":"Unmuted","color":"#4fae4e","values":[930,890,900,980,1120,1250,1220,1030,960,1390,1300,1200,1030,880,1820,1680,1190,1320,1790,1610,1210,1170,1300,1080,1320,1200,970,760,1230,1250,1040,1020,1300,1290,970,900,1050,1040,980,1070,1410,1080,1000,1100,1070,1010,940,1160,1110,990,1070,830,940,1070,1160,1040,1020,1120,1210,3030,2530,1660,1170,1240,1180,1000,1170,720,1010,1300,1020,1180,1080,960,1050,880,950,970,1360,1020,1280,1140,1150,1100,1100,1260,1280,1540,1360,1250,1060,1330,930,1060,940,1190,1320,1180,1050,1210,1370,1330,950,1270,1130,1300,1170,1530,1110,1380,1240,1390,1150,1230,1340,1160,1140,1380,1690,1460,1240,1610,1320,1360,1320,1460,1450,1330,1080,1720,1600,1250,1570,1530,1610,1860,1450,1560,1690,1560,1730,1600,2170,1540,1940,1430,1410,1840,1790,1850,1620,1520,2190,1870,1550,2080,1560,1720,2040,1810,1890,2000,1900,2270,2060,1890,1930,1590,2030,1890,1810,1620,1690,1310,1700]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/04.json b/public/chartDummyData/notifications_zoom/2018-10/04.json new file mode 100644 index 000000000..3dff329c7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,10,0,20,20,50,90,80,140,140,150,120,170,110,60,150,210,200,220,200,200,80,20,0,10,0,0,0,30,100,50,60,120,60,100,200,90,90,180,150,160,220,210,110,170,20,20,10,0,10,0,0,10,80,60,30,90,130,120,120,80,150,230,180,120,200,290,130,80,130,70,10,0,0,0,20,0,120,70,100,110,170,200,160,180,100,150,180,150,170,190,120,110,80,30,30,0,0,10,0,40,60,60,30,130,160,130,240,210,170,180,130,170,200,230,220,50,40,20,0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/05.json b/public/chartDummyData/notifications_zoom/2018-10/05.json new file mode 100644 index 000000000..46338402a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30]},{"name":"Unmuted","color":"#4fae4e","values":[0,10,0,0,0,30,100,50,60,120,60,100,200,90,90,180,150,160,220,210,110,170,20,20,10,0,10,0,0,10,80,60,30,90,130,120,120,80,150,230,180,120,200,290,130,80,130,70,10,0,0,0,20,0,120,70,100,110,170,200,160,180,100,150,180,150,170,190,120,110,80,30,30,0,0,10,0,40,60,60,30,130,160,130,240,210,170,180,130,170,200,230,220,50,40,20,0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/06.json b/public/chartDummyData/notifications_zoom/2018-10/06.json new file mode 100644 index 000000000..a6c093905 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,10,0,0,10,80,60,30,90,130,120,120,80,150,230,180,120,200,290,130,80,130,70,10,0,0,0,20,0,120,70,100,110,170,200,160,180,100,150,180,150,170,190,120,110,80,30,30,0,0,10,0,40,60,60,30,130,160,130,240,210,170,180,130,170,200,230,220,50,40,20,0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/07.json b/public/chartDummyData/notifications_zoom/2018-10/07.json new file mode 100644 index 000000000..b21f71db7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,0,0,20,0,120,70,100,110,170,200,160,180,100,150,180,150,170,190,120,110,80,30,30,0,0,10,0,40,60,60,30,130,160,130,240,210,170,180,130,170,200,230,220,50,40,20,0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/08.json b/public/chartDummyData/notifications_zoom/2018-10/08.json new file mode 100644 index 000000000..925f9a24a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,0,10,0,40,60,60,30,130,160,130,240,210,170,180,130,170,200,230,220,50,40,20,0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/09.json b/public/chartDummyData/notifications_zoom/2018-10/09.json new file mode 100644 index 000000000..e41c73819 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110]},{"name":"Unmuted","color":"#4fae4e","values":[0,20,20,0,0,20,40,50,90,150,130,180,200,170,140,130,210,100,210,170,120,120,100,20,30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/10.json b/public/chartDummyData/notifications_zoom/2018-10/10.json new file mode 100644 index 000000000..8c02da863 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,20,10,10,20,10,50,70,70,120,130,190,100,110,150,200,190,210,130,170,140,150,40,0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/11.json b/public/chartDummyData/notifications_zoom/2018-10/11.json new file mode 100644 index 000000000..7c1814666 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20]},{"name":"Unmuted","color":"#4fae4e","values":[0,0,0,0,20,70,90,30,110,80,60,210,150,150,120,120,230,180,120,120,180,110,70,40,0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/12.json b/public/chartDummyData/notifications_zoom/2018-10/12.json new file mode 100644 index 000000000..58e656568 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30]},{"name":"Unmuted","color":"#4fae4e","values":[0,10,0,0,10,60,70,50,70,70,70,120,130,110,110,140,190,150,190,270,250,120,50,10,10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/13.json b/public/chartDummyData/notifications_zoom/2018-10/13.json new file mode 100644 index 000000000..8f44b1c74 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,0,0,0,90,60,100,60,30,50,120,100,200,130,200,140,290,190,150,190,80,30,30,30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/14.json b/public/chartDummyData/notifications_zoom/2018-10/14.json new file mode 100644 index 000000000..d9c24bd43 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20]},{"name":"Unmuted","color":"#4fae4e","values":[30,30,0,0,0,30,60,160,90,80,140,120,130,130,110,160,160,210,250,140,200,170,120,40,40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/15.json b/public/chartDummyData/notifications_zoom/2018-10/15.json new file mode 100644 index 000000000..71b8e7f52 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110]},{"name":"Unmuted","color":"#4fae4e","values":[40,0,10,0,0,50,70,50,100,90,100,120,130,190,130,170,80,170,140,150,60,120,80,40,20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/16.json b/public/chartDummyData/notifications_zoom/2018-10/16.json new file mode 100644 index 000000000..ab9993703 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,20,10,10,40,0,60,140,90,210,150,150,130,100,130,80,150,0,0,0,0,30,90,20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/17.json b/public/chartDummyData/notifications_zoom/2018-10/17.json new file mode 100644 index 000000000..2657cda9e --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30]},{"name":"Unmuted","color":"#4fae4e","values":[20,20,0,0,20,10,50,50,90,180,150,130,170,70,110,110,240,130,170,150,160,120,120,70,10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/18.json b/public/chartDummyData/notifications_zoom/2018-10/18.json new file mode 100644 index 000000000..608044c67 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,10,0,0,90,100,80,70,70,80,110,100,130,130,170,180,230,120,270,210,170,50,30,10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/19.json b/public/chartDummyData/notifications_zoom/2018-10/19.json new file mode 100644 index 000000000..d6df8f57a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,0,0,0,70,120,80,60,60,80,130,110,60,90,30,240,230,260,220,250,140,20,10,40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/20.json b/public/chartDummyData/notifications_zoom/2018-10/20.json new file mode 100644 index 000000000..c47a91ad6 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120]},{"name":"Unmuted","color":"#4fae4e","values":[40,40,10,10,20,40,40,40,80,150,110,140,120,110,190,150,160,180,140,280,170,100,100,50,20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/21.json b/public/chartDummyData/notifications_zoom/2018-10/21.json new file mode 100644 index 000000000..958d69b9f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30]},{"name":"Unmuted","color":"#4fae4e","values":[20,0,0,0,0,70,70,150,60,100,120,110,170,70,120,120,230,250,190,170,130,100,80,30,10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/22.json b/public/chartDummyData/notifications_zoom/2018-10/22.json new file mode 100644 index 000000000..66722e0cd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70]},{"name":"Unmuted","color":"#4fae4e","values":[10,10,0,0,20,30,70,110,120,140,100,100,100,160,110,160,270,220,200,190,180,90,90,40,40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/23.json b/public/chartDummyData/notifications_zoom/2018-10/23.json new file mode 100644 index 000000000..6f9e2094b --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,30,0,0,0,30,90,70,190,160,100,140,210,110,180,130,100,190,160,180,120,70,50,30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/24.json b/public/chartDummyData/notifications_zoom/2018-10/24.json new file mode 100644 index 000000000..02b25fb01 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,30,10,30,10,20,60,120,230,130,170,200,180,140,190,110,330,160,140,230,100,40,10,0,10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/25.json b/public/chartDummyData/notifications_zoom/2018-10/25.json new file mode 100644 index 000000000..f4f764c84 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180]},{"name":"Unmuted","color":"#4fae4e","values":[10,0,0,20,30,130,90,80,120,120,70,70,80,70,250,190,220,230,280,290,130,90,20,0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/26.json b/public/chartDummyData/notifications_zoom/2018-10/26.json new file mode 100644 index 000000000..b765f7b12 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60]},{"name":"Unmuted","color":"#4fae4e","values":[0,0,0,0,0,50,60,130,100,90,120,170,220,130,270,150,180,190,180,190,170,130,60,10,20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/27.json b/public/chartDummyData/notifications_zoom/2018-10/27.json new file mode 100644 index 000000000..89130062f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80]},{"name":"Unmuted","color":"#4fae4e","values":[20,0,0,0,20,40,110,100,100,130,160,140,160,270,120,110,290,200,170,150,290,300,110,20,10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/28.json b/public/chartDummyData/notifications_zoom/2018-10/28.json new file mode 100644 index 000000000..35d0da75e --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140]},{"name":"Unmuted","color":"#4fae4e","values":[10,10,0,0,0,50,60,130,130,150,100,230,160,180,200,180,200,210,250,170,180,190,110,70,0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/29.json b/public/chartDummyData/notifications_zoom/2018-10/29.json new file mode 100644 index 000000000..17e844c14 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190]},{"name":"Unmuted","color":"#4fae4e","values":[0,20,0,0,0,50,70,100,110,80,110,190,120,190,130,140,180,240,180,170,160,110,70,60,50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/30.json b/public/chartDummyData/notifications_zoom/2018-10/30.json new file mode 100644 index 000000000..f8adf8671 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110]},{"name":"Unmuted","color":"#4fae4e","values":[50,10,10,10,0,40,10,50,130,120,200,260,280,220,140,140,140,160,190,140,150,60,110,60,20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-10/31.json b/public/chartDummyData/notifications_zoom/2018-10/31.json new file mode 100644 index 000000000..5ffb67bc7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-10/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,10,10,10,10,30,40,140,140,130,300,180,160,220,100,250,150,180,220,220,160,150,70,0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/01.json b/public/chartDummyData/notifications_zoom/2018-11/01.json new file mode 100644 index 000000000..7922487cb --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120]},{"name":"Unmuted","color":"#4fae4e","values":[0,0,0,0,0,20,50,50,130,100,70,130,100,220,130,200,190,220,280,260,270,200,250,90,40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/02.json b/public/chartDummyData/notifications_zoom/2018-11/02.json new file mode 100644 index 000000000..94504e9c9 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,0,0,0,10,50,100,120,170,130,110,150,260,110,160,240,150,280,290,290,200,180,90,130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/03.json b/public/chartDummyData/notifications_zoom/2018-11/03.json new file mode 100644 index 000000000..90c1db679 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230]},{"name":"Unmuted","color":"#4fae4e","values":[130,60,60,0,10,10,90,120,180,110,180,280,160,140,140,150,230,160,270,160,220,150,170,110,40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/04.json b/public/chartDummyData/notifications_zoom/2018-11/04.json new file mode 100644 index 000000000..9e680ffe6 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110]},{"name":"Unmuted","color":"#4fae4e","values":[40,50,10,20,0,0,30,30,130,140,120,160,180,130,170,130,110,140,140,30,270,210,90,50,20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/05.json b/public/chartDummyData/notifications_zoom/2018-11/05.json new file mode 100644 index 000000000..c318b5272 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130]},{"name":"Unmuted","color":"#4fae4e","values":[20,50,0,10,0,10,40,70,110,140,220,190,260,210,170,160,170,190,180,170,190,160,70,70,20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/06.json b/public/chartDummyData/notifications_zoom/2018-11/06.json new file mode 100644 index 000000000..bcc18f467 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90]},{"name":"Unmuted","color":"#4fae4e","values":[20,40,10,0,10,10,20,40,80,120,210,170,200,270,180,230,240,320,300,130,160,170,100,100,20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/07.json b/public/chartDummyData/notifications_zoom/2018-11/07.json new file mode 100644 index 000000000..e1601a641 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160]},{"name":"Unmuted","color":"#4fae4e","values":[20,70,10,20,0,0,40,0,50,80,140,130,190,100,240,170,240,190,140,230,240,190,90,100,30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/08.json b/public/chartDummyData/notifications_zoom/2018-11/08.json new file mode 100644 index 000000000..0edacd7fe --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,0,0,0,20,90,110,30,80,60,90,250,180,170,170,170,240,240,260,250,210,270,40,70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/09.json b/public/chartDummyData/notifications_zoom/2018-11/09.json new file mode 100644 index 000000000..dd684acd0 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120]},{"name":"Unmuted","color":"#4fae4e","values":[70,40,20,10,20,0,50,110,50,150,60,220,190,170,110,230,190,150,250,340,210,260,100,30,40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/10.json b/public/chartDummyData/notifications_zoom/2018-11/10.json new file mode 100644 index 000000000..fa0ccd67d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,10,10,0,0,80,90,130,100,50,70,180,230,150,220,200,240,150,250,200,180,200,100,40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/11.json b/public/chartDummyData/notifications_zoom/2018-11/11.json new file mode 100644 index 000000000..7583e6ec1 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,30,0,20,10,100,160,80,160,90,140,140,250,110,190,270,210,320,200,310,360,270,80,10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/12.json b/public/chartDummyData/notifications_zoom/2018-11/12.json new file mode 100644 index 000000000..3cf7d4ee4 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70]},{"name":"Unmuted","color":"#4fae4e","values":[10,60,0,0,10,0,20,140,100,150,220,200,190,110,300,130,190,220,230,260,200,280,240,80,50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/13.json b/public/chartDummyData/notifications_zoom/2018-11/13.json new file mode 100644 index 000000000..c89e25de7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210]},{"name":"Unmuted","color":"#4fae4e","values":[50,20,20,0,10,0,20,50,150,160,170,160,180,220,210,150,160,150,260,180,190,180,160,120,80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/14.json b/public/chartDummyData/notifications_zoom/2018-11/14.json new file mode 100644 index 000000000..66165236f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70]},{"name":"Unmuted","color":"#4fae4e","values":[80,30,30,10,0,0,10,30,60,130,190,160,150,160,230,120,240,150,210,220,200,190,160,150,50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/15.json b/public/chartDummyData/notifications_zoom/2018-11/15.json new file mode 100644 index 000000000..ee639b58f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90]},{"name":"Unmuted","color":"#4fae4e","values":[50,30,0,0,0,0,0,200,70,180,110,220,150,190,190,200,170,270,220,200,170,250,130,130,100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/16.json b/public/chartDummyData/notifications_zoom/2018-11/16.json new file mode 100644 index 000000000..e1c5c08c1 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60]},{"name":"Unmuted","color":"#4fae4e","values":[100,10,0,0,0,10,40,150,130,150,100,150,160,160,170,190,180,220,210,340,240,220,150,100,40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/17.json b/public/chartDummyData/notifications_zoom/2018-11/17.json new file mode 100644 index 000000000..b769d41ab --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,20,30,0,0,50,70,150,60,140,250,240,170,210,250,210,240,220,200,210,320,170,100,30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/18.json b/public/chartDummyData/notifications_zoom/2018-11/18.json new file mode 100644 index 000000000..fb9cba468 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140]},{"name":"Unmuted","color":"#4fae4e","values":[30,10,0,0,0,30,110,150,70,190,100,160,160,180,180,220,240,160,310,360,300,290,190,150,20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/19.json b/public/chartDummyData/notifications_zoom/2018-11/19.json new file mode 100644 index 000000000..0fe453205 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140]},{"name":"Unmuted","color":"#4fae4e","values":[20,20,30,0,10,10,30,70,100,190,90,300,210,130,220,300,250,220,300,340,200,170,100,70,70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/20.json b/public/chartDummyData/notifications_zoom/2018-11/20.json new file mode 100644 index 000000000..7b7c8a39f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90]},{"name":"Unmuted","color":"#4fae4e","values":[70,10,10,10,0,30,40,80,90,170,180,330,290,260,240,290,190,170,270,210,240,220,280,40,110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/21.json b/public/chartDummyData/notifications_zoom/2018-11/21.json new file mode 100644 index 000000000..0c37909a8 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110]},{"name":"Unmuted","color":"#4fae4e","values":[110,30,30,10,0,0,90,60,130,130,270,260,210,160,290,130,290,280,230,210,200,280,170,100,20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/22.json b/public/chartDummyData/notifications_zoom/2018-11/22.json new file mode 100644 index 000000000..1ec9903dd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,0,0,20,10,60,50,110,150,150,200,220,160,180,260,250,230,180,240,390,300,190,100,70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/23.json b/public/chartDummyData/notifications_zoom/2018-11/23.json new file mode 100644 index 000000000..6d0a68718 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100]},{"name":"Unmuted","color":"#4fae4e","values":[70,30,0,10,10,0,30,100,80,100,110,120,150,240,240,300,210,300,250,270,320,320,170,40,50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/24.json b/public/chartDummyData/notifications_zoom/2018-11/24.json new file mode 100644 index 000000000..6ea1c488c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70]},{"name":"Unmuted","color":"#4fae4e","values":[50,20,0,0,10,10,80,150,160,150,80,250,220,220,180,230,220,240,310,260,250,350,180,150,80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/25.json b/public/chartDummyData/notifications_zoom/2018-11/25.json new file mode 100644 index 000000000..318fbf3ab --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80]},{"name":"Unmuted","color":"#4fae4e","values":[80,10,0,10,10,10,70,90,100,140,280,230,180,120,160,210,220,220,180,240,280,240,230,90,40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/26.json b/public/chartDummyData/notifications_zoom/2018-11/26.json new file mode 100644 index 000000000..1c33f7d9a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140]},{"name":"Unmuted","color":"#4fae4e","values":[40,40,20,0,0,10,30,70,120,190,130,160,120,110,220,150,320,190,180,250,250,180,180,100,50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/27.json b/public/chartDummyData/notifications_zoom/2018-11/27.json new file mode 100644 index 000000000..da80293a9 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150]},{"name":"Unmuted","color":"#4fae4e","values":[50,20,40,30,10,10,40,90,90,120,180,210,280,170,210,150,150,170,220,250,190,100,160,140,90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/28.json b/public/chartDummyData/notifications_zoom/2018-11/28.json new file mode 100644 index 000000000..79a5aff9c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60]},{"name":"Unmuted","color":"#4fae4e","values":[90,20,30,30,0,20,30,30,80,100,140,150,120,250,240,260,140,190,260,170,180,350,110,100,50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/29.json b/public/chartDummyData/notifications_zoom/2018-11/29.json new file mode 100644 index 000000000..eb7bbd4c4 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100]},{"name":"Unmuted","color":"#4fae4e","values":[50,50,10,40,10,10,40,160,40,70,130,240,200,130,170,170,200,150,230,290,340,230,270,150,10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-11/30.json b/public/chartDummyData/notifications_zoom/2018-11/30.json new file mode 100644 index 000000000..29b905780 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-11/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60]},{"name":"Unmuted","color":"#4fae4e","values":[10,50,10,0,0,70,50,50,110,80,120,140,140,140,170,210,160,220,220,230,270,290,160,140,30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/01.json b/public/chartDummyData/notifications_zoom/2018-12/01.json new file mode 100644 index 000000000..fa97bd17f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190]},{"name":"Unmuted","color":"#4fae4e","values":[30,30,20,10,0,0,20,110,60,70,190,150,210,210,180,140,130,220,170,260,160,240,260,210,20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/02.json b/public/chartDummyData/notifications_zoom/2018-12/02.json new file mode 100644 index 000000000..43c72fa88 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170]},{"name":"Unmuted","color":"#4fae4e","values":[20,30,0,0,10,20,80,30,150,90,150,130,220,150,240,340,190,150,210,170,340,340,190,160,60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/03.json b/public/chartDummyData/notifications_zoom/2018-12/03.json new file mode 100644 index 000000000..6ddcb43f6 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110]},{"name":"Unmuted","color":"#4fae4e","values":[60,30,0,20,0,0,50,110,80,220,130,200,200,270,270,260,210,180,210,300,200,340,150,130,130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/04.json b/public/chartDummyData/notifications_zoom/2018-12/04.json new file mode 100644 index 000000000..cb184b1d1 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90]},{"name":"Unmuted","color":"#4fae4e","values":[130,40,0,0,0,10,30,90,140,200,160,240,140,270,230,190,110,150,200,290,150,190,170,190,10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/05.json b/public/chartDummyData/notifications_zoom/2018-12/05.json new file mode 100644 index 000000000..dd6ad6415 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100]},{"name":"Unmuted","color":"#4fae4e","values":[10,100,40,10,0,0,20,20,80,130,160,200,120,200,190,250,160,210,150,200,240,170,100,130,50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/06.json b/public/chartDummyData/notifications_zoom/2018-12/06.json new file mode 100644 index 000000000..11f5d3a01 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130]},{"name":"Unmuted","color":"#4fae4e","values":[50,10,0,0,10,10,60,90,140,80,240,170,190,230,290,140,190,180,440,130,300,310,200,110,100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/07.json b/public/chartDummyData/notifications_zoom/2018-12/07.json new file mode 100644 index 000000000..c7c18cafd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200]},{"name":"Unmuted","color":"#4fae4e","values":[100,30,0,0,0,10,50,150,120,100,140,130,140,170,170,250,180,200,220,310,230,190,300,70,20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/08.json b/public/chartDummyData/notifications_zoom/2018-12/08.json new file mode 100644 index 000000000..f0f2d6d7d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,0,0,0,10,40,110,80,110,90,100,190,280,270,160,170,210,250,270,130,310,230,60,40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/09.json b/public/chartDummyData/notifications_zoom/2018-12/09.json new file mode 100644 index 000000000..9d8dee2cd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50]},{"name":"Unmuted","color":"#4fae4e","values":[40,10,0,20,0,0,20,120,130,130,100,190,180,210,190,160,170,250,180,250,290,350,290,170,70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/10.json b/public/chartDummyData/notifications_zoom/2018-12/10.json new file mode 100644 index 000000000..0d9150f64 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130]},{"name":"Unmuted","color":"#4fae4e","values":[70,0,0,0,0,0,80,210,140,110,150,220,280,220,190,130,220,250,270,270,270,90,220,100,80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/11.json b/public/chartDummyData/notifications_zoom/2018-12/11.json new file mode 100644 index 000000000..9f72707e5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50]},{"name":"Unmuted","color":"#4fae4e","values":[80,0,10,0,0,10,30,20,70,210,110,200,130,250,300,190,170,260,200,240,160,200,170,60,50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/12.json b/public/chartDummyData/notifications_zoom/2018-12/12.json new file mode 100644 index 000000000..bed677363 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70]},{"name":"Unmuted","color":"#4fae4e","values":[50,40,0,30,10,0,0,20,20,120,190,200,150,190,200,170,250,150,160,160,160,180,90,100,20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/13.json b/public/chartDummyData/notifications_zoom/2018-12/13.json new file mode 100644 index 000000000..8cc24071f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130]},{"name":"Unmuted","color":"#4fae4e","values":[20,40,30,0,0,20,30,90,130,140,160,180,210,310,150,160,220,190,300,210,250,260,170,90,70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/14.json b/public/chartDummyData/notifications_zoom/2018-12/14.json new file mode 100644 index 000000000..fcc7f7de5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70]},{"name":"Unmuted","color":"#4fae4e","values":[70,10,20,0,10,10,30,80,150,130,160,120,160,170,190,280,200,260,260,180,340,230,110,90,100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/15.json b/public/chartDummyData/notifications_zoom/2018-12/15.json new file mode 100644 index 000000000..a9763ed47 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310]},{"name":"Unmuted","color":"#4fae4e","values":[100,40,40,0,10,50,60,80,130,80,90,80,160,130,180,140,220,200,240,140,260,280,200,120,10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/16.json b/public/chartDummyData/notifications_zoom/2018-12/16.json new file mode 100644 index 000000000..f6b977995 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120]},{"name":"Unmuted","color":"#4fae4e","values":[10,20,0,0,10,10,0,160,100,150,120,100,170,210,160,260,150,240,210,300,260,280,230,100,70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/17.json b/public/chartDummyData/notifications_zoom/2018-12/17.json new file mode 100644 index 000000000..fccc0a42c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130]},{"name":"Unmuted","color":"#4fae4e","values":[70,70,0,10,0,30,0,120,150,130,110,240,210,310,180,180,310,120,210,310,300,250,290,90,120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/18.json b/public/chartDummyData/notifications_zoom/2018-12/18.json new file mode 100644 index 000000000..bd943e09d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130]},{"name":"Unmuted","color":"#4fae4e","values":[120,40,40,0,0,10,10,30,100,180,40,240,170,240,180,180,200,190,220,220,100,230,130,80,60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/19.json b/public/chartDummyData/notifications_zoom/2018-12/19.json new file mode 100644 index 000000000..199f9239f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100]},{"name":"Unmuted","color":"#4fae4e","values":[60,80,50,20,20,0,20,60,50,170,230,130,140,210,170,170,220,100,230,270,120,160,130,100,30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/20.json b/public/chartDummyData/notifications_zoom/2018-12/20.json new file mode 100644 index 000000000..3bc3559c5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,10,20,20,10,30,150,130,80,170,170,170,130,210,250,190,310,280,250,380,240,180,130,90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/21.json b/public/chartDummyData/notifications_zoom/2018-12/21.json new file mode 100644 index 000000000..9c34f2159 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220]},{"name":"Unmuted","color":"#4fae4e","values":[90,10,0,0,0,10,120,110,150,110,110,120,150,150,220,200,230,150,310,150,300,190,210,50,80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/22.json b/public/chartDummyData/notifications_zoom/2018-12/22.json new file mode 100644 index 000000000..45ae41d2b --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140]},{"name":"Unmuted","color":"#4fae4e","values":[80,40,10,0,0,40,50,60,90,150,150,170,180,190,220,200,190,220,100,250,320,150,130,100,40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/23.json b/public/chartDummyData/notifications_zoom/2018-12/23.json new file mode 100644 index 000000000..a0cfc7bf6 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,0,0,0,30,90,90,140,100,140,170,140,180,250,240,200,240,300,200,210,170,120,280,30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/24.json b/public/chartDummyData/notifications_zoom/2018-12/24.json new file mode 100644 index 000000000..a6e12f5c1 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,10,10,0,0,0,80,120,130,140,150,160,190,210,210,170,240,190,240,180,180,170,150,40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/25.json b/public/chartDummyData/notifications_zoom/2018-12/25.json new file mode 100644 index 000000000..d889b3470 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,0,10,10,0,20,40,90,200,180,240,220,190,150,140,110,170,230,100,200,120,260,180,100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/26.json b/public/chartDummyData/notifications_zoom/2018-12/26.json new file mode 100644 index 000000000..aa45d6151 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100]},{"name":"Unmuted","color":"#4fae4e","values":[100,50,50,0,0,0,40,40,110,170,80,300,160,210,170,140,160,210,100,170,170,150,220,140,90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/27.json b/public/chartDummyData/notifications_zoom/2018-12/27.json new file mode 100644 index 000000000..2491f14da --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90]},{"name":"Unmuted","color":"#4fae4e","values":[90,20,10,0,20,10,40,80,60,90,250,280,160,230,160,190,210,190,160,140,150,200,270,270,120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/28.json b/public/chartDummyData/notifications_zoom/2018-12/28.json new file mode 100644 index 000000000..45cc3311f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370]},{"name":"Unmuted","color":"#4fae4e","values":[120,50,10,10,0,10,50,50,80,140,200,220,250,220,200,200,150,170,180,170,170,200,90,140,80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/29.json b/public/chartDummyData/notifications_zoom/2018-12/29.json new file mode 100644 index 000000000..ea6eb8a1d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220]},{"name":"Unmuted","color":"#4fae4e","values":[80,30,40,0,0,0,90,50,70,90,140,170,200,120,250,120,90,190,30,190,260,220,110,210,90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/30.json b/public/chartDummyData/notifications_zoom/2018-12/30.json new file mode 100644 index 000000000..4350525b4 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240]},{"name":"Unmuted","color":"#4fae4e","values":[90,30,20,0,0,0,10,40,120,150,190,290,240,170,230,350,160,120,320,170,180,130,190,170,50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2018-12/31.json b/public/chartDummyData/notifications_zoom/2018-12/31.json new file mode 100644 index 000000000..ad998e7f5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2018-12/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200]},{"name":"Unmuted","color":"#4fae4e","values":[50,110,30,10,0,10,10,90,120,430,250,240,230,190,400,110,190,310,270,100,150,180,140,120,60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/01.json b/public/chartDummyData/notifications_zoom/2019-01/01.json new file mode 100644 index 000000000..2958151e0 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270]},{"name":"Unmuted","color":"#4fae4e","values":[60,30,10,50,0,10,60,60,90,100,150,280,30,160,140,270,150,170,120,40,150,210,40,170,130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/02.json b/public/chartDummyData/notifications_zoom/2019-01/02.json new file mode 100644 index 000000000..cff5955a7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260]},{"name":"Unmuted","color":"#4fae4e","values":[130,0,80,70,0,0,10,60,100,30,80,190,150,100,140,110,190,100,60,200,210,170,100,60,110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/03.json b/public/chartDummyData/notifications_zoom/2019-01/03.json new file mode 100644 index 000000000..1af12cd67 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140]},{"name":"Unmuted","color":"#4fae4e","values":[110,40,10,40,0,10,30,70,60,110,150,130,180,220,210,140,170,190,180,130,120,160,320,510,180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/04.json b/public/chartDummyData/notifications_zoom/2019-01/04.json new file mode 100644 index 000000000..5ea5de424 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160]},{"name":"Unmuted","color":"#4fae4e","values":[180,140,80,30,20,20,20,40,20,40,60,110,170,100,120,120,190,120,150,200,360,190,150,170,150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/05.json b/public/chartDummyData/notifications_zoom/2019-01/05.json new file mode 100644 index 000000000..7a62e9c07 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210]},{"name":"Unmuted","color":"#4fae4e","values":[150,80,30,10,0,10,40,80,90,130,120,220,160,180,170,110,270,230,160,100,180,120,170,100,50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/06.json b/public/chartDummyData/notifications_zoom/2019-01/06.json new file mode 100644 index 000000000..91d2a5c29 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170]},{"name":"Unmuted","color":"#4fae4e","values":[50,40,0,10,0,0,20,80,80,150,230,140,170,150,140,170,170,370,180,270,160,230,200,150,30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/07.json b/public/chartDummyData/notifications_zoom/2019-01/07.json new file mode 100644 index 000000000..a6b7cc317 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70]},{"name":"Unmuted","color":"#4fae4e","values":[30,30,0,40,10,10,10,80,50,110,140,210,190,200,250,260,210,210,320,240,190,200,120,90,120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/08.json b/public/chartDummyData/notifications_zoom/2019-01/08.json new file mode 100644 index 000000000..778aeed29 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170]},{"name":"Unmuted","color":"#4fae4e","values":[120,50,10,20,0,10,20,60,110,240,190,230,160,330,240,240,260,180,200,250,230,140,210,140,100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/09.json b/public/chartDummyData/notifications_zoom/2019-01/09.json new file mode 100644 index 000000000..0ea9d1510 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180]},{"name":"Unmuted","color":"#4fae4e","values":[100,130,40,20,10,0,40,20,100,110,90,110,170,300,210,130,150,190,270,100,170,180,160,110,50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/10.json b/public/chartDummyData/notifications_zoom/2019-01/10.json new file mode 100644 index 000000000..bc0b90586 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180]},{"name":"Unmuted","color":"#4fae4e","values":[50,50,0,10,0,20,30,90,60,90,130,180,130,170,120,230,320,280,250,140,130,310,100,40,60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/11.json b/public/chartDummyData/notifications_zoom/2019-01/11.json new file mode 100644 index 000000000..cb77baf71 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60]},{"name":"Unmuted","color":"#4fae4e","values":[60,20,0,0,0,10,40,50,80,130,70,140,140,160,170,180,240,170,160,190,210,250,170,190,40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/12.json b/public/chartDummyData/notifications_zoom/2019-01/12.json new file mode 100644 index 000000000..34e390392 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90]},{"name":"Unmuted","color":"#4fae4e","values":[40,50,40,0,0,10,60,50,70,110,150,140,350,190,210,220,110,330,170,230,230,200,210,60,10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/13.json b/public/chartDummyData/notifications_zoom/2019-01/13.json new file mode 100644 index 000000000..cd7b51422 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100]},{"name":"Unmuted","color":"#4fae4e","values":[10,30,0,0,0,10,90,80,90,60,110,260,150,230,390,170,160,210,260,180,290,130,210,70,40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/14.json b/public/chartDummyData/notifications_zoom/2019-01/14.json new file mode 100644 index 000000000..2920a925d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180]},{"name":"Unmuted","color":"#4fae4e","values":[40,0,10,0,10,0,40,70,60,120,120,140,200,170,170,190,210,210,250,110,270,200,160,180,70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/15.json b/public/chartDummyData/notifications_zoom/2019-01/15.json new file mode 100644 index 000000000..7e53bccbc --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190]},{"name":"Unmuted","color":"#4fae4e","values":[70,50,0,0,0,20,30,50,70,150,170,200,190,240,180,250,190,200,170,150,210,250,160,90,100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/16.json b/public/chartDummyData/notifications_zoom/2019-01/16.json new file mode 100644 index 000000000..e52602372 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200]},{"name":"Unmuted","color":"#4fae4e","values":[100,40,10,0,0,0,0,90,90,40,50,110,170,170,150,190,190,110,150,200,140,160,230,140,80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/17.json b/public/chartDummyData/notifications_zoom/2019-01/17.json new file mode 100644 index 000000000..ca5687983 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100]},{"name":"Unmuted","color":"#4fae4e","values":[80,0,10,0,0,10,40,60,40,90,100,100,150,200,140,120,170,180,210,170,320,270,160,140,20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/18.json b/public/chartDummyData/notifications_zoom/2019-01/18.json new file mode 100644 index 000000000..f0cc4bf61 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110]},{"name":"Unmuted","color":"#4fae4e","values":[20,20,0,0,0,10,50,70,70,50,80,160,180,230,210,120,300,270,210,250,300,150,120,120,0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/19.json b/public/chartDummyData/notifications_zoom/2019-01/19.json new file mode 100644 index 000000000..6eb7d4b81 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50]},{"name":"Unmuted","color":"#4fae4e","values":[0,0,0,0,0,10,30,100,50,160,90,120,190,210,140,120,160,230,150,190,220,300,120,110,130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/20.json b/public/chartDummyData/notifications_zoom/2019-01/20.json new file mode 100644 index 000000000..75c52270a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70]},{"name":"Unmuted","color":"#4fae4e","values":[130,40,0,30,10,20,50,130,120,110,180,80,190,80,160,170,210,220,160,260,270,180,230,100,20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/21.json b/public/chartDummyData/notifications_zoom/2019-01/21.json new file mode 100644 index 000000000..f6080301c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140]},{"name":"Unmuted","color":"#4fae4e","values":[20,0,0,10,10,0,10,60,70,100,110,160,270,150,240,190,260,320,250,200,190,210,170,140,80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/22.json b/public/chartDummyData/notifications_zoom/2019-01/22.json new file mode 100644 index 000000000..b104269ef --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90]},{"name":"Unmuted","color":"#4fae4e","values":[80,60,10,0,0,10,40,70,140,140,170,120,130,180,210,160,150,90,210,260,160,200,200,230,40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/23.json b/public/chartDummyData/notifications_zoom/2019-01/23.json new file mode 100644 index 000000000..b125486b4 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,30,0,30,0,0,20,90,130,140,190,60,170,200,170,180,240,210,230,190,190,140,110,40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/24.json b/public/chartDummyData/notifications_zoom/2019-01/24.json new file mode 100644 index 000000000..05d052a29 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,10,0,0,20,50,40,20,140,50,160,150,140,130,110,190,160,140,200,410,300,170,160,60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/25.json b/public/chartDummyData/notifications_zoom/2019-01/25.json new file mode 100644 index 000000000..cffd8e384 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100]},{"name":"Unmuted","color":"#4fae4e","values":[60,40,20,0,0,20,80,80,180,110,170,270,190,180,150,170,250,280,270,140,310,210,110,110,100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/26.json b/public/chartDummyData/notifications_zoom/2019-01/26.json new file mode 100644 index 000000000..ae4d7608a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80]},{"name":"Unmuted","color":"#4fae4e","values":[100,60,0,0,0,10,30,70,120,150,100,240,140,110,190,160,220,240,190,240,350,230,240,170,50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/27.json b/public/chartDummyData/notifications_zoom/2019-01/27.json new file mode 100644 index 000000000..5fe0e2b2e --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130]},{"name":"Unmuted","color":"#4fae4e","values":[50,0,0,0,0,0,40,50,160,80,140,110,200,240,180,220,160,170,210,260,230,360,160,80,20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/28.json b/public/chartDummyData/notifications_zoom/2019-01/28.json new file mode 100644 index 000000000..a9630d9ab --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240]},{"name":"Unmuted","color":"#4fae4e","values":[20,30,20,0,0,20,20,70,120,190,160,210,180,170,230,290,230,250,280,140,240,250,190,160,50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/29.json b/public/chartDummyData/notifications_zoom/2019-01/29.json new file mode 100644 index 000000000..fa5f0b1e4 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110]},{"name":"Unmuted","color":"#4fae4e","values":[50,10,10,10,0,0,20,40,60,90,190,190,200,290,170,110,220,60,170,200,120,130,90,130,70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/30.json b/public/chartDummyData/notifications_zoom/2019-01/30.json new file mode 100644 index 000000000..47b695031 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200]},{"name":"Unmuted","color":"#4fae4e","values":[70,10,0,20,10,0,10,40,130,230,170,180,280,180,180,110,240,190,220,280,140,190,80,70,40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-01/31.json b/public/chartDummyData/notifications_zoom/2019-01/31.json new file mode 100644 index 000000000..8df041950 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-01/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480]},{"name":"Unmuted","color":"#4fae4e","values":[40,50,0,0,0,20,60,40,110,180,110,240,240,200,170,120,210,300,160,220,410,220,170,70,20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/01.json b/public/chartDummyData/notifications_zoom/2019-02/01.json new file mode 100644 index 000000000..51fb99709 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,10,10,0,40,70,110,90,100,120,190,110,350,190,130,190,180,340,280,350,130,170,50,110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/02.json b/public/chartDummyData/notifications_zoom/2019-02/02.json new file mode 100644 index 000000000..377723ea5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130]},{"name":"Unmuted","color":"#4fae4e","values":[110,20,0,0,0,10,60,120,190,130,160,90,240,170,210,160,260,300,240,300,240,260,160,110,90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/03.json b/public/chartDummyData/notifications_zoom/2019-02/03.json new file mode 100644 index 000000000..fa6c28b17 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180]},{"name":"Unmuted","color":"#4fae4e","values":[90,0,40,0,10,20,70,70,140,210,180,210,190,150,190,130,240,180,210,230,210,230,170,140,60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/04.json b/public/chartDummyData/notifications_zoom/2019-02/04.json new file mode 100644 index 000000000..413f86fb2 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130]},{"name":"Unmuted","color":"#4fae4e","values":[60,0,0,0,30,50,70,80,140,200,120,240,290,130,190,150,240,250,270,160,160,250,180,40,10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/05.json b/public/chartDummyData/notifications_zoom/2019-02/05.json new file mode 100644 index 000000000..ff77e6db9 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80]},{"name":"Unmuted","color":"#4fae4e","values":[10,10,0,0,10,10,20,100,110,170,170,80,290,310,220,160,210,200,250,190,220,60,100,140,30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/06.json b/public/chartDummyData/notifications_zoom/2019-02/06.json new file mode 100644 index 000000000..dd9d791a0 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,10,0,50,50,50,80,40,100,120,220,170,120,220,180,160,160,170,100,350,220,120,130,40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/07.json b/public/chartDummyData/notifications_zoom/2019-02/07.json new file mode 100644 index 000000000..8b3d33352 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,0,10,30,20,40,60,100,170,170,150,180,200,180,160,170,180,140,190,330,280,60,80,20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/08.json b/public/chartDummyData/notifications_zoom/2019-02/08.json new file mode 100644 index 000000000..def57b351 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110]},{"name":"Unmuted","color":"#4fae4e","values":[20,30,20,10,0,40,10,100,170,190,70,160,170,190,150,180,230,170,220,210,160,320,250,70,30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/09.json b/public/chartDummyData/notifications_zoom/2019-02/09.json new file mode 100644 index 000000000..045fd51bd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,0,0,0,10,10,80,80,200,80,150,200,140,120,110,240,150,210,290,280,330,150,80,50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/10.json b/public/chartDummyData/notifications_zoom/2019-02/10.json new file mode 100644 index 000000000..cc652eb33 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90]},{"name":"Unmuted","color":"#4fae4e","values":[50,30,20,0,0,30,50,50,150,160,110,170,330,160,140,170,120,280,210,130,210,220,240,100,60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/11.json b/public/chartDummyData/notifications_zoom/2019-02/11.json new file mode 100644 index 000000000..8cc3dd17b --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80]},{"name":"Unmuted","color":"#4fae4e","values":[60,0,10,30,20,10,50,220,80,150,180,40,220,110,80,230,90,290,150,170,220,240,210,50,40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/12.json b/public/chartDummyData/notifications_zoom/2019-02/12.json new file mode 100644 index 000000000..482a107fc --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,0,0,0,0,50,70,160,240,180,70,140,280,100,210,230,180,260,110,280,260,120,130,60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/13.json b/public/chartDummyData/notifications_zoom/2019-02/13.json new file mode 100644 index 000000000..5a9382e4b --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40]},{"name":"Unmuted","color":"#4fae4e","values":[60,40,10,20,10,0,10,10,50,90,140,200,180,130,220,110,130,130,120,250,140,130,100,100,80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/14.json b/public/chartDummyData/notifications_zoom/2019-02/14.json new file mode 100644 index 000000000..558d9daa1 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290]},{"name":"Unmuted","color":"#4fae4e","values":[80,10,10,0,10,0,40,90,120,80,90,120,250,150,180,110,190,180,250,230,350,310,150,80,80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/15.json b/public/chartDummyData/notifications_zoom/2019-02/15.json new file mode 100644 index 000000000..df822ed62 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100]},{"name":"Unmuted","color":"#4fae4e","values":[80,0,10,0,0,20,50,120,150,140,100,80,200,210,180,140,150,200,270,140,330,320,170,40,50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/16.json b/public/chartDummyData/notifications_zoom/2019-02/16.json new file mode 100644 index 000000000..42ca10a38 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80]},{"name":"Unmuted","color":"#4fae4e","values":[50,0,0,0,0,10,20,90,80,110,20,140,180,200,120,140,230,170,220,190,290,330,240,80,40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/17.json b/public/chartDummyData/notifications_zoom/2019-02/17.json new file mode 100644 index 000000000..27563e411 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,20,0,0,0,130,140,130,120,160,120,150,70,170,160,230,160,150,170,190,130,170,70,50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/18.json b/public/chartDummyData/notifications_zoom/2019-02/18.json new file mode 100644 index 000000000..03e251d1d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130]},{"name":"Unmuted","color":"#4fae4e","values":[50,10,20,0,0,10,60,90,80,130,170,220,150,190,200,100,170,230,270,220,220,200,150,80,50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/19.json b/public/chartDummyData/notifications_zoom/2019-02/19.json new file mode 100644 index 000000000..eafbf8f21 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110]},{"name":"Unmuted","color":"#4fae4e","values":[50,10,20,10,0,0,30,60,100,130,150,230,230,140,170,160,120,290,160,100,120,130,60,120,90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/20.json b/public/chartDummyData/notifications_zoom/2019-02/20.json new file mode 100644 index 000000000..d0145391d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470]},{"name":"Unmuted","color":"#4fae4e","values":[90,60,10,0,0,0,10,40,80,50,120,150,110,190,210,120,140,230,120,220,310,260,170,100,40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/21.json b/public/chartDummyData/notifications_zoom/2019-02/21.json new file mode 100644 index 000000000..b039c0f04 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130]},{"name":"Unmuted","color":"#4fae4e","values":[40,10,0,0,10,10,20,70,60,90,150,120,150,200,230,140,190,180,180,160,290,230,300,50,0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/22.json b/public/chartDummyData/notifications_zoom/2019-02/22.json new file mode 100644 index 000000000..a06082931 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90]},{"name":"Unmuted","color":"#4fae4e","values":[0,50,0,30,0,30,50,130,110,70,110,110,140,120,170,250,300,250,280,200,280,410,200,100,40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/23.json b/public/chartDummyData/notifications_zoom/2019-02/23.json new file mode 100644 index 000000000..67f0282ec --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210]},{"name":"Unmuted","color":"#4fae4e","values":[40,10,10,0,0,20,70,110,110,90,170,150,190,130,100,180,260,310,220,210,190,230,260,130,70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/24.json b/public/chartDummyData/notifications_zoom/2019-02/24.json new file mode 100644 index 000000000..cf831ee44 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50]},{"name":"Unmuted","color":"#4fae4e","values":[70,50,60,0,0,20,70,60,130,50,180,200,140,120,210,190,200,200,210,190,250,280,160,90,80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/25.json b/public/chartDummyData/notifications_zoom/2019-02/25.json new file mode 100644 index 000000000..d16c359b3 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160]},{"name":"Unmuted","color":"#4fae4e","values":[80,90,40,0,0,0,40,170,120,90,120,210,150,220,150,210,150,220,300,230,200,220,180,130,80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/26.json b/public/chartDummyData/notifications_zoom/2019-02/26.json new file mode 100644 index 000000000..52b7c658c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130]},{"name":"Unmuted","color":"#4fae4e","values":[80,30,0,10,10,10,30,80,70,170,200,170,210,190,170,160,150,90,90,120,110,170,110,50,40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/27.json b/public/chartDummyData/notifications_zoom/2019-02/27.json new file mode 100644 index 000000000..285e9766e --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90]},{"name":"Unmuted","color":"#4fae4e","values":[40,30,20,10,10,10,30,130,90,210,170,190,120,230,190,180,120,140,130,170,150,280,130,70,20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-02/28.json b/public/chartDummyData/notifications_zoom/2019-02/28.json new file mode 100644 index 000000000..4f2d1cf38 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-02/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170]},{"name":"Unmuted","color":"#4fae4e","values":[20,50,10,10,0,40,40,50,90,120,140,160,220,120,160,300,300,170,180,270,200,230,130,60,50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/01.json b/public/chartDummyData/notifications_zoom/2019-03/01.json new file mode 100644 index 000000000..60c0763dc --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180]},{"name":"Unmuted","color":"#4fae4e","values":[50,0,0,0,0,20,50,110,100,100,80,270,180,230,200,210,120,190,110,210,300,260,140,100,30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/02.json b/public/chartDummyData/notifications_zoom/2019-03/02.json new file mode 100644 index 000000000..201f946bd --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160]},{"name":"Unmuted","color":"#4fae4e","values":[30,30,130,0,10,10,80,110,80,170,50,140,140,160,140,220,130,140,160,160,240,190,180,50,0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/03.json b/public/chartDummyData/notifications_zoom/2019-03/03.json new file mode 100644 index 000000000..d798c2cc3 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70]},{"name":"Unmuted","color":"#4fae4e","values":[0,40,10,10,0,0,60,100,80,100,190,140,160,170,130,120,250,160,250,120,250,260,370,220,40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/04.json b/public/chartDummyData/notifications_zoom/2019-03/04.json new file mode 100644 index 000000000..30aad1957 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100]},{"name":"Unmuted","color":"#4fae4e","values":[40,20,0,10,10,0,40,120,160,100,170,240,280,290,150,120,210,140,120,190,130,270,200,120,80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/05.json b/public/chartDummyData/notifications_zoom/2019-03/05.json new file mode 100644 index 000000000..c45ad5ff9 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110]},{"name":"Unmuted","color":"#4fae4e","values":[80,20,10,10,0,10,30,30,110,100,230,150,140,220,220,260,150,200,250,100,160,150,80,250,100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/06.json b/public/chartDummyData/notifications_zoom/2019-03/06.json new file mode 100644 index 000000000..a840b1fd0 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100]},{"name":"Unmuted","color":"#4fae4e","values":[100,50,10,0,10,20,10,40,80,170,180,200,200,180,170,140,140,160,290,220,160,260,150,120,30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/07.json b/public/chartDummyData/notifications_zoom/2019-03/07.json new file mode 100644 index 000000000..29c3c508f --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230]},{"name":"Unmuted","color":"#4fae4e","values":[30,10,0,0,0,20,80,80,40,260,110,170,190,90,180,150,220,110,220,220,210,190,160,70,10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/08.json b/public/chartDummyData/notifications_zoom/2019-03/08.json new file mode 100644 index 000000000..a77eb0b22 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130]},{"name":"Unmuted","color":"#4fae4e","values":[10,50,0,0,10,0,20,110,170,170,80,120,140,220,230,80,220,140,300,140,200,170,170,60,30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/09.json b/public/chartDummyData/notifications_zoom/2019-03/09.json new file mode 100644 index 000000000..4dbc9f4c5 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,0,0,0,0,30,120,120,70,120,150,180,140,110,210,240,210,160,220,240,310,180,140,10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/10.json b/public/chartDummyData/notifications_zoom/2019-03/10.json new file mode 100644 index 000000000..33253da8e --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140]},{"name":"Unmuted","color":"#4fae4e","values":[10,40,0,0,30,40,30,140,90,140,140,140,230,240,110,180,150,210,110,280,300,180,230,110,110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/11.json b/public/chartDummyData/notifications_zoom/2019-03/11.json new file mode 100644 index 000000000..cedce1c27 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90]},{"name":"Unmuted","color":"#4fae4e","values":[110,20,10,0,0,0,20,100,110,190,190,150,180,240,260,190,230,170,190,190,230,170,130,70,30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/12.json b/public/chartDummyData/notifications_zoom/2019-03/12.json new file mode 100644 index 000000000..d91338c89 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100]},{"name":"Unmuted","color":"#4fae4e","values":[30,40,50,10,0,30,60,100,80,110,160,170,170,180,200,210,120,280,80,210,140,160,180,220,90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/13.json b/public/chartDummyData/notifications_zoom/2019-03/13.json new file mode 100644 index 000000000..12181a3a8 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100]},{"name":"Unmuted","color":"#4fae4e","values":[90,30,30,10,10,0,0,60,50,140,190,190,130,120,120,180,130,150,150,170,120,90,80,70,60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/14.json b/public/chartDummyData/notifications_zoom/2019-03/14.json new file mode 100644 index 000000000..7d293f1ed --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120]},{"name":"Unmuted","color":"#4fae4e","values":[60,0,20,0,0,10,60,120,130,140,130,180,170,200,130,170,210,170,140,100,200,140,120,90,30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/15.json b/public/chartDummyData/notifications_zoom/2019-03/15.json new file mode 100644 index 000000000..799dc880a --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70]},{"name":"Unmuted","color":"#4fae4e","values":[30,0,50,20,0,10,80,110,50,120,180,120,150,140,200,230,220,250,170,320,230,180,190,20,20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/16.json b/public/chartDummyData/notifications_zoom/2019-03/16.json new file mode 100644 index 000000000..57f6af5fa --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110]},{"name":"Unmuted","color":"#4fae4e","values":[20,0,0,0,10,50,70,100,40,80,200,220,220,240,210,120,220,220,230,280,350,380,250,160,80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/17.json b/public/chartDummyData/notifications_zoom/2019-03/17.json new file mode 100644 index 000000000..24b51ba20 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170]},{"name":"Unmuted","color":"#4fae4e","values":[80,40,10,0,0,20,80,130,150,200,210,190,210,210,220,160,290,270,260,200,270,120,120,90,0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/18.json b/public/chartDummyData/notifications_zoom/2019-03/18.json new file mode 100644 index 000000000..63a5d1701 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100]},{"name":"Unmuted","color":"#4fae4e","values":[0,0,10,0,0,20,20,130,100,190,110,250,80,180,210,210,150,250,150,200,190,160,190,90,20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/19.json b/public/chartDummyData/notifications_zoom/2019-03/19.json new file mode 100644 index 000000000..f6e653790 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90]},{"name":"Unmuted","color":"#4fae4e","values":[20,10,0,0,10,0,20,60,50,160,210,210,140,200,150,230,230,100,120,90,120,110,150,120,160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/20.json b/public/chartDummyData/notifications_zoom/2019-03/20.json new file mode 100644 index 000000000..bd0ef7a51 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70]},{"name":"Unmuted","color":"#4fae4e","values":[160,230,30,20,0,0,10,30,60,160,220,180,130,180,110,120,170,170,200,160,220,110,90,130,90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/21.json b/public/chartDummyData/notifications_zoom/2019-03/21.json new file mode 100644 index 000000000..f6ac8dcc7 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140]},{"name":"Unmuted","color":"#4fae4e","values":[90,50,10,0,10,10,40,60,80,80,130,170,130,230,200,130,210,310,220,240,200,210,160,120,30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/22.json b/public/chartDummyData/notifications_zoom/2019-03/22.json new file mode 100644 index 000000000..451e84652 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90]},{"name":"Unmuted","color":"#4fae4e","values":[30,50,10,0,0,10,80,100,60,90,120,160,150,200,190,150,210,200,290,130,210,210,200,80,30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/23.json b/public/chartDummyData/notifications_zoom/2019-03/23.json new file mode 100644 index 000000000..6c11b8c6d --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90]},{"name":"Unmuted","color":"#4fae4e","values":[30,20,0,0,0,30,40,60,130,50,110,110,190,200,300,130,120,260,180,270,230,170,190,30,100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/24.json b/public/chartDummyData/notifications_zoom/2019-03/24.json new file mode 100644 index 000000000..9384a3475 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90]},{"name":"Unmuted","color":"#4fae4e","values":[100,30,10,0,10,50,100,90,160,130,130,120,100,200,200,240,260,100,200,170,350,240,170,100,60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/25.json b/public/chartDummyData/notifications_zoom/2019-03/25.json new file mode 100644 index 000000000..b23c885bb --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150]},{"name":"Unmuted","color":"#4fae4e","values":[60,20,50,10,0,40,50,500,120,120,170,140,180,150,170,210,230,270,170,240,240,330,170,80,10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/26.json b/public/chartDummyData/notifications_zoom/2019-03/26.json new file mode 100644 index 000000000..a9a1c6161 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80]},{"name":"Unmuted","color":"#4fae4e","values":[10,60,0,10,0,10,20,100,100,140,90,170,110,230,180,170,200,170,210,150,90,140,40,60,90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/27.json b/public/chartDummyData/notifications_zoom/2019-03/27.json new file mode 100644 index 000000000..1af4f9a77 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40]},{"name":"Unmuted","color":"#4fae4e","values":[90,20,30,20,0,0,10,30,50,110,230,100,120,260,280,200,110,110,180,130,230,150,120,30,20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/28.json b/public/chartDummyData/notifications_zoom/2019-03/28.json new file mode 100644 index 000000000..0501e4a2c --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100]},{"name":"Unmuted","color":"#4fae4e","values":[20,0,0,0,0,0,80,150,110,220,130,210,200,160,130,250,200,230,290,180,220,250,200,50,40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90,50,40,30,0,30,10,20,20,70,160,150,140,140,180,300,190,190,150,220,120,220,260,120,30]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/29.json b/public/chartDummyData/notifications_zoom/2019-03/29.json new file mode 100644 index 000000000..2ab049118 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30]},{"name":"Unmuted","color":"#4fae4e","values":[40,10,0,30,0,40,70,160,140,90,130,130,160,180,160,160,170,210,100,240,250,250,100,40,10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90,50,40,30,0,30,10,20,20,70,160,150,140,140,180,300,190,190,150,220,120,220,260,120,30,20,0,10,0,30,40,60,110,120,130,140,160,260,100,190,260,140,240,210,310,160,130,160,50]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/30.json b/public/chartDummyData/notifications_zoom/2019-03/30.json new file mode 100644 index 000000000..63a3d4294 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90]},{"name":"Unmuted","color":"#4fae4e","values":[10,10,20,20,0,10,40,120,120,230,100,140,180,220,220,170,220,260,220,290,210,120,160,150,140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90,50,40,30,0,30,10,20,20,70,160,150,140,140,180,300,190,190,150,220,120,220,260,120,30,20,0,10,0,30,40,60,110,120,130,140,160,260,100,190,260,140,240,210,310,160,130,160,50,20,0,0,10,0,50,140,120,100,70,110,250,180,170,180,160,190,250,260,290,270,290,170,90]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-03/31.json b/public/chartDummyData/notifications_zoom/2019-03/31.json new file mode 100644 index 000000000..2c87f6076 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-03/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130]},{"name":"Unmuted","color":"#4fae4e","values":[140,70,0,20,0,0,20,110,190,130,120,130,160,230,200,240,190,260,200,370,160,300,140,40,50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90,50,40,30,0,30,10,20,20,70,160,150,140,140,180,300,190,190,150,220,120,220,260,120,30,20,0,10,0,30,40,60,110,120,130,140,160,260,100,190,260,140,240,210,310,160,130,160,50,20,0,0,10,0,50,140,120,100,70,110,250,180,170,180,160,190,250,260,290,270,290,170,90,0,10,10,0,40,30,50,100,160,120,150,220,110,140,130,130,200,190,160,80,260,160,130,70]}]} diff --git a/public/chartDummyData/notifications_zoom/2019-04/01.json b/public/chartDummyData/notifications_zoom/2019-04/01.json new file mode 100644 index 000000000..1c7116452 --- /dev/null +++ b/public/chartDummyData/notifications_zoom/2019-04/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"line","labels":[1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000],"labelType":"hour","isStacked":false,"isPercentage":false,"hasSecondYAxis":false,"datasets":[{"name":"Muted","color":"#F06E66","values":[100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70]},{"name":"Unmuted","color":"#4fae4e","values":[50,60,10,20,20,20,40,90,130,110,130,190,150,130,160,220,230,230,230,190,140,160,170,40,40,30,10,0,10,10,10,50,100,80,150,180,160,110,150,110,130,150,200,120,160,110,120,90,50,40,30,0,30,10,20,20,70,160,150,140,140,180,300,190,190,150,220,120,220,260,120,30,20,0,10,0,30,40,60,110,120,130,140,160,260,100,190,260,140,240,210,310,160,130,160,50,20,0,0,10,0,50,140,120,100,70,110,250,180,170,180,160,190,250,260,290,270,290,170,90,0,10,10,0,40,30,50,100,160,120,150,220,110,140,130,130,200,190,160,80,260,160,130,70,10,10,0,0,10,70,80,180,150,170,110,210,200,120,190,130,190,270,210,310,220,250,80,30]}]} diff --git a/public/chartDummyData/views.json b/public/chartDummyData/views.json new file mode 100644 index 000000000..c7e7f2bc1 --- /dev/null +++ b/public/chartDummyData/views.json @@ -0,0 +1 @@ +{"title":"Views by source","type":"bar","isStacked":true,"labelType":"day","labels":[1539043200000,1539129600000,1539216000000,1539302400000,1539388800000,1539475200000,1539561600000,1539648000000,1539734400000,1539820800000,1539907200000,1539993600000,1540080000000,1540166400000,1540252800000,1540339200000,1540425600000,1540512000000,1540598400000,1540684800000,1540771200000,1540857600000,1540944000000,1541030400000,1541116800000,1541203200000,1541289600000,1541376000000,1541462400000,1541548800000,1541635200000,1541721600000,1541808000000,1541894400000,1541980800000,1542067200000,1542153600000,1542240000000,1542326400000,1542412800000,1542499200000,1542585600000,1542672000000,1542758400000,1542844800000,1542931200000,1543017600000,1543104000000,1543190400000,1543276800000,1543363200000,1543449600000,1543536000000,1543622400000,1543708800000,1543795200000,1543881600000,1543968000000,1544054400000,1544140800000,1544227200000,1544313600000,1544400000000,1544486400000,1544572800000,1544659200000,1544745600000,1544832000000,1544918400000,1545004800000,1545091200000,1545177600000,1545264000000,1545350400000,1545436800000,1545523200000,1545609600000,1545696000000,1545782400000,1545868800000,1545955200000,1546041600000,1546128000000,1546214400000,1546300800000,1546387200000,1546473600000,1546560000000,1546646400000,1546732800000,1546819200000,1546905600000,1546992000000,1547078400000,1547164800000,1547251200000,1547337600000,1547424000000,1547510400000,1547596800000,1547683200000,1547769600000,1547856000000,1547942400000,1548028800000,1548115200000,1548201600000,1548288000000,1548374400000,1548460800000,1548547200000,1548633600000,1548720000000,1548806400000,1548892800000,1548979200000,1549065600000,1549152000000,1549238400000,1549324800000,1549411200000,1549497600000,1549584000000,1549670400000,1549756800000,1549843200000,1549929600000,1550016000000,1550102400000,1550188800000,1550275200000,1550361600000,1550448000000,1550534400000,1550620800000,1550707200000,1550793600000,1550880000000,1550966400000,1551052800000,1551139200000,1551225600000,1551312000000,1551398400000,1551484800000,1551571200000,1551657600000,1551744000000,1551830400000,1551916800000,1552003200000,1552089600000,1552176000000,1552262400000,1552348800000,1552435200000,1552521600000,1552608000000,1552694400000,1552780800000,1552867200000,1552953600000,1553040000000,1553126400000,1553212800000,1553299200000,1553385600000,1553472000000,1553558400000,1553644800000,1553731200000,1553817600000,1553904000000,1553990400000,1554076800000,1554163200000,1554249600000,1554336000000,1554422400000,1554508800000],"datasets":[{"name":"Followers","color":"#54A4E7","values":[12360,16240,14210,14040,15190,13570,14020,15600,16080,15800,16740,15680,16790,15520,17410,17660,17000,15080,17190,17020,16620,15200,13210,16970,16030,16090,16800,15280,15450,15990,17130,14970,16020,15780,15770,15720,16210,15820,16080,14860,14210,14980,16200,15430,15510,16750,16460,15130,15120,15580,18040,16380,15940,16590,15950,15480,14940,16520,16570,15910,15950,16280,17120,15720,16600,17580,16260,17270,15660,16500,16410,17140,16240,17330,16320,17490,17220,17030,19130,17440,17350,17010,19050,16150,16350,18280,17670,19690,17470,16320,16180,16290,15440,16600,17430,17800,18110,16870,17200,16700,18010,18110,17850,17600,17870,18100,17300,19960,18340,19650,19710,21300,18930,20090,20240,21150,21020,21940,22350,22160,20800,22390,21450,22970,20690,23410,21490,21690,20650,22440,21630,23420,22860,23490,24460,23610,23810,22840,23540,24800,23460,24140,25050,23910,23790,23190,23390,23160,23830,23680,25940,23420,23330,23630,23400,26230,22690,24700,22010,23050,22460,24620,24960,26180,24540,24240,24690,24140,25140,29410,25900,25880,24600,25380,25090,24930,28930,26570,25270,26560,25520,27150,25130,25600,28580,25800,25500,27870,26320,18930,30390,27640,27790,28380,29230,28160,28490,31290,31710,32150,29840,29860,30240,30750,33300,34750,33250,31920,36940,36930,33360,38500,33700,34630,36580,36130,34960,35210,37600,37100,34640,36840,36150,33850,32800,35440,37510,36770,35560,35460,36650,35370,36990,39810,39340,36350,35350,33160,34440,36720,35200,37240,36030,36330,34940,34840,39350,37370,34040,33510,35270,32940,33310,34730,35760,37300,35190,33420,32550,33450,34360,41660,42960,38970,37080,37150,36460,41330,34220,34980,34840,39150,38110,35380,38760,36080,33790,36150,35960,32570,33180,36000,36390,33950,35390,36680,36540,31270,34720,35030,37090,38120,32870,34800,35000,34370,35070,35430,36830,37380,35390,33170,37300,34710,36450,37500,37820,31590,34370,37430,36650,35300,35520,35830,35650,32070,38700,34460,34450,32720,34900,35680,33340,37500,35730,35270,37150,35010,35260,33690,40330,36410,35540,35600,35480,37740,35600,44060,34610,37160,37880,36800,37940,35140,36900,40490,37740,36330,37730,35330,35800,39580,37590,35770,36430,36720,36860,33580,36830,35830,36600,37840,39450,35390,35310]},{"name":"URL","color":"#2373DB","values":[9850,8210,10800,10490,11600,11160,11920,10210,8010,12010,12270,11720,12790,12330,10970,10150,11180,12150,9320,11460,12290,10400,7790,12150,8920,11330,11450,11550,10900,9800,11770,12130,11070,11850,11670,11260,10110,10790,10940,11200,12710,11660,9980,9120,11410,12830,11380,13290,12080,11020,9770,11700,11980,13020,12200,12320,9780,10660,10900,11940,12490,11300,12220,10410,10270,12310,12580,12170,12590,13110,10510,8960,12310,13270,13860,13460,12980,10030,10480,11550,12540,11630,13280,12670,9230,9510,11770,12160,12510,12130,12220,9630,8880,11210,10570,11600,12920,11260,11260,9570,11440,11850,12090,12640,12330,12180,9550,12990,12830,13600,14390,13380,11200,9350,13120,14140,15400,14090,14010,12900,10810,13690,13380,13910,13970,14260,12480,11110,12830,12910,8660,11560,13010,11910,11520,13260,15130,13850,14270,13940,13170,12080,15420,15530,16720,16800,16950,15980,13840,16930,17870,17780,17860,18180,16790,13320,18470,19150,18290,20630,19410,16410,15320,18460,18970,18930,20580,20850,17600,17750,22190,19970,21820,22900,21350,17600,16250,21290,20670,21300,22480,21530,17690,18860,21140,21100,22620,21730,21500,14230,17470,22730,22990,22790,23880,23070,21310,20790,23750,26840,25400,27300,25810,23570,21880,27560,29980,29890,22490,27400,25220,23230,28400,29720,31360,29380,31590,27210,23950,28940,29740,32280,32270,32520,27280,22010,30900,31550,32050,31800,32050,28210,23880,31450,29530,30470,32430,31660,27030,24270,31230,31630,31470,33030,32890,23600,24670,30340,31460,31610,31910,30550,26730,25180,29610,32710,33670,35040,35140,27820,23700,24670,16390,18390,29090,28130,25560,23590,21840,16420,24260,27670,29570,25730,22280,29060,29430,28930,29790,31130,25750,22390,29480,31690,30350,31150,31420,26440,22340,28380,29510,31160,30110,31910,25370,23090,30500,30550,29850,29560,30570,24870,23180,28910,29270,29670,31770,30990,26920,24520,30170,30620,30320,28920,30310,25300,22950,28800,30250,31800,30740,31250,27140,24710,30040,30210,32370,30260,31210,25190,24120,29280,30080,31050,31120,29810,25580,22500,28520,30260,35910,31510,31150,25450,23190,29760,31150,30540,30290,31860,26750,25020,30190,30700,30360,31060,30420,27340,22040,29990,30980,32710,32880,33190,30180]},{"name":"Groups","color":"#9ED448","values":[13730,13690,15220,13820,13080,13870,13300,11290,14240,15260,15150,14600,13690,14460,12750,13510,15220,15070,12730,15170,14140,12650,11480,13980,14500,15550,15590,15470,14040,14770,16590,14470,14840,14910,14490,13380,14410,14170,14800,15700,15180,14010,13020,14750,14950,14350,14710,15120,14070,12520,14680,15510,14200,15610,15180,14540,11940,15190,16180,15670,13830,14800,14560,12850,13800,14890,16190,15610,15230,14770,13940,15450,15530,16340,16000,16880,15530,13800,14410,15520,16630,14890,14660,15540,14100,15960,15950,16010,16150,15500,13800,14030,14520,16270,16110,15870,15270,15810,13670,15600,16290,15610,16060,16400,16340,13810,14920,16820,16950,17530,17490,17050,14650,15670,19000,18680,18240,18210,17680,16420,16190,16760,16580,18300,20560,18760,16440,17800,18270,21800,16760,18260,18150,18100,18210,20350,20730,22270,21910,19380,17800,20190,19540,19730,19530,19810,21450,17920,19850,21320,22400,22700,22810,20180,19140,21540,21730,21580,22800,23640,19150,22070,22740,20730,23820,21880,22700,22450,21120,21180,24150,20920,23890,21320,22110,20860,21190,22710,22170,23680,23590,23760,23170,22360,24520,23830,24690,26700,22220,14530,22920,26310,24840,24910,27490,24910,23330,28350,29540,29300,28910,30530,27710,26870,31170,34050,32040,28070,31970,32860,30500,35250,34900,35680,34820,36470,36600,31880,37310,38540,37510,36470,37070,33790,32550,34480,35660,34840,35070,34430,33800,29450,32910,37250,34730,33970,33660,32470,29670,32120,35610,33620,35090,32780,30180,26990,32680,35540,33250,33070,31350,31500,29800,29620,32630,32060,31030,31850,31040,29000,31410,30880,34180,31390,31410,33940,30190,29970,27620,28530,31660,35190,34050,33360,33250,32930,33570,32310,31930,32520,31000,34450,35120,33320,32760,32310,32110,30030,32290,32180,34510,34630,33840,32850,29680,32390,35360,32350,33910,32170,31140,25910,31100,33070,31630,32140,32980,31910,26510,28700,32450,30350,30620,28170,27090,24020,26210,30630,30010,29060,28280,27480,25640,27380,31170,30140,29880,27080,27190,26540,26100,28950,28390,29580,28430,27180,26900,27890,30370,29010,37710,31070,28200,24050,29250,30280,30940,30400,29590,27840,25070,28680,30740,28600,30670,30550,28430,26900,27170,29890,30590,33270,31990,30770,27010]},{"name":"Channel","color":"#4fae4e","values":[930,890,900,980,1120,1250,1220,1030,960,1390,1300,1200,1030,880,1820,1680,1190,1320,1790,1610,1210,1170,1300,1080,1320,1200,970,760,1230,1250,1040,1020,1300,1290,970,900,1050,1040,980,1070,1410,1080,1000,1100,1070,1010,940,1160,1110,990,1070,830,940,1070,1160,1040,1020,1120,1210,3030,2530,1660,1170,1240,1180,1000,1170,720,1010,1300,1020,1180,1080,960,1050,880,950,970,1360,1020,1280,1140,1150,1100,1100,1260,1280,1540,1360,1250,1060,1330,930,1060,940,1190,1320,1180,1050,1210,1370,1330,950,1270,1130,1300,1170,1530,1110,1380,1240,1390,1150,1230,1340,1160,1140,1380,1690,1460,1240,1610,1320,1360,1320,1460,1450,1330,1080,1720,1600,1250,1570,1530,1610,1860,1450,1560,1690,1560,1730,1600,2170,1540,1940,1430,1410,1840,1790,1850,1620,1520,2190,1870,1550,2080,1560,1720,2040,1810,1890,2000,1900,2270,2060,1890,1930,1590,2030,1890,1810,1620,1690,1310,1700,1530,1970,2080,1620,1510,1990,1720,1750,1870,1740,1620,1840,1980,1910,1790,2080,1820,1530,2140,2440,2130,2430,2180,2080,2190,2090,1910,2440,1940,2680,3310,2510,2200,3020,2550,2450,2800,2450,2780,3020,2680,2210,2550,3160,2870,2690,3140,2820,2850,2160,2540,3050,2720,2540,3000,2630,2660,2780,2350,2510,2980,2650,2770,2220,3000,2950,2450,2610,2270,2200,2200,2920,2600,2470,2180,2480,2400,2450,2970,2830,2740,2680,2750,2200,2720,2270,3100,3510,3400,2920,2240,2330,2660,3400,3240,2940,3300,3760,3270,3460,3340,2820,2300,2830,2690,2760,2570,2420,2730,2480,3000,3260,2920,2750,2660,3130,3480,2530,3140,2200,2970,2900,2510,2500,2660,2970,2810,3200,2640,2790,3360,2690,2750,2810,3090,3080,2490,2810,2570,2630,2370,3320,2610,2300,2670,2470,2680,3270,3580,3000,2670,2540,2740,2940,2800,3590,3000,3130,3030,2460,2400,2610,3240,4010,2880,2930,2890,3240,2600,3530,2850,3580,3480,3210,3150,2730,3240,2720,3210,3090,3310,2670,2750,2540,2600,2930,3400,3050,3480,2930]},{"name":"Search","color":"#F5BD25","values":[2090,2070,2080,2490,2580,2210,2670,2940,2280,2520,2840,2480,3150,2590,2630,2490,3220,2390,2430,2490,2490,1520,1680,2680,2240,2630,2440,2340,2430,2710,2670,2420,2210,2750,3630,2450,2650,2330,2120,2310,2280,2500,2310,2410,2210,2210,2550,2690,2190,2030,1940,1790,3250,3370,2580,2330,2190,2270,2460,2310,2030,3070,2440,1820,2260,1580,2070,2230,2890,2430,1540,2450,2590,2200,2470,2790,2430,1960,2370,2470,2880,2960,2140,2420,1570,2530,2430,2850,2290,2380,2450,3150,3240,2100,2210,2580,2780,2880,2220,2290,2560,2550,3230,3760,4940,2460,2890,3120,3950,3170,2850,3480,2160,2770,3070,4080,2860,2950,2550,3890,3760,5150,7520,5950,4400,3150,2820,3390,3740,3140,3480,2480,2980,4740,3230,3370,3970,3730,3910,3890,2250,3340,5110,4360,3940,3030,3130,3470,3470,4230,3190,2950,5310,4600,3540,3170,3780,3210,4020,5060,4180,3710,4540,4070,3530,4100,3950,3810,4960,4750,4030,3760,4790,6930,5160,4060,4490,4500,4410,4950,4850,4380,4500,3270,3620,4910,4160,4520,5990,3080,5560,4510,4190,4390,4380,4260,4240,4260,4650,4630,3880,5130,4430,5030,5610,4420,4200,4300,5710,6660,4860,5620,4330,4120,10220,12330,7070,6430,6420,5510,4970,5390,5910,5440,4760,6080,4730,6690,6130,6050,4920,5310,5860,6880,6510,4860,6470,4960,4820,6520,5230,4350,5110,6100,4660,5110,4780,3790,5480,3560,4670,4530,5010,4590,4350,5670,3950,5150,4430,3630,4390,4090,3730,3380,6720,7270,5950,5350,4280,4400,6240,6950,5740,4400,5100,5880,4670,4710,6370,5630,4960,5780,6110,6070,5160,5280,4890,4560,5700,5030,4770,5370,6800,7150,3830,12010,4190,4320,4520,5850,5830,5670,4670,4980,4330,5050,5820,4610,5920,5160,4690,3980,4380,4450,3670,3440,4870,4330,4510,3880,4830,4850,4290,4400,5830,3760,4940,4670,5020,3920,4480,5410,5410,3750,5490,4150,3990,3910,4460,4240,3770,5000,4520,5000,4070,5080,4710,4440,5540,5280,5960,5260,4480,5540,6320,6150,5610,4900,4300,5010,5440,4450,5570,5840,4530]},{"name":"Other","color":"#F79E39","values":[2520,2490,3090,2800,2820,3140,2780,2780,2770,2770,2960,2660,3010,2590,2670,2800,2630,2860,2590,2930,3020,2520,1990,2740,2540,2950,2920,3190,2610,2710,2900,3340,3240,2920,2870,2610,2600,2660,3110,3080,3260,2790,3140,2510,2940,2700,2780,3010,3010,2440,2750,3250,3500,3190,3150,2720,2550,2580,3060,2820,2640,2980,2720,2440,2270,3010,3150,3160,2830,2710,2420,2870,3130,2860,2840,2940,2780,2630,2770,2690,3100,3050,3020,2830,2270,2630,2550,3260,3120,2500,2720,2360,2170,3180,3410,2830,3250,2890,2680,2500,3730,3290,2790,2660,3160,2780,2490,3480,2990,2980,3110,3550,2900,2560,2920,3210,3410,3340,3190,3370,3430,3370,3380,3570,3360,3280,2920,3100,3250,3620,2640,2920,3370,2890,3210,3700,3880,3340,3630,3810,3960,4240,3680,3690,3540,3900,4130,3230,3430,4060,4240,3920,3950,4300,3340,3290,3670,3410,3640,4180,3560,3160,3060,3920,3980,4390,3810,3960,3590,4130,4310,3970,3870,4080,4170,3850,3750,3930,3880,3770,3970,3810,3910,3960,4180,4420,4390,4460,4420,2620,4500,4300,4470,4590,4580,4470,4120,4610,4730,5040,4970,5170,4990,4210,4870,5340,5170,4530,5560,5230,4300,5140,5630,5780,5400,5200,5310,5130,5480,5260,5780,5750,5350,5460,4670,4900,6280,6380,6580,6710,7110,5210,5230,5790,5720,5340,5510,5090,4550,5150,5370,5460,5550,5600,5510,5140,4960,5160,5180,5260,5340,5030,4750,5150,5030,5220,4620,5250,5000,4650,4080,4320,4360,4160,5420,5690,4580,4600,3750,4000,4990,5070,5510,5480,5260,5840,5330,5930,5640,5150,5560,4640,6140,5560,5880,6310,5370,5160,4920,5550,5730,5410,5180,5820,4790,5990,4960,5490,5540,5500,5140,5000,4960,5650,5440,5360,5790,5360,4690,5370,5490,5280,5510,5840,5720,4590,4760,5380,5220,5310,5300,5400,4540,4900,5140,5360,5540,5310,5480,4690,4800,5320,5900,5450,5250,4900,4410,4760,5150,5110,5890,5900,5460,4770,5100,5700,5560,5510,5700,5080,4880,4950,5880,5840,5470,5450,5320,4490,4090,5870,5420,6160,6240,5640,4530]},{"name":"PM","color":"#E65850","values":[120,60,90,70,50,60,110,150,100,60,70,50,60,80,130,80,90,130,170,80,160,100,90,100,90,40,90,100,80,100,110,100,80,120,180,160,110,50,60,50,20,110,130,120,50,40,110,110,70,140,150,70,50,110,30,70,130,110,140,60,60,80,170,110,140,60,40,140,60,160,150,90,70,150,130,100,80,110,100,30,80,80,130,130,150,130,160,70,70,70,80,200,80,80,80,50,70,80,70,90,50,70,120,140,110,170,180,90,70,80,100,150,220,170,90,120,140,90,190,190,100,110,80,180,150,140,150,220,170,120,160,130,170,150,190,200,120,100,130,210,190,100,100,180,130,80,90,230,130,100,120,120,110,100,140,140,50,100,100,100,150,140,110,120,80,100,70,150,120,100,100,100,130,110,110,190,170,210,100,90,130,210,180,90,160,90,70,120,190,140,100,100,100,160,160,200,190,190,100,90,140,180,120,170,130,60,50,160,130,170,280,160,130,140,170,110,240,220,150,110,150,80,180,150,70,190,80,150,220,210,160,170,90,120,50,180,180,130,220,100,150,200,110,280,180,150,190,140,60,120,100,110,180,100,140,120,200,180,220,170,160,70,140,150,210,120,200,80,330,90,100,140,60,100,160,50,80,120,80,120,170,80,80,110,80,70,210,140,190,60,100,120,60,170,240,200,70,80,80,120,160,90,120,100,130,180,110,130,240,130,90,80,150,150,240,250,140,80,130,170,120,120,170,110,80,170,150,130,190,210,180,120,50,100,180,210,170,150,120,110,170,160,220,140,150,160,130,120,60,230,170,270,120,160,200,160,150,180,210,200,150,110,120,160,210]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/07.json b/public/chartDummyData/views_zoom/2018-04/07.json new file mode 100644 index 000000000..0a11416ab --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1522800000000,1522803600000,1522807200000,1522810800000,1522814400000,1522818000000,1522821600000,1522825200000,1522828800000,1522832400000,1522836000000,1522839600000,1522843200000,1522846800000,1522850400000,1522854000000,1522857600000,1522861200000,1522864800000,1522868400000,1522872000000,1522875600000,1522879200000,1522882800000,1522886400000,1522890000000,1522893600000,1522897200000,1522900800000,1522904400000,1522908000000,1522911600000,1522915200000,1522918800000,1522922400000,1522926000000,1522929600000,1522933200000,1522936800000,1522940400000,1522944000000,1522947600000,1522951200000,1522954800000,1522958400000,1522962000000,1522965600000,1522969200000,1522972800000,1522976400000,1522980000000,1522983600000,1522987200000,1522990800000,1522994400000,1522998000000,1523001600000,1523005200000,1523008800000,1523012400000,1523016000000,1523019600000,1523023200000,1523026800000,1523030400000,1523034000000,1523037600000,1523041200000,1523044800000,1523048400000,1523052000000,1523055600000,1523059200000,1523062800000,1523066400000,1523070000000,1523073600000,1523077200000,1523080800000,1523084400000,1523088000000,1523091600000,1523095200000,1523098800000,1523102400000,1523106000000,1523109600000,1523113200000,1523116800000,1523120400000,1523124000000,1523127600000,1523131200000,1523134800000,1523138400000,1523142000000,1523145600000,1523149200000,1523152800000,1523156400000,1523160000000,1523163600000,1523167200000,1523170800000,1523174400000,1523178000000,1523181600000,1523185200000,1523188800000,1523192400000,1523196000000,1523199600000,1523203200000,1523206800000,1523210400000,1523214000000,1523217600000,1523221200000,1523224800000,1523228400000,1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,20,60,10,70,280,400,650,550,850,680,810,770,450,860,880,960,790,920,880,970,740,390,180,70,70,20,10,140,280,430,420,560,490,750,700,730,800,920,980,1180,1040,740,990,1010,680,460,170,70,50,0,0,20,310,600,430,650,1030,670,740,980,730,1110,1080,1090,1030,880,1180,1030,640,440,340,110,30,90,0,90,160,310,400,740,680,750,820,980,630,770,830,760,910,760,650,550,570,550,220,240,100,50,20,60,90,220,450,600,780,800,1480,980,980,880,950,1210,930,1190,1160,1740,710,430,190,190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230]},{"name":"URL","color":"#2373DB","values":[80,10,10,10,10,40,100,140,370,290,420,500,670,550,450,670,1050,870,640,690,490,370,230,40,70,70,10,10,40,130,180,260,390,490,570,500,480,540,820,840,820,760,940,690,660,530,260,110,50,10,0,0,0,120,210,240,380,410,690,670,790,790,710,730,1070,720,810,800,490,510,220,90,30,60,40,0,30,50,80,310,370,540,630,570,560,610,540,830,760,700,840,760,580,380,340,240,140,90,10,10,10,10,90,250,430,340,460,390,420,510,590,560,870,580,550,550,570,480,220,80,50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100]},{"name":"Groups","color":"#9ED448","values":[300,70,60,30,100,320,330,620,510,490,600,790,850,660,680,990,710,940,650,1360,1300,1000,610,400,90,30,10,30,150,290,360,400,510,470,980,590,780,730,1060,640,840,600,620,1100,1260,1260,920,260,70,50,10,0,50,360,510,610,440,420,800,1210,980,680,490,550,960,670,840,870,1010,820,820,320,220,250,100,20,120,150,640,770,680,570,600,850,710,700,690,560,610,800,1090,650,550,910,910,580,390,140,80,20,20,80,160,250,530,510,550,630,940,510,1350,570,750,730,800,1140,1260,1080,900,300,270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,10,0,0,10,30,60,20,50,60,50,30,30,60,110,60,90,40,20,40,0,0,0,0,0,0,10,20,10,40,0,20,60,10,50,30,40,30,70,80,80,40,60,50,40,10,0,0,0,0,0,20,40,10,50,20,60,30,10,40,60,60,40,80,50,100,10,10,20,20,0,0,0,10,0,30,60,30,10,20,60,60,80,70,70,60,50,30,70,100,30,50,20,0,0,0,0,0,0,10,40,60,30,10,20,40,50,40,90,70,30,70,50,80,110,70,20,10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10]},{"name":"Search","color":"#F5BD25","values":[70,0,0,0,90,50,220,70,20,100,240,60,60,130,70,40,110,170,70,130,80,130,130,60,0,10,0,0,30,50,70,130,60,100,100,50,160,130,110,50,140,270,80,190,160,120,150,10,10,0,0,10,0,150,70,130,20,120,100,210,1180,110,140,20,100,160,40,150,100,170,50,30,10,0,0,0,0,80,220,90,140,120,60,190,90,110,90,40,50,210,120,110,120,40,100,100,10,0,20,0,40,0,180,110,100,70,120,50,120,80,40,180,110,220,80,180,40,180,110,30,10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10]},{"name":"Other","color":"#F79E39","values":[20,0,30,0,0,80,50,130,130,220,110,170,120,200,160,80,160,240,170,230,170,200,120,10,30,0,0,20,0,60,70,130,110,90,180,180,160,60,190,220,130,150,190,180,150,100,90,50,0,10,10,0,40,80,140,210,90,100,140,180,150,140,110,140,140,190,60,140,180,180,80,40,20,20,40,0,0,40,30,150,140,100,120,160,180,170,120,130,170,220,180,130,140,90,80,90,50,30,20,10,0,10,20,110,140,120,150,160,130,140,170,60,130,120,220,160,250,130,120,40,0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50]},{"name":"PM","color":"#E65850","values":[0,0,0,10,0,10,0,0,0,0,10,0,10,0,0,0,10,20,0,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,10,0,0,0,10,10,0,10,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,10,20,0,0,30,10,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,20,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/08.json b/public/chartDummyData/views_zoom/2018-04/08.json new file mode 100644 index 000000000..0774e307e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1522886400000,1522890000000,1522893600000,1522897200000,1522900800000,1522904400000,1522908000000,1522911600000,1522915200000,1522918800000,1522922400000,1522926000000,1522929600000,1522933200000,1522936800000,1522940400000,1522944000000,1522947600000,1522951200000,1522954800000,1522958400000,1522962000000,1522965600000,1522969200000,1522972800000,1522976400000,1522980000000,1522983600000,1522987200000,1522990800000,1522994400000,1522998000000,1523001600000,1523005200000,1523008800000,1523012400000,1523016000000,1523019600000,1523023200000,1523026800000,1523030400000,1523034000000,1523037600000,1523041200000,1523044800000,1523048400000,1523052000000,1523055600000,1523059200000,1523062800000,1523066400000,1523070000000,1523073600000,1523077200000,1523080800000,1523084400000,1523088000000,1523091600000,1523095200000,1523098800000,1523102400000,1523106000000,1523109600000,1523113200000,1523116800000,1523120400000,1523124000000,1523127600000,1523131200000,1523134800000,1523138400000,1523142000000,1523145600000,1523149200000,1523152800000,1523156400000,1523160000000,1523163600000,1523167200000,1523170800000,1523174400000,1523178000000,1523181600000,1523185200000,1523188800000,1523192400000,1523196000000,1523199600000,1523203200000,1523206800000,1523210400000,1523214000000,1523217600000,1523221200000,1523224800000,1523228400000,1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,70,20,10,140,280,430,420,560,490,750,700,730,800,920,980,1180,1040,740,990,1010,680,460,170,70,50,0,0,20,310,600,430,650,1030,670,740,980,730,1110,1080,1090,1030,880,1180,1030,640,440,340,110,30,90,0,90,160,310,400,740,680,750,820,980,630,770,830,760,910,760,650,550,570,550,220,240,100,50,20,60,90,220,450,600,780,800,1480,980,980,880,950,1210,930,1190,1160,1740,710,430,190,190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130]},{"name":"URL","color":"#2373DB","values":[70,70,10,10,40,130,180,260,390,490,570,500,480,540,820,840,820,760,940,690,660,530,260,110,50,10,0,0,0,120,210,240,380,410,690,670,790,790,710,730,1070,720,810,800,490,510,220,90,30,60,40,0,30,50,80,310,370,540,630,570,560,610,540,830,760,700,840,760,580,380,340,240,140,90,10,10,10,10,90,250,430,340,460,390,420,510,590,560,870,580,550,550,570,480,220,80,50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140]},{"name":"Groups","color":"#9ED448","values":[90,30,10,30,150,290,360,400,510,470,980,590,780,730,1060,640,840,600,620,1100,1260,1260,920,260,70,50,10,0,50,360,510,610,440,420,800,1210,980,680,490,550,960,670,840,870,1010,820,820,320,220,250,100,20,120,150,640,770,680,570,600,850,710,700,690,560,610,800,1090,650,550,910,910,580,390,140,80,20,20,80,160,250,530,510,550,630,940,510,1350,570,750,730,800,1140,1260,1080,900,300,270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,10,20,10,40,0,20,60,10,50,30,40,30,70,80,80,40,60,50,40,10,0,0,0,0,0,20,40,10,50,20,60,30,10,40,60,60,40,80,50,100,10,10,20,20,0,0,0,10,0,30,60,30,10,20,60,60,80,70,70,60,50,30,70,100,30,50,20,0,0,0,0,0,0,10,40,60,30,10,20,40,50,40,90,70,30,70,50,80,110,70,20,10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90]},{"name":"Search","color":"#F5BD25","values":[0,10,0,0,30,50,70,130,60,100,100,50,160,130,110,50,140,270,80,190,160,120,150,10,10,0,0,10,0,150,70,130,20,120,100,210,1180,110,140,20,100,160,40,150,100,170,50,30,10,0,0,0,0,80,220,90,140,120,60,190,90,110,90,40,50,210,120,110,120,40,100,100,10,0,20,0,40,0,180,110,100,70,120,50,120,80,40,180,110,220,80,180,40,180,110,30,10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60]},{"name":"Other","color":"#F79E39","values":[30,0,0,20,0,60,70,130,110,90,180,180,160,60,190,220,130,150,190,180,150,100,90,50,0,10,10,0,40,80,140,210,90,100,140,180,150,140,110,140,140,190,60,140,180,180,80,40,20,20,40,0,0,40,30,150,140,100,120,160,180,170,120,130,170,220,180,130,140,90,80,90,50,30,20,10,0,10,20,110,140,120,150,160,130,140,170,60,130,120,220,160,250,130,120,40,0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,10,0,0,0,10,10,0,10,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,10,20,0,0,30,10,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,20,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/09.json b/public/chartDummyData/views_zoom/2018-04/09.json new file mode 100644 index 000000000..496a37700 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1522972800000,1522976400000,1522980000000,1522983600000,1522987200000,1522990800000,1522994400000,1522998000000,1523001600000,1523005200000,1523008800000,1523012400000,1523016000000,1523019600000,1523023200000,1523026800000,1523030400000,1523034000000,1523037600000,1523041200000,1523044800000,1523048400000,1523052000000,1523055600000,1523059200000,1523062800000,1523066400000,1523070000000,1523073600000,1523077200000,1523080800000,1523084400000,1523088000000,1523091600000,1523095200000,1523098800000,1523102400000,1523106000000,1523109600000,1523113200000,1523116800000,1523120400000,1523124000000,1523127600000,1523131200000,1523134800000,1523138400000,1523142000000,1523145600000,1523149200000,1523152800000,1523156400000,1523160000000,1523163600000,1523167200000,1523170800000,1523174400000,1523178000000,1523181600000,1523185200000,1523188800000,1523192400000,1523196000000,1523199600000,1523203200000,1523206800000,1523210400000,1523214000000,1523217600000,1523221200000,1523224800000,1523228400000,1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,50,0,0,20,310,600,430,650,1030,670,740,980,730,1110,1080,1090,1030,880,1180,1030,640,440,340,110,30,90,0,90,160,310,400,740,680,750,820,980,630,770,830,760,910,760,650,550,570,550,220,240,100,50,20,60,90,220,450,600,780,800,1480,980,980,880,950,1210,930,1190,1160,1740,710,430,190,190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160]},{"name":"URL","color":"#2373DB","values":[50,10,0,0,0,120,210,240,380,410,690,670,790,790,710,730,1070,720,810,800,490,510,220,90,30,60,40,0,30,50,80,310,370,540,630,570,560,610,540,830,760,700,840,760,580,380,340,240,140,90,10,10,10,10,90,250,430,340,460,390,420,510,590,560,870,580,550,550,570,480,220,80,50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90]},{"name":"Groups","color":"#9ED448","values":[70,50,10,0,50,360,510,610,440,420,800,1210,980,680,490,550,960,670,840,870,1010,820,820,320,220,250,100,20,120,150,640,770,680,570,600,850,710,700,690,560,610,800,1090,650,550,910,910,580,390,140,80,20,20,80,160,250,530,510,550,630,940,510,1350,570,750,730,800,1140,1260,1080,900,300,270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,0,0,20,40,10,50,20,60,30,10,40,60,60,40,80,50,100,10,10,20,20,0,0,0,10,0,30,60,30,10,20,60,60,80,70,70,60,50,30,70,100,30,50,20,0,0,0,0,0,0,10,40,60,30,10,20,40,50,40,90,70,30,70,50,80,110,70,20,10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,0,150,70,130,20,120,100,210,1180,110,140,20,100,160,40,150,100,170,50,30,10,0,0,0,0,80,220,90,140,120,60,190,90,110,90,40,50,210,120,110,120,40,100,100,10,0,20,0,40,0,180,110,100,70,120,50,120,80,40,180,110,220,80,180,40,180,110,30,10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20]},{"name":"Other","color":"#F79E39","values":[0,10,10,0,40,80,140,210,90,100,140,180,150,140,110,140,140,190,60,140,180,180,80,40,20,20,40,0,0,40,30,150,140,100,120,160,180,170,120,130,170,220,180,130,140,90,80,90,50,30,20,10,0,10,20,110,140,120,150,160,130,140,170,60,130,120,220,160,250,130,120,40,0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,0,10,10,10,0,0,0,10,10,0,10,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,10,20,0,0,30,10,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,20,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/10.json b/public/chartDummyData/views_zoom/2018-04/10.json new file mode 100644 index 000000000..edae5c5c0 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523059200000,1523062800000,1523066400000,1523070000000,1523073600000,1523077200000,1523080800000,1523084400000,1523088000000,1523091600000,1523095200000,1523098800000,1523102400000,1523106000000,1523109600000,1523113200000,1523116800000,1523120400000,1523124000000,1523127600000,1523131200000,1523134800000,1523138400000,1523142000000,1523145600000,1523149200000,1523152800000,1523156400000,1523160000000,1523163600000,1523167200000,1523170800000,1523174400000,1523178000000,1523181600000,1523185200000,1523188800000,1523192400000,1523196000000,1523199600000,1523203200000,1523206800000,1523210400000,1523214000000,1523217600000,1523221200000,1523224800000,1523228400000,1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[110,30,90,0,90,160,310,400,740,680,750,820,980,630,770,830,760,910,760,650,550,570,550,220,240,100,50,20,60,90,220,450,600,780,800,1480,980,980,880,950,1210,930,1190,1160,1740,710,430,190,190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330]},{"name":"URL","color":"#2373DB","values":[30,60,40,0,30,50,80,310,370,540,630,570,560,610,540,830,760,700,840,760,580,380,340,240,140,90,10,10,10,10,90,250,430,340,460,390,420,510,590,560,870,580,550,550,570,480,220,80,50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70]},{"name":"Groups","color":"#9ED448","values":[220,250,100,20,120,150,640,770,680,570,600,850,710,700,690,560,610,800,1090,650,550,910,910,580,390,140,80,20,20,80,160,250,530,510,550,630,940,510,1350,570,750,730,800,1140,1260,1080,900,300,270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,10,0,30,60,30,10,20,60,60,80,70,70,60,50,30,70,100,30,50,20,0,0,0,0,0,0,10,40,60,30,10,20,40,50,40,90,70,30,70,50,80,110,70,20,10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,0,80,220,90,140,120,60,190,90,110,90,40,50,210,120,110,120,40,100,100,10,0,20,0,40,0,180,110,100,70,120,50,120,80,40,180,110,220,80,180,40,180,110,30,10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80]},{"name":"Other","color":"#F79E39","values":[20,20,40,0,0,40,30,150,140,100,120,160,180,170,120,130,170,220,180,130,140,90,80,90,50,30,20,10,0,10,20,110,140,120,150,160,130,140,170,60,130,120,220,160,250,130,120,40,0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,0,0,0,10,20,0,0,30,10,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,20,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/11.json b/public/chartDummyData/views_zoom/2018-04/11.json new file mode 100644 index 000000000..0a611be5a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523145600000,1523149200000,1523152800000,1523156400000,1523160000000,1523163600000,1523167200000,1523170800000,1523174400000,1523178000000,1523181600000,1523185200000,1523188800000,1523192400000,1523196000000,1523199600000,1523203200000,1523206800000,1523210400000,1523214000000,1523217600000,1523221200000,1523224800000,1523228400000,1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,100,50,20,60,90,220,450,600,780,800,1480,980,980,880,950,1210,930,1190,1160,1740,710,430,190,190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600]},{"name":"URL","color":"#2373DB","values":[140,90,10,10,10,10,90,250,430,340,460,390,420,510,590,560,870,580,550,550,570,480,220,80,50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290]},{"name":"Groups","color":"#9ED448","values":[390,140,80,20,20,80,160,250,530,510,550,630,940,510,1350,570,750,730,800,1140,1260,1080,900,300,270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,0,10,40,60,30,10,20,40,50,40,90,70,30,70,50,80,110,70,20,10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30]},{"name":"Search","color":"#F5BD25","values":[10,0,20,0,40,0,180,110,100,70,120,50,120,80,40,180,110,220,80,180,40,180,110,30,10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100]},{"name":"Other","color":"#F79E39","values":[50,30,20,10,0,10,20,110,140,120,150,160,130,140,170,60,130,120,220,160,250,130,120,40,0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,20,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/12.json b/public/chartDummyData/views_zoom/2018-04/12.json new file mode 100644 index 000000000..9a051517d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523232000000,1523235600000,1523239200000,1523242800000,1523246400000,1523250000000,1523253600000,1523257200000,1523260800000,1523264400000,1523268000000,1523271600000,1523275200000,1523278800000,1523282400000,1523286000000,1523289600000,1523293200000,1523296800000,1523300400000,1523304000000,1523307600000,1523311200000,1523314800000,1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,10,30,30,80,280,410,540,730,610,720,840,740,680,760,990,840,1000,1130,1170,920,990,390,130,150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250]},{"name":"URL","color":"#2373DB","values":[50,140,30,10,10,130,240,210,350,530,420,550,670,640,660,960,1080,1010,660,660,890,530,330,40,70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150]},{"name":"Groups","color":"#9ED448","values":[270,100,70,30,90,310,580,720,380,480,650,800,860,810,600,860,840,780,960,1400,1520,1130,640,340,140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,10,0,10,10,30,40,30,30,160,60,50,40,10,50,60,60,80,50,70,40,0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170]},{"name":"Search","color":"#F5BD25","values":[10,0,30,10,0,40,110,60,70,320,160,140,100,100,160,60,140,120,90,100,10,50,130,70,20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130]},{"name":"Other","color":"#F79E39","values":[0,50,0,10,10,100,100,140,210,130,240,230,200,80,190,210,190,140,190,160,200,160,130,20,0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/13.json b/public/chartDummyData/views_zoom/2018-04/13.json new file mode 100644 index 000000000..a7249ee1a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523318400000,1523322000000,1523325600000,1523329200000,1523332800000,1523336400000,1523340000000,1523343600000,1523347200000,1523350800000,1523354400000,1523358000000,1523361600000,1523365200000,1523368800000,1523372400000,1523376000000,1523379600000,1523383200000,1523386800000,1523390400000,1523394000000,1523397600000,1523401200000,1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,50,50,80,130,300,350,380,670,630,790,970,900,880,840,840,860,930,950,820,1080,740,420,230,100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130]},{"name":"URL","color":"#2373DB","values":[70,10,30,40,30,180,270,230,380,430,510,540,560,630,550,800,1020,1020,940,610,750,500,290,100,40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120]},{"name":"Groups","color":"#9ED448","values":[140,30,10,10,90,470,750,530,420,420,530,700,930,670,580,870,630,610,810,1180,890,1220,910,420,100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360]},{"name":"Channel","color":"#4fae4e","values":[0,50,0,0,0,20,30,40,30,60,10,30,40,40,60,30,20,80,50,90,60,120,110,10,10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30]},{"name":"Search","color":"#F5BD25","values":[20,20,40,0,10,180,110,150,110,80,80,330,70,110,90,80,260,100,230,170,60,150,30,10,20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0]},{"name":"Other","color":"#F79E39","values":[0,10,20,0,30,60,150,90,50,100,140,170,190,150,200,140,140,130,220,250,140,200,170,50,10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,10,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/14.json b/public/chartDummyData/views_zoom/2018-04/14.json new file mode 100644 index 000000000..614512cf9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523404800000,1523408400000,1523412000000,1523415600000,1523419200000,1523422800000,1523426400000,1523430000000,1523433600000,1523437200000,1523440800000,1523444400000,1523448000000,1523451600000,1523455200000,1523458800000,1523462400000,1523466000000,1523469600000,1523473200000,1523476800000,1523480400000,1523484000000,1523487600000,1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[100,60,10,20,60,380,400,660,680,680,1080,970,1050,740,760,1050,950,1070,960,1060,1130,690,500,130,120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170]},{"name":"URL","color":"#2373DB","values":[40,10,20,10,30,150,360,330,580,570,680,680,780,620,560,670,910,850,1060,980,860,460,250,140,20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170]},{"name":"Groups","color":"#9ED448","values":[100,80,90,10,130,340,380,610,390,410,610,580,830,620,570,690,620,800,760,1150,1410,980,760,160,60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,10,10,70,10,30,70,40,80,30,40,30,60,40,60,30,100,210,90,0,90,0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20]},{"name":"Search","color":"#F5BD25","values":[20,30,30,0,50,120,100,130,60,200,80,60,70,160,150,140,210,90,100,420,120,70,110,60,0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260]},{"name":"Other","color":"#F79E39","values":[10,10,10,30,10,50,90,220,70,140,110,220,320,100,140,160,150,220,140,240,150,160,70,0,20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/15.json b/public/chartDummyData/views_zoom/2018-04/15.json new file mode 100644 index 000000000..0a902e0d6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523491200000,1523494800000,1523498400000,1523502000000,1523505600000,1523509200000,1523512800000,1523516400000,1523520000000,1523523600000,1523527200000,1523530800000,1523534400000,1523538000000,1523541600000,1523545200000,1523548800000,1523552400000,1523556000000,1523559600000,1523563200000,1523566800000,1523570400000,1523574000000,1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,40,0,10,50,300,440,650,590,660,790,640,880,830,770,610,990,870,780,1070,1000,890,430,160,70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110]},{"name":"URL","color":"#2373DB","values":[20,20,0,0,20,130,280,390,420,510,670,740,590,750,670,700,860,850,840,1010,730,550,320,90,30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70]},{"name":"Groups","color":"#9ED448","values":[60,0,80,30,90,510,590,380,570,590,550,800,670,690,610,580,720,860,780,1080,990,1360,1000,280,150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330]},{"name":"Channel","color":"#4fae4e","values":[0,20,0,0,20,20,20,10,110,200,30,70,50,90,100,80,30,70,50,70,50,50,60,50,50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0]},{"name":"Search","color":"#F5BD25","values":[0,0,10,0,30,110,130,100,40,10,90,30,130,100,90,60,310,80,40,180,330,200,120,20,50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110]},{"name":"Other","color":"#F79E39","values":[20,10,0,10,30,60,140,120,130,120,130,250,230,170,180,110,250,230,150,210,190,290,70,40,30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,0,0,10,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/16.json b/public/chartDummyData/views_zoom/2018-04/16.json new file mode 100644 index 000000000..90a1a77d0 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523577600000,1523581200000,1523584800000,1523588400000,1523592000000,1523595600000,1523599200000,1523602800000,1523606400000,1523610000000,1523613600000,1523617200000,1523620800000,1523624400000,1523628000000,1523631600000,1523635200000,1523638800000,1523642400000,1523646000000,1523649600000,1523653200000,1523656800000,1523660400000,1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,40,50,20,30,270,400,510,770,630,730,840,900,780,1000,840,1070,1000,1170,800,720,620,430,330,120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260]},{"name":"URL","color":"#2373DB","values":[30,10,0,0,20,150,180,290,480,400,620,640,790,570,770,1060,1150,1220,880,1010,780,450,350,70,90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340]},{"name":"Groups","color":"#9ED448","values":[150,100,50,10,100,350,520,520,540,490,850,990,620,660,590,540,670,770,850,1200,810,890,640,390,180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260]},{"name":"Channel","color":"#4fae4e","values":[50,0,0,0,0,50,0,10,60,60,40,30,60,40,40,50,120,250,50,150,80,50,30,0,20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0]},{"name":"Search","color":"#F5BD25","values":[50,10,0,0,10,270,60,130,160,70,90,290,120,120,150,170,70,210,190,70,160,90,100,80,0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30]},{"name":"Other","color":"#F79E39","values":[30,10,0,0,40,70,180,120,150,170,120,140,160,170,120,150,120,160,210,150,220,150,70,70,70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,0,10,0,0,10,0,10,10,0,0,20,10,0,0,10,10,0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/17.json b/public/chartDummyData/views_zoom/2018-04/17.json new file mode 100644 index 000000000..78e42a043 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523664000000,1523667600000,1523671200000,1523674800000,1523678400000,1523682000000,1523685600000,1523689200000,1523692800000,1523696400000,1523700000000,1523703600000,1523707200000,1523710800000,1523714400000,1523718000000,1523721600000,1523725200000,1523728800000,1523732400000,1523736000000,1523739600000,1523743200000,1523746800000,1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,50,50,0,20,210,250,720,1000,830,860,1070,890,1160,910,900,800,900,1060,920,980,770,530,600,290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320]},{"name":"URL","color":"#2373DB","values":[90,10,0,0,0,150,270,310,540,540,1000,640,680,510,550,650,920,900,650,490,520,280,220,290,60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170]},{"name":"Groups","color":"#9ED448","values":[180,40,60,10,30,180,290,740,410,500,610,760,610,460,440,550,560,610,820,830,840,720,640,400,250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360]},{"name":"Channel","color":"#4fae4e","values":[20,10,0,0,0,0,10,0,150,30,60,40,60,50,60,70,30,80,80,90,70,60,30,30,20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60]},{"name":"Search","color":"#F5BD25","values":[0,20,0,0,20,50,60,60,70,100,120,300,330,230,160,120,120,190,290,170,140,200,90,100,20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20]},{"name":"Other","color":"#F79E39","values":[70,0,20,0,10,50,60,140,310,190,160,120,220,220,130,150,220,80,190,80,110,70,110,70,60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,0,20,10,10,0,30,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/18.json b/public/chartDummyData/views_zoom/2018-04/18.json new file mode 100644 index 000000000..1d08a583c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523750400000,1523754000000,1523757600000,1523761200000,1523764800000,1523768400000,1523772000000,1523775600000,1523779200000,1523782800000,1523786400000,1523790000000,1523793600000,1523797200000,1523800800000,1523804400000,1523808000000,1523811600000,1523815200000,1523818800000,1523822400000,1523826000000,1523829600000,1523833200000,1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,150,30,60,10,290,200,440,730,760,1270,1060,900,1200,900,940,1090,1180,890,1060,1100,860,420,250,70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420]},{"name":"URL","color":"#2373DB","values":[60,40,30,30,0,0,30,180,340,380,580,440,580,610,600,380,630,650,790,580,550,270,110,150,50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250]},{"name":"Groups","color":"#9ED448","values":[250,70,40,30,40,40,130,450,980,1250,620,800,890,670,710,590,760,530,720,1170,970,1260,770,500,120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450]},{"name":"Channel","color":"#4fae4e","values":[20,10,0,10,0,0,10,50,0,30,70,40,50,70,30,60,40,70,50,50,60,40,30,170,0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110]},{"name":"Search","color":"#F5BD25","values":[20,20,0,0,10,50,210,130,150,150,50,130,150,130,100,160,100,80,110,110,210,60,20,130,10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50]},{"name":"Other","color":"#F79E39","values":[60,10,0,0,0,40,40,150,140,150,160,190,200,200,150,170,110,180,220,100,190,210,100,0,20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/19.json b/public/chartDummyData/views_zoom/2018-04/19.json new file mode 100644 index 000000000..0b48b3b2d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523836800000,1523840400000,1523844000000,1523847600000,1523851200000,1523854800000,1523858400000,1523862000000,1523865600000,1523869200000,1523872800000,1523876400000,1523880000000,1523883600000,1523887200000,1523890800000,1523894400000,1523898000000,1523901600000,1523905200000,1523908800000,1523912400000,1523916000000,1523919600000,1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,60,0,0,70,300,470,540,700,590,830,780,1110,1060,950,1090,1050,1020,780,1200,1470,800,730,130,90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270]},{"name":"URL","color":"#2373DB","values":[50,10,50,20,20,100,300,330,420,500,600,790,770,870,780,920,1060,1080,910,760,820,470,260,120,50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120]},{"name":"Groups","color":"#9ED448","values":[120,60,70,20,60,330,530,590,550,490,600,1180,750,710,570,880,770,940,820,1440,1560,1070,790,360,70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,10,0,10,10,10,60,30,90,70,50,80,160,40,50,100,70,240,210,70,30,10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10]},{"name":"Search","color":"#F5BD25","values":[10,30,10,0,90,130,270,70,50,230,220,150,110,50,40,110,80,290,150,90,230,90,20,0,10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0]},{"name":"Other","color":"#F79E39","values":[20,0,0,10,10,40,100,120,150,70,150,170,220,140,110,130,90,290,120,230,220,220,130,30,10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/20.json b/public/chartDummyData/views_zoom/2018-04/20.json new file mode 100644 index 000000000..b8c9f2bfe --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1523923200000,1523926800000,1523930400000,1523934000000,1523937600000,1523941200000,1523944800000,1523948400000,1523952000000,1523955600000,1523959200000,1523962800000,1523966400000,1523970000000,1523973600000,1523977200000,1523980800000,1523984400000,1523988000000,1523991600000,1523995200000,1523998800000,1524002400000,1524006000000,1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[90,10,20,10,100,250,720,580,740,1080,830,1010,880,1360,700,850,1120,1180,1080,1350,1200,880,530,170,80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300]},{"name":"URL","color":"#2373DB","values":[50,0,0,50,30,140,360,310,520,640,560,780,760,620,560,760,1150,1170,870,850,1010,630,280,170,30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130]},{"name":"Groups","color":"#9ED448","values":[70,50,20,30,80,460,490,410,700,510,570,670,820,830,700,850,990,910,940,1330,1400,1390,730,200,50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,10,10,10,70,20,20,110,20,80,150,60,50,60,80,110,100,130,120,60,20,0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20]},{"name":"Search","color":"#F5BD25","values":[10,30,0,0,140,90,140,120,370,120,40,100,150,130,50,50,180,130,240,180,210,50,50,260,100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0]},{"name":"Other","color":"#F79E39","values":[10,10,0,10,20,100,100,190,140,110,180,190,210,170,130,110,190,100,220,250,300,160,40,20,10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,0,0,0,10,10,0,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/21.json b/public/chartDummyData/views_zoom/2018-04/21.json new file mode 100644 index 000000000..b489c638c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524009600000,1524013200000,1524016800000,1524020400000,1524024000000,1524027600000,1524031200000,1524034800000,1524038400000,1524042000000,1524045600000,1524049200000,1524052800000,1524056400000,1524060000000,1524063600000,1524067200000,1524070800000,1524074400000,1524078000000,1524081600000,1524085200000,1524088800000,1524092400000,1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[80,40,10,10,60,310,360,590,770,720,760,1260,1010,820,1000,920,1150,1170,940,1210,1030,820,530,110,200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280]},{"name":"URL","color":"#2373DB","values":[30,20,0,10,150,190,360,430,470,400,520,720,550,690,860,660,1240,1000,890,770,900,550,240,70,10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190]},{"name":"Groups","color":"#9ED448","values":[50,70,10,0,120,550,570,650,550,790,640,900,580,940,560,640,1080,760,710,920,1250,1010,920,330,150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,0,40,30,30,130,30,30,90,110,120,70,80,40,90,100,90,50,70,0,10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100]},{"name":"Search","color":"#F5BD25","values":[100,0,0,0,50,110,160,80,70,90,120,70,220,70,130,110,40,160,200,90,230,110,160,110,10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30]},{"name":"Other","color":"#F79E39","values":[10,10,0,0,20,90,40,110,130,140,150,160,210,130,150,140,170,110,240,240,120,180,110,0,20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/22.json b/public/chartDummyData/views_zoom/2018-04/22.json new file mode 100644 index 000000000..463d80c98 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524096000000,1524099600000,1524103200000,1524106800000,1524110400000,1524114000000,1524117600000,1524121200000,1524124800000,1524128400000,1524132000000,1524135600000,1524139200000,1524142800000,1524146400000,1524150000000,1524153600000,1524157200000,1524160800000,1524164400000,1524168000000,1524171600000,1524175200000,1524178800000,1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,40,30,60,110,370,530,540,770,650,880,1080,1150,1070,880,1130,1030,1230,1180,1310,1110,750,430,260,50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130]},{"name":"URL","color":"#2373DB","values":[10,0,50,0,60,160,230,310,700,460,590,760,820,770,990,740,930,970,1080,910,960,620,330,340,220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110]},{"name":"Groups","color":"#9ED448","values":[150,60,20,20,110,420,360,600,510,620,700,620,770,550,610,780,670,840,1060,1090,1190,1030,650,260,440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,0,20,0,30,30,60,50,40,90,60,100,0,50,60,110,30,70,90,80,40,0,10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,10,200,80,60,80,40,70,150,60,130,130,140,100,230,380,700,460,80,10,30,10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30]},{"name":"Other","color":"#F79E39","values":[20,0,10,10,10,90,160,130,110,230,180,150,220,170,170,140,200,110,230,220,180,140,90,40,20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,10,10,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/23.json b/public/chartDummyData/views_zoom/2018-04/23.json new file mode 100644 index 000000000..b64054ff1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524182400000,1524186000000,1524189600000,1524193200000,1524196800000,1524200400000,1524204000000,1524207600000,1524211200000,1524214800000,1524218400000,1524222000000,1524225600000,1524229200000,1524232800000,1524236400000,1524240000000,1524243600000,1524247200000,1524250800000,1524254400000,1524258000000,1524261600000,1524265200000,1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[50,50,60,20,70,400,370,700,850,600,920,890,1000,960,1130,1040,1200,780,940,970,930,790,480,320,140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280]},{"name":"URL","color":"#2373DB","values":[220,20,0,10,10,130,370,440,460,670,780,600,580,640,690,960,1160,1170,880,920,790,350,310,170,100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120]},{"name":"Groups","color":"#9ED448","values":[440,50,30,10,130,410,540,570,650,630,640,930,900,740,940,670,720,860,1000,770,930,1040,500,360,180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,0,0,20,10,30,90,40,10,90,100,90,30,10,50,40,40,80,30,50,60,0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20]},{"name":"Search","color":"#F5BD25","values":[10,20,0,0,40,180,110,160,110,100,70,90,70,220,60,260,110,180,260,170,210,110,30,20,0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70]},{"name":"Other","color":"#F79E39","values":[20,0,30,0,10,60,140,160,150,100,70,110,200,130,120,170,110,210,190,140,210,150,100,10,20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,30,0,10,0,0,0,10,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/24.json b/public/chartDummyData/views_zoom/2018-04/24.json new file mode 100644 index 000000000..12269129b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524268800000,1524272400000,1524276000000,1524279600000,1524283200000,1524286800000,1524290400000,1524294000000,1524297600000,1524301200000,1524304800000,1524308400000,1524312000000,1524315600000,1524319200000,1524322800000,1524326400000,1524330000000,1524333600000,1524337200000,1524340800000,1524344400000,1524348000000,1524351600000,1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[140,90,30,10,90,210,320,880,750,900,1510,1390,1180,1080,770,790,1360,1080,1250,920,850,730,660,420,320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200]},{"name":"URL","color":"#2373DB","values":[100,100,20,0,20,90,140,370,610,660,770,700,670,690,680,670,590,770,820,760,730,510,250,250,150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220]},{"name":"Groups","color":"#9ED448","values":[180,150,40,20,20,240,350,530,740,750,620,960,710,640,580,590,660,600,580,1010,760,800,770,450,420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,20,10,10,90,50,0,60,30,80,200,60,80,50,90,90,320,360,40,70,110,20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,80,40,250,150,110,160,320,120,110,160,150,140,130,120,140,110,160,70,60,50,0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0]},{"name":"Other","color":"#F79E39","values":[20,30,10,10,30,20,100,110,180,140,170,100,300,80,110,140,170,180,130,150,110,190,130,60,0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,50,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/25.json b/public/chartDummyData/views_zoom/2018-04/25.json new file mode 100644 index 000000000..b50208bac --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524355200000,1524358800000,1524362400000,1524366000000,1524369600000,1524373200000,1524376800000,1524380400000,1524384000000,1524387600000,1524391200000,1524394800000,1524398400000,1524402000000,1524405600000,1524409200000,1524412800000,1524416400000,1524420000000,1524423600000,1524427200000,1524430800000,1524434400000,1524438000000,1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,60,30,0,20,90,290,540,810,1120,1010,1100,1460,1220,1180,710,1090,1140,970,1340,920,1080,890,270,60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180]},{"name":"URL","color":"#2373DB","values":[150,10,50,30,10,70,100,230,460,520,760,560,710,700,620,720,690,800,670,490,730,640,310,120,10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120]},{"name":"Groups","color":"#9ED448","values":[420,80,20,20,40,50,290,510,630,660,770,620,570,520,900,640,630,740,670,790,1530,1240,740,430,80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190]},{"name":"Channel","color":"#4fae4e","values":[20,0,30,0,0,0,50,60,40,70,90,120,120,110,60,40,70,120,50,60,60,260,240,10,20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10]},{"name":"Search","color":"#F5BD25","values":[0,10,20,0,0,10,330,90,60,170,80,160,150,250,120,90,120,90,120,130,90,220,180,0,40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20]},{"name":"Other","color":"#F79E39","values":[0,30,10,0,10,60,50,100,170,80,160,170,120,140,160,210,190,130,180,240,180,190,140,80,10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,20,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/26.json b/public/chartDummyData/views_zoom/2018-04/26.json new file mode 100644 index 000000000..124d94dea --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524441600000,1524445200000,1524448800000,1524452400000,1524456000000,1524459600000,1524463200000,1524466800000,1524470400000,1524474000000,1524477600000,1524481200000,1524484800000,1524488400000,1524492000000,1524495600000,1524499200000,1524502800000,1524506400000,1524510000000,1524513600000,1524517200000,1524520800000,1524524400000,1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[60,20,40,20,90,360,460,580,770,620,810,940,1210,840,1040,1070,1180,980,1160,1370,1550,990,540,300,100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430]},{"name":"URL","color":"#2373DB","values":[10,0,0,0,80,100,220,400,320,670,570,610,560,790,700,720,1080,1090,820,840,730,440,300,130,30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150]},{"name":"Groups","color":"#9ED448","values":[80,10,20,10,150,520,380,440,620,690,590,900,720,690,600,660,890,930,1020,1330,1500,1220,1040,210,80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,10,20,20,40,30,60,80,80,80,60,110,110,50,40,60,40,50,70,100,40,20,50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30]},{"name":"Search","color":"#F5BD25","values":[40,10,0,0,50,280,50,190,70,40,310,40,150,180,110,350,160,260,390,150,140,140,110,0,0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110]},{"name":"Other","color":"#F79E39","values":[10,20,10,10,10,80,50,100,130,90,150,210,120,110,160,220,110,140,180,160,320,100,60,80,0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,20,0,20,0,0,10,0,0,30,0,10,0,0,0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/27.json b/public/chartDummyData/views_zoom/2018-04/27.json new file mode 100644 index 000000000..096eb1c87 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524528000000,1524531600000,1524535200000,1524538800000,1524542400000,1524546000000,1524549600000,1524553200000,1524556800000,1524560400000,1524564000000,1524567600000,1524571200000,1524574800000,1524578400000,1524582000000,1524585600000,1524589200000,1524592800000,1524596400000,1524600000000,1524603600000,1524607200000,1524610800000,1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[100,40,10,10,100,380,400,510,630,800,910,790,850,980,800,900,1110,1260,820,930,840,830,800,280,90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270]},{"name":"URL","color":"#2373DB","values":[30,0,0,10,10,110,420,280,430,490,650,830,790,610,590,650,1090,1100,1350,780,880,500,360,190,60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160]},{"name":"Groups","color":"#9ED448","values":[80,30,20,40,60,300,450,470,510,1250,780,620,910,640,860,550,710,750,990,1350,1340,910,850,600,360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530]},{"name":"Channel","color":"#4fae4e","values":[50,0,10,0,10,0,60,10,30,10,60,110,40,70,90,40,20,40,60,120,70,80,240,100,20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,10,90,220,60,120,40,140,140,250,350,60,90,50,70,210,220,80,90,70,30,0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70]},{"name":"Other","color":"#F79E39","values":[0,0,20,10,40,100,100,160,130,180,180,140,170,220,80,120,200,240,210,140,160,120,80,60,10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,30,0,0,0,0,30,0,0,0,30,0,20,0,0,10,0,0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/28.json b/public/chartDummyData/views_zoom/2018-04/28.json new file mode 100644 index 000000000..098e7832c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524614400000,1524618000000,1524621600000,1524625200000,1524628800000,1524632400000,1524636000000,1524639600000,1524643200000,1524646800000,1524650400000,1524654000000,1524657600000,1524661200000,1524664800000,1524668400000,1524672000000,1524675600000,1524679200000,1524682800000,1524686400000,1524690000000,1524693600000,1524697200000,1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[90,50,10,10,70,100,280,680,1000,1020,1070,950,950,810,930,880,1140,1200,1510,1490,1170,1210,440,130,70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240]},{"name":"URL","color":"#2373DB","values":[60,30,20,30,80,10,100,290,490,570,570,450,580,570,470,660,700,670,820,730,570,650,90,110,30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150]},{"name":"Groups","color":"#9ED448","values":[360,80,40,20,20,110,190,390,480,560,920,550,620,480,610,500,590,780,670,1090,1270,1150,940,310,140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,10,70,80,220,70,120,120,60,90,160,30,20,80,190,60,260,80,30,20,10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,10,110,130,90,90,310,70,150,150,100,100,60,220,250,110,220,140,40,50,30,10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50]},{"name":"Other","color":"#F79E39","values":[10,10,20,10,0,20,60,160,200,140,190,120,150,110,110,160,120,90,210,180,200,200,50,70,10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,10,10,20,0,10,20,30,20,0,20,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/29.json b/public/chartDummyData/views_zoom/2018-04/29.json new file mode 100644 index 000000000..65746b271 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524700800000,1524704400000,1524708000000,1524711600000,1524715200000,1524718800000,1524722400000,1524726000000,1524729600000,1524733200000,1524736800000,1524740400000,1524744000000,1524747600000,1524751200000,1524754800000,1524758400000,1524762000000,1524765600000,1524769200000,1524772800000,1524776400000,1524780000000,1524783600000,1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,40,20,40,190,270,590,650,1120,910,1050,900,890,720,980,930,1170,1190,1030,1360,1510,690,420,280,110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160]},{"name":"URL","color":"#2373DB","values":[30,30,40,70,30,110,250,150,490,690,500,560,660,670,680,990,850,1080,1020,940,690,530,280,120,20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20]},{"name":"Groups","color":"#9ED448","values":[140,60,30,10,30,370,550,590,570,650,1460,720,690,730,1000,610,530,650,780,1070,1670,1280,780,200,110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,0,0,10,110,140,200,20,30,40,60,60,170,170,180,60,80,110,80,60,20,30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,20,120,60,370,100,120,80,30,150,130,90,80,110,300,230,230,80,80,30,70,10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10]},{"name":"Other","color":"#F79E39","values":[10,10,0,10,40,90,50,90,160,180,110,190,170,170,110,120,170,230,150,240,210,170,130,120,20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,10,10,0,10,0,0,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-04/30.json b/public/chartDummyData/views_zoom/2018-04/30.json new file mode 100644 index 000000000..7fc2a14af --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-04/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524787200000,1524790800000,1524794400000,1524798000000,1524801600000,1524805200000,1524808800000,1524812400000,1524816000000,1524819600000,1524823200000,1524826800000,1524830400000,1524834000000,1524837600000,1524841200000,1524844800000,1524848400000,1524852000000,1524855600000,1524859200000,1524862800000,1524866400000,1524870000000,1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[110,70,0,0,140,210,410,780,530,820,880,1180,1010,1060,1080,800,990,800,1050,1160,1680,1250,410,200,70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310]},{"name":"URL","color":"#2373DB","values":[20,20,10,10,30,140,320,410,610,590,670,870,730,700,830,840,1020,1040,990,860,770,390,200,220,70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190]},{"name":"Groups","color":"#9ED448","values":[110,50,20,0,90,550,620,590,570,580,570,670,890,770,600,620,750,1150,840,850,1030,970,730,520,120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,0,10,0,80,20,80,60,30,40,20,100,70,30,40,60,180,170,100,30,60,20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10]},{"name":"Search","color":"#F5BD25","values":[10,0,20,0,80,60,100,100,140,60,180,80,90,110,50,260,350,250,180,170,110,50,40,0,10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10]},{"name":"Other","color":"#F79E39","values":[20,30,0,10,20,100,130,160,200,160,180,220,190,220,70,80,170,180,280,140,230,140,60,30,20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,0,0,0,0,10,10,0,50,20,30,10,0,0,10,0,0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/01.json b/public/chartDummyData/views_zoom/2018-05/01.json new file mode 100644 index 000000000..37764f5bb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524873600000,1524877200000,1524880800000,1524884400000,1524888000000,1524891600000,1524895200000,1524898800000,1524902400000,1524906000000,1524909600000,1524913200000,1524916800000,1524920400000,1524924000000,1524927600000,1524931200000,1524934800000,1524938400000,1524942000000,1524945600000,1524949200000,1524952800000,1524956400000,1524960000000,1524963600000,1524967200000,1524970800000,1524974400000,1524978000000,1524981600000,1524985200000,1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,50,50,80,60,150,480,640,1310,870,880,960,900,1250,920,1040,660,900,930,660,750,860,550,180,0,0,0,0,0,0,0,0,210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230]},{"name":"URL","color":"#2373DB","values":[70,10,0,10,10,80,210,250,390,560,650,730,860,710,750,590,800,930,490,580,670,610,320,120,0,0,0,0,0,0,0,0,70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180]},{"name":"Groups","color":"#9ED448","values":[120,180,80,10,100,250,610,710,410,560,600,810,650,590,720,660,620,520,1090,710,870,820,770,190,0,0,0,0,0,0,0,0,100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400]},{"name":"Channel","color":"#4fae4e","values":[20,0,10,50,20,40,10,70,30,50,30,20,30,40,110,210,50,40,60,80,30,90,70,10,0,0,0,0,0,0,0,0,10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10]},{"name":"Search","color":"#F5BD25","values":[10,40,0,0,110,40,40,70,100,80,160,50,40,80,30,110,90,80,50,50,130,50,90,20,0,0,0,0,0,0,0,0,0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10]},{"name":"Other","color":"#F79E39","values":[20,10,0,10,10,30,120,120,130,130,240,110,210,150,120,170,190,140,180,110,150,70,60,40,0,0,0,0,0,0,0,0,90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,20,0,0,10,10,10,0,10,10,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/02.json b/public/chartDummyData/views_zoom/2018-05/02.json new file mode 100644 index 000000000..409f46ee7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1524988800000,1524992400000,1524996000000,1524999600000,1525003200000,1525006800000,1525010400000,1525014000000,1525017600000,1525021200000,1525024800000,1525028400000,1525032000000,1525035600000,1525039200000,1525042800000,1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[210,280,320,960,1190,860,1070,760,960,1040,1260,1340,1010,950,570,430,270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530]},{"name":"URL","color":"#2373DB","values":[70,40,260,320,490,420,520,730,680,900,910,770,600,650,280,150,40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190]},{"name":"Groups","color":"#9ED448","values":[100,160,380,650,830,690,840,740,640,570,810,1100,1310,1100,1100,460,200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570]},{"name":"Channel","color":"#4fae4e","values":[10,20,50,80,140,40,290,50,10,60,60,30,60,240,130,30,10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60]},{"name":"Search","color":"#F5BD25","values":[0,50,30,170,190,230,110,100,50,150,100,100,140,100,50,110,0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10]},{"name":"Other","color":"#F79E39","values":[90,130,80,120,170,190,140,160,130,140,110,180,120,150,50,30,20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60]},{"name":"PM","color":"#E65850","values":[0,10,0,20,0,0,0,0,10,10,40,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/03.json b/public/chartDummyData/views_zoom/2018-05/03.json new file mode 100644 index 000000000..0c242b896 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525046400000,1525050000000,1525053600000,1525057200000,1525060800000,1525064400000,1525068000000,1525071600000,1525075200000,1525078800000,1525082400000,1525086000000,1525089600000,1525093200000,1525096800000,1525100400000,1525104000000,1525107600000,1525111200000,1525114800000,1525118400000,1525122000000,1525125600000,1525129200000,1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,70,50,0,70,210,420,450,860,990,1200,1180,1040,1220,980,1220,1160,840,990,1000,1110,870,500,270,220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270]},{"name":"URL","color":"#2373DB","values":[40,10,0,10,0,30,160,370,790,800,1020,840,850,630,620,800,1020,880,850,690,800,510,270,160,70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150]},{"name":"Groups","color":"#9ED448","values":[200,60,10,40,40,130,330,500,520,770,620,800,730,740,750,660,570,900,1010,960,930,1290,890,530,630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550]},{"name":"Channel","color":"#4fae4e","values":[10,50,0,0,0,0,40,50,70,40,90,90,90,100,20,30,60,50,80,80,80,30,10,10,10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20]},{"name":"Search","color":"#F5BD25","values":[0,0,0,40,10,30,150,150,150,220,100,170,370,200,130,50,90,60,350,70,130,70,70,70,20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0]},{"name":"Other","color":"#F79E39","values":[20,20,10,30,10,20,50,100,140,140,160,150,160,120,100,190,160,210,240,200,140,140,140,90,50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,10,0,20,0,10,10,0,0,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/04.json b/public/chartDummyData/views_zoom/2018-05/04.json new file mode 100644 index 000000000..90a7f99cb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525132800000,1525136400000,1525140000000,1525143600000,1525147200000,1525150800000,1525154400000,1525158000000,1525161600000,1525165200000,1525168800000,1525172400000,1525176000000,1525179600000,1525183200000,1525186800000,1525190400000,1525194000000,1525197600000,1525201200000,1525204800000,1525208400000,1525212000000,1525215600000,1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,90,150,10,40,50,260,540,850,1050,1020,940,1220,910,900,820,950,1140,1040,1290,890,1070,340,240,550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240]},{"name":"URL","color":"#2373DB","values":[70,0,0,0,10,0,130,220,430,550,610,490,490,470,550,660,700,530,720,720,600,590,230,150,50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100]},{"name":"Groups","color":"#9ED448","values":[630,130,10,0,10,90,180,590,730,800,830,800,640,680,680,620,810,770,830,1160,1000,1290,780,440,110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380]},{"name":"Channel","color":"#4fae4e","values":[10,10,20,0,0,10,0,40,60,70,50,140,30,100,50,110,30,70,110,60,90,210,40,10,0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30]},{"name":"Search","color":"#F5BD25","values":[20,50,30,10,70,110,10,140,70,80,50,140,70,370,240,40,70,110,110,80,160,80,80,50,30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10]},{"name":"Other","color":"#F79E39","values":[50,30,10,50,0,20,80,180,150,130,140,240,170,110,150,110,100,140,160,180,160,80,50,50,20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,20,0,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/05.json b/public/chartDummyData/views_zoom/2018-05/05.json new file mode 100644 index 000000000..d41fff51d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525219200000,1525222800000,1525226400000,1525230000000,1525233600000,1525237200000,1525240800000,1525244400000,1525248000000,1525251600000,1525255200000,1525258800000,1525262400000,1525266000000,1525269600000,1525273200000,1525276800000,1525280400000,1525284000000,1525287600000,1525291200000,1525294800000,1525298400000,1525302000000,1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[550,180,20,10,80,340,370,560,530,920,870,1300,910,920,820,870,840,950,950,1390,1150,760,640,160,120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220]},{"name":"URL","color":"#2373DB","values":[50,0,40,10,20,80,200,390,320,410,610,640,610,400,610,1020,1030,1410,930,890,680,630,330,20,100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140]},{"name":"Groups","color":"#9ED448","values":[110,140,40,10,140,290,450,440,780,750,590,550,1220,780,780,980,640,800,910,970,1450,1550,980,200,30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230]},{"name":"Channel","color":"#4fae4e","values":[0,30,0,0,0,10,20,10,80,190,50,100,20,30,60,80,90,30,50,60,190,60,20,20,10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10]},{"name":"Search","color":"#F5BD25","values":[30,100,0,0,0,30,70,80,170,90,70,210,290,140,160,110,80,110,370,40,390,20,60,10,0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60]},{"name":"Other","color":"#F79E39","values":[20,40,0,0,10,110,70,150,190,130,130,160,200,150,150,160,190,120,140,260,190,210,80,90,10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/06.json b/public/chartDummyData/views_zoom/2018-05/06.json new file mode 100644 index 000000000..6c7657582 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525305600000,1525309200000,1525312800000,1525316400000,1525320000000,1525323600000,1525327200000,1525330800000,1525334400000,1525338000000,1525341600000,1525345200000,1525348800000,1525352400000,1525356000000,1525359600000,1525363200000,1525366800000,1525370400000,1525374000000,1525377600000,1525381200000,1525384800000,1525388400000,1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,50,0,10,40,320,540,770,1260,950,730,880,940,850,1040,1560,780,840,1160,1200,1160,870,420,310,110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360]},{"name":"URL","color":"#2373DB","values":[100,10,30,10,10,200,220,380,450,460,680,670,710,640,830,730,840,850,1020,1000,830,370,220,190,40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130]},{"name":"Groups","color":"#9ED448","values":[30,70,40,40,70,350,620,790,570,550,730,840,700,740,620,760,910,960,820,940,1810,1370,900,360,100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,0,40,60,60,30,30,20,50,70,30,30,50,60,100,40,50,90,60,70,10,10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30]},{"name":"Search","color":"#F5BD25","values":[0,20,10,10,30,100,180,160,100,130,110,180,130,120,150,180,100,110,130,150,130,160,40,10,10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30]},{"name":"Other","color":"#F79E39","values":[10,10,10,0,10,10,90,60,110,180,160,210,200,170,120,190,250,180,170,240,180,180,110,70,50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,0,40,0,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/07.json b/public/chartDummyData/views_zoom/2018-05/07.json new file mode 100644 index 000000000..1ca886f1f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525392000000,1525395600000,1525399200000,1525402800000,1525406400000,1525410000000,1525413600000,1525417200000,1525420800000,1525424400000,1525428000000,1525431600000,1525435200000,1525438800000,1525442400000,1525446000000,1525449600000,1525453200000,1525456800000,1525460400000,1525464000000,1525467600000,1525471200000,1525474800000,1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[110,30,30,10,70,290,540,520,870,940,720,980,800,710,1020,1040,940,980,780,1150,1030,780,710,230,150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410]},{"name":"URL","color":"#2373DB","values":[40,10,0,20,50,230,370,360,400,460,770,620,680,670,690,730,1010,1050,1050,750,690,540,180,180,90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150]},{"name":"Groups","color":"#9ED448","values":[100,40,10,30,80,410,520,780,490,710,580,860,780,1130,620,730,880,900,860,1080,1320,1200,960,400,100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,0,40,10,50,20,30,10,110,70,50,40,50,30,50,40,40,60,10,30,10,0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20]},{"name":"Search","color":"#F5BD25","values":[10,110,0,0,90,150,150,100,80,190,270,100,60,100,120,60,170,100,40,200,150,70,10,10,0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20]},{"name":"Other","color":"#F79E39","values":[50,0,10,0,40,100,90,130,160,230,200,180,170,240,290,90,220,190,140,280,140,120,100,20,60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,10,0,0,0,0,0,0,20,10,10,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/08.json b/public/chartDummyData/views_zoom/2018-05/08.json new file mode 100644 index 000000000..fed3b4160 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525478400000,1525482000000,1525485600000,1525489200000,1525492800000,1525496400000,1525500000000,1525503600000,1525507200000,1525510800000,1525514400000,1525518000000,1525521600000,1525525200000,1525528800000,1525532400000,1525536000000,1525539600000,1525543200000,1525546800000,1525550400000,1525554000000,1525557600000,1525561200000,1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,40,80,20,70,190,270,780,880,730,740,990,1020,1230,890,890,910,960,1200,790,830,740,520,530,260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250]},{"name":"URL","color":"#2373DB","values":[90,30,0,10,10,70,190,310,600,740,670,750,800,650,640,750,830,730,750,580,660,520,330,190,160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120]},{"name":"Groups","color":"#9ED448","values":[100,90,10,10,30,210,180,570,860,870,880,1050,720,650,530,710,830,770,870,840,910,1100,680,570,550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330]},{"name":"Channel","color":"#4fae4e","values":[0,0,10,0,0,10,0,20,90,20,130,100,20,170,40,20,110,50,100,110,50,40,80,60,10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20]},{"name":"Search","color":"#F5BD25","values":[0,10,10,0,10,90,150,180,120,70,170,260,140,180,100,120,100,70,40,150,90,200,160,10,70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30]},{"name":"Other","color":"#F79E39","values":[60,0,10,0,10,60,90,210,70,130,140,140,210,80,180,150,220,100,190,170,150,110,70,60,90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/09.json b/public/chartDummyData/views_zoom/2018-05/09.json new file mode 100644 index 000000000..f91241e4d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525564800000,1525568400000,1525572000000,1525575600000,1525579200000,1525582800000,1525586400000,1525590000000,1525593600000,1525597200000,1525600800000,1525604400000,1525608000000,1525611600000,1525615200000,1525618800000,1525622400000,1525626000000,1525629600000,1525633200000,1525636800000,1525640400000,1525644000000,1525647600000,1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,80,70,60,40,60,110,300,720,1080,740,1360,980,1090,1070,750,960,780,1210,1200,1060,1120,620,270,160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220]},{"name":"URL","color":"#2373DB","values":[160,10,140,30,10,40,30,110,360,690,650,460,510,460,720,490,650,740,860,870,680,700,280,150,80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260]},{"name":"Groups","color":"#9ED448","values":[550,200,80,0,40,50,220,450,420,670,630,910,720,770,790,710,740,770,930,1050,1270,1250,1000,550,170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,0,10,50,0,0,30,20,40,40,120,100,130,40,70,70,100,50,190,100,50,20,20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20]},{"name":"Search","color":"#F5BD25","values":[70,180,0,0,0,0,200,140,70,360,170,170,260,120,80,80,110,170,160,80,90,120,80,0,0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80]},{"name":"Other","color":"#F79E39","values":[90,30,30,0,0,10,10,100,70,150,120,190,160,230,110,110,180,170,200,160,250,170,80,90,10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,10,10,10,0,10,20,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/10.json b/public/chartDummyData/views_zoom/2018-05/10.json new file mode 100644 index 000000000..908c5d21b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525651200000,1525654800000,1525658400000,1525662000000,1525665600000,1525669200000,1525672800000,1525676400000,1525680000000,1525683600000,1525687200000,1525690800000,1525694400000,1525698000000,1525701600000,1525705200000,1525708800000,1525712400000,1525716000000,1525719600000,1525723200000,1525726800000,1525730400000,1525734000000,1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,50,0,10,90,470,370,770,730,870,850,940,1130,980,940,1090,1190,920,970,1320,1470,1020,550,240,80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240]},{"name":"URL","color":"#2373DB","values":[80,50,20,0,20,180,250,320,480,510,630,930,680,650,800,810,1100,1120,840,780,670,420,330,100,70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170]},{"name":"Groups","color":"#9ED448","values":[170,100,10,30,160,550,420,530,540,510,750,980,960,970,1050,760,1010,670,1230,1300,1410,1270,830,380,50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,10,20,0,40,30,30,40,70,130,30,110,90,30,110,80,40,120,10,30,0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50]},{"name":"Search","color":"#F5BD25","values":[0,10,0,10,100,60,120,30,90,150,230,140,160,200,180,100,150,490,90,90,140,70,50,10,0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60]},{"name":"Other","color":"#F79E39","values":[10,0,10,0,50,50,80,80,110,150,160,200,270,100,90,190,230,190,160,230,230,230,80,0,20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,10,0,30,10,10,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/11.json b/public/chartDummyData/views_zoom/2018-05/11.json new file mode 100644 index 000000000..a4edd6358 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525737600000,1525741200000,1525744800000,1525748400000,1525752000000,1525755600000,1525759200000,1525762800000,1525766400000,1525770000000,1525773600000,1525777200000,1525780800000,1525784400000,1525788000000,1525791600000,1525795200000,1525798800000,1525802400000,1525806000000,1525809600000,1525813200000,1525816800000,1525820400000,1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[80,40,10,110,60,250,490,490,740,610,690,850,920,870,1040,940,690,1010,870,1340,1210,790,650,220,70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210]},{"name":"URL","color":"#2373DB","values":[70,10,10,10,60,100,490,370,460,560,630,780,630,870,840,730,1070,890,1100,910,600,500,300,140,30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110]},{"name":"Groups","color":"#9ED448","values":[50,10,10,40,50,230,560,470,500,630,610,820,750,670,730,900,850,570,1130,1180,1380,1210,890,230,40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260]},{"name":"Channel","color":"#4fae4e","values":[0,10,0,10,10,40,30,40,30,50,40,40,80,50,60,60,20,110,30,40,70,120,70,10,0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,10,120,290,310,60,100,90,120,80,70,90,280,100,80,100,160,160,10,130,60,0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0]},{"name":"Other","color":"#F79E39","values":[20,0,0,0,50,50,160,140,130,170,100,110,190,260,140,140,240,230,230,200,260,160,170,190,80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,10,0,10,0,20,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/12.json b/public/chartDummyData/views_zoom/2018-05/12.json new file mode 100644 index 000000000..a1b25ec65 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525824000000,1525827600000,1525831200000,1525834800000,1525838400000,1525842000000,1525845600000,1525849200000,1525852800000,1525856400000,1525860000000,1525863600000,1525867200000,1525870800000,1525874400000,1525878000000,1525881600000,1525885200000,1525888800000,1525892400000,1525896000000,1525899600000,1525903200000,1525906800000,1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,50,10,10,60,270,540,450,600,840,990,1070,850,790,920,990,1080,1150,1040,1280,1130,890,580,360,20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220]},{"name":"URL","color":"#2373DB","values":[30,10,50,40,20,80,350,330,330,400,550,570,560,730,550,880,1010,850,1020,830,940,540,270,130,40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120]},{"name":"Groups","color":"#9ED448","values":[40,90,20,0,60,500,430,640,550,630,600,650,630,770,540,760,550,1190,1040,1260,1360,1540,650,340,240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,20,60,20,40,60,60,40,50,190,20,20,110,50,120,20,100,50,90,150,30,10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,0,190,140,210,90,80,150,120,70,230,60,220,80,60,170,150,90,50,20,30,10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20]},{"name":"Other","color":"#F79E39","values":[80,0,0,0,30,100,130,150,160,110,180,230,200,190,120,200,240,140,170,210,210,220,90,80,10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/13.json b/public/chartDummyData/views_zoom/2018-05/13.json new file mode 100644 index 000000000..291796b2b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525910400000,1525914000000,1525917600000,1525921200000,1525924800000,1525928400000,1525932000000,1525935600000,1525939200000,1525942800000,1525946400000,1525950000000,1525953600000,1525957200000,1525960800000,1525964400000,1525968000000,1525971600000,1525975200000,1525978800000,1525982400000,1525986000000,1525989600000,1525993200000,1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[20,20,10,50,80,240,630,400,850,660,740,860,920,840,900,870,930,1150,1240,1470,1120,820,550,410,100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100]},{"name":"URL","color":"#2373DB","values":[40,20,0,0,10,80,260,400,440,530,820,620,640,800,790,800,970,990,980,930,700,620,260,150,70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80]},{"name":"Groups","color":"#9ED448","values":[240,10,0,10,170,310,420,620,490,410,800,820,670,660,630,850,760,860,780,1070,1430,1590,980,330,140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720]},{"name":"Channel","color":"#4fae4e","values":[10,10,10,10,10,10,10,10,50,20,40,30,90,80,250,80,60,80,60,100,60,90,100,20,10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,0,300,70,100,120,110,70,100,120,120,160,100,290,160,110,140,80,490,80,20,110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20]},{"name":"Other","color":"#F79E39","values":[10,10,0,0,20,60,120,120,180,130,140,200,150,170,140,110,160,120,170,230,240,230,170,40,30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,20,0,0,0,20,10,0,0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/14.json b/public/chartDummyData/views_zoom/2018-05/14.json new file mode 100644 index 000000000..e9525b01c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1525996800000,1526000400000,1526004000000,1526007600000,1526011200000,1526014800000,1526018400000,1526022000000,1526025600000,1526029200000,1526032800000,1526036400000,1526040000000,1526043600000,1526047200000,1526050800000,1526054400000,1526058000000,1526061600000,1526065200000,1526068800000,1526072400000,1526076000000,1526079600000,1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[100,20,10,20,50,450,450,610,680,900,800,940,900,920,830,980,1120,1150,1010,1150,900,960,570,250,90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150]},{"name":"URL","color":"#2373DB","values":[70,0,10,10,50,140,330,290,410,600,580,630,730,820,590,740,1090,1080,980,1030,680,390,300,120,60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120]},{"name":"Groups","color":"#9ED448","values":[140,50,20,30,140,220,520,600,610,630,830,820,1020,750,570,810,1020,1010,890,1090,910,850,630,330,240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,10,10,10,0,60,40,50,50,50,130,50,60,90,50,40,30,70,50,40,40,20,10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10]},{"name":"Search","color":"#F5BD25","values":[110,0,60,0,230,120,270,450,360,260,70,110,110,110,120,150,70,220,70,70,140,290,210,30,0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20]},{"name":"Other","color":"#F79E39","values":[30,0,10,0,20,180,110,120,180,110,160,150,130,150,150,170,320,170,160,130,120,170,60,70,20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,10,20,20,0,10,0,10,0,0,20,10,20,30,0,0,10,10,0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/15.json b/public/chartDummyData/views_zoom/2018-05/15.json new file mode 100644 index 000000000..4c91f3e2a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526083200000,1526086800000,1526090400000,1526094000000,1526097600000,1526101200000,1526104800000,1526108400000,1526112000000,1526115600000,1526119200000,1526122800000,1526126400000,1526130000000,1526133600000,1526137200000,1526140800000,1526144400000,1526148000000,1526151600000,1526155200000,1526158800000,1526162400000,1526166000000,1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[90,30,10,90,90,230,320,680,810,940,980,1040,850,990,1110,1040,920,1200,1090,760,1020,630,580,220,360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150]},{"name":"URL","color":"#2373DB","values":[60,40,0,20,40,30,160,300,680,920,820,640,600,690,530,830,790,760,790,890,560,440,410,260,70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130]},{"name":"Groups","color":"#9ED448","values":[240,50,10,30,90,130,340,430,570,560,580,830,900,700,560,590,700,860,830,850,760,880,1120,770,280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,0,0,20,10,20,100,0,40,20,60,60,70,40,60,80,70,50,90,40,30,20,30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,10,50,50,110,30,170,60,10,110,90,420,40,60,450,180,180,90,160,100,80,50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40]},{"name":"Other","color":"#F79E39","values":[20,20,10,10,20,70,60,60,150,120,150,170,170,190,160,120,150,170,190,140,100,160,120,80,50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,30,10,10,20,10,10,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/16.json b/public/chartDummyData/views_zoom/2018-05/16.json new file mode 100644 index 000000000..94aa4d848 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526169600000,1526173200000,1526176800000,1526180400000,1526184000000,1526187600000,1526191200000,1526194800000,1526198400000,1526202000000,1526205600000,1526209200000,1526212800000,1526216400000,1526220000000,1526223600000,1526227200000,1526230800000,1526234400000,1526238000000,1526241600000,1526245200000,1526248800000,1526252400000,1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[360,200,80,20,60,50,190,430,550,990,810,850,1220,1240,1040,910,1080,960,960,1200,1160,1030,580,240,160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570]},{"name":"URL","color":"#2373DB","values":[70,30,60,30,0,0,100,160,390,680,830,480,570,370,680,810,770,800,720,840,580,610,360,170,50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160]},{"name":"Groups","color":"#9ED448","values":[280,130,30,20,10,70,200,400,640,530,830,720,610,910,730,650,930,930,1020,1130,1220,1010,1070,340,80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630]},{"name":"Channel","color":"#4fae4e","values":[30,10,0,0,10,10,10,50,20,50,30,90,100,70,30,50,70,30,40,50,80,50,120,50,0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0]},{"name":"Search","color":"#F5BD25","values":[50,30,10,0,10,20,20,250,120,270,140,160,100,80,120,120,270,160,50,120,400,80,10,60,0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30]},{"name":"Other","color":"#F79E39","values":[50,20,0,10,0,0,60,140,170,170,200,120,160,100,280,110,150,230,90,130,160,180,70,0,30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,20,0,10,0,20,10,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/17.json b/public/chartDummyData/views_zoom/2018-05/17.json new file mode 100644 index 000000000..540cc09df --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526256000000,1526259600000,1526263200000,1526266800000,1526270400000,1526274000000,1526277600000,1526281200000,1526284800000,1526288400000,1526292000000,1526295600000,1526299200000,1526302800000,1526306400000,1526310000000,1526313600000,1526317200000,1526320800000,1526324400000,1526328000000,1526331600000,1526335200000,1526338800000,1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,140,0,30,170,370,360,450,610,890,830,780,880,910,810,1020,1060,1210,1050,1220,1270,880,510,210,80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320]},{"name":"URL","color":"#2373DB","values":[50,0,150,60,20,150,150,200,410,400,510,590,590,570,600,770,1000,930,1140,890,670,490,340,110,80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230]},{"name":"Groups","color":"#9ED448","values":[80,40,20,20,100,470,570,390,680,790,760,490,760,1020,500,560,880,820,1090,1180,1250,950,490,260,210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430]},{"name":"Channel","color":"#4fae4e","values":[0,10,20,0,20,60,40,0,20,80,70,110,70,0,70,30,50,130,30,60,60,70,20,20,10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0]},{"name":"Search","color":"#F5BD25","values":[0,0,10,0,30,30,170,70,70,80,160,180,250,190,90,160,210,80,170,180,150,40,10,0,30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20]},{"name":"Other","color":"#F79E39","values":[30,20,30,10,30,110,100,170,70,150,180,100,120,110,140,160,130,140,200,170,250,140,70,30,0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/18.json b/public/chartDummyData/views_zoom/2018-05/18.json new file mode 100644 index 000000000..1261e3caf --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526342400000,1526346000000,1526349600000,1526353200000,1526356800000,1526360400000,1526364000000,1526367600000,1526371200000,1526374800000,1526378400000,1526382000000,1526385600000,1526389200000,1526392800000,1526396400000,1526400000000,1526403600000,1526407200000,1526410800000,1526414400000,1526418000000,1526421600000,1526425200000,1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[80,40,20,10,170,500,430,760,890,620,700,910,1050,980,910,980,1220,1020,1100,1310,1200,540,420,220,40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170]},{"name":"URL","color":"#2373DB","values":[80,40,100,0,30,80,350,270,420,450,530,690,850,700,560,560,880,680,890,980,790,620,270,120,0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120]},{"name":"Groups","color":"#9ED448","values":[210,40,20,20,80,190,450,630,490,750,640,950,830,700,710,1030,1140,970,730,1030,1280,1110,620,180,280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,10,20,20,10,40,70,70,40,30,50,40,70,90,50,120,90,20,50,30,20,30,20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40]},{"name":"Search","color":"#F5BD25","values":[30,0,0,10,20,70,60,90,140,90,150,160,120,80,100,110,200,100,140,170,110,110,40,20,20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30]},{"name":"Other","color":"#F79E39","values":[0,10,0,0,20,100,160,180,110,240,170,170,150,200,190,170,200,120,210,200,170,170,120,50,30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,30,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/19.json b/public/chartDummyData/views_zoom/2018-05/19.json new file mode 100644 index 000000000..1cd725ceb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526428800000,1526432400000,1526436000000,1526439600000,1526443200000,1526446800000,1526450400000,1526454000000,1526457600000,1526461200000,1526464800000,1526468400000,1526472000000,1526475600000,1526479200000,1526482800000,1526486400000,1526490000000,1526493600000,1526497200000,1526500800000,1526504400000,1526508000000,1526511600000,1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[40,110,0,0,50,240,450,690,680,680,690,830,1060,940,840,820,910,1140,1270,950,1280,660,430,100,120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200]},{"name":"URL","color":"#2373DB","values":[0,20,40,0,90,100,160,440,370,510,680,660,700,630,720,820,1090,910,770,920,670,530,290,80,80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130]},{"name":"Groups","color":"#9ED448","values":[280,80,10,20,150,430,510,470,710,590,520,720,990,790,690,590,1130,870,990,1100,1350,1220,770,720,140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,20,30,20,30,20,20,10,100,50,30,60,50,110,120,90,120,140,30,0,20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10]},{"name":"Search","color":"#F5BD25","values":[20,10,0,0,0,80,110,160,220,100,150,200,70,180,120,50,120,200,160,190,50,80,20,20,20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10]},{"name":"Other","color":"#F79E39","values":[30,10,0,20,50,150,160,60,220,100,90,110,170,100,100,220,170,240,210,290,320,100,150,10,40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/20.json b/public/chartDummyData/views_zoom/2018-05/20.json new file mode 100644 index 000000000..86f7e9cbd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526515200000,1526518800000,1526522400000,1526526000000,1526529600000,1526533200000,1526536800000,1526540400000,1526544000000,1526547600000,1526551200000,1526554800000,1526558400000,1526562000000,1526565600000,1526569200000,1526572800000,1526576400000,1526580000000,1526583600000,1526587200000,1526590800000,1526594400000,1526598000000,1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,50,30,20,90,210,400,630,690,600,620,780,770,750,970,860,960,1200,1030,1120,1020,730,410,150,110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470]},{"name":"URL","color":"#2373DB","values":[80,20,10,10,30,150,250,500,490,690,570,730,760,830,810,870,990,1260,860,980,890,590,220,120,80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120]},{"name":"Groups","color":"#9ED448","values":[140,30,20,20,90,590,580,590,620,490,610,790,1050,620,800,690,760,1000,810,1120,1230,1420,910,200,120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,0,10,20,290,150,80,20,60,0,60,70,30,100,90,80,140,170,10,10,0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40]},{"name":"Search","color":"#F5BD25","values":[20,0,20,0,20,280,70,50,120,110,80,130,140,70,40,150,200,160,290,120,50,80,60,20,10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20]},{"name":"Other","color":"#F79E39","values":[40,30,0,10,0,70,150,130,230,130,120,100,190,180,220,240,310,140,170,160,250,220,110,60,0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/21.json b/public/chartDummyData/views_zoom/2018-05/21.json new file mode 100644 index 000000000..a992ab77e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526601600000,1526605200000,1526608800000,1526612400000,1526616000000,1526619600000,1526623200000,1526626800000,1526630400000,1526634000000,1526637600000,1526641200000,1526644800000,1526648400000,1526652000000,1526655600000,1526659200000,1526662800000,1526666400000,1526670000000,1526673600000,1526677200000,1526680800000,1526684400000,1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[110,50,40,0,60,250,340,700,640,680,660,980,1000,950,1060,930,1210,1100,890,1040,990,780,370,150,40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160]},{"name":"URL","color":"#2373DB","values":[80,30,10,20,100,190,290,330,450,660,680,700,650,710,670,850,1140,1070,800,770,750,350,230,130,60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110]},{"name":"Groups","color":"#9ED448","values":[120,20,40,0,90,340,510,570,490,670,810,700,880,640,780,850,880,630,780,1130,1160,1060,630,230,150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320]},{"name":"Channel","color":"#4fae4e","values":[0,10,0,10,0,30,20,40,30,40,30,10,40,90,70,50,40,110,240,70,40,80,30,0,20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,160,120,60,20,20,300,120,120,170,70,230,200,60,120,290,220,80,60,30,40,10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10]},{"name":"Other","color":"#F79E39","values":[0,10,0,0,10,70,150,180,190,130,120,130,150,120,160,230,190,80,270,170,190,130,90,20,0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,20,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/22.json b/public/chartDummyData/views_zoom/2018-05/22.json new file mode 100644 index 000000000..8c818f0c9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526688000000,1526691600000,1526695200000,1526698800000,1526702400000,1526706000000,1526709600000,1526713200000,1526716800000,1526720400000,1526724000000,1526727600000,1526731200000,1526734800000,1526738400000,1526742000000,1526745600000,1526749200000,1526752800000,1526756400000,1526760000000,1526763600000,1526767200000,1526770800000,1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[40,40,100,10,70,190,410,780,860,950,980,910,1250,960,1100,810,1030,1050,920,820,800,670,880,570,280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270]},{"name":"URL","color":"#2373DB","values":[60,0,20,20,10,60,230,260,610,750,730,610,690,590,500,660,750,700,760,770,470,300,270,160,180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110]},{"name":"Groups","color":"#9ED448","values":[150,90,0,0,50,330,350,540,700,780,810,770,640,930,680,490,770,520,550,790,960,830,660,630,270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,20,50,10,40,30,50,70,40,70,40,70,70,50,70,60,110,10,80,40,0,20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20]},{"name":"Search","color":"#F5BD25","values":[10,0,10,20,50,20,120,70,90,200,80,240,90,200,160,120,150,30,100,280,110,70,60,30,10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50]},{"name":"Other","color":"#F79E39","values":[0,0,10,20,40,10,60,310,130,210,170,90,320,300,190,140,170,230,100,170,110,120,160,80,50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,20,10,20,10,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/23.json b/public/chartDummyData/views_zoom/2018-05/23.json new file mode 100644 index 000000000..357f0a56e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526774400000,1526778000000,1526781600000,1526785200000,1526788800000,1526792400000,1526796000000,1526799600000,1526803200000,1526806800000,1526810400000,1526814000000,1526817600000,1526821200000,1526824800000,1526828400000,1526832000000,1526835600000,1526839200000,1526842800000,1526846400000,1526850000000,1526853600000,1526857200000,1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[280,100,30,10,80,60,190,420,680,880,820,1260,960,810,970,1050,780,1030,1240,1060,940,880,580,320,130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490]},{"name":"URL","color":"#2373DB","values":[180,40,50,80,40,0,120,200,420,530,540,420,280,360,390,720,640,840,810,750,660,530,290,230,40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220]},{"name":"Groups","color":"#9ED448","values":[270,70,10,60,20,70,280,380,440,710,790,670,880,1060,1020,710,700,760,980,1180,1150,1390,720,430,320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590]},{"name":"Channel","color":"#4fae4e","values":[20,30,0,0,0,10,0,50,50,30,30,70,160,80,30,60,30,20,70,40,40,240,40,0,0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,0,10,40,120,140,110,100,40,140,160,150,280,170,270,100,160,240,100,40,20,10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40]},{"name":"Other","color":"#F79E39","values":[50,40,10,10,0,50,80,130,90,160,230,120,150,80,100,120,80,160,300,160,150,120,90,30,10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,0,20,0,10,10,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/24.json b/public/chartDummyData/views_zoom/2018-05/24.json new file mode 100644 index 000000000..85bd10162 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526860800000,1526864400000,1526868000000,1526871600000,1526875200000,1526878800000,1526882400000,1526886000000,1526889600000,1526893200000,1526896800000,1526900400000,1526904000000,1526907600000,1526911200000,1526914800000,1526918400000,1526922000000,1526925600000,1526929200000,1526932800000,1526936400000,1526940000000,1526943600000,1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,60,50,10,220,320,390,440,520,730,810,960,900,900,990,1240,860,1060,1100,1270,1210,780,390,170,40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540]},{"name":"URL","color":"#2373DB","values":[40,20,10,10,50,150,270,320,370,520,650,670,550,630,670,780,1100,1000,1050,920,660,510,340,120,60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120]},{"name":"Groups","color":"#9ED448","values":[320,90,10,30,70,370,1030,480,520,550,870,940,790,690,620,500,1080,940,860,780,1290,1260,620,240,120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420]},{"name":"Channel","color":"#4fae4e","values":[0,10,20,0,10,10,0,10,60,60,20,20,40,60,70,120,50,90,60,50,200,30,40,40,0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50]},{"name":"Search","color":"#F5BD25","values":[10,90,0,0,40,180,40,30,80,100,10,90,140,120,80,70,110,140,150,460,130,100,10,30,0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10]},{"name":"Other","color":"#F79E39","values":[10,0,0,0,0,140,110,90,110,100,130,160,230,190,200,190,190,200,210,170,220,150,120,20,10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/25.json b/public/chartDummyData/views_zoom/2018-05/25.json new file mode 100644 index 000000000..de28c00f6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1526947200000,1526950800000,1526954400000,1526958000000,1526961600000,1526965200000,1526968800000,1526972400000,1526976000000,1526979600000,1526983200000,1526986800000,1526990400000,1526994000000,1526997600000,1527001200000,1527004800000,1527008400000,1527012000000,1527015600000,1527019200000,1527022800000,1527026400000,1527030000000,1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[40,70,20,50,80,430,460,840,670,710,790,1130,890,940,1200,1180,1160,1240,1310,1030,1080,790,440,200,160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290]},{"name":"URL","color":"#2373DB","values":[60,50,30,80,10,170,180,400,410,470,620,850,890,680,620,1110,1070,1220,1020,860,790,710,400,130,60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130]},{"name":"Groups","color":"#9ED448","values":[120,30,40,20,100,390,490,560,630,530,740,820,770,730,450,620,850,820,940,1080,1220,1420,740,240,280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,10,10,10,20,30,40,40,60,70,20,100,50,130,30,100,180,30,60,10,10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20]},{"name":"Search","color":"#F5BD25","values":[0,10,0,10,90,120,170,130,150,110,210,110,130,60,70,50,90,60,190,120,170,120,30,10,0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90]},{"name":"Other","color":"#F79E39","values":[10,10,0,10,30,90,60,100,60,140,130,200,180,170,90,160,190,130,250,180,210,220,50,30,30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/26.json b/public/chartDummyData/views_zoom/2018-05/26.json new file mode 100644 index 000000000..13c79c6dd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527033600000,1527037200000,1527040800000,1527044400000,1527048000000,1527051600000,1527055200000,1527058800000,1527062400000,1527066000000,1527069600000,1527073200000,1527076800000,1527080400000,1527084000000,1527087600000,1527091200000,1527094800000,1527098400000,1527102000000,1527105600000,1527109200000,1527112800000,1527116400000,1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,60,10,20,70,290,370,520,550,710,690,1010,1100,760,1300,950,1060,1060,1010,1760,1100,1020,410,470,160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330]},{"name":"URL","color":"#2373DB","values":[60,20,0,0,40,40,360,310,350,680,600,630,570,650,600,770,830,1260,1120,920,720,460,270,120,40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200]},{"name":"Groups","color":"#9ED448","values":[280,30,10,10,90,430,640,500,510,570,690,820,990,560,610,670,680,930,920,1140,1370,1200,780,280,160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,0,10,30,30,30,10,40,80,40,70,70,50,70,60,80,90,50,70,10,40,0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20]},{"name":"Search","color":"#F5BD25","values":[0,0,10,10,20,230,80,170,130,50,70,110,290,110,90,150,200,140,170,330,90,20,60,20,0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190]},{"name":"Other","color":"#F79E39","values":[30,0,0,10,0,70,100,120,220,130,180,160,210,170,100,90,120,150,160,190,210,160,120,80,20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,10,0,10,10,0,10,0,10,0,30,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/27.json b/public/chartDummyData/views_zoom/2018-05/27.json new file mode 100644 index 000000000..2b5d5d876 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527120000000,1527123600000,1527127200000,1527130800000,1527134400000,1527138000000,1527141600000,1527145200000,1527148800000,1527152400000,1527156000000,1527159600000,1527163200000,1527166800000,1527170400000,1527174000000,1527177600000,1527181200000,1527184800000,1527188400000,1527192000000,1527195600000,1527199200000,1527202800000,1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,30,10,70,50,280,370,540,620,920,810,750,1220,940,850,770,990,820,1120,980,1070,1000,600,160,190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180]},{"name":"URL","color":"#2373DB","values":[40,10,30,10,50,140,250,380,440,560,870,870,820,690,760,1000,1230,1120,910,840,1130,700,330,110,160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140]},{"name":"Groups","color":"#9ED448","values":[160,40,20,10,110,350,610,580,600,950,680,790,740,990,780,540,890,800,990,1050,1240,1240,640,320,80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,40,10,40,10,10,20,80,70,70,110,50,40,130,150,80,70,90,30,60,30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20]},{"name":"Search","color":"#F5BD25","values":[0,10,0,0,230,100,70,90,90,70,110,30,30,140,280,300,220,170,160,150,280,150,0,10,10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20]},{"name":"Other","color":"#F79E39","values":[20,10,0,0,0,60,90,110,140,90,170,240,190,210,170,110,320,280,140,230,170,150,80,30,30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,0,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/28.json b/public/chartDummyData/views_zoom/2018-05/28.json new file mode 100644 index 000000000..37099d234 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527206400000,1527210000000,1527213600000,1527217200000,1527220800000,1527224400000,1527228000000,1527231600000,1527235200000,1527238800000,1527242400000,1527246000000,1527249600000,1527253200000,1527256800000,1527260400000,1527264000000,1527267600000,1527271200000,1527274800000,1527278400000,1527282000000,1527285600000,1527289200000,1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,60,40,20,30,260,520,650,770,820,770,1040,850,720,980,940,880,890,1020,1150,1010,790,450,270,220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220]},{"name":"URL","color":"#2373DB","values":[160,30,10,20,30,130,270,300,530,560,800,900,800,540,610,900,1150,890,880,820,640,560,440,110,100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130]},{"name":"Groups","color":"#9ED448","values":[80,50,20,30,110,420,280,520,560,670,710,870,900,640,550,770,790,930,720,1010,1070,1300,730,340,120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300]},{"name":"Channel","color":"#4fae4e","values":[30,0,20,0,0,50,40,40,50,20,50,80,70,80,20,70,60,50,70,60,120,50,60,20,10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60]},{"name":"Search","color":"#F5BD25","values":[10,0,40,0,10,70,50,200,150,40,80,90,120,140,120,100,210,40,180,180,160,80,70,50,10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10]},{"name":"Other","color":"#F79E39","values":[30,10,0,0,30,100,140,150,150,120,190,220,190,180,140,120,190,230,210,190,160,110,110,40,10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,10,10,0,0,0,10,0,0,0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/29.json b/public/chartDummyData/views_zoom/2018-05/29.json new file mode 100644 index 000000000..aee413d23 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527292800000,1527296400000,1527300000000,1527303600000,1527307200000,1527310800000,1527314400000,1527318000000,1527321600000,1527325200000,1527328800000,1527332400000,1527336000000,1527339600000,1527343200000,1527346800000,1527350400000,1527354000000,1527357600000,1527361200000,1527364800000,1527368400000,1527372000000,1527375600000,1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,80,30,70,60,180,460,730,640,880,910,890,930,1100,870,990,820,1120,1020,990,840,660,600,490,170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270]},{"name":"URL","color":"#2373DB","values":[100,10,10,0,20,140,150,230,610,680,850,640,720,670,620,700,800,770,800,660,640,560,420,220,50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230]},{"name":"Groups","color":"#9ED448","values":[120,50,40,20,70,160,460,530,610,900,810,830,630,580,510,530,510,690,660,640,990,920,670,590,420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380]},{"name":"Channel","color":"#4fae4e","values":[10,20,0,0,10,20,10,10,70,30,100,70,70,90,90,10,40,60,60,60,50,50,40,20,50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,50,90,310,80,120,50,80,90,120,80,40,280,170,90,80,130,20,20,80,40,50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20]},{"name":"Other","color":"#F79E39","values":[10,0,30,0,20,80,110,150,110,130,180,130,210,110,110,200,100,140,120,110,150,80,90,70,60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,20,20,0,20,10,10,0,20,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/30.json b/public/chartDummyData/views_zoom/2018-05/30.json new file mode 100644 index 000000000..dd81fba36 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527379200000,1527382800000,1527386400000,1527390000000,1527393600000,1527397200000,1527400800000,1527404400000,1527408000000,1527411600000,1527415200000,1527418800000,1527422400000,1527426000000,1527429600000,1527433200000,1527436800000,1527440400000,1527444000000,1527447600000,1527451200000,1527454800000,1527458400000,1527462000000,1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,110,30,20,50,140,300,640,860,1310,880,1240,1020,1280,1150,1120,800,1190,1160,1250,1170,1030,580,540,130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460]},{"name":"URL","color":"#2373DB","values":[50,80,30,0,0,50,50,200,300,740,500,480,400,450,470,660,810,980,860,770,900,600,270,120,30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220]},{"name":"Groups","color":"#9ED448","values":[420,190,60,20,20,90,190,450,530,880,580,870,550,560,960,600,520,820,1020,1380,1210,1450,890,420,180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470]},{"name":"Channel","color":"#4fae4e","values":[50,20,10,0,0,0,20,50,100,40,20,90,30,40,60,30,80,70,40,50,40,100,80,50,10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40]},{"name":"Search","color":"#F5BD25","values":[50,30,0,0,10,0,30,210,100,80,150,50,120,90,140,80,60,180,80,110,210,80,70,10,30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10]},{"name":"Other","color":"#F79E39","values":[60,40,0,0,0,30,140,60,110,160,120,140,150,210,210,250,100,120,200,80,320,160,80,10,10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,10,0,10,10,10,20,20,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-05/31.json b/public/chartDummyData/views_zoom/2018-05/31.json new file mode 100644 index 000000000..dd08b3914 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-05/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527465600000,1527469200000,1527472800000,1527476400000,1527480000000,1527483600000,1527487200000,1527490800000,1527494400000,1527498000000,1527501600000,1527505200000,1527508800000,1527512400000,1527516000000,1527519600000,1527523200000,1527526800000,1527530400000,1527534000000,1527537600000,1527541200000,1527544800000,1527548400000,1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,10,20,30,120,540,670,620,610,770,560,920,1030,950,960,890,960,1220,1280,1140,1260,800,600,290,200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370]},{"name":"URL","color":"#2373DB","values":[30,10,0,10,30,110,240,350,470,450,580,670,770,690,680,820,1150,950,960,930,790,540,340,130,60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120]},{"name":"Groups","color":"#9ED448","values":[180,70,10,20,170,320,520,310,370,590,910,910,950,700,730,730,760,930,920,1580,1410,1240,850,330,180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,10,10,10,30,40,40,30,50,70,90,30,40,70,40,20,60,40,50,70,20,30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,50,300,130,70,30,80,90,100,10,80,40,90,60,90,110,150,80,20,90,90,30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0]},{"name":"Other","color":"#F79E39","values":[10,40,0,10,10,80,110,120,120,100,200,140,210,140,120,220,170,190,250,270,250,250,130,110,30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/01.json b/public/chartDummyData/views_zoom/2018-06/01.json new file mode 100644 index 000000000..e704ba8f5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527552000000,1527555600000,1527559200000,1527562800000,1527566400000,1527570000000,1527573600000,1527577200000,1527580800000,1527584400000,1527588000000,1527591600000,1527595200000,1527598800000,1527602400000,1527606000000,1527609600000,1527613200000,1527616800000,1527620400000,1527624000000,1527627600000,1527631200000,1527634800000,1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,40,0,40,40,290,400,600,590,710,740,1080,1000,1320,780,950,1010,880,1060,1080,1330,900,570,330,130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300]},{"name":"URL","color":"#2373DB","values":[60,90,0,20,40,170,220,290,400,510,610,680,870,610,690,790,980,930,1150,1050,660,580,380,200,120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120]},{"name":"Groups","color":"#9ED448","values":[180,10,20,40,90,340,430,540,960,520,760,730,890,680,730,610,880,870,810,900,1400,1030,550,230,170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,10,0,20,20,70,20,50,20,60,140,20,30,60,120,30,70,80,50,20,20,0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,240,130,370,100,20,40,100,50,110,120,180,140,130,640,50,80,130,220,170,190,10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110]},{"name":"Other","color":"#F79E39","values":[30,10,0,0,20,90,120,100,200,180,210,200,300,210,140,170,220,230,240,240,200,190,170,30,0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/02.json b/public/chartDummyData/views_zoom/2018-06/02.json new file mode 100644 index 000000000..33976cffd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527638400000,1527642000000,1527645600000,1527649200000,1527652800000,1527656400000,1527660000000,1527663600000,1527667200000,1527670800000,1527674400000,1527678000000,1527681600000,1527685200000,1527688800000,1527692400000,1527696000000,1527699600000,1527703200000,1527706800000,1527710400000,1527714000000,1527717600000,1527721200000,1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,90,40,60,140,280,370,950,710,800,960,1150,910,910,940,1050,1000,1240,1150,970,1130,950,480,180,120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400]},{"name":"URL","color":"#2373DB","values":[120,60,50,0,70,260,200,320,450,500,560,620,540,690,1050,840,1180,1230,980,940,1030,750,440,140,140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130]},{"name":"Groups","color":"#9ED448","values":[170,50,40,10,60,310,370,1140,500,560,690,730,840,630,1010,720,810,1060,910,1190,1390,1360,770,290,360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,40,0,50,40,30,70,50,40,60,50,70,60,60,30,40,80,160,110,20,10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,90,110,130,400,90,90,170,610,80,80,180,190,150,270,100,150,130,190,120,20,20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20]},{"name":"Other","color":"#F79E39","values":[0,60,20,30,80,160,90,180,100,120,230,150,170,160,150,210,170,150,200,220,240,130,130,40,10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,0,10,0,0,0,0,0,0,10,0,30,20,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/03.json b/public/chartDummyData/views_zoom/2018-06/03.json new file mode 100644 index 000000000..ec57ed08c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527724800000,1527728400000,1527732000000,1527735600000,1527739200000,1527742800000,1527746400000,1527750000000,1527753600000,1527757200000,1527760800000,1527764400000,1527768000000,1527771600000,1527775200000,1527778800000,1527782400000,1527786000000,1527789600000,1527793200000,1527796800000,1527800400000,1527804000000,1527807600000,1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,60,20,30,80,370,480,550,640,730,850,710,1000,810,890,940,1100,1170,1180,1380,1350,720,550,220,70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180]},{"name":"URL","color":"#2373DB","values":[140,60,20,0,10,210,280,380,550,710,600,750,640,590,560,760,970,950,1060,990,830,720,290,130,30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90]},{"name":"Groups","color":"#9ED448","values":[360,70,30,10,90,410,460,480,590,690,1010,980,650,610,730,920,850,700,780,950,1350,1360,800,300,110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,10,0,20,110,10,50,20,80,50,50,20,80,60,120,140,90,60,50,40,30,60,20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210]},{"name":"Search","color":"#F5BD25","values":[20,0,0,10,70,50,260,120,50,110,80,40,130,130,260,130,130,240,180,190,90,170,110,10,0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0]},{"name":"Other","color":"#F79E39","values":[10,10,0,0,30,120,150,130,60,200,180,220,180,110,100,160,220,200,180,270,200,180,150,90,40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/04.json b/public/chartDummyData/views_zoom/2018-06/04.json new file mode 100644 index 000000000..d23742f42 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527811200000,1527814800000,1527818400000,1527822000000,1527825600000,1527829200000,1527832800000,1527836400000,1527840000000,1527843600000,1527847200000,1527850800000,1527854400000,1527858000000,1527861600000,1527865200000,1527868800000,1527872400000,1527876000000,1527879600000,1527883200000,1527886800000,1527890400000,1527894000000,1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[70,40,50,30,140,310,730,700,830,810,870,880,880,1010,900,890,980,990,780,1070,1030,730,490,270,170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220]},{"name":"URL","color":"#2373DB","values":[30,30,70,60,120,110,280,350,660,660,520,760,750,650,630,760,1050,1100,700,1190,680,540,390,230,170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110]},{"name":"Groups","color":"#9ED448","values":[110,50,0,10,80,380,520,500,810,820,670,960,680,690,990,580,630,760,680,1210,1140,1130,760,380,190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530]},{"name":"Channel","color":"#4fae4e","values":[20,0,40,0,0,30,30,40,30,30,30,70,60,50,20,70,140,30,50,60,140,40,30,30,20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50]},{"name":"Search","color":"#F5BD25","values":[0,40,40,0,130,200,230,100,60,120,50,120,150,50,100,80,40,50,60,120,240,330,0,20,40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0]},{"name":"Other","color":"#F79E39","values":[40,10,0,20,70,80,160,140,90,220,190,140,220,150,100,140,110,110,120,160,210,100,80,60,50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,0,0,10,0,0,0,0,0,10,0,0,30,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/05.json b/public/chartDummyData/views_zoom/2018-06/05.json new file mode 100644 index 000000000..5d8e8f676 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527897600000,1527901200000,1527904800000,1527908400000,1527912000000,1527915600000,1527919200000,1527922800000,1527926400000,1527930000000,1527933600000,1527937200000,1527940800000,1527944400000,1527948000000,1527951600000,1527955200000,1527958800000,1527962400000,1527966000000,1527969600000,1527973200000,1527976800000,1527980400000,1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,40,20,30,20,170,510,670,760,790,790,930,770,970,940,1020,1040,990,940,800,930,660,520,460,200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290]},{"name":"URL","color":"#2373DB","values":[170,40,0,0,0,90,110,180,460,610,810,580,570,560,490,680,620,690,930,630,430,480,430,220,210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70]},{"name":"Groups","color":"#9ED448","values":[190,130,10,30,80,110,230,310,500,680,680,660,640,530,690,1000,600,520,530,760,660,800,1130,470,220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,10,10,20,30,0,20,60,20,20,90,80,30,70,70,90,40,60,70,50,120,40,0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60]},{"name":"Search","color":"#F5BD25","values":[40,20,10,0,0,20,280,80,170,110,120,140,80,130,160,180,70,50,140,130,20,140,90,10,0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20]},{"name":"Other","color":"#F79E39","values":[50,30,20,0,10,50,70,140,140,70,190,140,210,80,120,70,200,150,240,180,120,170,70,30,10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,0,10,10,10,0,20,0,20,10,20,0,0,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/06.json b/public/chartDummyData/views_zoom/2018-06/06.json new file mode 100644 index 000000000..6d22fd0fc --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1527984000000,1527987600000,1527991200000,1527994800000,1527998400000,1528002000000,1528005600000,1528009200000,1528012800000,1528016400000,1528020000000,1528023600000,1528027200000,1528030800000,1528034400000,1528038000000,1528041600000,1528045200000,1528048800000,1528052400000,1528056000000,1528059600000,1528063200000,1528066800000,1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,110,30,10,100,110,230,640,730,840,970,1010,1160,660,1110,1080,1110,1260,1290,1010,1100,920,470,370,250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520]},{"name":"URL","color":"#2373DB","values":[210,190,20,20,10,10,130,190,460,670,730,500,510,670,550,660,720,780,900,730,830,560,490,120,20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190]},{"name":"Groups","color":"#9ED448","values":[220,90,130,20,20,40,220,540,530,770,830,740,830,920,720,780,980,910,880,970,1450,1150,990,460,280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,20,10,20,50,50,70,30,40,60,60,60,90,120,110,110,40,20,50,110,20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,40,10,270,80,110,110,80,50,370,100,60,200,100,220,190,140,60,50,30,0,10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50]},{"name":"Other","color":"#F79E39","values":[10,0,10,10,20,20,40,50,190,160,180,130,150,150,110,140,180,160,160,220,160,220,90,20,30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160]},{"name":"PM","color":"#E65850","values":[0,0,10,0,10,0,0,0,0,10,0,0,20,0,10,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/07.json b/public/chartDummyData/views_zoom/2018-06/07.json new file mode 100644 index 000000000..320e943e7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528070400000,1528074000000,1528077600000,1528081200000,1528084800000,1528088400000,1528092000000,1528095600000,1528099200000,1528102800000,1528106400000,1528110000000,1528113600000,1528117200000,1528120800000,1528124400000,1528128000000,1528131600000,1528135200000,1528138800000,1528142400000,1528146000000,1528149600000,1528153200000,1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,140,40,20,80,310,400,750,720,970,820,1150,1100,970,890,660,840,1100,1240,1360,1100,880,480,300,80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470]},{"name":"URL","color":"#2373DB","values":[20,60,0,0,0,120,180,300,450,450,630,720,600,680,690,770,830,920,810,780,960,520,290,120,90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240]},{"name":"Groups","color":"#9ED448","values":[280,50,10,30,70,380,540,670,640,660,710,780,700,650,620,830,920,830,1150,1010,1860,1490,900,400,150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420]},{"name":"Channel","color":"#4fae4e","values":[20,20,0,0,0,0,0,60,70,60,60,100,50,150,80,30,80,90,60,70,60,50,50,50,20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30]},{"name":"Search","color":"#F5BD25","values":[10,0,10,50,140,90,30,40,30,160,10,140,100,200,380,70,90,100,120,220,200,150,10,110,100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90]},{"name":"Other","color":"#F79E39","values":[30,10,0,0,60,220,100,90,90,110,150,200,160,170,130,170,210,180,100,250,240,270,100,20,20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,0,0,10,10,0,0,40,30,0,10,0,20,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/08.json b/public/chartDummyData/views_zoom/2018-06/08.json new file mode 100644 index 000000000..7d313bc64 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528156800000,1528160400000,1528164000000,1528167600000,1528171200000,1528174800000,1528178400000,1528182000000,1528185600000,1528189200000,1528192800000,1528196400000,1528200000000,1528203600000,1528207200000,1528210800000,1528214400000,1528218000000,1528221600000,1528225200000,1528228800000,1528232400000,1528236000000,1528239600000,1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[80,30,20,40,70,220,570,650,800,780,830,970,940,1040,920,910,1070,1010,1190,1020,970,940,440,400,60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330]},{"name":"URL","color":"#2373DB","values":[90,40,40,0,40,60,300,430,500,510,700,640,860,540,530,680,940,1000,1000,730,1220,550,410,130,40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260]},{"name":"Groups","color":"#9ED448","values":[150,70,30,40,80,270,380,690,550,590,1210,810,880,640,660,710,920,850,990,1190,1590,1110,910,350,160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350]},{"name":"Channel","color":"#4fae4e","values":[20,10,10,10,0,20,30,40,10,30,20,20,40,30,1950,390,60,50,50,90,80,20,50,0,50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0]},{"name":"Search","color":"#F5BD25","values":[100,80,0,0,40,100,140,70,100,170,40,200,70,200,80,130,150,70,190,150,80,80,50,20,10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30]},{"name":"Other","color":"#F79E39","values":[20,20,0,0,30,100,60,170,140,120,110,170,160,190,140,150,110,170,180,270,230,150,90,40,30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,10,0,0,0,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/09.json b/public/chartDummyData/views_zoom/2018-06/09.json new file mode 100644 index 000000000..2e7e654ef --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528243200000,1528246800000,1528250400000,1528254000000,1528257600000,1528261200000,1528264800000,1528268400000,1528272000000,1528275600000,1528279200000,1528282800000,1528286400000,1528290000000,1528293600000,1528297200000,1528300800000,1528304400000,1528308000000,1528311600000,1528315200000,1528318800000,1528322400000,1528326000000,1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[60,70,20,40,60,380,620,530,610,970,810,1030,980,910,930,710,1170,1010,1110,1210,1180,800,560,180,110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460]},{"name":"URL","color":"#2373DB","values":[40,0,0,10,0,120,260,400,590,600,720,690,820,790,650,880,1120,1100,880,870,930,630,300,90,10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230]},{"name":"Groups","color":"#9ED448","values":[160,50,20,0,60,320,570,450,530,770,1040,850,850,730,610,570,590,780,910,890,1150,1070,610,250,180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550]},{"name":"Channel","color":"#4fae4e","values":[50,50,0,0,20,10,340,30,40,40,50,40,50,110,50,70,60,60,100,80,90,90,890,210,10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60]},{"name":"Search","color":"#F5BD25","values":[10,10,0,10,60,50,40,90,130,190,70,290,50,70,90,60,180,60,170,190,90,60,60,0,0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20]},{"name":"Other","color":"#F79E39","values":[30,10,0,10,20,90,140,80,110,130,160,210,120,90,140,130,160,150,220,180,180,130,110,40,30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/10.json b/public/chartDummyData/views_zoom/2018-06/10.json new file mode 100644 index 000000000..caf2f8362 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528329600000,1528333200000,1528336800000,1528340400000,1528344000000,1528347600000,1528351200000,1528354800000,1528358400000,1528362000000,1528365600000,1528369200000,1528372800000,1528376400000,1528380000000,1528383600000,1528387200000,1528390800000,1528394400000,1528398000000,1528401600000,1528405200000,1528408800000,1528412400000,1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[110,90,0,50,70,250,690,680,690,960,970,900,870,1020,850,890,890,1050,1040,1250,1290,730,720,220,200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400]},{"name":"URL","color":"#2373DB","values":[10,0,10,10,10,80,200,370,410,660,700,660,750,670,620,890,1220,950,950,770,560,490,200,110,40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130]},{"name":"Groups","color":"#9ED448","values":[180,90,10,30,70,330,560,430,590,640,830,800,960,700,690,640,790,700,820,870,1200,1550,790,530,100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570]},{"name":"Channel","color":"#4fae4e","values":[10,0,100,0,600,10,40,20,30,80,30,40,60,80,20,40,50,10,100,100,100,70,20,50,30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20]},{"name":"Search","color":"#F5BD25","values":[0,20,0,0,100,120,270,80,80,180,10,160,520,250,80,110,100,280,180,250,120,90,70,0,0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20]},{"name":"Other","color":"#F79E39","values":[30,10,10,10,40,90,80,70,140,170,280,160,170,280,180,150,90,160,160,200,160,180,110,50,10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/11.json b/public/chartDummyData/views_zoom/2018-06/11.json new file mode 100644 index 000000000..cad4c29c3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528416000000,1528419600000,1528423200000,1528426800000,1528430400000,1528434000000,1528437600000,1528441200000,1528444800000,1528448400000,1528452000000,1528455600000,1528459200000,1528462800000,1528466400000,1528470000000,1528473600000,1528477200000,1528480800000,1528484400000,1528488000000,1528491600000,1528495200000,1528498800000,1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,40,40,0,40,170,550,630,760,950,940,980,1090,920,1080,850,1040,1120,930,1700,1330,820,650,290,130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410]},{"name":"URL","color":"#2373DB","values":[40,10,0,20,20,110,370,500,570,790,760,630,670,700,710,900,1110,1050,1030,770,580,430,380,70,180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140]},{"name":"Groups","color":"#9ED448","values":[100,40,10,10,60,310,350,390,700,910,510,820,780,890,880,640,900,720,700,820,1370,1110,880,660,250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600]},{"name":"Channel","color":"#4fae4e","values":[30,30,0,10,30,20,50,60,30,90,90,30,40,30,20,70,30,90,80,90,110,10,70,60,20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10]},{"name":"Search","color":"#F5BD25","values":[0,0,10,0,210,100,50,110,190,190,100,100,60,130,120,60,80,230,180,90,170,210,30,20,10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50]},{"name":"Other","color":"#F79E39","values":[10,30,60,0,30,90,30,100,140,80,170,170,240,200,170,170,100,120,140,230,210,100,80,50,50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,20,0,0,0,0,10,0,10,10,0,0,30,10,10,50,0,10,0,10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/12.json b/public/chartDummyData/views_zoom/2018-06/12.json new file mode 100644 index 000000000..53c16dd29 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528502400000,1528506000000,1528509600000,1528513200000,1528516800000,1528520400000,1528524000000,1528527600000,1528531200000,1528534800000,1528538400000,1528542000000,1528545600000,1528549200000,1528552800000,1528556400000,1528560000000,1528563600000,1528567200000,1528570800000,1528574400000,1528578000000,1528581600000,1528585200000,1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,50,20,20,30,170,360,560,710,950,1110,810,900,1060,1220,830,790,1070,990,990,1120,680,630,520,330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400]},{"name":"URL","color":"#2373DB","values":[180,70,10,10,0,120,150,190,660,630,760,910,860,600,610,800,550,620,840,530,510,420,190,190,120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130]},{"name":"Groups","color":"#9ED448","values":[250,70,20,30,50,270,340,510,590,670,620,730,910,660,490,680,580,940,730,650,670,730,740,920,350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,0,30,40,50,80,60,90,50,70,120,70,100,80,100,70,10,90,70,40,10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30]},{"name":"Search","color":"#F5BD25","values":[10,0,10,0,10,60,200,30,70,50,60,120,160,80,140,70,60,130,130,80,120,120,60,50,20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80]},{"name":"Other","color":"#F79E39","values":[50,10,0,0,30,40,60,190,180,150,170,90,110,170,180,90,150,150,100,110,130,70,50,160,40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,0,40,10,10,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/13.json b/public/chartDummyData/views_zoom/2018-06/13.json new file mode 100644 index 000000000..14ad07a37 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528588800000,1528592400000,1528596000000,1528599600000,1528603200000,1528606800000,1528610400000,1528614000000,1528617600000,1528621200000,1528624800000,1528628400000,1528632000000,1528635600000,1528639200000,1528642800000,1528646400000,1528650000000,1528653600000,1528657200000,1528660800000,1528664400000,1528668000000,1528671600000,1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[330,80,30,190,20,60,320,500,1040,730,1060,880,930,960,1050,950,930,1100,1200,1030,1010,1060,670,470,270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590]},{"name":"URL","color":"#2373DB","values":[120,50,0,0,0,30,100,270,380,510,710,580,820,580,490,570,660,790,710,660,660,840,500,240,180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290]},{"name":"Groups","color":"#9ED448","values":[350,160,60,30,20,60,240,480,710,650,580,740,1160,720,670,620,830,640,710,880,1120,1230,720,420,100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690]},{"name":"Channel","color":"#4fae4e","values":[10,20,10,0,20,0,30,20,50,60,70,30,60,40,280,60,70,50,10,130,20,40,70,30,20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80]},{"name":"Search","color":"#F5BD25","values":[20,0,10,30,90,50,310,110,50,110,140,50,140,330,60,100,110,60,120,70,100,100,10,90,20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0]},{"name":"Other","color":"#F79E39","values":[40,10,0,0,20,50,40,140,110,120,110,120,180,90,200,130,100,170,120,100,60,140,100,120,30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,10,10,10,10,10,0,30,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/14.json b/public/chartDummyData/views_zoom/2018-06/14.json new file mode 100644 index 000000000..893b6fa98 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528675200000,1528678800000,1528682400000,1528686000000,1528689600000,1528693200000,1528696800000,1528700400000,1528704000000,1528707600000,1528711200000,1528714800000,1528718400000,1528722000000,1528725600000,1528729200000,1528732800000,1528736400000,1528740000000,1528743600000,1528747200000,1528750800000,1528754400000,1528758000000,1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,50,60,20,100,340,440,640,980,1010,1270,1200,970,730,850,980,1130,1150,1220,1080,1230,930,600,330,210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430]},{"name":"URL","color":"#2373DB","values":[180,100,70,10,70,160,170,350,630,820,790,650,730,550,620,710,870,870,930,820,860,620,470,260,60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90]},{"name":"Groups","color":"#9ED448","values":[100,190,20,20,80,250,340,370,610,610,860,790,890,530,670,700,610,1050,1060,1180,1100,1540,970,350,220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,10,20,50,20,30,60,60,60,20,90,70,70,40,70,40,80,110,30,50,0,0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20]},{"name":"Search","color":"#F5BD25","values":[20,0,0,0,0,120,90,30,90,170,40,60,70,20,90,60,10,250,90,170,60,20,90,30,0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20]},{"name":"Other","color":"#F79E39","values":[30,10,20,10,20,110,140,170,170,210,150,180,150,170,150,110,130,130,210,230,220,120,110,60,20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,10,0,0,0,10,0,10,0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/15.json b/public/chartDummyData/views_zoom/2018-06/15.json new file mode 100644 index 000000000..8c5c3fb96 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528761600000,1528765200000,1528768800000,1528772400000,1528776000000,1528779600000,1528783200000,1528786800000,1528790400000,1528794000000,1528797600000,1528801200000,1528804800000,1528808400000,1528812000000,1528815600000,1528819200000,1528822800000,1528826400000,1528830000000,1528833600000,1528837200000,1528840800000,1528844400000,1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[210,50,30,40,50,190,420,700,760,990,790,860,1110,830,1020,800,960,1090,920,1200,1000,1000,780,460,280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430]},{"name":"URL","color":"#2373DB","values":[60,130,10,50,50,100,260,310,600,740,820,990,620,630,840,800,1030,1050,850,740,700,570,400,230,40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230]},{"name":"Groups","color":"#9ED448","values":[220,60,20,0,130,230,320,560,490,480,2150,1060,790,790,620,830,750,680,800,1300,1410,1120,830,550,120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380]},{"name":"Channel","color":"#4fae4e","values":[0,20,60,30,0,0,20,10,40,40,60,30,100,60,60,40,30,40,180,130,40,40,80,60,0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,70,90,400,100,40,30,50,160,60,50,110,80,60,80,130,80,210,190,60,20,70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20]},{"name":"Other","color":"#F79E39","values":[20,20,20,20,60,180,140,220,90,140,160,180,110,150,170,160,160,130,190,210,190,200,120,110,40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40]},{"name":"PM","color":"#E65850","values":[0,0,0,10,0,0,10,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/16.json b/public/chartDummyData/views_zoom/2018-06/16.json new file mode 100644 index 000000000..0b459f0e1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528848000000,1528851600000,1528855200000,1528858800000,1528862400000,1528866000000,1528869600000,1528873200000,1528876800000,1528880400000,1528884000000,1528887600000,1528891200000,1528894800000,1528898400000,1528902000000,1528905600000,1528909200000,1528912800000,1528916400000,1528920000000,1528923600000,1528927200000,1528930800000,1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[280,230,30,20,150,220,520,420,830,790,860,1060,1160,960,1000,760,990,1250,1250,1460,920,950,760,400,90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430]},{"name":"URL","color":"#2373DB","values":[40,30,60,30,30,100,230,370,640,770,740,760,720,630,760,750,1220,930,890,920,710,430,280,130,100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140]},{"name":"Groups","color":"#9ED448","values":[120,130,110,20,70,120,500,610,460,630,720,1060,780,1020,1220,750,1160,630,910,760,1130,1350,780,570,170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,10,0,0,20,40,20,60,30,40,40,20,50,90,20,100,30,60,70,20,30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40]},{"name":"Search","color":"#F5BD25","values":[70,0,0,90,210,50,80,60,80,210,150,30,60,140,200,50,170,50,60,150,140,60,100,20,0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40]},{"name":"Other","color":"#F79E39","values":[40,20,0,20,10,120,90,120,220,200,150,160,140,190,150,120,140,190,260,130,230,250,160,50,50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,0,10,10,0,30,10,10,0,10,30,20,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/17.json b/public/chartDummyData/views_zoom/2018-06/17.json new file mode 100644 index 000000000..cfe448cdf --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1528934400000,1528938000000,1528941600000,1528945200000,1528948800000,1528952400000,1528956000000,1528959600000,1528963200000,1528966800000,1528970400000,1528974000000,1528977600000,1528981200000,1528984800000,1528988400000,1528992000000,1528995600000,1528999200000,1529002800000,1529006400000,1529010000000,1529013600000,1529017200000,1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[90,60,10,50,30,160,360,480,860,840,990,950,790,910,1050,980,1000,870,1050,1300,920,820,680,410,170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380]},{"name":"URL","color":"#2373DB","values":[100,30,0,10,40,120,130,520,660,740,730,950,750,680,540,570,1130,1030,1050,660,940,680,390,140,60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190]},{"name":"Groups","color":"#9ED448","values":[170,60,80,50,140,240,470,650,510,630,630,850,810,780,720,810,580,750,960,790,1290,1540,1120,600,140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,10,0,0,0,20,50,100,20,60,70,60,40,80,90,90,70,40,50,40,80,10,20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,160,310,110,120,80,100,70,250,110,110,80,150,160,90,170,250,160,140,220,50,10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30]},{"name":"Other","color":"#F79E39","values":[50,0,20,10,20,70,50,100,100,160,130,190,210,210,80,120,140,110,220,290,190,170,160,30,30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/18.json b/public/chartDummyData/views_zoom/2018-06/18.json new file mode 100644 index 000000000..aa8c4353c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529020800000,1529024400000,1529028000000,1529031600000,1529035200000,1529038800000,1529042400000,1529046000000,1529049600000,1529053200000,1529056800000,1529060400000,1529064000000,1529067600000,1529071200000,1529074800000,1529078400000,1529082000000,1529085600000,1529089200000,1529092800000,1529096400000,1529100000000,1529103600000,1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,70,30,10,130,330,310,450,780,660,1130,1100,1040,1030,900,1280,1070,1160,990,1170,990,760,540,400,210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660]},{"name":"URL","color":"#2373DB","values":[60,60,10,0,20,80,240,490,530,730,800,930,650,600,700,950,1100,1010,1020,1010,950,700,340,130,60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210]},{"name":"Groups","color":"#9ED448","values":[140,150,100,0,30,300,490,530,540,670,600,1000,800,670,580,590,750,870,950,890,1350,1130,1060,580,280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620]},{"name":"Channel","color":"#4fae4e","values":[20,20,0,0,0,60,20,10,70,70,80,70,50,80,130,40,60,100,90,90,40,30,140,30,10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,230,50,220,20,190,110,40,110,160,40,90,90,180,100,130,320,100,90,70,80,10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120]},{"name":"Other","color":"#F79E39","values":[30,30,0,0,10,140,100,70,160,120,180,190,120,160,180,140,160,90,130,180,220,120,150,30,30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,10,10,10,10,10,0,40,10,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/19.json b/public/chartDummyData/views_zoom/2018-06/19.json new file mode 100644 index 000000000..2f05e8c56 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529107200000,1529110800000,1529114400000,1529118000000,1529121600000,1529125200000,1529128800000,1529132400000,1529136000000,1529139600000,1529143200000,1529146800000,1529150400000,1529154000000,1529157600000,1529161200000,1529164800000,1529168400000,1529172000000,1529175600000,1529179200000,1529182800000,1529186400000,1529190000000,1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[210,80,60,70,30,90,370,480,640,870,1000,910,1170,1380,830,1010,960,1020,810,1320,850,890,770,590,380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450]},{"name":"URL","color":"#2373DB","values":[60,50,60,30,30,50,170,300,430,560,550,630,660,620,520,620,730,970,860,750,580,400,590,290,210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150]},{"name":"Groups","color":"#9ED448","values":[280,250,110,30,60,90,400,620,640,550,670,680,640,910,890,680,650,500,710,920,820,1060,1090,690,340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,30,10,0,10,40,30,50,70,40,60,100,120,60,50,30,60,50,90,20,10,80,40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,0,40,210,10,140,50,100,20,60,310,20,130,80,50,30,20,30,190,30,0,20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50]},{"name":"Other","color":"#F79E39","values":[30,0,10,0,0,10,80,80,160,160,170,100,150,150,80,130,140,170,150,110,150,150,110,130,60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,20,10,0,20,0,0,30,10,10,0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/20.json b/public/chartDummyData/views_zoom/2018-06/20.json new file mode 100644 index 000000000..54b9fd14e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529193600000,1529197200000,1529200800000,1529204400000,1529208000000,1529211600000,1529215200000,1529218800000,1529222400000,1529226000000,1529229600000,1529233200000,1529236800000,1529240400000,1529244000000,1529247600000,1529251200000,1529254800000,1529258400000,1529262000000,1529265600000,1529269200000,1529272800000,1529276400000,1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[380,80,60,90,40,90,350,480,770,900,1300,1060,1070,1050,990,1050,1100,1050,1270,1100,800,830,800,430,150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480]},{"name":"URL","color":"#2373DB","values":[210,50,0,0,30,50,150,240,390,650,500,470,500,460,450,470,500,550,710,850,690,630,320,90,50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190]},{"name":"Groups","color":"#9ED448","values":[340,170,20,30,10,20,160,460,650,430,690,900,690,890,650,880,820,860,1180,1260,1430,1410,1090,410,210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670]},{"name":"Channel","color":"#4fae4e","values":[40,10,10,0,0,0,0,0,20,100,70,80,40,60,110,110,60,50,50,160,60,50,80,20,30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60]},{"name":"Search","color":"#F5BD25","values":[20,0,0,10,0,0,70,100,90,70,90,110,100,90,100,170,190,170,30,120,50,120,730,20,20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30]},{"name":"Other","color":"#F79E39","values":[60,20,20,30,0,10,80,140,120,170,190,200,140,150,150,120,110,190,200,230,170,220,120,30,30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90]},{"name":"PM","color":"#E65850","values":[0,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/21.json b/public/chartDummyData/views_zoom/2018-06/21.json new file mode 100644 index 000000000..06ce09fd2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529280000000,1529283600000,1529287200000,1529290800000,1529294400000,1529298000000,1529301600000,1529305200000,1529308800000,1529312400000,1529316000000,1529319600000,1529323200000,1529326800000,1529330400000,1529334000000,1529337600000,1529341200000,1529344800000,1529348400000,1529352000000,1529355600000,1529359200000,1529362800000,1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,40,20,10,80,190,460,690,720,990,960,910,1010,930,880,1030,860,1010,1090,1070,1170,920,620,430,270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920]},{"name":"URL","color":"#2373DB","values":[50,40,0,0,10,110,170,300,740,490,770,610,760,670,860,860,1000,950,990,890,920,620,270,230,50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230]},{"name":"Groups","color":"#9ED448","values":[210,100,10,30,60,300,360,790,1090,600,760,830,730,830,580,740,940,830,790,1030,1640,1230,670,380,260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,20,20,20,40,30,40,60,40,40,70,80,50,100,80,70,100,30,40,60,60,10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40]},{"name":"Search","color":"#F5BD25","values":[20,30,0,0,140,20,90,110,50,130,140,40,90,100,130,100,380,160,340,80,120,150,150,20,10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0]},{"name":"Other","color":"#F79E39","values":[30,80,30,0,10,80,110,80,130,120,130,260,140,250,180,230,190,180,130,190,190,210,140,40,10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,10,0,0,10,20,0,0,0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/22.json b/public/chartDummyData/views_zoom/2018-06/22.json new file mode 100644 index 000000000..85efcde26 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529366400000,1529370000000,1529373600000,1529377200000,1529380800000,1529384400000,1529388000000,1529391600000,1529395200000,1529398800000,1529402400000,1529406000000,1529409600000,1529413200000,1529416800000,1529420400000,1529424000000,1529427600000,1529431200000,1529434800000,1529438400000,1529442000000,1529445600000,1529449200000,1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,100,60,40,10,200,350,700,640,930,920,960,880,1140,1250,990,940,970,1150,1210,1240,1090,860,430,210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660]},{"name":"URL","color":"#2373DB","values":[50,20,30,10,0,110,330,400,550,660,970,890,920,690,670,950,1060,940,860,930,1040,700,350,140,70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200]},{"name":"Groups","color":"#9ED448","values":[260,180,110,140,40,270,430,440,550,610,740,980,850,920,1040,860,940,730,700,1250,1550,1200,900,650,390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,10,20,60,30,20,30,30,40,50,50,70,80,70,60,100,40,70,20,60,40,30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,40,390,230,100,120,90,50,120,140,160,70,50,70,80,120,90,90,90,50,40,20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40]},{"name":"Other","color":"#F79E39","values":[10,0,0,20,10,50,70,150,50,160,180,190,170,170,200,150,180,110,200,300,210,130,130,20,0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,10,0,10,10,0,10,10,30,20,0,0,20,0,0,10,0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/23.json b/public/chartDummyData/views_zoom/2018-06/23.json new file mode 100644 index 000000000..63b73ba7f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529452800000,1529456400000,1529460000000,1529463600000,1529467200000,1529470800000,1529474400000,1529478000000,1529481600000,1529485200000,1529488800000,1529492400000,1529496000000,1529499600000,1529503200000,1529506800000,1529510400000,1529514000000,1529517600000,1529521200000,1529524800000,1529528400000,1529532000000,1529535600000,1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[210,80,30,0,130,140,450,540,640,730,970,1100,1190,1060,950,880,930,1100,1110,920,1130,940,710,380,150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440]},{"name":"URL","color":"#2373DB","values":[70,0,20,0,0,90,320,370,570,500,820,930,730,660,760,930,1460,1130,900,1020,970,970,450,190,210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120]},{"name":"Groups","color":"#9ED448","values":[390,180,100,20,100,240,500,560,600,550,980,720,850,900,850,860,530,760,890,990,1270,1700,1100,360,240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,0,40,50,30,20,40,70,40,150,110,20,20,120,40,60,60,50,10,50,40,30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70]},{"name":"Search","color":"#F5BD25","values":[20,10,10,0,160,60,70,80,140,90,280,220,100,270,80,110,150,170,100,80,120,70,50,30,10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80]},{"name":"Other","color":"#F79E39","values":[0,0,0,10,0,60,50,100,110,150,220,150,190,170,170,190,170,160,130,150,290,100,170,100,20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,10,10,10,0,10,0,20,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/24.json b/public/chartDummyData/views_zoom/2018-06/24.json new file mode 100644 index 000000000..906912321 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529539200000,1529542800000,1529546400000,1529550000000,1529553600000,1529557200000,1529560800000,1529564400000,1529568000000,1529571600000,1529575200000,1529578800000,1529582400000,1529586000000,1529589600000,1529593200000,1529596800000,1529600400000,1529604000000,1529607600000,1529611200000,1529614800000,1529618400000,1529622000000,1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,290,80,30,30,240,510,650,630,840,980,1140,940,1060,1040,1020,810,1280,1120,1020,1150,1240,580,660,230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370]},{"name":"URL","color":"#2373DB","values":[210,130,10,0,20,130,390,410,560,710,810,760,840,760,820,1090,1090,1060,880,830,800,530,410,210,320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410]},{"name":"Groups","color":"#9ED448","values":[240,80,50,20,20,280,360,550,370,640,890,1100,1490,1240,720,500,1010,920,1020,1210,1450,1230,870,620,360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,20,20,0,20,80,10,60,30,40,40,50,20,30,70,90,60,80,60,30,30,10,10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,20,340,40,20,120,80,110,220,270,220,140,80,190,140,150,60,160,260,40,120,80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170]},{"name":"Other","color":"#F79E39","values":[20,30,10,0,20,60,90,70,190,100,80,150,180,210,160,130,230,170,180,160,190,220,160,130,80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,20,10,10,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/25.json b/public/chartDummyData/views_zoom/2018-06/25.json new file mode 100644 index 000000000..3e823f07e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529625600000,1529629200000,1529632800000,1529636400000,1529640000000,1529643600000,1529647200000,1529650800000,1529654400000,1529658000000,1529661600000,1529665200000,1529668800000,1529672400000,1529676000000,1529679600000,1529683200000,1529686800000,1529690400000,1529694000000,1529697600000,1529701200000,1529704800000,1529708400000,1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,80,50,30,60,400,340,630,760,970,1010,1060,1050,920,1110,990,1020,910,1400,850,1160,1020,720,450,320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790]},{"name":"URL","color":"#2373DB","values":[320,0,10,0,0,140,220,500,490,900,850,770,940,710,790,900,1000,1160,860,790,730,440,310,150,100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330]},{"name":"Groups","color":"#9ED448","values":[360,130,140,20,70,180,360,430,580,650,860,1030,1080,680,900,680,810,730,1230,930,1130,920,990,640,290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,10,40,40,20,20,40,20,50,40,40,80,70,80,70,50,110,80,40,30,0,30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50]},{"name":"Search","color":"#F5BD25","values":[80,0,0,20,140,270,100,90,20,40,130,130,90,30,350,80,90,170,40,330,80,90,10,50,20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70]},{"name":"Other","color":"#F79E39","values":[80,0,20,0,40,60,70,130,90,220,110,210,130,140,210,170,110,200,70,190,150,120,170,90,60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,30,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/26.json b/public/chartDummyData/views_zoom/2018-06/26.json new file mode 100644 index 000000000..12518d5dd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529712000000,1529715600000,1529719200000,1529722800000,1529726400000,1529730000000,1529733600000,1529737200000,1529740800000,1529744400000,1529748000000,1529751600000,1529755200000,1529758800000,1529762400000,1529766000000,1529769600000,1529773200000,1529776800000,1529780400000,1529784000000,1529787600000,1529791200000,1529794800000,1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,110,260,20,80,150,530,820,940,980,1280,910,840,980,1140,870,820,1190,810,1060,850,740,850,480,230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340]},{"name":"URL","color":"#2373DB","values":[100,50,30,0,0,10,220,280,410,550,950,610,610,640,660,570,680,720,660,620,620,540,310,190,240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250]},{"name":"Groups","color":"#9ED448","values":[290,30,20,40,40,70,340,570,750,1000,520,950,990,480,890,720,610,780,660,970,680,780,950,670,380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700]},{"name":"Channel","color":"#4fae4e","values":[30,0,10,0,0,0,40,10,50,30,20,50,70,40,20,80,50,70,70,80,70,70,50,60,0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10]},{"name":"Search","color":"#F5BD25","values":[20,0,0,0,10,20,190,220,170,190,60,200,150,50,120,60,70,80,80,70,60,50,60,30,140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30]},{"name":"Other","color":"#F79E39","values":[60,10,10,10,0,50,40,130,160,110,170,170,260,210,240,130,110,90,120,100,130,150,80,90,70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,10,0,20,0,0,10,0,10,20,10,0,0,0,10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/27.json b/public/chartDummyData/views_zoom/2018-06/27.json new file mode 100644 index 000000000..826601182 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529798400000,1529802000000,1529805600000,1529809200000,1529812800000,1529816400000,1529820000000,1529823600000,1529827200000,1529830800000,1529834400000,1529838000000,1529841600000,1529845200000,1529848800000,1529852400000,1529856000000,1529859600000,1529863200000,1529866800000,1529870400000,1529874000000,1529877600000,1529881200000,1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,190,70,70,50,120,440,540,680,940,1230,1190,1220,1020,950,1170,1160,1170,1070,960,1280,1430,1030,920,180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290]},{"name":"URL","color":"#2373DB","values":[240,120,30,10,20,0,50,320,400,590,670,560,570,670,590,580,670,880,730,790,800,550,410,230,80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200]},{"name":"Groups","color":"#9ED448","values":[380,200,90,50,60,90,230,350,610,590,830,950,900,610,550,690,830,680,930,920,1210,1320,870,470,350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350]},{"name":"Channel","color":"#4fae4e","values":[0,20,0,70,0,0,10,20,30,50,40,80,30,50,30,80,50,130,130,180,100,130,90,40,0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10]},{"name":"Search","color":"#F5BD25","values":[140,50,10,60,20,30,130,190,260,100,70,180,150,130,60,60,60,260,90,40,180,50,50,0,10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20]},{"name":"Other","color":"#F79E39","values":[70,20,0,10,0,30,40,90,140,170,120,150,100,230,150,130,200,180,160,210,170,190,170,40,10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,0,20,0,0,0,20,0,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/28.json b/public/chartDummyData/views_zoom/2018-06/28.json new file mode 100644 index 000000000..93dbb57f6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529884800000,1529888400000,1529892000000,1529895600000,1529899200000,1529902800000,1529906400000,1529910000000,1529913600000,1529917200000,1529920800000,1529924400000,1529928000000,1529931600000,1529935200000,1529938800000,1529942400000,1529946000000,1529949600000,1529953200000,1529956800000,1529960400000,1529964000000,1529967600000,1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,100,50,30,90,360,320,480,700,720,940,1090,890,960,1180,890,1240,1610,870,1180,1230,960,710,660,230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370]},{"name":"URL","color":"#2373DB","values":[80,100,0,0,30,170,140,300,360,430,860,660,800,780,780,760,960,820,670,960,600,600,490,200,80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310]},{"name":"Groups","color":"#9ED448","values":[350,140,60,10,110,170,450,520,430,550,810,1000,860,790,600,580,800,740,870,1400,1380,1430,970,500,350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700]},{"name":"Channel","color":"#4fae4e","values":[0,0,20,10,0,40,20,20,40,60,70,60,70,30,60,30,80,60,60,50,20,80,100,40,10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110]},{"name":"Search","color":"#F5BD25","values":[10,10,0,30,280,80,80,90,160,150,50,20,30,50,40,170,330,100,80,60,360,170,80,40,80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40]},{"name":"Other","color":"#F79E39","values":[10,10,10,0,10,80,60,120,150,70,70,210,200,180,160,100,160,200,200,200,130,170,100,90,20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/29.json b/public/chartDummyData/views_zoom/2018-06/29.json new file mode 100644 index 000000000..03fe827fb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1529971200000,1529974800000,1529978400000,1529982000000,1529985600000,1529989200000,1529992800000,1529996400000,1530000000000,1530003600000,1530007200000,1530010800000,1530014400000,1530018000000,1530021600000,1530025200000,1530028800000,1530032400000,1530036000000,1530039600000,1530043200000,1530046800000,1530050400000,1530054000000,1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,80,90,100,30,200,390,860,710,850,1020,840,840,1040,1130,870,930,1640,990,1070,1210,1220,570,440,220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290]},{"name":"URL","color":"#2373DB","values":[80,20,0,10,30,80,200,550,430,730,890,1020,700,670,800,910,1130,870,830,800,640,650,380,120,100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230]},{"name":"Groups","color":"#9ED448","values":[350,180,20,0,40,200,320,590,690,710,740,920,830,820,710,800,740,1100,1170,1260,1330,1350,1020,740,200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,10,60,60,100,20,10,60,80,50,70,80,110,40,10,120,70,110,50,60,30,70,100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60]},{"name":"Search","color":"#F5BD25","values":[80,40,0,310,90,140,330,230,70,170,130,160,100,130,140,100,60,120,120,70,90,100,20,80,160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20]},{"name":"Other","color":"#F79E39","values":[20,10,10,10,10,100,90,160,70,150,220,200,140,310,160,180,150,140,230,270,180,120,120,50,20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,20,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-06/30.json b/public/chartDummyData/views_zoom/2018-06/30.json new file mode 100644 index 000000000..3b97801de --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-06/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530057600000,1530061200000,1530064800000,1530068400000,1530072000000,1530075600000,1530079200000,1530082800000,1530086400000,1530090000000,1530093600000,1530097200000,1530100800000,1530104400000,1530108000000,1530111600000,1530115200000,1530118800000,1530122400000,1530126000000,1530129600000,1530133200000,1530136800000,1530140400000,1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,180,60,10,40,350,480,720,950,860,1260,1090,230,820,870,1300,920,1110,1150,1050,1200,1270,500,370,330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510]},{"name":"URL","color":"#2373DB","values":[100,10,80,10,30,80,280,350,540,650,750,820,130,650,760,850,710,980,1040,840,740,510,310,410,70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170]},{"name":"Groups","color":"#9ED448","values":[200,80,260,70,120,370,430,820,720,540,890,990,190,630,600,770,820,980,800,1070,1170,1170,680,520,190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460]},{"name":"Channel","color":"#4fae4e","values":[100,10,0,10,0,50,130,40,50,30,30,70,10,30,30,40,10,110,70,80,80,70,30,60,20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50]},{"name":"Search","color":"#F5BD25","values":[160,10,50,0,20,340,140,30,30,80,190,170,10,190,140,160,100,50,180,310,220,100,110,170,0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50]},{"name":"Other","color":"#F79E39","values":[20,40,20,0,70,60,90,160,120,220,200,150,30,140,160,120,210,190,200,150,240,190,210,60,50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,0,10,0,10,0,0,0,0,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/01.json b/public/chartDummyData/views_zoom/2018-07/01.json new file mode 100644 index 000000000..31fb5526e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530144000000,1530147600000,1530151200000,1530154800000,1530158400000,1530162000000,1530165600000,1530169200000,1530172800000,1530176400000,1530180000000,1530183600000,1530187200000,1530190800000,1530194400000,1530198000000,1530201600000,1530205200000,1530208800000,1530212400000,1530216000000,1530219600000,1530223200000,1530226800000,1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[330,190,100,40,60,980,550,490,790,920,1080,830,1270,1250,970,990,1350,960,1150,1040,1220,920,780,790,290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420]},{"name":"URL","color":"#2373DB","values":[70,30,0,0,20,90,330,440,420,760,780,1010,970,730,750,820,1300,870,850,880,740,830,260,330,170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170]},{"name":"Groups","color":"#9ED448","values":[190,120,40,30,70,220,310,500,510,580,810,850,880,720,910,600,770,780,960,1240,1170,1070,1040,290,210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610]},{"name":"Channel","color":"#4fae4e","values":[20,30,0,0,30,90,30,20,30,30,80,30,50,40,30,60,60,70,80,60,140,80,40,50,20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30]},{"name":"Search","color":"#F5BD25","values":[0,30,0,0,10,380,60,120,60,60,100,90,140,50,170,70,70,120,80,60,150,60,190,70,20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60]},{"name":"Other","color":"#F79E39","values":[50,40,10,10,0,60,150,180,80,150,250,160,230,150,110,110,180,150,180,160,220,190,140,60,20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,20,20,10,0,10,10,10,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/02.json b/public/chartDummyData/views_zoom/2018-07/02.json new file mode 100644 index 000000000..3bc0cc473 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530230400000,1530234000000,1530237600000,1530241200000,1530244800000,1530248400000,1530252000000,1530255600000,1530259200000,1530262800000,1530266400000,1530270000000,1530273600000,1530277200000,1530280800000,1530284400000,1530288000000,1530291600000,1530295200000,1530298800000,1530302400000,1530306000000,1530309600000,1530313200000,1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,100,50,20,190,210,330,700,870,750,920,920,1040,690,820,970,1010,1060,940,1000,920,1300,710,340,320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460]},{"name":"URL","color":"#2373DB","values":[170,140,120,140,200,140,210,490,370,560,780,840,650,560,690,740,1220,930,950,990,830,340,360,250,150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260]},{"name":"Groups","color":"#9ED448","values":[210,230,90,50,100,180,280,690,560,710,860,780,960,700,740,790,820,840,810,910,1130,1260,1140,700,240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610]},{"name":"Channel","color":"#4fae4e","values":[20,10,10,10,40,90,30,50,80,60,60,20,70,30,20,60,140,50,50,40,50,40,60,10,10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20]},{"name":"Search","color":"#F5BD25","values":[20,20,0,0,110,210,120,250,20,210,140,210,110,80,90,140,200,150,50,120,100,30,10,30,50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30]},{"name":"Other","color":"#F79E39","values":[20,0,10,10,20,80,40,140,210,120,250,210,360,160,150,90,140,100,110,210,110,80,130,80,70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,10,0,10,0,0,10,50,10,10,10,0,0,10,0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/03.json b/public/chartDummyData/views_zoom/2018-07/03.json new file mode 100644 index 000000000..de4a9aee5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530316800000,1530320400000,1530324000000,1530327600000,1530331200000,1530334800000,1530338400000,1530342000000,1530345600000,1530349200000,1530352800000,1530356400000,1530360000000,1530363600000,1530367200000,1530370800000,1530374400000,1530378000000,1530381600000,1530385200000,1530388800000,1530392400000,1530396000000,1530399600000,1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,160,130,90,30,120,420,590,710,930,810,950,1150,890,1290,1170,1080,990,1070,1050,920,730,460,290,300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310]},{"name":"URL","color":"#2373DB","values":[150,40,10,20,20,10,210,160,470,550,670,550,530,530,520,470,610,730,760,600,500,430,490,200,110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160]},{"name":"Groups","color":"#9ED448","values":[240,200,70,90,60,140,350,370,780,630,820,1280,940,1250,770,450,830,530,600,850,870,1020,610,350,400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720]},{"name":"Channel","color":"#4fae4e","values":[10,20,0,10,30,0,20,40,40,20,60,60,180,80,50,30,90,130,40,20,40,50,70,10,20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40]},{"name":"Search","color":"#F5BD25","values":[50,0,10,0,10,100,80,150,70,50,140,60,110,170,70,70,50,20,20,90,190,20,20,20,0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20]},{"name":"Other","color":"#F79E39","values":[70,20,10,0,20,20,50,160,100,190,180,160,140,110,150,110,50,120,100,90,180,80,100,60,50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,20,10,10,10,20,10,20,10,0,0,0,0,30,0,0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/04.json b/public/chartDummyData/views_zoom/2018-07/04.json new file mode 100644 index 000000000..658979d8c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530403200000,1530406800000,1530410400000,1530414000000,1530417600000,1530421200000,1530424800000,1530428400000,1530432000000,1530435600000,1530439200000,1530442800000,1530446400000,1530450000000,1530453600000,1530457200000,1530460800000,1530464400000,1530468000000,1530471600000,1530475200000,1530478800000,1530482400000,1530486000000,1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[300,130,170,40,10,100,440,580,510,1080,1420,1020,950,840,1820,990,1100,1150,1260,1140,1320,1010,530,370,250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570]},{"name":"URL","color":"#2373DB","values":[110,60,60,10,10,0,50,140,370,340,640,590,770,570,530,580,550,600,790,770,750,540,370,310,140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250]},{"name":"Groups","color":"#9ED448","values":[400,80,60,40,20,100,430,510,970,780,700,650,840,1060,960,720,1010,620,880,1030,1110,1160,1130,700,350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840]},{"name":"Channel","color":"#4fae4e","values":[20,10,20,0,0,80,0,30,30,70,80,60,40,60,30,80,100,30,70,80,80,150,30,110,20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30]},{"name":"Search","color":"#F5BD25","values":[0,10,10,0,20,20,150,370,190,130,150,130,170,50,100,390,90,100,130,60,40,110,70,40,10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80]},{"name":"Other","color":"#F79E39","values":[50,20,10,0,10,10,40,130,170,140,160,130,150,170,180,140,130,110,110,190,180,150,140,110,60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,0,0,10,10,30,20,10,0,0,0,10,10,0,10,0,0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/05.json b/public/chartDummyData/views_zoom/2018-07/05.json new file mode 100644 index 000000000..8bf4c3831 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530489600000,1530493200000,1530496800000,1530500400000,1530504000000,1530507600000,1530511200000,1530514800000,1530518400000,1530522000000,1530525600000,1530529200000,1530532800000,1530536400000,1530540000000,1530543600000,1530547200000,1530550800000,1530554400000,1530558000000,1530561600000,1530565200000,1530568800000,1530572400000,1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,90,30,40,120,340,480,590,910,940,910,890,1120,960,820,1280,940,1250,1130,1070,990,1520,710,290,230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320]},{"name":"URL","color":"#2373DB","values":[140,50,20,30,40,60,240,320,470,450,560,900,630,550,490,680,1050,910,1100,910,890,570,480,230,20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220]},{"name":"Groups","color":"#9ED448","values":[350,50,10,0,120,240,290,480,600,750,810,930,1090,740,580,980,740,1080,960,1000,1420,1410,880,440,270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750]},{"name":"Channel","color":"#4fae4e","values":[20,10,30,10,20,40,30,70,80,90,60,80,60,30,80,60,70,30,70,100,60,70,50,60,10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20]},{"name":"Search","color":"#F5BD25","values":[10,40,0,0,0,150,50,90,70,600,120,180,150,110,140,50,100,90,100,180,50,80,50,20,0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110]},{"name":"Other","color":"#F79E39","values":[60,10,0,40,10,50,60,70,160,120,150,140,150,150,110,100,140,120,120,150,230,250,90,70,10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,0,10,20,10,10,0,10,10,10,10,20,10,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/06.json b/public/chartDummyData/views_zoom/2018-07/06.json new file mode 100644 index 000000000..cf69f9f3a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530576000000,1530579600000,1530583200000,1530586800000,1530590400000,1530594000000,1530597600000,1530601200000,1530604800000,1530608400000,1530612000000,1530615600000,1530619200000,1530622800000,1530626400000,1530630000000,1530633600000,1530637200000,1530640800000,1530644400000,1530648000000,1530651600000,1530655200000,1530658800000,1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,130,60,50,30,580,590,830,1090,1290,990,1710,1500,1370,1210,920,730,840,1220,1130,1040,990,650,510,230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330]},{"name":"URL","color":"#2373DB","values":[20,40,20,10,20,50,220,410,640,460,860,810,750,600,800,710,930,1010,850,850,970,620,340,170,80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260]},{"name":"Groups","color":"#9ED448","values":[270,160,70,40,80,260,470,530,630,740,830,870,930,740,670,720,1010,760,970,980,1300,1540,980,460,430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430]},{"name":"Channel","color":"#4fae4e","values":[10,30,10,0,60,20,20,20,40,70,140,80,260,90,50,70,50,50,90,130,80,80,40,50,10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30]},{"name":"Search","color":"#F5BD25","values":[0,10,20,40,60,190,140,370,20,160,30,190,130,130,90,200,210,280,100,190,90,100,50,50,100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30]},{"name":"Other","color":"#F79E39","values":[10,10,10,20,0,120,110,150,130,130,250,190,270,170,260,160,190,170,190,190,80,200,130,120,30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/07.json b/public/chartDummyData/views_zoom/2018-07/07.json new file mode 100644 index 000000000..c40b71bd1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530662400000,1530666000000,1530669600000,1530673200000,1530676800000,1530680400000,1530684000000,1530687600000,1530691200000,1530694800000,1530698400000,1530702000000,1530705600000,1530709200000,1530712800000,1530716400000,1530720000000,1530723600000,1530727200000,1530730800000,1530734400000,1530738000000,1530741600000,1530745200000,1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,90,40,20,70,270,420,720,760,1160,850,1110,1120,870,1060,860,1080,1160,1100,1020,1070,1130,840,420,370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510]},{"name":"URL","color":"#2373DB","values":[80,40,10,30,10,90,280,380,430,800,710,860,660,640,650,830,890,1060,1080,870,830,580,530,170,150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180]},{"name":"Groups","color":"#9ED448","values":[430,150,70,10,90,260,310,560,700,710,710,1000,1090,930,860,830,670,870,900,880,1200,1520,790,610,290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,0,100,10,50,20,100,80,90,60,80,60,110,130,90,70,70,40,100,50,30,20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10]},{"name":"Search","color":"#F5BD25","values":[100,10,0,10,20,270,80,210,40,170,100,80,90,50,110,110,30,140,130,60,140,30,250,60,10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10]},{"name":"Other","color":"#F79E39","values":[30,0,10,10,40,20,90,140,100,200,200,270,250,190,110,170,140,200,230,160,180,190,140,50,50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,20,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/08.json b/public/chartDummyData/views_zoom/2018-07/08.json new file mode 100644 index 000000000..06f97c0e8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530748800000,1530752400000,1530756000000,1530759600000,1530763200000,1530766800000,1530770400000,1530774000000,1530777600000,1530781200000,1530784800000,1530788400000,1530792000000,1530795600000,1530799200000,1530802800000,1530806400000,1530810000000,1530813600000,1530817200000,1530820800000,1530824400000,1530828000000,1530831600000,1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[370,190,130,10,30,130,390,870,600,700,1080,990,910,760,850,1030,1070,810,1100,1080,1140,810,810,460,280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420]},{"name":"URL","color":"#2373DB","values":[150,50,60,10,20,100,260,350,490,610,970,630,610,580,720,890,850,1010,1070,770,670,640,360,260,120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270]},{"name":"Groups","color":"#9ED448","values":[290,160,20,0,110,330,440,580,490,700,620,810,810,980,840,700,750,490,860,1110,1380,1330,1090,610,310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430]},{"name":"Channel","color":"#4fae4e","values":[20,10,0,0,0,100,70,50,30,40,80,60,120,70,90,30,100,70,100,70,20,90,10,20,50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10]},{"name":"Search","color":"#F5BD25","values":[10,10,30,0,0,300,260,110,70,50,60,140,130,70,60,250,40,50,170,90,100,150,200,30,30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110]},{"name":"Other","color":"#F79E39","values":[50,20,10,0,20,110,70,110,60,100,130,120,200,110,110,230,190,90,180,150,130,180,60,70,50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,20,0,0,0,10,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/09.json b/public/chartDummyData/views_zoom/2018-07/09.json new file mode 100644 index 000000000..464e918a3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530835200000,1530838800000,1530842400000,1530846000000,1530849600000,1530853200000,1530856800000,1530860400000,1530864000000,1530867600000,1530871200000,1530874800000,1530878400000,1530882000000,1530885600000,1530889200000,1530892800000,1530896400000,1530900000000,1530903600000,1530907200000,1530910800000,1530914400000,1530918000000,1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[280,160,40,60,50,200,410,840,740,1150,990,1070,1020,1020,910,860,1080,1020,910,940,840,700,580,310,250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350]},{"name":"URL","color":"#2373DB","values":[120,60,20,10,40,90,190,430,440,810,780,600,670,560,680,710,1190,1110,1030,720,750,580,470,160,140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320]},{"name":"Groups","color":"#9ED448","values":[310,140,30,10,60,170,370,390,540,680,790,870,860,650,650,880,600,590,820,870,990,1050,760,720,690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770]},{"name":"Channel","color":"#4fae4e","values":[50,10,0,0,0,20,30,50,70,30,10,10,70,80,20,120,90,50,90,40,100,50,30,40,10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90]},{"name":"Search","color":"#F5BD25","values":[30,0,20,0,50,340,10,80,280,140,310,260,80,60,50,80,60,240,70,120,80,60,10,20,30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60]},{"name":"Other","color":"#F79E39","values":[50,20,10,10,30,80,140,130,190,130,180,230,210,200,130,120,100,120,160,110,130,110,70,60,20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,20,20,0,0,0,0,0,0,10,10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/10.json b/public/chartDummyData/views_zoom/2018-07/10.json new file mode 100644 index 000000000..dcd316e75 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1530921600000,1530925200000,1530928800000,1530932400000,1530936000000,1530939600000,1530943200000,1530946800000,1530950400000,1530954000000,1530957600000,1530961200000,1530964800000,1530968400000,1530972000000,1530975600000,1530979200000,1530982800000,1530986400000,1530990000000,1530993600000,1530997200000,1531000800000,1531004400000,1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,180,60,10,30,120,370,510,850,820,760,860,1090,900,980,1060,860,980,860,1220,990,840,1120,570,440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420]},{"name":"URL","color":"#2373DB","values":[140,60,140,110,40,60,80,290,470,610,680,440,710,470,560,670,620,600,870,680,340,360,380,250,70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200]},{"name":"Groups","color":"#9ED448","values":[690,250,90,90,30,140,260,330,460,720,890,710,880,730,800,910,540,640,620,880,690,1130,710,840,360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640]},{"name":"Channel","color":"#4fae4e","values":[10,20,30,0,0,30,30,40,50,50,80,100,110,150,50,50,60,70,50,80,50,130,60,30,70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30]},{"name":"Search","color":"#F5BD25","values":[30,30,10,10,0,10,290,50,40,50,120,60,60,540,260,50,90,160,40,70,40,880,180,80,30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80]},{"name":"Other","color":"#F79E39","values":[20,50,30,0,0,30,80,60,130,160,130,180,230,70,110,140,100,80,210,110,130,120,100,90,40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,0,10,0,10,0,20,10,30,10,20,30,0,10,20,0,10,0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/11.json b/public/chartDummyData/views_zoom/2018-07/11.json new file mode 100644 index 000000000..6d97e4a53 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531008000000,1531011600000,1531015200000,1531018800000,1531022400000,1531026000000,1531029600000,1531033200000,1531036800000,1531040400000,1531044000000,1531047600000,1531051200000,1531054800000,1531058400000,1531062000000,1531065600000,1531069200000,1531072800000,1531076400000,1531080000000,1531083600000,1531087200000,1531090800000,1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[440,80,70,20,20,40,300,450,560,990,960,760,1010,1050,820,850,1160,1170,820,930,810,790,1020,320,170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550]},{"name":"URL","color":"#2373DB","values":[70,80,0,0,0,10,80,200,270,380,640,520,590,500,500,530,610,700,550,930,590,490,420,220,110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170]},{"name":"Groups","color":"#9ED448","values":[360,300,170,120,230,70,80,240,510,550,610,660,980,680,550,520,770,780,1330,900,1150,1080,1130,750,260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660]},{"name":"Channel","color":"#4fae4e","values":[70,10,10,0,0,20,30,50,10,70,30,50,60,40,50,60,40,30,10,100,90,20,60,20,40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,0,120,180,200,150,190,140,1020,290,140,20,100,80,50,120,40,120,80,50,110,10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0]},{"name":"Other","color":"#F79E39","values":[40,10,30,10,0,20,0,90,90,120,160,90,100,180,110,120,110,130,200,160,140,120,90,50,10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,20,0,0,0,10,0,0,10,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/12.json b/public/chartDummyData/views_zoom/2018-07/12.json new file mode 100644 index 000000000..d220ade11 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531094400000,1531098000000,1531101600000,1531105200000,1531108800000,1531112400000,1531116000000,1531119600000,1531123200000,1531126800000,1531130400000,1531134000000,1531137600000,1531141200000,1531144800000,1531148400000,1531152000000,1531155600000,1531159200000,1531162800000,1531166400000,1531170000000,1531173600000,1531177200000,1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,60,40,60,130,180,520,570,750,740,880,1070,1270,890,870,940,940,1050,1020,1120,1290,1060,650,330,190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680]},{"name":"URL","color":"#2373DB","values":[110,90,0,0,40,110,250,180,390,650,530,690,660,570,390,700,870,1130,710,800,750,790,540,260,80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230]},{"name":"Groups","color":"#9ED448","values":[260,100,70,70,110,190,290,390,430,530,490,1090,970,920,810,640,900,950,930,1180,2040,1360,1120,430,240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760]},{"name":"Channel","color":"#4fae4e","values":[40,0,0,0,0,0,90,20,60,30,70,70,50,50,60,30,90,50,70,140,40,30,40,30,20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0]},{"name":"Search","color":"#F5BD25","values":[10,40,60,0,430,100,180,50,110,40,200,80,60,40,130,120,30,30,60,50,70,80,100,30,0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50]},{"name":"Other","color":"#F79E39","values":[10,40,20,20,30,80,130,100,140,170,270,210,220,130,120,120,130,260,140,230,210,170,170,60,50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,30,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/13.json b/public/chartDummyData/views_zoom/2018-07/13.json new file mode 100644 index 000000000..1f57ce552 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531180800000,1531184400000,1531188000000,1531191600000,1531195200000,1531198800000,1531202400000,1531206000000,1531209600000,1531213200000,1531216800000,1531220400000,1531224000000,1531227600000,1531231200000,1531234800000,1531238400000,1531242000000,1531245600000,1531249200000,1531252800000,1531256400000,1531260000000,1531263600000,1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,90,50,40,80,180,520,610,750,810,1150,1010,850,1060,1100,1030,1070,1290,960,1110,1080,970,920,510,250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550]},{"name":"URL","color":"#2373DB","values":[80,60,30,0,20,70,120,260,390,680,610,710,620,560,680,710,830,960,860,860,580,270,430,180,30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140]},{"name":"Groups","color":"#9ED448","values":[240,300,60,20,100,140,500,610,600,430,820,1030,760,820,740,820,710,1060,1090,1110,1360,1340,980,470,340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720]},{"name":"Channel","color":"#4fae4e","values":[20,10,10,10,10,10,30,10,40,70,50,80,60,20,50,40,70,60,70,30,90,70,20,10,20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20]},{"name":"Search","color":"#F5BD25","values":[0,0,10,10,0,80,140,50,50,60,60,100,150,160,50,130,150,140,190,390,120,90,70,10,0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70]},{"name":"Other","color":"#F79E39","values":[50,10,10,40,30,140,130,100,120,200,100,160,210,140,200,240,260,170,190,180,310,190,150,80,60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/14.json b/public/chartDummyData/views_zoom/2018-07/14.json new file mode 100644 index 000000000..d93e37cfb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531267200000,1531270800000,1531274400000,1531278000000,1531281600000,1531285200000,1531288800000,1531292400000,1531296000000,1531299600000,1531303200000,1531306800000,1531310400000,1531314000000,1531317600000,1531321200000,1531324800000,1531328400000,1531332000000,1531335600000,1531339200000,1531342800000,1531346400000,1531350000000,1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,100,40,60,60,120,330,630,820,900,960,1360,980,1330,1030,1050,1270,1060,1020,940,1230,1010,830,420,160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470]},{"name":"URL","color":"#2373DB","values":[30,90,10,0,20,80,280,270,670,580,840,770,690,590,590,950,840,670,770,900,670,580,440,270,90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150]},{"name":"Groups","color":"#9ED448","values":[340,240,20,170,150,180,430,550,590,560,810,860,680,720,690,700,760,850,840,900,1480,1620,1300,430,250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520]},{"name":"Channel","color":"#4fae4e","values":[20,0,10,0,10,0,10,30,70,70,40,90,50,50,150,140,150,20,80,70,50,30,40,10,10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20]},{"name":"Search","color":"#F5BD25","values":[0,140,10,0,0,250,130,70,80,130,110,70,220,130,80,300,190,70,160,40,210,40,40,110,20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10]},{"name":"Other","color":"#F79E39","values":[60,30,30,10,20,80,100,180,100,100,150,200,140,140,130,140,140,180,210,170,200,150,110,60,30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/15.json b/public/chartDummyData/views_zoom/2018-07/15.json new file mode 100644 index 000000000..f802d750d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531353600000,1531357200000,1531360800000,1531364400000,1531368000000,1531371600000,1531375200000,1531378800000,1531382400000,1531386000000,1531389600000,1531393200000,1531396800000,1531400400000,1531404000000,1531407600000,1531411200000,1531414800000,1531418400000,1531422000000,1531425600000,1531429200000,1531432800000,1531436400000,1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,270,150,80,60,300,430,600,890,700,1160,1210,1250,990,1120,1020,1330,1060,940,1050,1070,1130,790,350,220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580]},{"name":"URL","color":"#2373DB","values":[90,60,0,0,20,180,190,410,640,570,740,760,800,770,510,700,810,1140,840,870,970,840,690,320,70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380]},{"name":"Groups","color":"#9ED448","values":[250,130,50,80,60,320,410,650,700,580,740,910,880,830,520,540,540,920,700,840,1350,1240,1260,770,690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050]},{"name":"Channel","color":"#4fae4e","values":[10,10,20,0,10,0,10,30,90,60,60,60,20,80,110,140,20,80,100,60,40,160,60,90,30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0]},{"name":"Search","color":"#F5BD25","values":[20,0,20,0,500,30,50,50,200,220,120,70,50,140,140,320,110,280,120,40,80,140,20,60,20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40]},{"name":"Other","color":"#F79E39","values":[30,20,10,30,20,110,100,160,180,180,90,140,140,260,180,160,190,160,260,180,190,210,150,100,20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,10,0,0,10,0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/16.json b/public/chartDummyData/views_zoom/2018-07/16.json new file mode 100644 index 000000000..997f40b8e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531440000000,1531443600000,1531447200000,1531450800000,1531454400000,1531458000000,1531461600000,1531465200000,1531468800000,1531472400000,1531476000000,1531479600000,1531483200000,1531486800000,1531490400000,1531494000000,1531497600000,1531501200000,1531504800000,1531508400000,1531512000000,1531515600000,1531519200000,1531522800000,1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,180,30,10,30,270,520,930,570,880,930,1250,930,1440,800,930,1050,1100,850,910,1070,850,700,420,150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450]},{"name":"URL","color":"#2373DB","values":[70,20,10,20,20,100,250,390,560,710,700,810,450,450,670,870,900,930,950,680,690,500,310,200,210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300]},{"name":"Groups","color":"#9ED448","values":[690,70,70,10,120,370,520,500,820,670,950,920,830,940,790,750,820,610,800,1030,1040,1000,850,640,260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,20,0,90,10,50,10,10,60,70,40,80,110,80,90,50,80,140,50,20,60,30,20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20]},{"name":"Search","color":"#F5BD25","values":[20,10,0,0,0,60,480,410,160,100,210,70,70,220,160,140,140,210,40,70,90,80,60,80,60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120]},{"name":"Other","color":"#F79E39","values":[20,30,10,10,10,140,100,130,170,140,140,220,90,250,160,170,180,110,130,170,210,150,80,70,70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,20,0,0,0,0,0,10,30,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/17.json b/public/chartDummyData/views_zoom/2018-07/17.json new file mode 100644 index 000000000..b0c9db401 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531526400000,1531530000000,1531533600000,1531537200000,1531540800000,1531544400000,1531548000000,1531551600000,1531555200000,1531558800000,1531562400000,1531566000000,1531569600000,1531573200000,1531576800000,1531580400000,1531584000000,1531587600000,1531591200000,1531594800000,1531598400000,1531602000000,1531605600000,1531609200000,1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,180,100,30,50,120,630,510,560,980,960,1050,1360,1000,1330,1040,1070,980,1030,1180,950,800,590,550,270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480]},{"name":"URL","color":"#2373DB","values":[210,40,10,0,40,60,110,370,530,610,610,590,680,620,690,920,760,900,750,790,820,630,350,170,110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230]},{"name":"Groups","color":"#9ED448","values":[260,130,40,30,50,130,300,420,570,450,760,550,1490,810,580,870,620,650,780,820,850,940,910,660,400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650]},{"name":"Channel","color":"#4fae4e","values":[20,0,10,0,0,10,70,20,30,70,70,70,110,50,40,30,50,70,80,50,10,80,50,60,50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40]},{"name":"Search","color":"#F5BD25","values":[60,20,10,0,0,30,870,60,80,40,100,80,110,110,60,60,120,40,90,70,120,40,50,0,100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20]},{"name":"Other","color":"#F79E39","values":[70,40,20,10,0,70,90,200,170,130,100,240,110,100,90,150,230,160,130,140,140,90,110,90,40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/18.json b/public/chartDummyData/views_zoom/2018-07/18.json new file mode 100644 index 000000000..e397ad63f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531612800000,1531616400000,1531620000000,1531623600000,1531627200000,1531630800000,1531634400000,1531638000000,1531641600000,1531645200000,1531648800000,1531652400000,1531656000000,1531659600000,1531663200000,1531666800000,1531670400000,1531674000000,1531677600000,1531681200000,1531684800000,1531688400000,1531692000000,1531695600000,1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,170,100,20,60,50,180,370,760,810,990,900,1080,1180,940,740,1310,1270,990,880,1130,1200,620,680,240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640]},{"name":"URL","color":"#2373DB","values":[110,130,30,10,0,40,80,90,390,440,680,400,630,660,680,530,820,730,670,870,560,400,390,230,100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350]},{"name":"Groups","color":"#9ED448","values":[400,200,140,80,50,60,220,470,580,600,830,780,1020,660,730,610,1010,950,980,750,1260,1570,890,760,250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700]},{"name":"Channel","color":"#4fae4e","values":[50,10,0,20,10,10,10,40,80,40,50,80,130,130,60,10,20,40,80,90,110,60,80,0,0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30]},{"name":"Search","color":"#F5BD25","values":[100,20,0,30,0,10,180,240,90,50,210,80,30,100,150,210,90,130,170,100,80,110,60,50,70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120]},{"name":"Other","color":"#F79E39","values":[40,60,20,0,0,10,120,90,150,180,110,120,130,150,230,140,140,180,110,150,130,110,80,50,30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,20,10,0,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/19.json b/public/chartDummyData/views_zoom/2018-07/19.json new file mode 100644 index 000000000..96511b554 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531699200000,1531702800000,1531706400000,1531710000000,1531713600000,1531717200000,1531720800000,1531724400000,1531728000000,1531731600000,1531735200000,1531738800000,1531742400000,1531746000000,1531749600000,1531753200000,1531756800000,1531760400000,1531764000000,1531767600000,1531771200000,1531774800000,1531778400000,1531782000000,1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,70,50,70,100,200,390,410,780,850,960,1280,890,1270,1460,820,1150,1130,1140,1520,1070,870,740,550,170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630]},{"name":"URL","color":"#2373DB","values":[100,0,10,0,10,90,310,440,470,610,820,880,710,490,670,780,710,840,970,810,580,630,370,140,50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290]},{"name":"Groups","color":"#9ED448","values":[250,220,50,20,120,240,370,590,790,770,920,810,720,820,740,830,740,610,1000,1300,1280,1190,1190,720,410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640]},{"name":"Channel","color":"#4fae4e","values":[0,30,0,60,0,40,20,20,70,90,70,60,110,240,50,30,100,10,50,140,60,60,40,20,30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80]},{"name":"Search","color":"#F5BD25","values":[70,60,0,10,150,90,30,90,20,140,100,170,340,90,80,230,140,70,60,200,150,90,110,70,10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40]},{"name":"Other","color":"#F79E39","values":[30,30,10,0,10,40,130,90,100,160,350,360,350,140,190,280,160,130,290,230,180,250,130,90,20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/20.json b/public/chartDummyData/views_zoom/2018-07/20.json new file mode 100644 index 000000000..9548e621b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531785600000,1531789200000,1531792800000,1531796400000,1531800000000,1531803600000,1531807200000,1531810800000,1531814400000,1531818000000,1531821600000,1531825200000,1531828800000,1531832400000,1531836000000,1531839600000,1531843200000,1531846800000,1531850400000,1531854000000,1531857600000,1531861200000,1531864800000,1531868400000,1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,110,80,20,90,170,470,660,590,940,1030,1110,900,1020,1350,1030,1030,880,1120,1020,1550,1490,810,470,290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620]},{"name":"URL","color":"#2373DB","values":[50,50,30,0,0,100,210,340,470,830,770,740,720,580,640,740,870,1200,800,780,610,760,410,150,50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230]},{"name":"Groups","color":"#9ED448","values":[410,80,260,20,140,320,340,450,830,550,840,720,940,650,850,730,710,840,920,1070,1350,1080,990,520,170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680]},{"name":"Channel","color":"#4fae4e","values":[30,10,0,0,0,50,30,20,30,60,120,50,70,180,60,80,30,60,120,70,50,100,90,20,10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110]},{"name":"Search","color":"#F5BD25","values":[10,0,0,50,220,110,150,20,50,70,40,230,90,80,80,230,80,70,140,360,240,140,80,10,20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370]},{"name":"Other","color":"#F79E39","values":[20,10,20,20,20,80,120,130,240,160,220,180,190,190,150,100,200,320,190,180,190,200,80,80,50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/21.json b/public/chartDummyData/views_zoom/2018-07/21.json new file mode 100644 index 000000000..ecdc308ae --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531872000000,1531875600000,1531879200000,1531882800000,1531886400000,1531890000000,1531893600000,1531897200000,1531900800000,1531904400000,1531908000000,1531911600000,1531915200000,1531918800000,1531922400000,1531926000000,1531929600000,1531933200000,1531936800000,1531940400000,1531944000000,1531947600000,1531951200000,1531954800000,1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,90,30,20,80,170,400,800,860,830,1000,1210,1040,1010,1200,1050,950,980,1450,1060,1060,860,830,580,190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490]},{"name":"URL","color":"#2373DB","values":[50,40,10,20,20,100,200,530,480,600,670,750,640,710,660,820,1020,850,1000,890,680,540,430,380,190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360]},{"name":"Groups","color":"#9ED448","values":[170,130,50,20,220,280,460,550,560,530,720,750,1090,820,700,660,680,570,1060,1310,1130,1580,970,1050,280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,0,0,10,20,20,40,90,50,80,90,40,50,100,40,40,40,70,80,50,20,0,30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80]},{"name":"Search","color":"#F5BD25","values":[20,10,0,10,40,280,220,90,70,130,110,170,300,170,200,330,170,80,370,200,90,100,30,40,0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140]},{"name":"Other","color":"#F79E39","values":[50,20,30,30,30,70,80,60,150,160,120,230,160,160,140,110,90,170,180,210,240,100,120,80,70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,10,10,0,10,0,10,0,20,20,0,0,0,20,0,0,0,0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/22.json b/public/chartDummyData/views_zoom/2018-07/22.json new file mode 100644 index 000000000..327363a9a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1531958400000,1531962000000,1531965600000,1531969200000,1531972800000,1531976400000,1531980000000,1531983600000,1531987200000,1531990800000,1531994400000,1531998000000,1532001600000,1532005200000,1532008800000,1532012400000,1532016000000,1532019600000,1532023200000,1532026800000,1532030400000,1532034000000,1532037600000,1532041200000,1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,70,100,70,90,230,410,620,860,1100,1270,930,880,1260,940,810,810,1010,1110,1150,1490,1050,700,450,280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380]},{"name":"URL","color":"#2373DB","values":[190,80,20,0,40,100,390,540,470,650,930,840,780,520,650,630,760,1030,760,940,860,670,490,300,310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490]},{"name":"Groups","color":"#9ED448","values":[280,150,80,80,160,290,490,800,580,610,850,880,830,810,740,680,1000,900,870,970,1280,1440,930,700,460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720]},{"name":"Channel","color":"#4fae4e","values":[30,0,20,10,10,20,30,30,70,30,100,140,80,60,110,60,30,50,120,20,60,120,50,20,40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,200,750,100,150,40,90,50,40,90,160,160,120,530,70,90,260,300,310,130,120,50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110]},{"name":"Other","color":"#F79E39","values":[70,30,20,10,30,90,120,50,130,120,140,170,150,140,100,90,150,180,170,140,160,230,110,60,80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,10,20,0,0,0,0,20,10,30,10,0,20,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/23.json b/public/chartDummyData/views_zoom/2018-07/23.json new file mode 100644 index 000000000..8709c16e4 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532044800000,1532048400000,1532052000000,1532055600000,1532059200000,1532062800000,1532066400000,1532070000000,1532073600000,1532077200000,1532080800000,1532084400000,1532088000000,1532091600000,1532095200000,1532098800000,1532102400000,1532106000000,1532109600000,1532113200000,1532116800000,1532120400000,1532124000000,1532127600000,1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[280,150,130,50,30,160,580,570,930,760,710,1170,1130,1260,900,1150,1080,1180,1360,1320,1100,690,700,480,290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490]},{"name":"URL","color":"#2373DB","values":[310,120,10,70,10,140,200,400,500,680,780,760,600,640,920,780,840,1120,950,820,710,430,310,230,170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240]},{"name":"Groups","color":"#9ED448","values":[460,150,50,40,140,250,580,520,410,650,840,1110,1130,1060,940,840,670,610,930,870,1110,1310,1020,650,420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490]},{"name":"Channel","color":"#4fae4e","values":[40,20,0,20,20,30,20,20,60,20,90,50,50,30,20,100,30,120,70,70,40,100,70,40,0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20]},{"name":"Search","color":"#F5BD25","values":[50,20,0,20,20,120,620,200,50,90,180,150,200,110,230,140,100,20,160,210,230,1940,60,20,40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0]},{"name":"Other","color":"#F79E39","values":[80,10,0,20,10,130,80,190,130,120,100,190,220,230,190,150,170,140,210,220,180,220,90,80,30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,0,20,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/24.json b/public/chartDummyData/views_zoom/2018-07/24.json new file mode 100644 index 000000000..fd7b10e06 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532131200000,1532134800000,1532138400000,1532142000000,1532145600000,1532149200000,1532152800000,1532156400000,1532160000000,1532163600000,1532167200000,1532170800000,1532174400000,1532178000000,1532181600000,1532185200000,1532188800000,1532192400000,1532196000000,1532199600000,1532203200000,1532206800000,1532210400000,1532214000000,1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,120,60,80,80,80,510,530,770,1520,970,1140,1200,1240,1070,850,990,1060,1190,850,1220,970,670,640,380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040]},{"name":"URL","color":"#2373DB","values":[170,110,30,60,30,90,180,320,650,630,780,810,770,860,740,650,930,740,570,860,730,620,500,350,140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170]},{"name":"Groups","color":"#9ED448","values":[420,210,50,40,60,230,350,550,650,650,900,650,790,750,790,640,660,730,850,630,670,790,1050,700,630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,10,40,80,70,110,20,160,130,100,110,70,30,70,90,50,60,20,40,30,40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90]},{"name":"Search","color":"#F5BD25","values":[40,0,0,0,20,210,360,140,30,60,30,80,360,120,180,60,70,80,130,110,170,60,30,120,0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30]},{"name":"Other","color":"#F79E39","values":[30,30,30,10,10,50,110,160,130,130,150,160,170,200,110,160,150,110,190,180,140,160,110,100,60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,0,20,20,20,10,0,30,10,20,0,0,0,0,20,0,10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/25.json b/public/chartDummyData/views_zoom/2018-07/25.json new file mode 100644 index 000000000..3ba9c93ff --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532217600000,1532221200000,1532224800000,1532228400000,1532232000000,1532235600000,1532239200000,1532242800000,1532246400000,1532250000000,1532253600000,1532257200000,1532260800000,1532264400000,1532268000000,1532271600000,1532275200000,1532278800000,1532282400000,1532286000000,1532289600000,1532293200000,1532296800000,1532300400000,1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[380,210,30,90,130,120,340,260,600,850,1000,890,1210,900,1240,1030,1300,1230,1020,1130,970,980,760,630,370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550]},{"name":"URL","color":"#2373DB","values":[140,80,40,50,10,0,70,280,230,480,660,400,390,490,420,590,720,670,790,730,830,620,570,290,200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290]},{"name":"Groups","color":"#9ED448","values":[630,190,40,20,30,90,210,320,430,630,560,740,1070,660,740,890,740,1050,710,880,1240,1240,1170,640,290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730]},{"name":"Channel","color":"#4fae4e","values":[40,0,0,30,0,0,10,10,40,120,90,50,70,60,40,90,100,50,40,40,20,140,50,80,20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40]},{"name":"Search","color":"#F5BD25","values":[0,40,10,10,20,110,10,360,80,120,110,120,210,130,170,130,120,90,90,430,220,130,140,40,10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100]},{"name":"Other","color":"#F79E39","values":[60,20,20,20,20,20,30,140,110,130,100,130,200,120,140,120,120,110,150,210,120,190,110,100,40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,10,20,0,20,40,0,20,0,20,0,10,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/26.json b/public/chartDummyData/views_zoom/2018-07/26.json new file mode 100644 index 000000000..cbd0f1a8d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532304000000,1532307600000,1532311200000,1532314800000,1532318400000,1532322000000,1532325600000,1532329200000,1532332800000,1532336400000,1532340000000,1532343600000,1532347200000,1532350800000,1532354400000,1532358000000,1532361600000,1532365200000,1532368800000,1532372400000,1532376000000,1532379600000,1532383200000,1532386800000,1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[370,220,50,70,120,230,530,730,880,1110,1180,1020,1200,960,730,1330,1000,1200,1470,1460,1430,1160,890,620,180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530]},{"name":"URL","color":"#2373DB","values":[200,50,0,0,50,70,220,450,500,690,810,870,720,590,950,700,1070,1170,1030,940,750,560,370,230,100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230]},{"name":"Groups","color":"#9ED448","values":[290,40,50,20,80,230,380,660,490,830,880,910,820,1060,870,830,910,810,960,1310,1410,1170,1130,680,380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660]},{"name":"Channel","color":"#4fae4e","values":[20,30,10,0,50,60,10,80,50,70,50,60,70,110,80,90,80,100,40,110,80,110,60,110,0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20]},{"name":"Search","color":"#F5BD25","values":[10,0,30,50,30,150,360,110,110,150,20,210,100,90,190,70,140,110,220,230,160,110,100,370,70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90]},{"name":"Other","color":"#F79E39","values":[40,10,20,20,10,50,90,90,130,240,160,230,270,100,180,140,380,210,190,280,280,180,120,60,60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,10,10,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/27.json b/public/chartDummyData/views_zoom/2018-07/27.json new file mode 100644 index 000000000..4f5ae3ca6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532390400000,1532394000000,1532397600000,1532401200000,1532404800000,1532408400000,1532412000000,1532415600000,1532419200000,1532422800000,1532426400000,1532430000000,1532433600000,1532437200000,1532440800000,1532444400000,1532448000000,1532451600000,1532455200000,1532458800000,1532462400000,1532466000000,1532469600000,1532473200000,1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,120,180,80,90,160,580,670,1000,970,990,1170,1040,990,930,1370,1270,1130,1160,1180,720,1060,810,490,290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510]},{"name":"URL","color":"#2373DB","values":[100,80,80,10,10,80,210,300,620,530,860,740,700,740,920,880,1020,920,1030,1060,640,530,410,360,250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400]},{"name":"Groups","color":"#9ED448","values":[380,200,140,30,170,330,510,540,490,660,940,930,1100,790,840,690,930,900,1070,1270,1090,1190,950,810,380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850]},{"name":"Channel","color":"#4fae4e","values":[0,30,40,0,20,30,0,50,20,80,60,60,80,50,70,50,30,30,90,70,80,50,40,80,50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30]},{"name":"Search","color":"#F5BD25","values":[70,20,0,0,20,100,710,150,60,160,130,90,930,330,110,130,100,150,90,260,40,70,90,140,160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30]},{"name":"Other","color":"#F79E39","values":[60,10,10,0,60,100,100,150,120,140,130,160,210,110,170,130,210,220,170,220,120,230,120,40,20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,10,10,20,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/28.json b/public/chartDummyData/views_zoom/2018-07/28.json new file mode 100644 index 000000000..d7e7340f6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532476800000,1532480400000,1532484000000,1532487600000,1532491200000,1532494800000,1532498400000,1532502000000,1532505600000,1532509200000,1532512800000,1532516400000,1532520000000,1532523600000,1532527200000,1532530800000,1532534400000,1532538000000,1532541600000,1532545200000,1532548800000,1532552400000,1532556000000,1532559600000,1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,260,0,20,140,150,1070,620,690,1130,950,1390,1200,990,1050,1060,1050,1490,1470,1170,1180,1110,790,380,190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470]},{"name":"URL","color":"#2373DB","values":[250,130,40,10,40,110,310,410,500,710,870,890,670,600,830,970,1050,940,1030,920,700,620,510,490,260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430]},{"name":"Groups","color":"#9ED448","values":[380,180,50,20,170,140,530,690,790,810,750,840,890,490,740,790,870,1210,840,1240,1570,1200,1620,720,400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610]},{"name":"Channel","color":"#4fae4e","values":[50,30,10,30,20,10,20,50,30,40,30,80,70,40,50,80,90,100,50,40,170,130,40,120,70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30]},{"name":"Search","color":"#F5BD25","values":[160,10,20,10,0,30,740,90,100,40,140,160,40,70,100,60,230,90,400,220,110,100,140,110,180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20]},{"name":"Other","color":"#F79E39","values":[20,20,10,0,10,60,70,90,180,200,230,200,230,140,210,120,270,160,100,130,190,140,120,80,80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,10,0,20,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/29.json b/public/chartDummyData/views_zoom/2018-07/29.json new file mode 100644 index 000000000..f43e733e5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532563200000,1532566800000,1532570400000,1532574000000,1532577600000,1532581200000,1532584800000,1532588400000,1532592000000,1532595600000,1532599200000,1532602800000,1532606400000,1532610000000,1532613600000,1532617200000,1532620800000,1532624400000,1532628000000,1532631600000,1532635200000,1532638800000,1532642400000,1532646000000,1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,150,40,90,170,300,420,570,630,1130,1160,1190,930,970,1410,1280,1170,1220,1080,1530,1530,1260,800,490,230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710]},{"name":"URL","color":"#2373DB","values":[260,80,20,0,60,100,300,370,600,870,730,710,570,780,820,1110,1190,1250,1070,1190,840,660,570,240,180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240]},{"name":"Groups","color":"#9ED448","values":[400,180,50,40,160,200,580,520,580,520,1030,1040,880,880,940,870,880,850,1170,1190,1240,1560,1240,490,310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670]},{"name":"Channel","color":"#4fae4e","values":[70,0,0,0,0,30,20,70,50,80,60,60,60,30,70,60,70,100,100,50,140,60,40,20,10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30]},{"name":"Search","color":"#F5BD25","values":[180,0,0,0,50,120,360,40,20,110,280,250,70,80,130,110,80,60,140,180,140,340,110,0,20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110]},{"name":"Other","color":"#F79E39","values":[80,30,10,30,20,40,100,70,190,170,160,180,120,240,150,140,180,280,170,200,160,160,120,110,40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,0,0,0,0,0,10,40,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/30.json b/public/chartDummyData/views_zoom/2018-07/30.json new file mode 100644 index 000000000..8655ff264 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532649600000,1532653200000,1532656800000,1532660400000,1532664000000,1532667600000,1532671200000,1532674800000,1532678400000,1532682000000,1532685600000,1532689200000,1532692800000,1532696400000,1532700000000,1532703600000,1532707200000,1532710800000,1532714400000,1532718000000,1532721600000,1532725200000,1532728800000,1532732400000,1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[230,160,90,80,130,390,540,730,900,1190,1330,1210,1510,1350,1110,910,980,1370,950,1330,1460,1090,1220,1040,370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540]},{"name":"URL","color":"#2373DB","values":[180,120,20,30,100,140,320,410,400,520,670,780,790,990,850,950,970,1060,1180,1070,800,510,350,170,160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310]},{"name":"Groups","color":"#9ED448","values":[310,220,70,470,80,230,420,680,830,740,1020,870,1250,930,680,1180,740,920,840,830,830,1240,870,800,470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830]},{"name":"Channel","color":"#4fae4e","values":[10,20,10,0,0,10,40,20,70,30,120,50,150,50,100,40,120,110,100,50,60,80,60,90,0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70]},{"name":"Search","color":"#F5BD25","values":[20,0,0,0,60,120,480,40,300,340,60,60,120,100,680,180,200,60,130,60,230,60,150,30,0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10]},{"name":"Other","color":"#F79E39","values":[40,20,20,10,20,60,200,120,130,120,150,230,260,150,90,170,250,170,170,660,190,160,60,100,40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,10,0,10,10,20,20,0,30,10,0,10,10,10,0,0,0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-07/31.json b/public/chartDummyData/views_zoom/2018-07/31.json new file mode 100644 index 000000000..b9b3ce522 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-07/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532736000000,1532739600000,1532743200000,1532746800000,1532750400000,1532754000000,1532757600000,1532761200000,1532764800000,1532768400000,1532772000000,1532775600000,1532779200000,1532782800000,1532786400000,1532790000000,1532793600000,1532797200000,1532800800000,1532804400000,1532808000000,1532811600000,1532815200000,1532818800000,1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[370,130,50,70,80,160,390,630,860,980,1180,1340,1430,1030,1060,980,1070,1350,1140,1200,1120,820,940,550,470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800]},{"name":"URL","color":"#2373DB","values":[160,40,10,10,40,90,120,180,400,620,610,690,720,620,570,880,780,1040,810,700,730,500,590,290,210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290]},{"name":"Groups","color":"#9ED448","values":[470,160,80,110,60,90,310,630,570,950,470,810,830,1050,620,640,750,870,680,750,1060,990,970,730,400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,0,40,20,20,20,50,70,190,20,50,140,120,50,60,20,80,110,40,40,30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40]},{"name":"Search","color":"#F5BD25","values":[0,80,0,0,10,60,240,110,60,20,90,200,20,120,90,50,310,70,50,170,220,50,40,100,30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90]},{"name":"Other","color":"#F79E39","values":[40,30,30,10,0,70,50,90,150,120,170,140,320,270,160,130,110,150,170,160,170,170,110,80,30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,10,20,0,30,10,0,10,10,10,0,20,20,20,0,10,10,20,10,0,0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/01.json b/public/chartDummyData/views_zoom/2018-08/01.json new file mode 100644 index 000000000..dd1e5910e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532822400000,1532826000000,1532829600000,1532833200000,1532836800000,1532840400000,1532844000000,1532847600000,1532851200000,1532854800000,1532858400000,1532862000000,1532865600000,1532869200000,1532872800000,1532876400000,1532880000000,1532883600000,1532887200000,1532890800000,1532894400000,1532898000000,1532901600000,1532905200000,1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[470,170,80,70,70,120,250,460,820,850,1060,1160,250,1090,1500,1660,1360,1490,1780,1460,1170,1320,900,530,220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580]},{"name":"URL","color":"#2373DB","values":[210,230,90,0,0,30,120,210,290,480,600,420,30,320,380,560,790,930,780,790,720,680,460,230,70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340]},{"name":"Groups","color":"#9ED448","values":[400,260,80,40,60,100,330,400,510,690,670,710,100,900,760,660,660,1030,1250,1110,1520,1440,1330,660,300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960]},{"name":"Channel","color":"#4fae4e","values":[30,10,10,0,0,0,20,90,50,70,80,110,40,20,50,40,90,30,180,130,60,60,40,20,30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40]},{"name":"Search","color":"#F5BD25","values":[30,10,20,30,20,20,390,110,100,40,120,130,20,100,330,230,50,480,100,100,40,50,160,90,200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100]},{"name":"Other","color":"#F79E39","values":[30,20,30,10,40,20,50,80,120,130,190,260,30,150,200,110,90,190,160,130,120,230,110,60,60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,20,20,0,0,0,0,10,20,20,0,0,30,40,0,0,0,0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/02.json b/public/chartDummyData/views_zoom/2018-08/02.json new file mode 100644 index 000000000..f5e9406d9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532908800000,1532912400000,1532916000000,1532919600000,1532923200000,1532926800000,1532930400000,1532934000000,1532937600000,1532941200000,1532944800000,1532948400000,1532952000000,1532955600000,1532959200000,1532962800000,1532966400000,1532970000000,1532973600000,1532977200000,1532980800000,1532984400000,1532988000000,1532991600000,1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,290,70,50,130,300,600,550,990,1140,1220,1060,1280,1140,1050,1200,1270,520,1180,1380,1490,1650,950,510,220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530]},{"name":"URL","color":"#2373DB","values":[70,60,170,40,100,200,240,450,720,690,730,870,860,720,740,810,1000,560,690,1080,840,630,450,400,100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340]},{"name":"Groups","color":"#9ED448","values":[300,130,100,10,140,180,450,590,650,880,1110,1440,1220,830,850,860,1140,460,960,1220,1810,1550,1270,850,270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870]},{"name":"Channel","color":"#4fae4e","values":[30,30,20,0,0,10,100,20,40,60,70,140,160,80,40,30,40,40,120,60,50,100,70,30,20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100]},{"name":"Search","color":"#F5BD25","values":[200,10,40,0,370,170,30,40,160,210,110,180,100,50,70,110,210,30,70,240,210,210,220,30,0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60]},{"name":"Other","color":"#F79E39","values":[60,20,10,0,20,70,70,140,170,120,150,200,170,160,140,180,180,110,160,280,210,150,100,50,60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50]},{"name":"PM","color":"#E65850","values":[0,0,0,10,0,0,0,0,10,20,10,0,0,10,10,0,0,10,0,0,0,0,0,10,0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/03.json b/public/chartDummyData/views_zoom/2018-08/03.json new file mode 100644 index 000000000..16bc449c7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1532995200000,1532998800000,1533002400000,1533006000000,1533009600000,1533013200000,1533016800000,1533020400000,1533024000000,1533027600000,1533031200000,1533034800000,1533038400000,1533042000000,1533045600000,1533049200000,1533052800000,1533056400000,1533060000000,1533063600000,1533067200000,1533070800000,1533074400000,1533078000000,1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,110,70,110,120,470,510,840,820,1170,1210,1580,1220,1110,1220,1060,1250,1230,1540,1260,1230,1470,860,470,220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140]},{"name":"URL","color":"#2373DB","values":[100,50,20,0,20,210,230,470,500,710,720,760,720,1090,930,870,1120,950,930,1020,900,820,570,430,140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300]},{"name":"Groups","color":"#9ED448","values":[270,130,50,60,140,180,550,470,700,590,1190,1190,1040,1070,840,830,830,800,1100,1420,1320,1520,1780,610,370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520]},{"name":"Channel","color":"#4fae4e","values":[20,10,0,0,0,40,10,70,40,50,60,70,60,70,30,20,60,130,110,80,100,60,40,30,40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160]},{"name":"Search","color":"#F5BD25","values":[0,0,10,10,10,130,20,190,290,390,210,90,1620,210,70,80,30,90,200,70,160,70,110,20,50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30]},{"name":"Other","color":"#F79E39","values":[60,40,20,10,0,50,90,110,180,140,230,230,210,120,110,170,250,210,220,240,170,150,110,90,40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,20,0,20,0,0,0,20,0,0,10,10,10,0,10,10,0,0,10,0,0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/04.json b/public/chartDummyData/views_zoom/2018-08/04.json new file mode 100644 index 000000000..1594bfa91 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533081600000,1533085200000,1533088800000,1533092400000,1533096000000,1533099600000,1533103200000,1533106800000,1533110400000,1533114000000,1533117600000,1533121200000,1533124800000,1533128400000,1533132000000,1533135600000,1533139200000,1533142800000,1533146400000,1533150000000,1533153600000,1533157200000,1533160800000,1533164400000,1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,160,60,60,120,370,590,780,860,1530,1200,1200,1230,1070,1060,1410,1240,1430,1340,1150,1270,1160,800,710,420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630]},{"name":"URL","color":"#2373DB","values":[140,120,30,0,40,120,340,520,760,970,900,1090,1000,870,860,860,1100,1070,1050,950,960,760,650,240,130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370]},{"name":"Groups","color":"#9ED448","values":[370,90,50,40,130,280,530,680,880,600,1080,950,1120,840,700,1030,980,1040,1120,1130,1300,1490,1140,670,500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520]},{"name":"Channel","color":"#4fae4e","values":[40,20,0,0,0,30,20,40,100,60,40,70,60,40,90,60,90,40,40,110,60,80,20,30,30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60]},{"name":"Search","color":"#F5BD25","values":[50,10,0,0,40,50,230,500,110,190,80,280,170,130,60,170,70,100,60,220,100,70,60,110,10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20]},{"name":"Other","color":"#F79E39","values":[40,10,10,10,0,90,80,90,180,200,170,350,210,180,210,150,160,200,170,250,220,210,100,120,90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,10,0,10,10,0,10,0,0,10,0,10,0,10,20,10,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/05.json b/public/chartDummyData/views_zoom/2018-08/05.json new file mode 100644 index 000000000..147230c97 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533168000000,1533171600000,1533175200000,1533178800000,1533182400000,1533186000000,1533189600000,1533193200000,1533196800000,1533200400000,1533204000000,1533207600000,1533211200000,1533214800000,1533218400000,1533222000000,1533225600000,1533229200000,1533232800000,1533236400000,1533240000000,1533243600000,1533247200000,1533250800000,1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[420,270,640,50,170,390,430,770,1010,980,1300,1410,1410,1310,950,1090,940,1410,1540,1700,1070,1100,1040,540,270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590]},{"name":"URL","color":"#2373DB","values":[130,100,140,10,20,90,380,460,750,880,870,690,840,650,880,860,890,1170,960,980,870,730,430,310,280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280]},{"name":"Groups","color":"#9ED448","values":[500,240,90,40,140,220,470,500,720,760,1020,1120,1270,1110,660,700,780,1010,1000,1150,1150,1430,1300,830,240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720]},{"name":"Channel","color":"#4fae4e","values":[30,40,10,0,20,10,30,40,30,40,100,90,60,50,90,80,100,110,130,40,60,120,30,70,40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20]},{"name":"Search","color":"#F5BD25","values":[10,170,0,0,330,60,70,270,80,400,220,60,90,120,150,120,60,280,170,120,50,40,70,10,40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160]},{"name":"Other","color":"#F79E39","values":[90,40,30,20,30,90,60,110,140,180,180,230,230,130,150,140,200,300,300,120,170,160,150,90,40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,40,0,10,10,10,10,0,0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/06.json b/public/chartDummyData/views_zoom/2018-08/06.json new file mode 100644 index 000000000..49b0761a2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533254400000,1533258000000,1533261600000,1533265200000,1533268800000,1533272400000,1533276000000,1533279600000,1533283200000,1533286800000,1533290400000,1533294000000,1533297600000,1533301200000,1533304800000,1533308400000,1533312000000,1533315600000,1533319200000,1533322800000,1533326400000,1533330000000,1533333600000,1533337200000,1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,190,100,130,40,240,720,1290,1120,840,1110,1420,1340,1490,1460,980,1290,1210,1310,1410,1310,1210,1070,800,320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630]},{"name":"URL","color":"#2373DB","values":[280,130,20,10,20,100,290,410,680,830,950,880,560,830,810,640,1040,1200,1220,870,630,690,630,290,430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300]},{"name":"Groups","color":"#9ED448","values":[240,350,80,50,150,280,690,570,720,690,990,990,980,920,1160,850,870,920,1000,890,1080,930,1170,1110,370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810]},{"name":"Channel","color":"#4fae4e","values":[40,20,20,0,10,0,40,40,20,20,20,50,180,470,100,120,40,90,80,80,80,50,80,40,10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20]},{"name":"Search","color":"#F5BD25","values":[40,20,10,0,30,60,330,100,90,40,100,170,230,90,60,160,150,190,300,110,50,80,50,90,10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110]},{"name":"Other","color":"#F79E39","values":[40,0,50,10,20,40,150,270,100,160,170,170,200,130,150,160,190,220,200,240,160,180,100,80,50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,0,0,10,10,30,10,10,0,20,10,20,10,0,10,30,0,10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/07.json b/public/chartDummyData/views_zoom/2018-08/07.json new file mode 100644 index 000000000..9b2c2cb25 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533340800000,1533344400000,1533348000000,1533351600000,1533355200000,1533358800000,1533362400000,1533366000000,1533369600000,1533373200000,1533376800000,1533380400000,1533384000000,1533387600000,1533391200000,1533394800000,1533398400000,1533402000000,1533405600000,1533409200000,1533412800000,1533416400000,1533420000000,1533423600000,1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,330,100,110,110,140,320,690,930,1090,1210,1530,1140,1870,1380,1650,1420,1470,1340,1140,1280,1190,820,580,320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600]},{"name":"URL","color":"#2373DB","values":[430,270,40,30,30,40,190,430,670,700,780,920,640,750,630,760,1050,810,960,720,750,470,490,340,150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290]},{"name":"Groups","color":"#9ED448","values":[370,190,130,30,30,180,430,550,690,850,840,970,690,910,830,860,990,820,800,990,1070,1010,1230,960,390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670]},{"name":"Channel","color":"#4fae4e","values":[10,60,0,20,10,0,30,40,30,160,60,10,70,170,60,110,100,80,130,80,60,50,80,40,10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80]},{"name":"Search","color":"#F5BD25","values":[10,30,10,10,0,50,160,400,60,160,120,220,100,40,200,350,280,530,130,130,270,40,490,100,0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120]},{"name":"Other","color":"#F79E39","values":[50,10,40,0,10,80,80,80,140,200,270,270,260,240,220,180,180,160,170,210,140,190,120,70,60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100]},{"name":"PM","color":"#E65850","values":[10,10,0,0,0,0,0,0,10,20,0,0,20,0,10,10,20,30,10,10,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/08.json b/public/chartDummyData/views_zoom/2018-08/08.json new file mode 100644 index 000000000..b301eab82 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533427200000,1533430800000,1533434400000,1533438000000,1533441600000,1533445200000,1533448800000,1533452400000,1533456000000,1533459600000,1533463200000,1533466800000,1533470400000,1533474000000,1533477600000,1533481200000,1533484800000,1533488400000,1533492000000,1533495600000,1533499200000,1533502800000,1533506400000,1533510000000,1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,130,160,100,90,170,280,900,850,1030,1090,1250,1560,1420,1090,1470,1170,1340,1220,1370,1190,1170,900,530,280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820]},{"name":"URL","color":"#2373DB","values":[150,70,30,10,10,10,100,250,430,790,630,620,620,550,720,680,910,590,750,820,670,620,440,340,170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320]},{"name":"Groups","color":"#9ED448","values":[390,350,90,40,10,150,230,430,620,700,510,840,1120,1050,780,720,700,880,1210,1050,1240,1240,970,870,390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180]},{"name":"Channel","color":"#4fae4e","values":[10,30,20,20,10,0,20,30,40,50,70,50,170,60,70,30,70,60,110,40,60,50,70,100,50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30]},{"name":"Search","color":"#F5BD25","values":[0,30,0,0,10,10,290,660,570,200,350,150,230,170,130,50,170,80,170,120,220,20,70,60,30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70]},{"name":"Other","color":"#F79E39","values":[60,20,10,20,20,40,190,130,200,180,120,130,190,190,170,220,150,170,230,240,300,150,250,50,70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,20,0,10,10,10,0,0,0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/09.json b/public/chartDummyData/views_zoom/2018-08/09.json new file mode 100644 index 000000000..dfee59fe2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533513600000,1533517200000,1533520800000,1533524400000,1533528000000,1533531600000,1533535200000,1533538800000,1533542400000,1533546000000,1533549600000,1533553200000,1533556800000,1533560400000,1533564000000,1533567600000,1533571200000,1533574800000,1533578400000,1533582000000,1533585600000,1533589200000,1533592800000,1533596400000,1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[280,160,100,40,150,330,500,770,970,1090,1270,1240,1430,1120,1130,1350,1220,1630,1870,1430,1360,1080,730,1140,220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720]},{"name":"URL","color":"#2373DB","values":[170,70,50,20,60,110,210,310,630,670,840,730,830,660,760,800,1120,1080,1370,1000,700,670,530,300,260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360]},{"name":"Groups","color":"#9ED448","values":[390,90,40,40,100,150,490,450,690,800,640,830,1090,850,600,830,870,920,930,1400,1620,1490,930,520,320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830]},{"name":"Channel","color":"#4fae4e","values":[50,20,0,0,0,10,20,50,60,60,0,60,160,90,110,170,70,110,80,60,80,100,90,160,80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,20,770,170,90,90,120,110,240,40,310,180,420,670,120,230,1040,220,110,140,30,160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110]},{"name":"Other","color":"#F79E39","values":[70,30,30,30,50,50,70,70,130,140,200,230,190,230,250,130,190,220,270,230,170,140,180,70,50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,10,10,0,0,10,0,30,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/10.json b/public/chartDummyData/views_zoom/2018-08/10.json new file mode 100644 index 000000000..5fb40ad86 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533600000000,1533603600000,1533607200000,1533610800000,1533614400000,1533618000000,1533621600000,1533625200000,1533628800000,1533632400000,1533636000000,1533639600000,1533643200000,1533646800000,1533650400000,1533654000000,1533657600000,1533661200000,1533664800000,1533668400000,1533672000000,1533675600000,1533679200000,1533682800000,1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,210,40,70,260,180,580,1160,1060,1440,1520,1450,1210,1480,1260,1210,960,1010,1120,1100,1260,1230,790,630,590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460]},{"name":"URL","color":"#2373DB","values":[260,130,120,30,70,130,200,430,630,670,920,930,650,950,710,950,970,730,900,770,740,640,480,370,100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240]},{"name":"Groups","color":"#9ED448","values":[320,300,40,110,30,240,390,550,710,710,770,980,940,810,1300,1160,720,650,660,970,1380,1110,1210,520,240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000]},{"name":"Channel","color":"#4fae4e","values":[80,20,10,0,0,10,0,30,70,40,80,60,70,10,110,90,140,60,30,50,100,50,150,60,20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80]},{"name":"Search","color":"#F5BD25","values":[160,10,0,0,380,80,90,660,920,1030,740,70,330,160,40,80,1180,810,150,140,180,10,280,20,40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70]},{"name":"Other","color":"#F79E39","values":[50,30,20,0,20,50,90,110,140,200,270,300,270,160,120,180,200,130,160,160,220,200,180,120,60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,0,10,0,10,0,10,10,0,0,10,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/11.json b/public/chartDummyData/views_zoom/2018-08/11.json new file mode 100644 index 000000000..77d237bb3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533686400000,1533690000000,1533693600000,1533697200000,1533700800000,1533704400000,1533708000000,1533711600000,1533715200000,1533718800000,1533722400000,1533726000000,1533729600000,1533733200000,1533736800000,1533740400000,1533744000000,1533747600000,1533751200000,1533754800000,1533758400000,1533762000000,1533765600000,1533769200000,1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[590,250,60,40,70,280,890,720,980,1120,1150,1130,1970,1140,1270,1450,1400,1490,1260,1230,1500,1350,1040,590,300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960]},{"name":"URL","color":"#2373DB","values":[100,100,50,0,60,100,290,490,730,720,900,840,730,540,920,1060,960,1040,1100,1090,820,560,430,280,110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250]},{"name":"Groups","color":"#9ED448","values":[240,420,20,60,70,320,470,660,570,920,760,1240,900,860,950,1190,790,930,790,1350,1420,1760,890,720,570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580]},{"name":"Channel","color":"#4fae4e","values":[20,20,20,10,10,0,60,20,60,60,60,60,230,90,90,80,110,40,60,60,40,60,80,20,10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70]},{"name":"Search","color":"#F5BD25","values":[40,20,40,10,10,70,590,260,600,270,160,170,1410,330,280,110,200,120,400,210,270,90,130,160,130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120]},{"name":"Other","color":"#F79E39","values":[60,70,10,10,10,40,120,130,250,150,150,230,220,150,310,200,180,220,280,220,220,200,90,50,80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,20,10,10,40,10,0,0,10,20,10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/12.json b/public/chartDummyData/views_zoom/2018-08/12.json new file mode 100644 index 000000000..bac1e3b2e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533772800000,1533776400000,1533780000000,1533783600000,1533787200000,1533790800000,1533794400000,1533798000000,1533801600000,1533805200000,1533808800000,1533812400000,1533816000000,1533819600000,1533823200000,1533826800000,1533830400000,1533834000000,1533837600000,1533841200000,1533844800000,1533848400000,1533852000000,1533855600000,1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[300,180,130,50,140,200,600,580,1080,930,1340,1240,1270,1270,1210,1610,1200,1140,1060,1340,1180,1240,770,630,370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800]},{"name":"URL","color":"#2373DB","values":[110,110,30,10,10,100,250,220,540,670,910,690,710,880,890,1030,870,970,1030,970,850,1100,720,300,210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600]},{"name":"Groups","color":"#9ED448","values":[570,130,60,20,60,190,410,600,680,860,860,1130,1170,1030,810,1290,1070,720,770,1190,1320,1670,1140,2810,410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710]},{"name":"Channel","color":"#4fae4e","values":[10,30,10,10,10,10,10,20,60,50,50,50,90,130,100,100,100,80,40,70,100,90,80,20,40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130]},{"name":"Search","color":"#F5BD25","values":[130,20,50,20,210,110,80,90,1280,120,250,100,270,50,370,200,140,140,160,140,90,140,130,110,20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140]},{"name":"Other","color":"#F79E39","values":[80,20,20,0,30,50,40,70,170,270,210,150,360,160,180,240,250,210,160,130,200,150,110,100,90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60]},{"name":"PM","color":"#E65850","values":[10,0,0,10,0,10,0,0,0,0,0,0,10,0,20,0,40,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/13.json b/public/chartDummyData/views_zoom/2018-08/13.json new file mode 100644 index 000000000..23fe770ee --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533859200000,1533862800000,1533866400000,1533870000000,1533873600000,1533877200000,1533880800000,1533884400000,1533888000000,1533891600000,1533895200000,1533898800000,1533902400000,1533906000000,1533909600000,1533913200000,1533916800000,1533920400000,1533924000000,1533927600000,1533931200000,1533934800000,1533938400000,1533942000000,1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[370,260,140,80,190,310,850,720,990,1500,1430,1280,1400,1100,1260,1250,1410,1460,1760,1640,1390,940,1080,600,380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450]},{"name":"URL","color":"#2373DB","values":[210,80,0,20,20,140,260,340,860,890,890,670,630,690,820,1090,1230,850,1060,990,830,860,540,290,330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290]},{"name":"Groups","color":"#9ED448","values":[410,220,210,110,130,130,360,540,870,790,940,1110,1120,1440,740,1190,1120,950,890,1040,1090,1620,1070,670,400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140]},{"name":"Channel","color":"#4fae4e","values":[40,30,10,10,0,30,70,50,50,100,70,140,70,70,100,30,70,90,90,40,80,100,40,80,30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40]},{"name":"Search","color":"#F5BD25","values":[20,20,0,20,20,50,630,100,130,190,80,240,190,120,110,60,190,70,110,80,310,180,110,120,20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50]},{"name":"Other","color":"#F79E39","values":[90,10,30,0,20,80,60,80,100,240,170,110,210,180,150,140,170,190,140,210,200,190,410,100,60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,20,0,0,0,10,0,10,20,10,10,20,0,0,20,0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/14.json b/public/chartDummyData/views_zoom/2018-08/14.json new file mode 100644 index 000000000..32425a6cc --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1533945600000,1533949200000,1533952800000,1533956400000,1533960000000,1533963600000,1533967200000,1533970800000,1533974400000,1533978000000,1533981600000,1533985200000,1533988800000,1533992400000,1533996000000,1533999600000,1534003200000,1534006800000,1534010400000,1534014000000,1534017600000,1534021200000,1534024800000,1534028400000,1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[380,270,110,60,30,140,520,1050,700,1190,1180,1250,1510,1200,1160,1270,1110,1490,1260,1320,1210,1030,1230,820,610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610]},{"name":"URL","color":"#2373DB","values":[330,250,140,70,20,30,130,430,410,650,900,710,700,820,840,770,850,680,870,830,600,650,480,320,240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330]},{"name":"Groups","color":"#9ED448","values":[400,290,120,40,60,220,390,620,390,750,770,810,1070,1100,810,860,1050,840,760,730,790,1220,1170,1180,710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880]},{"name":"Channel","color":"#4fae4e","values":[30,40,20,10,10,20,60,20,70,60,70,80,160,80,80,120,50,30,50,70,70,110,110,30,10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70]},{"name":"Search","color":"#F5BD25","values":[20,70,10,10,10,50,830,60,80,50,60,170,220,90,170,50,60,160,90,100,180,90,120,70,60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20]},{"name":"Other","color":"#F79E39","values":[60,50,0,10,0,50,80,170,160,130,100,180,180,240,130,130,190,160,210,130,160,160,140,100,60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,20,20,10,0,30,10,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/15.json b/public/chartDummyData/views_zoom/2018-08/15.json new file mode 100644 index 000000000..d6316e507 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534032000000,1534035600000,1534039200000,1534042800000,1534046400000,1534050000000,1534053600000,1534057200000,1534060800000,1534064400000,1534068000000,1534071600000,1534075200000,1534078800000,1534082400000,1534086000000,1534089600000,1534093200000,1534096800000,1534100400000,1534104000000,1534107600000,1534111200000,1534114800000,1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[610,240,180,30,60,180,350,630,1080,1000,1350,1060,1700,1360,1080,1430,1370,1190,1800,1220,1290,1040,720,720,260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630]},{"name":"URL","color":"#2373DB","values":[240,50,20,90,40,40,80,290,270,470,820,460,760,540,640,520,800,690,840,970,840,630,650,360,50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480]},{"name":"Groups","color":"#9ED448","values":[710,290,90,150,60,130,320,390,610,760,770,840,1310,1030,770,1210,1100,890,760,1080,1160,1460,1080,830,250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870]},{"name":"Channel","color":"#4fae4e","values":[10,30,20,10,10,20,40,100,80,30,60,40,60,50,40,120,70,100,70,90,90,70,60,60,40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50]},{"name":"Search","color":"#F5BD25","values":[60,0,0,0,30,730,60,40,90,80,520,60,30,340,50,100,40,240,400,160,80,50,120,110,20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110]},{"name":"Other","color":"#F79E39","values":[60,20,10,20,0,30,60,60,160,180,180,240,80,130,160,220,340,210,200,150,140,200,170,80,40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50]},{"name":"PM","color":"#E65850","values":[0,0,10,0,10,0,20,10,0,10,40,30,10,10,0,0,20,0,0,20,20,0,10,0,0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/16.json b/public/chartDummyData/views_zoom/2018-08/16.json new file mode 100644 index 000000000..751de91e1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534118400000,1534122000000,1534125600000,1534129200000,1534132800000,1534136400000,1534140000000,1534143600000,1534147200000,1534150800000,1534154400000,1534158000000,1534161600000,1534165200000,1534168800000,1534172400000,1534176000000,1534179600000,1534183200000,1534186800000,1534190400000,1534194000000,1534197600000,1534201200000,1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,210,90,30,110,200,380,730,870,930,1310,1320,1170,1150,1270,1010,1420,1760,1350,1340,1260,1120,900,460,430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440]},{"name":"URL","color":"#2373DB","values":[50,60,60,30,10,40,260,450,440,690,820,660,690,770,910,910,950,990,1010,920,710,810,350,240,120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320]},{"name":"Groups","color":"#9ED448","values":[250,190,140,110,40,120,320,530,650,860,1180,1120,1130,780,870,730,1050,790,930,1760,1330,1150,1240,1000,2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720]},{"name":"Channel","color":"#4fae4e","values":[40,30,10,10,0,0,0,0,40,50,20,40,90,80,50,50,20,70,80,60,100,70,90,80,60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70]},{"name":"Search","color":"#F5BD25","values":[20,20,0,0,400,80,80,110,240,110,110,120,140,110,120,310,780,320,160,140,100,170,30,70,80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160]},{"name":"Other","color":"#F79E39","values":[40,10,50,30,0,60,130,110,250,100,130,160,200,210,180,100,190,240,270,160,220,160,140,110,70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,20,0,0,20,30,10,0,10,20,0,10,0,10,10,20,10,0,0,0,0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/17.json b/public/chartDummyData/views_zoom/2018-08/17.json new file mode 100644 index 000000000..50969ece1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534204800000,1534208400000,1534212000000,1534215600000,1534219200000,1534222800000,1534226400000,1534230000000,1534233600000,1534237200000,1534240800000,1534244400000,1534248000000,1534251600000,1534255200000,1534258800000,1534262400000,1534266000000,1534269600000,1534273200000,1534276800000,1534280400000,1534284000000,1534287600000,1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,90,40,100,260,200,550,720,1200,1210,1510,1010,1340,1120,1110,1350,1560,1310,1880,1310,970,1240,970,960,320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610]},{"name":"URL","color":"#2373DB","values":[120,90,50,40,20,80,190,270,490,730,890,620,890,900,770,880,1130,1040,970,740,620,690,440,250,230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340]},{"name":"Groups","color":"#9ED448","values":[2550,160,110,70,120,180,370,430,1610,740,800,720,1150,960,2700,900,790,1140,870,1220,1420,1300,910,580,460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570]},{"name":"Channel","color":"#4fae4e","values":[60,0,30,10,0,40,60,40,60,50,150,100,70,70,100,50,150,60,200,70,70,40,170,70,90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60]},{"name":"Search","color":"#F5BD25","values":[80,0,0,0,520,260,20,40,220,110,80,60,100,170,150,100,50,310,130,180,100,130,210,120,10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40]},{"name":"Other","color":"#F79E39","values":[70,30,0,0,10,40,110,100,240,110,240,240,210,150,110,220,320,170,190,210,190,120,390,150,20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,20,10,0,0,0,20,10,0,0,10,10,0,10,20,0,0,0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/18.json b/public/chartDummyData/views_zoom/2018-08/18.json new file mode 100644 index 000000000..e922096c0 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534291200000,1534294800000,1534298400000,1534302000000,1534305600000,1534309200000,1534312800000,1534316400000,1534320000000,1534323600000,1534327200000,1534330800000,1534334400000,1534338000000,1534341600000,1534345200000,1534348800000,1534352400000,1534356000000,1534359600000,1534363200000,1534366800000,1534370400000,1534374000000,1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,90,70,30,130,300,350,670,650,990,1170,1320,1270,1310,1430,1300,1450,1510,1570,1480,1430,1170,820,800,740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750]},{"name":"URL","color":"#2373DB","values":[230,30,0,10,10,110,250,270,450,490,430,450,390,410,360,590,450,430,620,480,510,660,430,600,200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460]},{"name":"Groups","color":"#9ED448","values":[460,230,110,50,40,140,400,480,630,670,750,860,710,1120,1090,580,1110,800,1090,1260,950,1320,1200,710,610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820]},{"name":"Channel","color":"#4fae4e","values":[90,50,50,0,0,10,0,40,70,30,80,50,70,60,110,40,90,150,90,60,100,70,160,130,140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,20,150,90,50,780,130,210,130,120,90,130,270,190,90,120,160,100,200,300,140,30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50]},{"name":"Other","color":"#F79E39","values":[20,10,10,20,20,40,100,50,190,190,170,120,100,110,170,130,240,90,160,220,140,160,120,60,30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,20,20,10,0,0,0,20,10,40,10,10,10,0,0,0,10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/19.json b/public/chartDummyData/views_zoom/2018-08/19.json new file mode 100644 index 000000000..5894136d8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534377600000,1534381200000,1534384800000,1534388400000,1534392000000,1534395600000,1534399200000,1534402800000,1534406400000,1534410000000,1534413600000,1534417200000,1534420800000,1534424400000,1534428000000,1534431600000,1534435200000,1534438800000,1534442400000,1534446000000,1534449600000,1534453200000,1534456800000,1534460400000,1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[740,150,70,80,110,140,400,1090,990,1420,1440,1590,1850,1310,1310,1070,1450,1330,1440,1620,1160,1390,820,450,490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420]},{"name":"URL","color":"#2373DB","values":[200,180,40,10,0,30,140,170,380,570,770,700,690,670,750,840,800,830,740,870,730,550,610,290,330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330]},{"name":"Groups","color":"#9ED448","values":[610,300,140,80,90,70,290,480,820,660,950,920,1160,820,1040,950,810,890,1160,1170,1390,1270,1050,1140,400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790]},{"name":"Channel","color":"#4fae4e","values":[140,0,0,20,10,10,0,20,40,70,50,90,120,70,70,20,110,50,50,40,50,100,80,40,170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30]},{"name":"Search","color":"#F5BD25","values":[30,0,0,30,10,30,30,310,50,170,150,130,190,70,80,120,190,120,320,150,60,150,40,50,10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90]},{"name":"Other","color":"#F79E39","values":[30,40,10,0,10,30,110,200,80,150,160,150,180,190,150,180,130,180,130,200,180,230,120,80,110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130]},{"name":"PM","color":"#E65850","values":[10,0,0,0,10,10,0,10,0,0,0,0,0,0,0,30,10,10,0,10,10,0,10,10,0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/20.json b/public/chartDummyData/views_zoom/2018-08/20.json new file mode 100644 index 000000000..58d0c378f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534464000000,1534467600000,1534471200000,1534474800000,1534478400000,1534482000000,1534485600000,1534489200000,1534492800000,1534496400000,1534500000000,1534503600000,1534507200000,1534510800000,1534514400000,1534518000000,1534521600000,1534525200000,1534528800000,1534532400000,1534536000000,1534539600000,1534543200000,1534546800000,1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[490,560,80,80,20,200,620,720,960,1100,1200,1310,1640,1380,1110,1100,1750,1330,1470,1390,1560,1190,990,610,830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750]},{"name":"URL","color":"#2373DB","values":[330,120,20,0,30,50,210,320,340,550,590,680,850,850,680,1050,910,960,1010,850,1050,710,520,330,120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300]},{"name":"Groups","color":"#9ED448","values":[400,330,110,140,80,180,310,490,720,650,1090,1190,860,970,750,700,830,760,1130,1150,1370,1800,1260,880,670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070]},{"name":"Channel","color":"#4fae4e","values":[170,10,0,0,0,10,40,80,30,20,60,110,110,140,60,40,60,110,30,40,110,160,110,70,80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70]},{"name":"Search","color":"#F5BD25","values":[10,0,20,20,60,700,30,90,60,120,200,100,130,200,220,80,20,140,90,190,230,50,200,20,50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80]},{"name":"Other","color":"#F79E39","values":[110,70,20,10,40,60,120,180,140,150,190,150,210,300,260,140,200,210,120,170,100,140,200,80,0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,0,0,20,20,10,20,10,0,20,20,0,10,0,10,10,0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/21.json b/public/chartDummyData/views_zoom/2018-08/21.json new file mode 100644 index 000000000..3cf0cd975 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534550400000,1534554000000,1534557600000,1534561200000,1534564800000,1534568400000,1534572000000,1534575600000,1534579200000,1534582800000,1534586400000,1534590000000,1534593600000,1534597200000,1534600800000,1534604400000,1534608000000,1534611600000,1534615200000,1534618800000,1534622400000,1534626000000,1534629600000,1534633200000,1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[830,160,130,110,130,300,450,1480,1170,1050,1110,1290,1360,1230,1330,1230,1360,1210,1510,1340,1340,1380,1360,630,570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680]},{"name":"URL","color":"#2373DB","values":[120,100,50,90,20,30,60,290,580,750,640,740,530,640,700,710,780,950,640,890,850,720,550,480,240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330]},{"name":"Groups","color":"#9ED448","values":[670,320,70,40,70,150,220,750,620,820,920,1020,1060,1250,900,980,1040,740,780,1140,1420,1330,920,870,540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830]},{"name":"Channel","color":"#4fae4e","values":[80,0,0,10,0,0,10,60,40,60,100,100,100,110,70,40,70,140,70,140,110,70,100,50,0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30]},{"name":"Search","color":"#F5BD25","values":[50,170,0,0,10,700,20,230,210,130,170,250,210,40,60,110,370,270,100,280,290,460,500,110,40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70]},{"name":"Other","color":"#F79E39","values":[0,20,10,20,10,10,50,150,180,140,200,260,220,220,150,90,200,70,220,140,230,160,90,50,30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,10,20,10,10,0,10,10,0,10,0,0,10,40,0,0,0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/22.json b/public/chartDummyData/views_zoom/2018-08/22.json new file mode 100644 index 000000000..113c139cc --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534636800000,1534640400000,1534644000000,1534647600000,1534651200000,1534654800000,1534658400000,1534662000000,1534665600000,1534669200000,1534672800000,1534676400000,1534680000000,1534683600000,1534687200000,1534690800000,1534694400000,1534698000000,1534701600000,1534705200000,1534708800000,1534712400000,1534716000000,1534719600000,1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[570,130,120,140,40,140,260,590,1150,1180,1650,1280,1350,1960,2000,1530,1450,1490,1650,1220,1740,1440,940,440,390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650]},{"name":"URL","color":"#2373DB","values":[240,40,60,80,30,0,70,160,370,740,510,580,610,510,700,790,900,850,1070,950,750,680,510,320,180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410]},{"name":"Groups","color":"#9ED448","values":[540,250,120,70,40,90,240,430,890,930,880,1150,820,810,960,770,790,860,1510,1170,1360,1830,980,720,380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750]},{"name":"Channel","color":"#4fae4e","values":[0,50,10,0,0,30,30,100,60,90,70,70,100,110,120,90,80,90,100,50,80,40,170,70,50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60]},{"name":"Search","color":"#F5BD25","values":[40,0,30,0,10,20,410,170,110,90,170,210,120,150,180,280,140,220,100,180,90,80,270,160,140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60]},{"name":"Other","color":"#F79E39","values":[30,20,10,0,10,20,10,80,200,190,190,220,210,280,190,230,180,200,180,210,180,130,130,110,110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,20,0,0,0,20,10,10,20,10,0,20,10,10,40,0,10,0,0,10,0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/23.json b/public/chartDummyData/views_zoom/2018-08/23.json new file mode 100644 index 000000000..7d3b6c0a3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534723200000,1534726800000,1534730400000,1534734000000,1534737600000,1534741200000,1534744800000,1534748400000,1534752000000,1534755600000,1534759200000,1534762800000,1534766400000,1534770000000,1534773600000,1534777200000,1534780800000,1534784400000,1534788000000,1534791600000,1534795200000,1534798800000,1534802400000,1534806000000,1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,190,200,30,90,210,620,720,1090,1920,1070,1070,1750,1340,1190,1510,1280,1800,1430,1540,1400,1160,1000,610,320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150]},{"name":"URL","color":"#2373DB","values":[180,100,10,0,80,50,240,350,710,660,830,910,770,700,850,900,980,1000,1040,850,790,470,450,340,300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350]},{"name":"Groups","color":"#9ED448","values":[380,210,140,30,20,90,340,790,750,1340,800,1040,1140,970,940,1030,930,1130,1180,1810,1510,1570,1640,570,560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080]},{"name":"Channel","color":"#4fae4e","values":[50,20,10,0,0,0,20,30,20,80,130,60,90,120,180,270,70,110,130,160,130,70,50,60,20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50]},{"name":"Search","color":"#F5BD25","values":[140,70,70,30,110,80,450,40,70,120,100,230,210,290,300,180,90,70,140,140,240,110,50,40,30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40]},{"name":"Other","color":"#F79E39","values":[110,30,10,20,20,20,40,110,230,190,260,220,200,230,140,210,250,260,200,280,210,240,130,90,90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,20,30,10,0,10,30,0,0,10,10,10,0,0,30,20,0,0,0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/24.json b/public/chartDummyData/views_zoom/2018-08/24.json new file mode 100644 index 000000000..52f7a3fdb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534809600000,1534813200000,1534816800000,1534820400000,1534824000000,1534827600000,1534831200000,1534834800000,1534838400000,1534842000000,1534845600000,1534849200000,1534852800000,1534856400000,1534860000000,1534863600000,1534867200000,1534870800000,1534874400000,1534878000000,1534881600000,1534885200000,1534888800000,1534892400000,1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,310,90,70,120,290,610,640,1200,1480,1270,1320,1340,1430,1700,1100,2090,1450,1240,1370,1350,1270,1000,750,300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030]},{"name":"URL","color":"#2373DB","values":[300,210,50,70,40,70,170,250,580,920,840,1030,860,930,890,990,1180,1140,920,1010,970,620,630,460,180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240]},{"name":"Groups","color":"#9ED448","values":[560,270,70,10,70,170,410,590,690,910,1200,2910,1220,830,950,1000,890,1090,1200,990,1110,1400,1370,820,280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990]},{"name":"Channel","color":"#4fae4e","values":[20,30,10,0,10,50,20,30,30,100,60,60,30,150,60,60,70,120,70,110,100,90,70,100,40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,20,20,500,420,60,230,140,140,90,130,90,550,190,190,250,120,320,380,50,50,50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230]},{"name":"Other","color":"#F79E39","values":[90,30,0,30,20,60,70,180,150,160,300,280,220,270,170,130,260,190,270,240,110,260,230,160,30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,30,0,10,0,0,10,0,10,10,0,20,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/25.json b/public/chartDummyData/views_zoom/2018-08/25.json new file mode 100644 index 000000000..79e92a085 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534896000000,1534899600000,1534903200000,1534906800000,1534910400000,1534914000000,1534917600000,1534921200000,1534924800000,1534928400000,1534932000000,1534935600000,1534939200000,1534942800000,1534946400000,1534950000000,1534953600000,1534957200000,1534960800000,1534964400000,1534968000000,1534971600000,1534975200000,1534978800000,1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[300,70,110,70,80,400,480,710,1310,1250,1410,1400,1440,1440,1160,1590,1390,1480,1290,1450,1480,1250,860,420,510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820]},{"name":"URL","color":"#2373DB","values":[180,110,40,0,70,70,320,590,530,500,700,820,870,740,700,830,1020,1120,990,830,860,910,720,330,190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210]},{"name":"Groups","color":"#9ED448","values":[280,170,180,40,20,140,360,790,730,720,1590,1220,1290,1110,650,1000,1040,1570,950,2470,1390,1640,2130,790,630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720]},{"name":"Channel","color":"#4fae4e","values":[40,10,0,60,10,40,30,90,30,70,50,90,50,100,90,40,160,110,120,130,80,90,40,30,50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10]},{"name":"Search","color":"#F5BD25","values":[50,20,30,60,40,90,650,120,60,60,210,190,240,330,210,130,290,210,120,100,210,120,100,90,0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120]},{"name":"Other","color":"#F79E39","values":[30,80,20,10,20,70,100,160,170,180,160,240,150,190,240,210,180,160,220,160,210,120,130,130,60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,0,0,0,0,10,0,0,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/26.json b/public/chartDummyData/views_zoom/2018-08/26.json new file mode 100644 index 000000000..01ad96db3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1534982400000,1534986000000,1534989600000,1534993200000,1534996800000,1535000400000,1535004000000,1535007600000,1535011200000,1535014800000,1535018400000,1535022000000,1535025600000,1535029200000,1535032800000,1535036400000,1535040000000,1535043600000,1535047200000,1535050800000,1535054400000,1535058000000,1535061600000,1535065200000,1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,160,20,50,90,160,860,900,1060,1470,1130,1200,1240,1410,1390,1750,1420,1350,1610,1360,1250,1190,1210,750,320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570]},{"name":"URL","color":"#2373DB","values":[190,130,20,0,20,30,170,250,490,850,820,850,950,790,940,850,1080,1150,1200,1210,710,800,470,300,180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310]},{"name":"Groups","color":"#9ED448","values":[630,280,140,50,50,170,400,670,970,870,870,1060,1060,1360,1940,1150,1130,740,1010,1970,1290,1540,1490,1070,530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900]},{"name":"Channel","color":"#4fae4e","values":[50,10,10,0,0,20,10,50,110,100,120,80,140,50,90,100,90,90,70,70,160,110,90,70,50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80]},{"name":"Search","color":"#F5BD25","values":[0,20,20,30,40,90,640,130,80,180,380,170,130,250,270,340,230,100,150,140,160,40,240,80,140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130]},{"name":"Other","color":"#F79E39","values":[60,30,0,0,0,50,150,220,170,220,180,200,240,190,230,240,230,250,300,120,180,110,170,90,80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,20,20,0,30,0,0,0,20,0,10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/27.json b/public/chartDummyData/views_zoom/2018-08/27.json new file mode 100644 index 000000000..fc8c136f5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535068800000,1535072400000,1535076000000,1535079600000,1535083200000,1535086800000,1535090400000,1535094000000,1535097600000,1535101200000,1535104800000,1535108400000,1535112000000,1535115600000,1535119200000,1535122800000,1535126400000,1535130000000,1535133600000,1535137200000,1535140800000,1535144400000,1535148000000,1535151600000,1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[320,260,110,160,20,150,600,1240,1080,1620,1270,1640,1460,1900,1430,1180,1720,1630,1200,1480,1480,1360,810,680,400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670]},{"name":"URL","color":"#2373DB","values":[180,180,30,0,10,180,210,380,620,710,840,940,720,680,860,980,1330,1110,960,930,680,590,490,330,170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450]},{"name":"Groups","color":"#9ED448","values":[530,130,130,150,110,110,370,790,730,1020,1310,960,1140,1070,670,860,1140,1050,1250,1130,1270,1530,1100,830,410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990]},{"name":"Channel","color":"#4fae4e","values":[50,10,20,10,10,10,40,40,120,50,60,120,60,70,100,110,100,110,90,60,90,120,80,30,40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20]},{"name":"Search","color":"#F5BD25","values":[140,10,20,0,0,10,360,80,240,320,130,270,60,330,220,140,170,150,130,430,250,250,110,70,150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30]},{"name":"Other","color":"#F79E39","values":[80,50,0,0,10,50,160,230,150,220,180,260,180,210,170,320,160,160,230,210,270,210,200,100,50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90]},{"name":"PM","color":"#E65850","values":[10,10,0,0,0,0,10,0,20,0,10,0,0,10,30,10,0,0,20,40,0,10,30,0,0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/28.json b/public/chartDummyData/views_zoom/2018-08/28.json new file mode 100644 index 000000000..7135e5819 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535155200000,1535158800000,1535162400000,1535166000000,1535169600000,1535173200000,1535176800000,1535180400000,1535184000000,1535187600000,1535191200000,1535194800000,1535198400000,1535202000000,1535205600000,1535209200000,1535212800000,1535216400000,1535220000000,1535223600000,1535227200000,1535230800000,1535234400000,1535238000000,1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[400,340,120,20,100,100,450,630,950,1340,1020,1460,1360,1960,1280,1790,1400,1460,1530,1500,1500,1110,990,650,310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030]},{"name":"URL","color":"#2373DB","values":[170,160,140,40,0,40,100,320,510,660,680,830,840,920,980,750,1060,840,1140,760,690,680,450,410,210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320]},{"name":"Groups","color":"#9ED448","values":[410,690,150,10,50,120,290,420,730,690,1040,860,1410,870,870,650,960,950,1030,1250,1220,1240,1140,750,470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960]},{"name":"Channel","color":"#4fae4e","values":[40,60,30,0,0,0,0,40,40,80,50,60,130,110,60,110,90,90,130,130,250,100,70,60,90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0]},{"name":"Search","color":"#F5BD25","values":[150,70,30,0,0,0,50,100,100,250,110,170,190,70,70,160,70,40,50,310,70,80,50,60,0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80]},{"name":"Other","color":"#F79E39","values":[50,30,10,10,20,60,70,140,180,180,360,270,330,270,180,210,320,200,280,180,200,100,170,140,120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,20,20,0,10,10,30,0,0,10,10,10,30,0,10,0,10,0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/29.json b/public/chartDummyData/views_zoom/2018-08/29.json new file mode 100644 index 000000000..d7cd1adb9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535241600000,1535245200000,1535248800000,1535252400000,1535256000000,1535259600000,1535263200000,1535266800000,1535270400000,1535274000000,1535277600000,1535281200000,1535284800000,1535288400000,1535292000000,1535295600000,1535299200000,1535302800000,1535306400000,1535310000000,1535313600000,1535317200000,1535320800000,1535324400000,1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[310,260,130,70,80,190,400,730,980,920,1570,1220,1530,1550,1060,1160,1940,1950,1890,1420,1230,1370,1030,1150,430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010]},{"name":"URL","color":"#2373DB","values":[210,120,60,70,30,20,170,210,440,610,770,680,820,640,680,740,840,850,920,860,690,810,490,350,240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430]},{"name":"Groups","color":"#9ED448","values":[470,340,190,140,90,130,160,570,580,1020,880,1200,1160,1140,870,1000,1130,920,970,1180,1900,1600,1470,1080,480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180]},{"name":"Channel","color":"#4fae4e","values":[90,0,20,0,10,10,10,110,20,50,120,150,70,130,60,80,90,50,50,80,90,170,90,50,90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30]},{"name":"Search","color":"#F5BD25","values":[0,60,10,0,0,30,100,160,280,240,200,190,490,190,110,220,180,240,70,210,110,80,130,40,20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40]},{"name":"Other","color":"#F79E39","values":[120,80,30,20,0,40,60,150,250,250,280,250,280,270,210,180,280,130,230,270,230,260,270,100,30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,20,0,20,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/30.json b/public/chartDummyData/views_zoom/2018-08/30.json new file mode 100644 index 000000000..7bf6b3a6a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535328000000,1535331600000,1535335200000,1535338800000,1535342400000,1535346000000,1535349600000,1535353200000,1535356800000,1535360400000,1535364000000,1535367600000,1535371200000,1535374800000,1535378400000,1535382000000,1535385600000,1535389200000,1535392800000,1535396400000,1535400000000,1535403600000,1535407200000,1535410800000,1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,170,100,70,50,440,360,870,1040,1170,1190,1360,1300,1270,1420,2060,2110,1500,1510,1690,1270,1590,1050,1030,170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670]},{"name":"URL","color":"#2373DB","values":[240,90,20,70,40,90,330,390,540,870,1180,810,1040,1010,810,1100,1230,1290,1160,1080,650,690,450,240,270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240]},{"name":"Groups","color":"#9ED448","values":[480,240,80,30,60,130,460,470,790,860,840,940,960,1120,1090,730,960,1100,990,1300,1740,1460,1720,990,320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860]},{"name":"Channel","color":"#4fae4e","values":[90,20,0,0,0,10,10,10,50,90,90,60,60,50,210,280,80,110,270,290,160,100,70,60,20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40]},{"name":"Search","color":"#F5BD25","values":[20,10,0,40,50,30,550,120,390,230,200,320,290,250,210,140,260,80,210,330,90,480,580,230,140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40]},{"name":"Other","color":"#F79E39","values":[30,10,20,0,30,80,100,180,210,170,140,230,170,240,250,240,340,210,250,240,180,160,110,90,70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,0,0,0,0,0,10,20,0,0,0,40,10,0,0,0,0,0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-08/31.json b/public/chartDummyData/views_zoom/2018-08/31.json new file mode 100644 index 000000000..92062619c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-08/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535414400000,1535418000000,1535421600000,1535425200000,1535428800000,1535432400000,1535436000000,1535439600000,1535443200000,1535446800000,1535450400000,1535454000000,1535457600000,1535461200000,1535464800000,1535468400000,1535472000000,1535475600000,1535479200000,1535482800000,1535486400000,1535490000000,1535493600000,1535497200000,1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,240,70,80,90,230,640,780,990,1290,1720,1560,1630,1430,1120,1340,1470,1760,1540,1340,1570,1180,850,820,510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640]},{"name":"URL","color":"#2373DB","values":[270,30,50,20,0,80,280,470,760,1040,880,850,770,930,1040,840,1320,1100,1250,1080,870,750,640,210,160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260]},{"name":"Groups","color":"#9ED448","values":[320,350,80,80,70,200,420,740,660,1030,1100,1000,1000,1080,850,1020,830,860,1320,1460,1440,1810,1290,720,250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790]},{"name":"Channel","color":"#4fae4e","values":[20,0,10,40,0,40,60,10,90,100,20,80,100,160,30,160,90,90,80,20,150,70,110,10,80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30]},{"name":"Search","color":"#F5BD25","values":[140,110,90,0,10,110,690,240,260,340,200,180,210,70,170,160,80,150,60,320,280,190,180,120,20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60]},{"name":"Other","color":"#F79E39","values":[70,0,10,20,10,100,130,90,130,210,280,280,240,220,230,150,130,160,230,290,240,180,210,80,40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,10,10,20,0,10,0,0,30,30,10,0,0,10,0,0,20,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/01.json b/public/chartDummyData/views_zoom/2018-09/01.json new file mode 100644 index 000000000..374b781e1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535500800000,1535504400000,1535508000000,1535511600000,1535515200000,1535518800000,1535522400000,1535526000000,1535529600000,1535533200000,1535536800000,1535540400000,1535544000000,1535547600000,1535551200000,1535554800000,1535558400000,1535562000000,1535565600000,1535569200000,1535572800000,1535576400000,1535580000000,1535583600000,1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,150,80,40,100,530,570,600,980,1140,1680,1170,1380,1540,1340,1290,1190,1510,1470,1630,1740,1350,1230,570,420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670]},{"name":"URL","color":"#2373DB","values":[160,40,90,70,30,80,290,390,690,760,930,800,1130,960,900,1230,1160,1540,1250,1340,1210,630,730,310,90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350]},{"name":"Groups","color":"#9ED448","values":[250,140,80,70,80,120,510,520,990,820,880,1140,1000,1260,1000,790,680,940,1110,1580,1440,1780,1450,900,380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860]},{"name":"Channel","color":"#4fae4e","values":[80,0,40,10,10,60,130,50,90,50,70,90,150,130,150,50,60,30,210,90,100,130,80,80,50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50]},{"name":"Search","color":"#F5BD25","values":[20,20,20,10,20,140,90,550,260,120,120,240,380,100,450,120,70,50,200,250,50,360,170,130,20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10]},{"name":"Other","color":"#F79E39","values":[40,20,10,0,20,130,20,190,200,150,210,270,210,150,150,220,140,290,160,300,210,220,150,80,60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,10,60,20,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/02.json b/public/chartDummyData/views_zoom/2018-09/02.json new file mode 100644 index 000000000..aa3617625 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535587200000,1535590800000,1535594400000,1535598000000,1535601600000,1535605200000,1535608800000,1535612400000,1535616000000,1535619600000,1535623200000,1535626800000,1535630400000,1535634000000,1535637600000,1535641200000,1535644800000,1535648400000,1535652000000,1535655600000,1535659200000,1535662800000,1535666400000,1535670000000,1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[420,80,140,90,60,160,450,880,1040,1360,1750,1290,1440,1190,1130,1200,1590,1590,1420,1460,1530,1330,920,670,390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660]},{"name":"URL","color":"#2373DB","values":[90,10,50,10,20,130,300,650,710,1210,950,1010,1040,810,1030,990,1220,1490,1220,1000,820,960,630,450,220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300]},{"name":"Groups","color":"#9ED448","values":[380,160,70,30,110,240,740,810,760,960,960,1220,970,960,840,880,730,1070,1020,1160,1410,1700,1640,990,590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220]},{"name":"Channel","color":"#4fae4e","values":[50,10,0,0,10,10,10,80,60,110,80,50,60,90,50,20,110,120,220,80,30,80,80,20,70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50]},{"name":"Search","color":"#F5BD25","values":[20,10,10,10,10,70,700,280,100,120,150,120,160,90,90,120,70,150,240,120,70,140,150,30,30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70]},{"name":"Other","color":"#F79E39","values":[60,10,10,10,30,100,90,200,190,210,170,250,150,260,280,120,240,260,190,410,210,250,110,90,50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,0,10,0,10,0,0,0,30,0,0,0,0,10,0,0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/03.json b/public/chartDummyData/views_zoom/2018-09/03.json new file mode 100644 index 000000000..324b7192b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535673600000,1535677200000,1535680800000,1535684400000,1535688000000,1535691600000,1535695200000,1535698800000,1535702400000,1535706000000,1535709600000,1535713200000,1535716800000,1535720400000,1535724000000,1535727600000,1535731200000,1535734800000,1535738400000,1535742000000,1535745600000,1535749200000,1535752800000,1535756400000,1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,120,50,0,100,180,420,760,1170,1200,1540,1500,1510,1330,1330,1370,1340,1350,1170,1440,1660,1560,870,1030,430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530]},{"name":"URL","color":"#2373DB","values":[220,120,0,0,60,150,300,560,680,930,1090,870,970,970,1010,1170,1510,1170,1150,1240,1010,870,580,320,130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300]},{"name":"Groups","color":"#9ED448","values":[590,200,20,0,70,240,520,780,960,950,1060,1160,1320,1290,1000,870,1190,1220,1240,1410,1500,1170,1730,960,440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800]},{"name":"Channel","color":"#4fae4e","values":[70,30,0,0,0,10,0,50,70,40,80,50,60,40,90,70,130,130,150,50,150,50,90,0,70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,70,120,30,570,120,130,80,230,140,100,160,190,140,140,120,230,190,150,100,80,70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170]},{"name":"Other","color":"#F79E39","values":[50,20,10,0,0,100,60,180,200,280,140,260,340,270,190,160,270,260,300,270,220,240,270,40,70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,0,0,0,0,0,0,10,0,0,10,0,10,20,0,0,20,0,0,10,10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/04.json b/public/chartDummyData/views_zoom/2018-09/04.json new file mode 100644 index 000000000..0ed3abb44 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535760000000,1535763600000,1535767200000,1535770800000,1535774400000,1535778000000,1535781600000,1535785200000,1535788800000,1535792400000,1535796000000,1535799600000,1535803200000,1535806800000,1535810400000,1535814000000,1535817600000,1535821200000,1535824800000,1535828400000,1535832000000,1535835600000,1535839200000,1535842800000,1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,230,100,100,60,260,430,720,840,1110,1590,1320,1540,1450,1570,1250,1660,1430,1550,1390,970,1130,1020,1010,420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680]},{"name":"URL","color":"#2373DB","values":[130,60,40,60,20,20,140,440,700,910,1100,930,1150,810,860,970,1330,1360,1200,1090,900,710,620,430,330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260]},{"name":"Groups","color":"#9ED448","values":[440,180,90,210,90,100,280,560,620,740,750,980,1040,1110,930,880,920,800,710,1240,1280,1330,1460,1180,480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110]},{"name":"Channel","color":"#4fae4e","values":[70,10,0,10,10,20,90,60,60,40,120,130,90,140,120,90,120,110,120,110,100,150,40,30,50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80]},{"name":"Search","color":"#F5BD25","values":[70,140,0,0,10,30,510,210,90,480,200,140,350,80,30,190,110,110,90,210,110,210,60,40,100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110]},{"name":"Other","color":"#F79E39","values":[70,10,0,0,10,30,180,120,230,160,160,230,170,310,120,180,250,160,180,110,180,180,100,90,80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,10,10,0,0,40,0,10,20,20,10,10,0,30,20,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/05.json b/public/chartDummyData/views_zoom/2018-09/05.json new file mode 100644 index 000000000..60f8ed8a2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535846400000,1535850000000,1535853600000,1535857200000,1535860800000,1535864400000,1535868000000,1535871600000,1535875200000,1535878800000,1535882400000,1535886000000,1535889600000,1535893200000,1535896800000,1535900400000,1535904000000,1535907600000,1535911200000,1535914800000,1535918400000,1535922000000,1535925600000,1535929200000,1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[420,260,180,40,30,110,410,630,1070,1210,1690,1330,1720,1370,1100,1440,1740,1860,1160,1520,1540,1170,1160,670,240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030]},{"name":"URL","color":"#2373DB","values":[330,40,130,20,0,10,60,220,420,570,900,680,750,720,710,940,1010,910,1120,1450,870,1120,620,240,160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540]},{"name":"Groups","color":"#9ED448","values":[480,220,110,200,120,90,210,470,770,790,980,1050,1050,1200,1140,800,1080,1200,1270,1370,1380,1710,1300,860,370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950]},{"name":"Channel","color":"#4fae4e","values":[50,20,40,20,50,40,30,40,80,100,60,60,90,120,60,200,40,150,100,250,40,60,50,40,60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30]},{"name":"Search","color":"#F5BD25","values":[100,10,0,10,30,50,220,140,90,160,140,230,420,80,310,100,80,480,70,100,90,220,300,40,0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100]},{"name":"Other","color":"#F79E39","values":[80,0,20,10,40,20,50,170,200,200,190,210,190,200,150,150,210,220,290,220,270,180,100,60,110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,10,20,10,10,20,10,10,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/06.json b/public/chartDummyData/views_zoom/2018-09/06.json new file mode 100644 index 000000000..6e16d6bfb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1535932800000,1535936400000,1535940000000,1535943600000,1535947200000,1535950800000,1535954400000,1535958000000,1535961600000,1535965200000,1535968800000,1535972400000,1535976000000,1535979600000,1535983200000,1535986800000,1535990400000,1535994000000,1535997600000,1536001200000,1536004800000,1536008400000,1536012000000,1536015600000,1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,110,90,50,30,240,510,840,1050,1360,1280,1260,1430,1640,1620,1330,1410,1530,1330,1940,1830,1130,790,640,270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630]},{"name":"URL","color":"#2373DB","values":[160,100,20,30,0,110,360,430,650,680,1080,1000,990,1010,1110,940,1260,1400,1430,1190,1070,1000,650,260,60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300]},{"name":"Groups","color":"#9ED448","values":[370,290,100,30,170,510,610,690,840,910,850,1020,1190,970,820,930,850,1030,1310,1700,1890,1890,1560,790,390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620]},{"name":"Channel","color":"#4fae4e","values":[60,0,20,0,0,40,30,80,130,70,100,60,80,170,130,90,160,80,150,160,100,70,40,30,20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100]},{"name":"Search","color":"#F5BD25","values":[0,20,0,0,20,320,30,40,80,90,240,710,140,170,130,280,120,90,160,490,640,200,200,60,60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10]},{"name":"Other","color":"#F79E39","values":[110,40,30,10,50,60,90,200,150,250,250,250,250,180,180,220,220,240,290,220,160,260,260,90,170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,0,20,10,20,0,0,10,0,0,10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/07.json b/public/chartDummyData/views_zoom/2018-09/07.json new file mode 100644 index 000000000..dfc061a22 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536019200000,1536022800000,1536026400000,1536030000000,1536033600000,1536037200000,1536040800000,1536044400000,1536048000000,1536051600000,1536055200000,1536058800000,1536062400000,1536066000000,1536069600000,1536073200000,1536076800000,1536080400000,1536084000000,1536087600000,1536091200000,1536094800000,1536098400000,1536102000000,1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,140,20,40,90,250,1270,750,1000,1360,1460,1610,1370,1430,1580,1280,1630,1450,1840,1850,1410,1960,1210,670,470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400]},{"name":"URL","color":"#2373DB","values":[60,80,20,40,130,120,410,510,1010,910,1280,990,980,1120,950,1340,1350,1200,1400,1200,1130,730,560,350,240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320]},{"name":"Groups","color":"#9ED448","values":[390,90,70,80,100,190,560,670,750,820,960,1220,1170,2720,890,970,920,950,1330,2040,1600,1620,1430,860,850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910]},{"name":"Channel","color":"#4fae4e","values":[20,30,60,0,10,20,40,0,80,100,50,80,120,120,130,90,50,110,80,90,160,60,70,50,60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60]},{"name":"Search","color":"#F5BD25","values":[60,20,10,0,50,130,530,10,60,200,320,100,170,110,180,60,150,220,190,140,180,210,80,10,20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50]},{"name":"Other","color":"#F79E39","values":[170,20,10,10,20,140,140,160,180,250,180,310,250,270,280,150,260,110,260,310,320,200,190,50,40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,10,0,10,0,0,10,20,0,0,10,0,30,0,10,10,0,0,0,0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/08.json b/public/chartDummyData/views_zoom/2018-09/08.json new file mode 100644 index 000000000..59b1eb00e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536105600000,1536109200000,1536112800000,1536116400000,1536120000000,1536123600000,1536127200000,1536130800000,1536134400000,1536138000000,1536141600000,1536145200000,1536148800000,1536152400000,1536156000000,1536159600000,1536163200000,1536166800000,1536170400000,1536174000000,1536177600000,1536181200000,1536184800000,1536188400000,1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[470,200,60,90,160,330,860,850,1100,1230,1260,1290,1300,1630,1190,1240,1450,1370,1430,1820,1370,1050,1010,660,410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460]},{"name":"URL","color":"#2373DB","values":[240,60,30,20,10,120,280,600,750,1050,1170,1010,1140,1100,940,1280,1340,1480,1250,1170,1090,680,670,300,80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400]},{"name":"Groups","color":"#9ED448","values":[850,200,90,70,250,280,590,710,860,750,1040,1340,1170,1000,1120,950,1210,1010,1300,1610,1830,1980,1270,1220,420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570]},{"name":"Channel","color":"#4fae4e","values":[60,10,0,0,40,10,30,20,90,80,50,80,120,90,40,90,120,120,60,140,80,110,30,50,10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10]},{"name":"Search","color":"#F5BD25","values":[20,10,0,0,0,110,360,270,160,180,170,180,110,130,90,70,340,100,60,130,180,130,80,70,100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30]},{"name":"Other","color":"#F79E39","values":[40,30,40,0,70,60,130,160,240,200,230,240,190,140,190,250,230,230,290,260,250,170,150,130,90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,10,0,0,10,0,0,0,0,20,10,0,20,0,20,0,10,0,0,10,10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/09.json b/public/chartDummyData/views_zoom/2018-09/09.json new file mode 100644 index 000000000..3f0e66bc4 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536192000000,1536195600000,1536199200000,1536202800000,1536206400000,1536210000000,1536213600000,1536217200000,1536220800000,1536224400000,1536228000000,1536231600000,1536235200000,1536238800000,1536242400000,1536246000000,1536249600000,1536253200000,1536256800000,1536260400000,1536264000000,1536267600000,1536271200000,1536274800000,1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[410,180,70,40,130,270,600,600,860,1500,1390,1380,1720,1340,1010,1390,1150,1740,1640,1660,1740,1150,830,530,560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260]},{"name":"URL","color":"#2373DB","values":[80,50,0,60,60,110,270,510,750,990,1150,1080,1210,1160,1180,1200,1520,1490,1250,1100,1150,730,460,300,210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280]},{"name":"Groups","color":"#9ED448","values":[420,270,210,150,210,290,670,750,830,970,1150,1180,1270,1220,1080,980,1140,1170,1320,1900,1460,1950,1420,800,450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410]},{"name":"Channel","color":"#4fae4e","values":[10,400,0,10,40,30,120,20,80,40,50,70,70,120,190,70,50,170,170,110,120,160,40,50,50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380]},{"name":"Search","color":"#F5BD25","values":[100,60,0,0,150,50,650,30,270,190,170,770,390,330,210,160,110,80,270,260,260,330,300,170,320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40]},{"name":"Other","color":"#F79E39","values":[90,10,0,70,40,70,130,220,170,150,130,230,360,260,190,230,170,270,260,170,230,250,130,120,90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,20,0,0,10,10,10,10,0,10,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/10.json b/public/chartDummyData/views_zoom/2018-09/10.json new file mode 100644 index 000000000..6af3d8ae1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536278400000,1536282000000,1536285600000,1536289200000,1536292800000,1536296400000,1536300000000,1536303600000,1536307200000,1536310800000,1536314400000,1536318000000,1536321600000,1536325200000,1536328800000,1536332400000,1536336000000,1536339600000,1536343200000,1536346800000,1536350400000,1536354000000,1536357600000,1536361200000,1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[560,170,90,70,70,410,730,980,940,1090,1080,1370,1620,1300,1350,1360,1500,1180,1740,1530,1470,1230,1110,680,430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600]},{"name":"URL","color":"#2373DB","values":[210,70,30,20,40,120,330,660,720,1090,1230,1030,1100,1020,1160,1310,1530,1370,1520,1070,980,740,570,260,150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190]},{"name":"Groups","color":"#9ED448","values":[450,210,60,110,130,250,350,600,810,710,940,1070,1210,1180,910,1120,1130,990,1600,1230,1150,1460,1400,1110,450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460]},{"name":"Channel","color":"#4fae4e","values":[50,0,0,20,0,140,10,50,50,70,80,120,90,50,60,170,190,130,130,100,130,60,90,80,10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40]},{"name":"Search","color":"#F5BD25","values":[320,140,40,0,10,150,590,180,70,100,70,330,170,220,90,240,220,210,280,150,200,240,470,110,40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60]},{"name":"Other","color":"#F79E39","values":[90,90,0,20,50,150,110,180,240,250,270,270,200,170,260,260,160,210,290,270,220,250,200,90,90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,0,10,20,0,10,10,10,0,0,10,0,10,0,0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/11.json b/public/chartDummyData/views_zoom/2018-09/11.json new file mode 100644 index 000000000..99db92aea --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536364800000,1536368400000,1536372000000,1536375600000,1536379200000,1536382800000,1536386400000,1536390000000,1536393600000,1536397200000,1536400800000,1536404400000,1536408000000,1536411600000,1536415200000,1536418800000,1536422400000,1536426000000,1536429600000,1536433200000,1536436800000,1536440400000,1536444000000,1536447600000,1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,230,210,160,100,270,620,850,670,1270,1430,1310,1610,1550,1360,1170,1460,1420,1220,1290,1350,1210,1180,1030,600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750]},{"name":"URL","color":"#2373DB","values":[150,50,40,30,30,90,270,450,840,1210,990,910,960,890,890,1330,1420,1520,1280,890,730,720,560,540,280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320]},{"name":"Groups","color":"#9ED448","values":[450,280,160,70,60,240,290,510,870,1000,1110,930,1320,1230,900,1030,670,790,960,1120,910,2070,1220,950,2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,0,10,30,10,40,40,90,100,70,210,90,110,70,80,80,110,40,90,130,100,30,40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50]},{"name":"Search","color":"#F5BD25","values":[40,10,10,10,30,170,80,750,300,30,110,160,130,130,130,190,80,120,370,70,120,290,110,100,70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80]},{"name":"Other","color":"#F79E39","values":[90,40,20,10,20,20,60,140,150,230,280,180,200,200,160,200,160,250,160,190,160,170,150,100,40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,10,20,10,0,0,0,10,10,10,0,10,30,10,0,0,10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/12.json b/public/chartDummyData/views_zoom/2018-09/12.json new file mode 100644 index 000000000..ea5257dd6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536451200000,1536454800000,1536458400000,1536462000000,1536465600000,1536469200000,1536472800000,1536476400000,1536480000000,1536483600000,1536487200000,1536490800000,1536494400000,1536498000000,1536501600000,1536505200000,1536508800000,1536512400000,1536516000000,1536519600000,1536523200000,1536526800000,1536530400000,1536534000000,1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,250,180,430,70,410,680,730,1070,1360,1820,1590,1310,1380,1660,1630,1810,1570,1680,1880,1450,1210,830,630,330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650]},{"name":"URL","color":"#2373DB","values":[280,100,40,20,0,30,170,360,490,840,780,720,790,710,770,640,770,980,1280,980,840,880,550,300,210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400]},{"name":"Groups","color":"#9ED448","values":[2120,600,180,80,350,140,390,680,770,760,1060,930,900,650,1230,920,900,870,1280,1450,1530,1770,1360,620,420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810]},{"name":"Channel","color":"#4fae4e","values":[40,80,30,60,10,20,30,80,90,50,80,80,120,240,220,150,80,120,40,90,100,100,70,100,40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90]},{"name":"Search","color":"#F5BD25","values":[70,40,10,10,20,100,280,200,380,180,160,100,140,110,90,140,190,220,90,240,130,170,90,10,10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260]},{"name":"Other","color":"#F79E39","values":[40,40,20,0,0,20,40,120,170,170,230,190,200,230,190,270,150,220,200,120,160,260,150,100,120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,0,0,30,0,20,10,0,10,0,20,30,10,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/13.json b/public/chartDummyData/views_zoom/2018-09/13.json new file mode 100644 index 000000000..d80ff5fd3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536537600000,1536541200000,1536544800000,1536548400000,1536552000000,1536555600000,1536559200000,1536562800000,1536566400000,1536570000000,1536573600000,1536577200000,1536580800000,1536584400000,1536588000000,1536591600000,1536595200000,1536598800000,1536602400000,1536606000000,1536609600000,1536613200000,1536616800000,1536620400000,1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[330,130,30,20,210,370,520,690,980,1310,1480,1370,1600,1360,1390,1430,1010,1310,1600,1680,1300,1110,1060,400,250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290]},{"name":"URL","color":"#2373DB","values":[210,60,40,20,60,70,220,460,920,960,1100,1150,1090,1070,960,1100,1490,1440,1370,1460,1130,1110,660,320,210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160]},{"name":"Groups","color":"#9ED448","values":[420,210,110,30,60,290,540,730,790,780,1030,1580,1050,910,920,950,1080,1090,1540,1920,1560,1890,1340,910,210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770]},{"name":"Channel","color":"#4fae4e","values":[40,0,10,10,0,10,50,70,50,50,70,60,140,50,70,20,140,40,90,220,100,140,70,60,20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40]},{"name":"Search","color":"#F5BD25","values":[10,10,40,0,310,340,100,60,70,130,110,480,190,90,420,160,190,170,290,170,90,240,60,50,0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20]},{"name":"Other","color":"#F79E39","values":[120,10,0,0,10,150,110,90,170,230,190,170,160,240,140,290,200,290,230,230,200,220,120,100,30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/14.json b/public/chartDummyData/views_zoom/2018-09/14.json new file mode 100644 index 000000000..6c913dce5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536624000000,1536627600000,1536631200000,1536634800000,1536638400000,1536642000000,1536645600000,1536649200000,1536652800000,1536656400000,1536660000000,1536663600000,1536667200000,1536670800000,1536674400000,1536678000000,1536681600000,1536685200000,1536688800000,1536692400000,1536696000000,1536699600000,1536703200000,1536706800000,1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,250,80,100,110,260,480,740,1080,1260,1360,2190,1200,1510,1160,1040,1630,1530,1380,2000,1880,1540,1210,460,260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420]},{"name":"URL","color":"#2373DB","values":[210,40,10,40,30,170,360,710,880,1010,1390,1230,1140,1000,1300,1270,1590,1410,1370,1190,920,700,780,400,160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180]},{"name":"Groups","color":"#9ED448","values":[210,190,150,70,200,280,560,630,1040,1050,1170,1350,1000,1040,1400,1390,1180,870,1150,1400,1870,1710,1100,570,300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,10,0,10,40,80,50,160,50,40,240,80,110,50,100,120,90,40,100,140,180,10,10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50]},{"name":"Search","color":"#F5BD25","values":[0,20,0,10,10,530,70,120,270,260,110,220,160,170,140,90,190,110,230,160,140,70,100,30,30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30]},{"name":"Other","color":"#F79E39","values":[30,70,20,0,20,100,50,180,180,160,220,160,220,210,190,160,240,140,110,180,280,180,150,160,40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,10,0,10,0,10,20,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/15.json b/public/chartDummyData/views_zoom/2018-09/15.json new file mode 100644 index 000000000..0e244002e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536710400000,1536714000000,1536717600000,1536721200000,1536724800000,1536728400000,1536732000000,1536735600000,1536739200000,1536742800000,1536746400000,1536750000000,1536753600000,1536757200000,1536760800000,1536764400000,1536768000000,1536771600000,1536775200000,1536778800000,1536782400000,1536786000000,1536789600000,1536793200000,1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,250,80,20,160,400,730,960,900,1050,1090,1410,1500,1280,1060,1120,1530,1230,1540,1530,1540,1240,870,260,180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410]},{"name":"URL","color":"#2373DB","values":[160,100,20,20,60,90,330,600,620,980,1070,1200,1030,1190,940,1280,1540,1550,1400,1550,880,690,710,280,110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290]},{"name":"Groups","color":"#9ED448","values":[300,110,70,60,250,440,520,660,570,790,1030,1370,1200,990,1040,1610,1380,1500,1300,1740,1560,1480,1420,1410,2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700]},{"name":"Channel","color":"#4fae4e","values":[10,90,0,0,0,20,20,30,60,50,70,90,90,80,60,90,130,160,100,90,150,150,120,380,70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,0,130,700,290,150,110,300,110,260,130,120,120,400,70,260,290,190,240,80,40,20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80]},{"name":"Other","color":"#F79E39","values":[40,0,0,10,20,60,130,180,190,180,100,340,210,160,200,190,200,270,210,340,230,210,100,70,60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,0,10,0,0,0,40,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/16.json b/public/chartDummyData/views_zoom/2018-09/16.json new file mode 100644 index 000000000..17a3b603d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536796800000,1536800400000,1536804000000,1536807600000,1536811200000,1536814800000,1536818400000,1536822000000,1536825600000,1536829200000,1536832800000,1536836400000,1536840000000,1536843600000,1536847200000,1536850800000,1536854400000,1536858000000,1536861600000,1536865200000,1536868800000,1536872400000,1536876000000,1536879600000,1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,70,180,60,180,390,480,770,1010,1030,1120,1390,1750,1440,1460,1420,1600,1560,1280,1690,1440,1120,830,600,130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350]},{"name":"URL","color":"#2373DB","values":[110,90,40,20,10,300,380,490,830,880,1550,1300,1210,1270,1270,1470,1710,1770,1600,1530,1290,900,420,190,90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190]},{"name":"Groups","color":"#9ED448","values":[2980,100,40,30,290,470,480,780,780,730,870,1320,1160,880,1040,1090,1150,1020,1390,1620,1920,1770,1270,460,270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620]},{"name":"Channel","color":"#4fae4e","values":[70,20,10,10,20,40,60,20,60,50,50,110,60,130,80,110,110,50,100,160,260,120,70,40,20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60]},{"name":"Search","color":"#F5BD25","values":[20,30,0,0,120,430,290,260,110,610,350,330,320,250,190,200,130,420,270,230,110,180,150,60,90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60]},{"name":"Other","color":"#F79E39","values":[60,10,20,30,10,120,160,160,180,210,280,160,200,170,160,250,260,280,250,400,320,210,210,70,40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,10,0,10,20,0,10,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/17.json b/public/chartDummyData/views_zoom/2018-09/17.json new file mode 100644 index 000000000..165e659cc --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536883200000,1536886800000,1536890400000,1536894000000,1536897600000,1536901200000,1536904800000,1536908400000,1536912000000,1536915600000,1536919200000,1536922800000,1536926400000,1536930000000,1536933600000,1536937200000,1536940800000,1536944400000,1536948000000,1536951600000,1536955200000,1536958800000,1536962400000,1536966000000,1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,150,100,40,130,310,670,860,800,1010,1240,1270,1420,1460,1430,1450,1070,1240,1640,1650,1360,1360,920,750,410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250]},{"name":"URL","color":"#2373DB","values":[90,60,40,20,10,210,530,480,600,1120,1260,1210,1330,1100,1020,1460,1710,1630,1430,1320,1140,680,640,320,210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260]},{"name":"Groups","color":"#9ED448","values":[270,70,40,90,150,490,480,540,640,750,1130,1040,1120,1000,1060,1000,840,1260,1390,1150,1070,1600,1180,790,510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540]},{"name":"Channel","color":"#4fae4e","values":[20,30,0,0,20,0,10,70,90,30,50,30,190,250,80,120,80,290,110,50,110,130,80,50,10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130]},{"name":"Search","color":"#F5BD25","values":[90,0,0,0,30,660,390,350,540,110,280,110,140,110,110,100,60,290,30,150,300,150,100,80,60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70]},{"name":"Other","color":"#F79E39","values":[40,20,10,10,60,90,100,170,100,170,190,260,220,250,210,110,170,330,290,200,190,170,150,50,50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,40,0,0,0,10,0,10,10,0,0,30,0,0,30,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/18.json b/public/chartDummyData/views_zoom/2018-09/18.json new file mode 100644 index 000000000..967c79ffe --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1536969600000,1536973200000,1536976800000,1536980400000,1536984000000,1536987600000,1536991200000,1536994800000,1536998400000,1537002000000,1537005600000,1537009200000,1537012800000,1537016400000,1537020000000,1537023600000,1537027200000,1537030800000,1537034400000,1537038000000,1537041600000,1537045200000,1537048800000,1537052400000,1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[410,160,40,20,110,410,470,680,1130,1310,1710,1730,1590,1300,1780,1460,1740,1550,1410,1490,1310,1250,910,650,510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600]},{"name":"URL","color":"#2373DB","values":[210,170,90,0,20,130,210,410,800,1090,1300,1210,1040,1120,860,840,1100,1080,1190,1070,720,790,560,400,260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350]},{"name":"Groups","color":"#9ED448","values":[510,270,1080,420,50,220,430,1300,710,1260,1090,1090,1430,1190,850,790,1020,1020,1020,1040,2220,1350,900,810,470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,10,20,20,30,40,150,80,110,180,110,130,210,90,70,70,70,140,160,80,120,90,10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60]},{"name":"Search","color":"#F5BD25","values":[60,30,0,0,20,150,180,690,90,90,150,150,160,220,170,100,50,190,40,430,250,150,80,260,40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90]},{"name":"Other","color":"#F79E39","values":[50,30,0,10,10,40,50,120,220,190,290,150,220,180,230,120,210,170,160,120,280,140,80,90,40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90]},{"name":"PM","color":"#E65850","values":[0,0,10,0,0,0,10,0,0,0,0,0,0,20,0,10,10,20,30,10,0,0,10,10,0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/19.json b/public/chartDummyData/views_zoom/2018-09/19.json new file mode 100644 index 000000000..77a5de71a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537056000000,1537059600000,1537063200000,1537066800000,1537070400000,1537074000000,1537077600000,1537081200000,1537084800000,1537088400000,1537092000000,1537095600000,1537099200000,1537102800000,1537106400000,1537110000000,1537113600000,1537117200000,1537120800000,1537124400000,1537128000000,1537131600000,1537135200000,1537138800000,1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,240,130,60,70,210,380,1140,990,1430,1660,1310,1830,1650,1550,1470,1400,1500,1690,1730,1590,1510,620,290,180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700]},{"name":"URL","color":"#2373DB","values":[260,50,60,60,40,10,120,300,640,860,910,840,1080,1110,1000,960,1040,900,1200,1360,1170,890,300,160,110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520]},{"name":"Groups","color":"#9ED448","values":[470,110,40,30,40,110,420,860,800,820,1090,1020,1930,850,990,800,830,2820,1330,1830,1830,1860,1090,770,340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690]},{"name":"Channel","color":"#4fae4e","values":[10,10,30,20,0,20,60,40,50,90,50,160,60,140,100,130,200,90,190,130,120,60,100,40,20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80]},{"name":"Search","color":"#F5BD25","values":[40,30,0,10,0,60,110,850,190,320,200,250,200,470,330,210,240,200,260,230,150,120,50,20,10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50]},{"name":"Other","color":"#F79E39","values":[40,10,20,20,20,10,90,100,230,160,160,200,130,240,240,130,180,80,240,280,140,110,180,50,30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,20,0,0,10,0,10,10,10,0,10,10,10,0,0,0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/20.json b/public/chartDummyData/views_zoom/2018-09/20.json new file mode 100644 index 000000000..47bb149b9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537142400000,1537146000000,1537149600000,1537153200000,1537156800000,1537160400000,1537164000000,1537167600000,1537171200000,1537174800000,1537178400000,1537182000000,1537185600000,1537189200000,1537192800000,1537196400000,1537200000000,1537203600000,1537207200000,1537210800000,1537214400000,1537218000000,1537221600000,1537225200000,1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,60,60,90,120,480,1080,1030,1010,1290,1200,1250,2090,1750,1770,1440,1400,1610,1590,1790,2210,1340,920,420,100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440]},{"name":"URL","color":"#2373DB","values":[110,10,20,0,40,240,380,760,770,950,1160,1150,1160,1230,1150,1230,1350,1430,1460,1330,1150,780,420,180,80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360]},{"name":"Groups","color":"#9ED448","values":[340,110,30,30,240,430,430,840,750,910,1240,1090,870,900,1040,900,1260,1220,1340,1570,2120,1700,1130,240,150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420]},{"name":"Channel","color":"#4fae4e","values":[20,60,0,0,20,30,20,90,90,30,150,70,70,220,190,80,90,110,150,240,180,180,130,50,40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70]},{"name":"Search","color":"#F5BD25","values":[10,10,30,0,460,280,150,140,100,240,210,200,150,190,140,220,180,210,480,150,130,240,120,30,20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10]},{"name":"Other","color":"#F79E39","values":[30,10,0,10,30,90,100,240,140,130,150,210,170,280,250,240,260,340,260,270,280,240,100,90,30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,20,10,0,10,0,0,10,0,10,10,0,10,0,0,10,10,10,10,0,0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/21.json b/public/chartDummyData/views_zoom/2018-09/21.json new file mode 100644 index 000000000..6dcd01872 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537228800000,1537232400000,1537236000000,1537239600000,1537243200000,1537246800000,1537250400000,1537254000000,1537257600000,1537261200000,1537264800000,1537268400000,1537272000000,1537275600000,1537279200000,1537282800000,1537286400000,1537290000000,1537293600000,1537297200000,1537300800000,1537304400000,1537308000000,1537311600000,1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[100,40,10,60,160,350,760,650,990,1330,1200,1290,1570,1700,1730,1700,1320,1620,1860,1860,1430,1540,860,410,330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390]},{"name":"URL","color":"#2373DB","values":[80,110,80,10,70,250,450,790,570,810,1130,1180,1240,1200,1040,1220,1680,1710,1240,1590,910,820,500,290,160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320]},{"name":"Groups","color":"#9ED448","values":[150,50,70,90,300,390,660,740,890,790,1050,1210,1300,970,890,1460,1000,1420,1410,3050,1900,1700,1630,700,100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540]},{"name":"Channel","color":"#4fae4e","values":[40,140,10,0,20,0,20,40,60,30,80,100,100,100,60,210,120,120,180,130,270,100,80,50,20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70]},{"name":"Search","color":"#F5BD25","values":[20,0,20,20,80,880,100,90,70,60,110,220,130,150,100,150,120,180,240,370,130,90,120,80,20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0]},{"name":"Other","color":"#F79E39","values":[30,40,0,20,30,140,110,190,220,250,140,240,320,190,140,170,230,310,240,210,240,240,210,70,30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,20,0,20,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/22.json b/public/chartDummyData/views_zoom/2018-09/22.json new file mode 100644 index 000000000..fad165b28 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537315200000,1537318800000,1537322400000,1537326000000,1537329600000,1537333200000,1537336800000,1537340400000,1537344000000,1537347600000,1537351200000,1537354800000,1537358400000,1537362000000,1537365600000,1537369200000,1537372800000,1537376400000,1537380000000,1537383600000,1537387200000,1537390800000,1537394400000,1537398000000,1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[330,100,30,70,190,480,1090,730,1070,1090,1370,1120,1640,1700,1440,1570,1330,1700,1570,1640,1560,1400,670,350,140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340]},{"name":"URL","color":"#2373DB","values":[160,60,10,0,50,370,320,570,840,730,870,1150,1240,1150,1150,1340,1660,1710,1430,1500,1110,810,510,190,230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270]},{"name":"Groups","color":"#9ED448","values":[100,130,20,70,230,490,630,730,880,870,800,960,1230,1270,1220,1210,1710,1100,1490,1480,1610,1790,1240,620,240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,30,50,20,60,130,170,70,90,110,50,50,80,110,110,120,180,170,110,100,60,0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50]},{"name":"Search","color":"#F5BD25","values":[20,0,0,0,390,600,230,50,170,110,170,70,200,280,40,330,120,130,250,590,220,50,20,60,10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0]},{"name":"Other","color":"#F79E39","values":[30,0,10,20,30,150,180,210,110,190,230,190,330,260,240,440,290,290,300,250,250,210,100,80,10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,0,0,0,10,0,0,10,10,0,0,20,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/23.json b/public/chartDummyData/views_zoom/2018-09/23.json new file mode 100644 index 000000000..0ebe31a40 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537401600000,1537405200000,1537408800000,1537412400000,1537416000000,1537419600000,1537423200000,1537426800000,1537430400000,1537434000000,1537437600000,1537441200000,1537444800000,1537448400000,1537452000000,1537455600000,1537459200000,1537462800000,1537466400000,1537470000000,1537473600000,1537477200000,1537480800000,1537484400000,1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[140,40,50,50,90,570,890,840,1190,1140,1390,1480,1640,1590,1770,1400,1550,1760,1770,1310,1820,1270,690,250,200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270]},{"name":"URL","color":"#2373DB","values":[230,40,70,20,100,390,400,630,830,780,1240,1500,1190,1390,990,1430,1600,1860,1730,1420,1230,810,440,260,60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280]},{"name":"Groups","color":"#9ED448","values":[240,130,40,30,180,720,720,850,700,690,1090,1260,1330,1230,1020,1390,1070,1090,1530,1830,2100,1690,1230,540,170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,20,70,30,50,60,110,70,100,200,80,110,200,100,200,30,180,90,90,130,10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,20,130,660,120,140,240,130,110,210,360,90,70,200,230,190,490,120,240,120,70,10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90]},{"name":"Other","color":"#F79E39","values":[10,20,20,10,10,90,90,80,230,170,180,300,260,230,270,200,190,200,270,330,250,200,160,40,30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/24.json b/public/chartDummyData/views_zoom/2018-09/24.json new file mode 100644 index 000000000..521f4cb2b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537488000000,1537491600000,1537495200000,1537498800000,1537502400000,1537506000000,1537509600000,1537513200000,1537516800000,1537520400000,1537524000000,1537527600000,1537531200000,1537534800000,1537538400000,1537542000000,1537545600000,1537549200000,1537552800000,1537556400000,1537560000000,1537563600000,1537567200000,1537570800000,1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,150,60,130,370,480,800,1010,1220,1400,1260,1300,1320,1430,1300,1620,1340,1490,1410,1710,1410,1290,840,600,180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400]},{"name":"URL","color":"#2373DB","values":[60,30,10,0,70,190,500,640,890,900,1150,1440,1300,1270,1300,1600,1890,1860,1520,1360,1070,840,610,350,110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210]},{"name":"Groups","color":"#9ED448","values":[170,120,100,40,150,560,760,640,760,840,1210,1170,1520,1120,1430,1060,1160,1390,1360,1930,2050,1370,1050,490,470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,10,30,60,40,80,20,70,30,70,50,80,60,80,140,130,130,100,160,90,90,60,10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40]},{"name":"Search","color":"#F5BD25","values":[10,20,0,10,400,260,290,150,40,150,250,140,190,120,260,290,110,60,70,240,200,370,90,90,60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30]},{"name":"Other","color":"#F79E39","values":[30,0,0,20,50,150,180,120,190,190,260,290,210,250,250,240,220,210,180,330,210,140,150,90,60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,10,0,0,20,30,10,10,20,20,10,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/25.json b/public/chartDummyData/views_zoom/2018-09/25.json new file mode 100644 index 000000000..bbf39ae11 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537574400000,1537578000000,1537581600000,1537585200000,1537588800000,1537592400000,1537596000000,1537599600000,1537603200000,1537606800000,1537610400000,1537614000000,1537617600000,1537621200000,1537624800000,1537628400000,1537632000000,1537635600000,1537639200000,1537642800000,1537646400000,1537650000000,1537653600000,1537657200000,1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,150,60,70,180,290,420,1120,1580,1220,1630,1500,1540,1600,1280,1360,1920,1760,1570,1790,1290,1090,840,700,290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560]},{"name":"URL","color":"#2373DB","values":[110,80,70,10,40,150,170,520,900,910,1330,940,1270,1090,920,1180,1580,1390,1190,970,870,940,450,520,210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330]},{"name":"Groups","color":"#9ED448","values":[470,200,60,20,80,320,410,540,960,1100,1190,1410,1360,1320,1210,1060,1390,1020,1130,1070,1140,1910,1060,690,310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420]},{"name":"Channel","color":"#4fae4e","values":[10,0,10,0,0,50,60,0,110,90,100,70,110,80,160,130,90,120,110,200,210,160,80,80,80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40]},{"name":"Search","color":"#F5BD25","values":[60,40,0,0,70,120,560,350,90,280,200,220,70,230,490,280,350,670,110,170,150,340,60,50,10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30]},{"name":"Other","color":"#F79E39","values":[60,10,10,0,20,40,160,160,190,190,130,180,340,220,190,160,270,220,130,260,190,130,210,120,80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,0,0,0,0,0,30,40,0,0,10,0,0,0,20,0,0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/26.json b/public/chartDummyData/views_zoom/2018-09/26.json new file mode 100644 index 000000000..4a8326d1e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537660800000,1537664400000,1537668000000,1537671600000,1537675200000,1537678800000,1537682400000,1537686000000,1537689600000,1537693200000,1537696800000,1537700400000,1537704000000,1537707600000,1537711200000,1537714800000,1537718400000,1537722000000,1537725600000,1537729200000,1537732800000,1537736400000,1537740000000,1537743600000,1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[290,320,140,230,60,320,530,960,1160,1430,1590,1910,1480,1600,1720,1510,1710,1820,1720,4270,1960,1310,930,440,200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440]},{"name":"URL","color":"#2373DB","values":[210,80,50,20,30,130,240,400,710,960,1160,770,1200,910,980,1340,960,1370,1490,1620,1290,920,550,360,230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340]},{"name":"Groups","color":"#9ED448","values":[310,80,80,50,50,130,320,720,710,1060,1600,1190,1050,810,960,1270,1030,1120,1260,1520,1760,2380,1300,420,180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870]},{"name":"Channel","color":"#4fae4e","values":[80,10,10,10,50,10,10,30,70,60,180,170,100,150,70,60,100,110,120,50,150,60,160,70,20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0]},{"name":"Search","color":"#F5BD25","values":[10,50,10,10,10,10,40,520,420,300,130,180,470,140,130,500,670,260,470,220,90,60,40,10,20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20]},{"name":"Other","color":"#F79E39","values":[80,0,10,10,0,10,80,220,180,210,210,220,240,270,170,230,330,220,220,320,350,320,170,60,70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,10,10,0,10,0,0,0,10,0,10,0,0,10,10,10,0,0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/27.json b/public/chartDummyData/views_zoom/2018-09/27.json new file mode 100644 index 000000000..eea091d7b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537747200000,1537750800000,1537754400000,1537758000000,1537761600000,1537765200000,1537768800000,1537772400000,1537776000000,1537779600000,1537783200000,1537786800000,1537790400000,1537794000000,1537797600000,1537801200000,1537804800000,1537808400000,1537812000000,1537815600000,1537819200000,1537822800000,1537826400000,1537830000000,1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,30,40,180,170,620,880,880,1150,1400,1380,1540,1430,1740,1310,1430,1740,1640,1370,1790,1880,1660,1050,390,130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370]},{"name":"URL","color":"#2373DB","values":[230,40,0,10,60,340,600,670,770,740,1510,1310,1330,1380,1670,1330,1800,1940,1650,1330,1320,1190,650,320,80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160]},{"name":"Groups","color":"#9ED448","values":[180,100,20,20,270,630,640,710,950,720,1700,1120,1450,1320,1360,1720,1390,1640,1260,1660,1860,1890,1000,540,160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320]},{"name":"Channel","color":"#4fae4e","values":[20,0,180,0,30,50,20,30,80,40,20,70,90,140,150,60,90,90,110,120,120,150,80,70,20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40]},{"name":"Search","color":"#F5BD25","values":[20,0,0,0,450,160,100,200,40,220,280,320,250,170,150,130,250,150,190,210,230,450,60,0,10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50]},{"name":"Other","color":"#F79E39","values":[70,10,10,20,50,130,110,110,160,160,230,310,210,260,130,250,250,420,380,240,380,250,130,40,30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,0,10,0,0,0,0,10,20,0,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/28.json b/public/chartDummyData/views_zoom/2018-09/28.json new file mode 100644 index 000000000..793b3dc10 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537833600000,1537837200000,1537840800000,1537844400000,1537848000000,1537851600000,1537855200000,1537858800000,1537862400000,1537866000000,1537869600000,1537873200000,1537876800000,1537880400000,1537884000000,1537887600000,1537891200000,1537894800000,1537898400000,1537902000000,1537905600000,1537909200000,1537912800000,1537916400000,1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[130,110,10,80,220,660,810,890,1060,1250,1380,1550,1430,1600,1490,1570,2290,1970,1580,1700,1630,1290,840,340,100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270]},{"name":"URL","color":"#2373DB","values":[80,70,10,10,50,360,590,680,680,890,1030,1260,960,1130,1240,1350,1690,1670,1750,1780,1140,810,470,270,90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140]},{"name":"Groups","color":"#9ED448","values":[160,70,30,30,140,580,680,590,650,670,870,1470,1020,1400,1000,960,1060,1030,1420,1560,2080,2110,990,350,210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,50,20,40,40,40,120,90,30,60,160,130,90,140,140,70,70,130,90,40,50,0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,30,200,720,210,140,190,210,310,250,80,170,90,380,230,200,150,150,40,0,0,10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50]},{"name":"Other","color":"#F79E39","values":[30,20,0,10,0,230,130,110,160,250,190,180,240,240,250,340,230,220,260,320,280,180,80,20,20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,20,10,10,0,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/29.json b/public/chartDummyData/views_zoom/2018-09/29.json new file mode 100644 index 000000000..23083a066 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1537920000000,1537923600000,1537927200000,1537930800000,1537934400000,1537938000000,1537941600000,1537945200000,1537948800000,1537952400000,1537956000000,1537959600000,1537963200000,1537966800000,1537970400000,1537974000000,1537977600000,1537981200000,1537984800000,1537988400000,1537992000000,1537995600000,1537999200000,1538002800000,1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[100,60,20,40,140,530,710,850,990,1040,1220,1150,1500,1590,1530,1870,1630,1760,1830,1920,1730,1560,560,270,180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480]},{"name":"URL","color":"#2373DB","values":[90,20,10,0,80,280,620,640,900,680,1200,1120,1210,1320,1590,1510,1900,1980,1890,1760,1330,990,420,280,90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110]},{"name":"Groups","color":"#9ED448","values":[210,70,20,30,190,500,820,710,810,950,1310,1340,1180,1060,810,990,1410,1470,1400,2340,2580,1540,1580,570,80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400]},{"name":"Channel","color":"#4fae4e","values":[0,10,20,10,10,10,10,50,10,130,70,60,140,150,100,90,80,90,60,210,140,130,90,20,10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50]},{"name":"Search","color":"#F5BD25","values":[10,10,0,10,410,220,150,190,80,120,80,470,230,130,250,100,290,270,490,520,170,410,90,90,140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0]},{"name":"Other","color":"#F79E39","values":[20,0,10,30,40,110,160,240,140,190,160,190,230,290,130,280,250,240,320,190,270,220,120,40,40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,20,20,0,0,10,0,10,20,10,0,10,20,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-09/30.json b/public/chartDummyData/views_zoom/2018-09/30.json new file mode 100644 index 000000000..cf8d2f034 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-09/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538006400000,1538010000000,1538013600000,1538017200000,1538020800000,1538024400000,1538028000000,1538031600000,1538035200000,1538038800000,1538042400000,1538046000000,1538049600000,1538053200000,1538056800000,1538060400000,1538064000000,1538067600000,1538071200000,1538074800000,1538078400000,1538082000000,1538085600000,1538089200000,1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[180,90,60,30,260,490,680,1090,1570,1140,1490,1430,1950,1380,1900,1230,1630,1620,1560,1900,1400,1210,690,400,120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470]},{"name":"URL","color":"#2373DB","values":[90,40,40,30,120,400,550,620,1050,1160,1140,1230,1270,1280,1490,1610,1700,2140,1750,1850,1580,940,610,210,110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240]},{"name":"Groups","color":"#9ED448","values":[80,30,30,190,430,670,540,650,850,670,850,1190,1300,1270,1120,1280,1190,1410,1240,1810,1770,1520,910,320,460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410]},{"name":"Channel","color":"#4fae4e","values":[10,20,10,0,50,30,40,90,30,40,60,10,80,40,100,90,60,90,130,50,60,100,80,40,30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40]},{"name":"Search","color":"#F5BD25","values":[140,220,0,0,210,340,600,120,180,90,600,390,1030,480,180,190,290,340,280,430,380,290,120,30,10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10]},{"name":"Other","color":"#F79E39","values":[40,10,0,0,20,130,140,200,160,200,230,220,280,180,210,290,220,170,350,300,330,170,180,50,30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,10,10,10,10,0,0,0,0,10,0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/01.json b/public/chartDummyData/views_zoom/2018-10/01.json new file mode 100644 index 000000000..3902f6a9a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538092800000,1538096400000,1538100000000,1538103600000,1538107200000,1538110800000,1538114400000,1538118000000,1538121600000,1538125200000,1538128800000,1538132400000,1538136000000,1538139600000,1538143200000,1538146800000,1538150400000,1538154000000,1538157600000,1538161200000,1538164800000,1538168400000,1538172000000,1538175600000,1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,180,40,10,110,420,970,860,1180,910,1370,1330,1560,1190,1570,1900,1410,1400,1940,2080,1840,1270,870,560,310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670]},{"name":"URL","color":"#2373DB","values":[110,10,10,50,60,240,500,630,830,1220,1190,1330,1180,1310,1140,1610,1900,1810,1750,1550,1220,860,510,330,250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130]},{"name":"Groups","color":"#9ED448","values":[460,50,20,50,240,710,680,1100,760,1140,1230,890,1330,1260,860,1110,1400,1390,960,1510,1550,1870,1120,420,350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,20,50,60,50,60,70,110,70,170,150,190,90,50,50,80,130,20,90,120,40,40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,390,150,130,550,360,200,530,150,140,210,330,210,330,290,220,370,100,210,250,30,110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100]},{"name":"Other","color":"#F79E39","values":[30,10,0,10,50,220,140,290,150,250,180,230,250,240,200,170,340,260,270,230,220,190,190,50,30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,20,0,0,0,0,10,10,10,30,10,10,0,0,0,0,0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/02.json b/public/chartDummyData/views_zoom/2018-10/02.json new file mode 100644 index 000000000..5807bca54 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538179200000,1538182800000,1538186400000,1538190000000,1538193600000,1538197200000,1538200800000,1538204400000,1538208000000,1538211600000,1538215200000,1538218800000,1538222400000,1538226000000,1538229600000,1538233200000,1538236800000,1538240400000,1538244000000,1538247600000,1538251200000,1538254800000,1538258400000,1538262000000,1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[310,160,60,50,130,450,580,840,1250,1520,1560,1590,1480,1690,1750,1510,1710,1450,1700,1230,1430,1070,970,440,300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540]},{"name":"URL","color":"#2373DB","values":[250,50,30,30,30,70,430,480,850,1050,980,1240,1020,1350,1030,1180,1280,1390,1380,1120,940,570,510,340,170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280]},{"name":"Groups","color":"#9ED448","values":[350,150,40,60,100,270,510,840,1040,1210,1050,1270,1900,1370,840,980,850,1020,900,1290,1400,1400,1150,870,410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510]},{"name":"Channel","color":"#4fae4e","values":[40,40,0,0,20,0,20,90,50,50,50,130,140,90,110,150,90,70,70,170,40,70,40,0,30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50]},{"name":"Search","color":"#F5BD25","values":[110,10,0,0,130,250,740,170,130,170,130,220,280,250,160,160,90,240,90,140,320,220,30,20,100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50]},{"name":"Other","color":"#F79E39","values":[30,20,30,40,10,170,50,170,150,260,260,240,240,270,220,200,160,200,270,270,220,200,90,80,80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,20,10,10,10,0,0,10,0,20,0,0,20,30,10,30,0,0,0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/03.json b/public/chartDummyData/views_zoom/2018-10/03.json new file mode 100644 index 000000000..d67ba03f7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538265600000,1538269200000,1538272800000,1538276400000,1538280000000,1538283600000,1538287200000,1538290800000,1538294400000,1538298000000,1538301600000,1538305200000,1538308800000,1538312400000,1538316000000,1538319600000,1538323200000,1538326800000,1538330400000,1538334000000,1538337600000,1538341200000,1538344800000,1538348400000,1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[300,200,10,70,70,290,570,1130,1160,1650,1590,1680,1510,1710,1390,1740,1900,1720,2010,2100,2170,1650,940,1370,670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470]},{"name":"URL","color":"#2373DB","values":[170,90,20,10,20,150,220,250,790,970,880,1110,1000,980,1020,980,1090,1470,1140,1380,960,780,610,160,70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390]},{"name":"Groups","color":"#9ED448","values":[410,310,10,0,60,120,390,510,1030,1010,1150,1020,1250,1450,1140,1080,1120,1040,1470,1540,1930,1720,1110,320,150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000]},{"name":"Channel","color":"#4fae4e","values":[30,20,0,10,10,20,40,20,70,90,110,100,180,60,100,110,140,100,60,130,190,220,120,40,20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50]},{"name":"Search","color":"#F5BD25","values":[100,0,0,0,10,200,200,890,190,190,230,190,160,140,150,190,380,250,170,170,410,140,80,50,10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20]},{"name":"Other","color":"#F79E39","values":[80,60,0,20,30,70,50,190,190,240,280,220,170,230,170,210,70,250,300,220,290,170,160,80,10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,0,0,10,10,10,10,50,0,10,20,10,10,0,0,0,10,10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/04.json b/public/chartDummyData/views_zoom/2018-10/04.json new file mode 100644 index 000000000..829f68cdc --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538352000000,1538355600000,1538359200000,1538362800000,1538366400000,1538370000000,1538373600000,1538377200000,1538380800000,1538384400000,1538388000000,1538391600000,1538395200000,1538398800000,1538402400000,1538406000000,1538409600000,1538413200000,1538416800000,1538420400000,1538424000000,1538427600000,1538431200000,1538434800000,1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[670,110,60,90,210,530,850,1000,1100,1280,1030,1580,1960,1880,1450,1590,1840,1730,1520,1950,1910,1300,660,270,200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360]},{"name":"URL","color":"#2373DB","values":[70,10,30,10,40,410,580,670,770,870,1110,1380,890,1020,1490,1530,1960,2180,1680,1410,1480,1080,480,140,10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320]},{"name":"Groups","color":"#9ED448","values":[150,100,50,50,240,500,890,710,710,710,1140,1180,1020,1360,1230,1290,1150,1330,1690,2040,2090,1690,960,430,210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560]},{"name":"Channel","color":"#4fae4e","values":[20,10,90,0,10,40,30,30,60,40,40,130,110,140,130,110,180,70,230,180,160,150,90,30,10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,320,260,240,200,120,390,360,600,220,90,140,120,170,240,180,300,170,210,100,50,10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210]},{"name":"Other","color":"#F79E39","values":[10,30,40,0,20,160,150,80,140,160,190,270,210,240,210,180,210,340,300,300,330,170,110,80,40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,20,0,20,10,10,0,0,10,0,30,20,20,30,10,10,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/05.json b/public/chartDummyData/views_zoom/2018-10/05.json new file mode 100644 index 000000000..504965706 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538438400000,1538442000000,1538445600000,1538449200000,1538452800000,1538456400000,1538460000000,1538463600000,1538467200000,1538470800000,1538474400000,1538478000000,1538481600000,1538485200000,1538488800000,1538492400000,1538496000000,1538499600000,1538503200000,1538506800000,1538510400000,1538514000000,1538517600000,1538521200000,1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,20,30,40,180,590,650,1370,1040,1040,890,1460,1430,1730,1330,1470,1710,1840,1950,1810,1860,1550,600,480,140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790]},{"name":"URL","color":"#2373DB","values":[10,50,10,0,30,350,380,630,640,890,1130,1160,1290,1260,1170,1500,2080,1890,1570,1700,1440,880,500,110,70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130]},{"name":"Groups","color":"#9ED448","values":[210,70,20,50,170,500,690,640,780,750,1110,1150,1170,1310,850,1080,1010,1190,1520,2210,2200,1960,1130,400,260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240]},{"name":"Channel","color":"#4fae4e","values":[10,30,0,10,0,20,40,50,70,70,80,90,70,110,50,180,180,110,120,80,100,70,30,50,50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30]},{"name":"Search","color":"#F5BD25","values":[10,0,10,0,90,180,700,600,210,460,130,50,160,340,230,160,100,400,140,260,110,30,40,0,30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60]},{"name":"Other","color":"#F79E39","values":[40,10,0,20,80,180,120,190,140,130,150,220,190,110,120,190,320,240,330,330,370,210,120,70,10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,0,10,0,10,0,10,10,10,10,0,0,0,10,10,0,0,0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/06.json b/public/chartDummyData/views_zoom/2018-10/06.json new file mode 100644 index 000000000..6ac8e98ff --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538524800000,1538528400000,1538532000000,1538535600000,1538539200000,1538542800000,1538546400000,1538550000000,1538553600000,1538557200000,1538560800000,1538564400000,1538568000000,1538571600000,1538575200000,1538578800000,1538582400000,1538586000000,1538589600000,1538593200000,1538596800000,1538600400000,1538604000000,1538607600000,1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[140,100,60,60,190,370,760,740,1020,1570,1800,1390,1300,1480,1590,1850,1820,1550,1840,2030,2160,1470,800,470,150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340]},{"name":"URL","color":"#2373DB","values":[70,10,10,10,60,280,560,760,920,830,1100,1290,1440,1240,1440,1320,1940,1900,1760,1450,1290,900,480,240,90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170]},{"name":"Groups","color":"#9ED448","values":[260,40,40,50,180,450,710,870,890,810,1080,1200,920,1360,1240,940,1260,1470,2010,2290,2240,1870,1090,410,250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550]},{"name":"Channel","color":"#4fae4e","values":[50,10,0,0,40,30,10,10,40,90,60,130,80,70,100,40,180,100,110,120,80,70,50,40,10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,310,240,70,160,270,110,860,110,130,480,190,270,160,260,440,360,370,70,50,10,0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30]},{"name":"Other","color":"#F79E39","values":[10,10,10,0,10,170,110,170,170,190,250,220,220,210,190,170,300,210,230,260,240,220,120,80,40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,30,0,0,0,0,10,0,0,20,0,10,10,0,0,0,0,10,0,0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/07.json b/public/chartDummyData/views_zoom/2018-10/07.json new file mode 100644 index 000000000..309d70408 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538611200000,1538614800000,1538618400000,1538622000000,1538625600000,1538629200000,1538632800000,1538636400000,1538640000000,1538643600000,1538647200000,1538650800000,1538654400000,1538658000000,1538661600000,1538665200000,1538668800000,1538672400000,1538676000000,1538679600000,1538683200000,1538686800000,1538690400000,1538694000000,1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,90,40,80,50,780,650,930,810,1210,1380,1230,1590,1770,1500,1550,1790,1810,2050,1800,1480,1150,960,670,120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330]},{"name":"URL","color":"#2373DB","values":[90,100,0,20,70,350,640,510,720,910,1270,1240,1320,1290,1390,1780,2320,1750,1920,1410,1470,1300,480,130,80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360]},{"name":"Groups","color":"#9ED448","values":[250,80,10,40,150,460,1110,880,880,810,1100,1790,1380,990,1030,1440,1310,1290,1260,1960,2080,1790,1000,500,170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,10,50,80,70,60,60,70,50,100,140,110,110,140,170,130,130,190,110,170,30,10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70]},{"name":"Search","color":"#F5BD25","values":[0,10,10,40,80,70,480,80,150,130,290,300,190,460,270,110,100,420,310,440,150,270,390,100,40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20]},{"name":"Other","color":"#F79E39","values":[40,0,0,0,30,170,160,170,120,250,200,300,230,230,230,260,140,270,290,250,270,170,140,50,10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,0,0,40,10,0,0,0,10,20,10,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/08.json b/public/chartDummyData/views_zoom/2018-10/08.json new file mode 100644 index 000000000..11765b634 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538697600000,1538701200000,1538704800000,1538708400000,1538712000000,1538715600000,1538719200000,1538722800000,1538726400000,1538730000000,1538733600000,1538737200000,1538740800000,1538744400000,1538748000000,1538751600000,1538755200000,1538758800000,1538762400000,1538766000000,1538769600000,1538773200000,1538776800000,1538780400000,1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[120,80,30,20,150,620,850,1050,1110,1840,1490,1380,1730,2370,1540,1340,1850,1550,1630,1690,1910,1310,950,540,220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440]},{"name":"URL","color":"#2373DB","values":[80,80,10,10,60,340,460,580,950,1080,1210,1360,1140,1160,1470,1450,2090,1660,1540,1440,1420,1000,660,280,190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260]},{"name":"Groups","color":"#9ED448","values":[170,20,20,20,240,730,890,760,1200,1270,1340,1280,1460,1170,1120,1210,1270,1330,1490,1910,1850,1400,1100,510,270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,20,30,130,50,50,40,40,110,50,120,100,100,170,40,180,140,150,100,40,50,20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70]},{"name":"Search","color":"#F5BD25","values":[40,10,0,0,260,180,150,210,70,850,540,190,210,120,220,180,110,180,130,170,200,230,80,50,10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50]},{"name":"Other","color":"#F79E39","values":[10,40,10,20,30,190,200,220,140,220,190,270,250,230,170,230,190,190,230,250,240,90,110,90,50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,10,20,10,20,10,0,10,60,10,30,20,0,0,0,0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/09.json b/public/chartDummyData/views_zoom/2018-10/09.json new file mode 100644 index 000000000..d8a0eaa41 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538784000000,1538787600000,1538791200000,1538794800000,1538798400000,1538802000000,1538805600000,1538809200000,1538812800000,1538816400000,1538820000000,1538823600000,1538827200000,1538830800000,1538834400000,1538838000000,1538841600000,1538845200000,1538848800000,1538852400000,1538856000000,1538859600000,1538863200000,1538866800000,1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,80,110,60,150,440,510,820,1770,1330,1620,1380,1570,1510,1800,1940,1770,1350,1310,1340,1360,1110,1110,470,250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400]},{"name":"URL","color":"#2373DB","values":[190,120,30,0,20,140,310,550,860,1000,1050,1140,1010,1030,1230,1120,1510,1400,1350,1110,960,610,560,390,180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390]},{"name":"Groups","color":"#9ED448","values":[270,100,120,20,100,370,620,1120,1160,1390,1150,1280,1660,1190,1220,1050,1260,1200,1450,1360,1500,1620,960,1000,500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,10,50,60,120,30,100,60,150,150,130,50,130,160,80,80,150,100,70,50,70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,180,110,750,330,180,480,230,280,200,100,130,250,110,310,200,220,240,90,70,20,10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50]},{"name":"Other","color":"#F79E39","values":[50,70,70,10,10,50,100,300,180,220,230,250,250,250,170,160,180,230,190,300,190,290,120,40,10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,10,0,20,0,10,10,0,20,0,0,0,10,10,0,30,20,20,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/10.json b/public/chartDummyData/views_zoom/2018-10/10.json new file mode 100644 index 000000000..1c3209854 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538870400000,1538874000000,1538877600000,1538881200000,1538884800000,1538888400000,1538892000000,1538895600000,1538899200000,1538902800000,1538906400000,1538910000000,1538913600000,1538917200000,1538920800000,1538924400000,1538928000000,1538931600000,1538935200000,1538938800000,1538942400000,1538946000000,1538949600000,1538953200000,1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[250,170,90,70,40,180,560,650,1110,1740,1550,1640,1530,1420,1430,1380,1750,1260,1740,2010,2130,1720,820,360,190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710]},{"name":"URL","color":"#2373DB","values":[180,80,10,40,100,30,130,480,850,1170,1460,970,960,1060,1210,1470,1120,1280,1630,1260,1220,1270,560,320,90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290]},{"name":"Groups","color":"#9ED448","values":[500,180,20,70,460,150,290,820,1000,1240,1100,1130,1290,1020,1020,720,1070,1380,1290,1860,1940,1950,1300,560,120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640]},{"name":"Channel","color":"#4fae4e","values":[70,10,10,0,10,50,10,30,120,80,150,90,130,90,90,130,130,140,60,140,150,90,50,40,10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80]},{"name":"Search","color":"#F5BD25","values":[10,0,20,10,0,50,110,560,90,220,70,220,180,150,170,260,90,160,230,150,130,60,120,210,100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120]},{"name":"Other","color":"#F79E39","values":[10,40,20,20,30,40,100,180,200,290,160,190,280,180,200,300,250,230,320,330,260,150,130,50,30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,0,10,0,30,0,0,0,10,0,0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/11.json b/public/chartDummyData/views_zoom/2018-10/11.json new file mode 100644 index 000000000..fc6d36321 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1538956800000,1538960400000,1538964000000,1538967600000,1538971200000,1538974800000,1538978400000,1538982000000,1538985600000,1538989200000,1538992800000,1538996400000,1539000000000,1539003600000,1539007200000,1539010800000,1539014400000,1539018000000,1539021600000,1539025200000,1539028800000,1539032400000,1539036000000,1539039600000,1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,90,110,20,290,350,610,830,1470,1580,1380,1550,1570,1900,1770,1860,1720,2100,1930,2490,1700,1380,900,790,410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500]},{"name":"URL","color":"#2373DB","values":[90,80,40,0,60,260,510,540,770,760,1180,1070,1030,1080,1310,1600,2160,1920,1640,1780,1550,940,640,130,80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190]},{"name":"Groups","color":"#9ED448","values":[120,50,30,50,100,520,580,1160,960,890,980,1340,1320,1430,1080,1380,1350,1400,1790,1940,2570,2070,1170,240,160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360]},{"name":"Channel","color":"#4fae4e","values":[10,10,0,10,20,60,10,40,100,70,100,80,120,110,70,90,50,150,120,100,160,120,110,30,10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20]},{"name":"Search","color":"#F5BD25","values":[100,30,0,10,450,160,60,60,150,220,320,140,130,220,240,110,60,200,190,320,220,90,80,60,20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140]},{"name":"Other","color":"#F79E39","values":[30,20,20,10,30,90,150,200,210,270,180,200,310,210,240,80,280,330,280,170,320,360,90,100,0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,10,20,0,10,0,10,10,10,30,20,0,0,0,0,10,10,10,0,0,0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/12.json b/public/chartDummyData/views_zoom/2018-10/12.json new file mode 100644 index 000000000..75fe6a895 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539043200000,1539046800000,1539050400000,1539054000000,1539057600000,1539061200000,1539064800000,1539068400000,1539072000000,1539075600000,1539079200000,1539082800000,1539086400000,1539090000000,1539093600000,1539097200000,1539100800000,1539104400000,1539108000000,1539111600000,1539115200000,1539118800000,1539122400000,1539126000000,1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[410,200,170,50,160,610,790,820,830,1250,1240,1450,1640,1680,1870,1570,1540,1380,1640,1750,1850,1820,740,340,260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510]},{"name":"URL","color":"#2373DB","values":[80,80,10,0,50,220,410,600,850,950,840,1170,1440,1090,1430,1700,1980,1720,1560,1540,1450,1220,540,170,130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190]},{"name":"Groups","color":"#9ED448","values":[160,60,20,50,270,680,820,580,1260,970,1280,1300,1200,1170,1020,1250,1380,1400,1420,1900,1840,2240,1010,550,120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610]},{"name":"Channel","color":"#4fae4e","values":[10,0,0,0,50,20,20,40,30,40,70,60,80,160,70,50,200,130,80,170,150,80,70,40,30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30]},{"name":"Search","color":"#F5BD25","values":[20,20,0,10,110,250,440,220,120,460,80,150,560,90,210,130,300,110,220,650,500,160,70,30,0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30]},{"name":"Other","color":"#F79E39","values":[0,20,0,10,60,320,200,150,210,170,240,220,280,210,190,300,190,230,370,290,260,260,190,50,50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,0,10,0,0,0,0,10,0,10,10,0,20,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/13.json b/public/chartDummyData/views_zoom/2018-10/13.json new file mode 100644 index 000000000..f2e0c11a8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539129600000,1539133200000,1539136800000,1539140400000,1539144000000,1539147600000,1539151200000,1539154800000,1539158400000,1539162000000,1539165600000,1539169200000,1539172800000,1539176400000,1539180000000,1539183600000,1539187200000,1539190800000,1539194400000,1539198000000,1539201600000,1539205200000,1539208800000,1539212400000,1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,60,20,60,350,520,690,1130,1200,1050,1380,1510,1480,1320,1400,1310,1420,1680,1910,1960,1760,1560,1140,330,170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330]},{"name":"URL","color":"#2373DB","values":[130,70,0,20,120,260,590,690,890,780,1030,1230,1310,1070,1080,1610,2430,1980,2050,1600,1670,1000,650,360,90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300]},{"name":"Groups","color":"#9ED448","values":[120,50,30,70,200,590,750,1110,750,900,880,1690,1220,1360,1050,1020,1100,1490,1610,2500,2470,2090,1170,470,200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430]},{"name":"Channel","color":"#4fae4e","values":[30,0,20,0,0,0,20,40,70,40,20,70,240,80,90,100,70,130,180,90,260,130,90,70,0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50]},{"name":"Search","color":"#F5BD25","values":[0,0,0,10,520,270,90,210,70,90,720,90,100,150,130,180,190,310,130,470,210,160,40,20,20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20]},{"name":"Other","color":"#F79E39","values":[50,0,10,0,40,140,110,130,170,230,190,280,390,200,220,260,340,400,310,210,320,230,130,30,30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,20,0,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/14.json b/public/chartDummyData/views_zoom/2018-10/14.json new file mode 100644 index 000000000..bcdb5e323 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539216000000,1539219600000,1539223200000,1539226800000,1539230400000,1539234000000,1539237600000,1539241200000,1539244800000,1539248400000,1539252000000,1539255600000,1539259200000,1539262800000,1539266400000,1539270000000,1539273600000,1539277200000,1539280800000,1539284400000,1539288000000,1539291600000,1539295200000,1539298800000,1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[170,90,60,50,200,560,880,1290,1180,1610,1260,1440,1610,1970,1920,1430,1770,2270,1930,1930,1660,1460,690,440,160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460]},{"name":"URL","color":"#2373DB","values":[90,20,20,10,110,380,610,530,840,850,1030,1040,1120,1100,1260,1570,2240,1760,1880,1710,1530,1120,650,260,100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320]},{"name":"Groups","color":"#9ED448","values":[200,20,40,70,270,1670,1060,920,1010,1570,990,1030,1320,1440,1440,1150,1280,1430,1870,1910,2370,2020,1130,490,310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,30,0,30,60,160,40,40,100,70,160,120,110,120,110,150,200,80,170,160,70,30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20]},{"name":"Search","color":"#F5BD25","values":[20,0,10,0,10,50,660,150,220,50,100,280,250,730,400,120,210,120,120,210,310,260,190,50,20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50]},{"name":"Other","color":"#F79E39","values":[30,0,0,0,40,200,200,200,150,230,220,260,320,160,290,280,160,320,280,350,360,180,160,70,10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,0,0,10,0,10,10,0,0,30,0,20,10,0,0,10,10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/15.json b/public/chartDummyData/views_zoom/2018-10/15.json new file mode 100644 index 000000000..e7bb03b2c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539302400000,1539306000000,1539309600000,1539313200000,1539316800000,1539320400000,1539324000000,1539327600000,1539331200000,1539334800000,1539338400000,1539342000000,1539345600000,1539349200000,1539352800000,1539356400000,1539360000000,1539363600000,1539367200000,1539370800000,1539374400000,1539378000000,1539381600000,1539385200000,1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[160,270,360,50,400,590,790,1020,950,1350,1480,1830,1830,1860,1410,1350,1780,1670,1250,1710,1490,1280,1040,400,240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430]},{"name":"URL","color":"#2373DB","values":[100,60,10,20,80,420,550,580,740,1030,1400,1240,1260,1120,960,1450,2030,1950,1790,1540,1200,840,740,390,180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230]},{"name":"Groups","color":"#9ED448","values":[310,20,0,30,270,670,640,610,920,980,1020,1240,1220,1200,1270,1260,1240,1280,1160,1780,1700,1640,1120,640,260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330]},{"name":"Channel","color":"#4fae4e","values":[30,20,10,0,0,20,60,50,50,70,70,110,90,70,80,210,90,140,120,140,130,110,130,110,50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110]},{"name":"Search","color":"#F5BD25","values":[20,10,10,20,490,500,270,190,340,150,490,190,240,570,370,240,430,180,440,200,370,100,120,50,10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20]},{"name":"Other","color":"#F79E39","values":[10,20,0,0,30,90,220,130,100,160,290,240,200,300,670,190,230,270,260,270,280,290,90,80,50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,20,0,0,0,0,0,10,50,10,20,30,0,10,0,20,10,0,0,0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/16.json b/public/chartDummyData/views_zoom/2018-10/16.json new file mode 100644 index 000000000..38f3c0cad --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539388800000,1539392400000,1539396000000,1539399600000,1539403200000,1539406800000,1539410400000,1539414000000,1539417600000,1539421200000,1539424800000,1539428400000,1539432000000,1539435600000,1539439200000,1539442800000,1539446400000,1539450000000,1539453600000,1539457200000,1539460800000,1539464400000,1539468000000,1539471600000,1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,130,100,60,140,370,460,790,1100,1540,1360,1640,1800,1560,1390,1570,1590,1620,0,0,0,0,760,710,360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660]},{"name":"URL","color":"#2373DB","values":[180,140,30,30,10,130,320,560,830,1200,1120,1360,1380,1050,900,1340,1520,1480,0,0,0,0,360,290,240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220]},{"name":"Groups","color":"#9ED448","values":[260,130,20,70,60,200,600,670,650,890,1060,1230,1420,1210,1040,1040,930,1380,0,0,0,0,1030,640,460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670]},{"name":"Channel","color":"#4fae4e","values":[50,50,10,0,10,10,60,70,50,110,190,130,200,80,220,160,140,130,0,0,0,0,40,80,30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,10,320,190,210,130,160,170,150,390,210,220,390,180,100,0,0,0,0,110,120,0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60]},{"name":"Other","color":"#F79E39","values":[50,10,30,0,20,50,160,180,210,180,130,250,230,240,140,180,100,170,0,0,0,0,210,80,50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,30,0,10,0,20,10,20,20,0,10,0,0,0,0,20,0,0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/17.json b/public/chartDummyData/views_zoom/2018-10/17.json new file mode 100644 index 000000000..337837649 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539475200000,1539478800000,1539482400000,1539486000000,1539489600000,1539493200000,1539496800000,1539500400000,1539504000000,1539507600000,1539511200000,1539514800000,1539518400000,1539522000000,1539525600000,1539529200000,1539532800000,1539536400000,1539540000000,1539543600000,1539547200000,1539550800000,1539554400000,1539558000000,1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[360,180,110,20,30,120,710,1250,1550,1640,2020,1720,1640,1820,2130,1740,1970,1680,2020,2340,2090,1510,1240,500,240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670]},{"name":"URL","color":"#2373DB","values":[240,40,80,10,20,40,170,410,660,1180,1130,1160,1110,900,1030,1180,1110,1250,1300,1620,1160,880,600,190,50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400]},{"name":"Groups","color":"#9ED448","values":[460,90,90,20,90,140,430,750,800,860,1330,1570,1300,900,930,1210,1230,1200,2170,2180,1910,1860,1040,360,100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,0,0,20,20,90,70,70,220,160,90,150,130,90,160,90,130,190,90,170,90,20,110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30]},{"name":"Search","color":"#F5BD25","values":[0,80,0,0,0,50,150,600,220,160,140,600,410,430,480,230,220,440,260,360,180,210,200,140,30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50]},{"name":"Other","color":"#F79E39","values":[50,60,30,0,0,70,90,220,430,190,190,280,360,160,160,260,110,280,300,310,310,330,260,50,10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,20,0,20,10,0,20,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/18.json b/public/chartDummyData/views_zoom/2018-10/18.json new file mode 100644 index 000000000..7ca4c7840 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539561600000,1539565200000,1539568800000,1539572400000,1539576000000,1539579600000,1539583200000,1539586800000,1539590400000,1539594000000,1539597600000,1539601200000,1539604800000,1539608400000,1539612000000,1539615600000,1539619200000,1539622800000,1539626400000,1539630000000,1539633600000,1539637200000,1539640800000,1539644400000,1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,200,60,80,220,610,850,1020,970,1230,1200,1370,1750,1780,1630,1530,1890,1650,2170,1960,2070,1690,960,510,90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550]},{"name":"URL","color":"#2373DB","values":[50,30,50,10,20,280,400,730,970,990,1130,1470,1110,1360,1420,1950,2070,1720,1580,1680,1600,1330,590,190,90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390]},{"name":"Groups","color":"#9ED448","values":[100,30,430,20,180,530,950,860,840,660,1150,1520,1340,1820,1280,1430,1520,1470,1810,2060,2360,2160,1180,610,230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780]},{"name":"Channel","color":"#4fae4e","values":[110,10,10,0,10,30,40,20,10,50,90,90,150,150,130,150,100,100,110,160,100,70,100,30,10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70]},{"name":"Search","color":"#F5BD25","values":[30,0,10,10,330,350,310,210,130,130,250,120,190,200,270,420,460,390,200,220,110,100,40,30,10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0]},{"name":"Other","color":"#F79E39","values":[10,0,20,20,50,170,230,210,160,160,160,210,240,230,200,200,330,340,370,230,240,290,140,90,20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,10,10,20,20,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/19.json b/public/chartDummyData/views_zoom/2018-10/19.json new file mode 100644 index 000000000..61a0e1010 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539648000000,1539651600000,1539655200000,1539658800000,1539662400000,1539666000000,1539669600000,1539673200000,1539676800000,1539680400000,1539684000000,1539687600000,1539691200000,1539694800000,1539698400000,1539702000000,1539705600000,1539709200000,1539712800000,1539716400000,1539720000000,1539723600000,1539727200000,1539730800000,1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[90,50,50,90,220,550,1010,1260,1240,1460,1420,1460,1640,1860,1460,1670,1450,2130,1980,2170,1760,1550,890,330,260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360]},{"name":"URL","color":"#2373DB","values":[90,20,30,20,60,270,540,510,740,1070,1140,1300,1570,1360,1190,1470,1870,2010,1760,1820,1850,1390,610,300,130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210]},{"name":"Groups","color":"#9ED448","values":[230,40,90,40,130,620,920,1120,1100,1030,1030,1290,1200,1360,960,1210,1570,1620,1660,1970,2440,1650,1130,430,100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570]},{"name":"Channel","color":"#4fae4e","values":[10,10,20,0,0,0,20,50,30,40,60,80,90,90,120,80,110,150,80,180,100,130,30,50,0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,20,390,440,200,150,80,330,210,200,200,250,220,250,340,200,220,190,150,110,20,0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10]},{"name":"Other","color":"#F79E39","values":[20,30,0,10,30,130,150,180,220,180,200,280,300,320,300,210,320,290,250,300,200,300,150,100,30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,20,0,0,10,20,10,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/20.json b/public/chartDummyData/views_zoom/2018-10/20.json new file mode 100644 index 000000000..a7c13e2c0 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539734400000,1539738000000,1539741600000,1539745200000,1539748800000,1539752400000,1539756000000,1539759600000,1539763200000,1539766800000,1539770400000,1539774000000,1539777600000,1539781200000,1539784800000,1539788400000,1539792000000,1539795600000,1539799200000,1539802800000,1539806400000,1539810000000,1539813600000,1539817200000,1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,110,30,60,90,880,850,930,1580,1400,1360,1390,1770,1520,1890,1740,1680,1670,1590,2280,2010,1670,1160,460,300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440]},{"name":"URL","color":"#2373DB","values":[130,50,20,0,60,450,540,600,720,940,1010,1380,1260,1150,1260,1840,1950,2300,1650,1710,1810,1060,580,320,140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500]},{"name":"Groups","color":"#9ED448","values":[100,90,70,50,170,590,770,920,1120,1000,1240,1220,1520,1480,1100,1190,1380,1490,1520,2300,2220,1730,1220,420,260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,10,0,60,40,90,60,80,120,100,180,180,150,90,180,170,50,150,190,130,90,20,60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120]},{"name":"Search","color":"#F5BD25","values":[0,20,0,10,50,460,210,260,120,110,160,200,350,280,120,270,180,550,370,210,250,100,60,50,10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10]},{"name":"Other","color":"#F79E39","values":[30,0,10,30,10,140,150,200,240,280,140,240,380,150,220,210,290,310,330,440,230,270,210,80,50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,10,10,10,10,0,10,0,0,20,40,0,20,10,0,0,0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/21.json b/public/chartDummyData/views_zoom/2018-10/21.json new file mode 100644 index 000000000..8c115ac31 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539820800000,1539824400000,1539828000000,1539831600000,1539835200000,1539838800000,1539842400000,1539846000000,1539849600000,1539853200000,1539856800000,1539860400000,1539864000000,1539867600000,1539871200000,1539874800000,1539878400000,1539882000000,1539885600000,1539889200000,1539892800000,1539896400000,1539900000000,1539903600000,1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[300,110,50,100,200,700,880,1130,1030,1390,1560,1580,1840,1510,1700,1950,2280,1850,1810,2030,2110,1780,910,430,60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530]},{"name":"URL","color":"#2373DB","values":[140,50,20,20,130,400,600,780,990,1040,1280,1220,1370,1320,1570,1620,2130,2210,1900,1710,1540,1010,600,230,130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490]},{"name":"Groups","color":"#9ED448","values":[260,70,70,40,370,510,870,860,1380,1210,1040,1450,1550,1500,1560,1500,1750,1400,2000,2230,2220,2140,1180,330,130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610]},{"name":"Channel","color":"#4fae4e","values":[60,10,30,0,0,10,50,70,30,160,50,100,90,190,170,60,180,190,150,250,140,100,240,110,10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,120,250,610,150,150,100,150,120,100,270,140,370,280,240,230,280,340,260,180,20,30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30]},{"name":"Other","color":"#F79E39","values":[50,20,0,0,80,100,210,200,200,190,260,250,380,250,160,210,320,310,230,280,360,260,130,130,60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,30,0,0,0,0,10,20,0,20,40,20,10,0,0,0,0,10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/22.json b/public/chartDummyData/views_zoom/2018-10/22.json new file mode 100644 index 000000000..b3022cdbd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539907200000,1539910800000,1539914400000,1539918000000,1539921600000,1539925200000,1539928800000,1539932400000,1539936000000,1539939600000,1539943200000,1539946800000,1539950400000,1539954000000,1539957600000,1539961200000,1539964800000,1539968400000,1539972000000,1539975600000,1539979200000,1539982800000,1539986400000,1539990000000,1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[60,60,40,90,290,410,1010,1140,1290,1560,1410,1490,1940,1440,1690,1670,1960,2330,1710,1860,1820,1210,1020,660,260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420]},{"name":"URL","color":"#2373DB","values":[130,50,50,30,130,330,660,860,850,1050,1200,1540,1140,1380,1360,1610,2180,2370,1600,1520,1470,850,490,220,210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360]},{"name":"Groups","color":"#9ED448","values":[130,50,70,30,290,760,960,990,990,990,1330,1240,1060,1440,1200,1170,1620,1530,1400,1890,2380,1480,1240,670,280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670]},{"name":"Channel","color":"#4fae4e","values":[10,10,10,0,0,20,50,50,80,80,50,30,90,170,130,200,110,200,130,90,250,120,100,150,80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,30,250,570,430,150,130,230,160,220,180,170,80,430,310,130,130,250,110,200,60,0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140]},{"name":"Other","color":"#F79E39","values":[60,10,20,30,70,150,270,260,240,200,140,190,360,220,210,200,220,240,200,340,270,240,160,170,80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,10,10,10,10,0,0,10,0,0,20,10,10,20,20,10,20,0,10,20,10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/23.json b/public/chartDummyData/views_zoom/2018-10/23.json new file mode 100644 index 000000000..1e42aed6d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1539993600000,1539997200000,1540000800000,1540004400000,1540008000000,1540011600000,1540015200000,1540018800000,1540022400000,1540026000000,1540029600000,1540033200000,1540036800000,1540040400000,1540044000000,1540047600000,1540051200000,1540054800000,1540058400000,1540062000000,1540065600000,1540069200000,1540072800000,1540076400000,1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[260,130,50,50,150,340,620,1150,1350,1660,1730,1580,2310,1920,1470,1460,2010,1840,2660,1530,1350,1310,890,670,380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580]},{"name":"URL","color":"#2373DB","values":[210,220,70,10,70,190,480,770,1050,1290,1320,1330,1370,1400,1110,1390,1690,1790,1380,1360,980,640,790,400,130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330]},{"name":"Groups","color":"#9ED448","values":[280,110,10,50,100,340,520,1310,1070,800,1320,1460,1440,1160,1160,1010,1090,1190,1530,1760,1480,1620,1400,1120,450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750]},{"name":"Channel","color":"#4fae4e","values":[80,30,0,0,30,90,70,40,120,120,60,70,300,200,230,150,90,70,180,140,100,110,120,30,90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,0,300,900,160,50,270,140,160,630,300,60,190,40,140,80,250,210,120,190,50,0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50]},{"name":"Other","color":"#F79E39","values":[80,10,10,0,20,120,220,240,180,140,230,230,260,200,270,170,240,280,250,200,280,180,170,140,60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,20,0,30,30,10,20,10,10,0,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/24.json b/public/chartDummyData/views_zoom/2018-10/24.json new file mode 100644 index 000000000..50406b2fd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540080000000,1540083600000,1540087200000,1540090800000,1540094400000,1540098000000,1540101600000,1540105200000,1540108800000,1540112400000,1540116000000,1540119600000,1540123200000,1540126800000,1540130400000,1540134000000,1540137600000,1540141200000,1540144800000,1540148400000,1540152000000,1540155600000,1540159200000,1540162800000,1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[380,280,120,160,50,190,570,750,1480,1440,1990,2280,2030,1930,1910,1910,1740,2150,2120,2010,2230,1850,1170,550,240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160]},{"name":"URL","color":"#2373DB","values":[130,60,40,70,50,100,180,450,1020,1150,1420,1200,1010,1290,1170,1110,1900,1520,1710,1660,1300,1230,630,390,200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230]},{"name":"Groups","color":"#9ED448","values":[450,120,80,70,30,430,490,850,970,1170,1430,1300,1570,1520,1660,1530,1710,1430,1850,2320,2660,2430,1500,780,250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120]},{"name":"Channel","color":"#4fae4e","values":[90,10,10,30,0,10,30,50,80,110,90,130,100,180,220,190,120,110,80,110,150,90,120,70,0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180]},{"name":"Search","color":"#F5BD25","values":[0,20,30,20,20,460,100,200,60,410,430,150,110,110,260,280,220,250,260,230,300,190,150,0,20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60]},{"name":"Other","color":"#F79E39","values":[60,40,20,20,0,20,90,210,250,270,230,250,270,240,300,170,200,290,310,280,350,470,130,140,80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,20,0,10,30,30,10,10,30,0,0,20,0,0,10,0,0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/25.json b/public/chartDummyData/views_zoom/2018-10/25.json new file mode 100644 index 000000000..a0ff3a2df --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540166400000,1540170000000,1540173600000,1540177200000,1540180800000,1540184400000,1540188000000,1540191600000,1540195200000,1540198800000,1540202400000,1540206000000,1540209600000,1540213200000,1540216800000,1540220400000,1540224000000,1540227600000,1540231200000,1540234800000,1540238400000,1540242000000,1540245600000,1540249200000,1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[240,70,30,60,140,550,940,1180,1210,1670,1910,1800,1770,1880,1980,1920,1850,2580,2380,2320,2050,1580,1240,360,200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130]},{"name":"URL","color":"#2373DB","values":[200,40,20,0,80,410,520,490,710,1010,1450,1400,1580,1420,1720,1720,2120,2120,1580,1680,1520,1050,700,210,250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570]},{"name":"Groups","color":"#9ED448","values":[250,10,40,20,300,790,880,1080,1160,1370,1240,1840,1530,1760,1570,1410,1420,1460,2060,2270,2750,2420,1340,570,200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950]},{"name":"Channel","color":"#4fae4e","values":[0,0,10,0,0,30,30,50,130,90,90,110,100,110,230,180,130,100,120,110,230,120,60,50,20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180]},{"name":"Search","color":"#F5BD25","values":[20,20,0,0,80,310,80,190,190,610,260,210,180,140,240,340,350,200,140,570,310,150,50,10,10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120]},{"name":"Other","color":"#F79E39","values":[80,10,20,10,30,170,250,140,300,270,210,240,240,340,270,340,270,310,170,240,370,230,160,60,30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,0,0,10,10,10,0,10,10,0,0,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/26.json b/public/chartDummyData/views_zoom/2018-10/26.json new file mode 100644 index 000000000..4cac3a457 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540252800000,1540256400000,1540260000000,1540263600000,1540267200000,1540270800000,1540274400000,1540278000000,1540281600000,1540285200000,1540288800000,1540292400000,1540296000000,1540299600000,1540303200000,1540306800000,1540310400000,1540314000000,1540317600000,1540321200000,1540324800000,1540328400000,1540332000000,1540335600000,1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[200,40,40,10,130,670,810,1190,1280,1170,1690,1590,1890,1850,2100,2460,1920,2000,2470,2840,2690,1640,1030,440,270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030]},{"name":"URL","color":"#2373DB","values":[250,160,20,0,70,440,750,790,970,1000,1290,1270,1490,1600,1460,2110,2380,2170,2260,1680,2090,1400,690,500,190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510]},{"name":"Groups","color":"#9ED448","values":[200,70,130,70,150,600,930,920,1330,1400,1200,1400,1450,1470,1470,1390,1990,1820,1800,2130,2920,2650,1300,510,260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510]},{"name":"Channel","color":"#4fae4e","values":[20,0,0,0,0,40,90,50,90,90,70,230,130,110,70,140,190,110,40,220,190,150,40,120,30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60]},{"name":"Search","color":"#F5BD25","values":[10,0,0,10,10,400,560,140,110,360,200,120,190,230,210,400,290,480,210,240,170,220,60,10,10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100]},{"name":"Other","color":"#F79E39","values":[30,10,10,20,30,170,70,160,170,210,180,320,230,280,270,330,300,420,380,480,260,450,190,70,20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,10,0,40,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/27.json b/public/chartDummyData/views_zoom/2018-10/27.json new file mode 100644 index 000000000..5e696ee51 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540339200000,1540342800000,1540346400000,1540350000000,1540353600000,1540357200000,1540360800000,1540364400000,1540368000000,1540371600000,1540375200000,1540378800000,1540382400000,1540386000000,1540389600000,1540393200000,1540396800000,1540400400000,1540404000000,1540407600000,1540411200000,1540414800000,1540418400000,1540422000000,1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[270,70,20,20,270,700,1000,1120,1130,1390,1440,1610,1630,1940,1400,1630,1960,1890,2350,2290,2000,1980,1200,530,150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930]},{"name":"URL","color":"#2373DB","values":[190,80,10,20,80,260,690,750,940,1060,1320,1440,1520,1450,1560,1840,2570,2110,2130,1710,1340,1220,620,490,80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640]},{"name":"Groups","color":"#9ED448","values":[260,90,40,80,270,710,950,1230,1180,1610,1250,1330,1420,1380,1190,1570,1770,1710,1870,2330,2440,2360,1260,610,380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,10,0,10,110,30,60,70,70,90,110,140,150,180,150,160,120,160,170,140,100,30,0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80]},{"name":"Search","color":"#F5BD25","values":[10,0,0,0,230,170,220,120,90,130,460,160,90,250,210,460,360,240,200,130,150,130,40,30,10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120]},{"name":"Other","color":"#F79E39","values":[20,20,0,10,50,110,190,220,170,330,180,330,300,290,250,390,270,400,340,400,270,200,90,140,50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,20,10,10,0,0,30,10,10,20,0,0,0,10,0,0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/28.json b/public/chartDummyData/views_zoom/2018-10/28.json new file mode 100644 index 000000000..1d9be8ed4 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540425600000,1540429200000,1540432800000,1540436400000,1540440000000,1540443600000,1540447200000,1540450800000,1540454400000,1540458000000,1540461600000,1540465200000,1540468800000,1540472400000,1540476000000,1540479600000,1540483200000,1540486800000,1540490400000,1540494000000,1540497600000,1540501200000,1540504800000,1540508400000,1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[150,120,20,30,220,600,1120,1450,1340,1340,1810,1600,1650,1620,1700,2030,1930,1790,1980,2080,2240,1650,970,420,220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320]},{"name":"URL","color":"#2373DB","values":[80,0,30,10,90,310,640,870,970,1070,1570,1570,1820,1700,1780,2000,2360,2480,2040,1990,1720,1110,730,360,240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750]},{"name":"Groups","color":"#9ED448","values":[380,40,10,60,210,570,1230,1190,1370,1350,1260,1500,1500,1500,1310,1340,1730,1740,1930,2370,2900,2880,1490,670,250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630]},{"name":"Channel","color":"#4fae4e","values":[0,0,0,0,0,30,20,140,20,120,70,120,120,150,140,100,50,140,150,130,140,120,80,70,30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140]},{"name":"Search","color":"#F5BD25","values":[10,0,0,20,80,790,480,250,190,170,180,220,250,100,280,140,260,250,300,200,270,260,290,140,50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50]},{"name":"Other","color":"#F79E39","values":[50,10,0,0,50,210,210,270,210,220,190,340,260,300,230,320,350,340,340,380,350,200,200,140,50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,20,10,10,10,10,0,0,30,20,30,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/29.json b/public/chartDummyData/views_zoom/2018-10/29.json new file mode 100644 index 000000000..0b3b4f96e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540512000000,1540515600000,1540519200000,1540522800000,1540526400000,1540530000000,1540533600000,1540537200000,1540540800000,1540544400000,1540548000000,1540551600000,1540555200000,1540558800000,1540562400000,1540566000000,1540569600000,1540573200000,1540576800000,1540580400000,1540584000000,1540587600000,1540591200000,1540594800000,1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,140,50,120,180,520,840,1130,1380,1330,1830,1760,1950,1880,1680,1750,2310,2000,2030,2050,1770,1640,1100,580,220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690]},{"name":"URL","color":"#2373DB","values":[240,90,40,40,60,380,570,770,1080,1210,1410,1410,1610,1560,1490,2020,2410,2090,2460,1750,1310,990,490,330,230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760]},{"name":"Groups","color":"#9ED448","values":[250,40,30,20,380,730,860,1040,1050,1360,1290,1600,1710,1790,1300,1550,1590,1590,1750,1530,2060,1990,1450,750,330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790]},{"name":"Channel","color":"#4fae4e","values":[30,0,10,30,0,40,180,60,330,70,100,50,130,160,120,110,210,90,110,180,140,80,130,80,60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190]},{"name":"Search","color":"#F5BD25","values":[50,90,0,20,130,130,360,240,310,140,190,240,390,140,170,210,140,340,290,320,70,210,200,50,10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370]},{"name":"Other","color":"#F79E39","values":[50,0,30,10,20,110,280,320,250,270,250,250,280,380,200,220,380,270,370,270,260,200,200,120,60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,30,10,0,0,10,40,20,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/30.json b/public/chartDummyData/views_zoom/2018-10/30.json new file mode 100644 index 000000000..d75d40955 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540598400000,1540602000000,1540605600000,1540609200000,1540612800000,1540616400000,1540620000000,1540623600000,1540627200000,1540630800000,1540634400000,1540638000000,1540641600000,1540645200000,1540648800000,1540652400000,1540656000000,1540659600000,1540663200000,1540666800000,1540670400000,1540674000000,1540677600000,1540681200000,1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[220,140,140,90,90,390,940,1120,1240,1620,1710,1850,2060,2060,1670,1810,1760,1840,2320,1890,1940,1370,1320,1160,390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200]},{"name":"URL","color":"#2373DB","values":[230,80,30,70,70,230,410,750,1130,1670,1960,1510,1680,1250,1510,1490,1600,1920,1550,1280,1200,980,740,230,130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780]},{"name":"Groups","color":"#9ED448","values":[330,140,50,60,210,360,580,970,1220,1080,1570,1360,1510,1540,1280,1270,1480,1640,1620,1820,1890,1990,1780,1120,600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880]},{"name":"Channel","color":"#4fae4e","values":[60,10,0,0,0,30,40,60,140,80,100,90,170,120,150,130,110,70,90,100,90,60,60,180,130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,20,310,900,160,360,200,150,100,440,100,210,270,280,280,380,320,160,230,80,60,500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210]},{"name":"Other","color":"#F79E39","values":[60,20,20,0,0,90,110,140,400,140,270,230,290,190,230,220,200,150,160,270,300,250,140,330,50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,0,0,0,10,10,0,30,0,10,30,0,0,40,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-10/31.json b/public/chartDummyData/views_zoom/2018-10/31.json new file mode 100644 index 000000000..e7919048a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-10/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540684800000,1540688400000,1540692000000,1540695600000,1540699200000,1540702800000,1540706400000,1540710000000,1540713600000,1540717200000,1540720800000,1540724400000,1540728000000,1540731600000,1540735200000,1540738800000,1540742400000,1540746000000,1540749600000,1540753200000,1540756800000,1540760400000,1540764000000,1540767600000,1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,340,110,100,80,60,380,790,1340,1830,1770,2050,2070,1960,1870,1720,2650,1910,2070,2640,2410,1910,1720,1130,560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050]},{"name":"URL","color":"#2373DB","values":[130,230,70,30,30,40,120,520,1000,1080,1300,1460,1270,1370,1210,1300,1690,1770,1450,1390,1570,1320,960,570,390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920]},{"name":"Groups","color":"#9ED448","values":[600,380,340,50,90,60,300,1020,1570,1500,1550,1870,1330,1720,1420,1510,1560,1590,1700,1700,2360,2330,2670,1950,500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690]},{"name":"Channel","color":"#4fae4e","values":[130,50,20,10,0,0,20,90,100,80,140,190,310,50,110,120,120,170,180,170,140,80,220,180,50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140]},{"name":"Search","color":"#F5BD25","values":[500,0,0,0,0,0,60,930,440,160,230,360,220,190,90,240,650,180,210,250,270,200,310,120,80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100]},{"name":"Other","color":"#F79E39","values":[50,0,20,10,20,40,60,120,190,330,280,310,270,210,300,300,330,240,290,270,370,340,350,170,70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,20,20,0,0,0,30,20,20,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/01.json b/public/chartDummyData/views_zoom/2018-11/01.json new file mode 100644 index 000000000..fa3356d97 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540771200000,1540774800000,1540778400000,1540782000000,1540785600000,1540789200000,1540792800000,1540796400000,1540800000000,1540803600000,1540807200000,1540810800000,1540814400000,1540818000000,1540821600000,1540825200000,1540828800000,1540832400000,1540836000000,1540839600000,1540843200000,1540846800000,1540850400000,1540854000000,1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[560,210,130,20,140,210,910,1070,1790,1400,1590,1980,1760,2200,1930,2010,2450,2660,2630,2150,2420,2060,1440,1030,450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230]},{"name":"URL","color":"#2373DB","values":[390,220,110,0,20,140,370,650,860,1080,1630,1650,1470,1550,1680,1530,2110,2420,2140,2310,2110,1510,1100,510,150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830]},{"name":"Groups","color":"#9ED448","values":[500,220,60,20,60,230,740,1070,1310,1270,1420,1390,2110,1720,1690,1720,2020,2110,1530,2370,2520,3420,3040,1510,640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840]},{"name":"Channel","color":"#4fae4e","values":[50,0,30,20,0,20,10,50,110,140,240,80,110,260,230,220,280,310,250,310,220,200,110,60,70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120]},{"name":"Search","color":"#F5BD25","values":[80,10,0,10,0,90,180,150,100,220,160,550,370,320,250,110,160,140,520,210,400,70,220,100,0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200]},{"name":"Other","color":"#F79E39","values":[70,40,0,10,50,120,140,200,180,400,210,240,280,270,300,250,220,350,430,480,410,340,260,90,40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/02.json b/public/chartDummyData/views_zoom/2018-11/02.json new file mode 100644 index 000000000..719898d73 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540857600000,1540861200000,1540864800000,1540868400000,1540872000000,1540875600000,1540879200000,1540882800000,1540886400000,1540890000000,1540893600000,1540897200000,1540900800000,1540904400000,1540908000000,1540911600000,1540915200000,1540918800000,1540922400000,1540926000000,1540929600000,1540933200000,1540936800000,1540940400000,1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,200,80,70,80,210,1070,1080,1500,1160,1890,1560,2100,1900,2130,1850,2330,2070,2050,2190,2150,2560,1640,930,510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210]},{"name":"URL","color":"#2373DB","values":[150,110,20,20,20,90,450,850,1180,1220,1530,1730,1950,1660,2440,1940,2350,2390,2220,2220,1660,1920,1220,640,490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590]},{"name":"Groups","color":"#9ED448","values":[640,240,70,0,40,320,660,980,1090,1130,1720,1390,1560,1360,2380,1480,1450,1970,2090,2550,2030,3160,2350,1380,490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650]},{"name":"Channel","color":"#4fae4e","values":[70,20,0,10,40,10,10,50,50,140,80,150,170,280,170,140,100,140,200,240,110,180,70,80,40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110]},{"name":"Search","color":"#F5BD25","values":[0,0,0,0,10,60,310,610,320,80,100,130,150,160,240,310,110,230,180,200,290,400,190,120,10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180]},{"name":"Other","color":"#F79E39","values":[40,10,40,0,0,70,130,290,230,210,290,310,240,340,260,220,420,310,210,370,360,320,320,180,40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/03.json b/public/chartDummyData/views_zoom/2018-11/03.json new file mode 100644 index 000000000..0276165b9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1540944000000,1540947600000,1540951200000,1540954800000,1540958400000,1540962000000,1540965600000,1540969200000,1540972800000,1540976400000,1540980000000,1540983600000,1540987200000,1540990800000,1540994400000,1540998000000,1541001600000,1541005200000,1541008800000,1541012400000,1541016000000,1541019600000,1541023200000,1541026800000,1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,180,100,30,200,440,680,950,1010,1500,1870,1880,2050,1780,1900,2010,1780,2330,1990,2000,2360,1660,1390,1320,870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320]},{"name":"URL","color":"#2373DB","values":[490,90,80,30,70,230,610,830,1010,1110,1410,1860,2000,1870,1760,2120,2190,3060,2510,1920,1650,1330,910,750,390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930]},{"name":"Groups","color":"#9ED448","values":[490,190,120,20,40,270,810,860,1250,1480,1400,1630,1510,1810,1580,1450,1220,1400,1600,1760,1990,1870,1690,1630,810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070]},{"name":"Channel","color":"#4fae4e","values":[40,30,20,0,20,0,70,70,90,110,50,100,130,170,110,140,140,130,130,120,90,110,190,140,190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230]},{"name":"Search","color":"#F5BD25","values":[10,10,0,0,0,540,260,140,170,400,130,240,150,270,220,420,220,310,160,100,320,60,120,50,80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50]},{"name":"Other","color":"#F79E39","values":[40,10,30,30,0,50,190,170,200,180,250,320,280,350,230,300,240,250,230,250,340,270,170,150,90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,10,10,10,20,10,30,0,10,10,10,30,0,0,10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/04.json b/public/chartDummyData/views_zoom/2018-11/04.json new file mode 100644 index 000000000..ac01d58c8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541030400000,1541034000000,1541037600000,1541041200000,1541044800000,1541048400000,1541052000000,1541055600000,1541059200000,1541062800000,1541066400000,1541070000000,1541073600000,1541077200000,1541080800000,1541084400000,1541088000000,1541091600000,1541095200000,1541098800000,1541102400000,1541106000000,1541109600000,1541113200000,1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[870,540,290,130,120,130,210,1080,1330,1830,2700,2380,2040,2810,2330,2230,1950,2090,2380,2050,1900,2050,1810,1690,840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550]},{"name":"URL","color":"#2373DB","values":[390,240,180,110,0,30,140,330,490,1000,1480,1470,1410,1340,1400,1230,1510,1710,2180,1420,1270,1210,1190,760,550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700]},{"name":"Groups","color":"#9ED448","values":[810,640,220,120,100,190,330,690,1070,1310,1620,1770,1590,1710,1720,1420,2090,1980,1710,2010,2210,2630,2240,1790,840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830]},{"name":"Channel","color":"#4fae4e","values":[190,70,30,10,10,10,10,60,100,100,240,260,170,150,240,160,130,140,150,60,180,190,170,190,80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110]},{"name":"Search","color":"#F5BD25","values":[80,170,50,10,10,60,510,630,410,250,120,320,120,300,150,140,290,120,320,360,430,310,180,370,240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410]},{"name":"Other","color":"#F79E39","values":[90,80,10,30,10,40,40,130,190,270,290,310,670,350,360,230,250,280,370,320,390,360,350,140,130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,10,10,20,0,0,0,10,10,20,0,10,0,0,10,0,10,0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/05.json b/public/chartDummyData/views_zoom/2018-11/05.json new file mode 100644 index 000000000..1129751d5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541116800000,1541120400000,1541124000000,1541127600000,1541131200000,1541134800000,1541138400000,1541142000000,1541145600000,1541149200000,1541152800000,1541156400000,1541160000000,1541163600000,1541167200000,1541170800000,1541174400000,1541178000000,1541181600000,1541185200000,1541188800000,1541192400000,1541196000000,1541199600000,1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[840,300,180,40,30,380,330,620,1340,1900,2280,2130,2160,1870,2580,2090,2330,2240,2210,2370,2830,2450,2230,1200,680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170]},{"name":"URL","color":"#2373DB","values":[550,180,270,80,30,100,220,510,970,1420,1380,1620,1870,1690,1390,1810,2080,2130,1810,1900,1820,1580,1210,780,520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720]},{"name":"Groups","color":"#9ED448","values":[840,280,170,30,100,160,370,760,1010,1320,1440,2050,2010,1860,2140,1970,2160,1690,1550,2040,2640,2100,2290,1880,740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580]},{"name":"Channel","color":"#4fae4e","values":[80,30,10,10,0,40,30,40,60,100,170,110,100,210,150,240,80,80,170,150,190,220,170,110,90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130]},{"name":"Search","color":"#F5BD25","values":[240,60,40,40,0,490,390,350,230,610,180,380,470,240,270,170,270,190,500,280,250,290,510,210,120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210]},{"name":"Other","color":"#F79E39","values":[130,80,40,0,10,40,40,160,330,300,280,370,280,330,290,250,250,330,240,320,440,330,240,150,120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,20,0,10,20,0,0,20,0,0,20,20,30,0,0,0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/06.json b/public/chartDummyData/views_zoom/2018-11/06.json new file mode 100644 index 000000000..79143ac61 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541203200000,1541206800000,1541210400000,1541214000000,1541217600000,1541221200000,1541224800000,1541228400000,1541232000000,1541235600000,1541239200000,1541242800000,1541246400000,1541250000000,1541253600000,1541257200000,1541260800000,1541264400000,1541268000000,1541271600000,1541275200000,1541278800000,1541282400000,1541286000000,1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[680,390,230,60,180,160,230,540,1040,1450,1510,2030,2190,3160,2160,2240,2240,2280,2090,2130,1750,1930,1640,1050,990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280]},{"name":"URL","color":"#2373DB","values":[520,190,100,30,10,30,110,380,710,1080,1680,1680,1610,1710,1540,1730,1710,1990,1620,1500,1330,1460,1580,920,600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960]},{"name":"Groups","color":"#9ED448","values":[740,540,160,150,70,120,360,710,950,1320,1640,1570,1610,1800,1830,1590,1690,1320,2300,1720,2030,2290,2300,1690,1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050]},{"name":"Channel","color":"#4fae4e","values":[90,50,60,10,0,0,20,60,40,160,90,90,80,230,130,190,140,140,200,130,110,230,60,140,100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90]},{"name":"Search","color":"#F5BD25","values":[120,80,30,10,0,560,90,200,150,310,260,340,160,130,140,250,180,490,240,270,290,190,270,100,60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140]},{"name":"Other","color":"#F79E39","values":[120,100,50,20,10,30,20,150,160,360,300,270,280,330,230,180,230,250,170,270,200,210,190,170,80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,20,10,50,20,20,10,30,40,10,20,10,10,10,0,0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/07.json b/public/chartDummyData/views_zoom/2018-11/07.json new file mode 100644 index 000000000..d2f71c7ef --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541289600000,1541293200000,1541296800000,1541300400000,1541304000000,1541307600000,1541311200000,1541314800000,1541318400000,1541322000000,1541325600000,1541329200000,1541332800000,1541336400000,1541340000000,1541343600000,1541347200000,1541350800000,1541354400000,1541358000000,1541361600000,1541365200000,1541368800000,1541372400000,1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[990,430,260,110,60,120,290,820,1260,1400,2010,2250,2170,2130,2500,2850,2330,2480,2380,2820,3090,2600,1920,1230,680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730]},{"name":"URL","color":"#2373DB","values":[600,220,180,110,0,0,10,160,550,910,1170,1800,950,1570,1440,1490,1710,1870,1810,1680,1830,1500,840,830,540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630]},{"name":"Groups","color":"#9ED448","values":[1690,820,300,150,60,30,170,650,1090,1190,1380,2020,1760,2080,1520,2280,1860,1460,1990,2600,2580,2870,2860,1840,800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580]},{"name":"Channel","color":"#4fae4e","values":[100,70,40,30,10,0,50,100,70,110,250,90,90,110,160,190,120,230,100,160,180,230,190,120,30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160]},{"name":"Search","color":"#F5BD25","values":[60,40,10,0,0,0,20,550,500,250,90,170,140,760,280,840,210,120,190,290,350,340,210,200,30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150]},{"name":"Other","color":"#F79E39","values":[80,110,10,10,10,20,30,110,130,170,330,420,430,300,350,340,180,420,260,320,280,270,370,190,100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,20,0,0,10,20,10,10,10,30,0,30,0,0,0,0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/08.json b/public/chartDummyData/views_zoom/2018-11/08.json new file mode 100644 index 000000000..6b71b0dab --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541376000000,1541379600000,1541383200000,1541386800000,1541390400000,1541394000000,1541397600000,1541401200000,1541404800000,1541408400000,1541412000000,1541415600000,1541419200000,1541422800000,1541426400000,1541430000000,1541433600000,1541437200000,1541440800000,1541444400000,1541448000000,1541451600000,1541455200000,1541458800000,1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[680,220,80,50,40,230,550,1060,1360,1370,1340,1560,1750,2580,2030,1940,1940,1960,1930,2530,2770,2460,2060,1210,440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330]},{"name":"URL","color":"#2373DB","values":[540,160,20,0,30,60,490,660,910,1070,1210,1480,1620,1700,1720,1640,2190,2430,2290,2320,2340,1900,1030,590,250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710]},{"name":"Groups","color":"#9ED448","values":[800,400,90,70,210,280,720,1120,980,1210,1450,1490,1580,2290,2120,1330,1550,2090,1770,2180,2700,3970,2850,1650,730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160]},{"name":"Channel","color":"#4fae4e","values":[30,40,20,0,30,50,40,90,40,50,40,20,70,210,100,180,200,170,150,140,260,240,170,110,30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200]},{"name":"Search","color":"#F5BD25","values":[30,30,10,0,0,520,50,110,360,250,140,230,270,200,220,120,180,230,320,300,150,280,150,180,130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190]},{"name":"Other","color":"#F79E39","values":[100,50,10,0,10,100,200,170,230,280,250,250,250,380,260,330,230,550,290,370,280,460,310,270,100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,10,10,0,10,10,0,0,0,20,10,0,20,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/09.json b/public/chartDummyData/views_zoom/2018-11/09.json new file mode 100644 index 000000000..31058e23b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541462400000,1541466000000,1541469600000,1541473200000,1541476800000,1541480400000,1541484000000,1541487600000,1541491200000,1541494800000,1541498400000,1541502000000,1541505600000,1541509200000,1541512800000,1541516400000,1541520000000,1541523600000,1541527200000,1541530800000,1541534400000,1541538000000,1541541600000,1541545200000,1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[440,180,170,100,50,190,780,1130,1380,1130,1350,1650,2240,1890,2210,1730,2200,2310,2150,2360,2910,2950,1810,1320,720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180]},{"name":"URL","color":"#2373DB","values":[250,160,70,0,50,90,510,820,1140,980,1200,1560,1690,1530,1470,1890,2100,2910,2570,2160,1910,2040,1690,930,260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790]},{"name":"Groups","color":"#9ED448","values":[730,280,130,20,70,450,870,880,910,1440,1440,1630,2690,1840,1690,1510,2100,1750,1980,2130,3000,3280,2790,2070,780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650]},{"name":"Channel","color":"#4fae4e","values":[30,0,0,30,0,20,40,20,40,50,80,120,120,130,220,110,240,170,150,180,280,350,170,230,140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120]},{"name":"Search","color":"#F5BD25","values":[130,70,20,0,20,120,480,200,110,120,150,240,130,250,230,120,80,320,470,330,160,190,130,50,40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70]},{"name":"Other","color":"#F79E39","values":[100,30,0,10,0,30,170,210,270,310,230,260,450,410,310,340,240,290,330,490,500,280,310,210,110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,20,40,10,0,0,10,20,10,0,0,10,0,0,0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/10.json b/public/chartDummyData/views_zoom/2018-11/10.json new file mode 100644 index 000000000..52aeba818 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541548800000,1541552400000,1541556000000,1541559600000,1541563200000,1541566800000,1541570400000,1541574000000,1541577600000,1541581200000,1541584800000,1541588400000,1541592000000,1541595600000,1541599200000,1541602800000,1541606400000,1541610000000,1541613600000,1541617200000,1541620800000,1541624400000,1541628000000,1541631600000,1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[720,240,190,40,80,300,750,1070,1040,1110,2350,1530,1830,2240,2610,2410,2170,2390,2180,2810,2430,2200,2340,1550,430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330]},{"name":"URL","color":"#2373DB","values":[260,130,110,60,20,80,560,760,910,1110,1490,2060,2000,1630,1990,1830,2190,2650,2650,2230,2040,2210,1690,700,380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780]},{"name":"Groups","color":"#9ED448","values":[780,240,80,80,130,240,860,1240,940,950,1100,1460,1910,1810,1900,1340,1790,1920,1910,2770,3080,3400,3060,1830,800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560]},{"name":"Channel","color":"#4fae4e","values":[140,60,20,10,10,0,30,100,110,70,100,160,50,190,240,180,300,220,160,180,150,150,280,110,80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120]},{"name":"Search","color":"#F5BD25","values":[40,10,70,0,0,610,120,240,280,150,130,140,300,220,460,580,710,1010,1380,1090,800,760,710,410,100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80]},{"name":"Other","color":"#F79E39","values":[110,80,30,10,10,30,170,150,220,270,310,170,290,270,230,350,440,290,310,390,420,300,280,270,90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,20,10,0,0,10,40,0,10,10,0,10,0,20,10,20,0,0,10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/11.json b/public/chartDummyData/views_zoom/2018-11/11.json new file mode 100644 index 000000000..df9457fcb --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541635200000,1541638800000,1541642400000,1541646000000,1541649600000,1541653200000,1541656800000,1541660400000,1541664000000,1541667600000,1541671200000,1541674800000,1541678400000,1541682000000,1541685600000,1541689200000,1541692800000,1541696400000,1541700000000,1541703600000,1541707200000,1541710800000,1541714400000,1541718000000,1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,290,80,30,50,380,960,1460,1220,1660,1980,1550,1870,2020,2440,2260,2020,2170,2810,2490,2440,2210,2140,1170,450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380]},{"name":"URL","color":"#2373DB","values":[380,80,40,10,10,40,390,760,920,1260,1380,1390,1880,1860,1470,1560,2190,2750,2380,2270,2250,1790,1600,720,450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740]},{"name":"Groups","color":"#9ED448","values":[800,260,60,10,160,240,840,1130,1170,1150,1380,1990,2240,1720,1790,2130,1870,2320,2670,2140,2860,2860,3100,1580,780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140]},{"name":"Channel","color":"#4fae4e","values":[80,60,0,10,0,40,40,60,40,80,120,100,110,210,120,160,90,190,140,130,410,180,180,130,20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110]},{"name":"Search","color":"#F5BD25","values":[100,60,10,40,20,240,340,1510,490,350,280,480,710,680,690,710,780,890,760,930,980,710,360,210,70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110]},{"name":"Other","color":"#F79E39","values":[90,50,10,20,20,70,200,160,290,210,250,350,280,220,280,290,260,250,360,380,370,330,280,180,150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140]},{"name":"PM","color":"#E65850","values":[10,0,0,0,10,0,10,0,10,0,0,10,0,0,0,10,0,10,20,0,10,0,10,0,0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/12.json b/public/chartDummyData/views_zoom/2018-11/12.json new file mode 100644 index 000000000..9aa67c58f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541721600000,1541725200000,1541728800000,1541732400000,1541736000000,1541739600000,1541743200000,1541746800000,1541750400000,1541754000000,1541757600000,1541761200000,1541764800000,1541768400000,1541772000000,1541775600000,1541779200000,1541782800000,1541786400000,1541790000000,1541793600000,1541797200000,1541800800000,1541804400000,1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,210,200,190,20,290,590,1120,1380,2070,1690,1900,1870,1960,2280,1910,2360,2070,2200,2400,2380,2180,1960,1280,640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980]},{"name":"URL","color":"#2373DB","values":[450,210,30,20,10,110,430,950,1040,1190,1590,1840,1910,2160,1620,1760,2530,2690,2580,2320,1940,2010,1240,960,590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830]},{"name":"Groups","color":"#9ED448","values":[780,320,60,50,70,380,900,1080,1220,1870,1390,1870,2050,2020,1750,3000,1980,1920,2010,2070,2400,2810,2550,2050,880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550]},{"name":"Channel","color":"#4fae4e","values":[20,10,30,0,0,10,50,40,80,30,80,90,160,140,60,250,120,140,180,190,150,140,150,90,40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70]},{"name":"Search","color":"#F5BD25","values":[70,0,10,40,20,340,520,190,430,360,300,250,470,290,570,300,360,270,670,360,340,340,430,140,30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230]},{"name":"Other","color":"#F79E39","values":[150,60,0,0,10,30,260,260,200,240,330,290,300,310,210,280,250,370,310,350,340,310,230,220,90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,10,10,0,40,10,20,0,0,40,0,20,10,20,30,10,0,10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/13.json b/public/chartDummyData/views_zoom/2018-11/13.json new file mode 100644 index 000000000..967036541 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541808000000,1541811600000,1541815200000,1541818800000,1541822400000,1541826000000,1541829600000,1541833200000,1541836800000,1541840400000,1541844000000,1541847600000,1541851200000,1541854800000,1541858400000,1541862000000,1541865600000,1541869200000,1541872800000,1541876400000,1541880000000,1541883600000,1541887200000,1541890800000,1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[640,290,190,130,70,150,570,930,1420,1500,1630,2680,2020,2120,2270,1760,2230,2640,2620,2100,1870,1920,2730,730,930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180]},{"name":"URL","color":"#2373DB","values":[590,380,100,30,30,80,190,470,780,1370,1750,2000,2070,1700,1480,1830,1890,2220,1940,1940,1670,1220,850,630,490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670]},{"name":"Groups","color":"#9ED448","values":[880,360,290,100,0,130,580,1130,1560,1280,1420,1670,1740,1950,1470,1720,1700,2180,1590,1900,2160,2100,2390,1580,1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550]},{"name":"Channel","color":"#4fae4e","values":[40,20,30,20,10,30,60,90,70,30,140,100,190,90,180,150,140,230,90,190,150,200,140,160,60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210]},{"name":"Search","color":"#F5BD25","values":[30,40,130,10,40,20,200,760,320,170,270,170,610,520,340,240,270,390,430,310,410,340,260,150,210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70]},{"name":"Other","color":"#F79E39","values":[90,50,30,10,20,30,70,210,290,350,310,290,330,370,470,250,290,290,340,240,220,220,230,130,130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,10,20,10,10,20,40,40,20,10,10,0,0,10,10,0,10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/14.json b/public/chartDummyData/views_zoom/2018-11/14.json new file mode 100644 index 000000000..be30e7d4e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541894400000,1541898000000,1541901600000,1541905200000,1541908800000,1541912400000,1541916000000,1541919600000,1541923200000,1541926800000,1541930400000,1541934000000,1541937600000,1541941200000,1541944800000,1541948400000,1541952000000,1541955600000,1541959200000,1541962800000,1541966400000,1541970000000,1541973600000,1541977200000,1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[930,600,220,110,130,130,260,470,1230,1730,1670,1910,2280,2320,2790,2310,2150,2660,2420,2610,2510,2570,2260,1330,520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210]},{"name":"URL","color":"#2373DB","values":[490,230,270,70,60,30,90,190,530,960,1530,1140,1160,1250,1480,1470,1630,1750,1660,1810,2180,1770,1490,710,260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730]},{"name":"Groups","color":"#9ED448","values":[1360,510,280,70,130,80,140,940,750,1300,1400,1880,1820,2280,1880,1560,1840,2430,2140,2400,2980,3530,3450,2160,1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100]},{"name":"Channel","color":"#4fae4e","values":[60,50,80,0,40,30,20,20,70,70,130,110,240,290,150,180,360,160,260,220,100,70,250,200,220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70]},{"name":"Search","color":"#F5BD25","values":[210,20,30,10,0,40,170,480,260,200,410,180,380,390,390,450,450,600,300,420,310,300,230,190,130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160]},{"name":"Other","color":"#F79E39","values":[130,40,60,10,0,10,60,180,180,300,360,340,300,280,350,290,280,270,500,410,290,270,410,160,110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,10,0,0,20,0,0,10,0,10,0,20,40,10,10,10,0,0,0,0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/15.json b/public/chartDummyData/views_zoom/2018-11/15.json new file mode 100644 index 000000000..e7865689a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1541980800000,1541984400000,1541988000000,1541991600000,1541995200000,1541998800000,1542002400000,1542006000000,1542009600000,1542013200000,1542016800000,1542020400000,1542024000000,1542027600000,1542031200000,1542034800000,1542038400000,1542042000000,1542045600000,1542049200000,1542052800000,1542056400000,1542060000000,1542063600000,1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[520,410,250,80,90,290,1030,980,1160,1370,1540,1780,2270,2110,2660,2240,2020,2860,2100,2750,2250,2740,2420,1180,420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110]},{"name":"URL","color":"#2373DB","values":[260,110,40,20,30,60,370,740,830,1170,1250,1410,1980,1850,1780,1880,2390,2530,2250,2300,1830,1720,1350,790,410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490]},{"name":"Groups","color":"#9ED448","values":[1160,320,160,40,70,250,1250,1030,1480,1380,1510,1700,2110,2190,1670,1810,2120,1930,2660,2770,3240,3360,2680,1650,540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720]},{"name":"Channel","color":"#4fae4e","values":[220,10,30,0,0,10,30,0,60,130,120,110,110,190,90,170,210,140,170,250,350,220,130,120,30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90]},{"name":"Search","color":"#F5BD25","values":[130,20,10,0,0,440,270,120,210,140,250,500,430,220,210,220,130,190,250,440,470,360,430,70,30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90]},{"name":"Other","color":"#F79E39","values":[110,20,20,0,0,80,170,160,280,200,180,390,260,220,230,230,240,390,410,470,340,320,280,260,110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,10,0,0,0,10,0,30,10,0,20,0,0,10,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/16.json b/public/chartDummyData/views_zoom/2018-11/16.json new file mode 100644 index 000000000..8de9d3a28 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542067200000,1542070800000,1542074400000,1542078000000,1542081600000,1542085200000,1542088800000,1542092400000,1542096000000,1542099600000,1542103200000,1542106800000,1542110400000,1542114000000,1542117600000,1542121200000,1542124800000,1542128400000,1542132000000,1542135600000,1542139200000,1542142800000,1542146400000,1542150000000,1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[420,190,150,70,80,320,1080,1090,1430,1450,1520,1660,1710,2260,1740,2170,2210,2330,2760,2280,2530,2260,1600,1330,680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050]},{"name":"URL","color":"#2373DB","values":[410,110,60,20,0,30,470,840,1080,1200,1200,1410,1780,2010,1530,1710,2290,2720,2600,2290,2090,1750,1360,780,450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700]},{"name":"Groups","color":"#9ED448","values":[540,290,130,60,100,340,950,1050,1650,1470,1470,1930,1800,1770,1900,1860,1990,2490,2110,2620,3000,3600,2830,1560,680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860]},{"name":"Channel","color":"#4fae4e","values":[30,20,70,20,0,10,120,60,80,110,80,80,70,120,100,160,100,250,330,150,320,140,150,120,50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,30,70,340,710,600,230,150,260,180,260,130,130,250,260,200,340,380,220,110,80,150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260]},{"name":"Other","color":"#F79E39","values":[110,70,20,20,10,30,180,230,250,310,240,350,420,380,360,260,360,310,340,350,330,350,230,270,120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,10,0,10,0,0,10,20,20,20,20,0,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/17.json b/public/chartDummyData/views_zoom/2018-11/17.json new file mode 100644 index 000000000..6f2617eec --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542153600000,1542157200000,1542160800000,1542164400000,1542168000000,1542171600000,1542175200000,1542178800000,1542182400000,1542186000000,1542189600000,1542193200000,1542196800000,1542200400000,1542204000000,1542207600000,1542211200000,1542214800000,1542218400000,1542222000000,1542225600000,1542229200000,1542232800000,1542236400000,1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[680,220,120,50,40,340,920,1330,1420,1460,1580,2180,2180,2000,2190,2590,2390,1960,2610,2260,2540,2520,1880,1380,590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580]},{"name":"URL","color":"#2373DB","values":[450,80,120,50,10,80,560,900,1020,1500,1700,1730,2090,2310,1990,1890,2410,2370,2550,2480,2320,1800,1130,740,410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710]},{"name":"Groups","color":"#9ED448","values":[680,170,90,60,40,350,1170,1190,1240,1220,1420,1920,1760,2150,2330,1930,2240,2050,1950,2240,2310,3240,2580,2140,560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990]},{"name":"Channel","color":"#4fae4e","values":[50,60,0,10,0,30,20,150,120,80,80,230,50,160,420,230,140,180,130,300,140,230,220,110,50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120]},{"name":"Search","color":"#F5BD25","values":[150,30,0,10,0,910,390,360,200,110,160,150,290,170,280,230,270,260,390,190,240,170,320,110,50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890]},{"name":"Other","color":"#F79E39","values":[120,20,40,20,10,50,160,230,200,280,230,350,370,440,350,340,200,220,380,400,410,410,380,140,40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,0,0,0,10,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/18.json b/public/chartDummyData/views_zoom/2018-11/18.json new file mode 100644 index 000000000..531369b88 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542240000000,1542243600000,1542247200000,1542250800000,1542254400000,1542258000000,1542261600000,1542265200000,1542268800000,1542272400000,1542276000000,1542279600000,1542283200000,1542286800000,1542290400000,1542294000000,1542297600000,1542301200000,1542304800000,1542308400000,1542312000000,1542315600000,1542319200000,1542322800000,1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[590,210,160,30,60,350,770,990,1350,1590,1460,1980,2400,2280,1940,2230,1820,1920,2840,2350,2730,2930,2190,980,600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060]},{"name":"URL","color":"#2373DB","values":[410,130,70,30,80,100,570,1120,1120,1330,1380,1890,2170,1790,1860,2110,2160,2720,2670,2400,1850,1950,1530,830,450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750]},{"name":"Groups","color":"#9ED448","values":[560,160,170,20,90,440,1030,1140,1100,1490,1520,1890,2240,2160,2120,2370,1570,1970,1960,2950,2870,2890,2810,1550,640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950]},{"name":"Channel","color":"#4fae4e","values":[50,30,0,0,10,70,160,100,40,140,60,90,80,280,160,180,170,170,120,170,270,190,210,70,60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140]},{"name":"Search","color":"#F5BD25","values":[50,20,0,50,20,110,170,720,160,190,150,260,400,330,230,230,140,290,680,240,550,370,320,230,20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40]},{"name":"Other","color":"#F79E39","values":[40,50,20,0,40,40,230,160,160,210,260,310,280,460,240,320,260,270,260,380,470,440,240,210,120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,10,10,0,10,10,20,30,10,0,20,0,10,10,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/19.json b/public/chartDummyData/views_zoom/2018-11/19.json new file mode 100644 index 000000000..466132b6c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542326400000,1542330000000,1542333600000,1542337200000,1542340800000,1542344400000,1542348000000,1542351600000,1542355200000,1542358800000,1542362400000,1542366000000,1542369600000,1542373200000,1542376800000,1542380400000,1542384000000,1542387600000,1542391200000,1542394800000,1542398400000,1542402000000,1542405600000,1542409200000,1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,260,120,80,80,180,750,1040,1280,1510,1690,1730,2130,2000,2280,1640,1980,2480,2290,2490,2240,2010,1810,1180,1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360]},{"name":"URL","color":"#2373DB","values":[450,210,20,0,120,160,520,1000,1060,1600,1640,1840,1900,1950,1940,2310,2650,3070,2680,2440,2030,1280,980,670,500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820]},{"name":"Groups","color":"#9ED448","values":[640,390,120,50,90,400,910,1220,1200,1310,1420,1530,1790,2330,1750,1760,1870,2470,2050,2190,2400,2320,2030,1550,900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560]},{"name":"Channel","color":"#4fae4e","values":[60,10,30,0,0,40,60,50,60,80,130,220,120,320,170,150,140,120,200,90,170,350,70,210,100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140]},{"name":"Search","color":"#F5BD25","values":[20,0,30,30,30,160,390,410,90,210,210,520,460,360,320,350,250,350,170,420,190,320,80,70,240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150]},{"name":"Other","color":"#F79E39","values":[120,100,40,20,50,80,170,140,300,200,210,260,310,390,290,390,310,330,330,350,420,240,270,140,150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,0,10,0,20,10,10,0,0,10,40,30,0,10,0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/20.json b/public/chartDummyData/views_zoom/2018-11/20.json new file mode 100644 index 000000000..ca344bd95 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542412800000,1542416400000,1542420000000,1542423600000,1542427200000,1542430800000,1542434400000,1542438000000,1542441600000,1542445200000,1542448800000,1542452400000,1542456000000,1542459600000,1542463200000,1542466800000,1542470400000,1542474000000,1542477600000,1542481200000,1542484800000,1542488400000,1542492000000,1542495600000,1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1120,330,90,30,60,130,270,1100,1150,1570,1620,1980,1990,2640,2400,1870,1940,1940,2100,1940,1800,2000,1520,1210,700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990]},{"name":"URL","color":"#2373DB","values":[500,120,150,30,30,80,270,410,890,1330,1610,1650,2170,2020,1900,1890,2090,2140,1860,1840,1430,1070,1070,730,510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670]},{"name":"Groups","color":"#9ED448","values":[900,320,190,110,50,140,490,760,1360,2230,1940,1640,1920,1760,1700,1470,1810,1690,1780,1330,2100,2210,2550,2100,1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590]},{"name":"Channel","color":"#4fae4e","values":[100,10,30,0,10,0,30,40,70,80,80,160,160,150,170,130,110,150,220,110,90,70,130,70,30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90]},{"name":"Search","color":"#F5BD25","values":[240,60,0,0,0,60,60,960,200,260,230,220,90,190,240,80,180,220,160,50,140,850,110,160,110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100]},{"name":"Other","color":"#F79E39","values":[150,60,30,0,0,50,70,90,290,270,210,220,280,410,350,190,170,340,280,290,260,240,220,200,160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,0,10,10,0,0,10,0,10,10,10,0,0,0,0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/21.json b/public/chartDummyData/views_zoom/2018-11/21.json new file mode 100644 index 000000000..c47767755 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542499200000,1542502800000,1542506400000,1542510000000,1542513600000,1542517200000,1542520800000,1542524400000,1542528000000,1542531600000,1542535200000,1542538800000,1542542400000,1542546000000,1542549600000,1542553200000,1542556800000,1542560400000,1542564000000,1542567600000,1542571200000,1542574800000,1542578400000,1542582000000,1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[700,470,200,170,110,40,290,520,1180,1390,1910,2480,2190,1930,1910,2300,2380,1970,2130,3170,2380,2850,1660,1110,830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920]},{"name":"URL","color":"#2373DB","values":[510,320,170,50,60,20,40,250,510,840,1590,1320,1280,1550,1360,1500,1530,1540,1750,1640,1450,1350,890,490,360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670]},{"name":"Groups","color":"#9ED448","values":[1150,580,250,40,50,320,330,500,970,1520,1530,1990,1460,1690,1460,1610,1690,2230,1990,2160,2760,3730,2750,1720,1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890]},{"name":"Channel","color":"#4fae4e","values":[30,40,30,0,0,10,10,80,30,170,230,90,310,90,90,90,130,150,160,90,190,340,90,90,60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110]},{"name":"Search","color":"#F5BD25","values":[110,10,10,260,70,20,80,150,710,140,600,210,270,390,240,120,270,270,220,210,1030,400,200,90,20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100]},{"name":"Other","color":"#F79E39","values":[160,80,30,30,10,30,80,80,160,330,320,360,310,230,260,280,280,260,260,290,290,270,270,230,50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240]},{"name":"PM","color":"#E65850","values":[0,0,0,0,10,0,10,10,20,0,20,30,30,10,0,0,20,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/22.json b/public/chartDummyData/views_zoom/2018-11/22.json new file mode 100644 index 000000000..0453c1f78 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542585600000,1542589200000,1542592800000,1542596400000,1542600000000,1542603600000,1542607200000,1542610800000,1542614400000,1542618000000,1542621600000,1542625200000,1542628800000,1542632400000,1542636000000,1542639600000,1542643200000,1542646800000,1542650400000,1542654000000,1542657600000,1542661200000,1542664800000,1542668400000,1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[830,270,130,60,60,280,920,1090,1180,1520,1900,2010,2180,2440,2380,2150,2130,2160,2310,2810,2840,2740,2070,1050,450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570]},{"name":"URL","color":"#2373DB","values":[360,280,230,70,0,130,380,910,980,1120,1100,1780,1920,1800,1690,2030,2370,2010,2700,2350,2390,2020,1580,700,410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770]},{"name":"Groups","color":"#9ED448","values":[1020,220,70,50,50,250,740,1190,1490,1270,1190,1480,1780,1810,1660,2460,2070,1980,1970,2460,2620,2960,3010,1860,610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720]},{"name":"Channel","color":"#4fae4e","values":[60,0,10,0,10,0,20,40,60,130,100,110,170,180,150,290,150,100,160,150,250,260,590,60,10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90]},{"name":"Search","color":"#F5BD25","values":[20,10,30,0,60,530,310,110,150,90,160,130,190,160,280,580,420,180,150,200,480,210,20,260,20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80]},{"name":"Other","color":"#F79E39","values":[50,30,0,10,10,70,200,300,270,330,320,380,530,410,340,220,340,390,370,370,390,510,290,150,170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,20,0,0,10,10,10,0,20,0,0,0,0,0,0,0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/23.json b/public/chartDummyData/views_zoom/2018-11/23.json new file mode 100644 index 000000000..edd66f43d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542672000000,1542675600000,1542679200000,1542682800000,1542686400000,1542690000000,1542693600000,1542697200000,1542700800000,1542704400000,1542708000000,1542711600000,1542715200000,1542718800000,1542722400000,1542726000000,1542729600000,1542733200000,1542736800000,1542740400000,1542744000000,1542747600000,1542751200000,1542754800000,1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,260,220,180,30,240,920,1080,1420,1720,1740,1830,1870,1970,2010,2310,2630,2140,2250,2180,2510,2830,2400,1580,560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330]},{"name":"URL","color":"#2373DB","values":[410,110,40,40,10,70,620,1000,930,1570,1350,1430,1920,2160,2100,2200,2440,2940,2250,2150,2130,1830,1140,710,320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100]},{"name":"Groups","color":"#9ED448","values":[610,210,30,60,120,370,730,1400,1170,1000,1240,1590,1680,1920,1540,2280,1770,1820,2030,2630,3070,2800,2780,1990,900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590]},{"name":"Channel","color":"#4fae4e","values":[10,50,0,0,0,20,30,90,0,150,160,70,140,190,170,170,210,100,190,220,230,280,120,120,40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100]},{"name":"Search","color":"#F5BD25","values":[20,60,0,0,10,10,450,550,380,340,210,230,240,380,320,310,220,290,450,250,270,360,450,890,380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80]},{"name":"Other","color":"#F79E39","values":[170,30,20,0,20,50,220,230,220,350,390,430,450,360,340,310,430,260,300,380,510,440,310,160,50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,10,20,0,0,20,10,0,10,20,0,10,0,0,30,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/24.json b/public/chartDummyData/views_zoom/2018-11/24.json new file mode 100644 index 000000000..d4bad9d32 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542758400000,1542762000000,1542765600000,1542769200000,1542772800000,1542776400000,1542780000000,1542783600000,1542787200000,1542790800000,1542794400000,1542798000000,1542801600000,1542805200000,1542808800000,1542812400000,1542816000000,1542819600000,1542823200000,1542826800000,1542830400000,1542834000000,1542837600000,1542841200000,1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[560,310,70,10,120,180,740,1150,1160,1610,1400,1690,2290,2130,1860,1870,2070,2190,2050,3080,2540,2620,2800,1060,460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700]},{"name":"URL","color":"#2373DB","values":[320,80,10,20,30,150,430,920,1020,1210,1680,1700,1940,2230,1830,2160,2260,2680,2740,2220,2290,1990,1390,750,380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930]},{"name":"Groups","color":"#9ED448","values":[900,380,130,10,40,480,950,1180,1240,1270,1250,1230,1590,2210,1810,1320,1580,1790,2680,2870,2420,3200,2590,1950,890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120]},{"name":"Channel","color":"#4fae4e","values":[40,10,20,0,0,10,70,50,70,80,110,120,110,190,150,110,170,180,240,160,100,110,300,140,200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70]},{"name":"Search","color":"#F5BD25","values":[380,60,0,0,0,380,640,390,330,160,260,220,430,230,420,230,250,240,240,360,160,450,260,40,170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40]},{"name":"Other","color":"#F79E39","values":[50,20,40,10,10,70,280,200,370,320,240,380,440,360,440,290,240,490,410,490,470,440,380,140,120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,0,10,0,10,10,10,30,30,50,10,0,20,20,0,0,10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/25.json b/public/chartDummyData/views_zoom/2018-11/25.json new file mode 100644 index 000000000..883e9ce66 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542844800000,1542848400000,1542852000000,1542855600000,1542859200000,1542862800000,1542866400000,1542870000000,1542873600000,1542877200000,1542880800000,1542884400000,1542888000000,1542891600000,1542895200000,1542898800000,1542902400000,1542906000000,1542909600000,1542913200000,1542916800000,1542920400000,1542924000000,1542927600000,1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[460,170,140,40,10,200,610,1210,1410,1640,1750,2070,1910,2050,1930,1990,1840,2050,2780,2530,2900,2130,2280,1360,870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360]},{"name":"URL","color":"#2373DB","values":[380,250,0,10,0,80,480,830,1160,1230,1520,1770,2200,1930,1930,2100,2890,2640,2400,2070,1880,2040,1190,820,530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880]},{"name":"Groups","color":"#9ED448","values":[890,190,150,10,90,340,1160,1230,1350,1540,1210,1480,2060,1670,1800,1670,1640,1410,2140,2360,2730,2900,2850,1560,780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710]},{"name":"Channel","color":"#4fae4e","values":[200,20,20,0,0,20,70,30,140,70,120,50,70,80,240,140,140,240,200,160,520,180,150,140,40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80]},{"name":"Search","color":"#F5BD25","values":[170,0,10,10,0,40,340,730,250,320,280,270,220,210,240,230,310,240,730,290,200,370,440,150,50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120]},{"name":"Other","color":"#F79E39","values":[120,70,30,30,0,80,240,290,310,200,300,490,300,460,270,450,280,370,320,400,450,430,410,410,190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160]},{"name":"PM","color":"#E65850","values":[10,0,10,0,0,0,10,0,0,20,0,0,0,20,20,20,40,10,10,20,10,0,10,0,0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/26.json b/public/chartDummyData/views_zoom/2018-11/26.json new file mode 100644 index 000000000..911e2a6a2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1542931200000,1542934800000,1542938400000,1542942000000,1542945600000,1542949200000,1542952800000,1542956400000,1542960000000,1542963600000,1542967200000,1542970800000,1542974400000,1542978000000,1542981600000,1542985200000,1542988800000,1542992400000,1542996000000,1542999600000,1543003200000,1543006800000,1543010400000,1543014000000,1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[870,330,140,70,40,160,790,1020,1610,1660,2080,1830,2770,2610,2520,2050,1880,2120,2110,2130,2990,2370,1510,990,660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170]},{"name":"URL","color":"#2373DB","values":[530,210,90,10,50,90,360,900,1270,1460,1920,1980,2120,1940,2190,2480,2370,2470,2520,2180,1670,1510,1060,670,410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810]},{"name":"Groups","color":"#9ED448","values":[780,270,210,20,120,270,970,1170,1200,1560,1120,1740,1810,1810,1800,1700,2020,2370,1660,2560,2250,2330,2470,1590,800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880]},{"name":"Channel","color":"#4fae4e","values":[40,50,10,20,0,0,70,90,150,160,180,90,100,210,120,210,100,130,160,140,210,180,120,90,30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140]},{"name":"Search","color":"#F5BD25","values":[50,260,50,0,10,250,390,190,140,220,140,230,200,310,150,250,130,410,300,280,160,590,110,100,170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330]},{"name":"Other","color":"#F79E39","values":[190,30,20,0,0,60,240,280,480,450,380,430,430,360,310,410,390,540,380,470,450,290,340,180,110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,10,0,0,20,0,10,0,0,20,10,40,20,0,0,10,0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/27.json b/public/chartDummyData/views_zoom/2018-11/27.json new file mode 100644 index 000000000..3a467215f --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543017600000,1543021200000,1543024800000,1543028400000,1543032000000,1543035600000,1543039200000,1543042800000,1543046400000,1543050000000,1543053600000,1543057200000,1543060800000,1543064400000,1543068000000,1543071600000,1543075200000,1543078800000,1543082400000,1543086000000,1543089600000,1543093200000,1543096800000,1543100400000,1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[660,460,120,130,60,170,360,950,1260,1540,1960,2160,2120,2620,2490,1990,2020,2390,2210,1980,1700,1600,2500,1920,820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350]},{"name":"URL","color":"#2373DB","values":[410,90,70,20,20,60,200,690,800,1590,1700,1990,1740,1770,1900,1740,1940,2410,2450,2020,1520,1210,1200,670,460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950]},{"name":"Groups","color":"#9ED448","values":[800,430,180,70,70,180,400,850,1260,1290,1500,1560,1900,1630,1580,1490,1550,1990,1790,1580,1880,1720,1860,1890,1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910]},{"name":"Channel","color":"#4fae4e","values":[30,50,10,10,20,10,10,20,90,140,80,150,200,220,160,180,170,150,160,160,240,170,120,110,70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150]},{"name":"Search","color":"#F5BD25","values":[170,80,60,20,0,90,200,900,80,100,190,120,400,400,550,200,310,310,180,150,260,210,230,100,110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60]},{"name":"Other","color":"#F79E39","values":[110,50,10,0,10,50,80,110,230,220,260,350,500,350,210,410,290,320,240,430,320,220,200,240,120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,0,0,30,20,20,0,0,10,10,10,10,0,0,20,10,20,0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/28.json b/public/chartDummyData/views_zoom/2018-11/28.json new file mode 100644 index 000000000..c1e27b033 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543104000000,1543107600000,1543111200000,1543114800000,1543118400000,1543122000000,1543125600000,1543129200000,1543132800000,1543136400000,1543140000000,1543143600000,1543147200000,1543150800000,1543154400000,1543158000000,1543161600000,1543165200000,1543168800000,1543172400000,1543176000000,1543179600000,1543183200000,1543186800000,1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[820,440,210,110,20,90,310,730,1210,1510,2010,2070,2180,1950,2390,1980,2160,2230,2360,2410,3090,3230,1910,1570,800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290]},{"name":"URL","color":"#2373DB","values":[460,280,110,90,50,10,30,270,520,860,1510,1400,1710,1380,1460,1810,1580,1390,1820,1710,1540,1850,1270,770,400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820]},{"name":"Groups","color":"#9ED448","values":[1390,700,340,120,30,80,150,460,1110,1480,1290,1530,1590,1710,1760,1750,1490,1730,1870,1970,2950,3100,2590,1720,850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760]},{"name":"Channel","color":"#4fae4e","values":[70,40,30,20,0,0,30,70,100,110,160,110,190,110,280,240,90,110,150,160,160,280,180,90,60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60]},{"name":"Search","color":"#F5BD25","values":[110,150,20,0,0,0,450,540,250,680,240,200,270,300,270,260,260,430,360,340,310,160,180,80,20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50]},{"name":"Other","color":"#F79E39","values":[120,60,30,40,10,50,30,90,180,370,280,330,350,300,290,370,230,280,350,260,320,250,410,230,160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,20,0,0,0,10,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/29.json b/public/chartDummyData/views_zoom/2018-11/29.json new file mode 100644 index 000000000..633a8d6c5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543190400000,1543194000000,1543197600000,1543201200000,1543204800000,1543208400000,1543212000000,1543215600000,1543219200000,1543222800000,1543226400000,1543230000000,1543233600000,1543237200000,1543240800000,1543244400000,1543248000000,1543251600000,1543255200000,1543258800000,1543262400000,1543266000000,1543269600000,1543273200000,1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[800,650,180,80,90,290,740,910,1060,1160,1780,2070,2410,2160,1770,2800,2340,2490,2620,2510,2720,2610,4240,1330,790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380]},{"name":"URL","color":"#2373DB","values":[400,180,130,50,50,80,420,800,910,1180,1210,1710,1920,1810,1680,1900,2110,2970,2290,2380,2620,2130,1420,1100,490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930]},{"name":"Groups","color":"#9ED448","values":[850,420,170,400,590,640,910,770,1260,1530,1400,1470,2090,1980,1860,1560,2140,2310,2090,2350,2380,3590,2900,1590,790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380]},{"name":"Channel","color":"#4fae4e","values":[60,40,30,10,0,0,30,40,50,40,80,170,120,100,120,150,170,110,150,110,270,200,200,100,20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100]},{"name":"Search","color":"#F5BD25","values":[20,0,0,30,0,330,370,380,100,240,570,330,320,590,680,390,230,290,590,210,410,350,370,80,50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40]},{"name":"Other","color":"#F79E39","values":[160,70,40,20,0,90,120,220,190,310,340,350,330,350,320,430,380,260,320,330,440,360,270,90,90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,10,10,10,10,0,0,0,30,20,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-11/30.json b/public/chartDummyData/views_zoom/2018-11/30.json new file mode 100644 index 000000000..40341254c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-11/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543276800000,1543280400000,1543284000000,1543287600000,1543291200000,1543294800000,1543298400000,1543302000000,1543305600000,1543309200000,1543312800000,1543316400000,1543320000000,1543323600000,1543327200000,1543330800000,1543334400000,1543338000000,1543341600000,1543345200000,1543348800000,1543352400000,1543356000000,1543359600000,1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[790,280,150,30,50,270,640,1090,1180,1450,2360,1700,2510,2570,2500,2440,2710,2470,2660,2840,2510,2610,1830,1700,580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200]},{"name":"URL","color":"#2373DB","values":[490,90,0,40,20,80,550,930,1100,1090,1400,1500,1870,2160,1650,1870,2220,2390,2250,1810,1800,1740,1550,930,350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030]},{"name":"Groups","color":"#9ED448","values":[790,150,190,60,40,390,1560,1150,1390,1350,1310,1380,1690,2040,1730,1600,1760,1770,2120,2090,2600,3210,2240,2120,920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510]},{"name":"Channel","color":"#4fae4e","values":[20,40,10,0,30,20,50,40,80,50,190,80,110,150,140,210,150,160,230,200,210,120,150,70,20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60]},{"name":"Search","color":"#F5BD25","values":[50,10,0,0,60,130,310,930,110,250,260,170,860,170,370,230,230,410,320,200,290,180,930,40,30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40]},{"name":"Other","color":"#F79E39","values":[90,50,10,10,10,40,130,320,250,210,230,330,370,300,300,320,380,290,410,380,410,340,340,200,100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/01.json b/public/chartDummyData/views_zoom/2018-12/01.json new file mode 100644 index 000000000..64f5ae52c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543363200000,1543366800000,1543370400000,1543374000000,1543377600000,1543381200000,1543384800000,1543388400000,1543392000000,1543395600000,1543399200000,1543402800000,1543406400000,1543410000000,1543413600000,1543417200000,1543420800000,1543424400000,1543428000000,1543431600000,1543435200000,1543438800000,1543442400000,1543446000000,1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[580,490,50,120,170,150,610,1170,1350,1260,1690,1730,2170,2320,2080,2100,1950,2220,2210,2700,2590,3150,2130,1360,470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370]},{"name":"URL","color":"#2373DB","values":[350,140,70,50,0,90,390,650,1070,1390,1230,1440,1810,1730,1910,1800,2540,2560,2380,2450,2050,2170,1320,880,350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990]},{"name":"Groups","color":"#9ED448","values":[920,310,170,90,100,380,980,1280,1240,1130,1380,1540,1380,1560,1550,1480,1770,1930,2000,2530,2770,3230,2540,1710,740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670]},{"name":"Channel","color":"#4fae4e","values":[20,50,20,0,10,20,50,70,70,120,80,130,150,110,210,270,120,180,240,290,150,380,160,80,90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190]},{"name":"Search","color":"#F5BD25","values":[30,30,0,0,80,220,380,210,210,160,500,120,70,190,240,100,540,230,150,280,350,450,200,120,50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70]},{"name":"Other","color":"#F79E39","values":[100,30,40,10,20,70,140,210,350,210,220,180,360,280,230,240,220,290,350,530,510,330,260,160,60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,20,10,10,10,10,20,20,20,10,30,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/02.json b/public/chartDummyData/views_zoom/2018-12/02.json new file mode 100644 index 000000000..ab170bf56 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543449600000,1543453200000,1543456800000,1543460400000,1543464000000,1543467600000,1543471200000,1543474800000,1543478400000,1543482000000,1543485600000,1543489200000,1543492800000,1543496400000,1543500000000,1543503600000,1543507200000,1543510800000,1543514400000,1543518000000,1543521600000,1543525200000,1543528800000,1543532400000,1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[470,300,140,70,60,300,860,960,1220,1620,1940,1790,2540,1860,1890,2230,2470,2340,2470,2520,2380,2150,1600,1170,540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070]},{"name":"URL","color":"#2373DB","values":[350,140,70,10,70,90,440,840,1100,1130,1850,1860,1830,1810,1770,2230,2360,2620,2660,2360,2140,2350,1540,810,390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900]},{"name":"Groups","color":"#9ED448","values":[740,360,160,50,40,600,960,1010,2170,920,1240,1650,1410,1840,1600,1660,1930,1780,1820,1980,2470,2880,2510,1880,650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910]},{"name":"Channel","color":"#4fae4e","values":[90,20,20,30,40,30,70,60,90,120,80,120,110,150,130,60,160,220,150,240,200,180,140,140,90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170]},{"name":"Search","color":"#F5BD25","values":[50,20,0,0,0,110,490,250,410,180,310,550,530,250,250,290,370,320,640,270,150,450,250,330,70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140]},{"name":"Other","color":"#F79E39","values":[60,20,30,0,20,90,170,170,190,240,320,310,260,320,250,290,460,380,260,380,430,370,290,200,110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,40,20,20,20,0,20,0,20,0,0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/03.json b/public/chartDummyData/views_zoom/2018-12/03.json new file mode 100644 index 000000000..65f6fee47 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543536000000,1543539600000,1543543200000,1543546800000,1543550400000,1543554000000,1543557600000,1543561200000,1543564800000,1543568400000,1543572000000,1543575600000,1543579200000,1543582800000,1543586400000,1543590000000,1543593600000,1543597200000,1543600800000,1543604400000,1543608000000,1543611600000,1543615200000,1543618800000,1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[540,180,70,30,50,390,780,1000,1620,1870,1800,1910,1950,1840,2010,1860,1840,2230,2370,1920,2190,1930,1430,1350,680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100]},{"name":"URL","color":"#2373DB","values":[390,110,120,60,10,60,510,790,980,1250,1020,1930,1970,2020,1840,2540,2330,2740,2510,2380,1780,2110,1260,950,530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760]},{"name":"Groups","color":"#9ED448","values":[650,230,100,40,50,250,1110,1020,1940,1540,1440,1490,1950,2220,1520,1440,1640,1740,1750,1830,2160,2350,2100,1910,940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460]},{"name":"Channel","color":"#4fae4e","values":[90,20,20,0,30,40,50,30,80,300,100,80,130,140,160,290,100,160,170,140,160,190,150,150,30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110]},{"name":"Search","color":"#F5BD25","values":[70,50,0,20,10,260,460,580,90,350,440,480,50,200,200,170,240,220,200,320,230,200,60,60,80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170]},{"name":"Other","color":"#F79E39","values":[110,40,30,10,10,20,220,140,220,290,250,240,190,290,330,310,300,360,340,370,350,290,190,190,110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,0,0,0,10,0,0,0,0,10,30,0,50,10,0,0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/04.json b/public/chartDummyData/views_zoom/2018-12/04.json new file mode 100644 index 000000000..14805a718 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543622400000,1543626000000,1543629600000,1543633200000,1543636800000,1543640400000,1543644000000,1543647600000,1543651200000,1543654800000,1543658400000,1543662000000,1543665600000,1543669200000,1543672800000,1543676400000,1543680000000,1543683600000,1543687200000,1543690800000,1543694400000,1543698000000,1543701600000,1543705200000,1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[680,320,80,50,90,160,440,850,1220,1670,2030,1990,1960,1990,2190,2400,2250,2200,2090,2010,2620,2090,1770,1290,780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290]},{"name":"URL","color":"#2373DB","values":[530,180,110,30,20,80,240,390,900,1440,1580,2030,1960,1540,1770,1860,2090,1980,1660,1580,1580,1650,1010,820,840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830]},{"name":"Groups","color":"#9ED448","values":[940,390,230,50,160,130,630,630,1370,1240,1020,1670,2140,1800,1530,1390,1530,1520,1910,1480,2100,1510,2540,1760,1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620]},{"name":"Channel","color":"#4fae4e","values":[30,70,60,10,0,10,20,20,90,80,120,100,140,170,160,110,210,130,80,130,200,120,100,60,80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90]},{"name":"Search","color":"#F5BD25","values":[80,10,0,10,0,120,270,610,570,210,170,130,190,370,150,190,110,300,160,90,490,280,260,50,90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170]},{"name":"Other","color":"#F79E39","values":[110,30,0,10,40,10,10,60,240,200,280,350,200,280,270,200,360,270,240,210,330,300,330,220,190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,20,40,10,10,10,20,10,20,0,0,30,0,20,0,10,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/05.json b/public/chartDummyData/views_zoom/2018-12/05.json new file mode 100644 index 000000000..2a8ba260a --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543708800000,1543712400000,1543716000000,1543719600000,1543723200000,1543726800000,1543730400000,1543734000000,1543737600000,1543741200000,1543744800000,1543748400000,1543752000000,1543755600000,1543759200000,1543762800000,1543766400000,1543770000000,1543773600000,1543777200000,1543780800000,1543784400000,1543788000000,1543791600000,1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[780,560,150,80,20,60,170,620,1020,1630,1680,1930,2230,2610,2290,2650,2700,2580,2330,2200,2520,2380,2150,1380,820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190]},{"name":"URL","color":"#2373DB","values":[840,550,210,50,10,60,90,370,480,1030,1330,1430,1420,1460,1270,1460,1530,1670,1730,1630,1530,1830,1360,930,430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540]},{"name":"Groups","color":"#9ED448","values":[1030,760,340,170,60,60,270,690,1140,1580,1220,1750,1530,1510,1760,1600,1690,1650,2170,1810,2550,2940,2460,1380,700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610]},{"name":"Channel","color":"#4fae4e","values":[80,40,10,0,0,0,0,50,100,140,140,190,150,180,220,170,150,240,360,170,150,230,130,100,100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100]},{"name":"Search","color":"#F5BD25","values":[90,140,10,20,10,0,100,780,250,640,160,440,670,290,90,280,270,440,660,250,360,420,110,40,30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380]},{"name":"Other","color":"#F79E39","values":[190,50,40,10,0,20,20,60,200,320,340,340,280,240,230,230,280,280,360,340,350,480,260,230,90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,20,20,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/06.json b/public/chartDummyData/views_zoom/2018-12/06.json new file mode 100644 index 000000000..311582553 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543795200000,1543798800000,1543802400000,1543806000000,1543809600000,1543813200000,1543816800000,1543820400000,1543824000000,1543827600000,1543831200000,1543834800000,1543838400000,1543842000000,1543845600000,1543849200000,1543852800000,1543856400000,1543860000000,1543863600000,1543867200000,1543870800000,1543874400000,1543878000000,1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[820,190,310,60,70,170,600,980,1450,1260,1380,1780,1790,1940,2240,2070,2020,2240,2490,2630,2590,2880,2040,1200,870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170]},{"name":"URL","color":"#2373DB","values":[430,210,100,100,30,110,360,480,790,1020,1290,1770,1710,1850,1920,1980,2610,2890,2370,2390,2360,1830,1600,1030,420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050]},{"name":"Groups","color":"#9ED448","values":[700,410,130,90,60,350,870,820,1090,1150,1440,1340,1880,1910,1970,1870,1890,2690,2400,2320,2840,3170,2710,1510,940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660]},{"name":"Channel","color":"#4fae4e","values":[100,100,0,10,20,0,40,40,50,120,110,140,120,190,310,150,180,220,250,170,240,220,110,60,140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130]},{"name":"Search","color":"#F5BD25","values":[30,30,50,0,30,490,540,230,90,130,150,360,220,280,250,130,210,260,410,230,400,460,210,40,40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120]},{"name":"Other","color":"#F79E39","values":[90,70,50,20,0,60,80,90,220,310,280,270,290,350,260,260,210,310,340,280,430,440,470,190,60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,20,0,10,20,0,10,30,0,10,30,20,0,0,10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/07.json b/public/chartDummyData/views_zoom/2018-12/07.json new file mode 100644 index 000000000..23d7e61a2 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543881600000,1543885200000,1543888800000,1543892400000,1543896000000,1543899600000,1543903200000,1543906800000,1543910400000,1543914000000,1543917600000,1543921200000,1543924800000,1543928400000,1543932000000,1543935600000,1543939200000,1543942800000,1543946400000,1543950000000,1543953600000,1543957200000,1543960800000,1543964400000,1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[870,370,110,40,100,170,790,880,1140,1290,1440,1510,1740,2170,2160,2360,2630,2610,2380,3110,3060,2860,2080,1370,680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440]},{"name":"URL","color":"#2373DB","values":[420,190,130,30,50,150,410,840,840,1200,1340,1720,1910,1970,1750,1980,2570,3020,2620,2450,1630,2110,1310,990,500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560]},{"name":"Groups","color":"#9ED448","values":[940,210,110,60,110,380,910,1100,1150,1120,1490,1220,1670,2000,1640,1570,1970,2090,2140,2110,2260,3060,2640,1670,600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570]},{"name":"Channel","color":"#4fae4e","values":[140,20,0,30,0,10,20,50,60,40,50,70,180,100,100,240,160,80,120,230,210,170,180,190,30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200]},{"name":"Search","color":"#F5BD25","values":[40,20,30,0,0,110,300,610,260,200,230,340,180,360,100,140,170,170,240,190,270,120,200,70,170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30]},{"name":"Other","color":"#F79E39","values":[60,80,10,10,10,90,280,210,330,240,300,300,380,250,290,240,190,280,240,300,350,380,340,300,90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,10,0,10,0,0,0,0,0,0,30,10,20,20,30,10,40,10,0,0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/08.json b/public/chartDummyData/views_zoom/2018-12/08.json new file mode 100644 index 000000000..e4fa94b29 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1543968000000,1543971600000,1543975200000,1543978800000,1543982400000,1543986000000,1543989600000,1543993200000,1543996800000,1544000400000,1544004000000,1544007600000,1544011200000,1544014800000,1544018400000,1544022000000,1544025600000,1544029200000,1544032800000,1544036400000,1544040000000,1544043600000,1544047200000,1544050800000,1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[680,160,90,160,90,260,810,1100,1190,1510,1720,2160,1990,2650,2100,2350,1910,2310,2160,2770,2540,2580,1670,1070,510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150]},{"name":"URL","color":"#2373DB","values":[500,270,120,20,50,170,430,800,1070,1330,1250,1750,2120,1870,1630,1740,2650,2380,2650,2240,2070,1790,1670,900,490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880]},{"name":"Groups","color":"#9ED448","values":[600,220,220,40,100,430,840,1120,1390,2130,1460,1430,1700,2120,1640,1490,2270,1690,1940,2330,2620,2540,2860,1910,620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840]},{"name":"Channel","color":"#4fae4e","values":[30,20,10,0,10,0,50,10,130,140,170,110,220,150,180,190,150,200,170,190,70,140,100,170,30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110]},{"name":"Search","color":"#F5BD25","values":[170,100,0,0,0,380,150,310,150,90,280,380,280,300,190,320,430,260,130,240,440,200,170,140,40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160]},{"name":"Other","color":"#F79E39","values":[90,40,120,30,0,30,150,240,200,220,180,260,200,450,240,270,300,390,320,360,420,590,290,160,130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,20,20,10,0,0,20,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/09.json b/public/chartDummyData/views_zoom/2018-12/09.json new file mode 100644 index 000000000..5b9261c07 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544054400000,1544058000000,1544061600000,1544065200000,1544068800000,1544072400000,1544076000000,1544079600000,1544083200000,1544086800000,1544090400000,1544094000000,1544097600000,1544101200000,1544104800000,1544108400000,1544112000000,1544115600000,1544119200000,1544122800000,1544126400000,1544130000000,1544133600000,1544137200000,1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,190,70,50,40,190,690,820,1410,1680,2230,2090,2020,1870,2350,2600,2270,2510,2410,2580,2240,2280,2130,1100,520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210]},{"name":"URL","color":"#2373DB","values":[490,190,60,0,20,160,550,940,900,1290,1500,2150,2050,1680,2190,2060,2400,2990,2820,2310,2190,1890,1440,760,330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900]},{"name":"Groups","color":"#9ED448","values":[620,440,70,160,90,450,960,1110,1110,1400,1330,1530,1770,1600,1720,1560,1770,1620,1750,1910,2940,2690,2720,1460,880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700]},{"name":"Channel","color":"#4fae4e","values":[30,20,0,70,10,0,20,100,110,100,180,40,50,160,150,100,90,170,130,110,160,200,160,110,70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50]},{"name":"Search","color":"#F5BD25","values":[40,30,0,30,80,160,240,770,290,270,280,260,150,230,230,250,290,170,380,560,320,420,480,170,20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130]},{"name":"Other","color":"#F79E39","values":[130,30,10,0,20,50,100,250,220,260,280,270,260,350,290,340,240,410,390,390,370,390,360,190,70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,30,30,10,20,10,30,10,10,30,20,10,20,20,20,0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/10.json b/public/chartDummyData/views_zoom/2018-12/10.json new file mode 100644 index 000000000..99377d710 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544140800000,1544144400000,1544148000000,1544151600000,1544155200000,1544158800000,1544162400000,1544166000000,1544169600000,1544173200000,1544176800000,1544180400000,1544184000000,1544187600000,1544191200000,1544194800000,1544198400000,1544202000000,1544205600000,1544209200000,1544212800000,1544216400000,1544220000000,1544223600000,1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[520,260,190,50,80,270,870,940,1310,1790,1760,1870,2050,1980,2150,2400,2010,2050,2150,2110,2840,2190,1810,1290,580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050]},{"name":"URL","color":"#2373DB","values":[330,130,120,60,40,90,630,670,1260,1500,1720,2060,1960,2390,2240,2360,2490,2780,2700,2140,1810,1520,1060,830,610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640]},{"name":"Groups","color":"#9ED448","values":[880,200,160,90,70,280,860,1020,1160,1240,1450,1190,1440,1720,1740,1600,1880,1670,1460,2000,2230,2090,2130,1620,1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480]},{"name":"Channel","color":"#4fae4e","values":[70,30,0,10,0,10,30,60,50,50,40,160,140,90,150,90,190,190,130,160,200,100,160,90,30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130]},{"name":"Search","color":"#F5BD25","values":[20,20,20,0,20,310,350,150,290,250,180,410,330,440,160,270,200,230,140,300,80,150,170,170,40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100]},{"name":"Other","color":"#F79E39","values":[70,60,20,0,20,120,170,200,210,210,280,430,290,470,430,280,320,270,290,320,370,250,270,160,90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,10,0,0,10,10,0,10,0,20,30,20,0,20,30,0,0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/11.json b/public/chartDummyData/views_zoom/2018-12/11.json new file mode 100644 index 000000000..c56f6b4bf --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544227200000,1544230800000,1544234400000,1544238000000,1544241600000,1544245200000,1544248800000,1544252400000,1544256000000,1544259600000,1544263200000,1544266800000,1544270400000,1544274000000,1544277600000,1544281200000,1544284800000,1544288400000,1544292000000,1544295600000,1544299200000,1544302800000,1544306400000,1544310000000,1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[580,330,220,100,80,170,370,890,1140,1540,2020,2520,2500,2790,1950,2330,1810,1980,2420,2100,2160,2000,1650,1190,960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400]},{"name":"URL","color":"#2373DB","values":[610,330,170,50,40,20,130,220,630,1150,1430,2010,1430,1400,1660,1530,1730,1610,1800,1600,1430,1100,980,540,620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120]},{"name":"Groups","color":"#9ED448","values":[1080,510,230,70,110,80,260,560,1010,1440,1370,1310,1370,1710,1660,1250,1430,1610,1530,1470,1610,1840,1870,1610,1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610]},{"name":"Channel","color":"#4fae4e","values":[30,100,20,0,10,10,30,70,40,80,200,140,100,90,220,140,50,160,120,80,210,120,80,100,250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50]},{"name":"Search","color":"#F5BD25","values":[40,20,190,0,0,0,60,360,230,240,340,430,220,290,230,320,210,240,120,450,260,330,150,380,100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80]},{"name":"Other","color":"#F79E39","values":[90,80,60,20,30,10,20,130,250,320,270,390,290,420,230,270,250,310,300,380,210,290,220,300,120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,20,0,20,0,20,0,10,10,10,10,0,10,10,0,10,0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/12.json b/public/chartDummyData/views_zoom/2018-12/12.json new file mode 100644 index 000000000..7fd43be2d --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544313600000,1544317200000,1544320800000,1544324400000,1544328000000,1544331600000,1544335200000,1544338800000,1544342400000,1544346000000,1544349600000,1544353200000,1544356800000,1544360400000,1544364000000,1544367600000,1544371200000,1544374800000,1544378400000,1544382000000,1544385600000,1544389200000,1544392800000,1544396400000,1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[960,350,170,170,20,60,200,560,1250,1480,2210,3090,2090,2660,2690,2110,2770,2960,2420,2410,2600,2790,2160,1170,600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230]},{"name":"URL","color":"#2373DB","values":[620,520,100,40,30,20,70,210,490,930,1360,1810,1470,1500,1450,1370,1590,1770,1800,1820,1890,1540,1220,1050,370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680]},{"name":"Groups","color":"#9ED448","values":[1180,790,380,120,70,30,180,440,950,1170,1530,1720,1390,1640,1760,1380,1480,1720,2150,1940,2470,3300,3230,1660,850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090]},{"name":"Channel","color":"#4fae4e","values":[250,20,50,0,10,0,10,50,60,120,80,150,130,250,190,120,150,260,210,160,190,150,180,130,10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70]},{"name":"Search","color":"#F5BD25","values":[100,50,10,20,0,60,20,270,140,480,180,160,570,130,330,280,330,230,220,230,430,210,210,120,40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150]},{"name":"Other","color":"#F79E39","values":[120,60,20,40,10,20,30,120,220,220,380,430,280,220,270,180,270,340,260,260,310,340,260,300,120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,30,10,10,0,30,50,0,0,0,10,10,0,10,0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/13.json b/public/chartDummyData/views_zoom/2018-12/13.json new file mode 100644 index 000000000..b12d16ed1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544400000000,1544403600000,1544407200000,1544410800000,1544414400000,1544418000000,1544421600000,1544425200000,1544428800000,1544432400000,1544436000000,1544439600000,1544443200000,1544446800000,1544450400000,1544454000000,1544457600000,1544461200000,1544464800000,1544468400000,1544472000000,1544475600000,1544479200000,1544482800000,1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,200,140,40,80,240,580,830,1370,1360,1990,1650,1860,2360,1990,2590,2170,2740,2650,2720,2960,2650,2160,1440,400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450]},{"name":"URL","color":"#2373DB","values":[370,380,50,0,10,80,340,730,1050,1290,1640,1630,2060,1880,1660,1960,2220,2390,2340,2400,2510,1560,1230,560,350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880]},{"name":"Groups","color":"#9ED448","values":[850,500,100,50,110,350,640,1130,860,1310,1690,1440,1890,1650,2350,1920,1410,2230,1810,2070,2970,3760,2880,1570,540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770]},{"name":"Channel","color":"#4fae4e","values":[10,70,30,10,10,20,40,40,150,40,60,50,80,120,100,210,150,150,250,240,230,160,180,200,60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130]},{"name":"Search","color":"#F5BD25","values":[40,0,20,0,10,210,230,180,140,110,170,420,280,140,130,200,110,310,200,230,340,170,120,30,30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490]},{"name":"Other","color":"#F79E39","values":[120,110,10,10,20,10,110,100,140,270,250,260,320,260,400,370,240,280,290,500,370,310,240,170,60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,20,10,0,30,20,10,0,0,30,0,0,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/14.json b/public/chartDummyData/views_zoom/2018-12/14.json new file mode 100644 index 000000000..96514fde3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544486400000,1544490000000,1544493600000,1544497200000,1544500800000,1544504400000,1544508000000,1544511600000,1544515200000,1544518800000,1544522400000,1544526000000,1544529600000,1544533200000,1544536800000,1544540400000,1544544000000,1544547600000,1544551200000,1544554800000,1544558400000,1544562000000,1544565600000,1544569200000,1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[400,220,60,50,50,230,530,1010,1230,1240,1780,2060,2090,2010,1830,2010,2200,2140,2630,2600,2590,2160,1770,1150,480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090]},{"name":"URL","color":"#2373DB","values":[350,230,70,30,0,80,430,680,960,1060,1420,1980,1980,1900,1770,1930,2240,3080,3070,2250,2160,1560,1350,880,320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870]},{"name":"Groups","color":"#9ED448","values":[540,490,130,70,50,310,870,1020,1180,1810,1200,1660,1680,1670,1700,1240,1560,1700,2070,1860,2570,3220,2810,1840,650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020]},{"name":"Channel","color":"#4fae4e","values":[60,20,20,10,0,40,40,10,80,130,80,170,70,90,120,260,90,230,140,170,110,250,170,110,80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70]},{"name":"Search","color":"#F5BD25","values":[30,70,20,20,30,40,280,220,280,170,160,270,210,130,690,830,470,330,230,170,280,320,70,160,40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410]},{"name":"Other","color":"#F79E39","values":[60,20,10,10,30,60,130,140,170,190,290,320,340,310,320,220,190,330,530,310,360,420,230,190,110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,20,0,0,10,10,0,0,0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/15.json b/public/chartDummyData/views_zoom/2018-12/15.json new file mode 100644 index 000000000..ea198ef4e --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544572800000,1544576400000,1544580000000,1544583600000,1544587200000,1544590800000,1544594400000,1544598000000,1544601600000,1544605200000,1544608800000,1544612400000,1544616000000,1544619600000,1544623200000,1544626800000,1544630400000,1544634000000,1544637600000,1544641200000,1544644800000,1544648400000,1544652000000,1544655600000,1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[480,230,100,40,80,190,640,880,1440,1660,1500,1800,1790,1780,2070,2210,2100,2190,2430,1910,2810,2060,1910,1210,660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400]},{"name":"URL","color":"#2373DB","values":[320,190,100,70,50,70,310,660,1040,1540,1570,1530,1840,1970,1900,1800,2330,2740,2550,2270,2360,1920,1580,900,280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720]},{"name":"Groups","color":"#9ED448","values":[650,210,110,200,100,370,790,1050,1390,1250,1130,1210,1630,1830,1960,1590,1830,2220,1970,2180,2010,2960,2730,1700,700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840]},{"name":"Channel","color":"#4fae4e","values":[80,20,10,20,10,20,20,40,40,50,70,90,110,130,160,170,160,230,130,150,130,180,110,50,40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310]},{"name":"Search","color":"#F5BD25","values":[40,10,10,20,10,140,170,100,90,180,130,330,170,250,80,160,140,240,270,340,210,230,110,130,40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140]},{"name":"Other","color":"#F79E39","values":[110,70,0,10,10,70,160,230,180,220,270,310,340,260,220,330,380,260,380,240,370,380,310,150,120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,10,20,10,0,0,0,20,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/16.json b/public/chartDummyData/views_zoom/2018-12/16.json new file mode 100644 index 000000000..af1716d06 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544659200000,1544662800000,1544666400000,1544670000000,1544673600000,1544677200000,1544680800000,1544684400000,1544688000000,1544691600000,1544695200000,1544698800000,1544702400000,1544706000000,1544709600000,1544713200000,1544716800000,1544720400000,1544724000000,1544727600000,1544731200000,1544734800000,1544738400000,1544742000000,1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[660,260,130,100,100,380,590,1030,1500,1320,1760,1850,2240,2120,2340,2290,2080,2220,2230,2470,2560,2270,1720,1050,530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300]},{"name":"URL","color":"#2373DB","values":[280,210,60,40,50,120,410,860,900,1130,1900,1820,2190,1850,1890,2300,2150,2540,2600,2300,2310,1930,1430,640,540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870]},{"name":"Groups","color":"#9ED448","values":[700,200,40,40,70,470,710,700,1090,1090,1230,1340,1490,1870,1430,1460,1460,1920,1920,2130,2510,3170,2830,1480,820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490]},{"name":"Channel","color":"#4fae4e","values":[40,110,10,10,0,20,60,60,20,70,120,160,190,80,110,220,110,180,190,160,90,170,170,130,30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120]},{"name":"Search","color":"#F5BD25","values":[40,0,0,0,0,130,350,220,230,190,210,210,130,350,320,300,140,430,540,160,230,250,140,100,140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100]},{"name":"Other","color":"#F79E39","values":[120,60,20,20,30,50,110,170,200,230,240,280,280,380,300,400,230,270,360,360,370,350,350,160,130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,20,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/17.json b/public/chartDummyData/views_zoom/2018-12/17.json new file mode 100644 index 000000000..31147a99c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544745600000,1544749200000,1544752800000,1544756400000,1544760000000,1544763600000,1544767200000,1544770800000,1544774400000,1544778000000,1544781600000,1544785200000,1544788800000,1544792400000,1544796000000,1544799600000,1544803200000,1544806800000,1544810400000,1544814000000,1544817600000,1544821200000,1544824800000,1544828400000,1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[530,200,210,40,160,260,640,850,1390,1630,1670,1890,1790,1600,2270,1940,1790,2040,2290,2360,2520,1860,1610,1400,810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170]},{"name":"URL","color":"#2373DB","values":[540,200,90,30,40,80,430,750,1070,1100,1400,1820,1710,1860,2130,1960,2120,2670,2610,1980,2130,1520,1190,1120,480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010]},{"name":"Groups","color":"#9ED448","values":[820,350,80,90,60,400,770,1130,1160,1180,1250,1580,1810,1960,1520,1760,1930,1680,1700,2020,2190,2100,2350,1610,780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120]},{"name":"Channel","color":"#4fae4e","values":[30,10,30,0,20,10,80,80,100,50,90,110,50,110,180,130,120,240,210,140,250,150,160,50,320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130]},{"name":"Search","color":"#F5BD25","values":[140,0,20,0,40,110,260,320,170,90,180,380,390,280,200,90,250,160,230,240,380,430,90,80,160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60]},{"name":"Other","color":"#F79E39","values":[130,40,40,30,20,50,240,210,280,250,240,260,250,260,250,240,250,260,240,340,450,260,260,180,140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,30,20,0,0,20,10,20,0,20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/18.json b/public/chartDummyData/views_zoom/2018-12/18.json new file mode 100644 index 000000000..ba4dc92e7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544832000000,1544835600000,1544839200000,1544842800000,1544846400000,1544850000000,1544853600000,1544857200000,1544860800000,1544864400000,1544868000000,1544871600000,1544875200000,1544878800000,1544882400000,1544886000000,1544889600000,1544893200000,1544896800000,1544900400000,1544904000000,1544907600000,1544911200000,1544914800000,1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[810,330,200,40,100,170,280,950,1050,1600,1780,2070,1900,2240,2280,2040,2080,2460,2190,1730,2300,1940,1540,1230,1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060]},{"name":"URL","color":"#2373DB","values":[480,130,90,20,60,50,90,650,960,1240,1930,1840,1690,1390,1870,1670,2050,2170,2060,1690,1630,1390,900,680,350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910]},{"name":"Groups","color":"#9ED448","values":[780,570,130,100,50,110,500,630,1190,1310,1290,1500,1720,1870,1660,1230,1540,1620,1980,1960,1880,1860,2230,2090,940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090]},{"name":"Channel","color":"#4fae4e","values":[320,40,20,0,0,0,80,80,40,110,120,50,90,190,170,170,130,220,80,50,210,70,140,70,100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130]},{"name":"Search","color":"#F5BD25","values":[160,20,20,0,10,20,70,230,200,150,280,700,200,440,230,100,320,250,390,610,180,200,80,150,110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140]},{"name":"Other","color":"#F79E39","values":[140,50,40,20,20,10,80,110,180,480,320,250,310,420,170,250,360,300,190,230,290,290,170,70,150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150]},{"name":"PM","color":"#E65850","values":[20,0,0,0,0,0,0,0,0,0,0,20,40,10,10,20,10,0,10,10,0,10,0,20,0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/19.json b/public/chartDummyData/views_zoom/2018-12/19.json new file mode 100644 index 000000000..e998b2ab3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1544918400000,1544922000000,1544925600000,1544929200000,1544932800000,1544936400000,1544940000000,1544943600000,1544947200000,1544950800000,1544954400000,1544958000000,1544961600000,1544965200000,1544968800000,1544972400000,1544976000000,1544979600000,1544983200000,1544986800000,1544990400000,1544994000000,1544997600000,1545001200000,1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1070,510,270,90,70,100,340,460,1060,1570,2190,2130,2080,2060,1870,1960,1610,2300,2020,2230,2480,2590,2220,1450,610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420]},{"name":"URL","color":"#2373DB","values":[350,270,160,210,140,100,110,220,520,780,1390,1920,1470,1410,1790,1270,1900,1980,2180,1770,1710,1250,1400,880,350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710]},{"name":"Groups","color":"#9ED448","values":[940,460,450,180,80,150,80,600,1100,1090,1480,1690,1460,1180,1570,1690,1150,1770,1640,1690,2040,2670,2690,1770,970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450]},{"name":"Channel","color":"#4fae4e","values":[100,10,10,10,0,10,10,100,110,110,100,200,180,270,120,150,170,90,210,230,220,260,170,130,120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100]},{"name":"Search","color":"#F5BD25","values":[110,60,70,0,10,20,50,190,150,110,250,310,280,580,210,290,120,230,180,280,230,210,160,490,40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180]},{"name":"Other","color":"#F79E39","values":[150,50,50,30,0,20,60,120,180,380,330,230,330,300,380,320,180,220,250,390,350,300,250,280,70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190]},{"name":"PM","color":"#E65850","values":[0,0,10,0,0,0,0,10,10,0,20,10,0,20,10,0,0,0,10,0,0,0,0,0,20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/20.json b/public/chartDummyData/views_zoom/2018-12/20.json new file mode 100644 index 000000000..e03a29f17 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545004800000,1545008400000,1545012000000,1545015600000,1545019200000,1545022800000,1545026400000,1545030000000,1545033600000,1545037200000,1545040800000,1545044400000,1545048000000,1545051600000,1545055200000,1545058800000,1545062400000,1545066000000,1545069600000,1545073200000,1545076800000,1545080400000,1545084000000,1545087600000,1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[610,390,160,30,10,220,670,1030,1290,1690,1720,1920,2030,2080,2090,2100,1950,2250,2470,2590,2940,2510,1920,1090,730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720]},{"name":"URL","color":"#2373DB","values":[350,110,10,50,30,60,320,610,990,1260,1550,1570,1730,2110,1740,1800,2210,2380,2460,2490,1800,1770,1340,870,430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910]},{"name":"Groups","color":"#9ED448","values":[970,480,80,50,60,190,680,920,1410,1050,1420,1640,1640,1660,1420,1670,1910,1700,1690,1990,2670,2860,2450,2020,890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160]},{"name":"Channel","color":"#4fae4e","values":[120,50,10,20,10,10,0,60,60,110,220,120,30,220,210,130,170,170,220,290,110,240,180,70,70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50]},{"name":"Search","color":"#F5BD25","values":[40,20,10,0,10,30,230,170,280,200,240,620,230,110,170,110,110,230,440,120,230,200,140,410,190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190]},{"name":"Other","color":"#F79E39","values":[70,20,20,10,0,30,100,140,170,280,170,200,340,320,280,260,420,400,390,320,370,290,270,160,90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150]},{"name":"PM","color":"#E65850","values":[20,0,0,0,0,10,0,10,10,10,0,0,0,0,0,30,10,0,0,20,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/21.json b/public/chartDummyData/views_zoom/2018-12/21.json new file mode 100644 index 000000000..74d23876b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545091200000,1545094800000,1545098400000,1545102000000,1545105600000,1545109200000,1545112800000,1545116400000,1545120000000,1545123600000,1545127200000,1545130800000,1545134400000,1545138000000,1545141600000,1545145200000,1545148800000,1545152400000,1545156000000,1545159600000,1545163200000,1545166800000,1545170400000,1545174000000,1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[730,290,120,70,140,220,740,730,1470,2160,1890,2040,1960,1840,1990,2090,2700,2200,2320,2490,2910,2530,2270,1400,550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640]},{"name":"URL","color":"#2373DB","values":[430,260,10,0,10,70,380,820,920,1440,1580,1840,2050,2020,1770,2170,2380,3330,2800,2570,1990,1640,1510,720,460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890]},{"name":"Groups","color":"#9ED448","values":[890,190,120,40,70,410,640,880,1280,1300,1200,1580,1700,1590,1620,1410,1620,1820,1550,2100,2390,3310,2510,1840,890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800]},{"name":"Channel","color":"#4fae4e","values":[70,90,0,0,10,0,40,40,20,90,50,140,170,70,170,180,140,110,140,150,200,210,340,310,70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220]},{"name":"Search","color":"#F5BD25","values":[190,40,20,10,10,40,210,180,610,370,150,310,700,540,200,230,140,90,290,610,210,250,130,140,50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200]},{"name":"Other","color":"#F79E39","values":[90,30,10,10,10,50,150,220,180,250,270,160,250,310,320,240,340,340,260,290,540,350,370,180,60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,0,10,10,10,30,0,10,10,0,20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/22.json b/public/chartDummyData/views_zoom/2018-12/22.json new file mode 100644 index 000000000..03b20c650 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545177600000,1545181200000,1545184800000,1545188400000,1545192000000,1545195600000,1545199200000,1545202800000,1545206400000,1545210000000,1545213600000,1545217200000,1545220800000,1545224400000,1545228000000,1545231600000,1545235200000,1545238800000,1545242400000,1545246000000,1545249600000,1545253200000,1545256800000,1545260400000,1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[550,290,170,80,40,180,690,810,1350,1910,2000,2300,2160,1780,2140,2120,2090,2280,2150,2340,2180,2480,1800,1300,450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090]},{"name":"URL","color":"#2373DB","values":[460,270,30,10,20,90,520,890,1050,1370,1510,1830,2400,2040,2120,1780,2270,2930,2660,2550,2620,1740,1640,870,440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840]},{"name":"Groups","color":"#9ED448","values":[890,360,200,60,70,190,590,830,1230,1370,1040,1270,1710,1920,1570,1330,1550,1560,1550,2100,2600,2920,2630,1490,670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890]},{"name":"Channel","color":"#4fae4e","values":[70,80,0,10,0,0,30,70,90,150,60,110,90,200,180,130,130,170,190,210,180,320,90,120,100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140]},{"name":"Search","color":"#F5BD25","values":[50,10,20,0,20,60,190,310,320,200,110,440,210,310,60,190,210,270,180,200,180,160,150,100,40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180]},{"name":"Other","color":"#F79E39","values":[60,70,10,20,20,10,120,250,200,200,330,200,310,260,320,120,180,420,320,170,300,330,240,160,80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260]},{"name":"PM","color":"#E65850","values":[20,0,0,0,0,0,0,10,30,10,0,10,30,10,0,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/23.json b/public/chartDummyData/views_zoom/2018-12/23.json new file mode 100644 index 000000000..6c0470b64 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545264000000,1545267600000,1545271200000,1545274800000,1545278400000,1545282000000,1545285600000,1545289200000,1545292800000,1545296400000,1545300000000,1545303600000,1545307200000,1545310800000,1545314400000,1545318000000,1545321600000,1545325200000,1545328800000,1545332400000,1545336000000,1545339600000,1545343200000,1545346800000,1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,190,50,70,90,200,370,1020,1220,1810,2230,1840,1820,2160,2130,2290,2190,2340,2040,2190,1950,1980,1620,1170,570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630]},{"name":"URL","color":"#2373DB","values":[440,160,110,20,10,100,460,920,1180,1500,1920,1900,2290,2200,2040,2550,2280,2900,2760,2580,2720,1610,1380,1010,490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660]},{"name":"Groups","color":"#9ED448","values":[670,380,120,100,140,310,710,1100,1150,1130,1320,1330,1670,1420,1900,1400,1540,1820,1650,2080,2420,2560,2810,2120,870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980]},{"name":"Channel","color":"#4fae4e","values":[100,20,10,40,0,10,20,110,40,60,180,200,70,110,110,220,180,220,100,190,190,270,170,130,60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120]},{"name":"Search","color":"#F5BD25","values":[40,20,0,0,0,80,120,300,160,230,780,880,160,150,360,170,230,320,240,320,210,180,140,60,70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130]},{"name":"Other","color":"#F79E39","values":[80,30,30,10,10,20,140,200,210,340,280,210,300,240,280,320,230,300,260,360,450,280,380,290,120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,20,20,10,20,20,20,0,0,0,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/24.json b/public/chartDummyData/views_zoom/2018-12/24.json new file mode 100644 index 000000000..5df2951f3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545350400000,1545354000000,1545357600000,1545361200000,1545364800000,1545368400000,1545372000000,1545375600000,1545379200000,1545382800000,1545386400000,1545390000000,1545393600000,1545397200000,1545400800000,1545404400000,1545408000000,1545411600000,1545415200000,1545418800000,1545422400000,1545426000000,1545429600000,1545433200000,1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[570,300,110,150,180,200,600,840,1330,1580,1940,1740,1880,2220,2000,1680,2020,1920,1960,2070,2440,2000,1760,1060,840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030]},{"name":"URL","color":"#2373DB","values":[490,300,120,40,20,100,580,770,1280,1460,1820,1820,2230,2310,2010,2360,2890,2820,3050,2490,1960,1820,1490,910,590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210]},{"name":"Groups","color":"#9ED448","values":[870,470,120,90,80,320,1170,910,1210,1150,1160,1440,1550,1470,1750,1510,1870,1610,1850,2130,1700,2300,2220,2090,1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920]},{"name":"Channel","color":"#4fae4e","values":[60,20,10,0,0,20,50,60,40,60,90,70,140,170,160,70,160,180,90,140,160,150,170,130,160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140]},{"name":"Search","color":"#F5BD25","values":[70,110,10,30,0,30,130,220,160,120,800,170,290,210,130,240,270,120,170,280,190,430,110,140,130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550]},{"name":"Other","color":"#F79E39","values":[120,70,0,10,10,150,150,170,230,240,230,310,310,270,170,310,170,320,280,380,310,340,300,150,110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,10,0,30,10,0,20,20,20,0,20,40,20,0,0,0,10,10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/25.json b/public/chartDummyData/views_zoom/2018-12/25.json new file mode 100644 index 000000000..1feb3b6fa --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545436800000,1545440400000,1545444000000,1545447600000,1545451200000,1545454800000,1545458400000,1545462000000,1545465600000,1545469200000,1545472800000,1545476400000,1545480000000,1545483600000,1545487200000,1545490800000,1545494400000,1545498000000,1545501600000,1545505200000,1545508800000,1545512400000,1545516000000,1545519600000,1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[840,220,170,100,90,190,540,650,1040,1620,1610,2150,2270,2540,2920,2000,1980,2330,1750,1760,1830,1570,1860,1420,810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650]},{"name":"URL","color":"#2373DB","values":[590,150,120,80,30,70,190,410,870,1570,1820,1820,1910,1930,2150,1720,2120,1950,1890,1550,1730,1470,970,710,460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130]},{"name":"Groups","color":"#9ED448","values":[1360,490,260,170,60,140,590,780,1220,1500,1580,1760,1680,1680,1620,1230,1440,1610,1430,1350,1760,2080,1760,1450,1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780]},{"name":"Channel","color":"#4fae4e","values":[160,50,10,20,0,10,10,200,90,130,90,110,170,210,100,270,140,230,200,70,110,90,150,100,40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220]},{"name":"Search","color":"#F5BD25","values":[130,20,0,0,0,60,60,140,320,140,210,110,210,680,160,120,180,110,130,120,170,160,220,180,50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360]},{"name":"Other","color":"#F79E39","values":[110,150,60,20,10,20,60,130,190,280,300,250,310,230,350,240,280,190,250,250,260,290,230,190,80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,10,30,10,0,10,0,0,20,0,30,10,10,0,10,10,10,0,0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/26.json b/public/chartDummyData/views_zoom/2018-12/26.json new file mode 100644 index 000000000..99d2b295c --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545523200000,1545526800000,1545530400000,1545534000000,1545537600000,1545541200000,1545544800000,1545548400000,1545552000000,1545555600000,1545559200000,1545562800000,1545566400000,1545570000000,1545573600000,1545577200000,1545580800000,1545584400000,1545588000000,1545591600000,1545595200000,1545598800000,1545602400000,1545606000000,1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[810,510,190,170,90,60,340,550,890,1980,2150,2340,1880,2260,2320,2280,1750,1800,2010,2060,1870,2290,2040,1720,1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920]},{"name":"URL","color":"#2373DB","values":[460,230,110,70,10,20,20,400,700,1010,1350,1910,1480,1470,1590,1500,1340,1900,1770,1810,1570,1070,1000,910,390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870]},{"name":"Groups","color":"#9ED448","values":[1090,1040,340,200,40,90,240,650,1520,2060,1510,1300,1600,1640,1620,1590,1990,1990,1590,1480,1590,1780,2300,2160,1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660]},{"name":"Channel","color":"#4fae4e","values":[40,80,20,0,10,20,20,0,80,110,130,150,130,160,150,160,140,170,90,140,120,190,110,50,110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100]},{"name":"Search","color":"#F5BD25","values":[50,70,0,0,10,120,20,230,280,330,440,240,260,520,430,50,200,120,220,270,190,80,70,190,70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210]},{"name":"Other","color":"#F79E39","values":[80,50,40,20,10,10,30,70,210,160,240,220,240,320,230,220,290,190,290,260,230,280,240,150,100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,20,30,30,0,0,0,10,0,10,20,0,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/27.json b/public/chartDummyData/views_zoom/2018-12/27.json new file mode 100644 index 000000000..4145be869 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545609600000,1545613200000,1545616800000,1545620400000,1545624000000,1545627600000,1545631200000,1545634800000,1545638400000,1545642000000,1545645600000,1545649200000,1545652800000,1545656400000,1545660000000,1545663600000,1545667200000,1545670800000,1545674400000,1545678000000,1545681600000,1545685200000,1545688800000,1545692400000,1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1360,410,360,70,70,280,330,530,1000,1690,2200,2610,2410,2430,2830,2070,2760,2660,2570,2390,2560,2890,2540,2640,1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800]},{"name":"URL","color":"#2373DB","values":[390,190,170,60,20,20,110,460,930,1320,1910,2030,1890,1690,1980,1700,1540,1950,1510,1070,850,1150,840,890,670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610]},{"name":"Groups","color":"#9ED448","values":[1210,750,310,270,140,220,220,680,970,1340,1370,1770,1460,1600,1690,1220,1570,1310,2050,1790,1890,2170,2080,2800,2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860]},{"name":"Channel","color":"#4fae4e","values":[110,30,50,0,0,10,40,80,100,150,190,110,200,110,180,140,220,230,200,150,200,200,180,220,100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90]},{"name":"Search","color":"#F5BD25","values":[70,160,20,20,0,170,10,210,180,140,110,550,500,210,170,120,80,130,230,210,200,250,150,200,180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390]},{"name":"Other","color":"#F79E39","values":[100,40,40,20,20,30,40,90,200,160,220,310,290,230,280,250,290,200,280,230,280,230,300,190,190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/28.json b/public/chartDummyData/views_zoom/2018-12/28.json new file mode 100644 index 000000000..aedb573ad --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545696000000,1545699600000,1545703200000,1545706800000,1545710400000,1545714000000,1545717600000,1545721200000,1545724800000,1545728400000,1545732000000,1545735600000,1545739200000,1545742800000,1545746400000,1545750000000,1545753600000,1545757200000,1545760800000,1545764400000,1545768000000,1545771600000,1545775200000,1545778800000,1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1860,1050,300,190,60,110,210,500,1030,2080,2710,3280,2670,2490,2410,2620,2400,2650,1910,2440,2800,2480,2620,2090,1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110]},{"name":"URL","color":"#2373DB","values":[670,300,120,80,70,80,20,90,300,630,1150,920,620,570,880,1050,1170,970,1010,1150,1300,1310,1090,840,500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380]},{"name":"Groups","color":"#9ED448","values":[2000,1060,540,130,50,230,310,610,1170,1960,1750,1670,1540,1740,1730,1870,1760,1830,1850,1640,2140,2320,2390,1890,1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320]},{"name":"Channel","color":"#4fae4e","values":[100,60,10,30,30,10,0,50,90,210,180,360,120,200,240,190,270,190,160,300,200,200,170,140,110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370]},{"name":"Search","color":"#F5BD25","values":[180,100,100,70,10,30,0,50,100,170,340,330,140,250,80,350,200,90,370,210,130,180,70,180,130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240]},{"name":"Other","color":"#F79E39","values":[190,40,30,40,10,50,20,100,240,250,320,310,70,240,220,260,180,210,320,300,240,200,260,260,100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,30,40,20,10,20,0,0,10,0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/29.json b/public/chartDummyData/views_zoom/2018-12/29.json new file mode 100644 index 000000000..4b241126b --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545782400000,1545786000000,1545789600000,1545793200000,1545796800000,1545800400000,1545804000000,1545807600000,1545811200000,1545814800000,1545818400000,1545822000000,1545825600000,1545829200000,1545832800000,1545836400000,1545840000000,1545843600000,1545847200000,1545850800000,1545854400000,1545858000000,1545861600000,1545865200000,1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1030,970,890,450,120,110,270,360,1130,2080,2590,2470,2600,2330,2290,2190,2040,1720,2190,2210,2100,3020,2180,1630,710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470]},{"name":"URL","color":"#2373DB","values":[500,310,130,100,10,20,60,100,360,570,1250,1430,1170,910,1020,1050,1090,1400,1340,1320,1390,1270,930,660,480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700]},{"name":"Groups","color":"#9ED448","values":[1120,720,280,100,100,170,120,490,810,1090,1210,2030,1480,1530,1930,2110,1630,1650,1620,1770,2450,2540,2460,1980,980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950]},{"name":"Channel","color":"#4fae4e","values":[110,180,160,60,20,0,70,0,40,130,80,140,90,290,160,190,400,160,230,140,170,150,310,120,100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220]},{"name":"Search","color":"#F5BD25","values":[130,20,10,20,10,20,10,10,100,190,120,200,160,160,120,130,370,280,160,400,260,150,220,130,90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290]},{"name":"Other","color":"#F79E39","values":[100,50,40,20,0,0,30,100,110,220,250,330,210,220,340,160,280,210,240,270,200,330,280,170,200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,20,10,20,10,20,10,10,0,0,0,20,10,10,0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/30.json b/public/chartDummyData/views_zoom/2018-12/30.json new file mode 100644 index 000000000..53b994fdd --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545868800000,1545872400000,1545876000000,1545879600000,1545883200000,1545886800000,1545890400000,1545894000000,1545897600000,1545901200000,1545904800000,1545908400000,1545912000000,1545915600000,1545919200000,1545922800000,1545926400000,1545930000000,1545933600000,1545937200000,1545940800000,1545944400000,1545948000000,1545951600000,1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[710,580,320,110,50,160,160,580,1100,1380,2150,1910,1930,3070,2160,2500,2000,2600,1900,2950,2540,2400,1790,2030,1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530]},{"name":"URL","color":"#2373DB","values":[480,170,170,60,30,30,150,240,690,1280,1550,1970,2060,1820,2030,2020,2110,2350,2240,1870,1770,1600,1190,1210,580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900]},{"name":"Groups","color":"#9ED448","values":[980,640,240,90,100,190,360,640,910,1370,1310,1630,1780,1820,1690,1710,1770,1600,1580,1910,2070,2420,2680,1920,1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380]},{"name":"Channel","color":"#4fae4e","values":[100,90,70,10,0,0,10,20,50,120,200,240,110,150,160,190,150,140,130,260,220,200,160,140,100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240]},{"name":"Search","color":"#F5BD25","values":[90,50,40,0,20,0,20,160,690,220,260,210,370,510,320,130,230,810,470,810,280,150,330,550,170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310]},{"name":"Other","color":"#F79E39","values":[200,60,20,40,10,40,50,80,60,300,300,300,440,510,290,240,300,180,290,340,330,540,300,200,120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310]},{"name":"PM","color":"#E65850","values":[0,0,10,0,0,0,0,0,0,0,10,20,30,0,20,0,10,0,20,20,20,20,10,20,0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2018-12/31.json b/public/chartDummyData/views_zoom/2018-12/31.json new file mode 100644 index 000000000..2ea770046 --- /dev/null +++ b/public/chartDummyData/views_zoom/2018-12/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1545955200000,1545958800000,1545962400000,1545966000000,1545969600000,1545973200000,1545976800000,1545980400000,1545984000000,1545987600000,1545991200000,1545994800000,1545998400000,1546002000000,1546005600000,1546009200000,1546012800000,1546016400000,1546020000000,1546023600000,1546027200000,1546030800000,1546034400000,1546038000000,1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1000,570,210,150,60,210,520,560,960,1640,2320,2940,2130,2300,2340,2190,1980,2000,2300,1900,2550,2670,2000,1650,1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560]},{"name":"URL","color":"#2373DB","values":[580,510,210,80,10,10,40,480,610,1130,1470,1530,1620,1850,2030,2000,1880,2350,2130,1940,1850,1380,1310,1130,690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840]},{"name":"Groups","color":"#9ED448","values":[1580,770,320,200,90,110,160,590,1180,1070,1310,1600,2160,1960,1620,1490,2060,2270,1780,1780,2360,2320,2380,2780,1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160]},{"name":"Channel","color":"#4fae4e","values":[100,90,30,40,0,0,0,30,150,210,100,140,90,50,120,90,90,60,110,110,120,150,140,220,100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200]},{"name":"Search","color":"#F5BD25","values":[170,10,0,0,30,10,20,320,160,340,1110,710,110,190,150,230,330,220,370,430,990,760,250,360,240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480]},{"name":"Other","color":"#F79E39","values":[120,50,90,20,0,20,20,130,170,250,340,300,250,550,210,370,380,310,270,440,460,330,310,300,200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,10,10,0,10,10,0,10,0,10,10,0,20,0,10,0,0,0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/01.json b/public/chartDummyData/views_zoom/2019-01/01.json new file mode 100644 index 000000000..e296b2095 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546041600000,1546045200000,1546048800000,1546052400000,1546056000000,1546059600000,1546063200000,1546066800000,1546070400000,1546074000000,1546077600000,1546081200000,1546084800000,1546088400000,1546092000000,1546095600000,1546099200000,1546102800000,1546106400000,1546110000000,1546113600000,1546117200000,1546120800000,1546124400000,1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1610,580,280,400,70,140,240,470,1090,1210,2010,1940,2180,2200,2410,2230,2210,1830,2600,1710,1800,1570,2760,2920,2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470]},{"name":"URL","color":"#2373DB","values":[690,330,130,140,80,50,160,200,820,920,1700,1810,1440,1580,1730,1960,1650,2180,1990,1390,1510,1210,1020,870,450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080]},{"name":"Groups","color":"#9ED448","values":[1750,620,350,140,210,160,610,780,880,1270,1420,1640,1780,1450,1590,1310,1870,1460,1490,1800,1710,2030,2210,1660,1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670]},{"name":"Channel","color":"#4fae4e","values":[100,60,30,20,0,0,30,10,150,40,190,100,110,190,210,80,170,140,210,100,120,80,90,100,60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270]},{"name":"Search","color":"#F5BD25","values":[240,210,20,80,20,20,70,290,310,400,390,260,250,470,280,240,210,240,320,280,280,210,650,210,120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230]},{"name":"Other","color":"#F79E39","values":[200,90,70,30,0,10,50,60,160,210,310,140,210,530,410,260,250,210,190,240,290,260,210,190,170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,0,10,0,10,20,30,0,20,10,0,10,20,40,10,0,0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/02.json b/public/chartDummyData/views_zoom/2019-01/02.json new file mode 100644 index 000000000..2b703ed57 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546128000000,1546131600000,1546135200000,1546138800000,1546142400000,1546146000000,1546149600000,1546153200000,1546156800000,1546160400000,1546164000000,1546167600000,1546171200000,1546174800000,1546178400000,1546182000000,1546185600000,1546189200000,1546192800000,1546196400000,1546200000000,1546203600000,1546207200000,1546210800000,1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[2160,1550,300,100,1230,40,130,410,890,1250,1850,2170,1950,2830,2460,2170,2650,2140,2700,1990,2570,2500,3490,1800,1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060]},{"name":"URL","color":"#2373DB","values":[450,230,160,120,10,50,80,160,400,800,1470,1610,1470,1300,2040,1630,1440,1600,1670,1690,1930,1420,1250,610,500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900]},{"name":"Groups","color":"#9ED448","values":[1830,1000,350,110,70,70,150,650,660,1240,1100,1400,1600,1540,1300,1780,1650,1360,1730,1790,2120,2460,2150,1860,1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440]},{"name":"Channel","color":"#4fae4e","values":[60,80,70,10,10,10,0,110,60,90,230,110,140,190,180,100,160,160,80,150,220,140,210,90,60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260]},{"name":"Search","color":"#F5BD25","values":[120,120,30,0,30,130,150,340,350,310,200,310,340,110,150,250,250,170,150,150,390,230,680,390,70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230]},{"name":"Other","color":"#F79E39","values":[170,160,90,0,10,50,40,40,60,170,350,320,190,250,360,330,280,220,280,200,260,330,260,180,100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,20,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/03.json b/public/chartDummyData/views_zoom/2019-01/03.json new file mode 100644 index 000000000..e90f89c33 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546214400000,1546218000000,1546221600000,1546225200000,1546228800000,1546232400000,1546236000000,1546239600000,1546243200000,1546246800000,1546250400000,1546254000000,1546257600000,1546261200000,1546264800000,1546268400000,1546272000000,1546275600000,1546279200000,1546282800000,1546286400000,1546290000000,1546293600000,1546297200000,1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1000,370,310,190,90,70,320,470,760,1650,1910,2380,2620,1940,2360,2210,1740,2290,2130,2070,1790,1650,1790,2110,1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590]},{"name":"URL","color":"#2373DB","values":[500,200,120,30,0,30,40,240,560,1190,1980,1900,1610,1520,1500,1580,1510,1840,1590,890,530,580,520,1380,770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720]},{"name":"Groups","color":"#9ED448","values":[1610,780,350,170,200,110,160,480,750,1220,1400,1650,1860,1680,1720,1480,1330,1690,1210,1390,1560,1240,1260,2320,1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200]},{"name":"Channel","color":"#4fae4e","values":[60,120,20,10,0,0,10,80,40,140,190,210,170,150,380,140,130,210,170,150,170,250,230,370,220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140]},{"name":"Search","color":"#F5BD25","values":[70,90,0,0,10,10,50,140,170,460,150,650,210,360,290,120,100,150,320,90,170,210,220,240,250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270]},{"name":"Other","color":"#F79E39","values":[100,110,50,30,10,20,10,60,150,160,220,190,380,170,160,240,340,270,180,100,90,130,300,280,100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,20,10,50,0,10,10,60,10,20,30,20,50,20,10,0,20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/04.json b/public/chartDummyData/views_zoom/2019-01/04.json new file mode 100644 index 000000000..8eca0ccf1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546300800000,1546304400000,1546308000000,1546311600000,1546315200000,1546318800000,1546322400000,1546326000000,1546329600000,1546333200000,1546336800000,1546340400000,1546344000000,1546347600000,1546351200000,1546354800000,1546358400000,1546362000000,1546365600000,1546369200000,1546372800000,1546376400000,1546380000000,1546383600000,1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1350,880,790,470,280,140,210,250,540,780,1640,1910,2260,1920,1850,2180,2340,2090,2200,2130,2280,2550,2470,1470,880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450]},{"name":"URL","color":"#2373DB","values":[770,520,210,130,150,100,80,80,120,330,570,780,790,580,810,880,1290,1420,1300,1050,1310,1510,940,700,370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750]},{"name":"Groups","color":"#9ED448","values":[1180,940,730,400,200,110,110,280,590,810,970,1200,1070,1820,1540,1510,1440,1730,1360,1620,2440,2420,2110,1950,1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030]},{"name":"Channel","color":"#4fae4e","values":[220,90,100,40,60,30,0,60,40,130,140,210,180,260,200,100,150,120,130,180,180,180,220,220,70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160]},{"name":"Search","color":"#F5BD25","values":[250,470,70,110,0,0,10,50,30,70,130,200,280,330,460,190,410,200,310,70,140,120,210,290,50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250]},{"name":"Other","color":"#F79E39","values":[100,110,100,20,30,0,30,40,90,120,350,210,150,310,280,260,220,240,220,240,220,240,280,140,210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270]},{"name":"PM","color":"#E65850","values":[20,0,0,10,0,0,0,0,0,10,0,10,10,10,10,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/05.json b/public/chartDummyData/views_zoom/2019-01/05.json new file mode 100644 index 000000000..19d6b63ff --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546387200000,1546390800000,1546394400000,1546398000000,1546401600000,1546405200000,1546408800000,1546412400000,1546416000000,1546419600000,1546423200000,1546426800000,1546430400000,1546434000000,1546437600000,1546441200000,1546444800000,1546448400000,1546452000000,1546455600000,1546459200000,1546462800000,1546466400000,1546470000000,1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[880,550,230,120,110,190,210,560,840,1240,1680,2510,2010,2130,1760,1990,2310,2780,1880,2280,2530,2590,1930,1530,1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410]},{"name":"URL","color":"#2373DB","values":[370,340,160,90,70,40,90,280,600,940,1340,1670,1510,1620,1360,1500,1820,2060,1730,1610,1740,1440,980,900,380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670]},{"name":"Groups","color":"#9ED448","values":[1700,660,350,140,140,130,240,520,750,1030,1040,1270,1770,1620,1600,1480,1490,1750,1810,2290,2120,2820,2560,2380,1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010]},{"name":"Channel","color":"#4fae4e","values":[70,70,60,20,10,30,0,20,20,120,150,130,180,150,260,150,190,200,190,200,140,150,190,240,150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210]},{"name":"Search","color":"#F5BD25","values":[50,60,60,0,0,60,0,280,330,180,310,520,280,320,740,1150,320,230,150,140,310,180,260,310,180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110]},{"name":"Other","color":"#F79E39","values":[210,100,20,20,30,20,10,90,110,230,180,350,410,250,350,270,210,300,240,290,360,300,330,310,130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,0,0,0,0,0,10,20,10,20,0,10,0,0,10,0,10,20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/06.json b/public/chartDummyData/views_zoom/2019-01/06.json new file mode 100644 index 000000000..dc39c64a1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546473600000,1546477200000,1546480800000,1546484400000,1546488000000,1546491600000,1546495200000,1546498800000,1546502400000,1546506000000,1546509600000,1546513200000,1546516800000,1546520400000,1546524000000,1546527600000,1546531200000,1546534800000,1546538400000,1546542000000,1546545600000,1546549200000,1546552800000,1546556400000,1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1990,800,340,90,120,230,220,640,990,1640,1860,1950,2510,2460,2370,2200,2540,2590,2450,2290,2820,2340,2150,1560,1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590]},{"name":"URL","color":"#2373DB","values":[380,290,130,40,10,60,80,310,510,900,1480,1900,1780,1690,1880,2020,2320,2310,2260,1820,1490,1540,1630,840,620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810]},{"name":"Groups","color":"#9ED448","values":[1350,880,420,180,100,390,350,650,1050,1540,1360,1410,1740,1850,1940,1910,1690,2000,1640,1850,2610,3120,3000,2160,1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400]},{"name":"Channel","color":"#4fae4e","values":[150,120,60,50,20,0,0,40,50,160,260,170,230,210,230,130,170,210,210,140,170,170,150,200,230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170]},{"name":"Search","color":"#F5BD25","values":[180,0,30,10,10,20,430,910,260,310,320,540,370,160,550,290,340,310,220,230,160,260,560,480,360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120]},{"name":"Other","color":"#F79E39","values":[130,130,30,30,30,20,50,50,130,170,330,250,330,340,240,340,470,290,270,340,410,200,230,260,180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180]},{"name":"PM","color":"#E65850","values":[20,0,0,0,0,0,0,0,10,40,0,10,0,0,0,10,0,10,0,10,10,10,10,0,0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/07.json b/public/chartDummyData/views_zoom/2019-01/07.json new file mode 100644 index 000000000..47332c831 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546560000000,1546563600000,1546567200000,1546570800000,1546574400000,1546578000000,1546581600000,1546585200000,1546588800000,1546592400000,1546596000000,1546599600000,1546603200000,1546606800000,1546610400000,1546614000000,1546617600000,1546621200000,1546624800000,1546628400000,1546632000000,1546635600000,1546639200000,1546642800000,1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1060,730,520,200,140,180,310,680,1310,2150,2140,2350,2390,2450,2090,2320,2900,2230,1960,1930,2570,2290,1740,1470,1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610]},{"name":"URL","color":"#2373DB","values":[620,370,160,90,90,80,60,440,690,1050,1470,1970,1930,1870,1750,2030,2040,2200,2410,2120,1940,1770,1340,1080,610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030]},{"name":"Groups","color":"#9ED448","values":[1210,1040,390,130,50,240,400,620,900,1180,1320,1970,1560,1690,1890,1560,1690,1920,1920,2080,2460,2580,2580,2670,1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300]},{"name":"Channel","color":"#4fae4e","values":[230,60,90,10,10,10,30,90,170,250,160,160,160,250,140,250,260,110,250,160,280,250,110,270,280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70]},{"name":"Search","color":"#F5BD25","values":[360,80,110,40,0,90,20,250,710,470,370,220,240,550,240,180,160,190,320,200,300,260,150,230,160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240]},{"name":"Other","color":"#F79E39","values":[180,130,50,30,20,10,40,170,140,230,370,240,400,360,340,310,250,410,240,390,380,340,280,200,260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270]},{"name":"PM","color":"#E65850","values":[0,0,20,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/08.json b/public/chartDummyData/views_zoom/2019-01/08.json new file mode 100644 index 000000000..d71edd0aa --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546646400000,1546650000000,1546653600000,1546657200000,1546660800000,1546664400000,1546668000000,1546671600000,1546675200000,1546678800000,1546682400000,1546686000000,1546689600000,1546693200000,1546696800000,1546700400000,1546704000000,1546707600000,1546711200000,1546714800000,1546718400000,1546722000000,1546725600000,1546729200000,1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1140,570,380,90,110,130,350,460,760,1600,2080,2130,2190,2430,2330,1890,2010,2120,2270,2010,2290,1780,2200,2060,1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170]},{"name":"URL","color":"#2373DB","values":[610,340,130,70,70,30,50,200,480,900,1460,2180,1760,1690,1830,1840,1920,1760,1980,1770,1440,1310,1010,900,750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010]},{"name":"Groups","color":"#9ED448","values":[1830,740,390,190,50,230,300,540,650,1260,1570,1700,1560,2300,2420,1650,1710,1840,1530,1630,2050,1940,2840,2440,1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710]},{"name":"Channel","color":"#4fae4e","values":[280,130,10,10,0,40,50,10,90,200,100,80,130,120,220,320,130,130,230,160,220,170,180,260,70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170]},{"name":"Search","color":"#F5BD25","values":[160,10,70,10,10,0,30,60,360,320,120,380,260,260,180,130,270,240,240,380,410,90,180,230,50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90]},{"name":"Other","color":"#F79E39","values":[260,140,50,40,50,10,40,100,120,230,180,340,300,320,400,350,310,310,390,320,360,410,210,240,320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,0,20,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/09.json b/public/chartDummyData/views_zoom/2019-01/09.json new file mode 100644 index 000000000..19609c9eb --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546732800000,1546736400000,1546740000000,1546743600000,1546747200000,1546750800000,1546754400000,1546758000000,1546761600000,1546765200000,1546768800000,1546772400000,1546776000000,1546779600000,1546783200000,1546786800000,1546790400000,1546794000000,1546797600000,1546801200000,1546804800000,1546808400000,1546812000000,1546815600000,1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1420,770,430,340,90,120,180,440,970,1280,2320,2100,2080,2270,2810,2640,2360,2670,2400,2000,2930,2650,1900,1590,1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150]},{"name":"URL","color":"#2373DB","values":[750,420,230,80,30,20,30,130,360,610,1270,1490,1220,1030,1150,1750,1490,1680,1640,1980,1490,1480,1230,720,610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770]},{"name":"Groups","color":"#9ED448","values":[1690,920,420,180,80,200,160,380,660,1250,1610,1510,1750,1720,1790,1650,2060,1760,1580,1440,2260,3140,2840,2200,820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560]},{"name":"Channel","color":"#4fae4e","values":[70,90,40,30,0,0,0,70,90,70,140,170,80,150,180,310,300,290,310,160,200,420,150,140,120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180]},{"name":"Search","color":"#F5BD25","values":[50,120,70,110,20,0,120,120,250,220,100,400,280,570,200,220,290,180,160,380,230,430,310,270,80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100]},{"name":"Other","color":"#F79E39","values":[320,140,70,20,30,10,40,30,130,250,300,200,270,410,300,250,270,350,270,360,260,430,340,210,250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,0,10,10,20,0,20,0,30,10,20,0,10,0,0,10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/10.json b/public/chartDummyData/views_zoom/2019-01/10.json new file mode 100644 index 000000000..ed7806e52 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546819200000,1546822800000,1546826400000,1546830000000,1546833600000,1546837200000,1546840800000,1546844400000,1546848000000,1546851600000,1546855200000,1546858800000,1546862400000,1546866000000,1546869600000,1546873200000,1546876800000,1546880400000,1546884000000,1546887600000,1546891200000,1546894800000,1546898400000,1546902000000,1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1000,310,120,60,30,260,570,940,1010,1260,1730,1850,1820,1840,2280,2130,2690,2350,2140,2720,2870,2640,2010,1450,610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340]},{"name":"URL","color":"#2373DB","values":[610,150,70,10,10,90,460,680,820,1050,1330,1390,1880,1710,1800,1960,2350,2360,2230,2240,1800,1900,1410,750,350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770]},{"name":"Groups","color":"#9ED448","values":[820,470,190,60,110,460,820,800,870,1090,1140,1190,1460,2160,1500,1670,1610,1650,1650,2570,2570,3170,2870,2030,1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330]},{"name":"Channel","color":"#4fae4e","values":[120,20,40,10,0,10,50,80,20,100,90,170,60,110,270,180,220,380,220,190,310,270,260,160,70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180]},{"name":"Search","color":"#F5BD25","values":[80,50,30,10,0,140,370,230,110,160,430,430,140,230,270,330,440,220,240,640,200,420,460,250,70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130]},{"name":"Other","color":"#F79E39","values":[250,70,20,20,0,40,70,280,320,210,230,300,190,400,330,350,250,370,350,350,400,410,360,270,160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,10,0,0,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/11.json b/public/chartDummyData/views_zoom/2019-01/11.json new file mode 100644 index 000000000..4f63d7bd8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546905600000,1546909200000,1546912800000,1546916400000,1546920000000,1546923600000,1546927200000,1546930800000,1546934400000,1546938000000,1546941600000,1546945200000,1546948800000,1546952400000,1546956000000,1546959600000,1546963200000,1546966800000,1546970400000,1546974000000,1546977600000,1546981200000,1546984800000,1546988400000,1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[610,350,130,40,110,200,560,930,1080,1240,1660,1780,1820,2010,2130,1860,2250,2620,2230,1970,2590,2280,1930,1410,750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150]},{"name":"URL","color":"#2373DB","values":[350,210,80,150,30,70,260,570,980,1180,1230,1760,1930,1800,1680,2260,2130,2120,2310,2160,2190,1750,1560,670,220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810]},{"name":"Groups","color":"#9ED448","values":[1260,460,150,60,40,270,530,1090,970,1270,1170,1530,1480,1700,1790,1780,2050,1700,2130,1950,2330,3080,2770,2010,750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840]},{"name":"Channel","color":"#4fae4e","values":[70,100,10,90,30,40,80,100,50,40,90,90,90,150,170,120,120,170,140,220,200,200,240,210,110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60]},{"name":"Search","color":"#F5BD25","values":[70,10,20,0,0,90,230,190,130,210,160,750,130,320,550,280,140,310,240,160,240,220,110,110,100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160]},{"name":"Other","color":"#F79E39","values":[160,30,60,10,10,30,130,210,180,460,180,240,240,320,270,230,300,260,310,420,280,330,330,340,100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,20,0,10,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/12.json b/public/chartDummyData/views_zoom/2019-01/12.json new file mode 100644 index 000000000..602f7de7b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1546992000000,1546995600000,1546999200000,1547002800000,1547006400000,1547010000000,1547013600000,1547017200000,1547020800000,1547024400000,1547028000000,1547031600000,1547035200000,1547038800000,1547042400000,1547046000000,1547049600000,1547053200000,1547056800000,1547060400000,1547064000000,1547067600000,1547071200000,1547074800000,1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[750,200,140,40,30,130,560,1010,950,1260,1740,2080,1820,2070,3240,2520,2430,2250,2070,2150,2440,2780,1900,1590,530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010]},{"name":"URL","color":"#2373DB","values":[220,190,30,60,0,80,340,500,710,920,1370,1630,1900,1990,1920,2240,2150,2400,2390,2020,2310,1460,1290,810,270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870]},{"name":"Groups","color":"#9ED448","values":[750,370,90,30,80,320,800,1000,1240,1600,1010,1290,1520,1540,1740,1250,1900,2180,1740,2070,2450,2470,2470,2400,980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690]},{"name":"Channel","color":"#4fae4e","values":[110,10,10,20,10,0,40,50,50,80,70,70,90,90,210,130,240,170,90,140,150,160,140,170,50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90]},{"name":"Search","color":"#F5BD25","values":[100,30,20,30,20,20,260,390,450,70,150,620,400,210,210,150,160,210,430,140,240,100,180,120,100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50]},{"name":"Other","color":"#F79E39","values":[100,80,50,20,0,60,120,220,190,230,260,270,350,380,270,340,460,420,360,280,480,400,410,180,150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,10,0,30,10,10,0,10,0,10,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/13.json b/public/chartDummyData/views_zoom/2019-01/13.json new file mode 100644 index 000000000..4ee812cbb --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547078400000,1547082000000,1547085600000,1547089200000,1547092800000,1547096400000,1547100000000,1547103600000,1547107200000,1547110800000,1547114400000,1547118000000,1547121600000,1547125200000,1547128800000,1547132400000,1547136000000,1547139600000,1547143200000,1547146800000,1547150400000,1547154000000,1547157600000,1547161200000,1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[530,330,220,90,20,120,850,1360,1110,1050,1710,1510,1990,2500,1950,1850,1840,2360,2380,2480,2180,3720,2200,1610,940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090]},{"name":"URL","color":"#2373DB","values":[270,250,80,0,20,90,290,590,850,1260,1380,1780,1910,1850,1700,1930,2170,2660,2430,2290,2020,1720,1220,1030,230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760]},{"name":"Groups","color":"#9ED448","values":[980,400,150,60,30,290,490,900,1150,810,1010,1560,1500,1780,1570,1500,1980,2040,1770,1850,2290,2670,2850,2300,740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430]},{"name":"Channel","color":"#4fae4e","values":[50,40,0,0,10,10,30,70,50,70,240,150,70,260,200,160,120,140,210,170,270,190,250,70,130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100]},{"name":"Search","color":"#F5BD25","values":[100,110,0,0,0,0,250,60,290,230,260,340,1050,1390,400,180,120,410,150,200,220,180,190,240,20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150]},{"name":"Other","color":"#F79E39","values":[150,40,60,10,20,60,120,230,250,230,380,300,340,320,320,300,190,420,270,370,380,390,220,270,100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,10,10,10,10,10,0,10,0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/14.json b/public/chartDummyData/views_zoom/2019-01/14.json new file mode 100644 index 000000000..b4831e1f5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547164800000,1547168400000,1547172000000,1547175600000,1547179200000,1547182800000,1547186400000,1547190000000,1547193600000,1547197200000,1547200800000,1547204400000,1547208000000,1547211600000,1547215200000,1547218800000,1547222400000,1547226000000,1547229600000,1547233200000,1547236800000,1547240400000,1547244000000,1547247600000,1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[940,110,110,80,70,290,590,1050,1020,1480,1740,1760,2080,2070,1810,2240,2120,1750,2180,2430,2160,1720,1600,1170,670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340]},{"name":"URL","color":"#2373DB","values":[230,120,70,60,0,20,290,730,830,1250,1790,1810,2220,2250,1960,1870,2400,2520,2650,2050,1980,1610,1410,1010,590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960]},{"name":"Groups","color":"#9ED448","values":[740,320,90,120,50,300,910,1000,750,1140,1620,1560,1900,1850,1850,1530,1600,1710,1780,1900,2840,3020,2230,1710,1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750]},{"name":"Channel","color":"#4fae4e","values":[130,30,10,0,0,10,80,60,190,140,100,100,110,220,190,190,160,170,150,70,150,120,140,170,80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180]},{"name":"Search","color":"#F5BD25","values":[20,30,20,20,40,180,170,170,190,600,200,130,720,260,290,190,190,440,210,1000,130,260,80,90,160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250]},{"name":"Other","color":"#F79E39","values":[100,60,40,20,10,30,120,240,110,290,270,260,270,220,260,180,260,280,440,430,430,410,230,190,150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,0,0,0,0,30,10,0,10,0,10,10,10,0,0,20,0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/15.json b/public/chartDummyData/views_zoom/2019-01/15.json new file mode 100644 index 000000000..e1a794983 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547251200000,1547254800000,1547258400000,1547262000000,1547265600000,1547269200000,1547272800000,1547276400000,1547280000000,1547283600000,1547287200000,1547290800000,1547294400000,1547298000000,1547301600000,1547305200000,1547308800000,1547312400000,1547316000000,1547319600000,1547323200000,1547326800000,1547330400000,1547334000000,1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[670,320,210,130,190,140,390,540,800,1270,1580,1910,1880,2370,1930,3430,2190,2140,2120,1870,2060,1780,2110,1150,870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360]},{"name":"URL","color":"#2373DB","values":[590,440,210,70,70,80,100,370,750,1040,1410,2060,1900,1810,1720,1700,1750,2000,1780,1560,1350,1120,1100,770,480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680]},{"name":"Groups","color":"#9ED448","values":[1130,410,160,50,70,230,300,960,1170,1090,1410,1390,1820,1880,1730,2240,1600,1880,1840,1690,1920,2260,2210,1560,1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690]},{"name":"Channel","color":"#4fae4e","values":[80,40,50,20,0,0,40,90,80,90,110,120,100,200,150,190,80,160,310,250,120,150,150,180,140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190]},{"name":"Search","color":"#F5BD25","values":[160,20,40,10,0,20,30,260,300,250,360,300,440,440,220,250,220,370,380,210,250,180,150,100,160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50]},{"name":"Other","color":"#F79E39","values":[150,50,50,20,20,0,90,130,150,160,300,370,400,480,510,280,270,300,240,400,260,250,410,270,70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,10,10,20,10,0,0,20,20,0,10,20,20,0,10,0,0,0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/16.json b/public/chartDummyData/views_zoom/2019-01/16.json new file mode 100644 index 000000000..9134df8dc --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547337600000,1547341200000,1547344800000,1547348400000,1547352000000,1547355600000,1547359200000,1547362800000,1547366400000,1547370000000,1547373600000,1547377200000,1547380800000,1547384400000,1547388000000,1547391600000,1547395200000,1547398800000,1547402400000,1547406000000,1547409600000,1547413200000,1547416800000,1547420400000,1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[870,430,2260,80,50,90,190,390,950,1350,1760,2000,1730,2470,2130,2070,1910,1990,3170,2490,2220,2150,1910,1340,770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570]},{"name":"URL","color":"#2373DB","values":[480,280,260,70,70,10,60,170,510,920,1360,1440,1500,1470,1280,1370,1610,1480,1420,1610,1600,1550,1100,770,420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790]},{"name":"Groups","color":"#9ED448","values":[1910,1220,390,70,250,110,250,350,770,1240,1510,1330,1880,2080,1970,1830,1660,1620,1850,1830,2730,2690,2580,2330,980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870]},{"name":"Channel","color":"#4fae4e","values":[140,70,20,10,0,20,10,20,20,40,60,210,130,160,140,130,200,150,230,150,160,190,130,180,70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200]},{"name":"Search","color":"#F5BD25","values":[160,60,130,0,0,0,80,140,340,320,210,460,290,930,220,420,130,190,270,720,120,170,290,130,50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100]},{"name":"Other","color":"#F79E39","values":[70,70,0,40,10,30,30,100,180,250,240,370,310,470,190,190,260,240,290,310,250,280,250,210,140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200]},{"name":"PM","color":"#E65850","values":[0,10,0,10,0,0,0,0,0,0,20,10,0,10,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/17.json b/public/chartDummyData/views_zoom/2019-01/17.json new file mode 100644 index 000000000..59ee8f81a --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547424000000,1547427600000,1547431200000,1547434800000,1547438400000,1547442000000,1547445600000,1547449200000,1547452800000,1547456400000,1547460000000,1547463600000,1547467200000,1547470800000,1547474400000,1547478000000,1547481600000,1547485200000,1547488800000,1547492400000,1547496000000,1547499600000,1547503200000,1547506800000,1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[770,400,180,110,90,240,610,1080,990,1710,1670,1600,2190,1780,2390,2390,2400,2060,2570,2380,2610,3110,1910,1150,2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900]},{"name":"URL","color":"#2373DB","values":[420,180,170,100,20,100,470,690,870,1170,1530,1600,1780,1700,1790,1810,2150,2310,2640,1980,1990,1850,1350,810,430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660]},{"name":"Groups","color":"#9ED448","values":[980,370,90,80,80,500,660,950,1080,1130,1410,1410,1970,1790,1520,1480,1570,1530,2080,2480,3140,3650,3330,1840,1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000]},{"name":"Channel","color":"#4fae4e","values":[70,70,0,30,0,10,40,70,70,100,90,100,140,160,140,150,150,160,150,100,240,210,110,60,60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100]},{"name":"Search","color":"#F5BD25","values":[50,110,0,60,0,10,480,240,250,60,390,320,290,140,120,740,200,260,350,350,820,470,240,160,20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40]},{"name":"Other","color":"#F79E39","values":[140,120,50,30,20,50,160,230,230,300,200,240,480,330,290,300,370,330,410,440,340,460,400,220,70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,10,0,0,10,0,0,20,0,10,0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/18.json b/public/chartDummyData/views_zoom/2019-01/18.json new file mode 100644 index 000000000..3a09d5b26 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547510400000,1547514000000,1547517600000,1547521200000,1547524800000,1547528400000,1547532000000,1547535600000,1547539200000,1547542800000,1547546400000,1547550000000,1547553600000,1547557200000,1547560800000,1547564400000,1547568000000,1547571600000,1547575200000,1547578800000,1547582400000,1547586000000,1547589600000,1547593200000,1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[2480,220,60,50,100,230,690,900,1150,1770,1460,1690,1950,2100,1890,1880,1670,2380,2050,1930,2160,2400,1730,1010,660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220]},{"name":"URL","color":"#2373DB","values":[430,190,100,150,150,230,400,860,990,1230,1520,1760,1660,1760,1950,2230,2550,2420,2140,2280,2290,2170,1360,870,490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760]},{"name":"Groups","color":"#9ED448","values":[1110,380,140,110,110,270,550,1010,920,1250,1100,1380,1850,1700,1530,1870,1660,1870,1820,1900,2830,2940,3330,1690,1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050]},{"name":"Channel","color":"#4fae4e","values":[60,10,70,20,0,0,180,30,20,40,60,130,100,190,210,190,140,120,300,180,170,260,160,90,90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110]},{"name":"Search","color":"#F5BD25","values":[20,30,30,10,0,20,540,290,390,310,180,150,230,250,360,840,200,700,140,280,370,510,170,50,10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130]},{"name":"Other","color":"#F79E39","values":[70,20,10,20,10,30,90,200,200,230,290,250,280,230,280,330,360,330,430,510,430,430,330,200,60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,10,10,10,20,10,0,10,0,20,0,10,0,0,0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/19.json b/public/chartDummyData/views_zoom/2019-01/19.json new file mode 100644 index 000000000..a33cc1e7d --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547596800000,1547600400000,1547604000000,1547607600000,1547611200000,1547614800000,1547618400000,1547622000000,1547625600000,1547629200000,1547632800000,1547636400000,1547640000000,1547643600000,1547647200000,1547650800000,1547654400000,1547658000000,1547661600000,1547665200000,1547668800000,1547672400000,1547676000000,1547679600000,1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[660,240,120,30,60,200,730,1310,1110,1390,1550,2020,1890,2160,2220,2130,2350,2280,2110,2120,2380,2300,2940,1090,610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180]},{"name":"URL","color":"#2373DB","values":[490,170,110,20,20,130,410,810,820,1350,1550,1680,1910,1870,1870,1870,2220,2270,2130,2430,2210,1890,1360,760,290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800]},{"name":"Groups","color":"#9ED448","values":[1080,560,60,60,50,500,740,1220,990,1600,1330,1050,1590,1770,2480,1280,1450,1940,1970,1990,2430,2650,2540,1430,840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910]},{"name":"Channel","color":"#4fae4e","values":[90,10,0,0,10,0,10,80,70,110,90,120,110,190,110,90,240,150,160,180,140,190,230,100,50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50]},{"name":"Search","color":"#F5BD25","values":[10,140,0,0,0,570,220,400,170,180,210,190,370,160,230,670,150,240,210,240,170,320,160,150,0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170]},{"name":"Other","color":"#F79E39","values":[60,80,0,30,20,40,120,250,230,260,260,290,360,390,430,260,200,380,550,510,360,350,300,150,130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,0,10,0,0,0,10,0,10,0,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/20.json b/public/chartDummyData/views_zoom/2019-01/20.json new file mode 100644 index 000000000..45b00dc6c --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547683200000,1547686800000,1547690400000,1547694000000,1547697600000,1547701200000,1547704800000,1547708400000,1547712000000,1547715600000,1547719200000,1547722800000,1547726400000,1547730000000,1547733600000,1547737200000,1547740800000,1547744400000,1547748000000,1547751600000,1547755200000,1547758800000,1547762400000,1547766000000,1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[610,130,180,20,110,580,710,1160,1320,1690,1650,1670,2190,2090,1970,1800,2330,2830,2340,2430,2890,2650,1990,1340,2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970]},{"name":"URL","color":"#2373DB","values":[290,80,20,40,50,100,390,790,1260,1190,1610,1690,1710,1860,2020,1990,2610,2750,2430,2020,2430,1710,1150,960,370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970]},{"name":"Groups","color":"#9ED448","values":[840,310,110,40,50,360,670,950,1260,1220,1460,1280,1940,1860,1850,1620,1530,1730,1780,1920,2420,2970,2390,1750,670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870]},{"name":"Channel","color":"#4fae4e","values":[50,30,50,20,0,30,0,40,30,40,250,140,120,160,190,180,230,130,220,190,210,280,230,180,160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70]},{"name":"Search","color":"#F5BD25","values":[0,0,0,10,0,80,380,290,230,440,110,510,230,140,130,250,170,440,220,100,260,390,650,250,80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160]},{"name":"Other","color":"#F79E39","values":[130,40,10,20,20,50,210,220,200,320,160,350,390,390,530,320,240,420,340,480,370,460,370,270,90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,30,0,0,10,0,0,0,10,0,10,10,0,0,0,10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/21.json b/public/chartDummyData/views_zoom/2019-01/21.json new file mode 100644 index 000000000..ce99ee404 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547769600000,1547773200000,1547776800000,1547780400000,1547784000000,1547787600000,1547791200000,1547794800000,1547798400000,1547802000000,1547805600000,1547809200000,1547812800000,1547816400000,1547820000000,1547823600000,1547827200000,1547830800000,1547834400000,1547838000000,1547841600000,1547845200000,1547848800000,1547852400000,1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[2230,580,120,80,70,140,590,870,1400,1560,1720,1710,1920,2410,1730,2500,2090,2030,2340,2470,2680,1880,2060,1360,620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230]},{"name":"URL","color":"#2373DB","values":[370,120,80,100,80,80,470,1000,1120,1080,1620,1910,2160,2240,2440,2110,2480,2400,2780,1950,1700,1450,1000,680,410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710]},{"name":"Groups","color":"#9ED448","values":[670,490,260,80,70,310,770,1120,900,1080,1270,1570,1730,2070,1500,1570,1550,1750,1970,2150,2720,2510,2310,1690,930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630]},{"name":"Channel","color":"#4fae4e","values":[160,120,70,10,30,40,30,60,70,110,100,110,80,260,200,270,200,130,180,210,170,300,160,190,220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140]},{"name":"Search","color":"#F5BD25","values":[80,60,0,40,50,150,270,180,250,280,370,150,360,190,260,580,260,310,300,230,240,160,70,50,60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170]},{"name":"Other","color":"#F79E39","values":[90,20,20,10,20,40,190,200,310,250,280,340,290,330,320,270,390,310,370,380,290,270,260,120,160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,20,10,0,10,10,20,30,0,20,10,10,10,30,0,20,0,0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/22.json b/public/chartDummyData/views_zoom/2019-01/22.json new file mode 100644 index 000000000..19bfa062d --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547856000000,1547859600000,1547863200000,1547866800000,1547870400000,1547874000000,1547877600000,1547881200000,1547884800000,1547888400000,1547892000000,1547895600000,1547899200000,1547902800000,1547906400000,1547910000000,1547913600000,1547917200000,1547920800000,1547924400000,1547928000000,1547931600000,1547935200000,1547938800000,1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[620,320,160,80,100,120,340,810,910,1320,1610,1830,2230,1920,2000,1580,1710,2020,2560,1610,1790,2340,1720,1570,870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060]},{"name":"URL","color":"#2373DB","values":[410,230,90,40,0,70,90,380,650,1100,1750,2090,1910,2130,1760,1770,1840,2240,1840,1660,1280,1250,1070,790,530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840]},{"name":"Groups","color":"#9ED448","values":[930,430,180,280,70,240,300,770,1280,1940,1370,1350,1720,1760,1410,1570,1790,1470,1590,2140,1770,1790,2010,1870,2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770]},{"name":"Channel","color":"#4fae4e","values":[220,30,130,40,10,20,30,40,100,100,100,190,140,230,110,150,90,130,110,130,170,130,320,200,120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90]},{"name":"Search","color":"#F5BD25","values":[60,70,0,0,10,0,250,230,200,190,490,290,380,250,340,230,220,190,430,120,170,220,120,100,90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100]},{"name":"Other","color":"#F79E39","values":[160,120,50,10,10,20,50,160,230,350,350,340,270,370,380,280,270,350,270,190,250,240,240,200,200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,30,0,10,10,0,10,0,0,0,0,10,20,10,20,10,0,0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/23.json b/public/chartDummyData/views_zoom/2019-01/23.json new file mode 100644 index 000000000..feba4fd4d --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1547942400000,1547946000000,1547949600000,1547953200000,1547956800000,1547960400000,1547964000000,1547967600000,1547971200000,1547974800000,1547978400000,1547982000000,1547985600000,1547989200000,1547992800000,1547996400000,1548000000000,1548003600000,1548007200000,1548010800000,1548014400000,1548018000000,1548021600000,1548025200000,1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[870,530,280,150,60,120,230,340,1070,1290,2490,2100,1410,2170,2750,2250,2020,1980,2900,2380,2370,2160,1900,900,580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220]},{"name":"URL","color":"#2373DB","values":[530,340,90,230,80,40,80,210,470,640,1350,1580,1450,1420,1330,1590,1140,1730,1650,1370,1780,1390,1190,660,390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870]},{"name":"Groups","color":"#9ED448","values":[2340,1000,350,230,50,50,240,360,870,1220,1130,1390,1610,1590,1710,1340,1650,1570,2030,1900,2250,2850,2560,2000,980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740]},{"name":"Channel","color":"#4fae4e","values":[120,20,10,20,10,50,20,20,40,70,170,120,170,150,330,190,160,130,170,140,170,220,150,100,50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90]},{"name":"Search","color":"#F5BD25","values":[90,110,40,90,0,10,20,90,350,320,430,270,230,170,300,120,500,740,370,340,420,390,260,40,300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200]},{"name":"Other","color":"#F79E39","values":[200,80,10,10,20,20,30,100,140,270,240,320,290,410,310,340,190,220,330,360,290,300,260,180,170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,0,10,10,20,0,20,30,30,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/24.json b/public/chartDummyData/views_zoom/2019-01/24.json new file mode 100644 index 000000000..638d5dee7 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548028800000,1548032400000,1548036000000,1548039600000,1548043200000,1548046800000,1548050400000,1548054000000,1548057600000,1548061200000,1548064800000,1548068400000,1548072000000,1548075600000,1548079200000,1548082800000,1548086400000,1548090000000,1548093600000,1548097200000,1548100800000,1548104400000,1548108000000,1548111600000,1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[580,320,1090,60,190,180,600,850,1040,1270,1840,1660,1710,1930,1940,2000,2210,2360,2490,2470,2620,2610,1790,1220,350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220]},{"name":"URL","color":"#2373DB","values":[390,160,40,10,30,60,300,770,980,1020,1490,1490,1760,1630,1450,1710,2220,2190,2430,2070,2100,1840,1480,760,320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800]},{"name":"Groups","color":"#9ED448","values":[980,360,140,220,140,370,650,910,1020,1260,1380,1330,1370,1540,1980,1690,1520,1580,1800,2210,2470,2530,2680,2050,690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980]},{"name":"Channel","color":"#4fae4e","values":[50,30,40,0,10,30,80,40,40,50,80,120,170,200,190,130,120,240,210,140,240,220,120,110,30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160]},{"name":"Search","color":"#F5BD25","values":[300,20,20,10,10,40,200,200,230,170,190,640,590,250,220,200,280,160,330,330,210,140,160,130,50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880]},{"name":"Other","color":"#F79E39","values":[170,10,20,30,10,10,150,120,190,240,250,330,340,290,430,280,300,330,340,290,420,420,340,240,100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/25.json b/public/chartDummyData/views_zoom/2019-01/25.json new file mode 100644 index 000000000..7b9988433 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548115200000,1548118800000,1548122400000,1548126000000,1548129600000,1548133200000,1548136800000,1548140400000,1548144000000,1548147600000,1548151200000,1548154800000,1548158400000,1548162000000,1548165600000,1548169200000,1548172800000,1548176400000,1548180000000,1548183600000,1548187200000,1548190800000,1548194400000,1548198000000,1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[350,180,260,30,70,60,2470,920,1160,1490,1700,1620,2090,1730,2310,2350,1940,2410,2680,2330,2760,3210,1790,1180,570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240]},{"name":"URL","color":"#2373DB","values":[320,120,0,120,120,60,400,870,850,1360,1240,1780,2100,1960,1760,2150,2140,2170,2300,2210,1770,1700,1210,800,300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640]},{"name":"Groups","color":"#9ED448","values":[690,350,100,60,50,380,720,1040,900,1170,1060,1500,1760,1620,1970,1900,1710,1900,2200,2630,2430,3230,3230,1910,740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520]},{"name":"Channel","color":"#4fae4e","values":[30,60,100,10,0,10,70,40,100,60,110,60,90,150,130,150,210,480,240,240,230,310,200,50,110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100]},{"name":"Search","color":"#F5BD25","values":[50,40,0,0,0,40,140,60,160,370,230,200,370,220,140,200,260,230,160,690,480,440,120,170,40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90]},{"name":"Other","color":"#F79E39","values":[100,40,40,0,20,50,180,150,280,270,320,360,320,390,250,230,330,430,330,380,370,360,370,160,190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,0,10,0,10,20,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/26.json b/public/chartDummyData/views_zoom/2019-01/26.json new file mode 100644 index 000000000..5d2f9028b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548201600000,1548205200000,1548208800000,1548212400000,1548216000000,1548219600000,1548223200000,1548226800000,1548230400000,1548234000000,1548237600000,1548241200000,1548244800000,1548248400000,1548252000000,1548255600000,1548259200000,1548262800000,1548266400000,1548270000000,1548273600000,1548277200000,1548280800000,1548284400000,1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[570,330,100,40,50,290,690,1260,1450,1660,2520,1690,1800,2240,4410,1820,2010,2090,2730,2120,2520,2800,1960,970,480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240]},{"name":"URL","color":"#2373DB","values":[300,140,90,70,20,110,370,750,960,1470,1690,1910,1880,1870,2050,2090,2170,2320,2300,2420,2330,1680,1200,970,430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850]},{"name":"Groups","color":"#9ED448","values":[740,250,70,60,100,440,820,680,940,1340,1410,1480,1930,2130,1750,1460,1730,1700,1740,2110,2350,3000,4530,1870,960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760]},{"name":"Channel","color":"#4fae4e","values":[110,60,20,60,20,0,60,80,90,130,60,150,150,370,190,180,430,210,290,180,190,260,120,70,70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80]},{"name":"Search","color":"#F5BD25","values":[40,30,0,10,0,370,200,160,190,170,270,520,300,360,300,260,330,550,360,90,260,340,100,160,280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50]},{"name":"Other","color":"#F79E39","values":[190,50,40,0,0,0,200,210,130,150,330,220,330,360,240,410,250,260,410,410,500,240,360,120,70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,10,10,0,0,0,0,10,10,0,10,10,30,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/27.json b/public/chartDummyData/views_zoom/2019-01/27.json new file mode 100644 index 000000000..dad9cd4b9 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548288000000,1548291600000,1548295200000,1548298800000,1548302400000,1548306000000,1548309600000,1548313200000,1548316800000,1548320400000,1548324000000,1548327600000,1548331200000,1548334800000,1548338400000,1548342000000,1548345600000,1548349200000,1548352800000,1548356400000,1548360000000,1548363600000,1548367200000,1548370800000,1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[480,170,80,60,80,140,1130,720,1260,1490,1360,1810,1790,2340,1710,1930,1760,2230,2340,2140,2890,2080,1650,1230,490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090]},{"name":"URL","color":"#2373DB","values":[430,140,100,0,30,130,420,670,820,1280,1530,2000,1950,1540,1520,1870,2510,2600,2670,2210,2060,1600,1320,710,350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570]},{"name":"Groups","color":"#9ED448","values":[960,350,90,50,20,280,850,800,1100,1260,1190,1480,1590,2340,1560,1370,2070,1910,1900,2200,2740,2870,3230,1630,580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790]},{"name":"Channel","color":"#4fae4e","values":[70,30,10,50,60,10,20,40,70,20,130,120,140,190,110,140,190,170,100,190,150,200,180,140,60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130]},{"name":"Search","color":"#F5BD25","values":[280,40,10,0,40,40,180,120,250,260,250,200,360,180,780,220,330,510,270,700,490,930,190,170,60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110]},{"name":"Other","color":"#F79E39","values":[70,40,50,0,20,60,150,250,230,260,200,220,200,300,370,270,330,290,330,340,330,380,330,160,120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/28.json b/public/chartDummyData/views_zoom/2019-01/28.json new file mode 100644 index 000000000..c0ddfadbb --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548374400000,1548378000000,1548381600000,1548385200000,1548388800000,1548392400000,1548396000000,1548399600000,1548403200000,1548406800000,1548410400000,1548414000000,1548417600000,1548421200000,1548424800000,1548428400000,1548432000000,1548435600000,1548439200000,1548442800000,1548446400000,1548450000000,1548453600000,1548457200000,1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[490,320,120,1690,70,110,690,790,1090,1530,1780,2020,2490,1600,2090,1660,2060,2410,2090,2020,2020,3260,1340,1060,800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200]},{"name":"URL","color":"#2373DB","values":[350,280,150,30,150,140,360,990,1230,1530,1550,1840,1990,1840,1930,2060,2250,2440,2780,2110,2000,1670,1400,840,540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620]},{"name":"Groups","color":"#9ED448","values":[580,260,120,40,120,360,850,1080,1110,1190,1170,1910,1330,2020,2060,1930,1730,1490,2130,1540,3110,2530,2420,1770,1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140]},{"name":"Channel","color":"#4fae4e","values":[60,170,10,70,20,20,10,20,70,70,130,60,310,100,600,140,170,140,240,90,160,220,170,90,50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240]},{"name":"Search","color":"#F5BD25","values":[60,40,50,0,0,70,210,190,350,630,250,360,780,240,650,200,250,650,580,410,790,180,110,100,60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250]},{"name":"Other","color":"#F79E39","values":[120,50,60,30,0,10,170,200,270,180,310,280,250,400,280,290,250,240,390,460,410,430,330,410,120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,0,10,20,10,40,20,20,10,0,0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/29.json b/public/chartDummyData/views_zoom/2019-01/29.json new file mode 100644 index 000000000..d438c766d --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548460800000,1548464400000,1548468000000,1548471600000,1548475200000,1548478800000,1548482400000,1548486000000,1548489600000,1548493200000,1548496800000,1548500400000,1548504000000,1548507600000,1548511200000,1548514800000,1548518400000,1548522000000,1548525600000,1548529200000,1548532800000,1548536400000,1548540000000,1548543600000,1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[800,370,220,50,40,110,2060,710,1000,1700,1870,2050,2170,2690,2070,1660,2760,2090,2250,1820,1660,2020,1610,1220,800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260]},{"name":"URL","color":"#2373DB","values":[540,290,250,150,50,100,170,480,940,1070,1640,1860,1680,1810,1700,1600,1580,1850,2060,1550,1160,1140,830,870,610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830]},{"name":"Groups","color":"#9ED448","values":[1040,300,220,50,90,90,320,1090,890,1190,1580,1430,1720,2190,1830,1460,1860,1390,1620,1560,1970,2220,1830,1740,1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740]},{"name":"Channel","color":"#4fae4e","values":[50,20,20,10,0,10,30,40,40,60,160,100,130,280,150,80,170,200,110,70,190,80,110,90,70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110]},{"name":"Search","color":"#F5BD25","values":[60,40,0,0,0,0,200,190,230,190,110,220,160,470,100,270,510,100,290,100,180,100,110,200,210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90]},{"name":"Other","color":"#F79E39","values":[120,30,40,30,10,20,30,160,250,250,310,270,370,430,250,240,230,190,340,280,310,260,270,100,210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,30,0,20,10,30,0,0,10,20,50,30,20,0,10,10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/30.json b/public/chartDummyData/views_zoom/2019-01/30.json new file mode 100644 index 000000000..12cc7d7e6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548547200000,1548550800000,1548554400000,1548558000000,1548561600000,1548565200000,1548568800000,1548572400000,1548576000000,1548579600000,1548583200000,1548586800000,1548590400000,1548594000000,1548597600000,1548601200000,1548604800000,1548608400000,1548612000000,1548615600000,1548619200000,1548622800000,1548626400000,1548630000000,1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[800,550,220,110,100,110,330,400,800,1390,1480,1960,1670,2050,3570,2120,1690,2220,2290,2140,2460,2480,2210,1220,900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170]},{"name":"URL","color":"#2373DB","values":[610,410,230,130,100,50,130,160,350,780,1340,1350,1500,1400,1530,1650,1450,1570,1520,1620,1710,1610,1090,800,470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930]},{"name":"Groups","color":"#9ED448","values":[1620,900,230,100,80,210,90,470,900,1060,1420,1540,1550,1270,1740,1390,1720,1810,1980,1870,2630,2780,3050,1980,770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670]},{"name":"Channel","color":"#4fae4e","values":[70,20,30,40,0,0,20,20,80,120,80,160,120,230,310,250,100,150,370,140,130,170,200,160,100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200]},{"name":"Search","color":"#F5BD25","values":[210,50,10,10,10,0,20,70,170,450,310,240,330,300,1660,2000,1750,680,310,390,300,400,1460,880,170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150]},{"name":"Other","color":"#F79E39","values":[210,180,50,20,30,20,50,260,190,180,260,430,450,470,280,290,280,320,360,310,430,320,380,220,120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190]},{"name":"PM","color":"#E65850","values":[10,10,0,0,0,10,10,0,10,10,10,0,20,0,10,10,20,0,0,20,20,10,0,20,0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20]}]} diff --git a/public/chartDummyData/views_zoom/2019-01/31.json b/public/chartDummyData/views_zoom/2019-01/31.json new file mode 100644 index 000000000..74562bf8c --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-01/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548633600000,1548637200000,1548640800000,1548644400000,1548648000000,1548651600000,1548655200000,1548658800000,1548662400000,1548666000000,1548669600000,1548673200000,1548676800000,1548680400000,1548684000000,1548687600000,1548691200000,1548694800000,1548698400000,1548702000000,1548705600000,1548709200000,1548712800000,1548716400000,1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[900,230,140,60,60,370,690,890,1620,1700,1490,1590,1990,2280,1890,2280,2130,2280,2090,2350,2410,2450,1940,1240,470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610]},{"name":"URL","color":"#2373DB","values":[470,170,170,10,0,150,320,740,970,1280,1450,1720,1440,1660,1980,1910,2120,2440,2480,2460,2150,2320,1450,640,360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760]},{"name":"Groups","color":"#9ED448","values":[770,400,110,50,50,520,860,990,1080,1230,1240,1480,2030,1660,1670,1770,1710,1930,2090,2060,2830,2870,3440,2520,730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110]},{"name":"Channel","color":"#4fae4e","values":[100,70,0,0,0,110,90,30,120,220,70,120,160,150,150,220,190,130,120,220,200,150,180,100,70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480]},{"name":"Search","color":"#F5BD25","values":[170,20,0,0,0,10,190,120,310,180,130,400,240,490,240,120,180,490,290,60,170,120,170,90,130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220]},{"name":"Other","color":"#F79E39","values":[120,80,20,10,20,40,110,160,230,200,220,300,260,420,240,310,250,200,330,390,360,300,240,150,120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,10,0,10,0,0,0,0,10,0,10,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/01.json b/public/chartDummyData/views_zoom/2019-02/01.json new file mode 100644 index 000000000..1d635c900 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548720000000,1548723600000,1548727200000,1548730800000,1548734400000,1548738000000,1548741600000,1548745200000,1548748800000,1548752400000,1548756000000,1548759600000,1548763200000,1548766800000,1548770400000,1548774000000,1548777600000,1548781200000,1548784800000,1548788400000,1548792000000,1548795600000,1548799200000,1548802800000,1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[470,300,70,70,40,180,2050,1060,1090,1080,1520,1940,1490,2120,2160,1720,2060,2610,2350,2580,2580,2860,1790,1240,510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160]},{"name":"URL","color":"#2373DB","values":[360,190,80,60,10,100,470,740,1080,1110,1440,1710,1630,2250,2150,2200,2370,2370,2520,1870,2110,1660,1220,850,310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200]},{"name":"Groups","color":"#9ED448","values":[730,180,120,130,120,230,950,1100,990,1290,1250,1510,1880,1640,1710,1240,1910,1690,1720,1920,2300,3450,2530,1760,840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780]},{"name":"Channel","color":"#4fae4e","values":[70,0,10,30,10,20,70,50,50,80,140,90,80,110,150,120,230,170,170,210,230,120,220,80,70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30]},{"name":"Search","color":"#F5BD25","values":[130,10,0,20,0,20,290,70,350,100,260,180,170,280,230,180,260,470,180,350,300,200,220,50,30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110]},{"name":"Other","color":"#F79E39","values":[120,50,30,10,10,50,160,210,280,250,140,310,330,240,330,280,330,400,410,410,430,390,160,160,80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,10,10,0,20,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/02.json b/public/chartDummyData/views_zoom/2019-02/02.json new file mode 100644 index 000000000..0b73020d5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548806400000,1548810000000,1548813600000,1548817200000,1548820800000,1548824400000,1548828000000,1548831600000,1548835200000,1548838800000,1548842400000,1548846000000,1548849600000,1548853200000,1548856800000,1548860400000,1548864000000,1548867600000,1548871200000,1548874800000,1548878400000,1548882000000,1548885600000,1548889200000,1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,330,130,70,70,250,840,970,1150,1270,1560,2080,1920,2460,3500,2020,2410,2620,2640,2340,2550,2160,1890,1090,430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090]},{"name":"URL","color":"#2373DB","values":[310,170,150,90,50,80,410,690,1070,1210,1340,1530,1850,1590,1780,1960,2240,2640,2250,2290,2590,1830,1160,570,370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810]},{"name":"Groups","color":"#9ED448","values":[840,270,110,40,50,220,760,1020,1290,1340,1500,1460,1700,1670,1770,1840,1620,1890,2270,2080,2460,3020,2900,1790,830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630]},{"name":"Channel","color":"#4fae4e","values":[70,40,10,10,10,0,70,50,30,130,80,110,110,180,250,90,230,110,90,150,100,230,220,130,40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130]},{"name":"Search","color":"#F5BD25","values":[30,10,0,0,0,10,350,380,190,180,120,490,160,180,380,160,280,370,270,220,210,280,140,110,80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110]},{"name":"Other","color":"#F79E39","values":[80,60,0,50,30,30,110,200,150,200,270,320,340,360,260,360,310,360,360,330,600,350,330,80,70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,10,10,0,0,10,0,0,10,0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/03.json b/public/chartDummyData/views_zoom/2019-02/03.json new file mode 100644 index 000000000..2ff1dcd19 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548892800000,1548896400000,1548900000000,1548903600000,1548907200000,1548910800000,1548914400000,1548918000000,1548921600000,1548925200000,1548928800000,1548932400000,1548936000000,1548939600000,1548943200000,1548946800000,1548950400000,1548954000000,1548957600000,1548961200000,1548964800000,1548968400000,1548972000000,1548975600000,1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,270,90,70,120,190,640,1090,1330,3630,1780,2170,2090,1980,2400,1810,2120,2590,2400,2170,2250,2380,2180,1200,540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210]},{"name":"URL","color":"#2373DB","values":[370,280,70,30,30,100,370,710,940,1210,1530,1600,1900,1850,1690,1630,2510,2230,2280,2280,2260,1680,1390,620,430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790]},{"name":"Groups","color":"#9ED448","values":[830,280,90,50,20,420,580,890,1120,1490,1130,1640,1670,1510,1600,1440,1620,1730,1600,1980,2690,3440,2210,2140,1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950]},{"name":"Channel","color":"#4fae4e","values":[40,30,10,0,10,0,10,90,70,60,90,160,130,140,220,70,80,330,160,140,130,180,270,240,130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180]},{"name":"Search","color":"#F5BD25","values":[80,140,40,10,0,20,50,370,140,190,170,500,170,110,290,180,270,820,330,260,350,190,920,250,140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160]},{"name":"Other","color":"#F79E39","values":[70,40,30,0,40,30,160,140,180,350,240,310,390,390,370,210,280,310,320,320,460,310,330,220,30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,20,10,0,10,20,10,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/04.json b/public/chartDummyData/views_zoom/2019-02/04.json new file mode 100644 index 000000000..9e598c69b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1548979200000,1548982800000,1548986400000,1548990000000,1548993600000,1548997200000,1549000800000,1549004400000,1549008000000,1549011600000,1549015200000,1549018800000,1549022400000,1549026000000,1549029600000,1549033200000,1549036800000,1549040400000,1549044000000,1549047600000,1549051200000,1549054800000,1549058400000,1549062000000,1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[540,280,160,690,80,210,700,1430,1320,1540,1580,2220,1930,2140,2070,1960,1930,2000,2460,2370,2420,2210,1890,1260,720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500]},{"name":"URL","color":"#2373DB","values":[430,180,50,40,20,130,390,880,840,1330,1720,1810,2420,1980,1940,1930,2100,2570,2520,2190,1860,1140,1270,830,330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950]},{"name":"Groups","color":"#9ED448","values":[1020,310,140,40,90,310,660,1060,960,1480,930,1280,1710,1720,1650,1830,2210,1820,1620,2070,1970,2180,2340,1740,920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590]},{"name":"Channel","color":"#4fae4e","values":[130,60,0,50,10,40,80,100,100,180,100,210,140,170,180,140,80,240,120,70,260,300,100,110,50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130]},{"name":"Search","color":"#F5BD25","values":[140,140,80,20,60,130,300,510,180,140,420,430,560,190,140,330,250,260,480,230,530,150,70,90,60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200]},{"name":"Other","color":"#F79E39","values":[30,70,50,30,10,70,120,130,210,320,270,210,350,350,250,190,310,410,280,280,250,470,220,260,70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,10,0,10,10,0,0,10,10,40,10,10,0,10,20,10,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/05.json b/public/chartDummyData/views_zoom/2019-02/05.json new file mode 100644 index 000000000..0fffafecb --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549065600000,1549069200000,1549072800000,1549076400000,1549080000000,1549083600000,1549087200000,1549090800000,1549094400000,1549098000000,1549101600000,1549105200000,1549108800000,1549112400000,1549116000000,1549119600000,1549123200000,1549126800000,1549130400000,1549134000000,1549137600000,1549141200000,1549144800000,1549148400000,1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[720,300,130,70,40,80,2190,760,1060,1430,1590,2120,2310,2210,1720,2060,1930,1990,1880,2040,1870,1820,1680,1170,960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170]},{"name":"URL","color":"#2373DB","values":[330,200,130,30,60,130,280,340,730,1190,1770,1780,1700,1650,1760,1430,1860,1960,1840,1500,1280,1080,910,930,510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780]},{"name":"Groups","color":"#9ED448","values":[920,400,80,40,60,110,310,630,1140,1070,1250,1310,1600,1560,1250,1510,1560,1270,1550,1330,1360,1870,2060,1670,1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700]},{"name":"Channel","color":"#4fae4e","values":[50,110,40,10,0,50,40,100,90,120,150,160,210,140,240,210,150,190,120,120,140,100,70,200,70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80]},{"name":"Search","color":"#F5BD25","values":[60,70,10,0,0,20,20,410,320,410,360,460,430,260,400,290,220,520,310,320,180,330,120,150,40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50]},{"name":"Other","color":"#F79E39","values":[70,50,10,10,10,30,60,50,210,290,210,320,360,320,320,210,390,320,400,270,270,390,240,190,140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,20,0,20,0,10,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/06.json b/public/chartDummyData/views_zoom/2019-02/06.json new file mode 100644 index 000000000..40bd490af --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549152000000,1549155600000,1549159200000,1549162800000,1549166400000,1549170000000,1549173600000,1549177200000,1549180800000,1549184400000,1549188000000,1549191600000,1549195200000,1549198800000,1549202400000,1549206000000,1549209600000,1549213200000,1549216800000,1549220400000,1549224000000,1549227600000,1549231200000,1549234800000,1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[960,750,310,50,1230,60,160,480,930,1840,1630,2930,2420,2210,2040,1680,2220,2220,2300,2130,2100,3170,1870,1610,620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320]},{"name":"URL","color":"#2373DB","values":[510,250,80,70,30,40,100,170,610,1090,1420,1320,1290,1400,1320,1510,1590,1350,1790,1580,1900,1830,1170,760,270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960]},{"name":"Groups","color":"#9ED448","values":[1200,730,380,100,70,30,340,410,1120,1330,1630,1570,1610,1510,1340,1210,1410,1410,1710,1910,2270,2700,3000,2110,1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660]},{"name":"Channel","color":"#4fae4e","values":[70,70,40,10,0,40,60,0,150,130,130,160,260,120,150,70,160,150,200,180,240,200,130,480,130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130]},{"name":"Search","color":"#F5BD25","values":[40,40,0,0,10,0,20,80,380,310,230,240,210,300,190,210,640,260,220,440,290,140,200,220,200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140]},{"name":"Other","color":"#F79E39","values":[140,60,60,20,0,20,50,100,140,250,280,330,300,340,240,190,300,290,250,340,440,340,310,170,140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,30,10,40,10,10,0,10,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/07.json b/public/chartDummyData/views_zoom/2019-02/07.json new file mode 100644 index 000000000..a4a85aa93 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549238400000,1549242000000,1549245600000,1549249200000,1549252800000,1549256400000,1549260000000,1549263600000,1549267200000,1549270800000,1549274400000,1549278000000,1549281600000,1549285200000,1549288800000,1549292400000,1549296000000,1549299600000,1549303200000,1549306800000,1549310400000,1549314000000,1549317600000,1549321200000,1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[620,250,130,140,80,130,1550,800,1220,1660,2250,1930,1870,1900,2330,2010,1710,2100,2150,2130,2520,2330,1740,1160,780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300]},{"name":"URL","color":"#2373DB","values":[270,130,50,80,40,90,390,620,940,1030,1550,1680,1820,1770,1380,1500,2000,2580,2340,2090,2020,1870,1470,1200,490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760]},{"name":"Groups","color":"#9ED448","values":[1110,320,120,60,50,230,660,1080,910,1190,1330,1290,2120,2130,1410,1460,1650,1890,2450,1930,2370,3140,2390,1780,670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750]},{"name":"Channel","color":"#4fae4e","values":[130,50,20,10,0,10,60,60,100,110,60,120,180,200,190,110,190,130,270,110,170,170,160,30,10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190]},{"name":"Search","color":"#F5BD25","values":[200,20,70,10,10,30,80,160,170,310,110,410,370,350,250,190,260,200,240,280,520,380,250,110,30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200]},{"name":"Other","color":"#F79E39","values":[140,80,50,30,20,80,90,190,200,140,180,240,270,190,500,280,270,330,380,570,380,560,340,140,60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,20,0,10,20,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/08.json b/public/chartDummyData/views_zoom/2019-02/08.json new file mode 100644 index 000000000..190dd87dc --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549324800000,1549328400000,1549332000000,1549335600000,1549339200000,1549342800000,1549346400000,1549350000000,1549353600000,1549357200000,1549360800000,1549364400000,1549368000000,1549371600000,1549375200000,1549378800000,1549382400000,1549386000000,1549389600000,1549393200000,1549396800000,1549400400000,1549404000000,1549407600000,1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[780,240,190,70,180,180,2700,1300,1030,1480,1800,1610,1750,2070,2100,2040,1940,2210,2110,2480,2660,2540,1900,1090,600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030]},{"name":"URL","color":"#2373DB","values":[490,260,90,30,60,110,440,760,1050,1020,1570,1630,1950,1860,1680,2200,1870,2220,2370,2080,1950,1560,1210,810,390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050]},{"name":"Groups","color":"#9ED448","values":[670,170,90,50,50,260,540,1090,1360,1030,1090,1250,1930,1810,1610,1760,1430,1720,2330,1760,2520,2850,2630,1630,870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750]},{"name":"Channel","color":"#4fae4e","values":[10,0,30,0,20,10,50,60,50,200,120,130,90,250,250,140,90,160,120,160,330,190,200,130,70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110]},{"name":"Search","color":"#F5BD25","values":[30,150,10,10,20,30,200,180,310,340,490,190,210,140,190,210,200,180,260,250,300,210,110,110,20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290]},{"name":"Other","color":"#F79E39","values":[60,30,10,30,10,70,120,210,220,100,190,290,350,450,270,350,250,440,380,360,360,390,300,200,140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,30,10,0,0,10,0,20,0,0,30,10,10,0,0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/09.json b/public/chartDummyData/views_zoom/2019-02/09.json new file mode 100644 index 000000000..17554da04 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549411200000,1549414800000,1549418400000,1549422000000,1549425600000,1549429200000,1549432800000,1549436400000,1549440000000,1549443600000,1549447200000,1549450800000,1549454400000,1549458000000,1549461600000,1549465200000,1549468800000,1549472400000,1549476000000,1549479600000,1549483200000,1549486800000,1549490400000,1549494000000,1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,270,80,60,90,2230,440,740,1060,1800,1550,1530,1660,2370,2280,2090,1960,2400,2630,2430,2830,2980,2210,1210,710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230]},{"name":"URL","color":"#2373DB","values":[390,270,100,80,20,40,230,760,1160,1300,1180,1890,1920,1770,1910,1660,1940,2530,2400,2270,2050,1790,1220,790,310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720]},{"name":"Groups","color":"#9ED448","values":[870,300,70,120,40,330,750,1010,990,1280,1260,1320,1690,1750,1600,1800,1350,2060,1970,2290,1720,2730,2890,1950,910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490]},{"name":"Channel","color":"#4fae4e","values":[70,10,10,10,0,0,80,10,90,80,110,300,60,160,150,120,400,90,180,470,240,330,210,180,70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30]},{"name":"Search","color":"#F5BD25","values":[20,10,20,0,0,70,220,230,300,310,80,470,270,250,200,240,230,80,380,270,270,640,330,160,10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10]},{"name":"Other","color":"#F79E39","values":[140,20,20,0,10,40,130,260,270,170,240,300,280,370,250,190,370,260,310,280,440,430,320,260,160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,20,0,10,30,20,0,10,10,0,30,10,20,0,0,0,0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/10.json b/public/chartDummyData/views_zoom/2019-02/10.json new file mode 100644 index 000000000..7d9447c6c --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549497600000,1549501200000,1549504800000,1549508400000,1549512000000,1549515600000,1549519200000,1549522800000,1549526400000,1549530000000,1549533600000,1549537200000,1549540800000,1549544400000,1549548000000,1549551600000,1549555200000,1549558800000,1549562400000,1549566000000,1549569600000,1549573200000,1549576800000,1549580400000,1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[710,450,180,220,60,200,980,910,1250,1090,1800,3800,1870,2130,2130,2170,2290,2120,2880,2610,2350,2250,1870,1500,480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270]},{"name":"URL","color":"#2373DB","values":[310,150,250,140,190,90,270,870,940,1240,1500,1800,1800,1860,1640,1610,2270,2880,3000,2520,2220,1670,1600,950,310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720]},{"name":"Groups","color":"#9ED448","values":[910,350,130,80,90,310,660,1370,1530,1280,1450,1470,1960,1500,1920,1290,1760,1640,1870,1810,2260,2930,2820,1590,1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780]},{"name":"Channel","color":"#4fae4e","values":[70,0,0,0,10,10,30,50,120,70,80,60,80,190,230,180,220,180,150,220,180,240,190,130,40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90]},{"name":"Search","color":"#F5BD25","values":[10,20,10,30,0,20,230,200,750,380,400,210,230,130,240,150,420,310,240,470,530,400,240,200,150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110]},{"name":"Other","color":"#F79E39","values":[160,40,0,10,0,60,120,130,280,310,270,370,320,280,280,280,290,360,430,390,440,430,340,200,110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200]},{"name":"PM","color":"#E65850","values":[0,0,0,10,0,0,0,0,0,0,10,0,30,0,20,0,10,10,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/11.json b/public/chartDummyData/views_zoom/2019-02/11.json new file mode 100644 index 000000000..d606075a4 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549584000000,1549587600000,1549591200000,1549594800000,1549598400000,1549602000000,1549605600000,1549609200000,1549612800000,1549616400000,1549620000000,1549623600000,1549627200000,1549630800000,1549634400000,1549638000000,1549641600000,1549645200000,1549648800000,1549652400000,1549656000000,1549659600000,1549663200000,1549666800000,1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[480,260,120,90,170,250,870,910,1050,1280,1540,1380,1670,1820,1830,1900,1950,2110,2380,2170,2600,2020,1570,1170,660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920]},{"name":"URL","color":"#2373DB","values":[310,290,140,20,30,90,450,800,900,1450,1910,1860,2170,2180,1900,2020,2560,2440,2220,2060,1680,1450,1280,780,580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700]},{"name":"Groups","color":"#9ED448","values":[1040,180,70,40,110,260,670,1100,860,1180,1360,1670,1930,1950,1590,2060,2040,1580,1330,1940,2220,2710,2320,1700,1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330]},{"name":"Channel","color":"#4fae4e","values":[40,0,20,0,20,20,40,80,110,110,140,110,140,300,170,180,160,170,190,200,120,210,140,80,30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80]},{"name":"Search","color":"#F5BD25","values":[150,160,10,0,90,120,650,150,150,160,350,220,150,230,470,160,140,240,290,80,150,290,150,50,110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90]},{"name":"Other","color":"#F79E39","values":[110,60,10,20,40,50,190,170,190,350,300,240,260,290,370,360,360,300,280,280,280,340,310,200,80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,20,0,0,20,40,10,0,0,0,10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/12.json b/public/chartDummyData/views_zoom/2019-02/12.json new file mode 100644 index 000000000..985f2b074 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549670400000,1549674000000,1549677600000,1549681200000,1549684800000,1549688400000,1549692000000,1549695600000,1549699200000,1549702800000,1549706400000,1549710000000,1549713600000,1549717200000,1549720800000,1549724400000,1549728000000,1549731600000,1549735200000,1549738800000,1549742400000,1549746000000,1549749600000,1549753200000,1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[660,310,120,140,420,150,710,920,1120,1580,1740,1660,2110,2280,2730,2300,2280,1980,1980,2440,2240,1660,1520,1320,2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140]},{"name":"URL","color":"#2373DB","values":[580,410,140,10,30,30,210,460,690,1160,1740,1920,1830,1800,1760,1580,2070,1850,2130,1600,1290,1450,1220,960,700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860]},{"name":"Groups","color":"#9ED448","values":[1080,310,170,60,40,100,300,810,770,1340,1040,1470,1810,1710,1430,1080,1330,1490,1570,1660,2040,1620,1620,1660,1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170]},{"name":"Channel","color":"#4fae4e","values":[30,10,40,0,30,0,90,170,60,100,130,60,130,220,200,150,150,270,170,180,180,130,180,130,120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100]},{"name":"Search","color":"#F5BD25","values":[110,10,30,0,10,10,580,420,60,490,320,150,500,180,390,660,400,260,340,420,280,60,100,140,80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140]},{"name":"Other","color":"#F79E39","values":[80,80,40,10,0,0,70,120,300,250,250,310,300,290,170,250,160,310,470,290,190,180,290,280,220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,10,30,20,10,10,20,20,20,30,0,0,10,20,0,20,10,10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/13.json b/public/chartDummyData/views_zoom/2019-02/13.json new file mode 100644 index 000000000..7a7da9572 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549756800000,1549760400000,1549764000000,1549767600000,1549771200000,1549774800000,1549778400000,1549782000000,1549785600000,1549789200000,1549792800000,1549796400000,1549800000000,1549803600000,1549807200000,1549810800000,1549814400000,1549818000000,1549821600000,1549825200000,1549828800000,1549832400000,1549836000000,1549839600000,1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[2490,1040,230,70,170,50,140,610,1900,1530,2050,2020,2560,2050,2270,1920,2170,2100,1970,2160,2520,2240,1870,1300,640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120]},{"name":"URL","color":"#2373DB","values":[700,440,110,90,60,50,70,300,520,1090,1680,1830,1280,1640,1450,1490,1580,1820,1720,1440,1780,1410,1210,760,430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770]},{"name":"Groups","color":"#9ED448","values":[1070,720,240,110,80,130,80,290,680,1040,1400,1530,1320,1560,1340,1290,1600,1580,1660,1530,2420,2830,2450,1750,990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450]},{"name":"Channel","color":"#4fae4e","values":[120,100,20,10,0,0,30,70,70,100,200,100,100,200,190,230,260,210,130,190,150,260,160,190,60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40]},{"name":"Search","color":"#F5BD25","values":[80,50,10,10,80,30,30,190,60,440,420,190,340,210,320,280,760,270,200,190,400,220,180,200,30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100]},{"name":"Other","color":"#F79E39","values":[220,40,30,40,10,20,50,110,190,350,260,330,340,390,240,300,290,390,270,320,360,250,360,210,150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,0,0,10,10,0,30,10,0,0,10,30,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/14.json b/public/chartDummyData/views_zoom/2019-02/14.json new file mode 100644 index 000000000..b526c88f8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549843200000,1549846800000,1549850400000,1549854000000,1549857600000,1549861200000,1549864800000,1549868400000,1549872000000,1549875600000,1549879200000,1549882800000,1549886400000,1549890000000,1549893600000,1549897200000,1549900800000,1549904400000,1549908000000,1549911600000,1549915200000,1549918800000,1549922400000,1549926000000,1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[640,160,90,50,60,270,1940,920,1150,1590,1570,1530,1840,2090,1940,2740,2240,1980,2060,2350,2400,3130,2880,1030,450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320]},{"name":"URL","color":"#2373DB","values":[430,220,50,30,40,80,320,760,950,1360,1470,1740,1720,1750,1900,1970,2260,2430,2140,2210,2080,1950,1260,1050,390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640]},{"name":"Groups","color":"#9ED448","values":[990,640,220,80,130,490,730,860,1160,1300,1180,1340,1610,1590,1290,1560,1620,1670,1820,2090,2750,3100,2480,1750,730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370]},{"name":"Channel","color":"#4fae4e","values":[60,30,10,40,10,40,160,80,70,190,50,140,110,190,250,170,240,210,170,40,240,190,280,110,40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290]},{"name":"Search","color":"#F5BD25","values":[30,50,10,10,0,60,140,330,160,180,420,240,440,180,270,330,100,270,260,380,170,190,180,290,90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100]},{"name":"Other","color":"#F79E39","values":[150,30,0,10,20,100,120,160,260,210,220,220,240,250,370,340,310,390,310,380,410,390,370,230,80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,10,0,10,20,10,0,0,0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/15.json b/public/chartDummyData/views_zoom/2019-02/15.json new file mode 100644 index 000000000..b23820581 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1549929600000,1549933200000,1549936800000,1549940400000,1549944000000,1549947600000,1549951200000,1549954800000,1549958400000,1549962000000,1549965600000,1549969200000,1549972800000,1549976400000,1549980000000,1549983600000,1549987200000,1549990800000,1549994400000,1549998000000,1550001600000,1550005200000,1550008800000,1550012400000,1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,250,140,100,190,1550,730,800,1200,1410,1660,1690,2160,1780,1860,1920,2280,2400,3170,2270,2300,2030,1730,1230,540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930]},{"name":"URL","color":"#2373DB","values":[390,170,40,50,110,120,400,810,1040,930,1870,1610,2010,2000,1590,1800,2400,2320,2590,2170,2430,1830,1220,720,440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610]},{"name":"Groups","color":"#9ED448","values":[730,220,70,80,60,290,700,900,1120,1230,1180,1280,1420,1870,1600,1280,1480,1530,1830,1990,2750,2720,2530,1490,720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430]},{"name":"Channel","color":"#4fae4e","values":[40,0,10,10,0,70,30,30,90,40,80,280,170,90,170,180,210,130,210,180,190,120,130,30,220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100]},{"name":"Search","color":"#F5BD25","values":[90,20,10,40,10,10,390,160,340,220,180,60,230,160,240,200,240,270,190,150,380,220,160,10,10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50]},{"name":"Other","color":"#F79E39","values":[80,30,20,20,10,50,200,190,300,170,230,370,240,210,440,220,300,270,430,210,430,400,260,200,90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,10,0,0,0,10,20,10,10,10,0,0,0,0,0,0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/16.json b/public/chartDummyData/views_zoom/2019-02/16.json new file mode 100644 index 000000000..0865c5296 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550016000000,1550019600000,1550023200000,1550026800000,1550030400000,1550034000000,1550037600000,1550041200000,1550044800000,1550048400000,1550052000000,1550055600000,1550059200000,1550062800000,1550066400000,1550070000000,1550073600000,1550077200000,1550080800000,1550084400000,1550088000000,1550091600000,1550095200000,1550098800000,1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[540,180,230,80,100,200,540,2850,1450,1530,1820,1980,1950,1890,1850,2120,1760,1850,2220,2320,2330,2700,1760,1270,630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160]},{"name":"URL","color":"#2373DB","values":[440,100,40,10,30,60,390,920,890,1070,1480,1660,1640,1840,2000,1750,2310,2770,2470,2140,2110,1920,1560,720,300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830]},{"name":"Groups","color":"#9ED448","values":[720,450,120,80,80,360,670,990,1320,1490,1430,1580,1470,1400,1610,1320,1520,1680,1950,1870,1840,2560,2330,1780,530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450]},{"name":"Channel","color":"#4fae4e","values":[220,20,30,10,0,50,100,150,70,150,100,80,100,140,100,170,240,100,170,200,150,260,110,90,80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80]},{"name":"Search","color":"#F5BD25","values":[10,20,0,0,0,60,200,240,480,190,80,450,120,200,150,160,180,430,170,380,260,290,200,110,60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20]},{"name":"Other","color":"#F79E39","values":[90,20,0,10,20,80,140,280,260,240,300,290,310,230,260,320,270,340,370,420,420,330,310,200,80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,10,0,20,10,0,0,30,10,10,30,0,0,0,10,0,0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/17.json b/public/chartDummyData/views_zoom/2019-02/17.json new file mode 100644 index 000000000..85b881da0 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550102400000,1550106000000,1550109600000,1550113200000,1550116800000,1550120400000,1550124000000,1550127600000,1550131200000,1550134800000,1550138400000,1550142000000,1550145600000,1550149200000,1550152800000,1550156400000,1550160000000,1550163600000,1550167200000,1550170800000,1550174400000,1550178000000,1550181600000,1550185200000,1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[630,230,120,110,70,280,2670,1250,1420,1600,1530,2010,2340,2030,2020,1910,2010,2380,1740,2680,1960,2110,1810,920,480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970]},{"name":"URL","color":"#2373DB","values":[300,70,0,10,20,160,410,930,1010,1240,1850,1990,1900,1640,1840,1840,2260,2160,2210,1890,1900,1630,960,700,320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790]},{"name":"Groups","color":"#9ED448","values":[530,250,130,90,130,440,850,970,1120,1520,1530,1480,1470,1650,1300,1500,1420,1490,1570,1700,1620,2190,1890,1330,730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460]},{"name":"Channel","color":"#4fae4e","values":[80,110,70,0,0,30,70,80,10,90,100,170,150,200,120,110,180,170,190,120,150,180,110,80,70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80]},{"name":"Search","color":"#F5BD25","values":[60,0,40,10,60,220,290,160,370,170,190,220,240,200,110,500,220,450,190,190,200,190,80,90,200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80]},{"name":"Other","color":"#F79E39","values":[80,20,20,0,10,60,130,290,270,300,250,360,310,380,300,380,340,400,310,260,360,380,380,250,90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,20,10,0,30,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/18.json b/public/chartDummyData/views_zoom/2019-02/18.json new file mode 100644 index 000000000..f1e1edcb4 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550188800000,1550192400000,1550196000000,1550199600000,1550203200000,1550206800000,1550210400000,1550214000000,1550217600000,1550221200000,1550224800000,1550228400000,1550232000000,1550235600000,1550239200000,1550242800000,1550246400000,1550250000000,1550253600000,1550257200000,1550260800000,1550264400000,1550268000000,1550271600000,1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[480,190,130,50,100,300,570,840,1090,3140,1580,1750,1770,2340,2170,1890,2370,2250,1960,2020,2080,2070,3370,1140,490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830]},{"name":"URL","color":"#2373DB","values":[320,100,170,0,20,80,360,770,1040,1120,1810,1980,1830,2070,1560,2110,2050,2480,2750,2180,1690,1620,1340,860,360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610]},{"name":"Groups","color":"#9ED448","values":[730,170,120,20,60,200,520,660,1290,1190,1230,1410,1400,1480,1560,1090,1640,1680,1550,1900,2020,2200,1800,1170,450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560]},{"name":"Channel","color":"#4fae4e","values":[70,40,20,20,10,40,40,30,40,120,70,150,150,200,140,120,170,240,130,190,240,220,80,100,20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130]},{"name":"Search","color":"#F5BD25","values":[200,20,10,0,20,10,120,120,110,250,110,160,50,220,210,180,210,360,230,170,400,250,120,140,160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120]},{"name":"Other","color":"#F79E39","values":[90,90,40,20,20,50,110,240,240,330,260,230,380,390,480,210,250,340,200,310,350,430,310,350,120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,20,0,10,10,0,10,10,20,20,0,30,30,10,30,40,0,0,0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/19.json b/public/chartDummyData/views_zoom/2019-02/19.json new file mode 100644 index 000000000..ec7a2eb08 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550275200000,1550278800000,1550282400000,1550286000000,1550289600000,1550293200000,1550296800000,1550300400000,1550304000000,1550307600000,1550311200000,1550314800000,1550318400000,1550322000000,1550325600000,1550329200000,1550332800000,1550336400000,1550340000000,1550343600000,1550347200000,1550350800000,1550354400000,1550358000000,1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[490,340,120,30,40,160,2000,940,1150,1400,2030,1890,1970,2250,1740,1790,1720,1760,1930,2460,1760,1620,1360,1120,670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930]},{"name":"URL","color":"#2373DB","values":[360,70,90,10,40,40,120,470,890,1280,1770,1730,1790,2080,1620,1720,1740,1660,2090,1610,1390,980,980,770,570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690]},{"name":"Groups","color":"#9ED448","values":[450,480,120,70,60,160,370,740,1290,1120,1210,1270,1350,1360,1400,1140,1010,1290,1400,1690,1250,1730,1610,1450,870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440]},{"name":"Channel","color":"#4fae4e","values":[20,50,70,0,0,0,70,50,90,80,60,160,220,140,180,200,110,60,130,150,230,160,100,40,20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110]},{"name":"Search","color":"#F5BD25","values":[160,40,100,10,0,30,70,40,130,190,140,160,220,330,160,420,380,110,230,70,150,70,130,100,50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50]},{"name":"Other","color":"#F79E39","values":[120,90,10,70,0,10,90,160,210,330,210,180,320,330,290,290,200,210,230,230,310,300,280,120,60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,20,0,10,0,30,10,10,10,20,10,20,10,10,10,40,20,20,0,0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/20.json b/public/chartDummyData/views_zoom/2019-02/20.json new file mode 100644 index 000000000..2c0ed38c8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550361600000,1550365200000,1550368800000,1550372400000,1550376000000,1550379600000,1550383200000,1550386800000,1550390400000,1550394000000,1550397600000,1550401200000,1550404800000,1550408400000,1550412000000,1550415600000,1550419200000,1550422800000,1550426400000,1550430000000,1550433600000,1550437200000,1550440800000,1550444400000,1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[670,570,240,40,60,100,320,2490,1000,2010,2100,1970,2060,2790,1920,2230,1980,2040,2150,1890,4760,2250,1740,1320,580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040]},{"name":"URL","color":"#2373DB","values":[570,230,170,110,0,10,70,330,650,950,1170,1560,1310,1440,1490,1070,1510,1890,1910,1830,1670,1300,1070,640,310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790]},{"name":"Groups","color":"#9ED448","values":[870,540,230,70,80,80,210,650,900,1070,1040,1260,1340,1450,1290,1150,990,1280,1570,1640,2030,2660,2440,1370,620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530]},{"name":"Channel","color":"#4fae4e","values":[20,450,30,10,30,10,20,70,70,70,260,120,150,210,130,170,140,210,160,190,200,120,190,290,140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470]},{"name":"Search","color":"#F5BD25","values":[50,70,10,10,0,0,50,80,170,620,440,730,400,180,190,120,410,170,180,220,390,170,110,100,70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90]},{"name":"Other","color":"#F79E39","values":[60,50,0,30,10,20,20,110,190,350,550,230,250,310,280,220,350,280,190,190,380,250,280,160,110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,20,0,10,30,0,10,10,10,10,0,20,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/21.json b/public/chartDummyData/views_zoom/2019-02/21.json new file mode 100644 index 000000000..e94ffac05 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550448000000,1550451600000,1550455200000,1550458800000,1550462400000,1550466000000,1550469600000,1550473200000,1550476800000,1550480400000,1550484000000,1550487600000,1550491200000,1550494800000,1550498400000,1550502000000,1550505600000,1550509200000,1550512800000,1550516400000,1550520000000,1550523600000,1550527200000,1550530800000,1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[580,390,150,20,30,340,1200,1010,1150,1440,1820,1870,1650,2170,1820,2010,1780,2100,2030,2520,2780,2940,1730,930,630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150]},{"name":"URL","color":"#2373DB","values":[310,170,30,20,20,60,330,890,870,1250,1450,1720,1410,1930,1930,1820,2170,2370,2540,2010,1870,1770,1250,610,340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740]},{"name":"Groups","color":"#9ED448","values":[620,110,90,20,70,330,590,1220,880,1170,1570,1270,1600,1390,1520,1210,1750,1830,1830,1960,2670,3070,2430,1430,480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430]},{"name":"Channel","color":"#4fae4e","values":[140,80,50,0,20,20,40,100,80,130,40,60,90,90,140,190,230,190,140,180,150,220,130,100,10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130]},{"name":"Search","color":"#F5BD25","values":[70,0,20,0,10,150,160,320,220,400,370,160,340,300,120,210,290,120,260,120,250,240,150,50,50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60]},{"name":"Other","color":"#F79E39","values":[110,40,70,30,20,40,60,190,160,210,190,250,380,280,290,260,370,260,320,520,340,400,310,280,130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,10,10,0,10,0,10,10,0,10,0,0,0,10,0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/22.json b/public/chartDummyData/views_zoom/2019-02/22.json new file mode 100644 index 000000000..510256c45 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550534400000,1550538000000,1550541600000,1550545200000,1550548800000,1550552400000,1550556000000,1550559600000,1550563200000,1550566800000,1550570400000,1550574000000,1550577600000,1550581200000,1550584800000,1550588400000,1550592000000,1550595600000,1550599200000,1550602800000,1550606400000,1550610000000,1550613600000,1550617200000,1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[630,330,240,350,270,270,2920,920,1140,1230,1620,1770,1770,1920,2110,1780,1720,2050,1900,2270,2230,2400,1450,1160,390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980]},{"name":"URL","color":"#2373DB","values":[340,140,20,20,80,110,310,850,950,1440,1350,2000,2010,1840,1640,2000,2200,2540,2080,2060,2250,1740,1450,830,280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590]},{"name":"Groups","color":"#9ED448","values":[480,110,90,60,50,360,800,1040,1100,990,1210,1190,1610,1480,1550,1690,1560,2260,1550,2220,2250,2530,2380,1450,450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440]},{"name":"Channel","color":"#4fae4e","values":[10,50,10,0,0,10,280,40,60,30,60,70,70,160,100,170,120,200,200,140,90,230,120,80,70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90]},{"name":"Search","color":"#F5BD25","values":[50,0,20,20,0,40,180,740,40,190,130,490,150,180,200,520,180,170,180,180,250,320,260,20,80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100]},{"name":"Other","color":"#F79E39","values":[130,10,50,20,40,110,120,210,220,170,240,270,220,340,270,290,360,270,260,480,340,280,300,220,140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,10,10,0,10,0,10,0,0,0,10,20,20,10,10,0,0,10,0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/23.json b/public/chartDummyData/views_zoom/2019-02/23.json new file mode 100644 index 000000000..5bae3ef1f --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550620800000,1550624400000,1550628000000,1550631600000,1550635200000,1550638800000,1550642400000,1550646000000,1550649600000,1550653200000,1550656800000,1550660400000,1550664000000,1550667600000,1550671200000,1550674800000,1550678400000,1550682000000,1550685600000,1550689200000,1550692800000,1550696400000,1550700000000,1550703600000,1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,190,50,40,100,290,810,910,1120,1540,1310,1330,1520,1740,1870,3770,2060,1870,2280,2010,2550,2190,1810,970,450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990]},{"name":"URL","color":"#2373DB","values":[280,130,20,10,10,120,440,620,800,1200,1770,1980,2080,2200,1910,2130,2170,2480,2940,2450,2120,1800,1350,790,520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810]},{"name":"Groups","color":"#9ED448","values":[450,220,70,10,20,360,660,1050,1150,1090,1520,1410,1740,1470,1410,1230,1480,1660,1580,2170,1830,3200,1820,1460,620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460]},{"name":"Channel","color":"#4fae4e","values":[70,20,10,0,10,20,120,80,90,90,90,120,60,180,230,230,230,160,100,220,100,240,120,80,60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210]},{"name":"Search","color":"#F5BD25","values":[80,10,10,0,0,200,140,190,210,270,180,190,270,250,120,160,300,280,80,290,190,150,230,80,30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50]},{"name":"Other","color":"#F79E39","values":[140,50,20,40,50,60,40,160,250,240,330,370,320,350,250,300,270,270,380,330,340,290,290,170,30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,50,0,20,0,0,10,0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/24.json b/public/chartDummyData/views_zoom/2019-02/24.json new file mode 100644 index 000000000..ca7fc95db --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550707200000,1550710800000,1550714400000,1550718000000,1550721600000,1550725200000,1550728800000,1550732400000,1550736000000,1550739600000,1550743200000,1550746800000,1550750400000,1550754000000,1550757600000,1550761200000,1550764800000,1550768400000,1550772000000,1550775600000,1550779200000,1550782800000,1550786400000,1550790000000,1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[450,220,90,60,90,310,990,1090,930,3610,1580,1870,2460,1860,2190,1660,1910,2110,2370,2340,2110,2140,1630,830,360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760]},{"name":"URL","color":"#2373DB","values":[520,280,50,30,60,120,340,890,1240,1410,1440,1730,2000,1940,1760,1870,2140,2560,2580,1990,2210,1820,1150,610,330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670]},{"name":"Groups","color":"#9ED448","values":[620,450,40,10,90,230,550,930,1140,990,1140,1230,1330,1370,1660,1670,1470,1380,1500,1890,2050,2630,2350,1560,700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420]},{"name":"Channel","color":"#4fae4e","values":[60,0,10,10,10,20,80,40,130,90,80,130,60,170,130,130,230,190,110,130,150,120,260,130,50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,0,110,300,190,210,300,240,240,140,630,310,160,210,170,330,480,140,260,260,120,50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0]},{"name":"Other","color":"#F79E39","values":[30,100,30,20,0,50,190,210,280,230,270,250,250,280,320,330,300,290,280,330,410,320,320,210,80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,0,0,10,10,0,20,10,0,0,0,20,30,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/25.json b/public/chartDummyData/views_zoom/2019-02/25.json new file mode 100644 index 000000000..748c939ed --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550793600000,1550797200000,1550800800000,1550804400000,1550808000000,1550811600000,1550815200000,1550818800000,1550822400000,1550826000000,1550829600000,1550833200000,1550836800000,1550840400000,1550844000000,1550847600000,1550851200000,1550854800000,1550858400000,1550862000000,1550865600000,1550869200000,1550872800000,1550876400000,1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[360,230,160,40,70,190,820,1140,2840,1690,1570,1920,2170,2190,2240,2250,2060,1990,2130,2220,2160,2140,2170,930,530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050]},{"name":"URL","color":"#2373DB","values":[330,140,30,0,60,110,460,740,920,1780,1790,2220,1710,2240,1900,1850,2220,2730,2540,2130,1700,1650,1310,690,480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840]},{"name":"Groups","color":"#9ED448","values":[700,190,50,50,30,350,570,880,960,1230,1170,1210,1240,1640,1570,1270,1480,1670,2130,1670,2120,1960,1900,1440,770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640]},{"name":"Channel","color":"#4fae4e","values":[50,40,30,0,10,10,70,70,150,90,110,130,130,160,180,150,120,230,230,200,180,110,120,110,190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160]},{"name":"Search","color":"#F5BD25","values":[50,10,90,0,0,290,130,390,130,520,200,440,250,310,250,230,300,240,400,200,90,160,120,50,220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460]},{"name":"Other","color":"#F79E39","values":[80,20,40,20,10,30,100,190,260,210,170,310,330,500,280,500,410,340,260,340,410,250,200,140,80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,20,20,10,0,10,0,20,10,0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/26.json b/public/chartDummyData/views_zoom/2019-02/26.json new file mode 100644 index 000000000..1fc7ab983 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550880000000,1550883600000,1550887200000,1550890800000,1550894400000,1550898000000,1550901600000,1550905200000,1550908800000,1550912400000,1550916000000,1550919600000,1550923200000,1550926800000,1550930400000,1550934000000,1550937600000,1550941200000,1550944800000,1550948400000,1550952000000,1550955600000,1550959200000,1550962800000,1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[530,200,230,460,70,130,400,970,1050,1420,1880,1850,1960,2020,2170,1840,1930,1930,2190,1750,3720,1820,1780,1040,630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080]},{"name":"URL","color":"#2373DB","values":[480,120,160,50,30,80,80,480,1160,1560,1640,1960,1690,1910,2060,1550,1880,2170,1860,1750,1450,1220,1010,790,510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840]},{"name":"Groups","color":"#9ED448","values":[770,350,250,210,40,140,730,660,1000,1250,1050,1440,1730,1570,1040,1200,1210,1330,1560,1430,1750,1790,1610,1530,780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260]},{"name":"Channel","color":"#4fae4e","values":[190,10,0,0,20,20,40,50,70,100,200,130,180,190,270,240,110,250,140,130,140,160,160,470,690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130]},{"name":"Search","color":"#F5BD25","values":[220,170,0,40,10,100,170,280,110,230,140,310,270,250,240,90,160,120,240,280,320,210,240,90,80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130]},{"name":"Other","color":"#F79E39","values":[80,70,30,0,30,30,60,100,230,260,290,170,330,280,400,160,200,320,350,300,250,240,210,150,80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,10,0,20,10,10,20,0,30,0,0,10,10,30,10,0,0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/27.json b/public/chartDummyData/views_zoom/2019-02/27.json new file mode 100644 index 000000000..19ae87a79 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1550966400000,1550970000000,1550973600000,1550977200000,1550980800000,1550984400000,1550988000000,1550991600000,1550995200000,1550998800000,1551002400000,1551006000000,1551009600000,1551013200000,1551016800000,1551020400000,1551024000000,1551027600000,1551031200000,1551034800000,1551038400000,1551042000000,1551045600000,1551049200000,1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[630,480,280,70,40,60,2350,710,1040,2170,2810,2060,2210,2100,1640,2350,2560,2030,2430,2370,1990,2260,1710,1150,500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990]},{"name":"URL","color":"#2373DB","values":[510,340,100,110,10,20,50,360,610,1050,1570,1500,1340,1310,1850,1710,1250,1760,1950,1630,1680,1690,1570,740,350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510]},{"name":"Groups","color":"#9ED448","values":[780,440,200,100,40,50,250,590,920,1130,1470,1310,1220,1250,1220,1430,1340,1270,1690,1850,2860,2290,2250,1430,800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580]},{"name":"Channel","color":"#4fae4e","values":[690,80,10,20,10,10,60,50,120,270,200,110,150,120,140,200,240,240,140,170,160,140,120,130,210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90]},{"name":"Search","color":"#F5BD25","values":[80,10,20,0,0,40,90,160,460,380,240,280,350,390,180,200,180,390,130,200,260,240,60,60,80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150]},{"name":"Other","color":"#F79E39","values":[80,20,30,30,10,20,60,200,210,240,350,260,250,420,260,280,180,280,280,310,260,390,230,250,150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,10,10,10,0,20,0,0,0,0,20,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-02/28.json b/public/chartDummyData/views_zoom/2019-02/28.json new file mode 100644 index 000000000..8c23cb3d8 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-02/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551052800000,1551056400000,1551060000000,1551063600000,1551067200000,1551070800000,1551074400000,1551078000000,1551081600000,1551085200000,1551088800000,1551092400000,1551096000000,1551099600000,1551103200000,1551106800000,1551110400000,1551114000000,1551117600000,1551121200000,1551124800000,1551128400000,1551132000000,1551135600000,1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[500,250,30,210,30,260,980,900,1530,1650,1440,1680,2040,1940,1900,2260,2310,3050,1860,2350,2490,3060,2030,980,500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610]},{"name":"URL","color":"#2373DB","values":[350,240,50,20,40,130,320,780,840,1040,1570,2030,1680,1640,1690,1750,2530,2440,2490,2530,2010,1990,1290,590,220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580]},{"name":"Groups","color":"#9ED448","values":[800,170,100,40,40,590,690,860,880,1320,1320,1430,1790,1640,2040,1600,1620,1600,1830,2060,2230,2860,2220,1440,590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720]},{"name":"Channel","color":"#4fae4e","values":[210,30,0,10,0,10,20,50,60,110,50,290,370,170,180,150,220,70,170,200,150,170,220,90,70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170]},{"name":"Search","color":"#F5BD25","values":[80,20,30,10,10,90,250,410,280,250,760,690,460,210,270,250,240,240,240,330,300,150,160,100,10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50]},{"name":"Other","color":"#F79E39","values":[150,50,20,20,0,50,100,140,220,230,180,180,320,300,330,240,210,390,320,380,390,370,410,140,120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,0,10,0,0,0,0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/01.json b/public/chartDummyData/views_zoom/2019-03/01.json new file mode 100644 index 000000000..47e8d5bf6 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551139200000,1551142800000,1551146400000,1551150000000,1551153600000,1551157200000,1551160800000,1551164400000,1551168000000,1551171600000,1551175200000,1551178800000,1551182400000,1551186000000,1551189600000,1551193200000,1551196800000,1551200400000,1551204000000,1551207600000,1551211200000,1551214800000,1551218400000,1551222000000,1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[500,190,90,20,60,170,830,3040,1020,1510,1800,1570,2050,2150,2470,1850,1980,2070,2310,2350,2270,2160,1820,990,190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070]},{"name":"URL","color":"#2373DB","values":[220,60,30,10,40,80,420,720,1050,1220,1220,1600,2040,1780,1710,1830,2330,2640,2490,2170,2330,1940,1470,810,360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640]},{"name":"Groups","color":"#9ED448","values":[590,130,140,90,90,450,980,800,970,1180,1040,1400,1700,1650,1710,1310,1590,1390,1760,2060,2770,2720,2160,1460,620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600]},{"name":"Channel","color":"#4fae4e","values":[70,0,30,20,0,40,20,80,50,110,80,150,150,130,150,220,180,140,190,120,230,110,190,210,60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180]},{"name":"Search","color":"#F5BD25","values":[10,20,0,20,0,90,130,290,290,180,90,350,180,140,130,140,360,110,230,380,140,330,100,50,30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420]},{"name":"Other","color":"#F79E39","values":[120,90,0,0,0,50,230,210,240,310,160,270,250,390,260,230,280,440,340,410,350,420,240,70,40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,10,20,10,0,10,0,0,10,10,10,10,20,10,20,10,10,0,0,0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/02.json b/public/chartDummyData/views_zoom/2019-03/02.json new file mode 100644 index 000000000..19de4100c --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551225600000,1551229200000,1551232800000,1551236400000,1551240000000,1551243600000,1551247200000,1551250800000,1551254400000,1551258000000,1551261600000,1551265200000,1551268800000,1551272400000,1551276000000,1551279600000,1551283200000,1551286800000,1551290400000,1551294000000,1551297600000,1551301200000,1551304800000,1551308400000,1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[190,170,1910,60,20,380,790,1300,1350,1590,1900,2150,2110,2140,2150,2340,2050,2140,2060,2790,2610,2370,1820,760,410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060]},{"name":"URL","color":"#2373DB","values":[360,200,140,20,20,110,550,810,960,1400,1560,1880,1920,1950,1870,2040,2480,2830,2630,2340,2340,1800,1490,670,240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700]},{"name":"Groups","color":"#9ED448","values":[620,250,160,30,60,290,920,890,960,830,1410,1580,1850,1800,1340,1650,1620,1530,1680,1950,2580,2480,1980,1420,460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550]},{"name":"Channel","color":"#4fae4e","values":[60,50,30,0,0,40,140,120,80,30,80,60,90,140,180,140,210,210,180,220,190,160,80,50,60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160]},{"name":"Search","color":"#F5BD25","values":[30,70,20,10,10,20,230,80,240,490,520,660,150,180,330,110,270,230,230,170,340,360,190,0,10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50]},{"name":"Other","color":"#F79E39","values":[40,40,40,20,0,40,130,300,250,350,300,330,320,320,260,200,320,290,420,390,420,380,230,150,60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,0,10,0,0,20,10,20,0,10,40,10,0,10,0,0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/03.json b/public/chartDummyData/views_zoom/2019-03/03.json new file mode 100644 index 000000000..eb9854586 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551312000000,1551315600000,1551319200000,1551322800000,1551326400000,1551330000000,1551333600000,1551337200000,1551340800000,1551344400000,1551348000000,1551351600000,1551355200000,1551358800000,1551362400000,1551366000000,1551369600000,1551373200000,1551376800000,1551380400000,1551384000000,1551387600000,1551391200000,1551394800000,1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[410,160,100,60,50,170,2920,1140,1140,1360,1610,1800,1960,2340,2120,2250,2130,2130,2160,2210,2330,1980,1430,1050,500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140]},{"name":"URL","color":"#2373DB","values":[240,60,30,20,70,90,490,940,810,1440,1530,2030,2290,1840,1650,1780,1770,2610,2660,2160,1870,1890,1150,840,410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710]},{"name":"Groups","color":"#9ED448","values":[460,100,60,50,90,350,840,940,1000,930,850,1230,1220,1660,1300,1400,1490,1430,1330,2130,1930,2560,2090,1640,450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400]},{"name":"Channel","color":"#4fae4e","values":[60,30,10,0,0,0,30,20,40,70,130,70,180,160,250,130,200,210,270,130,210,180,200,160,80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70]},{"name":"Search","color":"#F5BD25","values":[10,10,0,40,40,180,750,300,290,210,60,110,80,200,160,240,250,190,130,130,350,240,240,460,30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140]},{"name":"Other","color":"#F79E39","values":[60,20,10,10,20,60,150,210,200,250,270,370,350,320,280,330,280,350,290,360,370,310,250,190,60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,30,0,0,0,0,0,0,20,30,30,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/04.json b/public/chartDummyData/views_zoom/2019-03/04.json new file mode 100644 index 000000000..acbc90b3f --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551398400000,1551402000000,1551405600000,1551409200000,1551412800000,1551416400000,1551420000000,1551423600000,1551427200000,1551430800000,1551434400000,1551438000000,1551441600000,1551445200000,1551448800000,1551452400000,1551456000000,1551459600000,1551463200000,1551466800000,1551470400000,1551474000000,1551477600000,1551481200000,1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[500,150,1910,80,100,260,640,1000,1280,1180,1430,1660,2180,2450,2060,2310,2070,2010,2290,2510,2060,2190,1860,1080,560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950]},{"name":"URL","color":"#2373DB","values":[410,170,80,50,50,90,620,1110,1040,1370,1550,1990,2070,1870,1910,1900,2070,2630,2740,2110,1910,1560,1070,840,500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810]},{"name":"Groups","color":"#9ED448","values":[450,210,80,30,90,230,860,920,1010,1120,1130,1090,1540,2090,1600,1420,1110,1470,1690,1690,1910,1930,2260,1260,740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380]},{"name":"Channel","color":"#4fae4e","values":[80,70,10,0,0,10,90,30,110,70,70,100,130,150,190,210,300,310,90,180,190,140,280,130,80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100]},{"name":"Search","color":"#F5BD25","values":[30,20,0,0,20,390,420,260,240,170,490,220,290,200,230,230,380,180,260,140,210,350,160,130,30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90]},{"name":"Other","color":"#F79E39","values":[60,80,10,40,20,50,330,210,250,380,180,250,370,260,360,440,310,270,280,330,330,350,200,120,50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,10,0,0,10,0,20,20,20,10,10,10,10,20,20,10,10,10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/05.json b/public/chartDummyData/views_zoom/2019-03/05.json new file mode 100644 index 000000000..5e72c0487 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551484800000,1551488400000,1551492000000,1551495600000,1551499200000,1551502800000,1551506400000,1551510000000,1551513600000,1551517200000,1551520800000,1551524400000,1551528000000,1551531600000,1551535200000,1551538800000,1551542400000,1551546000000,1551549600000,1551553200000,1551556800000,1551560400000,1551564000000,1551567600000,1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[560,240,70,880,440,370,580,790,1170,1790,1700,1750,1860,2340,2180,2200,2260,2010,1720,1830,2670,1980,1310,990,740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960]},{"name":"URL","color":"#2373DB","values":[500,260,110,30,20,30,160,450,820,1290,1600,1760,1920,1540,1560,1700,1600,2040,1980,1710,1340,1100,1160,510,650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660]},{"name":"Groups","color":"#9ED448","values":[740,360,150,40,50,270,420,820,1290,1040,1550,1170,1740,1740,1420,1370,1180,1260,1740,1540,1470,1870,1730,1580,730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620]},{"name":"Channel","color":"#4fae4e","values":[80,30,10,60,10,50,60,60,120,80,240,100,100,250,200,210,160,120,140,90,180,180,180,90,120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110]},{"name":"Search","color":"#F5BD25","values":[30,20,0,0,10,40,60,250,300,150,170,80,230,360,420,310,200,220,130,120,260,260,150,150,40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240]},{"name":"Other","color":"#F79E39","values":[50,40,20,0,0,30,70,210,180,270,340,310,270,400,240,190,260,290,300,290,350,220,210,150,180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,20,0,10,0,30,20,20,0,10,10,30,0,20,30,0,0,0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/06.json b/public/chartDummyData/views_zoom/2019-03/06.json new file mode 100644 index 000000000..e93419121 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551571200000,1551574800000,1551578400000,1551582000000,1551585600000,1551589200000,1551592800000,1551596400000,1551600000000,1551603600000,1551607200000,1551610800000,1551614400000,1551618000000,1551621600000,1551625200000,1551628800000,1551632400000,1551636000000,1551639600000,1551643200000,1551646800000,1551650400000,1551654000000,1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[740,420,340,70,130,50,1040,1540,1100,1880,2890,2330,2630,2200,2520,1980,2710,2340,2490,2930,2450,1830,2110,1610,640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840]},{"name":"URL","color":"#2373DB","values":[650,260,110,140,10,10,90,240,470,880,1480,1980,1300,1560,1360,1340,1570,1880,1940,1910,1820,1570,970,580,400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780]},{"name":"Groups","color":"#9ED448","values":[730,280,190,30,30,80,190,470,840,1240,1560,1370,1390,1020,1270,1260,1290,1340,1650,1620,2100,2120,2310,1720,730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510]},{"name":"Channel","color":"#4fae4e","values":[120,100,80,20,20,30,30,90,90,130,160,160,110,430,220,140,170,180,320,280,200,170,170,170,60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100]},{"name":"Search","color":"#F5BD25","values":[40,20,10,10,40,30,10,110,350,190,100,340,230,190,330,200,320,350,300,520,190,280,270,50,30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130]},{"name":"Other","color":"#F79E39","values":[180,120,20,20,10,10,30,90,140,280,250,220,270,320,300,200,360,330,300,220,300,320,300,210,120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,10,0,20,0,10,10,10,50,10,10,20,0,0,30,0,0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/07.json b/public/chartDummyData/views_zoom/2019-03/07.json new file mode 100644 index 000000000..527bb1a11 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/07.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551657600000,1551661200000,1551664800000,1551668400000,1551672000000,1551675600000,1551679200000,1551682800000,1551686400000,1551690000000,1551693600000,1551697200000,1551700800000,1551704400000,1551708000000,1551711600000,1551715200000,1551718800000,1551722400000,1551726000000,1551729600000,1551733200000,1551736800000,1551740400000,1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[640,160,160,40,130,180,470,1180,1700,2630,2590,2170,1810,2250,1780,2030,2240,2140,1810,2310,2200,2350,2370,1070,550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740]},{"name":"URL","color":"#2373DB","values":[400,60,20,30,30,50,300,820,1030,1080,1530,1810,1860,1800,1620,1930,2180,3020,2580,1890,1730,1620,1250,640,260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650]},{"name":"Groups","color":"#9ED448","values":[730,240,160,0,30,280,620,910,1100,1410,1260,1200,1550,1470,1490,1340,1290,1350,1820,1720,2160,2750,2470,1600,550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800]},{"name":"Channel","color":"#4fae4e","values":[60,90,10,10,20,10,40,80,100,130,150,170,190,160,90,170,120,150,360,220,100,150,240,180,90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230]},{"name":"Search","color":"#F5BD25","values":[30,60,0,0,10,120,190,470,270,220,230,220,160,210,280,170,210,200,490,250,250,290,660,420,80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110]},{"name":"Other","color":"#F79E39","values":[120,80,20,10,0,70,140,170,230,230,290,360,420,360,300,250,270,280,340,270,380,300,280,150,20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,20,0,10,10,0,20,0,10,10,0,0,20,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/08.json b/public/chartDummyData/views_zoom/2019-03/08.json new file mode 100644 index 000000000..cc1ee5849 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/08.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551744000000,1551747600000,1551751200000,1551754800000,1551758400000,1551762000000,1551765600000,1551769200000,1551772800000,1551776400000,1551780000000,1551783600000,1551787200000,1551790800000,1551794400000,1551798000000,1551801600000,1551805200000,1551808800000,1551812400000,1551816000000,1551819600000,1551823200000,1551826800000,1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[550,270,110,120,90,170,1890,890,1610,1610,1790,2130,2140,1750,2130,1880,2150,2260,2530,2080,2930,1860,1540,1060,470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050]},{"name":"URL","color":"#2373DB","values":[260,100,70,60,0,70,210,1000,980,1030,1440,1930,1940,1590,1650,1600,2290,2620,2690,2380,2180,1680,1610,700,330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590]},{"name":"Groups","color":"#9ED448","values":[550,300,120,70,60,390,500,760,1120,1000,1290,1330,1580,1460,1300,1560,1470,1610,1630,1760,2250,2850,1880,1550,350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510]},{"name":"Channel","color":"#4fae4e","values":[90,60,10,0,10,20,90,30,60,210,140,100,150,190,210,70,90,350,320,150,220,170,230,160,10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130]},{"name":"Search","color":"#F5BD25","values":[80,20,0,0,10,30,140,280,260,390,240,390,120,420,330,230,190,230,400,200,750,550,100,50,20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30]},{"name":"Other","color":"#F79E39","values":[20,30,20,0,30,30,140,250,170,200,270,210,280,370,430,280,440,350,330,450,530,390,470,210,100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,0,10,10,0,0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/09.json b/public/chartDummyData/views_zoom/2019-03/09.json new file mode 100644 index 000000000..f3241d750 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/09.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551830400000,1551834000000,1551837600000,1551841200000,1551844800000,1551848400000,1551852000000,1551855600000,1551859200000,1551862800000,1551866400000,1551870000000,1551873600000,1551877200000,1551880800000,1551884400000,1551888000000,1551891600000,1551895200000,1551898800000,1551902400000,1551906000000,1551909600000,1551913200000,1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[470,340,150,60,130,290,760,2330,1120,1330,1720,2050,1910,2100,1770,1990,1940,2970,2090,2220,2580,2350,1790,1140,390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800]},{"name":"URL","color":"#2373DB","values":[330,110,80,20,30,80,530,1130,1110,1080,1390,1700,1950,1780,1770,1970,2410,2920,2630,2170,2230,1720,1200,710,250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560]},{"name":"Groups","color":"#9ED448","values":[350,230,180,120,30,420,660,760,1160,1060,1270,1320,1690,1550,1360,1570,1200,1880,1560,1840,2620,2980,2370,1400,480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820]},{"name":"Channel","color":"#4fae4e","values":[10,40,10,10,10,10,10,40,70,90,60,110,190,90,200,360,200,270,210,160,190,360,260,70,130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100]},{"name":"Search","color":"#F5BD25","values":[20,20,0,30,20,0,380,300,250,90,40,380,200,170,100,260,240,220,170,270,210,150,90,140,120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40]},{"name":"Other","color":"#F79E39","values":[100,30,10,20,10,60,120,240,210,150,160,210,420,370,390,210,370,510,310,380,530,240,230,170,150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,10,0,10,0,0,0,10,10,0,10,10,20,0,0,0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/10.json b/public/chartDummyData/views_zoom/2019-03/10.json new file mode 100644 index 000000000..599ee6334 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/10.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1551916800000,1551920400000,1551924000000,1551927600000,1551931200000,1551934800000,1551938400000,1551942000000,1551945600000,1551949200000,1551952800000,1551956400000,1551960000000,1551963600000,1551967200000,1551970800000,1551974400000,1551978000000,1551981600000,1551985200000,1551988800000,1551992400000,1551996000000,1551999600000,1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,150,110,40,10,2030,850,940,1060,1740,1650,1770,2390,2210,1860,1770,2060,2230,1950,1870,2670,2640,2140,950,550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490]},{"name":"URL","color":"#2373DB","values":[250,110,90,10,20,60,470,870,1260,1320,1710,1530,1970,1750,1950,1900,2350,2530,2690,2330,1850,1950,1340,810,390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660]},{"name":"Groups","color":"#9ED448","values":[480,140,40,70,80,380,750,1040,1020,1320,1220,1420,1390,1420,1450,1270,1380,1310,1640,1630,2270,2920,2410,1380,590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100]},{"name":"Channel","color":"#4fae4e","values":[130,80,30,0,20,10,20,30,50,90,90,70,150,170,170,220,120,140,140,140,180,230,80,100,40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140]},{"name":"Search","color":"#F5BD25","values":[120,20,0,0,0,20,410,170,170,300,210,90,180,660,200,230,370,690,260,270,410,200,420,90,10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110]},{"name":"Other","color":"#F79E39","values":[150,20,20,40,10,0,130,230,250,240,290,260,260,300,340,280,330,320,360,350,290,340,270,170,50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,20,10,20,0,20,20,0,10,10,10,30,20,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/11.json b/public/chartDummyData/views_zoom/2019-03/11.json new file mode 100644 index 000000000..2d7130d56 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/11.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552003200000,1552006800000,1552010400000,1552014000000,1552017600000,1552021200000,1552024800000,1552028400000,1552032000000,1552035600000,1552039200000,1552042800000,1552046400000,1552050000000,1552053600000,1552057200000,1552060800000,1552064400000,1552068000000,1552071600000,1552075200000,1552078800000,1552082400000,1552086000000,1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[550,100,310,1590,70,330,820,1030,1210,1590,1890,1820,1990,2830,2210,1940,1880,2390,2300,2620,3310,2220,1780,960,610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100]},{"name":"URL","color":"#2373DB","values":[390,180,60,10,20,180,460,910,1120,1100,1520,1580,2000,2020,1600,2150,2070,2880,2420,2220,2040,1310,910,660,400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770]},{"name":"Groups","color":"#9ED448","values":[590,180,100,50,40,410,700,1170,1060,1360,1150,1330,1300,1400,1320,950,1010,1480,1660,1780,2300,2280,1940,1620,870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560]},{"name":"Channel","color":"#4fae4e","values":[40,30,20,10,0,0,20,40,60,40,80,350,130,120,100,90,90,110,170,100,240,170,280,110,40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90]},{"name":"Search","color":"#F5BD25","values":[10,20,20,10,0,70,190,100,390,200,290,460,150,210,290,140,320,220,120,160,230,170,140,240,10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150]},{"name":"Other","color":"#F79E39","values":[50,20,30,20,40,80,130,170,310,200,240,280,260,290,320,330,220,280,270,260,290,350,290,170,60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,10,0,10,0,30,10,20,40,20,20,10,20,0,10,0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/12.json b/public/chartDummyData/views_zoom/2019-03/12.json new file mode 100644 index 000000000..d878f2407 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/12.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552089600000,1552093200000,1552096800000,1552100400000,1552104000000,1552107600000,1552111200000,1552114800000,1552118400000,1552122000000,1552125600000,1552129200000,1552132800000,1552136400000,1552140000000,1552143600000,1552147200000,1552150800000,1552154400000,1552158000000,1552161600000,1552165200000,1552168800000,1552172400000,1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[610,570,310,60,100,180,400,1270,1500,1750,1420,2060,2340,2120,2620,1790,2360,2070,2190,2950,2570,2020,1500,840,1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030]},{"name":"URL","color":"#2373DB","values":[400,300,150,40,10,100,280,490,1150,1120,1680,1770,1890,1970,1590,1780,1630,1770,1940,1820,1120,970,830,780,430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670]},{"name":"Groups","color":"#9ED448","values":[870,450,130,20,80,160,410,720,1000,1150,1610,1350,1580,1510,1350,1420,1140,1800,1550,1570,1850,1920,1750,1510,1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880]},{"name":"Channel","color":"#4fae4e","values":[40,180,50,0,0,0,50,40,130,140,120,100,240,180,270,170,150,150,90,60,100,90,160,100,90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100]},{"name":"Search","color":"#F5BD25","values":[10,10,10,0,10,20,50,280,180,330,250,130,140,230,380,80,130,450,130,380,240,350,70,130,80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200]},{"name":"Other","color":"#F79E39","values":[60,60,40,70,0,20,70,150,210,330,310,260,360,260,250,250,290,200,270,210,320,130,210,80,60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,30,20,0,20,20,0,0,10,10,0,10,10,10,20,0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/13.json b/public/chartDummyData/views_zoom/2019-03/13.json new file mode 100644 index 000000000..526aa7c78 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/13.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552176000000,1552179600000,1552183200000,1552186800000,1552190400000,1552194000000,1552197600000,1552201200000,1552204800000,1552208400000,1552212000000,1552215600000,1552219200000,1552222800000,1552226400000,1552230000000,1552233600000,1552237200000,1552240800000,1552244400000,1552248000000,1552251600000,1552255200000,1552258800000,1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[1050,470,310,150,110,130,1170,670,1330,1610,3640,2100,4320,3390,2310,2400,1840,2660,2730,2500,2560,2610,2260,1740,620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020]},{"name":"URL","color":"#2373DB","values":[430,560,180,50,0,50,60,260,740,1190,1310,1520,1330,1290,1550,1590,1320,1270,1500,1800,1560,1350,940,650,310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080]},{"name":"Groups","color":"#9ED448","values":[1180,520,230,70,90,110,210,570,1020,1290,1110,1570,1390,1390,1220,1440,1260,1570,1340,1630,2200,2450,2230,1800,640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600]},{"name":"Channel","color":"#4fae4e","values":[90,60,20,10,30,0,10,70,50,110,70,230,200,120,130,200,190,170,160,200,210,200,480,230,110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100]},{"name":"Search","color":"#F5BD25","values":[80,10,10,40,0,60,20,60,420,140,300,400,280,220,240,70,150,410,130,330,150,120,160,110,20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360]},{"name":"Other","color":"#F79E39","values":[60,70,30,60,30,20,110,130,230,310,290,270,340,390,240,190,240,250,200,330,270,310,210,180,100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,0,10,0,0,10,10,30,20,10,0,20,20,0,0,0,10,0,0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/14.json b/public/chartDummyData/views_zoom/2019-03/14.json new file mode 100644 index 000000000..381293eef --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/14.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552262400000,1552266000000,1552269600000,1552273200000,1552276800000,1552280400000,1552284000000,1552287600000,1552291200000,1552294800000,1552298400000,1552302000000,1552305600000,1552309200000,1552312800000,1552316400000,1552320000000,1552323600000,1552327200000,1552330800000,1552334400000,1552338000000,1552341600000,1552345200000,1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[620,270,120,80,100,160,610,850,1270,1560,2220,1560,1970,2260,2420,2000,1720,2270,1790,2580,2350,2440,2340,1050,750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150]},{"name":"URL","color":"#2373DB","values":[310,140,90,0,30,100,530,730,950,950,1170,1670,1730,1620,1600,1910,2070,2580,2390,2290,1970,1850,1250,590,200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740]},{"name":"Groups","color":"#9ED448","values":[640,200,110,50,50,300,620,960,1020,1290,1190,1270,1670,1890,1460,1340,1560,1590,1770,2110,2390,2930,2450,1510,410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920]},{"name":"Channel","color":"#4fae4e","values":[110,20,70,110,40,20,40,50,150,100,480,170,140,250,410,280,170,170,110,340,90,290,270,130,60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120]},{"name":"Search","color":"#F5BD25","values":[20,30,0,0,10,250,300,210,150,320,160,270,350,160,140,200,200,230,320,190,330,320,270,30,30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120]},{"name":"Other","color":"#F79E39","values":[100,20,0,0,20,40,100,160,240,210,210,300,360,260,280,350,250,380,320,310,440,350,300,150,80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,20,0,0,40,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/15.json b/public/chartDummyData/views_zoom/2019-03/15.json new file mode 100644 index 000000000..93dceda9c --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/15.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552348800000,1552352400000,1552356000000,1552359600000,1552363200000,1552366800000,1552370400000,1552374000000,1552377600000,1552381200000,1552384800000,1552388400000,1552392000000,1552395600000,1552399200000,1552402800000,1552406400000,1552410000000,1552413600000,1552417200000,1552420800000,1552424400000,1552428000000,1552431600000,1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[750,220,140,1770,40,320,930,1090,1570,1730,2080,2170,2090,1950,2130,2040,1970,2020,2120,2630,2260,2380,1960,800,360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080]},{"name":"URL","color":"#2373DB","values":[200,90,30,40,30,110,450,880,1130,1380,1340,1680,1920,1710,1860,1810,2170,2480,3030,2310,2040,1380,1630,560,310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540]},{"name":"Groups","color":"#9ED448","values":[410,420,70,20,60,350,740,960,950,1010,1230,980,1720,1620,1320,1170,1450,1380,2170,1720,2330,2670,2440,1820,480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380]},{"name":"Channel","color":"#4fae4e","values":[60,120,10,20,0,20,50,30,60,40,180,160,170,280,180,100,160,130,200,330,130,130,220,100,20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,0,90,210,230,220,270,130,160,220,130,370,150,310,300,490,290,150,150,300,40,40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330]},{"name":"Other","color":"#F79E39","values":[80,80,20,10,70,30,100,230,280,200,310,250,240,310,260,260,280,320,360,370,390,310,230,120,140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,0,0,0,20,10,0,0,10,0,10,10,10,20,0,0,0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/16.json b/public/chartDummyData/views_zoom/2019-03/16.json new file mode 100644 index 000000000..6e68dd220 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/16.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552435200000,1552438800000,1552442400000,1552446000000,1552449600000,1552453200000,1552456800000,1552460400000,1552464000000,1552467600000,1552471200000,1552474800000,1552478400000,1552482000000,1552485600000,1552489200000,1552492800000,1552496400000,1552500000000,1552503600000,1552507200000,1552510800000,1552514400000,1552518000000,1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[360,320,190,10,30,170,2060,1150,1230,1250,1350,1500,1520,1710,1690,1740,2100,2450,2320,3030,3740,3510,2960,1490,700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660]},{"name":"URL","color":"#2373DB","values":[310,120,60,0,20,90,500,920,1020,1040,1160,1590,1920,1780,1730,1780,2140,2880,3320,2720,3440,3210,2500,1660,550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870]},{"name":"Groups","color":"#9ED448","values":[480,200,10,90,30,380,770,1220,1330,1050,1330,1340,1580,1740,1070,1310,1300,1840,2090,2310,4170,5030,4940,2100,840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460]},{"name":"Channel","color":"#4fae4e","values":[20,10,20,30,0,10,80,50,60,50,100,80,100,130,160,170,180,190,170,310,310,340,220,140,70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110]},{"name":"Search","color":"#F5BD25","values":[40,0,0,0,10,40,170,130,220,40,70,150,320,170,250,140,290,140,340,250,280,260,350,110,10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70]},{"name":"Other","color":"#F79E39","values":[140,80,20,10,0,80,200,200,210,250,280,310,250,340,250,330,300,270,330,540,500,530,280,190,130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,10,0,0,0,0,20,10,10,20,0,30,20,20,20,10,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/17.json b/public/chartDummyData/views_zoom/2019-03/17.json new file mode 100644 index 000000000..f5df63898 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/17.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552521600000,1552525200000,1552528800000,1552532400000,1552536000000,1552539600000,1552543200000,1552546800000,1552550400000,1552554000000,1552557600000,1552561200000,1552564800000,1552568400000,1552572000000,1552575600000,1552579200000,1552582800000,1552586400000,1552590000000,1552593600000,1552597200000,1552600800000,1552604400000,1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[700,250,160,130,230,470,900,1260,1530,1620,1780,1900,2490,2020,2390,2240,1580,2250,2380,2160,2320,2700,2240,1100,330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960]},{"name":"URL","color":"#2373DB","values":[550,230,130,0,40,90,470,800,960,1280,1600,1720,2010,1970,1680,2240,2110,2890,2580,2300,1700,1920,1470,770,230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600]},{"name":"Groups","color":"#9ED448","values":[840,560,50,100,10,300,940,950,1070,1270,1220,1240,1570,1660,1670,1610,1540,1990,1580,2010,2320,2660,2350,1560,640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710]},{"name":"Channel","color":"#4fae4e","values":[70,60,20,10,0,10,20,110,70,90,130,130,140,170,230,130,210,120,260,180,240,250,150,90,40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170]},{"name":"Search","color":"#F5BD25","values":[10,20,20,10,0,0,210,300,410,250,170,190,210,280,150,160,240,200,240,160,320,670,630,150,30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70]},{"name":"Other","color":"#F79E39","values":[130,30,10,40,20,80,240,200,250,280,310,350,390,440,360,250,170,350,350,360,450,320,360,160,40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,0,20,20,30,10,30,0,10,10,0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/18.json b/public/chartDummyData/views_zoom/2019-03/18.json new file mode 100644 index 000000000..cad77c77e --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/18.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552608000000,1552611600000,1552615200000,1552618800000,1552622400000,1552626000000,1552629600000,1552633200000,1552636800000,1552640400000,1552644000000,1552647600000,1552651200000,1552654800000,1552658400000,1552662000000,1552665600000,1552669200000,1552672800000,1552676400000,1552680000000,1552683600000,1552687200000,1552690800000,1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[330,250,170,60,100,260,1070,1120,2740,1470,2030,1750,1960,2420,2200,2470,1740,2630,2320,2560,2490,2550,2220,1030,760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080]},{"name":"URL","color":"#2373DB","values":[230,170,10,20,50,80,560,770,1050,1370,1700,1680,2120,1890,1990,1910,2350,3020,2840,2220,1660,1660,1130,670,390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640]},{"name":"Groups","color":"#9ED448","values":[640,190,40,110,90,250,740,1470,1010,1230,1060,1500,1540,1460,1380,1310,1480,1720,1650,1600,1810,1820,2220,1880,1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240]},{"name":"Channel","color":"#4fae4e","values":[40,50,0,30,0,50,30,110,120,180,140,140,100,230,250,170,260,170,160,170,260,260,220,100,40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100]},{"name":"Search","color":"#F5BD25","values":[30,0,0,0,60,310,150,170,330,370,220,470,280,270,290,200,120,180,160,200,120,190,200,200,50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200]},{"name":"Other","color":"#F79E39","values":[40,20,50,10,20,120,210,220,230,180,290,270,320,290,350,310,410,320,290,250,470,350,260,180,120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,20,30,10,20,0,10,20,10,10,0,30,0,10,0,30,0,10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/19.json b/public/chartDummyData/views_zoom/2019-03/19.json new file mode 100644 index 000000000..1856431bf --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/19.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552694400000,1552698000000,1552701600000,1552705200000,1552708800000,1552712400000,1552716000000,1552719600000,1552723200000,1552726800000,1552730400000,1552734000000,1552737600000,1552741200000,1552744800000,1552748400000,1552752000000,1552755600000,1552759200000,1552762800000,1552766400000,1552770000000,1552773600000,1552777200000,1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[760,390,110,140,40,1490,1000,640,1200,1630,1690,1930,2200,2070,2370,2010,2010,1960,2210,1950,2370,1850,2100,1020,900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260]},{"name":"URL","color":"#2373DB","values":[390,260,110,20,40,110,160,570,650,1150,1450,2280,1520,1710,1850,1550,1670,1850,2060,1250,1480,1350,890,1080,540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910]},{"name":"Groups","color":"#9ED448","values":[1100,130,120,80,40,140,430,830,930,870,1040,1210,1180,1380,1150,1450,1300,1390,1470,1440,1150,1870,1750,1600,1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310]},{"name":"Channel","color":"#4fae4e","values":[40,50,30,10,10,0,50,60,90,110,150,170,150,160,220,200,150,120,180,120,180,120,130,100,100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90]},{"name":"Search","color":"#F5BD25","values":[50,20,0,0,20,0,110,360,120,400,180,330,310,560,180,300,310,230,380,420,150,140,70,360,30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60]},{"name":"Other","color":"#F79E39","values":[120,60,70,20,40,40,120,170,140,270,280,280,330,260,280,310,240,280,300,370,250,190,230,120,150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80]},{"name":"PM","color":"#E65850","values":[10,0,0,0,0,0,0,0,0,20,0,10,20,0,10,10,10,10,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/20.json b/public/chartDummyData/views_zoom/2019-03/20.json new file mode 100644 index 000000000..952050e04 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/20.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552780800000,1552784400000,1552788000000,1552791600000,1552795200000,1552798800000,1552802400000,1552806000000,1552809600000,1552813200000,1552816800000,1552820400000,1552824000000,1552827600000,1552831200000,1552834800000,1552838400000,1552842000000,1552845600000,1552849200000,1552852800000,1552856400000,1552860000000,1552863600000,1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[900,550,230,120,80,140,1490,610,1310,1720,2040,2330,2310,2050,2160,1750,2390,2040,2230,2200,2800,2190,2110,1150,710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160]},{"name":"URL","color":"#2373DB","values":[540,220,80,40,20,100,70,300,650,1040,1250,1450,1600,1420,1600,1230,1350,1450,1860,1690,1850,1400,1240,740,270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660]},{"name":"Groups","color":"#9ED448","values":[1100,700,160,90,50,100,210,680,930,1130,1330,1450,1400,1430,1570,1350,1840,1340,1720,1810,2290,2460,2190,1920,540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290]},{"name":"Channel","color":"#4fae4e","values":[100,50,40,20,10,0,20,40,130,190,210,200,210,250,230,270,200,260,130,210,200,210,230,120,40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70]},{"name":"Search","color":"#F5BD25","values":[30,40,10,10,0,50,20,160,360,330,270,370,260,410,290,150,160,140,250,240,120,130,150,120,70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50]},{"name":"Other","color":"#F79E39","values":[150,40,30,10,30,20,40,100,280,220,280,270,390,320,320,300,370,180,270,390,290,310,270,220,150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,30,0,10,10,10,10,20,20,0,10,10,0,10,10,0,0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/21.json b/public/chartDummyData/views_zoom/2019-03/21.json new file mode 100644 index 000000000..a630776ab --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/21.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552867200000,1552870800000,1552874400000,1552878000000,1552881600000,1552885200000,1552888800000,1552892400000,1552896000000,1552899600000,1552903200000,1552906800000,1552910400000,1552914000000,1552917600000,1552921200000,1552924800000,1552928400000,1552932000000,1552935600000,1552939200000,1552942800000,1552946400000,1552950000000,1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[710,210,190,90,10,390,930,1030,1530,1410,2130,2160,2210,2200,2400,1830,2060,2740,2380,2350,4120,2970,3360,1080,580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180]},{"name":"URL","color":"#2373DB","values":[270,110,50,20,20,50,490,780,940,1250,1630,1490,1720,1620,1840,2010,2240,2590,2630,2420,2010,2020,1020,540,230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670]},{"name":"Groups","color":"#9ED448","values":[540,260,50,70,40,440,680,1070,1090,1270,1140,1540,1590,1540,1320,1340,1500,1480,1810,2060,2740,2860,2470,1380,580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730]},{"name":"Channel","color":"#4fae4e","values":[40,30,30,0,10,10,70,80,100,60,100,180,170,200,210,260,130,100,180,180,190,280,170,70,130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140]},{"name":"Search","color":"#F5BD25","values":[70,0,0,10,10,170,240,370,310,250,150,270,150,180,460,180,250,140,250,100,290,410,490,330,90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220]},{"name":"Other","color":"#F79E39","values":[150,60,0,10,30,60,170,180,200,390,200,220,330,330,360,360,340,300,330,430,400,460,240,150,90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,0,10,10,20,20,0,10,20,0,30,0,10,0,10,0,10,0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/22.json b/public/chartDummyData/views_zoom/2019-03/22.json new file mode 100644 index 000000000..460dd4c9b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/22.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1552953600000,1552957200000,1552960800000,1552964400000,1552968000000,1552971600000,1552975200000,1552978800000,1552982400000,1552986000000,1552989600000,1552993200000,1552996800000,1553000400000,1553004000000,1553007600000,1553011200000,1553014800000,1553018400000,1553022000000,1553025600000,1553029200000,1553032800000,1553036400000,1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[580,1150,230,50,60,330,990,1230,1430,1560,1960,2010,2120,2050,2050,1990,2270,2000,2550,2330,2650,2640,1850,1660,430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090]},{"name":"URL","color":"#2373DB","values":[230,50,70,0,20,70,390,1060,1110,1170,1480,1680,2240,2030,1540,1810,2030,2460,3080,2330,2260,1910,1260,870,310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490]},{"name":"Groups","color":"#9ED448","values":[580,160,60,30,80,170,740,1050,1220,1330,1600,1430,1360,1600,1760,1690,1590,1990,1710,2110,2540,2520,2160,1460,620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280]},{"name":"Channel","color":"#4fae4e","values":[130,360,170,10,10,10,80,60,110,100,110,110,150,220,230,100,150,110,210,250,190,310,290,110,100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90]},{"name":"Search","color":"#F5BD25","values":[90,80,0,0,0,50,520,260,250,140,190,170,130,190,340,230,200,530,160,280,540,220,70,70,70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90]},{"name":"Other","color":"#F79E39","values":[90,30,30,80,30,50,190,300,270,220,220,220,210,350,450,330,220,330,310,360,460,320,250,240,60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,30,0,20,20,10,0,10,0,0,30,0,0,0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/23.json b/public/chartDummyData/views_zoom/2019-03/23.json new file mode 100644 index 000000000..b134cd3a3 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/23.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553040000000,1553043600000,1553047200000,1553050800000,1553054400000,1553058000000,1553061600000,1553065200000,1553068800000,1553072400000,1553076000000,1553079600000,1553083200000,1553086800000,1553090400000,1553094000000,1553097600000,1553101200000,1553104800000,1553108400000,1553112000000,1553115600000,1553119200000,1553122800000,1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[430,300,70,60,40,2120,710,1160,1260,1910,1620,1570,1820,2040,2090,1840,2090,2850,2040,2480,2560,2410,1900,960,460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080]},{"name":"URL","color":"#2373DB","values":[310,70,40,20,30,70,530,1290,1090,1260,1290,1330,1900,1860,1810,1520,2030,2790,2780,2580,2270,1890,1180,600,220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600]},{"name":"Groups","color":"#9ED448","values":[620,360,20,60,20,290,860,900,1110,1260,1460,1350,1640,1480,1770,1510,1260,1500,1860,1900,2310,2730,2420,1710,600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490]},{"name":"Channel","color":"#4fae4e","values":[100,30,10,10,20,80,80,280,100,160,120,170,170,150,190,70,130,290,270,140,290,240,210,170,90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90]},{"name":"Search","color":"#F5BD25","values":[70,110,20,10,0,160,300,310,210,100,150,230,260,120,150,160,240,340,290,530,300,170,140,70,60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80]},{"name":"Other","color":"#F79E39","values":[60,40,10,20,30,70,190,270,310,230,290,280,430,310,290,310,340,300,350,390,290,280,280,140,50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,0,10,0,20,0,10,0,0,10,20,0,30,0,0,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/24.json b/public/chartDummyData/views_zoom/2019-03/24.json new file mode 100644 index 000000000..2529cae2b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/24.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553126400000,1553130000000,1553133600000,1553137200000,1553140800000,1553144400000,1553148000000,1553151600000,1553155200000,1553158800000,1553162400000,1553166000000,1553169600000,1553173200000,1553176800000,1553180400000,1553184000000,1553187600000,1553191200000,1553194800000,1553198400000,1553202000000,1553205600000,1553209200000,1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[460,470,120,60,1560,280,660,1190,1240,1500,2190,1970,2300,2820,2300,2180,1840,2100,2430,2450,2350,2290,1890,1080,440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070]},{"name":"URL","color":"#2373DB","values":[220,130,80,20,0,100,470,880,980,1690,1360,1820,1850,1740,1790,1520,2420,2740,2810,2480,1630,1740,1180,640,190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920]},{"name":"Groups","color":"#9ED448","values":[600,110,90,10,50,210,920,720,930,1430,1030,1260,1530,1460,1560,1330,1650,1810,2060,1940,2380,2670,2600,1240,640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730]},{"name":"Channel","color":"#4fae4e","values":[90,30,50,30,50,20,70,80,30,110,100,170,180,210,360,120,180,200,210,230,210,250,130,100,80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90]},{"name":"Search","color":"#F5BD25","values":[60,30,0,0,0,20,270,380,190,190,120,270,360,360,460,140,360,330,650,280,300,260,310,200,20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930]},{"name":"Other","color":"#F79E39","values":[50,50,0,10,20,40,210,320,290,300,250,230,420,300,310,270,320,330,300,380,380,340,480,100,60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,10,0,0,0,10,10,0,10,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/25.json b/public/chartDummyData/views_zoom/2019-03/25.json new file mode 100644 index 000000000..a20f5fff1 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/25.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553212800000,1553216400000,1553220000000,1553223600000,1553227200000,1553230800000,1553234400000,1553238000000,1553241600000,1553245200000,1553248800000,1553252400000,1553256000000,1553259600000,1553263200000,1553266800000,1553270400000,1553274000000,1553277600000,1553281200000,1553284800000,1553288400000,1553292000000,1553295600000,1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[440,360,90,20,160,280,700,1030,1450,3980,1540,1730,1850,2200,1770,1650,1730,2220,2220,2290,2340,1830,2190,1260,510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180]},{"name":"URL","color":"#2373DB","values":[190,180,30,10,170,90,520,1010,940,1260,1350,1710,1820,2120,1740,2190,2350,2730,2790,2560,2100,1850,1240,910,820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640]},{"name":"Groups","color":"#9ED448","values":[640,150,50,70,50,260,960,1480,1110,1110,1310,1330,1510,1750,1560,1190,1120,1430,1620,1790,1960,2300,1780,1310,780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300]},{"name":"Channel","color":"#4fae4e","values":[80,40,30,40,10,20,60,90,80,130,90,220,100,120,210,160,110,270,350,360,150,180,160,90,80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150]},{"name":"Search","color":"#F5BD25","values":[20,0,10,10,0,240,130,200,430,210,300,170,330,500,660,270,270,180,260,290,170,210,360,60,20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230]},{"name":"Other","color":"#F79E39","values":[60,70,0,0,10,70,130,280,250,400,250,240,380,290,280,360,230,250,370,280,250,330,220,80,100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,10,10,0,0,20,0,30,10,10,20,20,20,20,30,10,20,0,0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/26.json b/public/chartDummyData/views_zoom/2019-03/26.json new file mode 100644 index 000000000..8b722e5b5 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/26.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553299200000,1553302800000,1553306400000,1553310000000,1553313600000,1553317200000,1553320800000,1553324400000,1553328000000,1553331600000,1553335200000,1553338800000,1553342400000,1553346000000,1553349600000,1553353200000,1553356800000,1553360400000,1553364000000,1553367600000,1553371200000,1553374800000,1553378400000,1553382000000,1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[510,330,180,90,50,250,420,2350,1450,1870,1660,1940,2020,2150,2240,2130,2760,1840,2580,2370,2050,1870,1530,1160,750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830]},{"name":"URL","color":"#2373DB","values":[820,230,50,90,40,30,160,660,920,1490,1830,1700,1970,1860,1620,1470,1590,1950,1940,1590,1650,1270,1160,660,630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910]},{"name":"Groups","color":"#9ED448","values":[780,410,200,60,30,150,410,910,980,940,1000,1370,1300,1520,1290,1280,1980,1400,1500,1280,1780,1650,1560,1290,1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450]},{"name":"Channel","color":"#4fae4e","values":[80,60,10,50,0,0,20,50,90,70,90,180,160,230,200,170,170,200,290,140,120,210,70,70,210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80]},{"name":"Search","color":"#F5BD25","values":[20,70,10,0,10,20,80,660,300,230,410,180,220,370,1450,220,220,240,290,250,290,150,220,50,40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90]},{"name":"Other","color":"#F79E39","values":[100,50,30,50,50,40,50,150,260,260,290,230,350,370,330,300,280,240,270,290,320,270,140,160,100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,0,10,0,10,10,10,30,20,0,20,30,20,10,0,0,0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/27.json b/public/chartDummyData/views_zoom/2019-03/27.json new file mode 100644 index 000000000..4ce0e1a9b --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/27.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553385600000,1553389200000,1553392800000,1553396400000,1553400000000,1553403600000,1553407200000,1553410800000,1553414400000,1553418000000,1553421600000,1553425200000,1553428800000,1553432400000,1553436000000,1553439600000,1553443200000,1553446800000,1553450400000,1553454000000,1553457600000,1553461200000,1553464800000,1553468400000,1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[750,420,250,130,470,220,2060,540,1370,1710,1930,1990,2040,2360,2440,2010,1970,2520,2800,3030,3090,2600,1700,1180,390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010]},{"name":"URL","color":"#2373DB","values":[630,280,140,10,50,20,90,210,630,1030,1310,1610,1120,1390,1530,1950,1850,1820,1750,1900,1860,1740,1430,670,450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840]},{"name":"Groups","color":"#9ED448","values":[1100,790,360,70,70,70,250,480,820,1180,1620,1910,1270,1580,1220,1260,1010,1710,1450,1520,2330,2560,2320,1730,820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430]},{"name":"Channel","color":"#4fae4e","values":[210,20,140,0,0,0,90,70,70,60,240,170,180,170,210,100,160,200,230,150,140,300,190,140,20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40]},{"name":"Search","color":"#F5BD25","values":[40,20,10,10,10,0,10,230,650,230,350,500,290,260,130,160,200,230,330,590,240,100,450,220,70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280]},{"name":"Other","color":"#F79E39","values":[100,50,20,30,30,40,40,170,220,270,280,200,280,370,240,260,340,310,340,260,400,330,220,150,120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190]},{"name":"PM","color":"#E65850","values":[0,0,10,0,0,0,0,0,0,30,20,20,20,50,20,30,10,10,20,0,10,0,20,0,0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/28.json b/public/chartDummyData/views_zoom/2019-03/28.json new file mode 100644 index 000000000..4b6901c38 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/28.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553472000000,1553475600000,1553479200000,1553482800000,1553486400000,1553490000000,1553493600000,1553497200000,1553500800000,1553504400000,1553508000000,1553511600000,1553515200000,1553518800000,1553522400000,1553526000000,1553529600000,1553533200000,1553536800000,1553540400000,1553544000000,1553547600000,1553551200000,1553554800000,1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[390,250,130,60,50,300,2360,1430,1360,1250,1620,1890,1860,1890,2080,1970,2510,2650,2040,2590,3090,2560,2170,1090,480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530]},{"name":"URL","color":"#2373DB","values":[450,60,20,10,0,160,330,850,860,1200,1150,1530,1820,1740,1690,1900,2020,2570,3090,2700,2290,1850,1410,490,230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380]},{"name":"Groups","color":"#9ED448","values":[820,130,80,60,100,340,790,1180,890,1260,1520,1390,1750,1630,1690,1190,1500,1390,1930,1950,2300,2970,2600,1280,440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930]},{"name":"Channel","color":"#4fae4e","values":[20,40,10,10,0,10,30,40,70,60,110,80,80,160,310,160,270,210,310,130,170,270,80,90,10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100]},{"name":"Search","color":"#F5BD25","values":[70,40,0,30,0,210,110,480,100,190,110,250,270,160,190,150,350,550,260,170,290,310,100,90,40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60]},{"name":"Other","color":"#F79E39","values":[120,30,40,0,50,60,160,310,300,300,240,310,270,260,560,250,350,350,460,180,370,420,290,200,120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,20,10,0,0,10,10,10,0,10,20,20,0,0,0,10,0,0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/29.json b/public/chartDummyData/views_zoom/2019-03/29.json new file mode 100644 index 000000000..9d3241b12 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/29.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553558400000,1553562000000,1553565600000,1553569200000,1553572800000,1553576400000,1553580000000,1553583600000,1553587200000,1553590800000,1553594400000,1553598000000,1553601600000,1553605200000,1553608800000,1553612400000,1553616000000,1553619600000,1553623200000,1553626800000,1553630400000,1553634000000,1553637600000,1553641200000,1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[480,200,80,90,30,350,2180,1320,1080,1490,1620,1500,1950,2480,2390,1820,2100,2370,2490,1990,2840,2080,1760,1080,460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370]},{"name":"URL","color":"#2373DB","values":[230,120,40,30,10,120,510,930,1030,1040,1520,1570,1770,1810,1950,1950,2450,2670,2580,2410,2430,1680,1250,600,200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170]},{"name":"Groups","color":"#9ED448","values":[440,130,40,40,110,300,640,930,830,1160,1640,1300,1620,1270,1460,1460,1620,1400,1810,1870,2390,2400,2250,1490,650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670]},{"name":"Channel","color":"#4fae4e","values":[10,50,0,20,40,20,30,70,430,80,110,40,100,130,470,120,240,180,200,210,130,170,270,90,120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30]},{"name":"Search","color":"#F5BD25","values":[40,30,0,0,0,80,450,340,310,230,340,180,70,260,190,300,230,430,550,260,180,730,260,80,20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20]},{"name":"Other","color":"#F79E39","values":[120,20,20,30,30,30,190,280,180,290,280,330,360,340,370,270,390,350,320,320,390,400,310,220,50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,20,0,0,20,0,30,10,10,20,0,0,10,20,0,0,0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/30.json b/public/chartDummyData/views_zoom/2019-03/30.json new file mode 100644 index 000000000..96e640a70 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/30.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553644800000,1553648400000,1553652000000,1553655600000,1553659200000,1553662800000,1553666400000,1553670000000,1553673600000,1553677200000,1553680800000,1553684400000,1553688000000,1553691600000,1553695200000,1553698800000,1553702400000,1553706000000,1553709600000,1553713200000,1553716800000,1553720400000,1553724000000,1553727600000,1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[460,240,70,30,80,180,2150,890,1460,1500,1650,1550,2200,2400,2190,2120,2000,2150,2290,2620,2870,2470,1790,1070,560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400]},{"name":"URL","color":"#2373DB","values":[200,130,30,10,50,190,450,950,1030,1210,1190,1900,1990,1830,1750,1590,2210,2680,2580,2360,2140,1600,1370,920,330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460]},{"name":"Groups","color":"#9ED448","values":[650,150,120,30,140,520,860,870,1070,1490,1300,1380,1310,1680,1570,1450,1280,1700,1700,2070,2330,2770,2500,1730,670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660]},{"name":"Channel","color":"#4fae4e","values":[120,10,10,0,0,30,60,150,60,130,40,200,260,120,180,170,120,230,270,200,250,240,150,90,60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90]},{"name":"Search","color":"#F5BD25","values":[20,30,0,0,10,190,320,320,330,200,290,250,160,300,200,240,110,240,390,90,240,300,160,1930,240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20]},{"name":"Other","color":"#F79E39","values":[50,60,10,20,10,30,150,230,230,210,230,340,330,360,390,280,360,430,270,320,330,340,240,250,60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,10,10,20,40,0,30,0,10,20,30,0,10,0,0,0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-03/31.json b/public/chartDummyData/views_zoom/2019-03/31.json new file mode 100644 index 000000000..008548838 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-03/31.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553731200000,1553734800000,1553738400000,1553742000000,1553745600000,1553749200000,1553752800000,1553756400000,1553760000000,1553763600000,1553767200000,1553770800000,1553774400000,1553778000000,1553781600000,1553785200000,1553788800000,1553792400000,1553796000000,1553799600000,1553803200000,1553806800000,1553810400000,1553814000000,1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[560,120,220,40,60,460,2730,1100,1440,1640,1770,1830,2250,2500,2120,1760,1980,2290,2020,2600,2210,2190,1650,1180,490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540]},{"name":"URL","color":"#2373DB","values":[330,120,30,0,10,150,540,1120,1070,1400,1580,1800,1910,1890,1470,1770,2110,2780,2990,2540,2140,1630,1040,640,410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360]},{"name":"Groups","color":"#9ED448","values":[670,200,100,20,50,290,1030,1040,1130,1010,1150,1570,1770,1590,1770,1730,1290,1630,1860,2230,2210,2570,2340,1300,650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950]},{"name":"Channel","color":"#4fae4e","values":[60,40,20,0,10,20,40,50,90,100,110,70,290,180,320,170,190,210,280,310,210,280,110,150,100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130]},{"name":"Search","color":"#F5BD25","values":[240,0,0,0,20,30,340,810,470,130,120,70,320,360,270,270,160,720,190,260,520,310,310,230,130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90]},{"name":"Other","color":"#F79E39","values":[60,60,50,20,30,50,120,200,180,320,230,250,350,380,410,400,340,270,370,260,360,280,240,220,20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,0,20,0,10,10,0,0,10,10,10,20,20,10,10,0,10,0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/01.json b/public/chartDummyData/views_zoom/2019-04/01.json new file mode 100644 index 000000000..2a9984861 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/01.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553817600000,1553821200000,1553824800000,1553828400000,1553832000000,1553835600000,1553839200000,1553842800000,1553846400000,1553850000000,1553853600000,1553857200000,1553860800000,1553864400000,1553868000000,1553871600000,1553875200000,1553878800000,1553882400000,1553886000000,1553889600000,1553893200000,1553896800000,1553900400000,1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[490,200,190,40,110,290,2710,1440,1270,2040,1190,2510,1700,2100,2310,1870,1990,2460,2190,2160,2830,2150,1790,830,460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460]},{"name":"URL","color":"#2373DB","values":[410,140,0,10,20,190,460,1170,1340,1090,1470,1400,1900,1880,1690,1780,2070,2690,2970,2120,1580,1700,1430,910,480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520]},{"name":"Groups","color":"#9ED448","values":[650,230,90,50,40,510,630,1010,1200,1130,1230,1590,1380,1910,1430,1450,1360,1720,1830,1690,1940,2190,1720,1450,850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630]},{"name":"Channel","color":"#4fae4e","values":[100,10,10,10,10,40,90,30,140,310,100,70,130,110,130,140,70,190,160,90,180,210,260,80,270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70]},{"name":"Search","color":"#F5BD25","values":[130,30,50,10,10,290,270,700,200,220,190,810,260,390,420,260,140,310,250,120,280,140,40,90,50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10]},{"name":"Other","color":"#F79E39","values":[20,40,60,40,30,60,120,180,290,270,380,270,370,280,300,200,270,240,330,470,280,330,320,170,110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,0,0,0,20,0,30,20,0,10,0,10,30,0,20,0,0,10,0,0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/02.json b/public/chartDummyData/views_zoom/2019-04/02.json new file mode 100644 index 000000000..6eb887fdb --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/02.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553904000000,1553907600000,1553911200000,1553914800000,1553918400000,1553922000000,1553925600000,1553929200000,1553932800000,1553936400000,1553940000000,1553943600000,1553947200000,1553950800000,1553954400000,1553958000000,1553961600000,1553965200000,1553968800000,1553972400000,1553976000000,1553979600000,1553983200000,1553986800000,1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000,1554422400000,1554426000000,1554429600000,1554433200000,1554436800000,1554440400000,1554444000000,1554447600000,1554451200000,1554454800000,1554458400000,1554462000000,1554465600000,1554469200000,1554472800000,1554476400000,1554480000000,1554483600000,1554487200000,1554490800000,1554494400000,1554498000000,1554501600000,1554505200000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[460,230,80,70,70,170,530,1250,3370,1900,1640,1800,2120,1880,1630,2020,2290,2090,2130,1930,1940,1720,1250,1010,600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460,310,90,70,80,430,650,1210,1430,1540,1720,1840,2200,2040,1800,2070,2030,1860,2270,2270,2940,2470,1970,1400,700]},{"name":"URL","color":"#2373DB","values":[480,270,150,30,30,90,190,490,1040,1270,1500,2230,1850,1790,1610,1900,1610,1940,2200,1650,1660,1430,1090,840,540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520,250,160,70,40,40,470,1280,1090,1280,1280,1820,2030,1740,1860,2300,2380,2640,2780,2360,2640,1620,1400,1010,650]},{"name":"Groups","color":"#9ED448","values":[850,200,370,110,10,200,350,670,1150,1340,1320,1110,1990,1760,1420,1360,1440,1490,1510,1500,1580,1950,1790,1430,1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630,300,180,30,80,360,730,890,990,1180,2020,1310,1700,1920,1890,920,1320,1700,1730,1590,2050,2350,2490,1800,1240]},{"name":"Channel","color":"#4fae4e","values":[270,140,30,10,10,30,50,10,100,150,190,100,210,190,140,160,140,110,110,140,100,170,150,40,170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70,80,0,0,20,40,120,50,180,130,120,120,130,350,200,320,280,90,180,220,230,160,210,150,100]},{"name":"Search","color":"#F5BD25","values":[50,0,20,10,0,30,90,50,800,190,170,120,180,160,290,130,230,600,290,530,210,380,90,280,100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10,40,0,10,20,230,250,280,380,430,540,260,580,550,320,140,300,210,200,250,230,350,80,90,100]},{"name":"Other","color":"#F79E39","values":[110,70,40,0,20,30,90,210,270,310,200,240,350,250,170,190,130,240,330,280,230,260,280,190,110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130,60,30,0,20,90,200,240,240,230,320,260,370,380,290,250,290,300,460,390,360,310,260,220,70]},{"name":"PM","color":"#E65850","values":[0,10,0,0,0,0,0,10,0,20,10,10,0,20,0,30,40,0,10,0,0,10,10,0,0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0,0,0,0,0,0,10,0,20,0,0,20,10,10,20,10,0,10,20,0,10,0,20,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/03.json b/public/chartDummyData/views_zoom/2019-04/03.json new file mode 100644 index 000000000..3edb30582 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/03.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000,1554422400000,1554426000000,1554429600000,1554433200000,1554436800000,1554440400000,1554444000000,1554447600000,1554451200000,1554454800000,1554458400000,1554462000000,1554465600000,1554469200000,1554472800000,1554476400000,1554480000000,1554483600000,1554487200000,1554490800000,1554494400000,1554498000000,1554501600000,1554505200000,1554508800000,1554512400000,1554516000000,1554519600000,1554523200000,1554526800000,1554530400000,1554534000000,1554537600000,1554541200000,1554544800000,1554548400000,1554552000000,1554555600000,1554559200000,1554562800000,1554566400000,1554570000000,1554573600000,1554577200000,1554580800000,1554584400000,1554588000000,1554591600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460,310,90,70,80,430,650,1210,1430,1540,1720,1840,2200,2040,1800,2070,2030,1860,2270,2270,2940,2470,1970,1400,700,240,90,80,60,90,550,750,1430,1730,2770,2170,2280,2390,1920,2130,2120,2510,2670,1800,1810,2010,1730,1300,680]},{"name":"URL","color":"#2373DB","values":[540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520,250,160,70,40,40,470,1280,1090,1280,1280,1820,2030,1740,1860,2300,2380,2640,2780,2360,2640,1620,1400,1010,650,190,90,20,0,70,220,440,990,1490,1750,2320,1990,1850,2110,1890,1980,1980,1960,2410,1720,1530,1330,1070,780]},{"name":"Groups","color":"#9ED448","values":[1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630,300,180,30,80,360,730,890,990,1180,2020,1310,1700,1920,1890,920,1320,1700,1730,1590,2050,2350,2490,1800,1240,300,180,40,70,130,420,710,890,1170,1270,930,1890,1630,1420,1510,1220,1190,1130,1310,1620,1810,1810,1980,2380]},{"name":"Channel","color":"#4fae4e","values":[170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70,80,0,0,20,40,120,50,180,130,120,120,130,350,200,320,280,90,180,220,230,160,210,150,100,160,30,10,0,30,30,10,180,60,90,150,110,160,340,270,180,120,190,120,120,120,140,190,120]},{"name":"Search","color":"#F5BD25","values":[100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10,40,0,10,20,230,250,280,380,430,540,260,580,550,320,140,300,210,200,250,230,350,80,90,100,20,50,0,20,20,80,320,120,150,230,300,320,310,370,760,180,210,150,150,220,130,220,150,50]},{"name":"Other","color":"#F79E39","values":[110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130,60,30,0,20,90,200,240,240,230,320,260,370,380,290,250,290,300,460,390,360,310,260,220,70,10,20,0,10,20,150,150,210,310,290,250,250,330,380,250,270,160,190,240,260,250,240,130,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0,0,0,0,0,0,10,0,20,0,0,20,10,10,20,10,0,10,20,0,10,0,20,0,0,0,0,0,0,0,0,20,0,10,30,0,30,10,10,20,10,0,30,10,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/04.json b/public/chartDummyData/views_zoom/2019-04/04.json new file mode 100644 index 000000000..3edb30582 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/04.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000,1554422400000,1554426000000,1554429600000,1554433200000,1554436800000,1554440400000,1554444000000,1554447600000,1554451200000,1554454800000,1554458400000,1554462000000,1554465600000,1554469200000,1554472800000,1554476400000,1554480000000,1554483600000,1554487200000,1554490800000,1554494400000,1554498000000,1554501600000,1554505200000,1554508800000,1554512400000,1554516000000,1554519600000,1554523200000,1554526800000,1554530400000,1554534000000,1554537600000,1554541200000,1554544800000,1554548400000,1554552000000,1554555600000,1554559200000,1554562800000,1554566400000,1554570000000,1554573600000,1554577200000,1554580800000,1554584400000,1554588000000,1554591600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460,310,90,70,80,430,650,1210,1430,1540,1720,1840,2200,2040,1800,2070,2030,1860,2270,2270,2940,2470,1970,1400,700,240,90,80,60,90,550,750,1430,1730,2770,2170,2280,2390,1920,2130,2120,2510,2670,1800,1810,2010,1730,1300,680]},{"name":"URL","color":"#2373DB","values":[540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520,250,160,70,40,40,470,1280,1090,1280,1280,1820,2030,1740,1860,2300,2380,2640,2780,2360,2640,1620,1400,1010,650,190,90,20,0,70,220,440,990,1490,1750,2320,1990,1850,2110,1890,1980,1980,1960,2410,1720,1530,1330,1070,780]},{"name":"Groups","color":"#9ED448","values":[1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630,300,180,30,80,360,730,890,990,1180,2020,1310,1700,1920,1890,920,1320,1700,1730,1590,2050,2350,2490,1800,1240,300,180,40,70,130,420,710,890,1170,1270,930,1890,1630,1420,1510,1220,1190,1130,1310,1620,1810,1810,1980,2380]},{"name":"Channel","color":"#4fae4e","values":[170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70,80,0,0,20,40,120,50,180,130,120,120,130,350,200,320,280,90,180,220,230,160,210,150,100,160,30,10,0,30,30,10,180,60,90,150,110,160,340,270,180,120,190,120,120,120,140,190,120]},{"name":"Search","color":"#F5BD25","values":[100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10,40,0,10,20,230,250,280,380,430,540,260,580,550,320,140,300,210,200,250,230,350,80,90,100,20,50,0,20,20,80,320,120,150,230,300,320,310,370,760,180,210,150,150,220,130,220,150,50]},{"name":"Other","color":"#F79E39","values":[110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130,60,30,0,20,90,200,240,240,230,320,260,370,380,290,250,290,300,460,390,360,310,260,220,70,10,20,0,10,20,150,150,210,310,290,250,250,330,380,250,270,160,190,240,260,250,240,130,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0,0,0,0,0,0,10,0,20,0,0,20,10,10,20,10,0,10,20,0,10,0,20,0,0,0,0,0,0,0,0,20,0,10,30,0,30,10,10,20,10,0,30,10,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/05.json b/public/chartDummyData/views_zoom/2019-04/05.json new file mode 100644 index 000000000..3edb30582 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/05.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000,1554422400000,1554426000000,1554429600000,1554433200000,1554436800000,1554440400000,1554444000000,1554447600000,1554451200000,1554454800000,1554458400000,1554462000000,1554465600000,1554469200000,1554472800000,1554476400000,1554480000000,1554483600000,1554487200000,1554490800000,1554494400000,1554498000000,1554501600000,1554505200000,1554508800000,1554512400000,1554516000000,1554519600000,1554523200000,1554526800000,1554530400000,1554534000000,1554537600000,1554541200000,1554544800000,1554548400000,1554552000000,1554555600000,1554559200000,1554562800000,1554566400000,1554570000000,1554573600000,1554577200000,1554580800000,1554584400000,1554588000000,1554591600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460,310,90,70,80,430,650,1210,1430,1540,1720,1840,2200,2040,1800,2070,2030,1860,2270,2270,2940,2470,1970,1400,700,240,90,80,60,90,550,750,1430,1730,2770,2170,2280,2390,1920,2130,2120,2510,2670,1800,1810,2010,1730,1300,680]},{"name":"URL","color":"#2373DB","values":[540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520,250,160,70,40,40,470,1280,1090,1280,1280,1820,2030,1740,1860,2300,2380,2640,2780,2360,2640,1620,1400,1010,650,190,90,20,0,70,220,440,990,1490,1750,2320,1990,1850,2110,1890,1980,1980,1960,2410,1720,1530,1330,1070,780]},{"name":"Groups","color":"#9ED448","values":[1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630,300,180,30,80,360,730,890,990,1180,2020,1310,1700,1920,1890,920,1320,1700,1730,1590,2050,2350,2490,1800,1240,300,180,40,70,130,420,710,890,1170,1270,930,1890,1630,1420,1510,1220,1190,1130,1310,1620,1810,1810,1980,2380]},{"name":"Channel","color":"#4fae4e","values":[170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70,80,0,0,20,40,120,50,180,130,120,120,130,350,200,320,280,90,180,220,230,160,210,150,100,160,30,10,0,30,30,10,180,60,90,150,110,160,340,270,180,120,190,120,120,120,140,190,120]},{"name":"Search","color":"#F5BD25","values":[100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10,40,0,10,20,230,250,280,380,430,540,260,580,550,320,140,300,210,200,250,230,350,80,90,100,20,50,0,20,20,80,320,120,150,230,300,320,310,370,760,180,210,150,150,220,130,220,150,50]},{"name":"Other","color":"#F79E39","values":[110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130,60,30,0,20,90,200,240,240,230,320,260,370,380,290,250,290,300,460,390,360,310,260,220,70,10,20,0,10,20,150,150,210,310,290,250,250,330,380,250,270,160,190,240,260,250,240,130,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0,0,0,0,0,0,10,0,20,0,0,20,10,10,20,10,0,10,20,0,10,0,20,0,0,0,0,0,0,0,0,20,0,10,30,0,30,10,10,20,10,0,30,10,20,0,10,0,0]}]} diff --git a/public/chartDummyData/views_zoom/2019-04/06.json b/public/chartDummyData/views_zoom/2019-04/06.json new file mode 100644 index 000000000..3edb30582 --- /dev/null +++ b/public/chartDummyData/views_zoom/2019-04/06.json @@ -0,0 +1 @@ +{"title":"Title","type":"bar","labels":[1553990400000,1553994000000,1553997600000,1554001200000,1554004800000,1554008400000,1554012000000,1554015600000,1554019200000,1554022800000,1554026400000,1554030000000,1554033600000,1554037200000,1554040800000,1554044400000,1554048000000,1554051600000,1554055200000,1554058800000,1554062400000,1554066000000,1554069600000,1554073200000,1554076800000,1554080400000,1554084000000,1554087600000,1554091200000,1554094800000,1554098400000,1554102000000,1554105600000,1554109200000,1554112800000,1554116400000,1554120000000,1554123600000,1554127200000,1554130800000,1554134400000,1554138000000,1554141600000,1554145200000,1554148800000,1554152400000,1554156000000,1554159600000,1554163200000,1554166800000,1554170400000,1554174000000,1554177600000,1554181200000,1554184800000,1554188400000,1554192000000,1554195600000,1554199200000,1554202800000,1554206400000,1554210000000,1554213600000,1554217200000,1554220800000,1554224400000,1554228000000,1554231600000,1554235200000,1554238800000,1554242400000,1554246000000,1554249600000,1554253200000,1554256800000,1554260400000,1554264000000,1554267600000,1554271200000,1554274800000,1554278400000,1554282000000,1554285600000,1554289200000,1554292800000,1554296400000,1554300000000,1554303600000,1554307200000,1554310800000,1554314400000,1554318000000,1554321600000,1554325200000,1554328800000,1554332400000,1554336000000,1554339600000,1554343200000,1554346800000,1554350400000,1554354000000,1554357600000,1554361200000,1554364800000,1554368400000,1554372000000,1554375600000,1554379200000,1554382800000,1554386400000,1554390000000,1554393600000,1554397200000,1554400800000,1554404400000,1554408000000,1554411600000,1554415200000,1554418800000,1554422400000,1554426000000,1554429600000,1554433200000,1554436800000,1554440400000,1554444000000,1554447600000,1554451200000,1554454800000,1554458400000,1554462000000,1554465600000,1554469200000,1554472800000,1554476400000,1554480000000,1554483600000,1554487200000,1554490800000,1554494400000,1554498000000,1554501600000,1554505200000,1554508800000,1554512400000,1554516000000,1554519600000,1554523200000,1554526800000,1554530400000,1554534000000,1554537600000,1554541200000,1554544800000,1554548400000,1554552000000,1554555600000,1554559200000,1554562800000,1554566400000,1554570000000,1554573600000,1554577200000,1554580800000,1554584400000,1554588000000,1554591600000],"labelType":"hour","isStacked":true,"isPercentage":false,"hasSecondYAxis":false,"onZoom":null,"datasets":[{"name":"Followers","color":"#54A4E7","values":[600,430,170,130,50,130,2960,640,1270,1520,1980,1880,2530,1850,2190,2720,2300,2350,2100,2470,2780,1980,1270,530,370,70,30,110,170,1400,1380,1490,1760,1470,1380,1930,1800,2010,2120,2110,2250,2200,2410,2890,2780,1990,1340,370,130,60,80,20,200,770,950,1050,2830,1410,1540,2050,1900,2440,2030,2680,1900,2320,2390,2850,2910,2430,1260,400,220,120,30,50,210,2240,1170,1090,1540,1530,1860,2230,3050,1900,2110,3270,1970,2140,2120,2820,2270,1870,1490,540,390,110,70,40,240,840,1020,1380,3660,1590,2470,1940,2410,2450,1970,2350,2320,2570,2480,2710,2850,1690,1440,460,310,90,70,80,430,650,1210,1430,1540,1720,1840,2200,2040,1800,2070,2030,1860,2270,2270,2940,2470,1970,1400,700,240,90,80,60,90,550,750,1430,1730,2770,2170,2280,2390,1920,2130,2120,2510,2670,1800,1810,2010,1730,1300,680]},{"name":"URL","color":"#2373DB","values":[540,210,50,80,40,70,120,290,710,1100,1450,1200,1240,1180,1360,1510,1530,1540,1880,1760,1830,1210,760,380,160,20,50,30,70,310,660,840,940,1390,1590,1700,1460,1890,2080,2170,2230,2680,2710,2370,2100,1360,1010,170,70,10,50,10,60,290,780,690,1270,1250,1600,1790,1930,1760,1940,1920,2640,2810,2390,2500,2290,1740,730,460,180,180,70,0,90,440,790,1100,1230,1340,1410,2160,1990,1770,1670,2220,2950,3000,2710,2210,2280,1540,1020,360,260,30,60,40,70,350,860,1250,1510,1360,1680,1850,1900,1820,1830,2320,2960,2760,2230,2480,2270,1600,870,520,250,160,70,40,40,470,1280,1090,1280,1280,1820,2030,1740,1860,2300,2380,2640,2780,2360,2640,1620,1400,1010,650,190,90,20,0,70,220,440,990,1490,1750,2320,1990,1850,2110,1890,1980,1980,1960,2410,1720,1530,1330,1070,780]},{"name":"Groups","color":"#9ED448","values":[1040,460,120,80,80,180,470,540,990,1440,1240,1270,1450,1360,1350,1080,1040,1470,1610,1860,2500,2760,1850,930,470,90,60,110,230,620,860,840,1140,1160,1230,1500,1590,1290,1340,1400,1710,1710,2200,2450,2810,2620,1790,670,240,40,60,50,250,690,1090,930,1170,990,1080,1680,1680,1410,1550,1720,1560,1680,2390,2180,2970,2630,1890,660,210,110,120,80,270,730,1000,900,1280,1210,1630,1430,1710,1410,1910,1800,2010,1980,2180,2410,3190,3360,1390,950,300,120,110,80,330,660,730,1420,1200,1380,1590,2170,1660,1380,1570,1630,1490,1960,2170,2030,3000,2520,1860,630,300,180,30,80,360,730,890,990,1180,2020,1310,1700,1920,1890,920,1320,1700,1730,1590,2050,2350,2490,1800,1240,300,180,40,70,130,420,710,890,1170,1270,930,1890,1630,1420,1510,1220,1190,1130,1310,1620,1810,1810,1980,2380]},{"name":"Channel","color":"#4fae4e","values":[170,80,100,10,10,30,70,30,30,90,100,70,120,120,180,150,120,170,100,160,170,170,190,100,40,10,0,20,10,70,80,50,120,120,30,90,170,150,270,120,120,190,190,150,180,230,160,30,20,0,10,0,10,10,90,30,90,80,80,110,180,240,180,300,170,150,130,210,280,360,110,90,40,0,10,10,10,30,100,40,160,80,240,360,230,140,300,240,180,280,200,130,200,180,110,130,20,20,0,0,20,80,60,50,110,30,160,90,270,470,270,100,70,140,170,210,250,170,220,70,80,0,0,20,40,120,50,180,130,120,120,130,350,200,320,280,90,180,220,230,160,210,150,100,160,30,10,0,30,30,10,180,60,90,150,110,160,340,270,180,120,190,120,120,120,140,190,120]},{"name":"Search","color":"#F5BD25","values":[100,160,0,30,10,30,70,140,220,70,120,290,260,270,240,170,240,510,180,430,490,110,100,60,20,0,0,0,40,210,370,390,430,130,280,150,290,150,420,230,150,450,200,500,210,230,140,20,10,40,0,20,0,330,430,220,460,80,160,100,200,330,320,1240,300,190,310,150,320,170,40,20,0,0,10,20,60,460,390,140,120,210,330,220,130,200,180,390,230,150,420,210,170,200,120,90,30,40,0,10,20,130,200,440,170,290,310,190,280,350,220,290,550,640,380,470,300,150,100,10,40,0,10,20,230,250,280,380,430,540,260,580,550,320,140,300,210,200,250,230,350,80,90,100,20,50,0,20,20,80,320,120,150,230,300,320,310,370,760,180,210,150,150,220,130,220,150,50]},{"name":"Other","color":"#F79E39","values":[110,40,30,20,60,20,10,50,150,250,240,280,250,200,200,160,200,380,260,270,350,250,200,110,20,40,30,10,60,100,200,250,240,290,280,410,370,310,330,250,300,500,260,420,400,430,280,90,30,40,40,10,30,130,170,190,180,200,290,460,280,240,350,200,350,380,350,390,510,310,220,70,40,30,30,20,70,140,240,150,310,270,230,450,410,340,260,370,390,370,380,440,390,390,310,130,70,10,10,30,100,320,240,250,280,320,160,360,480,340,420,250,350,360,350,490,350,420,150,130,60,30,0,20,90,200,240,240,230,320,260,370,380,290,250,290,300,460,390,360,310,260,220,70,10,20,0,10,20,150,150,210,310,290,250,250,330,380,250,270,160,190,240,260,250,240,130,160]},{"name":"PM","color":"#E65850","values":[0,0,0,0,0,0,10,10,30,10,10,30,10,10,20,10,10,0,20,20,10,0,0,0,0,0,0,0,0,10,0,0,20,10,0,20,20,10,10,10,20,20,10,10,10,10,10,0,0,0,0,0,0,10,10,10,0,0,0,0,0,0,0,40,20,20,10,10,20,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,20,20,0,10,10,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,20,0,0,10,0,0,30,0,20,0,30,10,0,0,0,0,0,0,0,10,0,20,0,0,20,10,10,20,10,0,10,20,0,10,0,20,0,0,0,0,0,0,0,0,20,0,10,30,0,30,10,10,20,10,0,30,10,20,0,10,0,0]}]} diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..de125f5f5a6a79d64ffe5f439ffcd5de75d25cf4 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%B60G|+7tM0FV{{A=a{HoUS1;|E2{!_m_efKYO$@lXQ|4!TcYt#APEt`K< zHv2^bwR4pO`2{om|NsBd-v58*Sl*mwzaJ>dS>O>_%)r1c48n{Iv*t(u1sgqG977~7 zr}|&yJEFiLT(GDi@Bja;%ugrnj*<6RpxYWGvpD?OEqBi^(_Sp!FIBuHZvElU4<}lf zC`T(9hxaNw97=E6HsOjws-}j|_bZR~+-3M2xZ|X4YoOWzqpzFT^Be^k+jG5jT%SB; zJ{U1;W6G)>$@cAmljr^_wR-mQ|M|cB{xiKvXDv_R-6#%pOn6mDL`hI$xk5ovep+Tu zszOO+L8?M#K}j+LL&coOpLjS5!!$Hb`JX=H`80@uS(#fenOj&{*n6@Fv#^3ogUR6( vX64Nx3a4*eIdSC75t$?GryD#Lc!lvI6;x#X;^) z4C~IxyaaMw1AIbUt-8NrBA?7cWWoRc|J(F@RcrZT()rb~?_2$bpP#<{J96vKgE#*| zXM9_E^7o~6?N5LP@{|Pm1^@3&TK?wpF9sH^SrR{Zr^^DxISV`@iy0WWg+Z8+Vb&Z8 zpi7)RT^vI!PPYbgPHIu$>0y85%HaC{|CO_i)&^0@tF}zZo3%vvKvvH+z1;MwhI=J% zmAHip9$xl&Ao|xPmM5Shhb>B8WZL<(5Uv+x%!e6VFU$`V6xh?w6*eT@L9MBQ%RDR5WpIo6l3-1?1RpsSiy(mIxyf)4jP%2v~6=<3w6R(~nHf2}l~$#R=R zbawlUus$D!9jDb-eDjJJR5OtXOc;l4+7R;@S-#Pf2cw zNsBhqnDf7-#w9w^*QjuHm%{4RX*(MlPy2*(URkrgZ1UnKH)i@jD68l1DNf1y@Ii9M z?Gu4&PfytLtUVKLxn+Iw|FXh+>+k)3`nUA&e+B_n@kP6;r)~j;ad=foL`hI$xk5ov zep+TuszOO+L8?M#K}j+LL&coOpLjS5!!$Hb`JX=H`80@uS(#fenOj&{*n6@Fv#^3o zgUR6(X64Nx3a4*eIdSC75t$?GryD#LcPx#9#BkFMNDaNTa5Bsi}G8G@mq`W|Ns9{h4HDv_{zh%T!dEUY{ZupM}lW=pi{vMIF(^lSXO&Lag37NR(eu>hcV@R%}oGA0h{a-nmj=o2t{7_9g#$PG1hRFoHW2uDmE zx>`|YS{%Y*mfMgz+AB(7j#4_8DywK<{W$er$zGbm>$lsY|4xuXA@+dlL%poh`IEjv(IgD`31)Yx4K6Y!FLsmC6 ztGv+cr*dtWLoAK_iKCE-!TF4}JGoDETLA6PZ#+ z-)hE*=VvME!ckLRD9@++wxAV`n(`7(M|0a@>HK<$@%>UQwDdZfzbn66I&#ACY0@Dc zIbo|m@%P7^bmY+3hq3a7vb?nQrPS87t%vMOwe;y0E*&BJbS-^L;}m3X>mmD=ZGBu_ zIU3!Q-g;>5YgdlW8`=q7TjNr;e!YYpNVPU{%O}GX?c}t*v0buAPCF=c3>*#?$!Ra= zI0i7Xu{jockn9*p?JY7_q&9UA3g0YZZDXP5$j-U?t3@`{b9Lv0PTtn0ZD4zNOip(e znJLoU!)sxLUO(pa_fR}Wr&_BB7p9opQ(|*(i_1MWF8BJ_+;ik|?~}_tST^^9x!jXx zb8no>J$g3p3b?$pVDs*T%R3x4?~=H@(_-^(jm3uU^eff*}M~H z^KQP!<#z;nY<^c^2aDgC000000000000000000000000000000000000002t`43tk z;9QP1#VG&)09SfcSaechcOY6Cgx@G{a;ABePT>%h=S&#LUDT#0SfONT5nC0O}VJbn-$q Ql>h($07*qoM6N<$f;}-ip8x;= literal 0 HcmV?d00001 diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg new file mode 100644 index 000000000..3b8dbb19d --- /dev/null +++ b/public/safari-pinned-tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 000000000..d3a7c445d --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Telegram T", + "short_name": "Telegram T", + "icons": [ + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts new file mode 100644 index 000000000..fc8dc4338 --- /dev/null +++ b/src/@types/global.d.ts @@ -0,0 +1,101 @@ +declare const process: NodeJS.Process; + +declare namespace React { + interface HTMLAttributes { + // Optimization for DOM nodes prepends and inserts + teactFastList?: boolean; + } + + interface Attributes { + // Optimization for DOM nodes reordering. Requires `teactFastList` for parent + teactOrderKey?: number; + } + + interface ImgHTMLAttributes extends HTMLAttributes { + loading?: 'auto' | 'eager' | 'lazy'; + } +} + +type AnyLiteral = Record; +type AnyClass = new (...args: any[]) => any; +type AnyFunction = (...args: any) => any; +type AnyToVoidFunction = (...args: any) => void; +type NoneToVoidFunction = () => void; + +type Country = { + id: string; + name: string; + flag: string; + code: string; +}; + +type EmojiCategory = { + id: string; + name: string; + emojis: string[]; +}; + +type Emoji = { + id: string; + colons: string; + native: string; + image: string; + skin?: number; +}; + +type EmojiWithSkins = Record; + +type AllEmojis = Record; + +declare module '*.png'; + +declare module 'pako/dist/pako_inflate' { + function inflate(...args: any[]): string; +} + +type WindowWithPerf = typeof window & { perf: AnyLiteral }; + +declare module 'worker-loader!*' { + class WebpackWorker extends Worker { + constructor(); + } + + export default WebpackWorker; +} + +declare module 'service-worker-loader!*' { + const register: import('service-worker-loader/types').ServiceWorkerRegister; + const ServiceWorkerNoSupportError: import('service-worker-loader/types').ServiceWorkerNoSupportError; + const scriptUrl: import('service-worker-loader/types').ScriptUrl; + export default register; + export { + ServiceWorkerNoSupportError, + scriptUrl, + }; +} + +interface IWebpWorker extends Worker { + wasmReady?: boolean; + requests: Map) => void>; +} + +interface Window { + ClipboardItem?: any; + requestIdleCallback: (cb: AnyToVoidFunction) => void; +} + +interface Clipboard { write?: any } + +interface Document { + mozFullScreenElement: any; + webkitFullscreenElement: any; + mozCancelFullScreen?: () => Promise; + webkitCancelFullScreen?: () => Promise; + webkitExitFullscreen?: () => Promise; +} + +interface HTMLElement { + mozRequestFullScreen?: () => Promise; + webkitEnterFullscreen?: () => Promise; + webkitRequestFullscreen?: () => Promise; +} diff --git a/src/@types/teact.d.ts b/src/@types/teact.d.ts new file mode 100644 index 000000000..05d546a0a --- /dev/null +++ b/src/@types/teact.d.ts @@ -0,0 +1,3 @@ +declare namespace JSX { + type Element = VirtualElement; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 000000000..6e1a19cb1 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,52 @@ +import { FC, useEffect } from './lib/teact/teact'; +import React, { withGlobal } from './lib/teact/teactn'; + +import { GlobalState } from './global/types'; + +import { pick } from './util/iteratees'; +import { updateSizes } from './util/windowSize'; + +import Auth from './components/auth/Auth'; +import UiLoader from './components/common/UiLoader'; +import Main from './components/main/Main.async'; +// import Test from './components/test/TestNoRedundancy'; + +type StateProps = Pick; + +const App: FC = ({ authState, authIsSessionRemembered }) => { + useEffect(() => { + updateSizes(); + }, []); + + // return ; + + if (authState) { + switch (authState) { + case 'authorizationStateWaitPhoneNumber': + case 'authorizationStateWaitCode': + case 'authorizationStateWaitPassword': + case 'authorizationStateWaitRegistration': + case 'authorizationStateWaitQrCode': + return ; + case 'authorizationStateClosed': + case 'authorizationStateClosing': + case 'authorizationStateLoggingOut': + case 'authorizationStateReady': + return renderMain(); + } + } + + return authIsSessionRemembered ? renderMain() : ; +}; + +function renderMain() { + return ( + +
+ + ); +} + +export default withGlobal( + (global): StateProps => pick(global, ['authState', 'authIsSessionRemembered']), +)(App); diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts new file mode 100644 index 000000000..dcc57f3d6 --- /dev/null +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -0,0 +1,366 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { + ApiChat, + ApiChatMember, + ApiChatAdminRights, + ApiChatBannedRights, + ApiRestrictionReason, + ApiChatFolder, +} from '../../types'; +import { pick, pickTruthy } from '../../../util/iteratees'; +import { + isPeerChat, + isPeerUser, + isInputPeerUser, + isInputPeerChat, + isInputPeerChannel, +} from './peers'; +import { omitVirtualClassFields } from './helpers'; + +type PeerEntityApiChatFields = Omit; + +function buildApiChatFieldsFromPeerEntity( + peerEntity: GramJs.TypeUser | GramJs.TypeChat, + isSupport = false, +): PeerEntityApiChatFields { + const isMin = Boolean('min' in peerEntity && peerEntity.min); + const accessHash = ('accessHash' in peerEntity) && String(peerEntity.accessHash); + const avatarHash = ('photo' in peerEntity) && buildAvatarHash(peerEntity.photo); + const isSignaturesShown = Boolean('signatures' in peerEntity && peerEntity.signatures); + const hasPrivateLink = Boolean('hasLink' in peerEntity && peerEntity.hasLink); + + return { + isMin, + hasPrivateLink, + isSignaturesShown, + ...(accessHash && { accessHash }), + ...(avatarHash && { avatarHash }), + ...( + (peerEntity instanceof GramJs.Channel || peerEntity instanceof GramJs.User) + && { username: peerEntity.username } + ), + ...(('verified' in peerEntity) && { isVerified: peerEntity.verified }), + ...((peerEntity instanceof GramJs.Chat || peerEntity instanceof GramJs.Channel) && { + ...(peerEntity.participantsCount && { membersCount: peerEntity.participantsCount }), + joinDate: peerEntity.date, + }), + ...(isSupport && { isSupport: true }), + ...buildApiChatPermissions(peerEntity), + ...(('creator' in peerEntity) && { isCreator: peerEntity.creator }), + ...buildApiChatRestrictions(peerEntity), + ...buildApiChatMigrationInfo(peerEntity), + }; +} + +export function buildApiChatFromDialog( + dialog: GramJs.Dialog, + peerEntity: GramJs.TypeUser | GramJs.TypeChat, +): ApiChat { + const { + peer, folderId, unreadMark, unreadCount, unreadMentionsCount, notifySettings: { silent, muteUntil }, + readOutboxMaxId, readInboxMaxId, + } = dialog; + const isMuted = silent || (typeof muteUntil === 'number' && Date.now() < muteUntil * 1000); + + return { + id: getApiChatIdFromMtpPeer(peer), + ...(folderId && { folderId }), + type: getApiChatTypeFromPeerEntity(peerEntity), + title: getApiChatTitleFromMtpPeer(peer, peerEntity), + lastReadOutboxMessageId: readOutboxMaxId, + lastReadInboxMessageId: readInboxMaxId, + unreadCount, + unreadMentionsCount, + isMuted, + ...(unreadMark && { hasUnreadMark: true }), + ...buildApiChatFieldsFromPeerEntity(peerEntity), + }; +} + +function buildApiChatPermissions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): { + adminRights?: ApiChatAdminRights; + currentUserBannedRights?: ApiChatBannedRights; + defaultBannedRights?: ApiChatBannedRights; +} { + if (!(peerEntity instanceof GramJs.Chat || peerEntity instanceof GramJs.Channel)) { + return {}; + } + + return { + adminRights: omitVirtualClassFields(peerEntity.adminRights), + currentUserBannedRights: peerEntity instanceof GramJs.Channel + ? omitVirtualClassFields(peerEntity.bannedRights) + : undefined, + defaultBannedRights: omitVirtualClassFields(peerEntity.defaultBannedRights), + }; +} + +function buildApiChatRestrictions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): { + isNotJoined?: boolean; + isRestricted?: boolean; + restrictionReason?: ApiRestrictionReason; +} { + if (peerEntity instanceof GramJs.ChatForbidden || peerEntity instanceof GramJs.ChannelForbidden) { + return { + isRestricted: true, + }; + } + + if (peerEntity instanceof GramJs.User) { + return { + isRestricted: peerEntity.restricted, + restrictionReason: buildApiChatRestrictionReason(peerEntity.restrictionReason), + }; + } else if (peerEntity instanceof GramJs.Chat) { + return { + isNotJoined: peerEntity.left, + isRestricted: peerEntity.kicked, + }; + } else if (peerEntity instanceof GramJs.Channel) { + return { + isNotJoined: peerEntity.left, + isRestricted: peerEntity.restricted, + restrictionReason: buildApiChatRestrictionReason(peerEntity.restrictionReason), + }; + } + return {}; +} + +function buildApiChatMigrationInfo(peerEntity: GramJs.TypeChat): { + migratedTo?: { + chatId: number; + accessHash?: string; + }; +} { + if ( + peerEntity instanceof GramJs.Chat + && peerEntity.migratedTo + && !(peerEntity.migratedTo instanceof GramJs.InputChannelEmpty) + ) { + return { + migratedTo: { + chatId: getApiChatIdFromMtpPeer(peerEntity.migratedTo), + ...(peerEntity.migratedTo instanceof GramJs.InputChannel && { + accessHash: peerEntity.migratedTo.accessHash.toString(), + }), + }, + }; + } + + return {}; +} + +function buildApiChatRestrictionReason( + restrictionReasons?: GramJs.RestrictionReason[], +): ApiRestrictionReason | undefined { + if (!restrictionReasons) { + return undefined; + } + + const targetReason = restrictionReasons.find(({ platform }) => platform === 'all'); + return targetReason ? pick(targetReason, ['reason', 'text']) : undefined; +} + +export function buildApiChatFromPreview( + preview: GramJs.TypeChat | GramJs.TypeUser, + isSupport = false, + withForbidden = false, +): ApiChat | undefined { + if (!( + preview instanceof GramJs.Chat + || preview instanceof GramJs.Channel + || preview instanceof GramJs.User + || ( + withForbidden + && ( + preview instanceof GramJs.ChatForbidden + || preview instanceof GramJs.ChannelForbidden + ) + ) + )) { + return undefined; + } + + return { + id: preview instanceof GramJs.User ? preview.id : -preview.id, + type: getApiChatTypeFromPeerEntity(preview), + title: preview instanceof GramJs.User ? getUserName(preview) : preview.title, + ...buildApiChatFieldsFromPeerEntity(preview, isSupport), + }; +} + +export function getApiChatIdFromMtpPeer(peer: GramJs.TypePeer): number { + if (isPeerUser(peer)) { + return peer.userId; + } else if (isPeerChat(peer)) { + return -peer.chatId; + } else { + return -peer.channelId; + } +} + +export function getApiChatIdFromInputMtpPeer(peer: GramJs.TypeInputPeer): number | undefined { + if (isInputPeerUser(peer)) { + return peer.userId; + } else if (isInputPeerChat(peer)) { + return -peer.chatId; + } else if (isInputPeerChannel(peer)) { + return -peer.channelId; + } + return undefined; +} + +export function getApiChatTypeFromPeerEntity(peerEntity: GramJs.TypeChat | GramJs.TypeUser) { + if (peerEntity instanceof GramJs.User || peerEntity instanceof GramJs.UserEmpty) { + return 'chatTypePrivate'; + } else if ( + peerEntity instanceof GramJs.Chat + || peerEntity instanceof GramJs.ChatForbidden + || peerEntity instanceof GramJs.ChatEmpty + ) { + return 'chatTypeBasicGroup'; + } else { + return peerEntity.megagroup ? 'chatTypeSuperGroup' : 'chatTypeChannel'; + } +} + +export function getPeerKey(peer: GramJs.TypePeer) { + if (isPeerUser(peer)) { + return `user${peer.userId}`; + } else if (isPeerChat(peer)) { + return `chat${peer.chatId}`; + } else { + return `chat${peer.channelId}`; + } +} + +export function getApiChatTitleFromMtpPeer(peer: GramJs.TypePeer, peerEntity: GramJs.User | GramJs.Chat) { + if (isPeerUser(peer)) { + return getUserName(peerEntity as GramJs.User); + } else { + return (peerEntity as GramJs.Chat).title; + } +} + +function getUserName(user: GramJs.User) { + return user.firstName ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}` : undefined; +} + +export function buildAvatarHash(photo: any) { + if (photo instanceof GramJs.UserProfilePhoto) { + return photo.photoId.toString(); + } else if (photo instanceof GramJs.ChatPhoto) { + const { dcId, photoSmall: { volumeId, localId } } = photo; + return `${dcId}-${volumeId}-${localId}`; + } + + return undefined; +} + +export function buildChatMember( + member: GramJs.TypeChatParticipant | GramJs.TypeChannelParticipant, +): ApiChatMember { + return { + userId: member.userId, + inviterId: 'inviterId' in member ? member.inviterId : undefined, + joinedDate: 'date' in member ? member.date : undefined, + kickedByUserId: 'kickedBy' in member ? member.kickedBy : undefined, + promotedByUserId: 'promotedBy' in member ? member.promotedBy : undefined, + bannedRights: 'bannedRights' in member ? omitVirtualClassFields(member.bannedRights) : undefined, + adminRights: 'adminRights' in member ? omitVirtualClassFields(member.adminRights) : undefined, + customTitle: 'rank' in member ? member.rank : undefined, + ...((member instanceof GramJs.ChannelParticipantAdmin || member instanceof GramJs.ChatParticipantAdmin) && { + isAdmin: true, + }), + ...((member instanceof GramJs.ChannelParticipantCreator || member instanceof GramJs.ChatParticipantCreator) && { + isOwner: true, + }), + }; +} + +export function buildChatMembers( + participants: GramJs.TypeChatParticipants | GramJs.channels.ChannelParticipants, +): ApiChatMember[] | undefined { + // Duplicate code because of TS union-type shenanigans + if (participants instanceof GramJs.ChatParticipants) { + return participants.participants.map(buildChatMember); + } + if (participants instanceof GramJs.channels.ChannelParticipants) { + return participants.participants.map(buildChatMember); + } + + return undefined; +} + +export function buildChatInviteLink(exportedInvite: GramJs.TypeExportedChatInvite) { + return exportedInvite instanceof GramJs.ChatInviteExported + ? exportedInvite.link + : undefined; +} + +export function buildChatTypingStatus(update: GramJs.UpdateUserTyping | GramJs.UpdateChatUserTyping) { + let action: string = ''; + if (update.action instanceof GramJs.SendMessageCancelAction) { + return undefined; + } else if (update.action instanceof GramJs.SendMessageTypingAction) { + action = 'typing'; + } else if (update.action instanceof GramJs.SendMessageRecordVideoAction) { + action = 'recording a video'; + } else if (update.action instanceof GramJs.SendMessageUploadVideoAction) { + action = 'uploading a video'; + } else if (update.action instanceof GramJs.SendMessageRecordAudioAction) { + action = 'recording a voice message'; + } else if (update.action instanceof GramJs.SendMessageUploadAudioAction) { + action = 'uploading a voice message'; + } else if (update.action instanceof GramJs.SendMessageUploadPhotoAction) { + action = 'uploading a photo'; + } else if (update.action instanceof GramJs.SendMessageUploadDocumentAction) { + action = 'uploading a file'; + } else if (update.action instanceof GramJs.SendMessageGeoLocationAction) { + action = 'selecting a location to share'; + } else if (update.action instanceof GramJs.SendMessageChooseContactAction) { + action = 'selecting a contact to share'; + } else if (update.action instanceof GramJs.SendMessageGamePlayAction) { + action = 'playing a game'; + } else if (update.action instanceof GramJs.SendMessageRecordRoundAction) { + action = 'recording a round video'; + } else if (update.action instanceof GramJs.SendMessageUploadRoundAction) { + action = 'uploading a round video'; + } + + return { + action, + ...(update instanceof GramJs.UpdateChatUserTyping && { userId: update.userId }), + ...(update instanceof GramJs.UpdateChannelUserTyping && { userId: update.userId }), + timestamp: Date.now(), + }; +} + +export function buildApiChatFolder(filter: GramJs.DialogFilter): ApiChatFolder { + return { + ...pickTruthy(filter, [ + 'id', 'title', 'emoticon', 'contacts', 'nonContacts', 'groups', 'bots', + 'excludeMuted', 'excludeRead', 'excludeArchived', + ]), + channels: filter.broadcasts, + pinnedChatIds: filter.pinnedPeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any), + includedChatIds: filter.includePeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any), + excludedChatIds: filter.excludePeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any), + }; +} + +export function buildApiChatFolderFromSuggested({ + filter, description, +}: { + filter: GramJs.DialogFilter; + description: string; +}): ApiChatFolder { + return { + ...buildApiChatFolder(filter), + description, + }; +} diff --git a/src/api/gramjs/apiBuilders/common.ts b/src/api/gramjs/apiBuilders/common.ts new file mode 100644 index 000000000..1a1752806 --- /dev/null +++ b/src/api/gramjs/apiBuilders/common.ts @@ -0,0 +1,61 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { strippedPhotoToJpg } from '../../../lib/gramjs/Utils'; + +import { ApiThumbnail } from '../../types'; +import { bytesToDataUri } from './helpers'; +import { pathBytesToSvg } from './pathBytesToSvg'; + +const DEFAULT_THUMB_SIZE = { w: 100, h: 100 }; + +export function buildApiThumbnailFromStripped( + sizes?: GramJs.TypePhotoSize[], mimeType?: string, +): ApiThumbnail | undefined { + if (!sizes || !sizes.length) { + return undefined; + } + + const thumb = sizes.find((s: any): s is GramJs.PhotoStrippedSize => s instanceof GramJs.PhotoStrippedSize); + if (!thumb) { + return undefined; + } + + const realSizes = sizes.filter((s): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize); + const { w, h } = realSizes && realSizes.length ? realSizes[realSizes.length - 1] : DEFAULT_THUMB_SIZE; + const { bytes } = thumb; + const dataUri = bytesToDataUri( + !mimeType || mimeType === 'image/jpeg' ? strippedPhotoToJpg(bytes) : bytes, + undefined, + mimeType, + ); + + return { + dataUri, + width: w, + height: h, + }; +} + +export function buildApiThumbnailFromCached(photoSize: GramJs.PhotoCachedSize): ApiThumbnail | undefined { + const { w, h, bytes } = photoSize; + const dataUri = bytesToDataUri(bytes, undefined, 'image/webp'); + + return { + dataUri, + width: w, + height: h, + }; +} + +export function buildApiThumbnailFromPath( + photoSize: GramJs.PhotoPathSize, + sizeAttribute: GramJs.DocumentAttributeImageSize, +): ApiThumbnail | undefined { + const { w, h } = sizeAttribute; + const dataUri = `data:image/svg+xml;utf8,${pathBytesToSvg(photoSize.bytes, w, h)}`; + + return { + dataUri, + width: w, + height: h, + }; +} diff --git a/src/api/gramjs/apiBuilders/helpers.ts b/src/api/gramjs/apiBuilders/helpers.ts new file mode 100644 index 000000000..5aff17a80 --- /dev/null +++ b/src/api/gramjs/apiBuilders/helpers.ts @@ -0,0 +1,22 @@ +export function bytesToDataUri(bytes: Buffer, shouldOmitPrefix = false, mimeType: string = 'image/jpeg') { + const prefix = shouldOmitPrefix ? '' : `data:${mimeType};base64,`; + + return `${prefix}${btoa(String.fromCharCode(...bytes))}`; +} + +export function omitVirtualClassFields(instance: any) { + if (!instance) { + return undefined; + } + + const { + flags, + CONSTRUCTOR_ID, + SUBCLASS_OF_ID, + className, + classType, + ...rest + } = instance; + + return rest; +} diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts new file mode 100644 index 000000000..602ca5326 --- /dev/null +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -0,0 +1,904 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { + ApiMessage, + ApiMessageForwardInfo, + ApiPhoto, + ApiPhotoSize, + ApiSticker, + ApiVideo, + ApiVoice, + ApiAudio, + ApiDocument, + ApiAction, + ApiContact, + ApiAttachment, + ApiPoll, + ApiNewPoll, + ApiWebPage, + ApiMessageEntity, + ApiFormattedText, + ApiKeyboardButtons, + ApiKeyboardButton, + ApiChat, + ApiThreadInfo, + ApiInvoice, +} from '../../types'; + +import { DELETED_COMMENTS_CHANNEL_ID, LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID } from '../../../config'; +import { pick } from '../../../util/iteratees'; +import { getApiChatIdFromMtpPeer } from './chats'; +import { buildStickerFromDocument } from './symbols'; +import { buildApiThumbnailFromStripped } from './common'; +import { interpolateArray } from '../../../util/waveform'; +import { getCurrencySign } from '../../../components/middle/helpers/getCurrencySign'; +import { buildPeer } from '../gramjsBuilders'; + +const LOCAL_VIDEO_TEMP_ID = 'temp'; +const INPUT_WAVEFORM_LENGTH = 63; + +let localMessageCounter = LOCAL_MESSAGE_ID_BASE; +let currentUserId!: number; + +export function setMessageBuilderCurrentUserId(_currentUserId: number) { + currentUserId = _currentUserId; +} + +export function buildApiMessage(mtpMessage: GramJs.TypeMessage): ApiMessage | undefined { + const chatId = resolveMessageApiChatId(mtpMessage); + if ( + !chatId + || !(mtpMessage instanceof GramJs.Message || mtpMessage instanceof GramJs.MessageService)) { + return undefined; + } + + return buildApiMessageWithChatId(chatId, mtpMessage); +} + +export function resolveMessageApiChatId(mtpMessage: GramJs.TypeMessage) { + if (!(mtpMessage instanceof GramJs.Message || mtpMessage instanceof GramJs.MessageService)) { + return undefined; + } + + return getApiChatIdFromMtpPeer(mtpMessage.peerId); +} + +export function buildApiMessageFromShort(mtpMessage: GramJs.UpdateShortMessage): ApiMessage { + const chatId = getApiChatIdFromMtpPeer({ userId: mtpMessage.userId } as GramJs.TypePeer); + + return buildApiMessageWithChatId(chatId, { + ...mtpMessage, + fromId: buildPeer(mtpMessage.out ? currentUserId : mtpMessage.userId), + }); +} + +export function buildApiMessageFromShortChat(mtpMessage: GramJs.UpdateShortChatMessage): ApiMessage { + const chatId = getApiChatIdFromMtpPeer({ chatId: mtpMessage.chatId } as GramJs.TypePeer); + + return buildApiMessageWithChatId(chatId, { + ...mtpMessage, + fromId: buildPeer(mtpMessage.fromId), + }); +} + +export function buildApiMessageFromNotification( + notification: GramJs.UpdateServiceNotification, + currentDate: number, +): ApiMessage { + const localId = localMessageCounter++; + let content: ApiMessage['content'] = {}; + + if (notification.media) { + content = { + ...buildMessageMediaContent(notification.media), + }; + } + + if (notification.message && !content.sticker && !content.poll && !content.contact) { + content = { + ...content, + text: buildMessageTextContent(notification.message, notification.entities), + }; + } + + return { + id: localId, + chatId: SERVICE_NOTIFICATIONS_USER_ID, + date: notification.inboxDate || (currentDate / 1000), + content, + isOutgoing: false, + }; +} + +type UniversalMessage = ( + Pick + & Pick, ( + 'out' | 'message' | 'entities' | 'fromId' | 'peerId' | 'fwdFrom' | 'replyTo' | 'replyMarkup' | 'post' | + 'media' | 'action' | 'views' | 'editDate' | 'editHide' | 'mediaUnread' | 'groupedId' | 'mentioned' | 'viaBotId' | + 'replies' | 'fromScheduled' | 'postAuthor' + )> +); + +export function buildApiMessageWithChatId(chatId: number, mtpMessage: UniversalMessage): ApiMessage { + const fromId = mtpMessage.fromId ? getApiChatIdFromMtpPeer(mtpMessage.fromId) : undefined; + const isChatWithSelf = !fromId && chatId === currentUserId; + const isOutgoing = (mtpMessage.out && !mtpMessage.post) || (isChatWithSelf && !mtpMessage.fwdFrom); + + let content: ApiMessage['content'] = {}; + + if (mtpMessage.media) { + content = { + ...buildMessageMediaContent(mtpMessage.media), + }; + } + + if (mtpMessage.message && !content.sticker && !content.poll && !content.contact) { + content = { + ...content, + text: buildMessageTextContent(mtpMessage.message, mtpMessage.entities), + }; + } + + const action = mtpMessage.action && buildAction(mtpMessage.action, fromId, Boolean(mtpMessage.post), isOutgoing); + if (action) { + content.action = action; + } + + const { replyToMsgId, replyToTopId } = mtpMessage.replyTo || {}; + const isEdited = mtpMessage.editDate && !mtpMessage.editHide; + const { inlineButtons, keyboardButtons } = buildReplyButtons(mtpMessage) || {}; + const forwardInfo = mtpMessage.fwdFrom && buildApiMessageForwardInfo(mtpMessage.fwdFrom, isChatWithSelf); + const { replies, mediaUnread: isMediaUnread, postAuthor } = mtpMessage; + const groupedId = mtpMessage.groupedId && mtpMessage.groupedId.toString(); + const isInAlbum = Boolean(groupedId) && !(content.document || content.audio); + const shouldHideKeyboardButtons = mtpMessage.replyMarkup instanceof GramJs.ReplyKeyboardHide; + return { + id: mtpMessage.id, + chatId, + isOutgoing, + content, + date: mtpMessage.date, + senderId: fromId || (mtpMessage.out && mtpMessage.post && currentUserId) || chatId, + views: mtpMessage.views, + ...(replyToMsgId && { replyToMessageId: replyToMsgId }), + ...(replyToTopId && { replyToTopMessageId: replyToTopId }), + ...(forwardInfo && { forwardInfo }), + ...(isEdited && { isEdited }), + ...(isMediaUnread && { isMediaUnread }), + ...(mtpMessage.mentioned && isMediaUnread && { hasUnreadMention: true }), + ...(groupedId && { + groupedId, + isInAlbum, + }), + inlineButtons, + ...(keyboardButtons && { keyboardButtons }), + ...(shouldHideKeyboardButtons && { shouldHideKeyboardButtons }), + ...(mtpMessage.viaBotId && { viaBotId: mtpMessage.viaBotId }), + ...(replies && replies.comments && { threadInfo: buildThreadInfo(replies, mtpMessage.id, chatId) }), + ...(postAuthor && { adminTitle: postAuthor }), + }; +} + +export function buildMessageTextContent( + message: string, + entities?: GramJs.TypeMessageEntity[], +): ApiFormattedText { + return { + text: message, + ...(entities && { entities: entities.map(buildApiMessageEntity) }), + }; +} + +export function buildMessageDraft(draft: GramJs.TypeDraftMessage) { + if (draft instanceof GramJs.DraftMessageEmpty || !draft.message) { + return undefined; + } + + return { + formattedText: buildMessageTextContent(draft.message, draft.entities), + replyingToId: draft.replyToMsgId, + }; +} + +export function buildMessageMediaContent(media: GramJs.TypeMessageMedia): ApiMessage['content'] | undefined { + const sticker = buildSticker(media); + if (sticker) return { sticker }; + + const photo = buildPhoto(media); + if (photo) return { photo }; + + const video = buildVideo(media); + if (video) return { video }; + + const audio = buildAudio(media); + if (audio) return { audio }; + + const voice = buildVoice(media); + if (voice) return { voice }; + + const document = buildDocumentFromMedia(media); + if (document) return { document }; + + const contact = buildContact(media); + if (contact) return { contact }; + + const poll = buildPollFromMedia(media); + if (poll) return { poll }; + + const webPage = buildWebPage(media); + if (webPage) return { webPage }; + + const invoice = buildInvoiceFromMedia(media); + if (invoice) return { invoice }; + + return undefined; +} + +function buildApiMessageForwardInfo(fwdFrom: GramJs.MessageFwdHeader, isChatWithSelf = false): ApiMessageForwardInfo { + const savedFromPeerId = fwdFrom.savedFromPeer && getApiChatIdFromMtpPeer(fwdFrom.savedFromPeer); + const fromId = fwdFrom.fromId && getApiChatIdFromMtpPeer(fwdFrom.fromId); + + return { + isChannelPost: Boolean(fwdFrom.channelPost), + isLinkedChannelPost: Boolean(fwdFrom.channelPost && savedFromPeerId && !isChatWithSelf), + fromChatId: savedFromPeerId || fromId, + fromMessageId: fwdFrom.channelPost || fwdFrom.savedFromMsgId, + senderUserId: fromId, + hiddenUserName: fwdFrom.fromName, + adminTitle: fwdFrom.postAuthor, + }; +} + +function buildSticker(media: GramJs.TypeMessageMedia): ApiSticker | undefined { + if ( + !(media instanceof GramJs.MessageMediaDocument) + || !media.document + || !(media.document instanceof GramJs.Document) + ) { + return undefined; + } + + return buildStickerFromDocument(media.document); +} + +function buildPhoto(media: GramJs.TypeMessageMedia): ApiPhoto | undefined { + if (!(media instanceof GramJs.MessageMediaPhoto) || !media.photo || !(media.photo instanceof GramJs.Photo)) { + return undefined; + } + + const sizes = media.photo.sizes + .filter((s: any): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize) + .map(buildApiPhotoSize); + + return { + thumbnail: buildApiThumbnailFromStripped(media.photo.sizes), + sizes, + }; +} + +function buildApiPhotoSize(photoSize: GramJs.PhotoSize): ApiPhotoSize { + const { w, h, type } = photoSize; + + return { + width: w, + height: h, + type: type as ('m' | 'x' | 'y'), + }; +} + +export function buildVideoFromDocument(document: GramJs.Document): ApiVideo | undefined { + if (document instanceof GramJs.DocumentEmpty) { + return undefined; + } + + const { + id, mimeType, thumbs, size, attributes, + } = document; + + const videoAttr = attributes + .find((a: any): a is GramJs.DocumentAttributeVideo => a instanceof GramJs.DocumentAttributeVideo); + + if (!videoAttr) { + return undefined; + } + + const gifAttr = attributes + .find((a: any): a is GramJs.DocumentAttributeAnimated => a instanceof GramJs.DocumentAttributeAnimated); + + const { + duration, + w: width, + h: height, + supportsStreaming = false, + roundMessage: isRound = false, + } = videoAttr; + + return { + id: String(id), + mimeType, + duration, + fileName: getFilenameFromDocument(document, 'video'), + width, + height, + supportsStreaming, + isRound, + isGif: Boolean(gifAttr), + thumbnail: buildApiThumbnailFromStripped(thumbs), + size, + }; +} + +function buildVideo(media: GramJs.TypeMessageMedia): ApiVideo | undefined { + if ( + !(media instanceof GramJs.MessageMediaDocument) + || !(media.document instanceof GramJs.Document) + || !media.document.mimeType.startsWith('video') + ) { + return undefined; + } + + return buildVideoFromDocument(media.document); +} + +function buildAudio(media: GramJs.TypeMessageMedia): ApiAudio | undefined { + if ( + !(media instanceof GramJs.MessageMediaDocument) + || !media.document + || !(media.document instanceof GramJs.Document) + ) { + return undefined; + } + + const audioAttribute = media.document.attributes + .find((attr: any): attr is GramJs.DocumentAttributeAudio => ( + attr instanceof GramJs.DocumentAttributeAudio + )); + + if (!audioAttribute || audioAttribute.voice) { + return undefined; + } + + return { + fileName: getFilenameFromDocument(media.document, 'audio'), + ...pick(media.document, ['size', 'mimeType']), + ...pick(audioAttribute, ['duration', 'performer', 'title']), + }; +} + +function buildVoice(media: GramJs.TypeMessageMedia): ApiVoice | undefined { + if ( + !(media instanceof GramJs.MessageMediaDocument) + || !media.document + || !(media.document instanceof GramJs.Document) + ) { + return undefined; + } + + const audioAttribute = media.document.attributes + .find((attr: any): attr is GramJs.DocumentAttributeAudio => ( + attr instanceof GramJs.DocumentAttributeAudio + )); + + if (!audioAttribute || !audioAttribute.voice) { + return undefined; + } + + const { duration, waveform } = audioAttribute; + + return { + duration, + waveform: waveform ? Array.from(waveform) : undefined, + }; +} + +function buildDocumentFromMedia(media: GramJs.TypeMessageMedia) { + if (!(media instanceof GramJs.MessageMediaDocument) || !media.document) { + return undefined; + } + + return buildApiDocument(media.document); +} + +export function buildApiDocument(document: GramJs.TypeDocument): ApiDocument | undefined { + if (!(document instanceof GramJs.Document)) { + return undefined; + } + + const { + id, size, mimeType, date, thumbs, + } = document; + + const thumbnail = thumbs && buildApiThumbnailFromStripped(thumbs); + + return { + id: String(id), + size, + mimeType, + timestamp: date, + fileName: getFilenameFromDocument(document), + thumbnail, + }; +} + +function buildContact(media: GramJs.TypeMessageMedia): ApiContact | undefined { + if (!(media instanceof GramJs.MessageMediaContact)) { + return undefined; + } + + return pick(media, [ + 'firstName', + 'lastName', + 'phoneNumber', + 'userId', + ]); +} + +function buildPollFromMedia(media: GramJs.TypeMessageMedia): ApiPoll | undefined { + if (!(media instanceof GramJs.MessageMediaPoll)) { + return undefined; + } + + return buildPoll(media.poll, media.results); +} + + +function buildInvoiceFromMedia(media: GramJs.TypeMessageMedia): ApiInvoice | undefined { + if (!(media instanceof GramJs.MessageMediaInvoice)) { + return undefined; + } + + return buildInvoice(media); +} + +export function buildPoll(poll: GramJs.Poll, pollResults: GramJs.PollResults): ApiPoll { + const { id, answers: rawAnswers } = poll; + const answers = rawAnswers.map((answer) => ({ + text: answer.text, + option: String.fromCharCode(...answer.option), + })); + + return { + id: id.toString(), + summary: { + isPublic: poll.publicVoters, + ...pick(poll, [ + 'closed', + 'multipleChoice', + 'quiz', + 'question', + 'closePeriod', + 'closeDate', + ]), + answers, + }, + results: buildPollResults(pollResults), + }; +} + +export function buildInvoice(media: GramJs.MessageMediaInvoice): ApiInvoice { + const { + description: text, title, photo, test, totalAmount, currency, receiptMsgId, + } = media; + const currencySign = getCurrencySign(currency); + return { + text, + title, + photoUrl: photo && photo.url, + receiptMsgId, + description: `${currencySign}${(Number(totalAmount) / 100).toFixed(2)} ${test ? 'TEST INVOICE' : ''}`, + }; +} + +export function buildPollResults(pollResults: GramJs.PollResults): ApiPoll['results'] { + const { + results: rawResults, totalVoters, recentVoters, solution, solutionEntities: entities, + } = pollResults; + const results = rawResults && rawResults.map(({ + option, chosen, correct, voters, + }) => ({ + isChosen: chosen, + isCorrect: correct, + option: String.fromCharCode(...option), + votersCount: voters, + })); + + return { + totalVoters, + recentVoterIds: recentVoters, + results, + solution, + ...(entities && { solutionEntities: entities.map(buildApiMessageEntity) }), + }; +} + +export function buildWebPage(media: GramJs.TypeMessageMedia): ApiWebPage | undefined { + if ( + !(media instanceof GramJs.MessageMediaWebPage) + || !(media.webpage instanceof GramJs.WebPage) + ) { + return undefined; + } + + const { id, photo, document } = media.webpage; + + return { + id: Number(id), + ...pick(media.webpage, [ + 'url', + 'displayUrl', + 'siteName', + 'title', + 'description', + ]), + photo: photo && photo instanceof GramJs.Photo + ? { + thumbnail: buildApiThumbnailFromStripped(photo.sizes), + sizes: photo.sizes + .filter((s: any): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize) + .map(buildApiPhotoSize), + } + : undefined, + // TODO support video and embed + ...(document && { hasDocument: true }), + }; +} + +function buildAction( + action: GramJs.TypeMessageAction, + senderId: number | undefined, + isChannelPost: boolean, + isOutgoing: boolean, +): ApiAction | undefined { + if (action instanceof GramJs.MessageActionEmpty) { + return undefined; + } + + let text = ''; + let type: ApiAction['type'] = 'other'; + + const targetUserId = 'users' in action + // Api returns array of userIds, but no action currently has multiple users in it + ? action.users && action.users[0] + : ('userId' in action && action.userId) || undefined; + let targetChatId: number | undefined; + + if (action instanceof GramJs.MessageActionChatCreate) { + text = `%action_origin% created the group «${action.title}»`; + } else if (action instanceof GramJs.MessageActionChatEditTitle) { + text = isChannelPost + ? `Channel renamed to «${action.title}»` + : `%action_origin% changed group name to «${action.title}»`; + } else if (action instanceof GramJs.MessageActionChatEditPhoto) { + text = isChannelPost + ? 'Channel photo updated' + : '%action_origin% updated group photo'; + } else if (action instanceof GramJs.MessageActionChatDeletePhoto) { + text = isChannelPost + ? 'Channel photo was deleted' + : 'Chat photo was deleted'; + } else if (action instanceof GramJs.MessageActionChatAddUser) { + text = !senderId || senderId === targetUserId + ? '%target_user% joined the group' + : '%action_origin% added %target_user% to the group'; + } else if (action instanceof GramJs.MessageActionChatDeleteUser) { + text = !senderId || senderId === targetUserId + ? '%target_user% left the group' + : '%action_origin% removed %target_user% from the group'; + } else if (action instanceof GramJs.MessageActionChatJoinedByLink) { + text = '%action_origin% joined the chat from invitation link'; + } else if (action instanceof GramJs.MessageActionChannelCreate) { + text = 'Channel created'; + } else if (action instanceof GramJs.MessageActionChatMigrateTo) { + text = 'Migrated to %target_chat%'; + targetChatId = getApiChatIdFromMtpPeer(action); + } else if (action instanceof GramJs.MessageActionChannelMigrateFrom) { + text = 'Migrated from %target_chat%'; + targetChatId = getApiChatIdFromMtpPeer(action); + } else if (action instanceof GramJs.MessageActionPinMessage) { + text = '%action_origin% pinned %message%'; + } else if (action instanceof GramJs.MessageActionHistoryClear) { + text = 'Chat history was cleared'; + type = 'historyClear'; + } else if (action instanceof GramJs.MessageActionPhoneCall) { + text = `${isOutgoing ? 'Outgoing' : 'Incoming'} ${action.video ? 'Video' : 'Phone'} Call`; + + if (action.duration) { + const mins = Math.max(Math.round(action.duration / 60), 1); + text += ` (${mins} min${mins > 1 ? 's' : ''})`; + } + } else if (action instanceof GramJs.MessageActionContactSignUp) { + text = '%action_origin% joined Telegram'; + } else if (action instanceof GramJs.MessageActionPaymentSent) { + const currencySign = getCurrencySign(action.currency); + const amount = (Number(action.totalAmount) / 100).toFixed(2); + text = `You successfully transferred ${currencySign}${amount} to shop for %product%`; + } else { + text = '%ACTION_NOT_IMPLEMENTED%'; + } + + return { + text, + type, + targetUserId, + targetChatId, + }; +} + +function buildReplyButtons(message: UniversalMessage): { + [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons +} | undefined { + const { id: messageId, replyMarkup, media } = message; + + if (!replyMarkup) { + if (media instanceof GramJs.MessageMediaWebPage && media.webpage instanceof GramJs.WebPage) { + if (media.webpage.type === 'telegram_message') { + return { + inlineButtons: [[{ + type: 'url' as const, + text: 'Show Message', + messageId, + value: media.webpage.url, + }]], + }; + } + } + + return undefined; + } + + // TODO + if (!(replyMarkup instanceof GramJs.ReplyKeyboardMarkup || replyMarkup instanceof GramJs.ReplyInlineMarkup)) { + return undefined; + } + + const markup = replyMarkup.rows.map(({ buttons }) => { + return buttons.map((button) => { + let { text } = button; + + let type; + let value; + if (button instanceof GramJs.KeyboardButton) { + type = 'command'; + value = text; + } else if (button instanceof GramJs.KeyboardButtonUrl) { + type = 'url'; + value = button.url; + } else if (button instanceof GramJs.KeyboardButtonCallback) { + type = 'callback'; + value = String(button.data); + } else if (button instanceof GramJs.KeyboardButtonRequestPoll) { + type = 'requestPoll'; + } else if (button instanceof GramJs.KeyboardButtonBuy) { + if (media instanceof GramJs.MessageMediaInvoice && media.receiptMsgId) { + text = 'Receipt'; + value = media.receiptMsgId; + } + type = 'buy'; + } else { + type = 'NOT_SUPPORTED'; + } + + return { + type, + text, + messageId, + value, + } as ApiKeyboardButton; + }); + }); + + return { [replyMarkup instanceof GramJs.ReplyKeyboardMarkup ? 'keyboardButtons' : 'inlineButtons']: markup }; +} + +function getFilenameFromDocument(document: GramJs.Document, defaultBase = 'file') { + const { mimeType, attributes } = document; + const filenameAttribute = attributes + .find((a: any): a is GramJs.DocumentAttributeFilename => a instanceof GramJs.DocumentAttributeFilename); + + if (filenameAttribute) { + return filenameAttribute.fileName; + } + + const extension = mimeType.split('/')[1]; + + return `${defaultBase}${String(document.id)}.${extension}`; +} + +export function buildLocalMessage( + chat: ApiChat, + text?: string, + entities?: ApiMessageEntity[], + replyingTo?: number, + attachment?: ApiAttachment, + sticker?: ApiSticker, + gif?: ApiVideo, + poll?: ApiNewPoll, + groupedId?: string, + scheduledAt?: number, +): ApiMessage { + const localId = localMessageCounter++; + const media = attachment && buildUploadingMedia(attachment); + const isChannel = chat.type === 'chatTypeChannel'; + + return { + id: localId, + chatId: chat.id, + content: { + ...(text && { + text: { + text, + entities, + }, + }), + ...media, + ...(sticker && { sticker }), + ...(gif && { video: gif }), + ...(poll && buildNewPoll(poll, localId)), + }, + date: scheduledAt || Math.round(Date.now() / 1000), + isOutgoing: !isChannel, + senderId: currentUserId, + ...(replyingTo && { replyToMessageId: replyingTo }), + ...(groupedId && { + groupedId, + ...(media && (media.photo || media.video) && { isInAlbum: true }), + }), + ...(scheduledAt && { isScheduled: true }), + }; +} + +export function buildForwardedMessage( + toChat: ApiChat, + message: ApiMessage, +): ApiMessage { + const localId = localMessageCounter++; + const { + content, + chatId: fromChatId, + id: fromMessageId, + senderId, + groupedId, + isInAlbum, + } = message; + + const isAudio = content.audio; + const asIncomingInChatWithSelf = ( + toChat.id === currentUserId && (fromChatId !== toChat.id || message.forwardInfo) && !isAudio + ); + + return { + id: localId, + chatId: toChat.id, + content, + date: Math.round(Date.now() / 1000), + isOutgoing: !asIncomingInChatWithSelf && toChat.type !== 'chatTypeChannel', + senderId: currentUserId, + sendingState: 'messageSendingStatePending', + // Forward info doesn't get added when users forwards his own messages, also when forwarding audio + ...(senderId !== currentUserId && !isAudio && { + forwardInfo: { + isChannelPost: false, + fromChatId, + fromMessageId, + senderUserId: senderId, + }, + }), + groupedId, + isInAlbum, + }; +} + +function buildUploadingMedia( + attachment: ApiAttachment, +): ApiMessage['content'] { + const { + filename: fileName, + blobUrl, + previewBlobUrl, + mimeType, + size, + } = attachment; + + if (attachment.quick) { + const { width, height, duration } = attachment.quick; + + if (mimeType.startsWith('image/')) { + return { + photo: { + sizes: [], + thumbnail: { width, height, dataUri: '' }, // Used only for dimensions + blobUrl, + }, + }; + } else { + return { + video: { + id: LOCAL_VIDEO_TEMP_ID, + mimeType, + duration: duration || 0, + fileName, + width, + height, + blobUrl, + ...(previewBlobUrl && { thumbnail: { width, height, dataUri: previewBlobUrl } }), + size, + }, + }; + } + } else if (attachment.voice) { + const { duration, waveform } = attachment.voice; + const { data: inputWaveform } = interpolateArray(waveform, INPUT_WAVEFORM_LENGTH); + return { + voice: { + duration, + waveform: inputWaveform, + }, + }; + } else if (mimeType.startsWith('audio/')) { + return { + audio: { + mimeType, + fileName, + size, + duration: 200, // Arbitrary + }, + }; + } else { + return { + document: { + mimeType, + fileName, + size, + ...(previewBlobUrl && { previewBlobUrl }), + }, + }; + } +} + +function buildNewPoll(poll: ApiNewPoll, localId: number) { + return { + poll: { + id: localId.toString(), + summary: pick(poll.summary, ['question', 'answers']), + results: {}, + }, + }; +} + +function buildApiMessageEntity(entity: GramJs.TypeMessageEntity): ApiMessageEntity { + const { className: type, offset, length } = entity; + return { + type, + offset, + length, + ...('userId' in entity && typeof entity.userId === 'number' && { userId: entity.userId }), + ...('url' in entity && { url: entity.url }), + }; +} + +function buildThreadInfo( + messageReplies: GramJs.TypeMessageReplies, messageId: number, chatId: number, +): ApiThreadInfo | undefined { + const { + channelId, replies, maxId, readMaxId, recentRepliers, + } = messageReplies; + + if (channelId === DELETED_COMMENTS_CHANNEL_ID) { + return undefined; + } + + const isPostThread = chatId !== channelId; + + return { + threadId: messageId, + ...(isPostThread ? { + chatId: getApiChatIdFromMtpPeer({ channelId } as GramJs.TypePeer), + originChannelId: chatId, + } : { + chatId, + }), + messagesCount: replies, + lastMessageId: maxId, + lastReadInboxMessageId: readMaxId, + ...(recentRepliers && { recentReplierIds: recentRepliers.map(getApiChatIdFromMtpPeer) }), + }; +} diff --git a/src/api/gramjs/apiBuilders/misc.ts b/src/api/gramjs/apiBuilders/misc.ts new file mode 100644 index 000000000..52650360e --- /dev/null +++ b/src/api/gramjs/apiBuilders/misc.ts @@ -0,0 +1,98 @@ +import { Api as GramJs } from '../../../lib/gramjs'; + +import { ApiSession, ApiWallpaper } from '../../types'; +import { ApiPrivacySettings, ApiPrivacyKey, PrivacyVisibility } from '../../../types'; + +import { buildApiDocument } from './messages'; +import { pick } from '../../../util/iteratees'; + +export function buildApiWallpaper(wallpaper: GramJs.TypeWallPaper): ApiWallpaper | undefined { + if (wallpaper instanceof GramJs.WallPaperNoFile) { + // TODO: Plain color wallpapers + return undefined; + } + + const { slug } = wallpaper; + + const document = buildApiDocument(wallpaper.document); + + if (!document) { + return undefined; + } + + return { + slug, + document, + }; +} + +export function buildApiSession(session: GramJs.Authorization): ApiSession { + return { + isCurrent: Boolean(session.current), + isOfficialApp: Boolean(session.officialApp), + isPasswordPending: Boolean(session.passwordPending), + hash: String(session.hash), + ...pick(session, [ + 'deviceModel', 'platform', 'systemVersion', 'appName', 'appVersion', 'dateCreated', 'dateActive', + 'ip', 'country', 'region', + ]), + }; +} + +export function buildPrivacyKey(key: GramJs.TypePrivacyKey): ApiPrivacyKey | undefined { + switch (key.className) { + case 'PrivacyKeyPhoneNumber': + return 'phoneNumber'; + case 'PrivacyKeyStatusTimestamp': + return 'lastSeen'; + case 'PrivacyKeyProfilePhoto': + return 'profilePhoto'; + case 'PrivacyKeyForwards': + return 'forwards'; + case 'PrivacyKeyChatInvite': + return 'chatInvite'; + } + + return undefined; +} + +export function buildPrivacyRules(rules: GramJs.TypePrivacyRule[]): ApiPrivacySettings { + let visibility: PrivacyVisibility | undefined; + let allowUserIds: number[] | undefined; + let allowChatIds: number[] | undefined; + let blockUserIds: number[] | undefined; + let blockChatIds: number[] | undefined; + + rules.forEach((rule) => { + if (rule instanceof GramJs.PrivacyValueAllowAll) { + visibility = visibility || 'everybody'; + } else if (rule instanceof GramJs.PrivacyValueAllowContacts) { + visibility = visibility || 'contacts'; + } else if (rule instanceof GramJs.PrivacyValueDisallowContacts) { + visibility = visibility || 'nonContacts'; + } else if (rule instanceof GramJs.PrivacyValueDisallowAll) { + visibility = visibility || 'nobody'; + } else if (rule instanceof GramJs.PrivacyValueAllowUsers) { + allowUserIds = rule.users; + } else if (rule instanceof GramJs.PrivacyValueDisallowUsers) { + blockUserIds = rule.users; + } else if (rule instanceof GramJs.PrivacyValueAllowChatParticipants) { + allowChatIds = rule.chats.map((id) => -id); + } else if (rule instanceof GramJs.PrivacyValueDisallowChatParticipants) { + blockChatIds = rule.chats.map((id) => -id); + } + }); + + if (!visibility) { + // disallow by default. + visibility = 'nobody'; + } + + return { + visibility, + allowUserIds: allowUserIds || [], + allowChatIds: allowChatIds || [], + blockUserIds: blockUserIds || [], + blockChatIds: blockChatIds || [], + }; +} diff --git a/src/api/gramjs/apiBuilders/pathBytesToSvg.ts b/src/api/gramjs/apiBuilders/pathBytesToSvg.ts new file mode 100644 index 000000000..02b96be77 --- /dev/null +++ b/src/api/gramjs/apiBuilders/pathBytesToSvg.ts @@ -0,0 +1,35 @@ +/* eslint-disable no-bitwise */ + +// eslint-disable-next-line max-len +const TEMPLATE = ''; +const LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,'; + +export function pathBytesToSvg(bytes: Buffer, width: number, height: number) { + return TEMPLATE + .replace('{{path}}', buildPath(bytes)) + .replace('{{width}}', String(width)) + .replace('{{height}}', String(height)); +} + +function buildPath(bytes: Buffer) { + let path = 'M'; + + const len = bytes.length; + for (let i = 0; i < len; i++) { + const num = bytes[i]; + if (num >= 128 + 64) { + path += LOOKUP[num - 128 - 64]; + } else { + if (num >= 128) { + path += ','; + } else if (num >= 64) { + path += '-'; + } + path += String(num & 63); + } + } + + path += 'z'; + + return path; +} diff --git a/src/api/gramjs/apiBuilders/payments.ts b/src/api/gramjs/apiBuilders/payments.ts new file mode 100644 index 000000000..431ec3fc3 --- /dev/null +++ b/src/api/gramjs/apiBuilders/payments.ts @@ -0,0 +1,119 @@ +import { Api as GramJs } from '../../../lib/gramjs'; + +export function buildShippingOptions(shippingOptions: GramJs.ShippingOption[] | undefined) { + if (!shippingOptions) { + return undefined; + } + return Object.values(shippingOptions).map((option) => { + return { + id: option.id, + title: option.title, + amount: option.prices.reduce((ac, cur) => ac + Number((cur.amount as any).value), 0), + prices: option.prices.map(({ label, amount }) => { + return { + label, + amount: Number((amount as any).value), + }; + }), + }; + }); +} + +export function buildReceipt(receipt: GramJs.payments.PaymentReceipt) { + const { + invoice, + info, + shipping, + currency, + totalAmount, + credentialsTitle, + } = receipt; + + const { shippingAddress, phone, name } = (info || {}); + + const { prices } = invoice; + const mapedPrices = prices.map(({ label, amount }) => ({ + label, + amount: Number((amount as any).value), + })); + + let shippingPrices; + let shippingMethod; + + if (shipping) { + shippingPrices = shipping.prices.map(({ label, amount }) => { + return { + label, + amount: Number((amount as any).value), + }; + }); + shippingMethod = shipping.title; + } + + return { + currency, + prices: mapedPrices, + info: { shippingAddress, phone, name }, + totalAmount: Number((totalAmount as any).value), + credentialsTitle, + shippingPrices, + shippingMethod, + }; +} + +export function buildPaymentForm(form: GramJs.payments.PaymentForm) { + const { + canSaveCredentials, + passwordMissing, + providerId, + nativeProvider, + nativeParams, + savedInfo, + invoice, + } = form; + + const { + test, + nameRequested, + phoneRequested, + emailRequested, + shippingAddressRequested, + flexible, + phoneToProvider, + emailToProvider, + currency, + prices, + } = invoice; + + const mapedPrices = prices.map(({ label, amount }) => ({ + label, + amount: Number((amount as any).value), + })); + + const nativeData = nativeParams ? JSON.parse(nativeParams.data) : {}; + return { + canSaveCredentials, + passwordMissing, + providerId, + nativeProvider, + savedInfo, + invoice: { + test, + nameRequested, + phoneRequested, + emailRequested, + shippingAddressRequested, + flexible, + phoneToProvider, + emailToProvider, + currency, + prices: mapedPrices, + }, + nativeParams: { + needCardholderName: nativeData.need_cardholder_name, + needCountry: nativeData.need_country, + needZip: nativeData.need_zip, + publishableKey: nativeData.publishable_key, + }, + }; +} diff --git a/src/api/gramjs/apiBuilders/peers.ts b/src/api/gramjs/apiBuilders/peers.ts new file mode 100644 index 000000000..0dd8bac29 --- /dev/null +++ b/src/api/gramjs/apiBuilders/peers.ts @@ -0,0 +1,25 @@ +import { Api as GramJs } from '../../../lib/gramjs'; + +export function isPeerUser(peer: GramJs.TypePeer): peer is GramJs.PeerUser { + return peer.hasOwnProperty('userId'); +} + +export function isPeerChat(peer: GramJs.TypePeer): peer is GramJs.PeerChat { + return peer.hasOwnProperty('chatId'); +} + +export function isPeerChannel(peer: GramJs.TypePeer): peer is GramJs.PeerChannel { + return peer.hasOwnProperty('channelId'); +} + +export function isInputPeerUser(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerUser { + return peer.hasOwnProperty('userId'); +} + +export function isInputPeerChat(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerChat { + return peer.hasOwnProperty('chatId'); +} + +export function isInputPeerChannel(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerChannel { + return peer.hasOwnProperty('channelId'); +} diff --git a/src/api/gramjs/apiBuilders/symbols.ts b/src/api/gramjs/apiBuilders/symbols.ts new file mode 100644 index 000000000..41cea3b6f --- /dev/null +++ b/src/api/gramjs/apiBuilders/symbols.ts @@ -0,0 +1,101 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { ApiSticker, ApiStickerSet } from '../../types'; +import { MEMOJI_STICKER_ID } from '../../../config'; + +import { buildApiThumbnailFromCached, buildApiThumbnailFromPath } from './common'; +import localDb from '../localDb'; + +export function buildStickerFromDocument(document: GramJs.TypeDocument): ApiSticker | undefined { + if (document instanceof GramJs.DocumentEmpty) { + return undefined; + } + + const stickerAttribute = document.attributes + .find((attr: any): attr is GramJs.DocumentAttributeSticker => ( + attr instanceof GramJs.DocumentAttributeSticker + )); + + if (!stickerAttribute) { + return undefined; + } + + const sizeAttribute = document.attributes + .find((attr: any): attr is GramJs.DocumentAttributeImageSize => ( + attr instanceof GramJs.DocumentAttributeImageSize + )); + + const stickerSetInfo = stickerAttribute.stickerset as GramJs.InputStickerSetID; + const emoji = stickerAttribute.alt; + const isAnimated = document.mimeType === 'application/x-tgsticker'; + const cachedThumb = document.thumbs && document.thumbs.find( + (s): s is GramJs.PhotoCachedSize => s instanceof GramJs.PhotoCachedSize, + ); + const pathThumb = document.thumbs && document.thumbs.find( + (s): s is GramJs.PhotoPathSize => s instanceof GramJs.PhotoPathSize, + ); + const thumbnail = cachedThumb ? ( + buildApiThumbnailFromCached(cachedThumb) + ) : pathThumb && sizeAttribute ? ( + buildApiThumbnailFromPath(pathThumb, sizeAttribute) + ) : undefined; + + const { w: width, h: height } = cachedThumb as GramJs.PhotoCachedSize || sizeAttribute || {}; + + return { + id: String(document.id), + stickerSetId: stickerSetInfo.id ? String(stickerSetInfo.id) : MEMOJI_STICKER_ID, + stickerSetAccessHash: String(stickerSetInfo.accessHash), + emoji, + isAnimated, + width, + height, + thumbnail, + }; +} + +export function buildStickerSet(set: GramJs.StickerSet): ApiStickerSet { + const { + archived, + animated, + installedDate, + id, + accessHash, + title, + thumb, + count, + hash, + } = set; + + return { + archived, + isAnimated: animated, + installedDate, + id: String(id), + accessHash: String(accessHash), + title, + hasThumbnail: Boolean(thumb), + count, + hash, + }; +} + +export function buildStickerSetCovered(coveredStickerSet: GramJs.TypeStickerSetCovered): ApiStickerSet { + const stickerSet = buildStickerSet(coveredStickerSet.set); + + const stickerSetCovers = (coveredStickerSet instanceof GramJs.StickerSetMultiCovered) + ? coveredStickerSet.covers + : [coveredStickerSet.cover]; + + stickerSet.covers = []; + stickerSetCovers.forEach((cover) => { + if (cover instanceof GramJs.Document) { + const coverSticker = buildStickerFromDocument(cover); + if (coverSticker) { + stickerSet.covers!.push(coverSticker); + localDb.documents[String(cover.id)] = cover; + } + } + }); + + return stickerSet; +} diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts new file mode 100644 index 000000000..ecd992ecb --- /dev/null +++ b/src/api/gramjs/apiBuilders/users.ts @@ -0,0 +1,74 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { ApiUser, ApiUserStatus, ApiUserType } from '../../types'; + +export function buildApiUserFromFull(mtpUserFull: GramJs.UserFull): ApiUser { + const { + about, commonChatsCount, pinnedMsgId, botInfo, notifySettings: { silent, muteUntil }, + } = mtpUserFull; + const isMuted = silent || (typeof muteUntil === 'number' && Date.now() < muteUntil * 1000); + + return { + ...(buildApiUser(mtpUserFull.user) as ApiUser), + fullInfo: { + bio: about, + commonChatsCount, + pinnedMessageId: pinnedMsgId, + isMuted, + ...(botInfo && { botDescription: botInfo.description }), + }, + }; +} + +export function buildApiUser(mtpUser: GramJs.TypeUser): ApiUser | undefined { + if (!(mtpUser instanceof GramJs.User)) { + return undefined; + } + + const { id, firstName, lastName } = mtpUser; + const avatarHash = mtpUser.photo instanceof GramJs.UserProfilePhoto + ? String(mtpUser.photo.photoId) + : undefined; + + return { + id, + isMin: Boolean(mtpUser.min), + ...(mtpUser.self && { isSelf: true }), + ...(mtpUser.verified && { isVerified: true }), + ...((mtpUser.contact || mtpUser.mutualContact) && { isContact: true }), + type: buildApiUserType(mtpUser), + ...(firstName && { firstName }), + ...(lastName && { lastName }), + username: mtpUser.username || '', + phoneNumber: mtpUser.phone || '', + status: buildApiUserStatus(mtpUser.status), + ...(mtpUser.accessHash && { accessHash: String(mtpUser.accessHash) }), + ...(avatarHash && { avatarHash }), + }; +} + +function buildApiUserType(user: GramJs.User): ApiUserType { + if (user.bot) { + return 'userTypeBot'; + } + if (user.deleted) { + return 'userTypeDeleted'; + } + + return 'userTypeRegular'; +} + +export function buildApiUserStatus(mtpStatus?: GramJs.TypeUserStatus): ApiUserStatus { + if (!mtpStatus || mtpStatus instanceof GramJs.UserStatusEmpty) { + return { type: 'userStatusEmpty' }; + } else if (mtpStatus instanceof GramJs.UserStatusOnline) { + return { type: 'userStatusOnline', expires: mtpStatus.expires }; + } else if (mtpStatus instanceof GramJs.UserStatusOffline) { + return { type: 'userStatusOffline', wasOnline: mtpStatus.wasOnline }; + } else if (mtpStatus instanceof GramJs.UserStatusRecently) { + return { type: 'userStatusRecently' }; + } else if (mtpStatus instanceof GramJs.UserStatusLastWeek) { + return { type: 'userStatusLastWeek' }; + } else { + return { type: 'userStatusLastMonth' }; + } +} diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts new file mode 100644 index 000000000..c26ea1cf7 --- /dev/null +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -0,0 +1,391 @@ +import BigInt from 'big-integer'; +import { Api as GramJs } from '../../../lib/gramjs'; + +import { ApiPrivacyKey } from '../../../types'; + +import { generateRandomBytes, readBigIntFromBuffer } from '../../../lib/gramjs/Helpers'; +import { + ApiSticker, + ApiVideo, + ApiNewPoll, + ApiMessageEntity, + ApiMessageEntityTypes, + ApiChatFolder, + ApiChatBannedRights, + ApiChatAdminRights, +} from '../../types'; +import localDb from '../localDb'; +import { pick } from '../../../util/iteratees'; + +export function getEntityTypeById(chatOrUserId: number) { + if (chatOrUserId > 0) { + return 'user'; + } else if (chatOrUserId <= -1000000000) { + return 'channel'; + } else { + return 'chat'; + } +} + +export function buildPeer(chatOrUserId: number): GramJs.TypePeer { + if (chatOrUserId > 0) { + return new GramJs.PeerUser({ + userId: chatOrUserId, + }); + } else if (chatOrUserId <= -1000000000) { + return new GramJs.PeerChannel({ + channelId: -chatOrUserId, + }); + } else { + return new GramJs.PeerChat({ + chatId: -chatOrUserId, + }); + } +} + +export function buildInputPeer(chatOrUserId: number, accessHash?: string): GramJs.TypeInputPeer { + if (chatOrUserId > 0 || chatOrUserId <= -1000000000) { + return chatOrUserId > 0 + ? new GramJs.InputPeerUser({ + userId: chatOrUserId, + accessHash: BigInt(accessHash!), + }) + : new GramJs.InputPeerChannel({ + channelId: -chatOrUserId, + accessHash: BigInt(accessHash!), + }); + } else { + return new GramJs.InputPeerChat({ + chatId: -chatOrUserId, + }); + } +} + +export function buildInputPeerFromLocalDb(chatOrUserId: number): GramJs.TypeInputPeer | undefined { + if (chatOrUserId > 0) { + const { accessHash } = localDb.users[chatOrUserId] || {}; + + return accessHash + ? new GramJs.InputPeerUser({ + userId: chatOrUserId, + accessHash, + }) + : undefined; + } + + if (chatOrUserId <= -1000000000) { + const { accessHash } = (localDb.chats[-chatOrUserId] as GramJs.Channel) || {}; + + return accessHash + ? new GramJs.InputPeerChannel({ + channelId: -chatOrUserId, + accessHash, + }) + : undefined; + } + + return new GramJs.InputPeerChat({ + chatId: -chatOrUserId, + }); +} + +export function buildInputEntity(chatOrUserId: number, accessHash?: string) { + if (chatOrUserId > 0) { + return new GramJs.InputUser({ + userId: chatOrUserId, + accessHash: BigInt(accessHash!), + }); + } else if (chatOrUserId <= -1000000000) { + return new GramJs.InputChannel({ + channelId: -chatOrUserId, + accessHash: BigInt(accessHash!), + }); + } else { + return -chatOrUserId; + } +} + +export function buildInputStickerSet(id: string, accessHash: string) { + return new GramJs.InputStickerSetID({ + id: BigInt(id), + accessHash: BigInt(accessHash), + }); +} + +export function buildInputDocument(media: ApiSticker | ApiVideo) { + const document = localDb.documents[media.id]; + + if (!document) { + return undefined; + } + + return new GramJs.InputDocument(pick(document, [ + 'id', + 'accessHash', + 'fileReference', + ])); +} + +export function buildInputMediaDocument(media: ApiSticker | ApiVideo) { + const inputDocument = buildInputDocument(media); + + if (!inputDocument) { + return undefined; + } + + return new GramJs.InputMediaDocument({ id: inputDocument }); +} + +export function buildInputPoll(pollParams: ApiNewPoll, randomId: BigInt.BigInteger) { + const { summary, quiz } = pollParams; + + const poll = new GramJs.Poll({ + id: randomId, + publicVoters: summary.isPublic, + question: summary.question, + answers: summary.answers.map(({ text, option }) => new GramJs.PollAnswer({ text, option: Buffer.from(option) })), + quiz: summary.quiz, + multipleChoice: summary.multipleChoice, + }); + + if (!quiz) { + return new GramJs.InputMediaPoll({ poll }); + } + + const correctAnswers = quiz.correctAnswers.map((key) => Buffer.from(key)); + const { solution } = quiz; + const solutionEntities = quiz.solutionEntities ? quiz.solutionEntities.map(buildMtpMessageEntity) : []; + + return new GramJs.InputMediaPoll({ + poll, + correctAnswers, + ...(solution && { + solution, + solutionEntities, + }), + }); +} + +export function buildFilterFromApiFolder(folder: ApiChatFolder): GramJs.DialogFilter { + const { + emoticon, + contacts, + nonContacts, + groups, + channels, + bots, + excludeArchived, + excludeMuted, + excludeRead, + pinnedChatIds, + includedChatIds, + excludedChatIds, + } = folder; + + const pinnedPeers = pinnedChatIds + ? pinnedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any) + : []; + + const includePeers = includedChatIds + ? includedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any) + : []; + + const excludePeers = excludedChatIds + ? excludedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any) + : []; + + return new GramJs.DialogFilter({ + id: folder.id, + title: folder.title, + emoticon: emoticon || undefined, + contacts: contacts || undefined, + nonContacts: nonContacts || undefined, + groups: groups || undefined, + bots: bots || undefined, + excludeArchived: excludeArchived || undefined, + excludeMuted: excludeMuted || undefined, + excludeRead: excludeRead || undefined, + broadcasts: channels || undefined, + pinnedPeers, + includePeers, + excludePeers, + }); +} + +export function generateRandomBigInt() { + return readBigIntFromBuffer(generateRandomBytes(8), true, true); +} + +export function buildMessageFromUpdate( + id: number, + chatId: number, + update: GramJs.UpdateShortSentMessage | GramJs.UpdateServiceNotification, +) { + // This is not a proper message, but we only need these fields for downloading media through `localDb`. + return new GramJs.Message({ + id, + peerId: buildPeer(chatId), + fromId: buildPeer(chatId), + media: update.media, + } as GramJs.Message); +} + +export function buildMtpMessageEntity(entity: ApiMessageEntity): GramJs.TypeMessageEntity { + const { + type, offset, length, url, userId, + } = entity; + + const user = userId ? localDb.users[userId] : undefined; + + switch (type) { + case ApiMessageEntityTypes.Bold: + return new GramJs.MessageEntityBold({ offset, length }); + case ApiMessageEntityTypes.Italic: + return new GramJs.MessageEntityItalic({ offset, length }); + case ApiMessageEntityTypes.Underline: + return new GramJs.MessageEntityUnderline({ offset, length }); + case ApiMessageEntityTypes.Strike: + return new GramJs.MessageEntityStrike({ offset, length }); + case ApiMessageEntityTypes.Code: + return new GramJs.MessageEntityCode({ offset, length }); + case ApiMessageEntityTypes.Pre: + return new GramJs.MessageEntityPre({ offset, length, language: '' }); + case ApiMessageEntityTypes.Blockquote: + return new GramJs.MessageEntityBlockquote({ offset, length }); + case ApiMessageEntityTypes.TextUrl: + return new GramJs.MessageEntityTextUrl({ offset, length, url: url! }); + case ApiMessageEntityTypes.Url: + return new GramJs.MessageEntityUrl({ offset, length }); + case ApiMessageEntityTypes.Hashtag: + return new GramJs.MessageEntityHashtag({ offset, length }); + case ApiMessageEntityTypes.MentionName: + return new GramJs.InputMessageEntityMentionName({ + offset, + length, + userId: new GramJs.InputUser({ userId: userId!, accessHash: user!.accessHash! }), + }); + default: + return new GramJs.MessageEntityUnknown({ offset, length }); + } +} + +// TODO: This formula is taken from API docs, but doesn't seem to calculate hash correctly +export function calculateResultHash(ids: number[]) { + let hash = 0; + ids.forEach((id) => { + // eslint-disable-next-line no-bitwise + hash = (((hash * 0x4F25) & 0x7FFFFFFF) + id) & 0x7FFFFFFF; + }); + + return hash; +} + +export function isMessageWithMedia(message: GramJs.Message | GramJs.UpdateServiceNotification) { + const { media } = message; + if (!media) { + return false; + } + + return ( + media instanceof GramJs.MessageMediaPhoto + || media instanceof GramJs.MessageMediaDocument + || ( + media instanceof GramJs.MessageMediaWebPage + && media.webpage instanceof GramJs.WebPage + && media.webpage.photo instanceof GramJs.Photo + ) + ); +} + +export function buildChatPhotoForLocalDb(photo: GramJs.TypePhoto) { + if (photo instanceof GramJs.PhotoEmpty) { + return new GramJs.ChatPhotoEmpty(); + } + + const { dcId } = photo; + const nonStrippedSizes = photo.sizes + .filter((s: any): s is (GramJs.PhotoSize | GramJs.PhotoCachedSize) => { + return s instanceof GramJs.PhotoSize || s instanceof GramJs.PhotoCachedSize; + }); + + if (!nonStrippedSizes.length) { + return new GramJs.ChatPhotoEmpty(); + } + + const smallSize = nonStrippedSizes.find((s) => s.type === 'a'); + const largeSize = nonStrippedSizes.find((s) => s.type === 'c') || nonStrippedSizes.find((s) => s.type === 'b'); + + if (!smallSize || !largeSize) { + return new GramJs.ChatPhotoEmpty(); + } + + return new GramJs.ChatPhoto({ + dcId, + photoSmall: smallSize && smallSize.location, + photoBig: largeSize && largeSize.location, + }); +} + +export function buildInputContact({ + phone, + firstName, + lastName, +}: { + phone: string; + firstName: string; + lastName: string; +}) { + return new GramJs.InputPhoneContact({ + clientId: BigInt(1), + phone, + firstName, + lastName, + }); +} + +export function buildChatBannedRights( + bannedRights: ApiChatBannedRights, + untilDate = 0, +) { + return new GramJs.ChatBannedRights({ + ...bannedRights, + untilDate, + }); +} + +export function buildChatAdminRights( + adminRights: ApiChatAdminRights, +) { + return new GramJs.ChatAdminRights(adminRights); +} + +export function buildShippingInfo(info: GramJs.PaymentRequestedInfo) { + const { shippingAddress } = info; + return new GramJs.PaymentRequestedInfo({ + ...info, + shippingAddress: shippingAddress + ? new GramJs.PostAddress(shippingAddress) + : undefined, + }); +} + +export function buildInputPrivacyKey(privacyKey: ApiPrivacyKey) { + switch (privacyKey) { + case 'phoneNumber': + return new GramJs.InputPrivacyKeyPhoneNumber(); + + case 'lastSeen': + return new GramJs.InputPrivacyKeyStatusTimestamp(); + + case 'profilePhoto': + return new GramJs.InputPrivacyKeyProfilePhoto(); + + case 'forwards': + return new GramJs.InputPrivacyKeyForwards(); + + case 'chatInvite': + return new GramJs.InputPrivacyKeyChatInvite(); + } + + return undefined; +} diff --git a/src/api/gramjs/helpers.ts b/src/api/gramjs/helpers.ts new file mode 100644 index 000000000..2c4cb7861 --- /dev/null +++ b/src/api/gramjs/helpers.ts @@ -0,0 +1,14 @@ +import { Api as GramJs } from '../../lib/gramjs'; +import localDb from './localDb'; +import { resolveMessageApiChatId } from './apiBuilders/messages'; + +export function addMessageToLocalDb(message: GramJs.Message) { + const messageFullId = `${resolveMessageApiChatId(message)}-${message.id}`; + localDb.messages[messageFullId] = message; + if ( + message.media instanceof GramJs.MessageMediaDocument + && message.media.document instanceof GramJs.Document + ) { + localDb.documents[String(message.media.document.id)] = message.media.document; + } +} diff --git a/src/api/gramjs/index.ts b/src/api/gramjs/index.ts new file mode 100644 index 000000000..9ea03f841 --- /dev/null +++ b/src/api/gramjs/index.ts @@ -0,0 +1,2 @@ +// export { initApi, callApi, cancelApiProgress } from './provider'; +export { initApi, callApi, cancelApiProgress } from './worker/provider'; diff --git a/src/api/gramjs/localDb.ts b/src/api/gramjs/localDb.ts new file mode 100644 index 000000000..d2e7478f8 --- /dev/null +++ b/src/api/gramjs/localDb.ts @@ -0,0 +1,21 @@ +import { Api as GramJs } from '../../lib/gramjs'; +import { ApiMessage } from '../types'; + +interface LocalDb { + localMessages: Record; + // Used for loading avatars and media through in-memory Gram JS instances. + chats: Record; + users: Record; + messages: Record; + documents: Record; + stickerSets: Record; +} + +export default { + localMessages: {}, + chats: {}, + users: {}, + messages: {}, + documents: {}, + stickerSets: {}, +} as LocalDb; diff --git a/src/api/gramjs/methods/auth.ts b/src/api/gramjs/methods/auth.ts new file mode 100644 index 000000000..176fdc033 --- /dev/null +++ b/src/api/gramjs/methods/auth.ts @@ -0,0 +1,176 @@ +import { errors } from '../../../lib/gramjs'; +import { + ApiUpdateAuthorizationState, + ApiUpdateAuthorizationStateType, + OnApiUpdate, + ApiUser, +} from '../../types'; + +import { DEBUG } from '../../../config'; + +const ApiErrors: { [k: string]: string } = { + PHONE_NUMBER_INVALID: 'Invalid Phone Number', + PHONE_CODE_INVALID: 'Invalid Code', + PASSWORD_HASH_INVALID: 'Invalid Password', +}; + +const authController: { + resolve?: Function; + reject?: Function; +} = {}; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export function onRequestPhoneNumber() { + onUpdate(buildAuthStateUpdate('authorizationStateWaitPhoneNumber')); + + return new Promise((resolve, reject) => { + authController.resolve = resolve; + authController.reject = reject; + }); +} + +export function onRequestCode(isCodeViaApp = false) { + onUpdate({ + ...buildAuthStateUpdate('authorizationStateWaitCode'), + isCodeViaApp, + }); + + return new Promise((resolve, reject) => { + authController.resolve = resolve; + authController.reject = reject; + }); +} + +export function onRequestPassword(hint?: string) { + onUpdate({ + ...buildAuthStateUpdate('authorizationStateWaitPassword'), + hint, + }); + + return new Promise((resolve) => { + authController.resolve = resolve; + }); +} + +export function onRequestRegistration() { + onUpdate(buildAuthStateUpdate('authorizationStateWaitRegistration')); + + return new Promise<[string, string?]>((resolve) => { + authController.resolve = resolve; + }); +} + +export function onRequestQrCode(qrCode: { token: Buffer; expires: number }) { + onUpdate({ + ...buildAuthStateUpdate('authorizationStateWaitQrCode'), + qrCode: { + token: btoa(String.fromCharCode(...qrCode.token)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''), + expires: qrCode.expires, + }, + }); + + return new Promise((resolve, reject) => { + authController.reject = reject; + }); +} + +export function onAuthError(err: Error) { + let message: string; + + if (err instanceof errors.FloodWaitError) { + const hours = Math.ceil(Number(err.seconds) / 60 / 60); + message = `Too many attempts. Try again in ${hours > 1 ? `${hours} hours` : 'an hour'}`; + } else { + message = ApiErrors[err.message]; + } + + if (!message) { + message = 'Unexpected Error'; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(err); + } + } + + onUpdate({ + '@type': 'updateAuthorizationError', + message, + }); +} + +export function onAuthReady(sessionId: string) { + onUpdate({ + ...buildAuthStateUpdate('authorizationStateReady'), + sessionId, + }); +} + +export function onCurrentUserUpdate(currentUser: ApiUser) { + onUpdate({ + '@type': 'updateCurrentUser', + currentUser, + }); +} + +export function buildAuthStateUpdate(authorizationState: ApiUpdateAuthorizationStateType): ApiUpdateAuthorizationState { + return { + '@type': 'updateAuthorizationState', + authorizationState, + }; +} + +export function provideAuthPhoneNumber(phoneNumber: string) { + if (!authController.resolve) { + return; + } + + authController.resolve(phoneNumber); +} + +export function provideAuthCode(code: string) { + if (!authController.resolve) { + return; + } + + authController.resolve(code); +} + +export function provideAuthPassword(password: string) { + if (!authController.resolve) { + return; + } + + authController.resolve(password); +} + +export function provideAuthRegistration(registration: { firstName: string; lastName: string }) { + const { firstName, lastName } = registration; + + if (!authController.resolve) { + return; + } + + authController.resolve([firstName, lastName]); +} + +export function restartAuth() { + if (!authController.reject) { + return; + } + + authController.reject(new Error('RESTART_AUTH')); +} + +export function restartAuthWithQr() { + if (!authController.reject) { + return; + } + + authController.reject(new Error('RESTART_AUTH_WITH_QR')); +} diff --git a/src/api/gramjs/methods/bots.ts b/src/api/gramjs/methods/bots.ts new file mode 100644 index 000000000..21d87ff38 --- /dev/null +++ b/src/api/gramjs/methods/bots.ts @@ -0,0 +1,26 @@ +import { invokeRequest } from './client'; +import { Api as GramJs } from '../../../lib/gramjs'; +import { buildInputPeer } from '../gramjsBuilders'; + +export function init() { +} + +export async function answerCallbackButton( + { + chatId, accessHash, messageId, data, + }: { + chatId: number; accessHash?: string; messageId: number; data: string; + }, +) { + const result = await invokeRequest(new GramJs.messages.GetBotCallbackAnswer({ + peer: buildInputPeer(chatId, accessHash), + msgId: messageId, + data: Buffer.from(data), + })); + + if (!result) { + return undefined; + } + + return result; +} diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts new file mode 100644 index 000000000..ea947fde1 --- /dev/null +++ b/src/api/gramjs/methods/chats.ts @@ -0,0 +1,933 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { + OnApiUpdate, + ApiChat, + ApiMessage, + ApiUser, + ApiMessageEntity, + ApiFormattedText, + ApiChatFullInfo, + ApiChatFolder, + ApiChatBannedRights, + ApiChatAdminRights, +} from '../../types'; + +import { DEBUG, ARCHIVED_FOLDER_ID, CHANNEL_MEMBERS_LIMIT } from '../../../config'; +import { invokeRequest, uploadFile } from './client'; +import { + buildApiChatFromDialog, + getPeerKey, + buildChatMembers, + buildChatInviteLink, + buildApiChatFromPreview, + getApiChatIdFromMtpPeer, + buildApiChatFolder, + buildApiChatFolderFromSuggested, +} from '../apiBuilders/chats'; +import { buildApiMessage, buildMessageDraft } from '../apiBuilders/messages'; +import { buildApiUser } from '../apiBuilders/users'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import localDb from '../localDb'; +import { + buildInputEntity, + buildInputPeer, + buildMtpMessageEntity, + buildFilterFromApiFolder, + isMessageWithMedia, + buildChatBannedRights, + buildChatAdminRights, +} from '../gramjsBuilders'; +import { addMessageToLocalDb } from '../helpers'; + +const MAX_INT_32 = 2 ** 31 - 1; +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function fetchChats({ + limit, + offsetDate, + archived, + withPinned, +}: { + limit: number; + offsetDate?: number; + archived?: boolean; + withPinned?: boolean; +}) { + const result = await invokeRequest(new GramJs.messages.GetDialogs({ + offsetPeer: new GramJs.InputPeerEmpty(), + limit, + offsetDate, + folderId: archived ? ARCHIVED_FOLDER_ID : undefined, + ...(withPinned && { excludePinned: true }), + })); + const resultPinned = withPinned + ? await invokeRequest(new GramJs.messages.GetPinnedDialogs({ + folderId: archived ? ARCHIVED_FOLDER_ID : undefined, + })) + : undefined; + + if (!result || result instanceof GramJs.messages.DialogsNotModified) { + return undefined; + } + + updateLocalDb(result); + if (resultPinned) { + updateLocalDb(resultPinned); + } + + const lastMessagesByChatId = buildCollectionByKey( + [...result.messages, ...(resultPinned ? resultPinned.messages : [])] + .map(buildApiMessage) + .filter(Boolean as any), + 'chatId', + ); + const peersByKey: Record = { + ...preparePeers(result), + ...(resultPinned && preparePeers(resultPinned)), + }; + const chats: ApiChat[] = []; + const draftsById: Record = {}; + const replyingToById: Record = {}; + + const dialogs = [ + ...(resultPinned ? resultPinned.dialogs : []), + ...result.dialogs, + ]; + + const orderedPinnedIds: number[] = []; + + dialogs.forEach((dialog) => { + if ( + !(dialog instanceof GramJs.Dialog) + // This request can return dialogs not belonging to specified folder + || (!archived && dialog.folderId === ARCHIVED_FOLDER_ID) + || (archived && dialog.folderId !== ARCHIVED_FOLDER_ID) + ) { + return; + } + + const peerEntity = peersByKey[getPeerKey(dialog.peer)]; + const chat = buildApiChatFromDialog(dialog, peerEntity); + chat.lastMessage = lastMessagesByChatId[chat.id]; + chats.push(chat); + + if (withPinned && dialog.pinned) { + orderedPinnedIds.push(chat.id); + } + + if (dialog.draft) { + const { formattedText, replyingToId } = buildMessageDraft(dialog.draft) || {}; + if (formattedText) { + draftsById[chat.id] = formattedText; + } + if (replyingToId) { + replyingToById[chat.id] = replyingToId; + } + } + }); + + const users = [...result.users, ...(resultPinned ? resultPinned.users : [])] + .map(buildApiUser) + .filter(Boolean as any); + const chatIds = chats.map((chat) => chat.id); + + let totalChatCount: number; + + if (result instanceof GramJs.messages.DialogsSlice) { + totalChatCount = result.count; + } else { + totalChatCount = chatIds.length; + } + + return { + chatIds, + chats, + users, + draftsById, + replyingToById, + orderedPinnedIds: withPinned ? orderedPinnedIds : undefined, + totalChatCount, + }; +} + +export function fetchFullChat(chat: ApiChat) { + const { id, accessHash, adminRights } = chat; + const input = buildInputEntity(id, accessHash); + + return input instanceof GramJs.InputChannel + ? getFullChannelInfo(input, adminRights) + : getFullChatInfo(input as number); +} + +export async function fetchSuperGroupOnlines(chat: ApiChat) { + const { id, accessHash } = chat; + + const peer = buildInputPeer(id, accessHash); + const result = await invokeRequest(new GramJs.messages.GetOnlines({ peer })); + + if (!result) { + return; + } + + const { onlines } = result; + + onUpdate({ + '@type': 'updateChat', + id, + chat: { onlineCount: onlines }, + }); +} + +export async function searchChats({ query, limit }: { query: string; limit?: number }) { + const result = await invokeRequest(new GramJs.contacts.Search({ q: query, limit })); + if (!result) { + return undefined; + } + + updateLocalDb(result); + + const localPeerIds = result.myResults.map(getApiChatIdFromMtpPeer); + const allChats = [...result.chats, ...result.users] + .map((user) => buildApiChatFromPreview(user)) + .filter(Boolean as any); + const allUsers = result.users.map(buildApiUser).filter((user) => !!user && !user.isSelf) as ApiUser[]; + + return { + localChats: allChats.filter((r) => localPeerIds.includes(r.id)), + localUsers: allUsers.filter((u) => localPeerIds.includes(u.id)), + globalChats: allChats.filter((r) => !localPeerIds.includes(r.id)), + globalUsers: allUsers.filter((u) => !localPeerIds.includes(u.id)), + }; +} + +export async function fetchChat({ + type, user, +}: { + type: 'user' | 'self' | 'support'; user?: ApiUser; +}) { + let mtpUser: GramJs.User | undefined; + + if (type === 'self' || type === 'user') { + const result = await invokeRequest(new GramJs.users.GetUsers({ + id: [ + type === 'user' && user + ? buildInputEntity(user.id, user.accessHash) as GramJs.InputUser + : new GramJs.InputUserSelf(), + ], + })); + if (!result || !result.length) { + return undefined; + } + + [mtpUser] = result; + } else if (type === 'support') { + const result = await invokeRequest(new GramJs.help.GetSupport()); + if (!result || !result.user) { + return undefined; + } + + mtpUser = result.user; + } + + const chat = buildApiChatFromPreview(mtpUser!, type === 'support'); + if (!chat) { + return undefined; + } + + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat, + }); + + return { chatId: chat.id }; +} + +export async function requestChatUpdate(chat: ApiChat) { + const { id, accessHash } = chat; + + const result = await invokeRequest(new GramJs.messages.GetPeerDialogs({ + peers: [new GramJs.InputDialogPeer({ + peer: buildInputPeer(id, accessHash), + })], + })); + + if (!result) { + return; + } + + const dialog = result.dialogs[0]; + if (!dialog || !(dialog instanceof GramJs.Dialog)) { + return; + } + + const peersByKey = preparePeers(result); + const peerEntity = peersByKey[getPeerKey(dialog.peer)]; + if (!peerEntity) { + return; + } + + updateLocalDb(result); + + const lastMessage = buildApiMessage(result.messages[0]); + + onUpdate({ + '@type': 'updateChat', + id, + chat: { + ...buildApiChatFromDialog(dialog, peerEntity), + lastMessage, + }, + }); +} + +export function saveDraft({ + chat, + text, + entities, + replyToMsgId, +}: { + chat: ApiChat; + text: string; + entities?: ApiMessageEntity[]; + replyToMsgId?: number; +}) { + return invokeRequest(new GramJs.messages.SaveDraft({ + peer: buildInputPeer(chat.id, chat.accessHash), + message: text, + ...(entities && { + entities: entities.map(buildMtpMessageEntity), + }), + replyToMsgId, + })); +} + +export function clearDraft(chat: ApiChat) { + return invokeRequest(new GramJs.messages.SaveDraft({ + peer: buildInputPeer(chat.id, chat.accessHash), + message: '', + })); +} + +async function getFullChatInfo(chatId: number): Promise<{ + fullInfo: ApiChatFullInfo; + users?: ApiUser[]; +} | undefined> { + const result = await invokeRequest(new GramJs.messages.GetFullChat({ chatId })); + + if (!result || !(result.fullChat instanceof GramJs.ChatFull)) { + return undefined; + } + + updateLocalDb(result); + + const { + about, + participants, + exportedInvite, + } = result.fullChat; + + const members = buildChatMembers(participants); + const adminMembers = members ? members.filter(({ isAdmin, isOwner }) => isAdmin || isOwner) : undefined; + + return { + fullInfo: { + about, + members, + adminMembers, + inviteLink: buildChatInviteLink(exportedInvite), + canViewMembers: true, + }, + users: result.users.map(buildApiUser).filter(Boolean as any), + }; +} + +async function getFullChannelInfo( + channel: GramJs.InputChannel, + adminRights?: ApiChatAdminRights, +) { + const result = await invokeRequest(new GramJs.channels.GetFullChannel({ channel })); + + if (!result || !(result.fullChat instanceof GramJs.ChannelFull)) { + return undefined; + } + + const { + about, + exportedInvite, + slowmodeSeconds, + slowmodeNextSendDate, + migratedFromChatId, + migratedFromMaxId, + canViewParticipants, + linkedChatId, + hiddenPrehistory, + } = result.fullChat; + + const inviteLink = exportedInvite instanceof GramJs.ChatInviteExported + ? exportedInvite.link + : undefined; + + const { members, users } = (canViewParticipants && await getChannelMembers(channel)) || {}; + const { members: kickedMembers, users: bannedUsers } = ( + canViewParticipants && adminRights && await getChannelMembers(channel, 'kicked') + ) || {}; + const { members: adminMembers, users: adminUsers } = ( + canViewParticipants && adminRights && await getChannelMembers(channel, 'admin') + ) || {}; + + return { + fullInfo: { + about, + inviteLink, + slowMode: slowmodeSeconds ? { + seconds: slowmodeSeconds, + nextSendDate: slowmodeNextSendDate, + } : undefined, + migratedFrom: migratedFromChatId ? { + chatId: getApiChatIdFromMtpPeer({ chatId: migratedFromChatId } as GramJs.TypePeer), + maxMessageId: migratedFromMaxId, + } : undefined, + canViewMembers: canViewParticipants, + isPreHistoryHidden: hiddenPrehistory, + members, + kickedMembers, + adminMembers, + linkedChatId: linkedChatId ? getApiChatIdFromMtpPeer({ chatId: linkedChatId } as GramJs.TypePeer) : undefined, + }, + users: [...(users || []), ...(bannedUsers || []), ...(adminUsers || [])], + }; +} + +export async function updateChatMutedState({ + chat, isMuted, +}: { + chat: ApiChat; isMuted: boolean; +}) { + await invokeRequest(new GramJs.account.UpdateNotifySettings({ + peer: new GramJs.InputNotifyPeer({ + peer: buildInputPeer(chat.id, chat.accessHash), + }), + settings: new GramJs.InputPeerNotifySettings({ muteUntil: isMuted ? MAX_INT_32 : undefined }), + })); + + void requestChatUpdate(chat); +} + +export async function createChannel({ + title, about, users, +}: { + title: string; about?: string; users: ApiUser[]; +}): Promise { + const result = await invokeRequest(new GramJs.channels.CreateChannel({ + broadcast: true, + title, + about, + }), true); + + // `createChannel` can return a lot of different update types according to docs, + // but currently channel creation returns only `Updates` type. + // Errors are added to catch unexpected cases in future testing + if (!(result instanceof GramJs.Updates)) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Unexpected channel creation update', result); + } + return undefined; + } + + const newChannel = result.chats[0]; + if (!newChannel || !(newChannel instanceof GramJs.Channel)) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Created channel not found', result); + } + return undefined; + } + + const channel = buildApiChatFromPreview(newChannel)!; + + await invokeRequest(new GramJs.channels.InviteToChannel({ + channel: buildInputEntity(channel.id, channel.accessHash) as GramJs.InputChannel, + users: users.map(({ id, accessHash }) => buildInputEntity(id, accessHash)) as GramJs.InputUser[], + })); + + return channel; +} + +export function joinChannel({ + channelId, accessHash, +}: { + channelId: number; accessHash: string; +}) { + return invokeRequest(new GramJs.channels.JoinChannel({ + channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel, + }), true); +} + +export function leaveChannel({ + channelId, accessHash, +}: { + channelId: number; accessHash: string; +}) { + return invokeRequest(new GramJs.channels.LeaveChannel({ + channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel, + }), true); +} + +export function deleteChannel({ + channelId, accessHash, +}: { + channelId: number; accessHash: string; +}) { + return invokeRequest(new GramJs.channels.DeleteChannel({ + channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel, + }), true); +} + +export async function createGroupChat({ + title, users, +}: { + title: string; users: ApiUser[]; +}): Promise { + const result = await invokeRequest(new GramJs.messages.CreateChat({ + title, + users: users.map(({ id, accessHash }) => buildInputEntity(id, accessHash)) as GramJs.InputUser[], + }), true); + + // `createChat` can return a lot of different update types according to docs, + // but currently chat creation returns only `Updates` type. + // Errors are added to catch unexpected cases in future testing + if (!(result instanceof GramJs.Updates)) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Unexpected chat creation update', result); + } + return undefined; + } + + const newChat = result.chats[0]; + if (!newChat || !(newChat instanceof GramJs.Chat)) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Created chat not found', result); + } + return undefined; + } + + return buildApiChatFromPreview(newChat); +} + +export async function editChatPhoto({ + chatId, accessHash, photo, +}: { + chatId: number; accessHash?: string; photo: File; +}) { + const uploadedPhoto = await uploadFile(photo); + const inputEntity = buildInputEntity(chatId, accessHash); + + return invokeRequest( + inputEntity instanceof GramJs.InputChannel + ? new GramJs.channels.EditPhoto({ + channel: inputEntity as GramJs.InputChannel, + photo: new GramJs.InputChatUploadedPhoto({ + file: uploadedPhoto, + }), + }) + : new GramJs.messages.EditChatPhoto({ + chatId: inputEntity as number, + photo: new GramJs.InputChatUploadedPhoto({ + file: uploadedPhoto, + }), + }), + true, + ); +} + +export async function toggleChatPinned({ + chat, + shouldBePinned, +}: { + chat: ApiChat; + shouldBePinned: boolean; +}) { + const { id, accessHash } = chat; + + const isActionSuccessful = await invokeRequest(new GramJs.messages.ToggleDialogPin({ + peer: new GramJs.InputDialogPeer({ + peer: buildInputPeer(id, accessHash), + }), + pinned: shouldBePinned || undefined, + })); + + if (isActionSuccessful) { + onUpdate({ + '@type': 'updateChatPinned', + id: chat.id, + isPinned: shouldBePinned, + }); + } +} + +export function toggleChatArchived({ + chat, folderId, +}: { + chat: ApiChat; folderId: number; +}) { + const { id, accessHash } = chat; + + return invokeRequest(new GramJs.folders.EditPeerFolders({ + folderPeers: [new GramJs.InputFolderPeer({ + peer: buildInputPeer(id, accessHash), + folderId, + })], + }), true); +} + +export async function fetchChatFolders() { + const result = await invokeRequest(new GramJs.messages.GetDialogFilters()); + + if (!result) { + return undefined; + } + + return { + byId: buildCollectionByKey(result.map(buildApiChatFolder), 'id') as Record, + orderedIds: result.map(({ id }) => id), + }; +} + +export async function fetchRecommendedChatFolders() { + const results = await invokeRequest(new GramJs.messages.GetSuggestedDialogFilters()); + + if (!results) { + return undefined; + } + + return results.map(buildApiChatFolderFromSuggested); +} + +export async function editChatFolder({ + id, + folderUpdate, +}: { + id: number; + folderUpdate: ApiChatFolder; +}) { + const filter = buildFilterFromApiFolder(folderUpdate); + + const isActionSuccessful = await invokeRequest(new GramJs.messages.UpdateDialogFilter({ + id, + filter, + })); + + if (isActionSuccessful) { + onUpdate({ + '@type': 'updateChatFolder', + id, + folder: folderUpdate, + }); + } +} + +export async function deleteChatFolder(id: number) { + const isActionSuccessful = await invokeRequest(new GramJs.messages.UpdateDialogFilter({ + id, + filter: undefined, + })); + const recommendedChatFolders = await fetchRecommendedChatFolders(); + + if (isActionSuccessful) { + onUpdate({ + '@type': 'updateChatFolder', + id, + folder: undefined, + }); + } + if (recommendedChatFolders) { + onUpdate({ + '@type': 'updateRecommendedChatFolders', + folders: recommendedChatFolders, + }); + } +} + +export async function toggleDialogUnread({ + chat, hasUnreadMark, +}: { + chat: ApiChat; hasUnreadMark: boolean | undefined; +}) { + const { id, accessHash } = chat; + + const isActionSuccessful = await invokeRequest(new GramJs.messages.MarkDialogUnread({ + peer: new GramJs.InputDialogPeer({ + peer: buildInputPeer(id, accessHash), + }), + unread: hasUnreadMark || undefined, + })); + + if (isActionSuccessful) { + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat: { hasUnreadMark }, + }); + } +} + +export async function getChatByUsername(username: string) { + const result = await invokeRequest(new GramJs.contacts.ResolveUsername({ + username, + })); + + if (!result) { + return undefined; + } + + const { users, chats } = result; + + const chat = chats.length + ? buildApiChatFromPreview(chats[0]) + : buildApiChatFromPreview(users[0]); + + if (!chat) { + return undefined; + } + + updateLocalDb(result); + + return chat; +} + +export function togglePreHistoryHidden({ + chat, isEnabled, +}: { chat: ApiChat; isEnabled: boolean }) { + const { id, accessHash } = chat; + const channel = buildInputEntity(id, accessHash); + + return invokeRequest(new GramJs.channels.TogglePreHistoryHidden({ + channel: channel as GramJs.InputChannel, + enabled: isEnabled, + }), true); +} + +export function updateChatDefaultBannedRights({ + chat, bannedRights, +}: { chat: ApiChat; bannedRights: ApiChatBannedRights }) { + const { id, accessHash } = chat; + const peer = buildInputPeer(id, accessHash); + + return invokeRequest(new GramJs.messages.EditChatDefaultBannedRights({ + peer, + bannedRights: buildChatBannedRights(bannedRights), + }), true); +} + +export function updateChatMemberBannedRights({ + chat, user, bannedRights, +}: { chat: ApiChat; user: ApiUser; bannedRights: ApiChatBannedRights }) { + const channel = buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel; + const userId = buildInputEntity(user.id, user.accessHash) as GramJs.InputUser; + + return invokeRequest(new GramJs.channels.EditBanned({ + channel, + userId, + bannedRights: buildChatBannedRights(bannedRights), + }), true); +} + +export function updateChatAdmin({ + chat, user, adminRights, customTitle = '', +}: { chat: ApiChat; user: ApiUser; adminRights: ApiChatAdminRights; customTitle: string }) { + const channel = buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel; + const userId = buildInputEntity(user.id, user.accessHash) as GramJs.InputUser; + + return invokeRequest(new GramJs.channels.EditAdmin({ + channel, + userId, + adminRights: buildChatAdminRights(adminRights), + rank: customTitle, + }), true); +} + +export async function updateChatTitle(chat: ApiChat, title: string) { + const inputEntity = buildInputEntity(chat.id, chat.accessHash); + await invokeRequest( + inputEntity instanceof GramJs.InputChannel + ? new GramJs.channels.EditTitle({ + channel: inputEntity as GramJs.InputChannel, + title, + }) : new GramJs.messages.EditChatTitle({ + chatId: inputEntity as number, + title, + }), + true, + ); +} + +export async function updateChatAbout(chat: ApiChat, about: string) { + const result = await invokeRequest(new GramJs.messages.EditChatAbout({ + peer: buildInputPeer(chat.id, chat.accessHash), + about, + })); + + if (!result) { + return; + } + + onUpdate({ + '@type': 'updateChatFullInfo', + id: chat.id, + fullInfo: { + about, + }, + }); +} + +export function toggleSignatures({ + chat, isEnabled, +}: { chat: ApiChat; isEnabled: boolean }) { + const { id, accessHash } = chat; + const channel = buildInputEntity(id, accessHash); + + return invokeRequest(new GramJs.channels.ToggleSignatures({ + channel: channel as GramJs.InputChannel, + enabled: isEnabled, + }), true); +} + +type ChannelMembersFilter = 'kicked' | 'admin' | 'recent'; + +async function getChannelMembers( + channel: GramJs.InputChannel, + memberFilter: ChannelMembersFilter = 'recent', +) { + let filter: GramJs.TypeChannelParticipantsFilter; + + switch (memberFilter) { + case 'kicked': + filter = new GramJs.ChannelParticipantsKicked({ q: '' }); + break; + case 'admin': + filter = new GramJs.ChannelParticipantsAdmins(); + break; + default: + filter = new GramJs.ChannelParticipantsRecent(); + break; + } + + const result = await invokeRequest(new GramJs.channels.GetParticipants({ + channel, + filter, + limit: CHANNEL_MEMBERS_LIMIT, + })); + + if (!result || result instanceof GramJs.channels.ChannelParticipantsNotModified) { + return undefined; + } + + updateLocalDb(result); + + return { + members: buildChatMembers(result), + users: result.users.map(buildApiUser).filter(Boolean as any), + }; +} + +export async function fetchGroupsForDiscussion() { + const result = await invokeRequest(new GramJs.channels.GetGroupsForDiscussion()); + + if (!result) { + return undefined; + } + + updateLocalDb(result); + + return result.chats.map((chat) => buildApiChatFromPreview(chat)); +} + +export function setDiscussionGroup({ + channel, + chat, +}: { + channel: ApiChat; + chat?: ApiChat; +}) { + return invokeRequest(new GramJs.channels.SetDiscussionGroup({ + broadcast: buildInputPeer(channel.id, channel.accessHash), + group: chat ? buildInputPeer(chat.id, chat.accessHash) : new GramJs.InputChannelEmpty(), + })); +} + +export async function migrateChat(chat: ApiChat) { + const result = await invokeRequest( + new GramJs.messages.MigrateChat({ chatId: buildInputEntity(chat.id) as number }), true, + ); + + // `migrateChat` can return a lot of different update types according to docs, + // but currently chat migrations returns only `Updates` type. + // Errors are added to catch unexpected cases in future testing + if (!result || !(result instanceof GramJs.Updates)) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Unexpected channel creation update', result); + } + + return undefined; + } + + updateLocalDb(result); + + return buildApiChatFromPreview(result.chats[1]); +} + +function preparePeers( + result: GramJs.messages.Dialogs | GramJs.messages.DialogsSlice | GramJs.messages.PeerDialogs, +) { + const store: Record = {}; + + result.chats.forEach((chat) => { + store[`chat${chat.id}`] = chat; + }); + + result.users.forEach((user) => { + store[`user${user.id}`] = user; + }); + + return store; +} + +function updateLocalDb(result: ( + GramJs.messages.Dialogs | GramJs.messages.DialogsSlice | GramJs.messages.PeerDialogs | + GramJs.messages.ChatFull | GramJs.contacts.Found | + GramJs.contacts.ResolvedPeer | GramJs.channels.ChannelParticipants | + GramJs.messages.Chats | GramJs.messages.ChatsSlice | GramJs.TypeUpdates +)) { + if ('users' in result) { + result.users.forEach((user) => { + if (user instanceof GramJs.User) { + localDb.users[user.id] = user; + } + }); + } + + if ('chats' in result) { + result.chats.forEach((chat) => { + if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) { + localDb.chats[chat.id] = chat; + } + }); + } + + if ('messages' in result) { + result.messages.forEach((message) => { + if (message instanceof GramJs.Message && isMessageWithMedia(message)) { + addMessageToLocalDb(message); + } + }); + } +} diff --git a/src/api/gramjs/methods/client.ts b/src/api/gramjs/methods/client.ts new file mode 100644 index 000000000..0d3553789 --- /dev/null +++ b/src/api/gramjs/methods/client.ts @@ -0,0 +1,233 @@ +import { + TelegramClient, sessions, Api as GramJs, connection, +} from '../../../lib/gramjs'; +import { Logger as GramJsLogger } from '../../../lib/gramjs/extensions/index'; +import { TwoFaParams } from '../../../lib/gramjs/client/2fa'; + +import { ApiMediaFormat, ApiOnProgress, OnApiUpdate } from '../../types'; + +import { + DEBUG, DEBUG_GRAMJS, UPLOAD_WORKERS, IS_TEST, +} from '../../../config'; +import { + onRequestPhoneNumber, onRequestCode, onRequestPassword, onRequestRegistration, + onAuthError, onAuthReady, onCurrentUserUpdate, onRequestQrCode, +} from './auth'; +import { updater } from '../updater'; +import { setMessageBuilderCurrentUserId } from '../apiBuilders/messages'; +import downloadMediaWithClient from './media'; +import { buildApiUserFromFull } from '../apiBuilders/users'; +import localDb from '../localDb'; + +GramJsLogger.setLevel(DEBUG_GRAMJS ? 'debug' : 'warn'); + +const gramJsUpdateEventBuilder = { build: (update: object) => update }; + +let onUpdate: OnApiUpdate; +let client: TelegramClient; +let isConnected = false; + +export async function init(sessionId: string, _onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START INIT API'); + } + + const session = IS_TEST + ? new sessions.LocalStorageSession(sessionId) + : new sessions.CacheApiSession(sessionId); + + client = new TelegramClient( + session, + process.env.TELEGRAM_T_API_ID, + process.env.TELEGRAM_T_API_HASH, + { + useWSS: true, + additionalDcsDisabled: IS_TEST, + } as any, + ); + + client.addEventHandler(handleGramJsUpdate, gramJsUpdateEventBuilder); + client.addEventHandler(updater, gramJsUpdateEventBuilder); + + try { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('[GramJs/client] CONNECTING'); + } + + await client.start({ + phoneNumber: onRequestPhoneNumber, + phoneCode: onRequestCode, + password: onRequestPassword, + firstAndLastNames: onRequestRegistration, + qrCode: onRequestQrCode, + onError: onAuthError, + }); + + const newSessionId = await session.save(); + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH INIT API'); + // eslint-disable-next-line no-console + console.log('[GramJs/client] CONNECTED as ', newSessionId); + } + + onAuthReady(newSessionId); + onUpdate({ '@type': 'updateApiReady' }); + + void fetchCurrentUser(); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('[GramJs/client] CONNECTING ERROR', err); + } + + throw err; + } +} + +export async function destroy() { + await client.destroy(); +} + +function handleGramJsUpdate(update: any) { + if (update instanceof connection.UpdateConnectionState) { + isConnected = update.state === connection.UpdateConnectionState.connected; + } +} + +export async function invokeRequest( + request: T, + shouldHandleUpdates = false, + shouldThrow = false, +): Promise { + if (!isConnected) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn(`[GramJs/client] INVOKE ${request.className} ERROR: Client is not connected`); + } + + return undefined; + } + + try { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log(`[GramJs/client] INVOKE ${request.className}`); + } + + const result = await client.invoke(request); + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log(`[GramJs/client] INVOKE RESPONSE ${request.className}`, result); + } + + if (shouldHandleUpdates) { + type ResultWithUpdates = typeof result & { updates?: GramJs.Updates | GramJs.UpdatesCombined }; + + let updatesContainer; + if (result instanceof GramJs.Updates || result instanceof GramJs.UpdatesCombined) { + updatesContainer = result; + } else if ('updates' in result && ( + (result as ResultWithUpdates).updates instanceof GramJs.Updates + || (result as ResultWithUpdates).updates instanceof GramJs.UpdatesCombined + )) { + updatesContainer = (result as ResultWithUpdates).updates; + } + + if (updatesContainer) { + injectUpdateEntities(updatesContainer); + + updatesContainer.updates.forEach((update) => { + updater(update, request); + }); + } else if (result instanceof GramJs.UpdatesTooLong) { + // TODO Implement + } else { + updater(result as GramJs.TypeUpdates, request); + } + } + + return result; + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log(`[GramJs/client] INVOKE ERROR ${request.className}`); + // eslint-disable-next-line no-console + console.error(err); + } + + dispatchErrorUpdate(err, request); + + if (shouldThrow) { + throw err; + } + + return undefined; + } +} + +export function downloadMedia( + args: { url: string; mediaFormat: ApiMediaFormat; start?: number; end?: number }, + onProgress?: ApiOnProgress, +) { + return downloadMediaWithClient(args, client, isConnected, onProgress); +} + +export function uploadFile(file: File, onProgress?: ApiOnProgress) { + return client.uploadFile({ file, onProgress, workers: UPLOAD_WORKERS }); +} + +export function updateTwoFaSettings(params: TwoFaParams) { + return client.updateTwoFaSettings(params); +} + +export async function fetchCurrentUser() { + const userFull = await invokeRequest(new GramJs.users.GetFullUser({ + id: new GramJs.InputUserSelf(), + })); + + if (!userFull || !(userFull.user instanceof GramJs.User)) { + return; + } + + localDb.users[userFull.user.id] = userFull.user; + const currentUser = buildApiUserFromFull(userFull); + + setMessageBuilderCurrentUserId(currentUser.id); + onCurrentUserUpdate(currentUser); +} + +export function dispatchErrorUpdate(err: Error, request: T) { + const isSlowMode = err.message.startsWith('A wait of') && ( + request instanceof GramJs.messages.SendMessage + || request instanceof GramJs.messages.SendMedia + || request instanceof GramJs.messages.SendMultiMedia + ); + + const { message } = err; + + onUpdate({ + '@type': 'error', + error: { + message, + isSlowMode, + }, + }); +} + +function injectUpdateEntities(result: GramJs.Updates | GramJs.UpdatesCombined) { + const entities = [...result.users, ...result.chats]; + + result.updates.forEach((update) => { + if (entities) { + // eslint-disable-next-line no-underscore-dangle + (update as any)._entities = entities; + } + }); +} diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts new file mode 100644 index 000000000..cf3793a2b --- /dev/null +++ b/src/api/gramjs/methods/index.ts @@ -0,0 +1,60 @@ +export { destroy, downloadMedia, fetchCurrentUser } from './client'; + +export { + provideAuthPhoneNumber, provideAuthCode, provideAuthPassword, provideAuthRegistration, restartAuth, restartAuthWithQr, +} from './auth'; + +export { + fetchChats, fetchFullChat, fetchSuperGroupOnlines, searchChats, requestChatUpdate, + saveDraft, clearDraft, fetchChat, updateChatMutedState, + createChannel, joinChannel, leaveChannel, deleteChannel, createGroupChat, editChatPhoto, + toggleChatPinned, toggleChatArchived, toggleDialogUnread, + fetchChatFolders, editChatFolder, deleteChatFolder, fetchRecommendedChatFolders, + getChatByUsername, togglePreHistoryHidden, updateChatDefaultBannedRights, updateChatMemberBannedRights, + updateChatTitle, updateChatAbout, toggleSignatures, updateChatAdmin, fetchGroupsForDiscussion, setDiscussionGroup, + migrateChat, +} from './chats'; + +export { + fetchMessages, fetchMessage, sendMessage, pinMessage, unpinAllMessages, deleteMessages, deleteHistory, + markMessageListRead, markMessagesRead, requestThreadInfoUpdate, searchMessagesLocal, searchMessagesGlobal, + fetchWebPagePreview, editMessage, forwardMessages, loadPollOptionResults, sendPollVote, findFirstMessageIdAfterDate, + fetchPinnedMessages, fetchScheduledHistory, sendScheduledMessages, rescheduleMessage, deleteScheduledMessages, + fetchMessageLink, +} from './messages'; + +export { + fetchFullUser, fetchNearestCountry, + fetchTopUsers, fetchContactList, fetchUsers, + updateContact, deleteUser, +} from './users'; + +export { + fetchStickerSets, fetchRecentStickers, fetchFavoriteStickers, fetchFeaturedStickers, + faveSticker, fetchStickers, fetchSavedGifs, searchStickers, installStickerSet, uninstallStickerSet, + searchGifs, fetchAnimatedEmojis, fetchStickersForEmoji, +} from './symbols'; + +export { + checkChatUsername, setChatUsername, updatePrivateLink, +} from './management'; + +export { + updateProfile, checkUsername, updateUsername, fetchBlockedContacts, blockContact, unblockContact, + updateProfilePhoto, uploadProfilePhoto, fetchWallpapers, uploadWallpaper, + fetchAuthorizations, terminateAuthorization, terminateAllAuthorizations, + loadNotificationsSettings, updateContactSignUpNotification, updateNotificationSettings, + fetchLanguages, fetchLangPack, fetchPrivacySettings, setPrivacySettings, +} from './settings'; + +export { + getPasswordInfo, checkPassword, clearPassword, updatePassword, updateRecoveryEmail, provideRecoveryEmailCode, +} from './twoFaSettings'; + +export { + answerCallbackButton, +} from './bots'; + +export { + validateRequestedInfo, sendPaymentForm, getPaymentForm, getReceipt, +} from './payments'; diff --git a/src/api/gramjs/methods/management.ts b/src/api/gramjs/methods/management.ts new file mode 100644 index 000000000..af93f0ebf --- /dev/null +++ b/src/api/gramjs/methods/management.ts @@ -0,0 +1,63 @@ +import { Api as GramJs } from '../../../lib/gramjs'; + +import { invokeRequest } from './client'; +import { buildInputEntity, buildInputPeer } from '../gramjsBuilders'; +import { ApiChat, OnApiUpdate } from '../../types'; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function checkChatUsername( + { username }: { username: string }, +) { + try { + const result = await invokeRequest(new GramJs.channels.CheckUsername({ + channel: new GramJs.InputChannelEmpty(), + username, + }), undefined, true); + + return result!; + } catch (err) { + return false; + } +} + +export async function setChatUsername( + { chat, username }: { chat: ApiChat; username: string }, +) { + const result = await invokeRequest(new GramJs.channels.UpdateUsername({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + username, + })); + + if (result) { + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat: { username }, + }); + } +} + +export async function updatePrivateLink( + { chat }: { chat: ApiChat }, +) { + const result = await invokeRequest(new GramJs.messages.ExportChatInvite({ + peer: buildInputPeer(chat.id, chat.accessHash), + })); + + if (!result || !(result instanceof GramJs.ChatInviteExported)) { + return; + } + + onUpdate({ + '@type': 'updateChatFullInfo', + id: chat.id, + fullInfo: { + inviteLink: result.link, + }, + }); +} diff --git a/src/api/gramjs/methods/media.ts b/src/api/gramjs/methods/media.ts new file mode 100644 index 000000000..c035d796d --- /dev/null +++ b/src/api/gramjs/methods/media.ts @@ -0,0 +1,214 @@ +import { inflate } from 'pako/dist/pako_inflate'; + +import { Api as GramJs, TelegramClient } from '../../../lib/gramjs'; +import { + ApiMediaFormat, ApiOnProgress, ApiParsedMedia, ApiPreparedMedia, +} from '../../types'; + +import { + DOWNLOAD_WORKERS, + MEDIA_CACHE_DISABLED, + MEDIA_CACHE_MAX_BYTES, + MEDIA_CACHE_NAME, + MEDIA_CACHE_NAME_AVATARS, +} from '../../../config'; +import localDb from '../localDb'; +import { getEntityTypeById } from '../gramjsBuilders'; +import { blobToDataUri } from '../../../util/files'; +import * as cacheApi from '../../../util/cacheApi'; + +type EntityType = 'msg' | 'sticker' | 'wallpaper' | 'gif' | 'channel' | 'chat' | 'user' | 'stickerSet'; + +export default async function downloadMedia( + { + url, mediaFormat, start, end, + }: { + url: string; mediaFormat: ApiMediaFormat; start?: number; end?: number; + }, + client: TelegramClient, + isConnected: boolean, + onProgress?: ApiOnProgress, +) { + const { + data, mimeType, fullSize, + } = await download(url, client, isConnected, onProgress, start, end, mediaFormat) || {}; + if (!data) { + return undefined; + } + + const parsed = await parseMedia(data, mediaFormat, mimeType); + if (!parsed) { + return undefined; + } + + const canCache = mediaFormat !== ApiMediaFormat.Progressive && ( + mediaFormat !== ApiMediaFormat.BlobUrl || (parsed as Blob).size <= MEDIA_CACHE_MAX_BYTES + ); + + if (!MEDIA_CACHE_DISABLED && cacheApi && canCache) { + const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME; + void cacheApi.save(cacheName, url, parsed); + } + + const prepared = mediaFormat === ApiMediaFormat.Progressive ? '' : prepareMedia(parsed); + const arrayBuffer = mediaFormat === ApiMediaFormat.Progressive ? parsed as ArrayBuffer : undefined; + + return { + prepared, + arrayBuffer, + mimeType, + fullSize, + }; +} + +async function download( + url: string, + client: TelegramClient, + isConnected: boolean, + onProgress?: ApiOnProgress, + start?: number, + end?: number, + mediaFormat?: ApiMediaFormat, +) { + const mediaMatch = url.match(/(avatar|profile|msg|stickerSet|sticker|wallpaper|gif|file)([-\d\w./]+)(\?size=\w+)?/); + if (!mediaMatch) { + return undefined; + } + + if (mediaMatch[1] === 'file') { + const response = await fetch(mediaMatch[2]); + const data = await response.arrayBuffer(); + return { data }; + } + + if (!isConnected) { + return Promise.reject(new Error('ERROR: Client is not connected')); + } + + let entityType: EntityType; + let entityId: string | number = mediaMatch[2]; + const sizeType = mediaMatch[3] ? mediaMatch[3].replace('?size=', '') : undefined; + let entity: ( + GramJs.User | GramJs.Chat | GramJs.Channel | + GramJs.Message | GramJs.Document | GramJs.StickerSet | undefined + ); + + if (mediaMatch[1] === 'avatar' || mediaMatch[1] === 'profile') { + entityType = getEntityTypeById(Number(entityId)); + entityId = Math.abs(Number(entityId)); + } else { + entityType = mediaMatch[1] as 'msg' | 'sticker' | 'wallpaper' | 'gif' | 'stickerSet'; + } + + switch (entityType) { + case 'channel': + case 'chat': + entity = localDb.chats[entityId as number]; + break; + case 'user': + entity = localDb.users[entityId as number]; + break; + case 'msg': + entity = localDb.messages[entityId as string]; + break; + case 'sticker': + case 'gif': + case 'wallpaper': + entity = localDb.documents[entityId as string]; + break; + case 'stickerSet': + entity = localDb.stickerSets[entityId as string]; + break; + } + + if (!entity) { + return undefined; + } + + if (entityType === 'msg' || entityType === 'sticker' || entityType === 'gif' || entityType === 'wallpaper') { + if (mediaFormat === ApiMediaFormat.Stream) { + onProgress!.acceptsBuffer = true; + } + + const data = await client.downloadMedia(entity, { + sizeType, start, end, progressCallback: onProgress, workers: DOWNLOAD_WORKERS, + }); + let mimeType; + let fullSize; + + if (entity instanceof GramJs.Message) { + mimeType = getMessageMediaMimeType(entity, sizeType); + if (entity.media instanceof GramJs.MessageMediaDocument && entity.media.document instanceof GramJs.Document) { + fullSize = entity.media.document.size; + } + } else if (entityType === 'sticker' && sizeType) { + mimeType = 'image/webp'; + } else { + mimeType = (entity as GramJs.Document).mimeType; + fullSize = (entity as GramJs.Document).size; + } + + return { mimeType, data, fullSize }; + } else if (entityType === 'stickerSet') { + const data = await client.downloadStickerSetThumb(entity); + const mimeType = mediaFormat === ApiMediaFormat.Lottie ? 'application/json' : 'image/jpeg'; + + return { mimeType, data }; + } else { + const data = await client.downloadProfilePhoto(entity, mediaMatch[1] === 'profile'); + const mimeType = 'image/jpeg'; + + return { mimeType, data }; + } +} + +function getMessageMediaMimeType(message: GramJs.Message, sizeType?: string) { + if (!message || !message.media) { + return undefined; + } + + if (message.media instanceof GramJs.MessageMediaPhoto) { + return 'image/jpeg'; + } + + if (message.media instanceof GramJs.MessageMediaDocument && message.media.document instanceof GramJs.Document) { + if (sizeType) { + return message.media.document!.attributes.some((a) => a instanceof GramJs.DocumentAttributeSticker) + ? 'image/webp' + : 'image/jpeg'; + } + + return message.media.document!.mimeType; + } + + return undefined; +} + +// eslint-disable-next-line no-async-without-await/no-async-without-await +async function parseMedia( + data: Buffer, mediaFormat: ApiMediaFormat, mimeType?: string, +): Promise { + switch (mediaFormat) { + case ApiMediaFormat.DataUri: + return blobToDataUri(new Blob([data], { type: mimeType })); + case ApiMediaFormat.BlobUrl: + return new Blob([data], { type: mimeType }); + case ApiMediaFormat.Lottie: { + const json = inflate(data, { to: 'string' }); + return JSON.parse(json); + } + case ApiMediaFormat.Progressive: { + return data.buffer; + } + } + + return undefined; +} + +function prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia { + if (mediaData instanceof Blob) { + return URL.createObjectURL(mediaData); + } + + return mediaData; +} diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts new file mode 100644 index 000000000..8e23db352 --- /dev/null +++ b/src/api/gramjs/methods/messages.ts @@ -0,0 +1,1120 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { + ApiChat, + ApiAttachment, + ApiMessage, + OnApiUpdate, + ApiMessageSearchType, + ApiUser, + ApiSticker, + ApiVideo, + ApiNewPoll, + ApiMessageEntity, + ApiOnProgress, + ApiThreadInfo, + MAIN_THREAD_ID, + MESSAGE_DELETED, + ApiGlobalMessageSearchType, +} from '../../types'; + +import { ALL_FOLDER_ID, DEBUG, PINNED_MESSAGES_LIMIT } from '../../../config'; +import { invokeRequest, uploadFile } from './client'; +import { + buildApiMessage, + buildLocalMessage, + buildWebPage, + buildForwardedMessage, + resolveMessageApiChatId, +} from '../apiBuilders/messages'; +import { buildApiUser } from '../apiBuilders/users'; +import { + buildInputEntity, + buildInputPeer, + generateRandomBigInt, + getEntityTypeById, + buildInputMediaDocument, + buildInputPoll, + buildMtpMessageEntity, + isMessageWithMedia, + calculateResultHash, +} from '../gramjsBuilders'; +import localDb from '../localDb'; +import { buildApiChatFromPreview } from '../apiBuilders/chats'; +import { fetchFile } from '../../../util/files'; +import { addMessageToLocalDb } from '../helpers'; +import { interpolateArray } from '../../../util/waveform'; +import { requestChatUpdate } from './chats'; + +const FAST_SEND_TIMEOUT = 250; +const INPUT_WAVEFORM_LENGTH = 63; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function fetchMessages({ + chat, + threadId, + ...pagination +}: { + chat: ApiChat; + threadId?: number; + offsetId?: number; + addOffset?: number; + limit: number; +}) { + const RequestClass = threadId === MAIN_THREAD_ID ? GramJs.messages.GetHistory : GramJs.messages.GetReplies; + let result; + + try { + result = await invokeRequest(new RequestClass({ + peer: buildInputPeer(chat.id, chat.accessHash), + ...(threadId !== MAIN_THREAD_ID && { + msgId: threadId, + }), + ...pagination, + }), undefined, true); + } catch (err) { + if (err.message === 'CHANNEL_PRIVATE') { + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat: { + isRestricted: true, + }, + }); + } + } + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages + ) { + return undefined; + } + + updateLocalDb(result); + + const messages = result.messages.map(buildApiMessage).filter(Boolean as any); + const users = result.users.map(buildApiUser).filter(Boolean as any); + const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any); + const threadInfos = messages.map(({ threadInfo }) => threadInfo).filter(Boolean as any); + + // Not sure if there is an easier way to do this + let firstMessageId: number | undefined; + if (result.messages.length) { + if (result instanceof GramJs.messages.Messages) { + firstMessageId = result.messages[result.messages.length - 1].id; + } else if (pagination.offsetId && result.offsetIdOffset) { + const offsetIdIndex = result.messages.findIndex((m) => m.id === pagination.offsetId); + const lastIndex = result.messages.length - offsetIdIndex; + if (lastIndex + result.offsetIdOffset >= result.count) { + firstMessageId = result.messages[result.messages.length - 1].id; + } + } + } + + return { + messages, + users, + chats, + threadInfos, + firstMessageId, + }; +} + +export async function fetchMessage({ chat, messageId }: { chat: ApiChat; messageId: number }) { + const isChannel = getEntityTypeById(chat.id) === 'channel'; + + const result = await invokeRequest( + isChannel + ? new GramJs.channels.GetMessages({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + id: [new GramJs.InputMessageID({ id: messageId })], + }) + : new GramJs.messages.GetMessages({ + id: [new GramJs.InputMessageID({ id: messageId })], + }), + ); + + if (!result || result instanceof GramJs.messages.MessagesNotModified) { + return undefined; + } + + const mtpMessage = result.messages[0]; + if (!mtpMessage) { + return undefined; + } + + if (mtpMessage instanceof GramJs.MessageEmpty) { + return MESSAGE_DELETED; + } + + const message = mtpMessage && buildApiMessage(mtpMessage); + if (!message) { + return undefined; + } + + if (mtpMessage instanceof GramJs.Message) { + addMessageToLocalDb(mtpMessage); + } + + const users = result.users.map(buildApiUser).filter(Boolean as any); + + return { message, users }; +} + +let queue = Promise.resolve(); + +export function sendMessage( + { + chat, + text, + entities, + replyingTo, + attachment, + sticker, + gif, + poll, + isSilent, + scheduledAt, + groupedId, + }: { + chat: ApiChat; + text?: string; + entities?: ApiMessageEntity[]; + replyingTo?: number; + attachment?: ApiAttachment; + sticker?: ApiSticker; + gif?: ApiVideo; + poll?: ApiNewPoll; + isSilent?: boolean; + scheduledAt?: number; + groupedId?: string; + }, + onProgress?: ApiOnProgress, +) { + const localMessage = buildLocalMessage( + chat, text, entities, replyingTo, attachment, sticker, gif, poll, groupedId, scheduledAt, + ); + onUpdate({ + '@type': localMessage.isScheduled ? 'newScheduledMessage' : 'newMessage', + id: localMessage.id, + chatId: chat.id, + message: localMessage, + }); + + // This is expected to arrive after `updateMessageSendSucceeded` which replaces the local ID, + // so in most cases this will be simply ignored + setTimeout(() => { + onUpdate({ + '@type': localMessage.isScheduled ? 'updateScheduledMessage' : 'updateMessage', + id: localMessage.id, + chatId: chat.id, + message: { + sendingState: 'messageSendingStatePending', + }, + }); + }, FAST_SEND_TIMEOUT); + + const randomId = generateRandomBigInt(); + localDb.localMessages[randomId.toString()] = localMessage; + + if (groupedId) { + return sendGroupedMedia({ + chat, text, entities, replyingTo, attachment: attachment!, groupedId, isSilent, scheduledAt, + }, randomId, localMessage, onProgress); + } + + const prevQueue = queue; + queue = (async () => { + let media: GramJs.TypeInputMedia | undefined; + if (attachment) { + try { + media = await uploadMedia(localMessage, attachment, onProgress!); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn(err); + } + + await prevQueue; + + return; + } + } else if (sticker) { + media = buildInputMediaDocument(sticker); + } else if (gif) { + media = buildInputMediaDocument(gif); + } else if (poll) { + media = buildInputPoll(poll, randomId); + } + + await prevQueue; + + const RequestClass = media ? GramJs.messages.SendMedia : GramJs.messages.SendMessage; + + await invokeRequest(new RequestClass({ + clearDraft: true, + message: text || '', + entities: entities ? entities.map(buildMtpMessageEntity) : undefined, + peer: buildInputPeer(chat.id, chat.accessHash), + randomId, + ...(isSilent && { silent: isSilent }), + ...(scheduledAt && { scheduleDate: scheduledAt }), + ...(replyingTo && { replyToMsgId: replyingTo }), + ...(media && { media }), + }), true); + })(); + + return queue; +} + +const groupedUploads: Record; +}> = {}; + +function sendGroupedMedia( + { + chat, + text, + entities, + replyingTo, + attachment, + groupedId, + isSilent, + scheduledAt, + }: { + chat: ApiChat; + text?: string; + entities?: ApiMessageEntity[]; + replyingTo?: number; + attachment: ApiAttachment; + groupedId: string; + isSilent?: boolean; + scheduledAt?: number; + }, + randomId: GramJs.long, + localMessage: ApiMessage, + onProgress?: ApiOnProgress, +) { + let groupIndex = -1; + if (!groupedUploads[groupedId]) { + groupedUploads[groupedId] = { + counter: 0, + singleMediaByIndex: {}, + }; + } + + groupIndex = groupedUploads[groupedId].counter++; + + const prevQueue = queue; + queue = (async () => { + let media; + try { + media = await uploadMedia(localMessage, attachment, onProgress!); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn(err); + } + + groupedUploads[groupedId].counter--; + + await prevQueue; + + return; + } + + const inputMedia = await fetchInputMedia( + buildInputPeer(chat.id, chat.accessHash), + media as GramJs.InputMediaUploadedPhoto | GramJs.InputMediaUploadedDocument, + ); + + await prevQueue; + + if (!inputMedia) { + groupedUploads[groupedId].counter--; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn('Failed to upload grouped media'); + } + + return; + } + + groupedUploads[groupedId].singleMediaByIndex[groupIndex] = new GramJs.InputSingleMedia({ + media: inputMedia, + randomId, + message: text || '', + entities: entities ? entities.map(buildMtpMessageEntity) : undefined, + }); + + if (Object.keys(groupedUploads[groupedId].singleMediaByIndex).length < groupedUploads[groupedId].counter) { + return; + } + + const { singleMediaByIndex } = groupedUploads[groupedId]; + delete groupedUploads[groupedId]; + + await invokeRequest(new GramJs.messages.SendMultiMedia({ + clearDraft: true, + peer: buildInputPeer(chat.id, chat.accessHash), + multiMedia: Object.values(singleMediaByIndex), // Object keys are usually ordered + replyToMsgId: replyingTo, + ...(isSilent && { silent: isSilent }), + ...(scheduledAt && { scheduleDate: scheduledAt }), + }), true); + })(); + + return queue; +} + +async function fetchInputMedia( + peer: GramJs.TypeInputPeer, + uploadedMedia: GramJs.InputMediaUploadedPhoto | GramJs.InputMediaUploadedDocument, +) { + const messageMedia = await invokeRequest(new GramJs.messages.UploadMedia({ + peer, + media: uploadedMedia, + })); + + if (( + messageMedia instanceof GramJs.MessageMediaPhoto + && messageMedia.photo + && messageMedia.photo instanceof GramJs.Photo) + ) { + const { photo: { id, accessHash, fileReference } } = messageMedia; + + return new GramJs.InputMediaPhoto({ + id: new GramJs.InputPhoto({ id, accessHash, fileReference }), + }); + } + + if (( + messageMedia instanceof GramJs.MessageMediaDocument + && messageMedia.document + && messageMedia.document instanceof GramJs.Document) + ) { + const { document: { id, accessHash, fileReference } } = messageMedia; + + return new GramJs.InputMediaDocument({ + id: new GramJs.InputDocument({ id, accessHash, fileReference }), + }); + } + + return undefined; +} + +export async function editMessage({ + chat, + message, + text, + entities, +}: { + chat: ApiChat; + message: ApiMessage; + text: string; + entities?: ApiMessageEntity[]; +}) { + const isScheduled = message.date * 1000 > Date.now(); + const messageUpdate: Partial = { + content: { + ...message.content, + ...(text && { + text: { + text, + entities, + }, + }), + }, + }; + + onUpdate({ + '@type': isScheduled ? 'updateScheduledMessage' : 'updateMessage', + id: message.id, + chatId: chat.id, + message: messageUpdate, + }); + + // TODO Revise intersecting with scheduled + localDb.localMessages[message.id] = { ...message, ...messageUpdate }; + + const mtpEntities = entities && entities.map(buildMtpMessageEntity); + + await invokeRequest(new GramJs.messages.EditMessage({ + message: text || '', + entities: mtpEntities, + peer: buildInputPeer(chat.id, chat.accessHash), + id: message.id, + ...(isScheduled && { scheduleDate: message.date }), + }), true); +} + +export async function rescheduleMessage({ + chat, + message, + scheduledAt, +}: { + chat: ApiChat; + message: ApiMessage; + scheduledAt: number; +}) { + await invokeRequest(new GramJs.messages.EditMessage({ + peer: buildInputPeer(chat.id, chat.accessHash), + id: message.id, + scheduleDate: scheduledAt, + }), true); +} + +async function uploadMedia(localMessage: ApiMessage, attachment: ApiAttachment, onProgress: ApiOnProgress) { + const { + filename, blobUrl, mimeType, quick, voice, + } = attachment; + + const file = await fetchFile(blobUrl, filename); + const patchedOnProgress: ApiOnProgress = (progress) => { + if (onProgress.isCanceled) { + patchedOnProgress.isCanceled = true; + } else { + onProgress(progress, localMessage.id); + } + }; + const inputFile = await uploadFile(file, patchedOnProgress); + + const attributes: GramJs.TypeDocumentAttribute[] = [new GramJs.DocumentAttributeFilename({ fileName: filename })]; + if (quick) { + if (mimeType.startsWith('image/')) { + return new GramJs.InputMediaUploadedPhoto({ file: inputFile }); + } else { + const { width, height, duration } = quick; + if (duration !== undefined) { + attributes.push(new GramJs.DocumentAttributeVideo({ + duration, + w: width, + h: height, + })); + } + } + } + + if (voice) { + const { duration, waveform } = voice; + const { data: inputWaveform } = interpolateArray(waveform, INPUT_WAVEFORM_LENGTH); + attributes.push(new GramJs.DocumentAttributeAudio({ + voice: true, + duration, + waveform: Buffer.from(inputWaveform), + })); + } + + return new GramJs.InputMediaUploadedDocument({ + file: inputFile, + mimeType, + attributes, + }); +} + +export async function pinMessage({ + chat, messageId, isUnpin, isOneSide, isSilent, +}: { chat: ApiChat; messageId: number; isUnpin: boolean; isOneSide: boolean; isSilent: boolean }) { + await invokeRequest(new GramJs.messages.UpdatePinnedMessage({ + peer: buildInputPeer(chat.id, chat.accessHash), + id: messageId, + ...(isUnpin && { unpin: true }), + ...(isOneSide && { pmOneside: true }), + ...(isSilent && { silent: true }), + }), true); +} + +export async function unpinAllMessages({ chat }: { chat: ApiChat }) { + await invokeRequest(new GramJs.messages.UnpinAllMessages({ + peer: buildInputPeer(chat.id, chat.accessHash), + }), true); +} + +export async function deleteMessages({ + chat, messageIds, shouldDeleteForAll, +}: { + chat: ApiChat; messageIds: number[]; shouldDeleteForAll?: boolean; +}) { + const isChannel = getEntityTypeById(chat.id) === 'channel'; + + const result = await invokeRequest( + isChannel + ? new GramJs.channels.DeleteMessages({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + id: messageIds, + }) + : new GramJs.messages.DeleteMessages({ + id: messageIds, + ...(shouldDeleteForAll && { revoke: true }), + }), + ); + + if (!result) { + return; + } + + onUpdate({ + '@type': 'deleteMessages', + ids: messageIds, + ...(isChannel && { chatId: chat.id }), + }); +} + +export async function deleteScheduledMessages({ + chat, messageIds, +}: { + chat: ApiChat; messageIds: number[]; +}) { + const result = await invokeRequest( + new GramJs.messages.DeleteScheduledMessages({ + peer: buildInputPeer(chat.id, chat.accessHash), + id: messageIds, + }), + ); + + if (!result) { + return; + } + + onUpdate({ + '@type': 'deleteScheduledMessages', + ids: messageIds, + chatId: chat.id, + }); +} + +export async function deleteHistory({ + chat, shouldDeleteForAll, maxId, +}: { + chat: ApiChat; shouldDeleteForAll?: boolean; maxId: number; +}) { + const isChannel = getEntityTypeById(chat.id) === 'channel'; + const result = await invokeRequest( + isChannel + ? new GramJs.channels.DeleteHistory({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + maxId, + }) + : new GramJs.messages.DeleteHistory({ + peer: buildInputPeer(chat.id, chat.accessHash), + ...(shouldDeleteForAll && { revoke: true }), + ...(!shouldDeleteForAll && { just_clear: true }), + maxId, + }), + ); + + if (!result) { + return; + } + + onUpdate({ + '@type': 'deleteHistory', + chatId: chat.id, + }); +} + +export async function markMessageListRead({ + chat, threadId, maxId, +}: { + chat: ApiChat; threadId: number; maxId?: number; +}) { + const isChannel = getEntityTypeById(chat.id) === 'channel'; + + if (isChannel && threadId === MAIN_THREAD_ID) { + await invokeRequest(new GramJs.channels.ReadHistory({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + maxId, + })); + } else if (isChannel) { + await invokeRequest(new GramJs.messages.ReadDiscussion({ + peer: buildInputPeer(chat.id, chat.accessHash), + msgId: threadId, + readMaxId: maxId, + })); + } else { + await invokeRequest(new GramJs.messages.ReadHistory({ + peer: buildInputPeer(chat.id, chat.accessHash), + maxId, + })); + } + + if (threadId === MAIN_THREAD_ID) { + void requestChatUpdate(chat); + } else { + void requestThreadInfoUpdate({ chat, threadId }); + } +} + +export async function markMessagesRead({ + chat, messageIds, +}: { + chat: ApiChat; messageIds: number[]; +}) { + const isChannel = getEntityTypeById(chat.id) === 'channel'; + + await invokeRequest( + isChannel + ? new GramJs.channels.ReadMessageContents({ + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + id: messageIds, + }) + : new GramJs.messages.ReadMessageContents({ + id: messageIds, + }), + ); + + onUpdate({ + ...(isChannel ? { + '@type': 'updateChannelMessages', + channelId: chat.id, + } : { + '@type': 'updateCommonBoxMessages', + }), + ids: messageIds, + messageUpdate: { + hasUnreadMention: false, + isMediaUnread: false, + }, + }); +} + +export async function requestThreadInfoUpdate({ + chat, threadId, +}: { + chat: ApiChat; threadId: number; +}) { + const [topMessageResult, repliesResult] = await Promise.all([ + invokeRequest(new GramJs.messages.GetDiscussionMessage({ + peer: buildInputPeer(chat.id, chat.accessHash), + msgId: threadId, + })), + invokeRequest(new GramJs.messages.GetReplies({ + peer: buildInputPeer(chat.id, chat.accessHash), + msgId: threadId, + limit: 1, + })), + ]); + + if (!topMessageResult || !topMessageResult.messages.length) { + return; + } + + const discussionChatId = resolveMessageApiChatId(topMessageResult.messages[0]); + if (!discussionChatId) { + return; + } + + onUpdate({ + '@type': 'updateThreadInfo', + chatId: discussionChatId, + threadId, + threadInfo: { + topMessageId: topMessageResult.messages[topMessageResult.messages.length - 1].id, + lastReadInboxMessageId: topMessageResult.readInboxMaxId, + messagesCount: (repliesResult instanceof GramJs.messages.ChannelMessages) ? repliesResult.count : undefined, + }, + }); + + const chats = topMessageResult.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any); + chats.forEach((newChat) => { + onUpdate({ + '@type': 'updateChat', + id: newChat.id, + chat: newChat, + }); + }); +} + +export async function searchMessagesLocal({ + chatOrUser, type, query, topMessageId, minDate, maxDate, ...pagination +}: { + chatOrUser: ApiChat | ApiUser; + type?: ApiMessageSearchType | ApiGlobalMessageSearchType; + query?: string; + topMessageId?: number; + offsetId?: number; + addOffset?: number; + limit: number; + minDate?: number; + maxDate?: number; +}) { + let filter; + switch (type) { + case 'media': + filter = new GramJs.InputMessagesFilterPhotoVideo(); + break; + case 'documents': + filter = new GramJs.InputMessagesFilterDocument(); + break; + case 'links': + filter = new GramJs.InputMessagesFilterUrl(); + break; + case 'audio': + filter = new GramJs.InputMessagesFilterMusic(); + break; + case 'voice': + filter = new GramJs.InputMessagesFilterVoice(); + break; + case 'text': + default: { + filter = new GramJs.InputMessagesFilterEmpty(); + } + } + + const result = await invokeRequest(new GramJs.messages.Search({ + peer: buildInputPeer(chatOrUser.id, chatOrUser.accessHash), + filter, + q: query || '', + topMsgId: topMessageId, + minDate, + maxDate, + ...pagination, + })); + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages + ) { + return undefined; + } + + updateLocalDb(result); + + const messages = result.messages.map(buildApiMessage).filter(Boolean as any); + const users = result.users.map(buildApiUser).filter(Boolean as any); + + let totalCount = messages.length; + let nextOffsetId: number | undefined; + if (result instanceof GramJs.messages.MessagesSlice || result instanceof GramJs.messages.ChannelMessages) { + totalCount = result.count; + + if (messages.length) { + nextOffsetId = messages[messages.length - 1].id; + } + } + + return { + messages, + users, + totalCount, + nextOffsetId, + }; +} + +export async function searchMessagesGlobal({ + query, offsetRate = 0, limit, type = 'text', minDate, maxDate, +}: { + query: string; + offsetRate?: number; + limit: number; + type?: ApiGlobalMessageSearchType; + minDate?: number; + maxDate?: number; +}) { + let filter; + switch (type) { + case 'media': + filter = new GramJs.InputMessagesFilterPhotoVideo(); + break; + case 'documents': + filter = new GramJs.InputMessagesFilterDocument(); + break; + case 'links': + filter = new GramJs.InputMessagesFilterUrl(); + break; + case 'audio': + filter = new GramJs.InputMessagesFilterMusic(); + break; + case 'voice': + filter = new GramJs.InputMessagesFilterVoice(); + break; + case 'text': + default: { + if (!query && !(maxDate && minDate)) { + return undefined; + } + + filter = new GramJs.InputMessagesFilterEmpty(); + } + } + + const result = await invokeRequest(new GramJs.messages.SearchGlobal({ + q: query, + offsetRate, + offsetPeer: new GramJs.InputPeerEmpty(), + limit, + filter, + folderId: ALL_FOLDER_ID, + minDate, + maxDate, + })); + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages + ) { + return undefined; + } + + updateLocalDb({ + chats: result.chats, + users: result.users, + messages: result.messages, + } as GramJs.messages.Messages); + + const chats = result.chats.map((user) => buildApiChatFromPreview(user)).filter(Boolean as any); + const users = result.users.map(buildApiUser).filter(Boolean as any); + const messages = result.messages.map(buildApiMessage).filter(Boolean as any); + + let totalCount = messages.length; + let nextRate: number | undefined; + if (result instanceof GramJs.messages.MessagesSlice || result instanceof GramJs.messages.ChannelMessages) { + totalCount = result.count; + + if (messages.length) { + nextRate = messages[messages.length - 1].id; + } + } + + return { + messages, + users, + chats, + totalCount, + nextRate: 'nextRate' in result && result.nextRate ? result.nextRate : nextRate, + }; +} + +export async function fetchWebPagePreview({ message }: { message: string }) { + const preview = await invokeRequest(new GramJs.messages.GetWebPagePreview({ + message, + })); + + return preview && buildWebPage(preview); +} + +export async function sendPollVote({ + chat, messageId, options, +}: { + chat: ApiChat; + messageId: number; + options: string[]; +}) { + const { id, accessHash } = chat; + + await invokeRequest(new GramJs.messages.SendVote({ + peer: buildInputPeer(id, accessHash), + msgId: messageId, + options: options.map((option) => Buffer.from(option)), + }), true); +} + +export async function loadPollOptionResults({ + chat, messageId, option, offset, limit, shouldResetVoters, +}: { + chat: ApiChat; + messageId: number; + option?: string; + offset?: string; + limit?: number; + shouldResetVoters?: boolean; +}) { + const { id, accessHash } = chat; + + const result = await invokeRequest(new GramJs.messages.GetPollVotes({ + peer: buildInputPeer(id, accessHash), + id: messageId, + ...(option && { option: Buffer.from(option) }), + ...(offset && { offset }), + ...(limit && { limit }), + })); + + if (!result) { + return undefined; + } + + updateLocalDb({ + chats: [] as GramJs.TypeChat[], + users: result.users, + messages: [] as GramJs.Message[], + } as GramJs.messages.Messages); + + const users = result.users.map(buildApiUser).filter(Boolean as any); + const votes = result.votes.map((vote) => ({ + userId: vote.userId, + date: vote.date, + })); + + return { + count: result.count, + votes, + users, + nextOffset: result.nextOffset, + shouldResetVoters, + }; +} + +export async function forwardMessages({ + fromChat, + toChat, + messages, +}: { + fromChat: ApiChat; + toChat: ApiChat; + messages: ApiMessage[]; +}) { + const messageIds = messages.map(({ id }) => id); + const randomIds = messages.map(generateRandomBigInt); + + messages.forEach((message, index) => { + const localMessage = buildForwardedMessage(toChat, message); + localDb.localMessages[String(randomIds[index])] = localMessage; + + onUpdate({ + '@type': 'newMessage', + id: localMessage.id, + chatId: toChat.id, + message: localMessage, + }); + }); + + await invokeRequest(new GramJs.messages.ForwardMessages({ + fromPeer: buildInputPeer(fromChat.id, fromChat.accessHash), + toPeer: buildInputPeer(toChat.id, toChat.accessHash), + randomId: randomIds, + id: messageIds, + }), true); +} + +export async function findFirstMessageIdAfterDate({ + chat, + timestamp, +}: { + chat: ApiChat; + timestamp: number; +}) { + const result = await invokeRequest(new GramJs.messages.GetHistory({ + peer: buildInputPeer(chat.id, chat.accessHash), + offsetDate: timestamp, + addOffset: -1, + limit: 1, + })); + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages || !result.messages.length + ) { + return undefined; + } + + return result.messages[0].id; +} + +export async function fetchScheduledHistory({ chat, hash = 0 }: { chat: ApiChat; hash?: number }) { + const { id, accessHash } = chat; + + const result = await invokeRequest(new GramJs.messages.GetScheduledHistory({ + peer: buildInputPeer(id, accessHash), + hash, + })); + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages + ) { + return undefined; + } + + updateLocalDb(result); + + const messages = result.messages.map(buildApiMessage).filter(Boolean as any); + + return { + messages, + hash: calculateResultHash(messages.map((message) => message.id)), + }; +} + +export async function sendScheduledMessages({ chat, ids }: { chat: ApiChat; ids: number[] }) { + const { id, accessHash } = chat; + + await invokeRequest(new GramJs.messages.SendScheduledMessages({ + peer: buildInputPeer(id, accessHash), + id: ids, + }), true); +} + +export function fetchMessageLink({ chat, message }: { chat: ApiChat; message: ApiMessage }) { + return invokeRequest(new GramJs.channels.ExportMessageLink({ + id: message.id, + channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel, + ...(message.isInAlbum && { grouped: true }), + ...(message.threadInfo && message.threadInfo.topMessageId !== message.id && { thread: true }), + })); +} + +function updateLocalDb(result: ( + GramJs.messages.MessagesSlice | GramJs.messages.Messages | GramJs.messages.ChannelMessages | + GramJs.messages.DiscussionMessage +)) { + result.users.forEach((user) => { + if (user instanceof GramJs.User) { + localDb.users[user.id] = user; + } + }); + + result.chats.forEach((chat) => { + if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) { + localDb.chats[chat.id] = chat; + } + }); + + result.messages.forEach((message) => { + if (message instanceof GramJs.Message && isMessageWithMedia(message)) { + addMessageToLocalDb(message); + } + }); +} + +export async function fetchPinnedMessages({ chat }: { chat: ApiChat }) { + const result = await invokeRequest(new GramJs.messages.Search( + { + peer: buildInputPeer(chat.id, chat.accessHash), + filter: new GramJs.InputMessagesFilterPinned(), + q: '', + limit: PINNED_MESSAGES_LIMIT, + }, + )); + + if ( + !result + || result instanceof GramJs.messages.MessagesNotModified + || !result.messages + ) { + return undefined; + } + + updateLocalDb(result); + + const messages = result.messages.map(buildApiMessage).filter(Boolean as any); + const users = result.users.map(buildApiUser).filter(Boolean as any); + const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any); + + return { + messages, + users, + chats, + }; +} diff --git a/src/api/gramjs/methods/payments.ts b/src/api/gramjs/methods/payments.ts new file mode 100644 index 000000000..5024c0012 --- /dev/null +++ b/src/api/gramjs/methods/payments.ts @@ -0,0 +1,79 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { invokeRequest } from './client'; +import { buildShippingInfo } from '../gramjsBuilders'; +import { buildShippingOptions, buildPaymentForm, buildReceipt } from '../apiBuilders/payments'; + +export async function validateRequestedInfo({ + messageId, + requestInfo, + shouldSave, +}: { + messageId: number; + requestInfo: GramJs.TypePaymentRequestedInfo; + shouldSave?: boolean; +}): Promise<{ + id: string; + shippingOptions: any; + } | undefined> { + const result = await invokeRequest(new GramJs.payments.ValidateRequestedInfo({ + msgId: messageId, + save: shouldSave || undefined, + info: buildShippingInfo(requestInfo), + })); + if (!result) { + return undefined; + } + const { id, shippingOptions } = result; + if (!id) { + return undefined; + } + return { + id, + shippingOptions: buildShippingOptions(shippingOptions), + }; +} + +export function sendPaymentForm({ + messageId, + requestedInfoId, + shippingOptionId, + credentials, +}: { + messageId: number; + credentials: any; + requestedInfoId?: string; + shippingOptionId?: string; +}) { + return invokeRequest(new GramJs.payments.SendPaymentForm({ + msgId: messageId, + requestedInfoId, + shippingOptionId, + credentials: new GramJs.InputPaymentCredentials({ + save: credentials.save, + data: new GramJs.DataJSON({ data: JSON.stringify(credentials.data) }), + }), + }), true); +} + +export async function getPaymentForm({ + messageId, +}: { + messageId: number; +}) { + const result = await invokeRequest(new GramJs.payments.GetPaymentForm({ + msgId: messageId, + })); + if (!result) { + return undefined; + } + + return buildPaymentForm(result); +} + +export async function getReceipt(msgId: number) { + const result = await invokeRequest(new GramJs.payments.GetPaymentReceipt({ msgId })); + if (!result) { + return undefined; + } + return buildReceipt(result); +} diff --git a/src/api/gramjs/methods/settings.ts b/src/api/gramjs/methods/settings.ts new file mode 100644 index 000000000..c6eb822a5 --- /dev/null +++ b/src/api/gramjs/methods/settings.ts @@ -0,0 +1,349 @@ +import BigInt from 'big-integer'; +import { Api as GramJs } from '../../../lib/gramjs'; + +import { + ApiChat, ApiLangString, ApiLanguage, ApiUser, ApiWallpaper, +} from '../../types'; +import { ApiPrivacyKey, IInputPrivacyRules } from '../../../types'; + +import { BLOCKED_LIST_LIMIT, DEFAULT_LANG_PACK } from '../../../config'; +import { buildApiWallpaper, buildApiSession, buildPrivacyRules } from '../apiBuilders/misc'; + +import { buildApiUser } from '../apiBuilders/users'; +import { buildApiChatFromPreview, getApiChatIdFromMtpPeer } from '../apiBuilders/chats'; +import { buildInputPrivacyKey, buildInputPeer, buildPeer } from '../gramjsBuilders'; +import { invokeRequest, uploadFile } from './client'; +import { omitVirtualClassFields } from '../apiBuilders/helpers'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import localDb from '../localDb'; + +const MAX_INT_32 = 2 ** 31 - 1; + +export function updateProfile({ + firstName, + lastName, + about, +}: { + firstName?: string; + lastName?: string; + about?: string; +}) { + return invokeRequest(new GramJs.account.UpdateProfile({ + firstName: firstName || '', + lastName: lastName || '', + about: about || '', + })); +} + +export function checkUsername(username: string) { + return invokeRequest(new GramJs.account.CheckUsername({ username })); +} + +export function updateUsername(username: string) { + return invokeRequest(new GramJs.account.UpdateUsername({ username })); +} + +export async function updateProfilePhoto(file: File) { + const inputFile = await uploadFile(file); + return invokeRequest(new GramJs.photos.UploadProfilePhoto({ + file: inputFile, + })); +} + +export async function uploadProfilePhoto(file: File) { + const inputFile = await uploadFile(file); + await invokeRequest(new GramJs.photos.UploadProfilePhoto({ + file: inputFile, + })); +} + +export async function fetchWallpapers(hash: number) { + const result = await invokeRequest(new GramJs.account.GetWallPapers({ hash })); + + if (!result || result instanceof GramJs.account.WallPapersNotModified) { + return undefined; + } + + const filteredWallpapers = result.wallpapers.filter((wallpaper) => { + if ( + !(wallpaper instanceof GramJs.WallPaper) + || !(wallpaper.document instanceof GramJs.Document) + ) { + return false; + } + + return !wallpaper.pattern && wallpaper.document.mimeType !== 'application/x-tgwallpattern'; + }) as GramJs.WallPaper[]; + + filteredWallpapers.forEach((wallpaper) => { + localDb.documents[String(wallpaper.document.id)] = wallpaper.document as GramJs.Document; + }); + + return { + hash: result.hash, + wallpapers: filteredWallpapers.map(buildApiWallpaper).filter(Boolean as any), + }; +} + +export async function uploadWallpaper(file: File) { + const inputFile = await uploadFile(file); + + const result = await invokeRequest(new GramJs.account.UploadWallPaper({ + file: inputFile, + mimeType: file.type, + settings: new GramJs.WallPaperSettings(), + })); + + if (!result || !(result instanceof GramJs.WallPaper)) { + return undefined; + } + + const wallpaper = buildApiWallpaper(result); + if (!wallpaper) { + return undefined; + } + + localDb.documents[String(result.document.id)] = result.document as GramJs.Document; + + return { wallpaper }; +} + +export async function fetchBlockedContacts() { + const result = await invokeRequest(new GramJs.contacts.GetBlocked({ + limit: BLOCKED_LIST_LIMIT, + })); + if (!result) { + return undefined; + } + + updateLocalDb(result); + + return { + users: result.users.map(buildApiUser).filter(Boolean as any), + chats: result.chats.map((chat) => buildApiChatFromPreview(chat, undefined, true)).filter(Boolean as any), + blockedIds: result.blocked.map((blocked) => getApiChatIdFromMtpPeer(blocked.peerId)), + totalCount: result instanceof GramJs.contacts.BlockedSlice ? result.count : result.blocked.length, + }; +} + +export function blockContact(chatOrUserId: number) { + return invokeRequest(new GramJs.contacts.Block({ + id: buildPeer(chatOrUserId), + })); +} + +export function unblockContact(chatOrUserId: number, accessHash?: string) { + return invokeRequest(new GramJs.contacts.Unblock({ + id: buildInputPeer(chatOrUserId, accessHash), + })); +} + +export async function fetchAuthorizations() { + const result = await invokeRequest(new GramJs.account.GetAuthorizations()); + if (!result) { + return undefined; + } + + return result.authorizations.map(buildApiSession); +} + +export function terminateAuthorization(hash: string) { + return invokeRequest(new GramJs.account.ResetAuthorization({ hash: BigInt(hash) })); +} + +export function terminateAllAuthorizations() { + return invokeRequest(new GramJs.auth.ResetAuthorizations()); +} + +export async function loadNotificationsSettings() { + const [ + isMutedContactSignUpNotification, + privateContactNotificationsSettings, + groupNotificationsSettings, + broadcastNotificationsSettings, + ] = await Promise.all([ + invokeRequest(new GramJs.account.GetContactSignUpNotification()), + invokeRequest(new GramJs.account.GetNotifySettings({ + peer: new GramJs.InputNotifyUsers(), + })), + invokeRequest(new GramJs.account.GetNotifySettings({ + peer: new GramJs.InputNotifyChats(), + })), + invokeRequest(new GramJs.account.GetNotifySettings({ + peer: new GramJs.InputNotifyBroadcasts(), + })), + ]); + + if (!privateContactNotificationsSettings || !groupNotificationsSettings || !broadcastNotificationsSettings) { + return false; + } + + const { + silent: privateSilent, muteUntil: privateMuteUntil, showPreviews: privateShowPreviews, + } = privateContactNotificationsSettings; + const { + silent: groupSilent, muteUntil: groupMuteUntil, showPreviews: groupShowPreviews, + } = groupNotificationsSettings; + const { + silent: broadcastSilent, muteUntil: broadcastMuteUntil, showPreviews: broadcastShowPreviews, + } = broadcastNotificationsSettings; + + return { + hasContactJoinedNotifications: !isMutedContactSignUpNotification, + hasPrivateChatsNotifications: !( + privateSilent || (typeof privateMuteUntil === 'number' && Date.now() < privateMuteUntil * 1000) + ), + hasPrivateChatsMessagePreview: privateShowPreviews, + hasGroupNotifications: !( + groupSilent || (typeof groupMuteUntil === 'number' && Date.now() < groupMuteUntil * 1000) + ), + hasGroupMessagePreview: groupShowPreviews, + hasBroadcastNotifications: !( + broadcastSilent || (typeof broadcastMuteUntil === 'number' && Date.now() < broadcastMuteUntil * 1000) + ), + hasBroadcastMessagePreview: broadcastShowPreviews, + }; +} + +export function updateContactSignUpNotification(isSilent: boolean) { + return invokeRequest(new GramJs.account.SetContactSignUpNotification({ silent: isSilent })); +} + +export function updateNotificationSettings(peerType: 'contact' | 'group' | 'broadcast', { + isSilent, + isShowPreviews, +}: { + isSilent: boolean; + isShowPreviews: boolean; +}) { + let peer: GramJs.TypeInputNotifyPeer; + if (peerType === 'contact') { + peer = new GramJs.InputNotifyUsers(); + } else if (peerType === 'group') { + peer = new GramJs.InputNotifyChats(); + } else { + peer = new GramJs.InputNotifyBroadcasts(); + } + + const settings = { + showPreviews: isShowPreviews, + silent: isSilent, + muteUntil: isSilent ? MAX_INT_32 : undefined, + }; + + return invokeRequest(new GramJs.account.UpdateNotifySettings({ + peer, + settings: new GramJs.InputPeerNotifySettings(settings), + })); +} + +export async function fetchLanguages(): Promise { + const result = await invokeRequest(new GramJs.langpack.GetLanguages({ + langPack: DEFAULT_LANG_PACK, + })); + if (!result) { + return undefined; + } + + return result.map(omitVirtualClassFields); +} + +export async function fetchLangPack({ sourceLangPacks, langCode }: { sourceLangPacks: string[]; langCode: string }) { + const results = await Promise.all(sourceLangPacks.map((langPack) => { + return invokeRequest(new GramJs.langpack.GetLangPack({ langPack, langCode })); + })); + + const collections = results + .filter(Boolean as any) + .map((result) => { + return buildCollectionByKey(result.strings.map(omitVirtualClassFields), 'key'); + }); + + if (!collections.length) { + return undefined; + } + + return { langPack: Object.assign({}, ...collections.reverse()) }; +} + +export async function fetchPrivacySettings(privacyKey: ApiPrivacyKey) { + const key = buildInputPrivacyKey(privacyKey); + const result = await invokeRequest(new GramJs.account.GetPrivacy({ key })); + + if (!result) { + return undefined; + } + + updateLocalDb(result); + + return buildPrivacyRules(result.rules); +} + +export async function setPrivacySettings( + privacyKey: ApiPrivacyKey, rules: IInputPrivacyRules, +) { + const key = buildInputPrivacyKey(privacyKey); + const privacyRules: GramJs.TypeInputPrivacyRule[] = []; + + if (rules.allowedUsers) { + privacyRules.push(new GramJs.InputPrivacyValueAllowUsers({ + users: rules.allowedUsers.map(({ id, accessHash }) => buildInputPeer(id, accessHash)), + })); + } + if (rules.allowedChats) { + privacyRules.push(new GramJs.InputPrivacyValueAllowChatParticipants({ + chats: rules.allowedChats.map(({ id }) => -id), + })); + } + if (rules.blockedUsers) { + privacyRules.push(new GramJs.InputPrivacyValueDisallowUsers({ + users: rules.blockedUsers.map(({ id, accessHash }) => buildInputPeer(id, accessHash)), + })); + } + if (rules.blockedChats) { + privacyRules.push(new GramJs.InputPrivacyValueDisallowChatParticipants({ + chats: rules.blockedChats.map(({ id }) => -id), + })); + } + switch (rules.visibility) { + case 'everybody': + privacyRules.push(new GramJs.InputPrivacyValueAllowAll()); + break; + + case 'contacts': + privacyRules.push(new GramJs.InputPrivacyValueAllowContacts()); + break; + + case 'nonContacts': + privacyRules.push(new GramJs.InputPrivacyValueDisallowContacts()); + break; + + case 'nobody': + privacyRules.push(new GramJs.InputPrivacyValueDisallowAll()); + break; + } + + const result = await invokeRequest(new GramJs.account.SetPrivacy({ key, rules: privacyRules })); + + if (!result) { + return undefined; + } + + updateLocalDb(result); + + return buildPrivacyRules(result.rules); +} + +function updateLocalDb(result: GramJs.account.PrivacyRules | GramJs.contacts.Blocked | GramJs.contacts.BlockedSlice) { + result.users.forEach((user) => { + if (user instanceof GramJs.User) { + localDb.users[user.id] = user; + } + }); + + result.chats.forEach((chat) => { + if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) { + localDb.chats[chat.id] = chat; + } + }); +} diff --git a/src/api/gramjs/methods/symbols.ts b/src/api/gramjs/methods/symbols.ts new file mode 100644 index 000000000..cde808333 --- /dev/null +++ b/src/api/gramjs/methods/symbols.ts @@ -0,0 +1,290 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { ApiSticker, ApiVideo, OnApiUpdate } from '../../types'; + +import { invokeRequest } from './client'; +import { buildStickerFromDocument, buildStickerSet, buildStickerSetCovered } from '../apiBuilders/symbols'; +import { buildInputStickerSet, buildInputDocument } from '../gramjsBuilders'; +import { buildVideoFromDocument } from '../apiBuilders/messages'; + +import localDb from '../localDb'; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function fetchStickerSets({ hash }: { hash: number }) { + const allStickers = await invokeRequest(new GramJs.messages.GetAllStickers({ hash })); + + if (!allStickers || allStickers instanceof GramJs.messages.AllStickersNotModified) { + return undefined; + } + + allStickers.sets.forEach((stickerSet) => { + if (stickerSet.thumb) { + localDb.stickerSets[String(stickerSet.id)] = stickerSet; + } + }); + + return { + hash: allStickers.hash, + sets: allStickers.sets.map(buildStickerSet), + }; +} + +export async function fetchRecentStickers({ hash }: { hash: number }) { + const result = await invokeRequest(new GramJs.messages.GetRecentStickers({ hash })); + + if (!result || result instanceof GramJs.messages.RecentStickersNotModified) { + return undefined; + } + + return { + hash: result.hash, + stickers: processStickerResult(result.stickers), + }; +} + +export async function fetchFavoriteStickers({ hash }: { hash: number }) { + const result = await invokeRequest(new GramJs.messages.GetFavedStickers({ hash })); + + if (!result || result instanceof GramJs.messages.FavedStickersNotModified) { + return undefined; + } + + return { + hash: result.hash, + stickers: processStickerResult(result.stickers), + }; +} + +export async function fetchFeaturedStickers({ hash }: { hash: number }) { + const result = await invokeRequest(new GramJs.messages.GetFeaturedStickers({ hash })); + + if (!result || result instanceof GramJs.messages.FeaturedStickersNotModified) { + return undefined; + } + + return { + hash: result.hash, + sets: result.sets.map(buildStickerSetCovered), + }; +} + +export async function faveSticker({ + sticker, + unfave, +}: { + sticker: ApiSticker; + unfave?: boolean; +}) { + const request = new GramJs.messages.FaveSticker({ + id: buildInputDocument(sticker), + unfave, + }); + + const result = await invokeRequest(request); + if (result) { + onUpdate({ + '@type': 'updateFavoriteStickers', + }); + } +} + +export async function fetchStickers({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) { + const result = await invokeRequest(new GramJs.messages.GetStickerSet({ + stickerset: buildInputStickerSet(stickerSetId, accessHash), + })); + + if (!result) { + return undefined; + } + + return { + set: buildStickerSet(result.set), + stickers: processStickerResult(result.documents), + packs: processStickerPackResult(result.packs), + }; +} + +export async function fetchAnimatedEmojis() { + const result = await invokeRequest(new GramJs.messages.GetStickerSet({ + stickerset: new GramJs.InputStickerSetAnimatedEmoji(), + })); + + if (!result) { + return undefined; + } + + return { + set: buildStickerSet(result.set), + stickers: processStickerResult(result.documents), + }; +} + +export async function searchStickers({ query, hash }: { query: string; hash: number }) { + const result = await invokeRequest(new GramJs.messages.SearchStickerSets({ + q: query, + hash, + })); + + if (!result || result instanceof GramJs.messages.FoundStickerSetsNotModified) { + return undefined; + } + + return { + hash: result.hash, + sets: result.sets.map(buildStickerSetCovered), + }; +} + +export async function fetchSavedGifs({ hash }: { hash: number }) { + const result = await invokeRequest(new GramJs.messages.GetSavedGifs({ hash })); + + if (!result || result instanceof GramJs.messages.SavedGifsNotModified) { + return undefined; + } + + return { + hash: result.hash, + gifs: processGifResult(result.gifs), + }; +} + +export async function installStickerSet({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) { + const result = await invokeRequest(new GramJs.messages.InstallStickerSet({ + stickerset: buildInputStickerSet(stickerSetId, accessHash), + })); + + if (result) { + onUpdate({ + '@type': 'updateStickerSet', + id: stickerSetId, + stickerSet: { installedDate: Date.now() }, + }); + } +} + +export async function uninstallStickerSet({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) { + const result = await invokeRequest(new GramJs.messages.UninstallStickerSet({ + stickerset: buildInputStickerSet(stickerSetId, accessHash), + })); + + if (result) { + onUpdate({ + '@type': 'updateStickerSet', + id: stickerSetId, + stickerSet: { installedDate: undefined }, + }); + } +} + +let inputGifBot: GramJs.InputUser | undefined; + +export async function searchGifs({ query, offset = '' }: { query: string; offset?: string }) { + if (!inputGifBot) { + const config = await invokeRequest(new GramJs.help.GetConfig()); + if (!config) { + return undefined; + } + + const resolvedPeer = await invokeRequest(new GramJs.contacts.ResolveUsername({ + username: config.gifSearchUsername, + })); + if (!resolvedPeer || !(resolvedPeer.users[0] instanceof GramJs.User)) { + return undefined; + } + + inputGifBot = new GramJs.InputUser({ + userId: (resolvedPeer.peer as GramJs.PeerUser).userId, + accessHash: resolvedPeer.users[0].accessHash!, + }); + } + + const result = await invokeRequest(new GramJs.messages.GetInlineBotResults({ + bot: inputGifBot, + peer: new GramJs.InputPeerEmpty(), + query, + offset, + })); + if (!result) { + return undefined; + } + + const documents = result.results + .map((foundGif) => { + if (foundGif instanceof GramJs.BotInlineMediaResult) { + return foundGif.document; + } + + return undefined; + }) + .filter(Boolean as any); + + return { + nextOffset: result.nextOffset, + gifs: processGifResult(documents), + }; +} + +export async function fetchStickersForEmoji({ + emoji, hash = 0, +}: { emoji: string; hash?: number }) { + const result = await invokeRequest(new GramJs.messages.GetStickers({ + emoticon: emoji, + hash, + })); + + if (!result || result instanceof GramJs.messages.StickersNotModified) { + return undefined; + } + + return { + stickers: processStickerResult(result.stickers), + hash: result.hash, + }; +} + +function processStickerResult(stickers: GramJs.TypeDocument[]) { + return stickers + .map((document) => { + if (document instanceof GramJs.Document) { + const sticker = buildStickerFromDocument(document); + if (sticker) { + localDb.documents[String(document.id)] = document; + + return sticker; + } + } + + return undefined; + }) + .filter(Boolean as any); +} + +function processStickerPackResult(packs: GramJs.StickerPack[]) { + return packs.reduce((acc, { emoticon, documents }) => { + acc[emoticon] = documents.map((documentId) => buildStickerFromDocument( + localDb.documents[String(documentId)], + )).filter(Boolean as any); + return acc; + }, {} as Record); +} + +function processGifResult(gifs: GramJs.TypeDocument[]) { + return gifs + .map((document) => { + if (document instanceof GramJs.Document) { + const gif = buildVideoFromDocument(document); + if (gif) { + localDb.documents[String(document.id)] = document; + + return gif; + } + } + + return undefined; + }) + .filter(Boolean as any); +} diff --git a/src/api/gramjs/methods/twoFaSettings.ts b/src/api/gramjs/methods/twoFaSettings.ts new file mode 100644 index 000000000..dc6c12aed --- /dev/null +++ b/src/api/gramjs/methods/twoFaSettings.ts @@ -0,0 +1,139 @@ +import { Api as GramJs, errors } from '../../../lib/gramjs'; + +import { OnApiUpdate } from '../../types'; + +import { DEBUG } from '../../../config'; +import { invokeRequest, updateTwoFaSettings } from './client'; + +const ApiErrors: { [k: string]: string } = { + EMAIL_UNCONFIRMED: 'Email unconfirmed', + EMAIL_HASH_EXPIRED: 'Email hash expired', + NEW_SALT_INVALID: 'The new salt is invalid', + NEW_SETTINGS_INVALID: 'The new password settings are invalid', + CODE_INVALID: 'Invalid Code', + PASSWORD_HASH_INVALID: 'Invalid Password', +}; + +const emailCodeController: { + resolve?: Function; + reject?: Function; +} = {}; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function getPasswordInfo() { + const result = await invokeRequest(new GramJs.account.GetPassword()); + if (!result) { + return undefined; + } + + const { hint, hasPassword } = result; + + return { hint, hasPassword }; +} + +function onRequestEmailCode(length: number) { + onUpdate({ + '@type': 'updateTwoFaStateWaitCode', + length, + }); + + return new Promise((resolve, reject) => { + emailCodeController.resolve = resolve; + emailCodeController.reject = reject; + }); +} + +export async function checkPassword(currentPassword: string) { + try { + await updateTwoFaSettings({ isCheckPassword: true, currentPassword }); + + return true; + } catch (err) { + onError(err); + + return false; + } +} + +export async function clearPassword(currentPassword: string) { + try { + await updateTwoFaSettings({ currentPassword }); + + return true; + } catch (err) { + onError(err); + + return false; + } +} + +export async function updatePassword(currentPassword: string, password: string, hint?: string, email?: string) { + try { + await updateTwoFaSettings({ + currentPassword, + newPassword: password, + hint, + email, + emailCodeCallback: onRequestEmailCode, + onEmailCodeError: onError, + }); + + return true; + } catch (err) { + onError(err); + + return false; + } +} + +export async function updateRecoveryEmail(currentPassword: string, email: string) { + try { + await updateTwoFaSettings({ + currentPassword, + newPassword: currentPassword, + email, + emailCodeCallback: onRequestEmailCode, + onEmailCodeError: onError, + }); + + return true; + } catch (err) { + onError(err); + + return false; + } +} + +export function provideRecoveryEmailCode(code: string) { + emailCodeController.resolve!(code); +} + +function onError(err: Error) { + let message: string; + + if (err instanceof errors.FloodWaitError) { + const hours = Math.ceil(Number(err.seconds) / 60 / 60); + message = `Too many attempts. Try again in ${hours > 1 ? `${hours} hours` : 'an hour'}`; + } else { + message = ApiErrors[err.message]; + } + + if (!message) { + message = 'Unexpected Error'; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(err); + } + } + + onUpdate({ + '@type': 'updateTwoFaError', + message, + }); +} diff --git a/src/api/gramjs/methods/types.ts b/src/api/gramjs/methods/types.ts new file mode 100644 index 000000000..5665bb64b --- /dev/null +++ b/src/api/gramjs/methods/types.ts @@ -0,0 +1,5 @@ +import * as methods from './index'; + +export type Methods = typeof methods; +export type MethodArgs = Parameters; +export type MethodResponse = ReturnType; diff --git a/src/api/gramjs/methods/users.ts b/src/api/gramjs/methods/users.ts new file mode 100644 index 000000000..3e7d29285 --- /dev/null +++ b/src/api/gramjs/methods/users.ts @@ -0,0 +1,154 @@ +import { Api as GramJs } from '../../../lib/gramjs'; +import { OnApiUpdate, ApiUser, ApiChat } from '../../types'; + +import { invokeRequest } from './client'; +import { + buildInputEntity, + calculateResultHash, + buildInputPeer, + buildInputContact, +} from '../gramjsBuilders'; +import { buildApiUser, buildApiUserFromFull } from '../apiBuilders/users'; +import localDb from '../localDb'; +import { buildApiChatFromPreview } from '../apiBuilders/chats'; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +export async function fetchFullUser({ + id, + accessHash, +}: { + id: number; + accessHash?: string; +}) { + const input = buildInputEntity(id, accessHash); + if (!(input instanceof GramJs.InputUser)) { + return; + } + + const fullInfo = await invokeRequest(new GramJs.users.GetFullUser({ id: input })); + + if (!fullInfo) { + return; + } + + const userWithFullInfo = buildApiUserFromFull(fullInfo); + + onUpdate({ + '@type': 'updateUser', + id, + user: { + fullInfo: userWithFullInfo.fullInfo, + }, + }); +} + +export async function fetchNearestCountry() { + const dcInfo = await invokeRequest(new GramJs.help.GetNearestDc()); + + return dcInfo ? dcInfo.country : undefined; +} + +export async function fetchTopUsers({ hash = 0 }: { hash?: number }) { + const topPeers = await invokeRequest(new GramJs.contacts.GetTopPeers({ + hash, + correspondents: true, + })); + if (!(topPeers instanceof GramJs.contacts.TopPeers)) { + return undefined; + } + + const users = topPeers.users.map(buildApiUser).filter((user) => !!user && !user.isSelf) as ApiUser[]; + const ids = users.map(({ id }) => id); + + return { + hash: calculateResultHash(ids), + ids, + users, + }; +} + +export async function fetchContactList({ hash = 0 }: { hash?: number }) { + const result = await invokeRequest(new GramJs.contacts.GetContacts({ hash })); + if (!result || result instanceof GramJs.contacts.ContactsNotModified) { + return undefined; + } + + result.users.forEach((user) => { + if (user instanceof GramJs.User) { + localDb.users[user.id] = user; + } + }); + + return { + hash: calculateResultHash([ + result.savedCount, + ...result.contacts.map(({ userId }) => userId), + ]), + users: result.users.map(buildApiUser).filter(Boolean as any), + chats: result.users.map((user) => buildApiChatFromPreview(user)).filter(Boolean as any), + }; +} + +export async function fetchUsers({ users }: { users: ApiUser[] }) { + const result = await invokeRequest(new GramJs.users.GetUsers({ + id: users.map(({ id, accessHash }) => buildInputPeer(id, accessHash)), + })); + if (!result || !result.length) { + return undefined; + } + + result.forEach((user) => { + if (user instanceof GramJs.User) { + localDb.users[user.id] = user; + } + }); + + return result.map(buildApiUser).filter(Boolean as any); +} + +export function updateContact({ + phone, + firstName, + lastName, +}: { + phone?: string; + firstName?: string; + lastName?: string; +}) { + return invokeRequest(new GramJs.contacts.ImportContacts({ + contacts: [buildInputContact({ + phone: phone || '', + firstName: firstName || '', + lastName: lastName || '', + })], + })); +} + +export async function deleteUser({ + id, + accessHash, +}: { + id: number; + accessHash?: string; +}) { + const input = buildInputEntity(id, accessHash); + if (!(input instanceof GramJs.InputUser)) { + return; + } + + const result = await invokeRequest(new GramJs.contacts.DeleteContacts({ id: [input] })); + + if (!result) { + return; + } + + onUpdate({ + '@type': 'deleteUser', + id, + }); +} diff --git a/src/api/gramjs/provider.ts b/src/api/gramjs/provider.ts new file mode 100644 index 000000000..42d50e7b5 --- /dev/null +++ b/src/api/gramjs/provider.ts @@ -0,0 +1,73 @@ +import { ApiOnProgress, ApiUpdate, OnApiUpdate } from '../types'; +import { Methods, MethodArgs, MethodResponse } from './methods/types'; + +import { API_THROTTLE_RESET_UPDATES, API_UPDATE_THROTTLE } from '../../config'; +import { throttle, throttleWithTickEnd } from '../../util/schedulers'; +import { init as initUpdater } from './updater'; +import { init as initAuth } from './methods/auth'; +import { init as initChats } from './methods/chats'; +import { init as initMessages } from './methods/messages'; +import { init as initUsers } from './methods/users'; +import { init as initClient } from './methods/client'; +import { init as initStickers } from './methods/symbols'; +import { init as initManagement } from './methods/management'; +import { init as initTwoFaSettings } from './methods/twoFaSettings'; +import * as methods from './methods'; + +let onUpdate: OnApiUpdate; + +export async function initApi(_onUpdate: OnApiUpdate, sessionId = '') { + onUpdate = _onUpdate; + + initUpdater(handleUpdate); + initAuth(handleUpdate); + initChats(handleUpdate); + initMessages(handleUpdate); + initUsers(handleUpdate); + initStickers(handleUpdate); + initManagement(handleUpdate); + initTwoFaSettings(handleUpdate); + + await initClient(sessionId, handleUpdate); +} + +export function callApi(fnName: T, ...args: MethodArgs): MethodResponse { + // @ts-ignore + return methods[fnName](...args) as MethodResponse; +} + +export function cancelApiProgress(progressCallback: ApiOnProgress) { + progressCallback.isCanceled = true; +} + +const flushUpdatesOnTickEnd = throttleWithTickEnd(flushUpdates); + +let flushUpdatesThrottled: typeof flushUpdatesOnTickEnd | undefined; +let currentThrottleId: number | undefined; + +let pendingUpdates: ApiUpdate[] | undefined; + +function handleUpdate(update: ApiUpdate) { + if (!pendingUpdates) { + pendingUpdates = [update]; + } else { + pendingUpdates.push(update); + } + + if (!flushUpdatesThrottled || API_THROTTLE_RESET_UPDATES.has(update['@type'])) { + flushUpdatesThrottled = throttle(flushUpdatesOnTickEnd, API_UPDATE_THROTTLE, true); + currentThrottleId = Math.random(); + } + + flushUpdatesThrottled(currentThrottleId!); +} + +function flushUpdates(throttleId: number) { + if (!pendingUpdates || throttleId !== currentThrottleId) { + return; + } + + const currentUpdates = pendingUpdates!; + pendingUpdates = undefined; + currentUpdates.forEach(onUpdate); +} diff --git a/src/api/gramjs/updater.ts b/src/api/gramjs/updater.ts new file mode 100644 index 000000000..e65d9f462 --- /dev/null +++ b/src/api/gramjs/updater.ts @@ -0,0 +1,753 @@ +import { Api as GramJs, connection } from '../../lib/gramjs'; +import { ApiMessage, ApiUpdateConnectionStateType, OnApiUpdate } from '../types'; + +import { pick } from '../../util/iteratees'; +import { + buildApiMessage, + buildApiMessageFromShort, + buildApiMessageFromShortChat, + buildMessageMediaContent, + buildMessageTextContent, + resolveMessageApiChatId, + buildPoll, + buildPollResults, + buildApiMessageFromNotification, +} from './apiBuilders/messages'; +import { + getApiChatIdFromMtpPeer, + buildChatMember, + buildChatMembers, + buildChatTypingStatus, + buildAvatarHash, + buildApiChatFromPreview, + buildApiChatFolder, + getApiChatIdFromInputMtpPeer, +} from './apiBuilders/chats'; +import { buildApiUser, buildApiUserStatus } from './apiBuilders/users'; +import { + buildMessageFromUpdate, + isMessageWithMedia, + buildChatPhotoForLocalDb, +} from './gramjsBuilders'; +import localDb from './localDb'; +import { omitVirtualClassFields } from './apiBuilders/helpers'; +import { DEBUG } from '../../config'; +import { addMessageToLocalDb } from './helpers'; +import { buildPrivacyKey, buildPrivacyRules } from './apiBuilders/misc'; + +type Update = ( + (GramJs.TypeUpdate | GramJs.TypeUpdates) & { _entities?: (GramJs.TypeUser | GramJs.TypeChat)[] } +) | typeof connection.UpdateConnectionState; + +const DELETE_MISSING_CHANNEL_MESSAGE_DELAY = 1000; + +let onUpdate: OnApiUpdate; + +export function init(_onUpdate: OnApiUpdate) { + onUpdate = _onUpdate; +} + +const sentMessageIds = new Set(); + +export function updater(update: Update, originRequest?: GramJs.AnyRequest) { + if (update instanceof connection.UpdateConnectionState) { + let connectionState: ApiUpdateConnectionStateType; + + switch (update.state) { + case connection.UpdateConnectionState.disconnected: + connectionState = 'connectionStateConnecting'; + break; + case connection.UpdateConnectionState.broken: + connectionState = 'connectionStateBroken'; + break; + case connection.UpdateConnectionState.connected: + default: + connectionState = 'connectionStateReady'; + break; + } + + onUpdate({ + '@type': 'updateConnectionState', + connectionState, + }); + + // Messages + } else if ( + update instanceof GramJs.UpdateNewMessage + || update instanceof GramJs.UpdateNewScheduledMessage + || update instanceof GramJs.UpdateNewChannelMessage + || update instanceof GramJs.UpdateShortChatMessage + || update instanceof GramJs.UpdateShortMessage + || update instanceof GramJs.UpdateServiceNotification + ) { + let message: ApiMessage | undefined; + + if (update instanceof GramJs.UpdateShortChatMessage) { + message = buildApiMessageFromShortChat(update); + } else if (update instanceof GramJs.UpdateShortMessage) { + message = buildApiMessageFromShort(update); + } else if (update instanceof GramJs.UpdateServiceNotification) { + const currentDate = Date.now(); + message = buildApiMessageFromNotification(update, currentDate); + + if (isMessageWithMedia(update)) { + addMessageToLocalDb(buildMessageFromUpdate(message.id, message.chatId, update)); + } + } else { + // TODO Remove if proven not reproducing + if (update.message instanceof GramJs.MessageEmpty) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Unexpected update:', update.className, update); + } + + return; + } + + if (update.message instanceof GramJs.Message && isMessageWithMedia(update.message)) { + addMessageToLocalDb(update.message); + } + + message = buildApiMessage(update.message)!; + } + + // eslint-disable-next-line no-underscore-dangle + const entities = update._entities; + if (entities && entities.length) { + entities + .filter((e) => e instanceof GramJs.User) + .map(buildApiUser) + .forEach((user) => { + if (!user) { + return; + } + + onUpdate({ + '@type': 'updateUser', + id: user.id, + user, + }); + }); + entities + .filter((e) => e instanceof GramJs.Chat || e instanceof GramJs.Channel) + .map((e) => buildApiChatFromPreview(e)) + .forEach((chat) => { + if (!chat) { + return; + } + + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat, + }); + }); + } + + if (update instanceof GramJs.UpdateNewScheduledMessage) { + onUpdate({ + '@type': sentMessageIds.has(message.id) ? 'updateScheduledMessage' : 'newScheduledMessage', + id: message.id, + chatId: message.chatId, + message, + }); + } else { + onUpdate({ + '@type': sentMessageIds.has(message.id) ? 'updateMessage' : 'newMessage', + id: message.id, + chatId: message.chatId, + message, + }); + } + + // Some updates to a Chat/Channel don't have a dedicated update class. + // We can get info on some updates from Service Messages. + if (update.message instanceof GramJs.MessageService) { + const { action } = update.message; + + if (action instanceof GramJs.MessageActionChatEditTitle) { + onUpdate({ + '@type': 'updateChat', + id: message.chatId, + chat: { + title: action.title, + }, + }); + } else if (action instanceof GramJs.MessageActionChatEditPhoto) { + const photo = buildChatPhotoForLocalDb(action.photo); + const avatarHash = buildAvatarHash(photo); + + const localDbChatId = Math.abs(resolveMessageApiChatId(update.message)!); + if (localDb.chats[localDbChatId]) { + localDb.chats[localDbChatId].photo = photo; + } + + if (avatarHash) { + onUpdate({ + '@type': 'updateChat', + id: message.chatId, + chat: { avatarHash }, + }); + } + } else if (action instanceof GramJs.MessageActionChatDeletePhoto) { + const localDbChatId = Math.abs(resolveMessageApiChatId(update.message)!); + if (localDb.chats[localDbChatId]) { + localDb.chats[localDbChatId].photo = new GramJs.ChatPhotoEmpty(); + } + + onUpdate({ + '@type': 'updateChat', + id: message.chatId, + chat: { avatarHash: undefined }, + }); + } else if (action instanceof GramJs.MessageActionChatDeleteUser) { + // eslint-disable-next-line no-underscore-dangle + if (update._entities && update._entities.some((e): e is GramJs.User => ( + e instanceof GramJs.User && !!e.self && e.id === action.userId + ))) { + onUpdate({ + '@type': 'updateChatLeave', + id: message.chatId, + }); + } + } else if (action instanceof GramJs.MessageActionChatAddUser) { + // eslint-disable-next-line no-underscore-dangle + if (update._entities && update._entities.some((e): e is GramJs.User => ( + e instanceof GramJs.User && !!e.self && action.users.includes(e.id) + ))) { + onUpdate({ + '@type': 'updateChatJoin', + id: message.chatId, + }); + } + } + } + } else if ( + update instanceof GramJs.UpdateEditMessage + || update instanceof GramJs.UpdateEditChannelMessage + ) { + // TODO Remove if proven not reproducing + if (update.message instanceof GramJs.MessageEmpty) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('Unexpected update:', update.className, update); + } + + return; + } + + if (update.message instanceof GramJs.Message && isMessageWithMedia(update.message)) { + addMessageToLocalDb(update.message); + } + + const message = buildApiMessage(update.message)!; + + onUpdate({ + '@type': 'updateMessage', + id: message.id, + chatId: message.chatId, + message, + }); + } else if (update instanceof GramJs.UpdateDeleteMessages) { + onUpdate({ + '@type': 'deleteMessages', + ids: update.messages, + }); + } else if (update instanceof GramJs.UpdateDeleteScheduledMessages) { + onUpdate({ + '@type': 'deleteScheduledMessages', + ids: update.messages, + chatId: getApiChatIdFromInputMtpPeer(update.peer), + }); + } else if (update instanceof GramJs.UpdateDeleteChannelMessages) { + const chatId = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel); + const ids = update.messages; + const existingIds = ids.filter((id) => localDb.messages[`${chatId}-${id}`]); + const missingIds = ids.filter((id) => !localDb.messages[`${chatId}-${id}`]); + + if (existingIds.length) { + onUpdate({ + '@type': 'deleteMessages', + ids: existingIds, + chatId, + }); + } + + // For some reason delete message update sometimes comes before new message update + if (missingIds.length) { + setTimeout(() => { + onUpdate({ + '@type': 'deleteMessages', + ids: missingIds, + chatId, + }); + }, DELETE_MISSING_CHANNEL_MESSAGE_DELAY); + } + } else if (( + originRequest instanceof GramJs.messages.SendMessage + || originRequest instanceof GramJs.messages.SendMedia + || originRequest instanceof GramJs.messages.SendMultiMedia + || originRequest instanceof GramJs.messages.ForwardMessages + ) && ( + update instanceof GramJs.UpdateMessageID + || update instanceof GramJs.UpdateShortSentMessage + )) { + let randomId; + if ('randomId' in update) { + randomId = update.randomId; + } else if ('randomId' in originRequest) { + randomId = originRequest.randomId; + } + + const localMessage = randomId && localDb.localMessages[randomId.toString()]; + if (!localMessage) { + throw new Error('Local message not found'); + } + + let newContent: ApiMessage['content'] | undefined; + if (update instanceof GramJs.UpdateShortSentMessage) { + if (localMessage.content.text && update.entities) { + newContent = { + text: buildMessageTextContent(localMessage.content.text.text, update.entities), + }; + } + if (update.media) { + newContent = { + ...newContent, + ...buildMessageMediaContent(update.media), + }; + } + + const mtpMessage = buildMessageFromUpdate(update.id, localMessage.chatId, update); + if (isMessageWithMedia(mtpMessage)) { + addMessageToLocalDb(mtpMessage); + } + } + + sentMessageIds.add(update.id); + + // Edge case for "Send When Online" + const isAlreadySent = 'date' in update && update.date * 1000 < Date.now(); + + onUpdate({ + '@type': localMessage.isScheduled && !isAlreadySent + ? 'updateScheduledMessageSendSucceeded' + : 'updateMessageSendSucceeded', + chatId: localMessage.chatId, + localId: localMessage.id, + message: { + ...localMessage, + ...(newContent && { + content: { + ...localMessage.content, + ...newContent, + }, + }), + id: update.id, + sendingState: undefined, + ...('date' in update && { date: update.date }), + }, + }); + } else if (update instanceof GramJs.UpdateReadMessagesContents) { + onUpdate({ + '@type': 'updateCommonBoxMessages', + ids: update.messages, + messageUpdate: { + hasUnreadMention: false, + isMediaUnread: false, + }, + }); + } else if (update instanceof GramJs.UpdateChannelReadMessagesContents) { + onUpdate({ + '@type': 'updateChannelMessages', + channelId: update.channelId, + ids: update.messages, + messageUpdate: { + hasUnreadMention: false, + isMediaUnread: false, + }, + }); + } else if (update instanceof GramJs.UpdateMessagePoll) { + const { pollId, poll, results } = update; + if (poll) { + const apiPoll = buildPoll(poll, results); + + onUpdate({ + '@type': 'updateMessagePoll', + pollId: pollId.toString(), + pollUpdate: apiPoll, + }); + } else { + const pollResults = buildPollResults(results); + onUpdate({ + '@type': 'updateMessagePoll', + pollId: pollId.toString(), + pollUpdate: { results: pollResults }, + }); + } + } else if (update instanceof GramJs.UpdateMessagePollVote) { + onUpdate({ + '@type': 'updateMessagePollVote', + pollId: update.pollId.toString(), + userId: update.userId, + options: update.options.map((option) => String.fromCharCode(...option)), + }); + } else if (update instanceof GramJs.UpdateChannelMessageViews) { + onUpdate({ + '@type': 'updateMessage', + chatId: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel), + id: update.id, + message: { views: update.views }, + }); + + // Chats + } else if (update instanceof GramJs.UpdateReadHistoryInbox) { + onUpdate({ + '@type': 'updateChatInbox', + id: getApiChatIdFromMtpPeer(update.peer), + chat: { + lastReadInboxMessageId: update.maxId, + unreadCount: update.stillUnreadCount, + }, + }); + } else if (update instanceof GramJs.UpdateReadHistoryOutbox) { + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer(update.peer), + chat: { + lastReadOutboxMessageId: update.maxId, + }, + }); + } else if (update instanceof GramJs.UpdateReadChannelInbox) { + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel), + chat: { + lastReadInboxMessageId: update.maxId, + unreadCount: update.stillUnreadCount, + }, + }); + } else if (update instanceof GramJs.UpdateReadChannelOutbox) { + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel), + chat: { + lastReadOutboxMessageId: update.maxId, + }, + }); + } else if ( + update instanceof GramJs.UpdateDialogPinned + && update.peer instanceof GramJs.DialogPeer + ) { + onUpdate({ + '@type': 'updateChatPinned', + id: getApiChatIdFromMtpPeer(update.peer.peer), + isPinned: update.pinned || false, + }); + } else if (update instanceof GramJs.UpdatePinnedDialogs) { + const ids = update.order + ? update.order + .filter((dp): dp is GramJs.DialogPeer => dp instanceof GramJs.DialogPeer) + .map((dp) => getApiChatIdFromMtpPeer(dp.peer)) + : []; + + onUpdate({ + '@type': 'updatePinnedChatIds', + ids, + folderId: update.folderId || undefined, + }); + } else if (update instanceof GramJs.UpdateFolderPeers) { + update.folderPeers.forEach((folderPeer) => { + const { folderId, peer } = folderPeer; + + onUpdate({ + '@type': 'updateChatListType', + id: getApiChatIdFromMtpPeer(peer), + folderId, + }); + }); + } else if (update instanceof GramJs.UpdateDialogFilter) { + const { id, filter } = update; + const folder = filter ? buildApiChatFolder(filter) : undefined; + + onUpdate({ + '@type': 'updateChatFolder', + id, + folder, + }); + } else if (update instanceof GramJs.UpdateDialogFilterOrder) { + onUpdate({ + '@type': 'updateChatFoldersOrder', + orderedIds: update.order, + }); + } else if (update instanceof GramJs.UpdateChatParticipants) { + const replacedMembers = buildChatMembers(update.participants); + + onUpdate({ + '@type': 'updateChatMembers', + id: getApiChatIdFromMtpPeer({ chatId: update.participants.chatId } as GramJs.TypePeer), + replacedMembers, + }); + } else if (update instanceof GramJs.UpdateChatParticipantAdd) { + const addedMember = buildChatMember( + pick(update, ['userId', 'inviterId', 'date']) as GramJs.ChatParticipant, + ); + + onUpdate({ + '@type': 'updateChatMembers', + id: getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat), + addedMember, + }); + } else if (update instanceof GramJs.UpdateChatParticipantDelete) { + const { userId: deletedMemberId } = update; + + onUpdate({ + '@type': 'updateChatMembers', + id: getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat), + deletedMemberId, + }); + } else if ( + update instanceof GramJs.UpdatePinnedMessages + || update instanceof GramJs.UpdatePinnedChannelMessages + ) { + const peer = update instanceof GramJs.UpdatePinnedMessages + ? update.peer + : { channelId: update.channelId } as GramJs.PeerChannel; + const chatId = getApiChatIdFromMtpPeer(peer); + + onUpdate({ + '@type': 'updatePinnedIds', + chatId, + messageIds: update.messages, + isPinned: update.pinned, + }); + } else if ( + update instanceof GramJs.UpdateNotifySettings + && update.peer instanceof GramJs.NotifyPeer + ) { + const { silent, muteUntil } = update.notifySettings; + + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer(update.peer.peer), + chat: { + isMuted: silent || (typeof muteUntil === 'number' && Date.now() < muteUntil * 1000), + }, + }); + } else if ( + update instanceof GramJs.UpdateUserTyping + || update instanceof GramJs.UpdateChatUserTyping + ) { + const id = update instanceof GramJs.UpdateUserTyping + ? update.userId + : getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat); + + onUpdate({ + '@type': 'updateChatTypingStatus', + id, + typingStatus: buildChatTypingStatus(update), + }); + } else if (update instanceof GramJs.UpdateChannelUserTyping) { + const id = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel); + + onUpdate({ + '@type': 'updateChatTypingStatus', + id, + typingStatus: buildChatTypingStatus(update), + }); + } else if (update instanceof GramJs.UpdateChannel) { + const { _entities } = update; + if (!_entities) { + return; + } + + const channel = _entities.find((e): e is GramJs.Channel | GramJs.ChannelForbidden => ( + e instanceof GramJs.Channel || e instanceof GramJs.ChannelForbidden + )); + + if (channel instanceof GramJs.Channel) { + const chat = buildApiChatFromPreview(channel); + if (chat) { + onUpdate({ + '@type': 'updateChat', + id: chat.id, + chat, + }); + + onUpdate({ + '@type': chat.isNotJoined ? 'updateChatLeave' : 'updateChatJoin', + id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel), + }); + } + } else if (channel instanceof GramJs.ChannelForbidden) { + const chatId = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel); + + onUpdate({ + '@type': 'updateChat', + id: chatId, + chat: { + isRestricted: true, + }, + }); + + onUpdate({ + '@type': 'updateChatLeave', + id: chatId, + }); + } else if (_entities.length === 0) { + // The link to the discussion group may have been changed. + // No corresponding update available at this moment https://core.telegram.org/type/Updates + onUpdate({ + '@type': 'resetMessages', + id: getApiChatIdFromMtpPeer({ chatId: update.channelId } as GramJs.PeerChat), + }); + } + } else if ( + update instanceof GramJs.UpdateDialogUnreadMark + && update.peer instanceof GramJs.DialogPeer + ) { + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer(update.peer.peer), + chat: { + hasUnreadMark: update.unread, + }, + }); + } else if (update instanceof GramJs.UpdateChatDefaultBannedRights) { + onUpdate({ + '@type': 'updateChat', + id: getApiChatIdFromMtpPeer(update.peer), + chat: { + defaultBannedRights: omitVirtualClassFields(update.defaultBannedRights), + }, + }); + + // Users + } else if (update instanceof GramJs.UpdateUserStatus) { + const { userId, status } = update; + + onUpdate({ + '@type': 'updateUserStatus', + userId, + status: buildApiUserStatus(status), + }); + } else if (update instanceof GramJs.UpdateUserName) { + const updatedUser = localDb.users[update.userId]; + const user = updatedUser && updatedUser.mutualContact && !updatedUser.self + ? pick(update, ['username']) + : pick(update, ['firstName', 'lastName', 'username']); + + onUpdate({ + '@type': 'updateUser', + id: update.userId, + user, + }); + } else if (update instanceof GramJs.UpdateUserPhoto) { + const { userId, photo } = update; + const avatarHash = buildAvatarHash(photo); + + if (localDb.users[userId]) { + localDb.users[userId].photo = photo; + } + + onUpdate({ + '@type': 'updateUser', + id: userId, + user: { avatarHash }, + }); + } else if (update instanceof GramJs.UpdateUserPhone) { + const { userId, phone } = update; + + onUpdate({ + '@type': 'updateUser', + id: userId, + user: { phoneNumber: phone }, + }); + } else if (update instanceof GramJs.UpdatePeerSettings) { + const { _entities } = update; + if (!_entities) { + return; + } + + if (_entities && _entities.length) { + _entities + .filter((e) => e instanceof GramJs.User && !e.contact) + .forEach((user) => { + onUpdate({ + '@type': 'deleteUser', + id: user.id, + }); + }); + + _entities + .filter((e) => e instanceof GramJs.User && e.contact) + .map(buildApiUser) + .forEach((user) => { + if (!user) { + return; + } + + onUpdate({ + '@type': 'updateUser', + id: user.id, + user, + }); + }); + } + + // Settings + } else if (update instanceof GramJs.UpdateNotifySettings) { + const { + notifySettings: { + showPreviews, silent, muteUntil, + }, + peer: { className }, + } = update; + + const peerType = className === 'NotifyUsers' + ? 'contact' + : (className === 'NotifyChats' + ? 'group' + : (className === 'NotifyBroadcasts' + ? 'broadcast' + : undefined + ) + ); + + if (!peerType) { + return; + } + + onUpdate({ + '@type': 'updateNotifySettings', + peerType, + isSilent: Boolean(silent || (typeof muteUntil === 'number' && Date.now() < muteUntil * 1000)), + isShowPreviews: Boolean(showPreviews), + }); + } else if (update instanceof GramJs.UpdatePeerBlocked) { + onUpdate({ + '@type': 'updatePeerBlocked', + id: getApiChatIdFromMtpPeer(update.peerId), + isBlocked: update.blocked, + }); + } else if (update instanceof GramJs.UpdatePrivacy) { + const key = buildPrivacyKey(update.key); + if (key) { + onUpdate({ + '@type': 'updatePrivacy', + key, + rules: buildPrivacyRules(update.rules), + }); + } + + // Misc + } else if (update instanceof GramJs.UpdateContactsReset) { + onUpdate({ '@type': 'updateResetContactList' }); + } else if (update instanceof GramJs.UpdateFavedStickers) { + onUpdate({ '@type': 'updateFavoriteStickers' }); + } else if (DEBUG) { + const params = typeof update === 'object' && 'className' in update ? update.className : update; + // eslint-disable-next-line no-console + console.warn('[GramJs/updater] Unexpected update:', params); + } +} diff --git a/src/api/gramjs/worker/__mocks__/provider.ts b/src/api/gramjs/worker/__mocks__/provider.ts new file mode 100644 index 000000000..d4ef03c26 --- /dev/null +++ b/src/api/gramjs/worker/__mocks__/provider.ts @@ -0,0 +1 @@ +export * from '../../provider'; diff --git a/src/api/gramjs/worker/provider.ts b/src/api/gramjs/worker/provider.ts new file mode 100644 index 000000000..01ca0d518 --- /dev/null +++ b/src/api/gramjs/worker/provider.ts @@ -0,0 +1,129 @@ +import Worker from 'worker-loader!./worker'; + +import { ApiOnProgress, OnApiUpdate } from '../../types'; +import { Methods, MethodArgs, MethodResponse } from '../methods/types'; +import { WorkerMessageEvent, ThenArg, OriginRequest } from './types'; + +import { DEBUG } from '../../../config'; +import generateIdFor from '../../../util/generateIdFor'; + +type RequestStates = { + messageId: string; + resolve: Function; + reject: Function; + callback?: AnyToVoidFunction; +}; + +let worker: Worker; +const requestStates = new Map(); +const requestStatesByCallback = new Map(); + +// TODO Re-use `util/WorkerConnector.ts` + +export function initApi(onUpdate: OnApiUpdate, sessionId = '') { + if (!worker) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START LOAD WORKER'); + } + + worker = new Worker(); + subscribeToWorker(onUpdate); + } + + return makeRequest({ + type: 'initApi', + args: [sessionId], + }); +} + +export function callApi(fnName: T, ...args: MethodArgs) { + if (!worker) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn('API is not initialized'); + } + + return undefined; + } + + return makeRequest({ + type: 'callMethod', + name: fnName, + args, + }) as MethodResponse; +} + +export function cancelApiProgress(progressCallback: ApiOnProgress) { + progressCallback.isCanceled = true; + + const { messageId } = requestStatesByCallback.get(progressCallback) || {}; + if (!messageId) { + return; + } + + worker.postMessage({ + type: 'cancelProgress', + messageId, + }); +} + +function subscribeToWorker(onUpdate: OnApiUpdate) { + worker.addEventListener('message', ({ data }: WorkerMessageEvent) => { + if (data.type === 'update') { + onUpdate(data.update); + } else if (data.type === 'methodResponse') { + const requestState = requestStates.get(data.messageId); + if (requestState) { + if (data.error) { + requestState.reject(data.error); + } else { + requestState.resolve(data.response); + } + } + } else if (data.type === 'methodCallback') { + const requestState = requestStates.get(data.messageId); + if (requestState && requestState.callback) { + requestState.callback(...data.callbackArgs); + } + } else if (data.type === 'unhandledError') { + throw data.error; + } + }); +} + +function makeRequest(message: OriginRequest) { + const messageId = generateIdFor(requestStates); + const payload: OriginRequest = { + messageId, + ...message, + }; + + const requestState = { messageId } as RequestStates; + + // Re-wrap type because of `postMessage` + const promise: Promise>> = new Promise((resolve, reject) => { + Object.assign(requestState, { resolve, reject }); + }); + + if (typeof payload.args[1] === 'function') { + const callback = payload.args.pop() as AnyToVoidFunction; + requestState.callback = callback; + requestStatesByCallback.set(callback, requestState); + } + + requestStates.set(messageId, requestState); + promise + .catch(() => undefined) + .finally(() => { + requestStates.delete(messageId); + + if (requestState.callback) { + requestStatesByCallback.delete(requestState.callback); + } + }); + + worker.postMessage(payload); + + return promise; +} diff --git a/src/api/gramjs/worker/types.ts b/src/api/gramjs/worker/types.ts new file mode 100644 index 000000000..a10075da3 --- /dev/null +++ b/src/api/gramjs/worker/types.ts @@ -0,0 +1,45 @@ +import { ApiUpdate } from '../../types'; +import { Methods, MethodArgs, MethodResponse } from '../methods/types'; + +export type ThenArg = T extends Promise ? U : T; + +export type WorkerMessageData = { + type: 'update'; + update: ApiUpdate; +} | { + type: 'methodResponse'; + messageId: string; + response?: ThenArg>; + error?: { message: string }; +} | { + type: 'methodCallback'; + messageId: string; + callbackArgs: any[]; +} | { + type: 'unhandledError'; + error?: { message: string }; +}; + +export interface WorkerMessageEvent { + data: WorkerMessageData; +} + +export type OriginRequest = { + type: 'initApi'; + messageId?: string; + args: [string]; +} | { + type: 'callMethod'; + messageId?: string; + name: keyof Methods; + args: MethodArgs; +}; + +export type OriginMessageData = OriginRequest | { + type: 'cancelProgress'; + messageId: string; +}; + +export interface OriginMessageEvent { + data: OriginMessageData; +} diff --git a/src/api/gramjs/worker/worker.ts b/src/api/gramjs/worker/worker.ts new file mode 100644 index 000000000..60d078cdf --- /dev/null +++ b/src/api/gramjs/worker/worker.ts @@ -0,0 +1,117 @@ +import { ApiOnProgress, ApiUpdate } from '../../types'; +import { OriginMessageEvent, WorkerMessageData } from './types'; + +import { DEBUG } from '../../../config'; +import { initApi, callApi, cancelApiProgress } from '../provider'; + +declare const self: WorkerGlobalScope; + +handleErrors(); + +// TODO Re-use `util/createWorkerInterface.ts` + +const callbackState = new Map(); + +if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH LOAD WORKER'); +} + +onmessage = async (message: OriginMessageEvent) => { + const { data } = message; + + switch (data.type) { + case 'initApi': { + await initApi(onUpdate, data.args[0]); + break; + } + case 'callMethod': { + const { messageId, name, args } = data; + try { + if (messageId) { + const callback = (...callbackArgs: any[]) => { + const lastArg = callbackArgs[callbackArgs.length - 1]; + + sendToOrigin({ + type: 'methodCallback', + messageId, + callbackArgs, + }, lastArg instanceof ArrayBuffer ? lastArg : undefined); + }; + + callbackState.set(messageId, callback); + + args.push(callback as never); + } + + const response = await callApi(name, ...args); + const { arrayBuffer } = (typeof response === 'object' && 'arrayBuffer' in response && response) || {}; + + if (messageId) { + sendToOrigin({ + type: 'methodResponse', + messageId, + response, + }, arrayBuffer); + } + } catch (error) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(error); + } + + if (messageId) { + sendToOrigin({ + type: 'methodResponse', + messageId, + error: { message: error.message }, + }); + } + } + + if (messageId) { + callbackState.delete(messageId); + } + + break; + } + case 'cancelProgress': { + const callback = callbackState.get(data.messageId); + if (callback) { + cancelApiProgress(callback); + } + + break; + } + } +}; + +function handleErrors() { + // eslint-disable-next-line no-restricted-globals + self.onerror = (e) => { + // eslint-disable-next-line no-console + console.error(e); + sendToOrigin({ type: 'unhandledError', error: { message: e.message || 'Uncaught exception in worker' } }); + }; + // eslint-disable-next-line no-restricted-globals + self.addEventListener('unhandledrejection', (e) => { + // eslint-disable-next-line no-console + console.error(e); + sendToOrigin({ type: 'unhandledError', error: { message: e.reason || 'Uncaught rejection in worker' } }); + }); +} + +function onUpdate(update: ApiUpdate) { + sendToOrigin({ + type: 'update', + update, + }); +} + +function sendToOrigin(data: WorkerMessageData, arrayBuffer?: ArrayBuffer) { + if (arrayBuffer) { + postMessage(data, [arrayBuffer]); + } else { + postMessage(data); + } +} diff --git a/src/api/types/chats.ts b/src/api/types/chats.ts new file mode 100644 index 000000000..0d99c068b --- /dev/null +++ b/src/api/types/chats.ts @@ -0,0 +1,140 @@ +import { ApiMessage } from './messages'; + +type ApiChatType = ( + 'chatTypePrivate' | 'chatTypeSecret' | + 'chatTypeBasicGroup' | 'chatTypeSuperGroup' | + 'chatTypeChannel' +); + +export interface ApiChat { + id: number; + folderId?: number; + type: ApiChatType; + title?: string; + hasUnreadMark?: boolean; + lastMessage?: ApiMessage; + lastReadOutboxMessageId?: number; + lastReadInboxMessageId?: number; + unreadCount?: number; + unreadMentionsCount?: number; + isVerified?: boolean; + isMuted?: boolean; + isSignaturesShown?: boolean; + hasPrivateLink?: boolean; + accessHash?: string; + isMin?: boolean; + avatarHash?: string; + username?: string; + membersCount?: number; + joinDate?: number; + isSupport?: boolean; + + // Current user permissions + isNotJoined?: boolean; + isCreator?: boolean; + isRestricted?: boolean; + restrictionReason?: ApiRestrictionReason; + adminRights?: ApiChatAdminRights; + currentUserBannedRights?: ApiChatBannedRights; + defaultBannedRights?: ApiChatBannedRights; + + migratedTo?: { + chatId: number; + accessHash?: string; + }; + + // Obtained from GetFullChat / GetFullChannel + fullInfo?: ApiChatFullInfo; + // Obtained from GetOnlines + onlineCount?: number; + // Obtained with UpdateUserTyping or UpdateChatUserTyping updates + typingStatus?: ApiTypingStatus; +} + +export interface ApiTypingStatus { + userId?: number; + action: string; + timestamp: number; +} + +export interface ApiChatFullInfo { + about?: string; + members?: ApiChatMember[]; + kickedMembers?: ApiChatMember[]; + adminMembers?: ApiChatMember[]; + canViewMembers?: boolean; + isPreHistoryHidden?: boolean; + inviteLink?: string; + slowMode?: { + seconds: number; + nextSendDate?: number; + }; + migratedFrom?: { + chatId: number; + maxMessageId?: number; + }; + linkedChatId?: number; +} + +export interface ApiChatMember { + userId: number; + inviterId?: number; + joinedDate?: number; + kickedByUserId?: number; + promotedByUserId?: number; + bannedRights?: ApiChatBannedRights; + adminRights?: ApiChatAdminRights; + customTitle?: string; + isAdmin?: true; + isOwner?: true; +} + +export interface ApiChatAdminRights { + changeInfo?: true; + postMessages?: true; + editMessages?: true; + deleteMessages?: true; + banUsers?: true; + inviteUsers?: true; + pinMessages?: true; + addAdmins?: true; + anonymous?: true; +} + +export interface ApiChatBannedRights { + viewMessages?: true; + sendMessages?: true; + sendMedia?: true; + sendStickers?: true; + sendGifs?: true; + sendGames?: true; + sendInline?: true; + embedLinks?: true; + sendPolls?: true; + changeInfo?: true; + inviteUsers?: true; + pinMessages?: true; +} + +export interface ApiRestrictionReason { + reason: string; + text: string; +} + +export interface ApiChatFolder { + id: number; + title: string; + description?: string; + emoticon?: string; + contacts?: true; + nonContacts?: true; + groups?: true; + channels?: true; + bots?: true; + excludeMuted?: true; + excludeRead?: true; + excludeArchived?: true; + pinnedChatIds?: number[]; + includedChatIds: number[]; + excludedChatIds: number[]; +} diff --git a/src/api/types/index.ts b/src/api/types/index.ts new file mode 100644 index 000000000..568e25676 --- /dev/null +++ b/src/api/types/index.ts @@ -0,0 +1,58 @@ +import { ApiDocument } from './messages'; + +export * from './users'; +export * from './chats'; +export * from './messages'; +export * from './updates'; +export * from './media'; +export * from './payments'; +export * from './settings'; + +export interface ApiOnProgress { + ( + progress: number, // Float between 0 and 1. + ...args: any[] + ): void; + + isCanceled?: boolean; + acceptsBuffer?: boolean; +} + +export interface ApiAttachment { + blobUrl: string; + filename: string; + mimeType: string; + size: number; + quick?: { + width: number; + height: number; + duration?: number; + }; + voice?: { + duration: number; + waveform: number[]; + }; + previewBlobUrl?: string; +} + +export interface ApiWallpaper { + slug: string; + document: ApiDocument; +} + +export interface ApiSession { + hash: string; + isCurrent: boolean; + isOfficialApp: boolean; + isPasswordPending: boolean; + deviceModel: string; + platform: string; + systemVersion: string; + appName: string; + appVersion: string; + dateCreated: number; + dateActive: number; + ip: string; + country: string; + region: string; +} diff --git a/src/api/types/media.ts b/src/api/types/media.ts new file mode 100644 index 000000000..0ca5c6521 --- /dev/null +++ b/src/api/types/media.ts @@ -0,0 +1,13 @@ +// We cache avatars as Data URI for faster initial load +// and messages media as Blob for smaller size. +export enum ApiMediaFormat { + DataUri, + BlobUrl, + Lottie, + Progressive, + Stream, +} + +export type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer; +export type ApiPreparedMedia = string | AnyLiteral; +export type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string; diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts new file mode 100644 index 000000000..26e0a8961 --- /dev/null +++ b/src/api/types/messages.ts @@ -0,0 +1,272 @@ +export interface ApiPhotoSize { + type: 's' | 'm' | 'x' | 'y' | 'z'; + width: number; + height: number; +} + +export interface ApiThumbnail { + dataUri: string; + height: number; + width: number; +} + +export interface ApiPhoto { + thumbnail?: ApiThumbnail; + sizes: ApiPhotoSize[]; + blobUrl?: string; +} + +export interface ApiSticker { + id: string; + stickerSetId: string; + stickerSetAccessHash: string; + emoji: string; + isAnimated: boolean; + width?: number; + height?: number; + thumbnail?: ApiThumbnail; + isPreloadedGlobally?: boolean; +} + +export interface ApiStickerSet { + archived?: true; + isAnimated?: true; + installedDate?: number; + id: string; + accessHash: string; + title: string; + hasThumbnail?: boolean; + count: number; + hash: number; + stickers?: ApiSticker[]; + packs?: Record; + covers?: ApiSticker[]; +} + +export interface ApiVideo { + id: string; + mimeType: string; + duration: number; + fileName: string; + width?: number; + height?: number; + supportsStreaming?: boolean; + isRound?: boolean; + isGif?: boolean; + thumbnail?: ApiThumbnail; + blobUrl?: string; + size: number; +} + +export interface ApiAudio { + size: number; + mimeType: string; + fileName: string; + duration: number; + performer?: string; + title?: string; +} + +export interface ApiVoice { + duration: number; + waveform?: number[]; +} + +export interface ApiDocument { + id?: string; + fileName: string; + size: number; + timestamp?: number; + mimeType: string; + thumbnail?: ApiThumbnail; + previewBlobUrl?: string; +} + +export interface ApiContact { + firstName: string; + lastName: string; + phoneNumber: string; + userId: number; +} + +export interface ApiPollAnswer { + text: string; + option: string; +} + +export interface ApiPollResult { + isChosen?: true; + isCorrect?: true; + option: string; + votersCount: number; +} + +export interface ApiPoll { + id: string; + summary: { + closed?: true; + isPublic?: true; + multipleChoice?: true; + quiz?: true; + question: string; + answers: ApiPollAnswer[]; + closePeriod?: number; + closeDate?: number; + }; + results: { + results?: ApiPollResult[]; + totalVoters?: number; + recentVoterIds?: number[]; + solution?: string; + solutionEntities?: ApiMessageEntity[]; + }; +} + +export interface ApiInvoice { + text: string; + title: string; + photoUrl?: string; + description?: string; + receiptMsgId?: number; +} + +export type ApiNewPoll = { + summary: ApiPoll['summary']; + quiz?: { + correctAnswers: string[]; + solution?: string; + solutionEntities?: ApiMessageEntity[]; + }; +}; + +export interface ApiAction { + text: string; + targetUserId?: number; + targetChatId?: number; + type: 'historyClear' | 'other'; +} + +export interface ApiWebPage { + id: number; + url: string; + displayUrl: string; + siteName?: string; + title?: string; + description?: string; + photo?: ApiPhoto; + hasDocument?: true; +} + +export interface ApiMessageForwardInfo { + isChannelPost: boolean; + isLinkedChannelPost?: boolean; + fromChatId?: number; + senderUserId?: number; + fromMessageId?: number; + hiddenUserName?: string; + adminTitle?: string; +} + +export interface ApiMessageEntity { + type: string; + offset: number; + length: number; + userId?: number; + url?: string; +} + +export enum ApiMessageEntityTypes { + Bold = 'MessageEntityBold', + Blockquote = 'MessageEntityBlockquote', + BotCommand = 'MessageEntityBotCommand', + Cashtag = 'MessageEntityCashtag', + Code = 'MessageEntityCode', + Email = 'MessageEntityEmail', + Hashtag = 'MessageEntityHashtag', + Italic = 'MessageEntityItalic', + MentionName = 'MessageEntityMentionName', + Mention = 'MessageEntityMention', + Phone = 'MessageEntityPhone', + Pre = 'MessageEntityPre', + Strike = 'MessageEntityStrike', + TextUrl = 'MessageEntityTextUrl', + Url = 'MessageEntityUrl', + Underline = 'MessageEntityUnderline', + Unknown = 'MessageEntityUnknown', +} + +export interface ApiFormattedText { + text: string; + entities?: ApiMessageEntity[]; +} + +export interface ApiMessage { + id: number; + chatId: number; + content: { + text?: ApiFormattedText; + photo?: ApiPhoto; + video?: ApiVideo; + document?: ApiDocument; + sticker?: ApiSticker; + contact?: ApiContact; + poll?: ApiPoll; + action?: ApiAction; + webPage?: ApiWebPage; + audio?: ApiAudio; + voice?: ApiVoice; + invoice?: ApiInvoice; + }; + date: number; + isOutgoing: boolean; + senderId?: number; + replyToMessageId?: number; + replyToTopMessageId?: number; + sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed'; + forwardInfo?: ApiMessageForwardInfo; + isDeleting?: boolean; + previousLocalId?: number; + views?: number; + isEdited?: boolean; + isMediaUnread?: boolean; + groupedId?: string; + isInAlbum?: boolean; + hasUnreadMention?: boolean; + inlineButtons?: ApiKeyboardButtons; + keyboardButtons?: ApiKeyboardButtons; + viaBotId?: number; + threadInfo?: ApiThreadInfo; + adminTitle?: string; + isScheduled?: boolean; + shouldHideKeyboardButtons?: boolean; +} + +export interface ApiThreadInfo { + threadId: number; + chatId: number; + topMessageId?: number; + originChannelId?: number; + messagesCount: number; + lastMessageId?: number; + lastReadInboxMessageId?: number; + recentReplierIds?: number[]; +} + +export type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed'; + +export interface ApiKeyboardButton { + type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED'; + text: string; + messageId: number; + value?: string; +} + +export type ApiKeyboardButtons = ApiKeyboardButton[][]; + +export type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio'; +export type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice'; + +export const MAIN_THREAD_ID = -1; + +// `Symbol` can not be transferred from worker +export const MESSAGE_DELETED = 'MESSAGE_DELETED'; diff --git a/src/api/types/payments.ts b/src/api/types/payments.ts new file mode 100644 index 000000000..4f8d1460e --- /dev/null +++ b/src/api/types/payments.ts @@ -0,0 +1,60 @@ +export interface ApiShippingAddress { + streetLine1: string; + streetLine2: string; + city: string; + state: string; + countryIso2: string; + postCode: string; +} + +export interface ApiPaymentSavedInfo { + name?: string; + phone?: string; + email?: string; + shippingAddress?: ApiShippingAddress; +} + +export interface ApiPaymentForm { + canSaveCredentials?: boolean; + passwordMissing?: boolean; + providerId: number; + nativeProvider?: string; + savedInfo: any; + invoice: { + test?: boolean; + nameRequested?: boolean; + phoneRequested?: boolean; + emailRequested?: boolean; + shippingAddressRequested?: boolean; + flexible?: boolean; + phoneToProvider?: boolean; + emailToProvider?: boolean; + currency?: string; + prices?: ApiLabeledPrice[]; + }; + nativeParams: { + needCardholderName: boolean; + needCountry: boolean; + needZip: boolean; + publishableKey: string; + }; +} + +export interface ApiLabeledPrice { + label: string; + amount: number; +} + +export interface ApiReceipt { + currency: string; + prices: ApiLabeledPrice[]; + info?: { + shippingAddress?: ApiShippingAddress; + phone?: string; + name?: string; + }; + totalAmount: number; + credentialsTitle: string; + shippingPrices?: ApiLabeledPrice[]; + shippingMethod?: string; +} diff --git a/src/api/types/settings.ts b/src/api/types/settings.ts new file mode 100644 index 000000000..e7d8d754f --- /dev/null +++ b/src/api/types/settings.ts @@ -0,0 +1,26 @@ +export interface ApiLanguage { + official?: true; + rtl?: true; + beta?: true; + name: string; + nativeName: string; + langCode: string; + baseLangCode?: string; + pluralCode: string; + stringsCount: number; + translatedCount: number; + translationsUrl: string; +} + +export interface ApiLangString { + key: string; + value?: string; + zeroValue?: string; + oneValue?: string; + twoValue?: string; + fewValue?: string; + manyValue?: string; + otherValue?: string; +} + +export type ApiLangPack = Record; diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts new file mode 100644 index 000000000..2bee273bc --- /dev/null +++ b/src/api/types/updates.ts @@ -0,0 +1,366 @@ +import { + ApiChat, + ApiChatFullInfo, + ApiTypingStatus, + ApiChatMember, + ApiChatFolder, +} from './chats'; +import { + ApiMessage, ApiPoll, ApiStickerSet, ApiThreadInfo, +} from './messages'; +import { ApiUser, ApiUserFullInfo, ApiUserStatus } from './users'; + +export type ApiUpdateReady = { + '@type': 'updateApiReady'; +}; + +export type ApiUpdateAuthorizationStateType = ( + 'authorizationStateLoggingOut' | + 'authorizationStateWaitPhoneNumber' | + 'authorizationStateWaitCode' | + 'authorizationStateWaitPassword' | + 'authorizationStateWaitRegistration' | + 'authorizationStateReady' | + 'authorizationStateClosing' | + 'authorizationStateClosed' | + 'authorizationStateWaitQrCode' +); + +export type ApiUpdateConnectionStateType = ( + 'connectionStateConnecting' | + 'connectionStateReady' | + 'connectionStateBroken' +); + +export type ApiUpdateAuthorizationState = { + '@type': 'updateAuthorizationState'; + authorizationState: ApiUpdateAuthorizationStateType; + sessionId?: string; + isCodeViaApp?: boolean; + hint?: string; + qrCode?: { token: string; expires: number }; +}; + +export type ApiUpdateAuthorizationError = { + '@type': 'updateAuthorizationError'; + message: string; +}; + +export type ApiUpdateConnectionState = { + '@type': 'updateConnectionState'; + connectionState: ApiUpdateConnectionStateType; +}; + +export type ApiUpdateCurrentUser = { + '@type': 'updateCurrentUser'; + currentUser: ApiUser; +}; + +export type ApiUpdateChat = { + '@type': 'updateChat'; + id: number; + chat: Partial; +}; + +export type ApiUpdateChatJoin = { + '@type': 'updateChatJoin'; + id: number; +}; + +export type ApiUpdateChatLeave = { + '@type': 'updateChatLeave'; + id: number; +}; + +export type ApiUpdateChatInbox = { + '@type': 'updateChatInbox'; + id: number; + chat: Partial; +}; + +export type ApiUpdateChatTypingStatus = { + '@type': 'updateChatTypingStatus'; + id: number; + typingStatus: ApiTypingStatus | undefined; +}; + +export type ApiUpdateChatFullInfo = { + '@type': 'updateChatFullInfo'; + id: number; + fullInfo: Partial; +}; + +export type ApiUpdateChatMembers = { + '@type': 'updateChatMembers'; + id: number; + replacedMembers?: ApiChatMember[]; + addedMember?: ApiChatMember; + deletedMemberId?: number; +}; + +export type ApiUpdatePinnedChatIds = { + '@type': 'updatePinnedChatIds'; + ids: number[]; + folderId?: number; +}; + +export type ApiUpdateChatListType = { + '@type': 'updateChatListType'; + id: number; + folderId: number; +}; + +export type ApiUpdateChatPinned = { + '@type': 'updateChatPinned'; + id: number; + isPinned: boolean; +}; + +export type ApiUpdateChatFolder = { + '@type': 'updateChatFolder'; + id: number; + folder: ApiChatFolder | undefined; +}; + +export type ApiUpdateChatFoldersOrder = { + '@type': 'updateChatFoldersOrder'; + orderedIds: number[]; +}; + +export type ApiUpdateRecommendedChatFolders = { + '@type': 'updateRecommendedChatFolders'; + folders: ApiChatFolder[]; +}; + +export type ApiUpdateNewScheduledMessage = { + '@type': 'newScheduledMessage'; + chatId: number; + id: number; + message: Partial; +}; + +export type ApiUpdateNewMessage = { + '@type': 'newMessage'; + chatId: number; + id: number; + message: Partial; +}; + +export type ApiUpdateMessage = { + '@type': 'updateMessage'; + chatId: number; + id: number; + message: Partial; +}; + +export type ApiUpdateScheduledMessage = { + '@type': 'updateScheduledMessage'; + chatId: number; + id: number; + message: Partial; +}; + +export type ApiUpdatePinnedMessageIds = { + '@type': 'updatePinnedIds'; + chatId: number; + isPinned?: boolean; + messageIds: number[]; +}; + +export type ApiUpdateThreadInfo = { + '@type': 'updateThreadInfo'; + chatId: number; + threadId: number; + threadInfo: Partial; +}; + +export type ApiUpdateScheduledMessageSendSucceeded = { + '@type': 'updateScheduledMessageSendSucceeded'; + chatId: number; + localId: number; + message: ApiMessage; +}; + +export type ApiUpdateMessageSendSucceeded = { + '@type': 'updateMessageSendSucceeded'; + chatId: number; + localId: number; + message: ApiMessage; +}; + +export type ApiUpdateMessageSendFailed = { + '@type': 'updateMessageSendFailed'; + chatId: number; + localId: number; + sendingState: { + '@type': 'messageSendingStateFailed'; + }; +}; + +export type ApiUpdateCommonBoxMessages = { + '@type': 'updateCommonBoxMessages'; + ids: number[]; + messageUpdate: Partial; +}; + +export type ApiUpdateChannelMessages = { + '@type': 'updateChannelMessages'; + channelId: number; + ids: number[]; + messageUpdate: Partial; +}; + +export type ApiUpdateMessagePoll = { + '@type': 'updateMessagePoll'; + pollId: string; + pollUpdate: Partial; +}; + +export type ApiUpdateMessagePollVote = { + '@type': 'updateMessagePollVote'; + pollId: string; + userId: number; + options: string[]; +}; + +export type ApiUpdateDeleteMessages = { + '@type': 'deleteMessages'; + ids: number[]; + chatId?: number; +}; + +export type ApiUpdateDeleteScheduledMessages = { + '@type': 'deleteScheduledMessages'; + ids: number[]; + chatId?: number; +}; + +export type ApiUpdateDeleteHistory = { + '@type': 'deleteHistory'; + chatId: number; +}; + +export type ApiUpdateResetMessages = { + '@type': 'resetMessages'; + id: number; +}; + +export type ApiDeleteUser = { + '@type': 'deleteUser'; + id: number; +}; + +export type ApiUpdateUser = { + '@type': 'updateUser'; + id: number; + user: Partial; +}; + +export type ApiUpdateUserStatus = { + '@type': 'updateUserStatus'; + userId: number; + status: ApiUserStatus; +}; + +export type ApiUpdateUserFullInfo = { + '@type': 'updateUserFullInfo'; + id: number; + fullInfo: Partial; +}; + +export type ApiUpdateAvatar = { + '@type': 'updateAvatar'; + chatId: number; + dataUri: string; +}; + +export type ApiUpdateMessageImage = { + '@type': 'updateMessageImage'; + messageId: number; + dataUri: string; +}; + +export type ApiNotification = { + message: string; +}; + +export type ApiError = { + message: string; + isSlowMode?: boolean; + textParams?: Record; +}; + +export type ApiUpdateError = { + '@type': 'error'; + error: ApiError; +}; + +export type ApiUpdateResetContacts = { + '@type': 'updateResetContactList'; +}; + +export type ApiUpdateFavoriteStickers = { + '@type': 'updateFavoriteStickers'; +}; + +export type ApiUpdateStickerSet = { + '@type': 'updateStickerSet'; + id: string; + stickerSet: Partial; +}; + +export type ApiUpdateTwoFaError = { + '@type': 'updateTwoFaError'; + message: string; +}; + +export type ApiUpdateNotifySettings = { + '@type': 'updateNotifySettings'; + peerType: 'contact' | 'group' | 'broadcast'; + isSilent: boolean; + isShowPreviews: boolean; +}; + +export type updateTwoFaStateWaitCode = { + '@type': 'updateTwoFaStateWaitCode'; + length: number; +}; + +export type ApiUpdatePeerBlocked = { + '@type': 'updatePeerBlocked'; + id: number; + isBlocked: boolean; +}; + +export type ApiUpdatePrivacy = { + '@type': 'updatePrivacy'; + key: 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite'; + rules: { + visibility: 'everybody' | 'contacts' | 'nonContacts' | 'nobody'; + allowUserIds: number[]; + allowChatIds: number[]; + blockUserIds: number[]; + blockChatIds: number[]; + }; +}; + +export type ApiUpdate = ( + ApiUpdateReady | + ApiUpdateAuthorizationState | ApiUpdateAuthorizationError | ApiUpdateConnectionState | ApiUpdateCurrentUser | + ApiUpdateChat | ApiUpdateChatInbox | ApiUpdateChatTypingStatus | ApiUpdateChatFullInfo | ApiUpdatePinnedChatIds | + ApiUpdateChatMembers | ApiUpdateChatJoin | ApiUpdateChatLeave | ApiUpdateChatPinned | ApiUpdatePinnedMessageIds | + ApiUpdateChatListType | ApiUpdateChatFolder | ApiUpdateChatFoldersOrder | ApiUpdateRecommendedChatFolders | + ApiUpdateNewMessage | ApiUpdateMessage | ApiUpdateThreadInfo | ApiUpdateCommonBoxMessages | ApiUpdateChannelMessages | + ApiUpdateDeleteMessages | ApiUpdateMessagePoll | ApiUpdateMessagePollVote | ApiUpdateDeleteHistory | + ApiUpdateMessageSendSucceeded | ApiUpdateMessageSendFailed | + ApiDeleteUser | ApiUpdateUser | ApiUpdateUserStatus | ApiUpdateUserFullInfo | + ApiUpdateAvatar | ApiUpdateMessageImage | + ApiUpdateError | ApiUpdateResetContacts | + ApiUpdateFavoriteStickers | ApiUpdateStickerSet | + ApiUpdateNewScheduledMessage | ApiUpdateScheduledMessageSendSucceeded | ApiUpdateScheduledMessage | + ApiUpdateDeleteScheduledMessages | ApiUpdateResetMessages | + ApiUpdateTwoFaError | updateTwoFaStateWaitCode | + ApiUpdateNotifySettings | ApiUpdatePeerBlocked | ApiUpdatePrivacy +); + +export type OnApiUpdate = (update: ApiUpdate) => void; diff --git a/src/api/types/users.ts b/src/api/types/users.ts new file mode 100644 index 000000000..ea7ef8cde --- /dev/null +++ b/src/api/types/users.ts @@ -0,0 +1,37 @@ +export interface ApiUser { + id: number; + isMin: boolean; + isSelf?: true; + isVerified?: true; + isContact?: true; + type: ApiUserType; + firstName?: string; + lastName?: string; + status?: ApiUserStatus; + username: string; + phoneNumber: string; + accessHash?: string; + avatarHash?: string; + + // Obtained from GetFullUser / UserFullInfo + fullInfo?: ApiUserFullInfo; +} + +export interface ApiUserFullInfo { + bio?: string; + commonChatsCount?: number; + botDescription?: string; + pinnedMessageId?: number; + isMuted?: boolean; +} + +export type ApiUserType = 'userTypeBot' | 'userTypeRegular' | 'userTypeDeleted' | 'userTypeUnknown'; + +export interface ApiUserStatus { + type: ( + 'userStatusEmpty' | 'userStatusLastMonth' | 'userStatusLastWeek' | + 'userStatusOffline' | 'userStatusOnline' | 'userStatusRecently' + ); + wasOnline?: number; + expires?: number; +} diff --git a/src/assets/DiscussionGroupsDucks.tgs b/src/assets/DiscussionGroupsDucks.tgs new file mode 100644 index 0000000000000000000000000000000000000000..97f99319211b5fb1dbc681612285393af6238547 GIT binary patch literal 14488 zcmZXbQ;;r9?B-|A*tTt-G0)hxZQHhO+qP}nw%@U5zyIEB?QUPBo}?;wUDcgm5`rj5 zp#M34KyG}r;&9m;PxX*KIHUCMW&7YwF(BsGqp;?Zh#()zeKrzy0*j9{js$*vj$oLZ zm}#1BHC9%3JY2_WCSj6bndxCgy#f4gdcHs2uW+nxe%n4yXDMo;8C|EhWpZwNpgY^& zAAnn&pT~YbN&x?l(`yXH()PFF@6QiT-;1h}_h;JO&r4gM@8>uFuJ7yIT}Qy{-QHBz z9iLzC@1Wk>f#0p~360yY=iAMZ)(nET`|H_vnPZX9%i7+alv?kX$7@WDjo;_oTAkka zNta#U@26XxUV&L2{{+kLsoL+^E%2`g1;cOF?`KQLCrA5(5WFP!7Um+g`qnx7*Lc?f z36J#8ujAR{J$!=gv0vuh;Yirx3|yx7kK^kM^za9O{bFd;Um7dE3dA$Uq3?lkV9YJ= z*6){iC<7NQ#g_5J{@@qD?}19xYjOJ{d^dj-_Kas`(?eqPuj|-EntvRqU9bJrxnorA ze!VQCH^upr>U}Yy##l*HBWDfPqKG+UF_piH%rR2X#^QvVI+HQ~aLh(|c@g)Sk3=t_ z%2S-vDoApH)wua#_dfD?3*oIgqT5}lsj%1@`ed}uF=#J;*}ckHJO=-HR>hpV*3jXfBviI};*?G~OThnncKFoN{IY=Pu(Tx7ps9pi2o_e&!OD6~K> z>ikH_3k6V2t9F(7`8k&hOb(^9PN22tIOZyDTxOaYMiy) zs(c*SxCoeezaV*YnppV1)HrCwo_&)NCT7QyFYs#P03fF(M_n*1SFaIGw8RPqg?gDo zTXPFCP+Ky#32LkPsgyGqCbo@-sBakKbf-q|F;g@Yy@uf{)EfWbZE%#p`wbrJ#ID?o zlSBos1D{3-tSsy+_ZFqQ!AVXu4@>vy-_Fm|sj}bRF=Aw@PrqHC_Y*Y0mx@0Ek#D_`AyT_KLwTJ(t&!4KKP z@6c}we<6V-#4q4vX{hh6%^3iL{uN5Tlr(7-b+|~^=knlFLsZuJ^S)O!#@C0VlNjsw zd$Dtu=jZwMw6(Lw{=E46^K`#QU_$8QsJ|sxh3!>D*9e@-2bdHYOWO*+GgO zJt1|3utC%{U^R2S0ok+x{aX{l>ZIH5PZasWbXLw`Do+&RQA(_{4P3V_I1Y4s&IZh- zo+^>6kPv_@XDt)1PY2$KQoq@{jdK5CWoGPs=&WM@VPXO3MiXQxwkcsRNQdHdATnG_ zwjFhYni8A6QFHc7J-T|y@i+0`+?0^@`^9xWu~TmEdS@L^$?UN=5`4L;jVZ~8Qw%r!ZyLvJ9t?w!ioAFaf4%K=d8)FlW&3op-%R?#7RHC4@~pex4FpVDE(J9S9~WDBN5z98`jy>Fz3XnZw}~?eaHfdo{-vLots16 zZjRl?zoL{?7X#S}XNxK7$i`B+dI0CPbjqdZYesEo;jANLv8}WtYWDGA$%6v_6&(F1 zV9b<2Z{iOI@TsPqHJTZzt~=^&{I^bo)+<|&&smrK@A!|#__BrUUtKV9o5OGV;=7XT zW+UvE1#pm19vB(D55-pOBB|xy5<>mIC*t3cv^y}vM#60 zJ}lDv$OglHEtuPU%M$t0j$4vvL5;&t%A4&U98;=A(RMRV)gUJ>Ewd6)>^sgV>B{B6 zS|fK8J8g%5RDlIGJ=9#G5TDXNkdKc&W{cG}$Cm-=Mi)*VTq%6q8BP?o#v3fhyWXNF zfef~x+GaH4w)$XY)k!A80aPfANF4fzVXPwA;QLg;w_ue{*q5MO1t3I@G+8gafTPS} zX^Y4S5*pdlX6-GLEmZ&X1Jbse!lMC z$D25U@DE?{o)H9%kIuo5mCR8IE#zCw3L@PL3oZ*Q6CNoP3~bf!hCbA$ zsxM8GljD=9?1Z{qqfus~OX?>8yZ*|aq)}w-Wv$=<$5ZQV)Qf26ZaeMOt)=g74+`*u z*^Kz5_Job_v(5MR*cDfFR(+f6WuE8tc2PF>swW!vkYpztL(nje#sYUmV>XC_j<4t2 zwS_a|T3z+q?fy+~eHbkoomD`=Ha(BRE_Ga-TR`CuYaMxPdM=SmHl|pnp}K`zOvWu$ z8krT;e%z+O?lLDkTwvRZtk}n(w+U3eNRQu{r)JumP-7+;bA5)0W9C|lhI{5xnu7bE znv#8Rf{bI~UW$x+_{R(+2NE(H0DPpV>R!|5HNm| zA(dja_Wiy=vtFO`awTw`yCwPWnSDa)LP**-103y)QJe1Gg&Kz0ZTZHZ^hlldh%`!5 zd2WA)DI|cUIGn$D{s!cP&|ScDWnIpq%|Smb9(vLU>Jm@mL>6~b$(8nZRc#-WdhD@S zi@Xf~@T}qo4Z6Hw=B6oHYAYV6(v3EbsJCKHp&M-&(rQJUL^W75{TGz6WfDht#q8Ve z^ZK29VaL1`G+5mMkT)XDW~a@Y#CFxvK_STv$#rLNghV8QY@I5`*{I^eKKy3F+*qpW zlA&O41zOc0>k0g@#Zu}(E%b|u?o$*NQ)N{*wtfjK^L6d2hO=9UUx*}!wJ6z1Zq;67 zj*jIFjK#cUnXylMZ}(c%4>YkVlAE6hirP9SA{d`|#|Q!b)iTn>yvCf#8OEj1A*bW$ zYk*;#aosGi;h2u1+IJs0)E}LIiVONGGA?-Jm=uTI4yOa1J_YYw{6&NW+solSAhi6p zl0fX3ysbiE_C$X-6ipPFvwE*_;(O-dy$$jke&V1G4W&Ni@B8_A+(M|^W=)pnw#y{b zPA5r&SO>{4Wr``y+O!qBR;OD!;+`aRU|~}cs)z~8<*cIOx0O_FBXD&c?JiTXrv}m< zY_z>TYM9P?Yc^cb;45Nyz;Y_NTc=5=5sH&Y`Cj9xCLyMoWyd5 zZ%E47-0mwXih)YX)0cMyppIT=CQm-Fm!>$OO4W4bRS~c*Bp-bK+&?!>Kt#9LUGX%K zy`P3=%c9bs+D9rdi=c-sF@=+QePbq($x=RjVg6w9gWn@lybcJoZmcVe%_NQ4Q{r;? znF``E#lfLUM>#_;iw;eLfIi?OS3tI;Kpm><+WA3Zr6^hsK&!u*lO#(yP5)H%N6f{& zQSpk?B1=A?0L=V@`6r#26HPcB)~>ttM8+mEDEzWWT~BRhfS3T=L+1sBc*n&SJ0gH%$dP$H9`{E6 zh~0Kuii>;V4WAJ@t~Ua_@lhOe0-6ZEG5-XHp>_zV7ECL3S;B8pg?t4!L5GTT0JY+- z|0c}aRaUrXbQ|gBv2D^@8|DLVSbTHGGRgS zrhI3#Q{tU(=5*XnuT{!y@fe-)3_oc6=yhCfI~VtdIC=4 z?y&RTI{ls!iLgzP1NO-RsCm;z9r ztB^R9pmT*#l8r#2?-4pi`y1k1ZLFhQ3+VqYnFT=NM$Uu=wwspet zgo;B9+#p{76i-47|)AG@b%cw7eA;MgpR=*c2(4%Fi?@TkTi&=QY>zeg%Z|Hjbr ztj*Z0;E`-(_7)yLLW&Ufkwgjp(i}!35FKT|XDnI*ZwAssS&*LG)q<_ITJ)+6OIxYuqGW44%2 zJ7LNm?QbmBYYS7_y=x(*+0(fxwF$jOrITDsjR{W)DUN3w-^k(#D(=XIq;3iO_;j@5 z*o>4byUE6ETTwK}HdMPM>BSaH4Rbz%12Th|koCe*z&OI2l!sK_qda?eO*v(`42ZHA zJ2o{LRTTAwJo$4aq$ySK_)sAaHtnk#$OF(i{MEHDu8g5js@1^Cf;o$2$E1};mQ;sT z-s5m725ZB`iL|xvC5l(&&_{&Kr3I^d-XLaK)aq{Mic_1JZ80{-SmrlQgz*cgJly`5*1wTNk})r- zqV&mYTG%3qYX~B{1{%yw6dG&s@>xeL{ev4_P*EsZj9%h8l^w{$ATZ&^U0_SPqQ-=S zowvS7z}!LH`K|38%w6!)5xiGY-ntPyQ>_RCM(GK-q;`xAVf`p6ZT;B;j};IDO9OqL z`#bwz>M8S`NCvTD$#|?(I=C(+t`5u3GLo{ld)-YrHnmy3uwI z|8S$fO$WQyLu05|B}5(!2m9keN$aRuu56G|u+UCnK$DUL+zAI1BFb8<|72M{_G61P zW;uuR(m;iRXh|r*(iBA}5j%AdifVuia%mMlvRIpf+NSQR=K*X;$VE@>I0b@-U79N> zRP6)c@K=5Q%wd#3EDs)=pxFq^m?kxO^H6MY`0{u{9bzbr6QQHF(FtmF{34U|kf6T9 z&c!^}GDYySNZ7D#!^(#GP&KpvmGCgPc3?VDjJPD9uLsV}+Yq&0Ebhj@St*l8?2Jqx z^gzb}rxk$nV8h$0-dHVo~trLP-#(`v^H^s<ag7{lZ4}{{4nfIQBlr`v6F`OD^9~lNAshg>aD5zMN;$DUH#Uf`h~@}VbYSI)-oy$Cr&f{BsfAOamRuiTGD$_2l3~= zv!RH66jYc`F7r+xHU{yaA1z@luv3{;{O~&yDlx-+T^k;Q2EyYh3|uVN$kIDUeMf>_ zLJyt{2+&sqFg&OY%Ni<8B@{PYULR-G9i5ETZWis>+NFI}Juy{Nu>2&MxjpTo?IN7; z212F62L|fd7fvodhq$fT%&Ky9Q?a#c2FHPOmdr_M?C3eoBT=?Z*$aUFfDG2|)(pvASK8r*J_BMgGJZD}C#kBh5 zFcDL7no_6IurgH1DOUMd@Hu=GhLGOEm7QtBP+3{M7)Z^pR_{4JAZQ2 zPZ@VZ3rL*I*rr~lr~y;;KA2hTxqT+Fzfa!?V*$G^sV#G)D4auJLTdOUtB&B!L)LQt zb*xv8=c=KyhoOcLc;nnSv08PnmB%NDxAiY!+B z2lTf`AT91sccZp-*>vi}{sgRG>7~x#s#p|jU=p%z&?YBMjwv=pkcNaOo>-ni@Ja=G zwt%#|PtEYeQIKM{^o8_EJmW=Yez*l$z1pGgr-7ndWmgbjCm*1uUTpdWKEU)8m8cjVD!r@ zb!IC$gH_S2(Sha>%!Zo?);y9)^6@b02iW?wx5^qQp;TiGQY!Iu3V$SOlH%b~@$3fO zG08_t5v!SF(nQ=pskkIR{$CG{!U*;mq=Bu*;lZtgrKyQoU&y7fI`ncBv<%C8v>AWN zQ}WnePnRn8t&tp7Lsb7-WSZP&Ng~ zwbMmOo*;iQzY!Yz1zXP0N-LE|i!q~GlyJmmfRyLPyIsjFDMg+!yh`dI2rXffe&mhSgS4uC21uZaHew=w^>tal)FBk$!Ot0RQD{Vl%l2 zplnQ3sV0$}V5aTWn$1=v?PG04J> z6A-@?RiGVu4=OIVMK%O15Hszb&PAW!M7C_6!BmN+g&>*FIxq3 zzGc&wvmY&Z`Sv23yZcJ`kIj($$7TZlV>A7qoX!ychs{tr&+#_T@qRrmoqaMCi9N5) zqVoF&1uPC!I7lRTWqd|8&}KOKH3-D&K{|eQ+%P=-;q=8kesitbryK_~yAIEd{rSH_S!2=0s^NpQmA$FJr4e zZJ<6s4kEKq4j9Q!c=vUB^1*Z|^EW~RDbJtCdKc+`n)--;vAv-h*iPVot;Pwe0|m%~&g640Q^S3>(M=r2+9vK!`if)G?1n6GTE0 z%89VFe~=}?H6s|z$stD@=}N^TV*gqD+l?1Wy`@9_X}pQIjV&(Io}@sLpj_>MJjg;? zAT2O4PN5om%_3QWrrO#E(o6$$4qTx|tO?BO;gk*rxd<#(lrl~&ELO1CH6|RUb7#S~ zv?SUCXl9p8hRe(uv_lM0br8)1S3uGqFUZmx;$v`NbujU^&S$X#OK`mJ+V&2wV*>B7;)0UKvrU_D8>Mp=GD|C<-s6ckh-oEj!;B#fAWYuu${JcA7$xcT1M5ImVcDzBMQJEP+Rz@NN}v{ zb~CAYNh~Mo`1|KyfCX{FPFZZKiIQu7-_oBZ_D6GW?uQV{t=agRqi1St%m7Kb*iXmEzdz~E*dE}ahA5;-CcC1Cje%Kb&X`Vdbj#2hWh+1lvdog&NK?k<6brr zN0kkIyl8mxv(2+LVcH)c>h$yO(=vF5GQ86kEN4@BQTH&f_>yyV+<$p5D>7FOsOBs{ zId8fKNDPZnCE}D=7dj?L)E$;s8GOB1ZuDuVsv}+t(@9Qz;T-|ppd8w*WH}HQwgP++ zrTH@*pwbvw(CXO+1)-Z%6+ngR$w$y0F|2KolM%@#HVKi-|C?>3ATI_c(t!0CyN%7E zT60eo!aS>Knji90d*j_Bwo{C*K4`Ee#db75F_9t{rxEtkX7G<+Zl-#(f)&Aen1FEf zCNXK$V@o>s#fZBc0>YK0k_&Y}hmoi_MAi#A)aR+*o!$B1-#d^Uhsm0h3_GYIOw7}U zxnA=Jw(tsvL5#*7;R|z>;k1Zt4FSNv=S^x$f@`OW$bxTIV0BOmrJxvs%V*F8 z&pQjb1kJJM|7FQ=8LMC7VZEu@0qz+F5E+#BR}|T_1Vd;&v{(Yd>7cK`QB!jz3?`7y zWPMJ?RN(f0+zIzJZfFY=_ZPL(I0T;oT#~{Ztrezn>^6y z3Z4W|-DH%}^O35nKvfEaOV^y2GMjGU$`u|4)?ULTDiV}kY3br!XjGth*7YpGF&#Ma z!AT-V1Qn&~JLg0k#42Vugd&<_l-NLifmnR6$^w8e+8gNG{G5vK1CWTY)*=}Ew$yG zE5gsY*5gcZ@CBK`X4e%-Df1R2$l@mQ0+YO+KbB+!E_HDcF$v?Xxd`&iY35d!6o*A)4F?Ufc;HWWr0;=#JhIRs0O}{kyzB3N6_bPOyb>U(~rS@ z*4E!{uBqxH*aOJ-XnFNzVMPz1#{8+ay`pdNkBe)5vImB1D8LOI#{ChEzbCW-R?tE2njbuDX4V-p&(pN`zD5J=nKV0W7>R_&G3{Vn zAuO!juD$iKCnaRLiuFD#{IOe0lqDYC9iQ2d^zo!x2$QWd-nlpG`cS6a+^<{%E>CXU zY3)*@QO6Ic95MVIIu`xUH9-n#;LeZH*ab4Moc7nOR#k4gd0gCl0E?xvuf1ZP>Wj{m z3~f%xrG+tYoMav_qirsWimBI;`O(8#peH5Z=_0qy z3EPkpn1tK+hX%(X^PFXkA{9@f%svyz%2rwNdx90@`r?u;krn<1#%SpS$Zm?h6z%>s z(L2k9r?miCkB%5pUCVZwg8hnVTv2Iiu?dC>2>HdS>ucmGCW zDtd}#0aY1!&NNuF+XkVDZcHn(-fPmuQd3?2<-+Uzy%e!Qu$47hbAqa=EhZHd^!QZ8 zJK5sA1mplke;B9DeE;~gLkCUcNM`1w@D(Z+j4v(%O2cOZAI1wZDU#I4z>Em3RESiq zro?O63~a5cAgum55317lGKKDP_r+ZOw^YcG|NY#&YYv!t8tDe zYWMxh%|nXL+vUZ5iq_j@#s9YdX}!10g!jvA#`KUj{D3yu7!XbJD^qeSH^OCNP`lyw zbrkT{>7^p7s-wVtbb@_WAOErtV0tI#2VCGAy1zur;O@Q7)0AZxF*&kFT5m_4Uk+T8 zCNuFx;+xeh$JXF)=fda*|0vTS<#P!x7E=jVs_{fBv>E2J$-xOs2f;egL#C1LxlZjt zNlaiphk3og*R#EZ-|*$~8QW~(BNMV8g1XZd^OzZjfr;a?G4zJXB(4213gz(=w!Dp!I|Sg2w~yvH-ztS*qzs!(uv zC8QgYHwDR|$|D?gXyYG-E4_;O6zrZ7)n9nluRqn(o(v6?8y=*`t*N(E2|O6mu-}~Q zf%Q>U1B2EtVG`AbLXjoS^R31Bkg43_^A%VfFGuuVpLd3)CyAyN<>qG^$9L4JLo~f_ zfU5ZGFi{ z)+UuxbZxkh?5rq3N&MN4ArFTKu(Rt^jm>sJqq zUv*4tJ2YCvd8QuAX=Ib=OQn(3+04o4(uyMFyVBP{1?b>zx!vekl7t70@s>PNUh+#V zKx2Co(v{GJ7HtlwV!m2hdEph>GPF8zf{gKBAX&8W!e(_KD9a&FVDs^kh>xP~fH zO%OV00cR&MkrWy=w5Ww6+#m*NDoVI@gN(S0Vmr%zJ_#!kKSZ%3SAoe3RLw=?rbk72kMgpv@hWjsEk%>O^o2l1 zi-OYU6hWQ#?orC$-1mr$eo5KIW+mkPMRBU}>2--ef6h*<`lY?ND--_KhBXt%>8McZ zIIu#`Ur}Q0OW%gU;Ueq55~tR==fRIn@p+8gLTW906{0g-*S(UA`nUZ|dA+aNzU=Fy zu{_qj&m`(?rTVf=fXgCd;xrCd^^!uZNZGTzVY^w9`?l3(*Xi#|B4wQGqG2uS`5_7VcK%-U?WTPa>@D(b5Lg=p zX4QTK3p?`Tea}om(pX^nk1K+bG2i-D_(2S9sp)KuA_aN&)VLwxEb7=CtW{Eu2UfbziGx!W;#x6DyAecc-&$5W}UJ_ z+vHMi|CxmIIbv#?sGcR5w8H^3&IRs0r0>00XhEx{PlbpX*E+Ro+Fv_E)6jXP4Upzj$1a^?hZh{6f*eSO!5_|bvE$;N0+y6EmO@EyWV zI6FeCBMTCKwF%EKFe%I3WPr325s}iA>%mi2sUejUc~SRE6afoo()R72$SVQjXvv7x z|M1KyU`mzqp+g3@c2p)OGXj5%K?G@sBlf=fKVqV7fELM#aANtT*1<_w>)P*}4Bv~g zyW!hDV3o8@@aCQbz-{WEBSHAMPb|0X~! z{H$`ZL&7yQ4EC7kcRNsk!GTK&PARlLoItU4(wWc5nMTK-2_HR$Nzjnpy=PUdj)hiq&q}45ikho1W(gtr=07rA+HgZ!6pdi zo>X6hsDnZXUb?Xf)FeghQ#JH&0mr7%4AfUq^UjqeOxGk8N5YIQhu>9Z5j1_^BV*P@>_h?Up zx=#nt5264_%@JD^F;OlYg<3UCiUO@*ej#*&3j|kb`oRj8;y*NE4SbWwAeaT3VPz1z zaSy*@G5e2nV@#wD?)0%dy5zFB9@m!x&Mq7#Et;;qEzBD}x9qL(^>>Ki&noP;rdNT9 zA&2s>gH|<%p{bKk1UI9cp!WXtWPTKX^pv;7r9R)c`>V0J*SgpjlcsE|8P|W}4LLct zVEt8Hcl7P;kl2w}iTh1`3o5IMZ-i|xyCJ4yTmCz?Rn=oK0<(-d$U~v6xQ30m=u}q6 z6H%Ns>Z(!T41FhS=x(cTyZb8@a3QAf{^-F@Q;GpypdZEhs+w3Dzt|0p^a=l!vB!~T zoT}X@Ve#9$Xn>M|Y)(Ba=TxrQuuPpkc;5773jZ`fW;{160+% zd5>#bTU-{ayoE4X|D8EDt=?so%(7Ue01}RYZl!BpGO*FbLYpr4=@X`YMrS)uC>u)# zhoYu%V5o>Yv0)n>!73Fqz`9G8pHe;iW1!-$2L?Ft4Om#oIW?+O*G6KIsSzy26# zgaCi$=8)+1Ouy4K(S!V38xm573hyp1zc2sDs019qL&aveU!cs^2_8FiNbnlD{$|Xp z>;wXEe!Z8xpVoNSfEl0ESic_OIyznEv2eV}B>6ih>bqI!iN4ZQo|~aOr~5Labe$DD z&qITpmeJQj=^RAsnk{%b=@~2o@03s>;wQMYLl&Gzu|P+EBGR@UZVT}2CfRfAM}b={ zTXDO2b0rzQ04`S|`gHS2tG zJ1{p}Kwhi0qI_NX^IKPOl2#t&U@8z&PVx^0q9LO)(kHJ`3#!)XO!#7j2>45jHnIZ3 z0BAXBxT|@N$r$HSalWQSKNZ0h4DzXwzS*XR_ht=4mJD0DY2~g>*+yh{B!R8fMS-Jy zPEbD{!zDobSv*OL!Ebmqic|+bK?;L$uieJrug<04p`AgiV_8pw<(;!vHQj5LjZEux z#7vq6KT@%7y4+6d^fI}9k+wRUbX(sj#ev5--idC!h^%vljATTY5ie0$`9qsdVEfXp zdW)N9mG^^hQ_X~HN}6=fM}#r3S)L?R-*b-RfBCBKH+2s&;ze=Xsjt&!(H+WuA@9hN z-emwq6E;cX+T^qlKPimA+$7KX4qB12rYDgpsDcPIvXKn=xJ7V?OC=MnBHA%Bs;E&2 z>x814RoCUdx&5f9Gn}I zf!mZ}A0-+ghNb)DlW|-DvY^^@PT4!Kok1{|?2>};P1uW~3FrdIOnEMeiRH?HM$yXx zDW*mNHp0n#zpaLkq`)UabCSlg@7McPJGrA^iH9q!xj80+k&4vKu(g}g-4v380U0HJ zh_#M`0p&cQa9WkF8B6#1?6v5%qN^x=*bBQNasxBy$k6Q_nCP|LV70VAA;26%5b2sB zUf{4&TSIl9S_ltb(~bKgEttACrdrz7#Co!@6*CoE`Sy!4i(|!~*HCAo>)1}N?@k%^ zwi-1${a6yY6JTps@!@mC_Fi^OvrLQ1T&5<(lt?1Az#Q>y0S98jLt=5!g%*FfS_Rt^ zZtHsEZ4E`@Vc{9to5*;faqyrZ&prM_2wIMLnr9jc53% zWb{U@SBlzGSQ9RCsBsboT)Td5f9Lzt=MI^?$whX64B;TpFD8SO>&=rU)y7<{?pk1p zJA!Ln!65*>rt)ScY2Ft#9_YUDjrCV&&xSR23&$jzoF#iSab0>Q5-Y14m_ z+wT`O;6s=g@LCv{*k`1M2r;+?ab;8_8Wf4!7#F?YA?Lz{2GfPM6>y2C_9)W^Z)k7` zA)9%KV_EvnGebmP8pbgnmNtykNf(k%k=pLZ2T4BNjbX1YrU9X=Ne2lH4I|qJl?^9@ zfg2t66R2s?0~~mG17sUg1}ImW=)=CG|7Pf(V}Y#gBB zPQi9S2Dj}sU2QOBwAqbOO6J(9FY>Yl%8|yvH1|-K$i!{6r7TMUQI4Yaj5jyA(G1&; z#BI?#)fd%h%qr{6*YZ_T4k0Gi; zn0oNGTp3J#8O$Q-<}3fn2r<pN(o!DcUrKFcU6+;f}a1$o}(w*Rk2-jUsw?CCOZn?e!k z;fYG+iSw zR-58W@=AJ|+nWZlCy6E<#u~2I9I@67x0r0&i+!odDO%DR8QaA+Tgf(i!7YIvw8>ik zwr$)Dw^Yr%GoH=*dOI?MW}}T979UT}$>3}bE-?C+j>-$XVdWSu?57%*A5WFrCMt;d z;mcx4QqRkMZW7bl?k`!+RImY-?zp;mVX`Ae>Mj!q+V0O8kCk#Hx-D@-RY&vH|7>bN zWcJAv91PaZrfYqNYd;*;U2w@n$AZmiv65hl_^d=(v!XALjuAIjOc}RbMV1 z)n9TTPv+@EGF15e7gbYTAyIvf8?1E2Jvf#FfH6?rNlkv*lyvLml-*DcPVmYGC*g^4 zWC%4zmQkWRH$9N~I0RaIuWjt^RFM+jjq@Jay|@fSbJW>D>UV#5z{1b+^hiPNoD#4-;!4)Cp5eDD9S)8~sjF6LPlv zu2LsKGrQSL_0X(RF8NjU$m8(QImKP7{9r7EmbW_`mI)H|l{Ql;U+Vxu7ENV7Jxx-$ zH`m(U2e}&}p)nD;5RFb^*?cDh2fo~_I z!gCyww!ZXSnM9x`*2v3pUqu!j177W&?d{@a!NsH@#9>fP$OVCoL(|1Aw)?`msx{s}sK a5_Jy!!h;ox3kCcF{}JcoKb8Ii^uGY!IeX&( literal 0 HcmV?d00001 diff --git a/src/assets/FoldersAll.tgs b/src/assets/FoldersAll.tgs new file mode 100644 index 0000000000000000000000000000000000000000..41b820a74dbacf1a165d1852d6608823dc98b3c4 GIT binary patch literal 13880 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

FTZQ%W#@{FE@)rd@PK&Lv{s^dZlh?`>zn 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 G>Hz>;$2^_@ literal 0 HcmV?d00001 diff --git a/src/assets/FoldersNew.tgs b/src/assets/FoldersNew.tgs new file mode 100644 index 0000000000000000000000000000000000000000..1a60342622a6405461d84077e3554fa9880b43e6 GIT binary patch literal 8460 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 literal 0 HcmV?d00001 diff --git a/src/assets/TwoFactorSetupMonkeyClose.tgs b/src/assets/TwoFactorSetupMonkeyClose.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f16eca5adadee936af9805df17f283377f1ad055 GIT binary patch literal 27931 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 literal 0 HcmV?d00001 diff --git a/src/assets/TwoFactorSetupMonkeyCloseAndPeek.tgs b/src/assets/TwoFactorSetupMonkeyCloseAndPeek.tgs new file mode 100644 index 0000000000000000000000000000000000000000..c6f6cd07ba0a8dad90599fe36c1bc4f387823d1d GIT binary patch literal 28107 zcmZVlQ<&($*0zndG28B*ZQHhO+jh^kZQHhO+qP}n*uB>J-h=Xl_M=iWRIl4Ztd$v1R zJ#Q&F-f!=~+=nwh-;6#P+uwUG?@_iroStuIA3v{qte-DF&n-TmZ!@1CJwM=Iqk9u8 zJFhi8b0Oak6SS{6H*bbM1wUUWdlNMYs@+cX*tb7ZE|1$QXCBNrr$6d~H**;~KLkB2 zS#v8pZ!8{VT6a6t_rKgDn@3^_la_k=pHK94!a zi3-I>g|uFl^iR6OH>a4LB=-$!cLh!*@fR+yPVP&fZfQJETV~p{-Vr|GxMrd~hB7L; zM?dMGu}*Ku7VL>eGDY*tvl%_RDX=2nuXR8FSdyQoX1m7(KfK$kSke>dzjrISgAPqw zzS%lnct3+ogNvg7Y~T2Ne6ap}$nJdB-1z)lus&zlUP1n>c#58Wy{T@e^!!NWywm=C z^?b+Jev{^YO!<5qo$UOcNZ)&7eqvNFLUN9B_STk92i`DsQFHz=4X^I;|L~;w|D5m| zJL&wb>~gEUJ^;V4!KwUN?Q2) zfm-M{#dmHq4|6IW7el+xaQsTTG+&s|M zg0F^xr*^*;x%r%A)qzeQ{>=Vp*p0R$lfbHff4A(^zdUUea4PG2;YG=U zXW(Jy*|bGx`CHUlqj(~_o-%qXoki%AQd#P;TJ1ljZkj5l(M{;2b=q1Rq_)!4 zu-C%L%RH8qM2?(8t>#LBf!5<#cBNE8ReWe5@5R8bV&)by2WCvQfg$T

  • AnsTH3K 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 ZS?em<)$aGH-QWH5{|8cyq%5_30{}{Tesll; literal 0 HcmV?d00001 diff --git a/src/assets/TwoFactorSetupMonkeyCloseAndPeekToIdle.tgs b/src/assets/TwoFactorSetupMonkeyCloseAndPeekToIdle.tgs new file mode 100644 index 0000000000000000000000000000000000000000..68514fb0293749adacf3d9b02d8e22b175c5a5d9 GIT binary patch literal 28225 zcmdqo<8vla|0m#NqKPxHGqEwTZQJ(5wr$(C%{#U|v2E*4vU#3g?QZSAu>I!L_ncGR zRb8i1{kfVT@+ZiDwjW@Z-Kz;qBk`m_s-|mfzahYhO-pAxW~LUFbre&9riB7Y^uhL7 z3v2iL^>LdRQN1x*1yv)=G8k%r*S+^GtAYTvgiN43@HE`SewUyrYB?0jj32*@b zzNXUqQrJ8n*7Etj1_IB?U)7>I>Azm?LN5lcCiE`0`95_3_r5-#S1Wp7w+r;XZ+v{d zUmx3mRp0xGXWy^WZ9r-%@KnxsZ{_gg+BcElb-%Tfp3m!vQJxvgh-K9AT&R zD^73K`}Gmy^O5a!*4O71`s*cz;5`#~pZh&Mx9e^sZUW)!8j$?#!{c3hoDIx%z02u( z-IRN?ELD1YWcz&e{hBV#g{P7Ze0%NG1AHm)o_#QZd2J$!eB?Vl-RNEH>K@U~CF zeCm8I;29!as0*7lP;?|sVm{d8p8=k*lowO8*eyYlfP_N{imvAZ$!9!C#7x88O7bwBX) z(irA8_iJ&<-KOsIs4pazz^cu??$!tjM;AQs;Wn@v5At;%%99Ijd<20N@DuX!zs1@J z;*$&J!}sK_4@ElyzBQ+J^N*2O)@|Oko7+O#*4U>&+xiDa6Ebh0xoxT*ukUw*p%3r^ zn(O`UI~$38fzi>dGD8n-GQBx+dk>Ro^6x5 z`kC8()*G#h>1-{tIgY5w_yL%Y!z{aw!Q4XdqvFOZ(k!_M5EFK3UZ zRNp?ZuebF_j1y3oGtd-UAFQqIR8AxB@+Vn}(?P#y6`2f(L20Rm6U=2oiEUm4xr ziS0XqePY9drk49lq`TV>-+^})e2c9^BKl_+3ZiDs{+xI7LHdwly?U(Vd_q$L& z-{*na?Q?v96~dh!Yp77TPoO)qG|4{J3VGw3F!z(mV>pRB{C(N$8M9MPpS!G6cX?9| zTUx}Wgyz4*uu=y`HxwWF z5o;keHWM3I*4m=+@u6*Sr%hCZl3E*}^6{lk?jx^krgjDE0D;19Pb87#&9B~_M)GlKB2xQ0&)Z~Dz0fcWacR$(Fwb-N)?1by4`=WYIw%Eqt zmG=j?sR<(iAAZsX@KA2w7IwC9I6OB)ZI4}JSXEG_oh3f=CrUHAp=^B%mG9dQ6Q8`p zDxPI}36xvtUV(2`*YZI!!6yN%rq7GoXQYYBO2`Awk4rNaBTY9aUDbmcbmXxaOSCzg zieb*>0v(*wTHnr>f3@4$7~$UUgJFCOEWMeX{eC2)g3N)_M@sycc>WE~PU6`HFgXJ7 zwvhKqV+ae_RAWS{0B}LZWuYx@1^pq7*U>!M?Ji!**UySXO-XEZTSdU%7Z-QMm*Qk{ z=S_u%wIa*`oxz+pe6{R3MT9<0CW|wyQ=wtKY?V2bWL4&Z6h#=-OpJXSsoDF`uFs&F zce&+^ILKzC)9{H##<|uKBXi0z{c3l#`%hj_ezq7Duh6W(=A&fhVRJxeu)7JGpXFP3 z>OA6dhT3AC>ZK9(%29FZlBY3I6$|Z=+KXn*G{v)judBGYx}~TrqH1*Hv&t2ipTYe@ zP_n5CEn5*MY_v{xa=)!i?ww*mzve;(wiV?RTnY7p1z4b^C@>`f{d>>#?#acK?3E^M zcTFkCn9CU{B@^Edw#deSd}K8QW_lCGDmGfGKvG(Q8djS4WOA3y=Eki-)R4Km%o^#c znEmFn!4wBv)r~*0)O2!|V7MVNX2PI)DUT)EQ@>YvuMJrKj6&0f_gWCyy>Em*4ss^* zr!OST1ICJ2S*|LJ*#Xx@^DR%^(vr3nuGz|4%WbtPDq87_D0^NX64n+wE1cQorQqA+ ziB#*F&xyM4Hl50?EaxVI6+}D+D%O9>Wvt&U!q2X`%3G>M_%f49{CgI@cYJ2aa(SXd zzJ!P)b^n~ZVAwE3p1atx3=EYXx3!w^9WCk~P60y6SZGoEJW6zvYVFgJH79l4-UfOe z*n360<9hm|4!j+eEUV$rrjCYvJrtM;n_P$5TGX20zmICZGhsr48$V|tGUGFl65jqH zb~KOGF4SRbD$#)>o-B%s25K<8WKd~6xCSD!a>M3d1)$HVkAkQ=aP@bc!8&&#Ez&x} zae>R|#9AL|ykDk%*%FIJ$TeQrVAc-35CSPQjvAPzOkgIq$13RO&AdWX=mkPMK)hVPb6%h1MXvaQ_7r`Y8agedR0xqoQ|M%i1fAGM|7N z!OiA)`87z;{)h4Is&^vy@sHY0ny4!KY!lqSvU*tW`WilY*=YVwgZ4Lh6Nr3Ghp-Hg19(1RmeQ`a-tZ7Wt@#Rcl#bjM}D8V91 zq7&=62=jMw*FoxfDH#$c* z&Fij}!Bi)QpYEygB*IzouJ^1jXezlGnNs-gRqb*zy_+c?AfEn+wVa9ngs)-{F7yw) zrlsT#A0^@1uo*+6`^vYuTZIxr>(cyRNuY@&WBGH)waHoiOx-~j^@q54?A*Z%iAV`^ z6(jBaN7cJv`3t$aE8Q*9-rPl=&9G1PBxkJak$_&2L+96{%kZxS8HlJ`^MjQNMLnp5bCo<1I8&MQvBR_lgr8(N(cw~y+ur}^IR&H13@L=w8D3d zVv}6g`76E9IoD-rzzpG^_nyjE*KWtV_9NS^JfG@Eh>D)^luy-`W2I|1>%$D6b|rju zeMnYEEoo3Tcb0E^k`DEqS<=^2_sb7>lX}(%40Iu0DtnmC`Ao%L9v=uOCuQ|)|Se)LBRHpNrC$*8*TpvB1Bl7D%nH=;1z@*=%Fb-uktFku7!qz3DMJ!OoOr4-g4mxw|N=llIhA~x-`2I5lJ zDx?syXsJ3wj`g>2$V> zse{)MZW}(Ell&ak#3~_Q6}?HgR+Ej@kn_CMH@McmgG)bamFRy-Fr|}(_CZOVe`2)m zn`-*mW36-wr{zBC%An-W!}nh+#1m@?532v7;)i*o7}B%jrmPW3OX{kYW~W%;=tJiU zQ0Fx5PQujZH4TCl?|;_U(fYhE)XdXunVL8$}^ zQ3pa4Br2s>2xOPny?A8!Y^>gwIPR6Gx>Kn%2av~V1J_*tDx%cvC?`9zNmZ~Az9S^z zA!Y%fOH-2w)!L{s$D4M&;5|l$DYewHtL-Bkix^*3OSMuATcREQ*v9zX5(`*b2xgZ< z+zy60vPMzTu9JQ&G3q=nf>-b~q(i-QST%D_+0^5j4XS_gh|B%Y*%(u;`JLj1r@;1T zS;DTOXjf!^_La~iwezcH44%|6g&n>wBeEB}V!2&5j}CO8M2)X*_$RcgV@h)2AILg{ z>ef?t@j&Ja9{)Ns3GsgZEO`XRZ`F2D!sR# zU;ii&NZ@6SYdKtU^S_hL>c#=J^_LA*+|`ZFE~H0fX{cQHil?}i0CaS*-<+3(4yoM%V8Ec9*Fc+G2 zmL<~`4>V@)@YRHC#a%_n?B*Oynsn;!KrUOEiwBT%tzHjNDre9|?#b%>Y9jNbr~z^u zWb!X_7qc4wUFx#LlAVxhmI(TZy5&1pYL%&) zyp-}$IUrZy$!QVqZj==Fvl_%p#(&LA`u?6Wn^apwr&Hdn!rz3bg|ZLC53ez}%erC+ z;Wk4B1rzD|2oN2alHvpEA0IEtq;9z)jn&m0e+Sk;AAG?4csYJc8-L>J#&!ru(RKg0=I1~|x)6gM zYF(MM3W8PXKB=yf@I-rKDs+8krMp2W(e1D~rn_NkBo=buEy{yY3@meHKaO0MI+LH~ zV!8C%xkN+q@F2)+VLOCZ35LAd*CXg>tI7L|K&3@mbj z-`>RHGpBU5`HLe;NyuVMNk_z@Xrd+O9ZGIbiMY$Cp_LZ>2>y8yv(Eg@>Y=i-sBq0WO%Dtz zuTraN9cBOMJz7W3rc0~ok+hQCdJ^Js@U@*9`|vx$$#)lBdQu^DyqT9Vm>45j%V+|E zPC(J*1|9~tZDcKe_>V(T=|zmQ1oC|-Jly&nZuU9U|LFxwMb!48p(7Z=MbzFRp!+B^ z-uIv28Z>cRG~u>$Pi^x`GT^p*1+;ld!KOmd5wvN8rAo=z;JOKs7{c;IDSl^A(fv^O3WTjM()4JP?iAuhF(qYkH;#NhJ>J*mI(z zxS6r1Iy4_rb$zEZ3r=d=iF6PEP>LDd=!iP?!Y@e!pd*SjjGIg+&_fB zzX&y>WM>YvTLYHDWObX1&Kzdih04zT5tM^1h;g^4G5YF-rNL}G8fJ=G!X!H`T z2$LVlu@Xr0RV$>RHnEcO$bdM4E-*E|dQ^5*Qh<@|)F! z3yQ{OlqB@GU;pxql?aDAJWNVf2D7I|D3hpBZHW*{ntvDAG0gKJU6By^!R1OUUyT`9 zL?$kH{gi_lw1`7S@*My&gG`3Mu^ zu?d)hghsLt;c|yUe_8T413fs)Rp;6F2T}RzP?s-KTMNUHa zg&5L>XP6`pk4^)_YpC-T6QTn*)v>}pl|#gT)hOT}pIMPRR<@#b>jAK=9A5HpnJ5tUH!Tt0 zk*{na8H^A8rT!9+EF3VJWFl3~2kPyOY3J=xN|5@nVlT1pB8#;N$abN_Fc#Pu!(!jc zn6i<Ou;f{9zM^bJ@uv`DxDXCOvOnnwN5OKBjlCx;ke`+vR#=H-RO_a!+)T>9 zEvd4;x}XJV^!k^)>W{KZ5}QCRwMoXUctWy%dNqbiXxn1JrbWP}wUQaV22s0f=L3(? z8NyLrpnKL`R?~-QSVX5rr5QDG^H$=*@N(!9Q0RHlWZlJZ*d#uiH45Rz4N*3C0m zli4pNmvfL|C24P9uXOO|298*>xYfSoq=K}}Lxr-?g8H5(zIZ1`K7+fNTqQ+@R|CPz zLx{zCo{Q8YnVAUjpIP!6Hdj{|QjkC)20pgRfOH?)ze?|-iG<5Pe;qwB+Kph{RTpS6 z64f6a&}Qmm1@!%OylsM29AxWO+_o3$o@v;)`vK1VfFj@^%s{L!${9pM*O-8daI##H zyKVYj7R(mBCCxfm(Cv{#;5rAzS@xF5ge5S6f}g3!Hy*-2B_@kXX^zo z7<6le9VK~e0bo(V7#ZS0u^N?`LM`I+`wWE796F%2P*WI-+QXfrK7wcpDZZp{u@(+x zpFbCCkyRlE;fj$cl*qo@Xi=3qiTA-mJMv9osAQh_jo`D)M?Fp%kE4)t3gOH^x!OK0 zrh-Y7$JLarq@5zj!I^>#jgjXV%F-Ir7P*1dI=i zBqxK3VoMY#LyM|GszEY7D^#R#F*yzG0j+Q^ye`2j*ZzWZ69^PnA;|6cmr4|JMiU1O z1&`WaQmOeDt_+!@(Qc}jr_naQqB*gye4F%KTp~OWGDv+qU>Tfw7fCV9v|Po*0oKES86i@-h$VILV>T z6I)G1CVZ=!+d0<~bEb*mq&Y~U9G;;0xj-rro?t2DS{Oh2r7QxDT#}f#;+LL32KKEz z7#_G8tPeUk!Ufy}8qsF-x0BCbOi0RXF?G zh74&NTq%Xa2lYqkNoIH;d}7x&E@YP4v(e2oR7rf=N7sA{BX4yZN+5kSP-lsV#z|LIS0&$K^nIpmMkt8EZE0S|DZZ5!xUeJR!eJSkcKOT9Kn)-^>JL&2MXh zz>DajEzoZI9dNri-~+_1ryb_vF02EwLySrY(@9AY(GGqh_ZixdT!ctz2hRev-D49| zH&G;lylWTp1TH6SwmG^zNWEvGlt4?6QpYTvok2;vhkq=ZWTc&lx_+Zd55GMAivEt! z>2iK(#wpX?ubPf&)UacNNNe^Ipu$+(+z&WB*I8-B10@#Xd0!)s5G#5&PnnrKDAO7< zH{er|x&GXp!jfNvqV!4`vm&_;*m+9KxM-fJ!CDCBRy+O@yxHeqzU`<(aUp>4y24GI z+zboc@gG{Unca3VY_idjJlAdZJf2g9Lm1X?&d^$KWO#^;8W@)tq0f|$AO7krzNRCP z0mG_=18v(XeH86j0$pLGWV}uunEbCWl>Ep-Xsqo9AG4esQ8{Dm^5)Zjp;Zdb@ASu; ztLGs}w(Xb$aaLp1e*VI&XphZ;%~jqyn3tAk-U!5-%6v1`{Oq~$-mY5bd(HQ z35#P}G`5Zuc?Un6)}VN#BN|gYF>1yv+Iwsl%gp_c8*GP}S?^?`c-?^--GMY(S7G1k zUJ<2JR=Dn-EtsTC9^v+6rTey%%nW~8flxm}Y3jNMy3iW~NM1vySj^6Sd@0Ao zT*%{{vdWSDFE1;)jsp9C7-C01HfB@FzaZi{NI3R3%#=!f%>3Jf-&aPk9nK5~SajRk zVoXv875OjnJ2r%Ug>u$cd_Tr5eLvD`KS;g;^noh2Qa;EiZwt8(j7P;;4~oMI^Q5zp zuc^iB>BBFrNiDwIbS2%OTrt;n1tU^x*#sJM)a`wI^wgjehjuGy{uC8VO^aFie!F#E zub1STh#&j43j}6?Sld?nnO|KE)#i|=S>mX_>TcF_){WaK4!_!_+02 z-tP*n`ctocUfzL1obAJ^uFII_M_hCyYC0VHgM+p zbN^ir@M_EV@v=_O2m0pw;Yzps%y-rkGxIc!KW*!!;WfO)aU6^I)|!Y_59svS)<4`TgV`3q4A-q zhAq@}D_kIsmp2Khu_P;nFS{99X@eKl3&xe=)Aj znkKfcPb9rRHjLp4ubO6NH;&P^to$a3a^EUD^h82?Az{oyLFQ=n)-r4?sr6N5sa4n2 zL_OzXBID=Y+WQ4;NvG&Elnp(1oHK(uMxee57uy|uQ!*HM_)eEgdCgOIWFy8{%oddN zyjk&>!V9s__jrx(r*&6TY?{+|GIYH4SJYuZFGW_pEx4XtwoSS<_#~ zEoX-Br;}FAJFhGo3Fp@;m{yI6UL2@k$)cq0nmcL=x_DcZ?WKocz-v6@s=MDRGE7!` z*@uh$%V`KuAeP79q*nWReSGM$BsG@`9-Lv{UtY_1_WHEHvv6nF`8HpVV?x>4~Lyu_GvF@ zoa+N1rxA?Z`b6{%;7H@nVC=^?%(zwaXin`f557A+jAd^*1uYEscih*rmSYIs40RRR z(s-bIJ&JXcwC+x(-2R%SxM?>C=I@7S!A9ql`GU-kP2=48Bh~Z;>V-4a42Anp+>a#T z*4wBYi3Tl8S;Od1hT_F)hElcSjcOL0hYL8RfX(6KlQHnFX46I5NDB3zC*C9jf}C3s ziFfhk3b0c;k&02(+@&qIMP3WI<%bfxsjAtFiV5G#YR^D3C@17mHD~Toe(*bC#&$j# z@af>JEP$e_#v;^}+|aT%oV3*F&*3|OH+ACStj}Ry(ctiWK5LSGs>XKFkUZ3~G#m=3 zl+&M$PDI-#ZnWjG4&dNETGvZcS0!w-&~~RBv#kynnZhpjw&3$IG4wF%mI7>hP|@xg zJ$A5WzJu&~7JXE+kd}s44i8yUKl}IHAV~OGt}3MjX>3;QehhV?22?`Yq|Sq`WT-7A zh0KfEu1vT$`wJ0l5wh6v6zYkg+xC?rMJOIOE(vN{a6=B}O87&_Fj1{ts>6#u1{vQ(-) z#k$JfX~#l2`bs0wYk_R{4ma>v#K|J?oi1Mi`ijn4OnsUq1Dp)T%il!iurB?_S}Z9Uwgvh3ysk zX|{8JqW^DoruFDvHC=#!>CWMK^kCCj=u}s0Bwy)YRdK>f93+?CUq;gaZ({mIp(Xqk zb0b6>zLiq1DOuQdJi;wR%2FNbLPDH3LFfm`m6!zcY4wC{XSfocIW%kd7$Iqh?xN`x zJWK3?=4b%mM!m2Kuc51_;qD^(c`sRPW{J*s$?l>w@>?b>MH>rGV9I>R$4!tASGCj# z!k8xBpD!dSdzkDR!Kk}kqMr!yJRrB-aQquD6hX(<2*zF3d~2(_5%EK=(rN)j$mvw6t1eEmEYPh+tAt=0N$*KbSdqpEfCagqcQ>qjwLMy7>=H_rO z$GkFm9ZgQX$&VtRs#A(>@3b{Mtd}B-#YWWSy;Sv7wcbP)SCr||dycwb`NcdfZk1Ma zO(~BjhRoI*S7?0B#9MeMjIyh{)p+|(N>H_tc%a-NJlIVjIHdwFWv9mOE|ku>TC0lng#Aw8I% zvS|q#_Mz8ZPV&S(5s1#w#XZGAh?3i&$6(tySLU+VA?7 zxyIAMt)Z~3qnRteI>+N(6x6x_ZcF|t-a%IEYLxakZ)y_m@_IJ`x36tyzedDZ2b$xD zVnC?${4>PYl~i#qE#n1w7&mkE9=%RtDsvuqLxiQ;s2H)Q0Se=MGGdW!m<@%rBgdrF zwbIP*;)b&m$-c=!sVs=Z3Nz^0e37OZ=ui}Io&Fh!YU=m$CQ}Qj)NLkHyUgrl)(|Eu zVb&?hH%F1q;XKa^RUJ6~J%-vXJ`B_jOByr`hpgLE1+6okXQU?$>p##gi7jKQr&59g^`j@ga2}ZVjyZ6#x{?Ej_g?dU+vlaF#Xat0mguHH@3h3U^zO za_9dw7>slGAM{;SQ8W(O$=2q7m9cOPh7{##uB8WQ5*4>U8lV`5#u<;HC*s#4t^_TI zJ@F7+Lmwb4>fZJ4Ob1Wwci5w4ei}__E;-v?+UZRI#P2_#Q@mBVB^4Exb*LuA>{U9r z<{CzYeZF9A+LO8wo4G}b?a!_IUw8N)o=x#-8%wso`VmzxSd;FHJczj&_8D3F3E(xh zSNrMXRyV);OUrTmDKFxeRE!^5VV8h|ESu>j9g||dUlaJH0O*iI^A)q)F1jhKE%KR3 zJX+unjhzpAF9rdoWImC~`!gVHeC*kkYy)2Qvy*3Jxu8qsNEc{R!^JF~638c;mq)KzZ?y~lGssIlJ$yJA-kn|zj8F{ey}owOY-ZIlBYwNpv=?R*=Ux7MQ>Wdi-TR@MDc~@ zYQA6>*LEcRPjp(w3!q?58dU6bgbvj43l0HD|MMsK)03P>$#Wsu%|oZB6gZy%^FNl0 z-*|ctXhBd7=X5EKj1+iVpJy*m3)hvEzylt#_KWWPrwdwSX$~&cRHYavh+H_vx4>9n zLcWiMw43afWAFz-Ob$C9hZv%72KQLG`FbEjj5Z9FGSE!`04rEYIflcGw1byl_E$5V zV+hvk;9-7r;=<&?aIVx@63so$8ApYv#^zd;moqjOa3K-_2-df;H|l3>JHc+(7NlKI zK-`2<_pAc9>^7TM}*D+zcfV$twg_@Y~@JUr1utvLt=uCX46;shawNlzp6fEC1F z!W=i^%tcMSOunC$cbNRmTYr?5PBG-W1y`SvjhY#m(9ybB4d7tG2kx?Q&r*UMpZyn? zdz&vBdW_0kT+6F;8#cTT#V^Mh$8BbZB678!j6W@TZ6@Yi5!Ek4k+ADMdJw4DE$CSM zsGI!s*wiIT=QJRVQHF)P%mwg7khScwx1c1Ms=wZc%B*`j4I zHz@NHQ>r=}NWl)gcThXI@^@t8$4%G+&(O}sYH=&Z+Sc#BsmsA$mAldWB$WI%%%W1u zG&MT}ohidq>2DLcWR$qQd&jt8j}S#s6w39332&kfW ztwpy7evoKuUK3S*d4sR@B=ei!8BV^(u!9Fgg;fjJKt*_$05@dYV0egVo#f4Q{Wz3# zQLcbSBU#mvQq>uMth$Ozkh)c($2WAzFIUNjV^;}okCOL2UE8dccK&O4Lxr+rqa|1I zw9dK2Tlc0|HC=8{3zAIaJe$=)cweQ=j?ZIKs4$sP-#htl>gl&~K79JO?Z znm)Fy-5F>B!*9t|)`qQ}od3Ztu@4L;!>}lhQ7TO#gtT+8ux;S~N4rG-KicK~zuKkw zKib72XKPux_d9q0Reww}h!M6lKkH^}d%GWj|Mr(@juTZ~rY{S$HA-sT5AQ)W7nCin z7q6|l0y$H4H;I!wMzTTIS$e7oBzf39&PiFtE;0PxGOu_IW#nEZkxb8VG;@K1@Ao^| zsIDEmo`97CA(v*kWkbzfbIh<`e8O^4U{OpUv0-)X;qNFI>yz>jOc%>vgUXI@PLE8| z;hvCcOh7c<6ZK@36T@Jptp@zea(Wnb9xOVzSL`M3puXlBukLa*AXpVW*g41TBU;rD zv$v9Y!jfG!ac}k?kXDTywLp^A3~1HQ{H#24nxx}3f$YEa|J%F-?gdEN82O%#ZzMxO z%UyOd|AkTWt9WbAtpA&q=8ZUh^}XQ07p2B;sJneKC7XAB;XS5?!%Kxes_iT6#7!J( zWie1+z{#_vB{$9y)5R z@p#dIy5L}aM*oMBa6cG`zypJC=Z&IG?@6rPSK0rKURIuNpfG(_BUj0zm+|v6L|>f# zap*XLlbJRbDHL)-4Jo!y+XaTvGm@x^tk zt9}5i+E(CPLn$1#=*YkcJ{fJd&=~G>HIJP`lBI?jsxtk>c^-YEt_||l5DR^!Zgg@h z!_RnaD6Wa@oZKv<5oG1Y9yw+X&8BY5SHcy|2e~Gzr42(tg^Qjda+oP6)_J0Uq-IuRO7dp^#iPkKOuMi z=lIQjta2JVvy6}hlq3|zgdOz16(vkM|3Z9AI)7eLETn(;G#Zg_vaBcrT1JB>kr4H^ zicgx9tdAgUi52&1tTtfZObMs>%pIeE+E1k|B_Bh+`2mIhe3!YJzp=*5Pep+%T{Xke zEkMH&4i|?j!$_aM2`^0DlaJ!S5R(khzhqp_nK*^sHSF-mgE6{j=tr5&8uzLH9Gl@o zmHPr(SO)p$3-lY~$Va-$b~L$76&643lQP-iBgv&Cu@T70+{O=HvAW2X)FDYB*4DIa zgvf~_O2_pGqmb8UaDFKE^$yCwLxs%-XwjK<9UZXp*wWvmQKrAA#KNc|q!*k^PcFz; zt0)oFmcZpQuE25@kzyo5AZD7&sGSrciaSVBR#hWfYM9n-wQr*d{inDbdFoz8t#Vqy z-z(}kuxAc6ES^t3TAi=IU(L6VIJ(UdIfY+)K=2$ly$dI=Vm07*tn6b(V07eWfgp2K}f4Wcry{HvmJ4JJ^-%JaSV5G<7-azf01 z1T6JAY(nhMf7;NAo3ejyJ9l*UuM`vC?WY|UfeI#~Hh_t4d$#}MKa6I@?@%%E9SZO* zUzh;k25KJbU$3F`KqRhzT$lRvkyrmwFq2!hh!;kkP_J)a_5FYB1OE4P~kRqoy@^g^y8@&b?t8?Nss zVhFR+@;kZv$_2W##hbc$S)M8lo)5O0g>mLiAWN@R+jTiphB~_p>mtN8jRq2YJ3XTiVL-<-LHI0JC|GLss%s9+6xHAu-C6Sp)K;JLGN-jm z(|K}mPXh@acs&i}3`zH1wkPvlXV+UzMJ;qf7>x?W%ncwr2@y8has`JQrf3vYx=Lz| zxl7MU@+3$H543OjOk$4EoM^ZEt;uo_L*Nzwr=2VVzE$H33A zzlq);&prxrpIAr3nzHa~xV~#b=7fQBn@CKJF2iC*jNC)f%0aY)g10ZFmNPlw_A*e5 zYGxylMrK&;F2A*OI8+-{LG{V_fpRJA1I6#>XE}ALi3Cb0ZeIwRQ>rhFg884tZ)n8K zdFbOx^rg5jH>^J6bKl|ebZ)!S)VP7`RClB$f^n)YRYB*kUs2_qET_uxvpkCN9M$c>;S{G*fC$gt zLSWi)E)3|DHGAfiHT4KTf>j&CxIC!P^7KGK-M#uw^<*xt6?1oHF&+&M0p@Dt=8+Yb zfNL6NJz${wOky{}#9U84LXp-Rte*e-m=?<2nKqk(C40ZBn44qTjzZp<8k^v4CFZ`_ z0|~RU{_t>Te_;TXm{Sa)vBzg-JMU+>W+KOI!krQrL@wQfTsxq`_fWz&n<~hr^9Dsl zp)(iX5V`T^2rlOW?8@C^2NJ5#%BA!}_T z9MUAMaj=X}3G=W``F@@gKKG|8{(xAVqA<;a=(#@_n7+x7lR`Le9?gWVCq!NWY3gzo zLMP2j!YPG>Mn6l6Ji}z%haOw%SxE@O7>2;}}@%EiSDeX4vQFaz#;JX0X6;UCz9VIyPCBA}CFOoIAWQntxJeEgX^2D5%7av`=xM&7|}7MXR2Xd z-n1;=5~rYG!I#VCi<5!!!2n5>pNix`ct0fTXRGIwHiGB2s>aZoQ2ZBeQ^iYuLJzg% z-MOYn5e$d&mxBDcL;7_`^sgK+!J^9eizljoNMe>W5<~OEmN{uOSm&7{i>}gJy~9DTEcpeuy35n%HU+3oHJG z{Pl}7Aj}3SoSiMLGy~4CB^@&#){ZAix$jojy2Fw}!Y3vnWL;7|VK0NC{RYiQHJ?&a zu_`111qbGGv7Km#&Q*K&ewNGh*CN5{Ke4-P{yRnqBJ3f^wLj4F*;bJ-mU>JE z$cl<-B<e~H5T0~5;*q1*yj+*s}T=fkY)u@j9i*63xJv99mvKj0RWYV%a z&on5lD1I$@HX(BTF+lkZm()8Wnv_M(%MTosM$|q%-IPzz4T-N4LQO@I*MP@&{-msw z9@2e4=(KFO4v3qCG7u{SDf3r^Rjz0X z!c|iVt}HJ}%&+y8ALLRXv&Vm7d-tdZX*>$Cytvj z1drF9<7v=g=0T&VQ>NA5;ExCc6trYF%o_=h8FyF^Wpm;Jox+jI-9^Im@$3WU1}L%w zz%3GUyD5+-*?t?VupBT_of8>jA8jFKYi(WU>4e;`eRwNz_>iV)+%Tw|VpXj5>71uB0Go;ne(?HTb zcUsT>LEQJ##wR9HG(Wwur@A))7VlcrEi; zRZX{qM_2zGkeQj`M7Ep0!a(bgs1LYcp&~rMX}*wsxM?M;+Xnd8fqVm| z4Of6(Z{cXR?cwfxCjYOE(mj!r2$U^^2Hoplti}*4<0yCX6WOEv8-}hr%Ct=V;XZ)^ zF8Ve_j0_v&d6d~Hfg$7yacyH3CnhJX4xpn%s)z!>SxPIjPf#?x9}KJW|4L7;4VNUt z!4JX+a5&YWqW?%w5fOCM2r4}LV`@htFLV#`mUx20$Su-x())auv$M2x5jOgLA|h4u z=W#COq@6qQBNbX^kTieUUk+A}F%0OD-(N%Bq#Eo;eX|)CbE$l|*3B>{u->aw&5BmI zGTj39m98QQ!R-p-EVVE%hDFtMb|ij+Bl!IEFN-k&e`)Ig|6c*7ELqbE_c~F8KDXDM zx|saveE&LJi5C(;hjJzWM8d&3#U%8?>N1>wB=quvy~bhI6vSA|=*k0~5NS7Q1X`J; zD95|DY7L~%0#cw&RRcv3NGFGY#RpAhF8oLdB0vh2O>VX0av|fDBI1die#EoBj(8Tk z>g@`%xXhkwRFd2A&TMvPHjBE;j_IYI?Nav?+le@o69|t}Cg5N-<3L8<;^Vl%w~%n; zz4?N3)qAqqJsBGB$=c@irv+G+4^xjE=MA1h`E~g@e=M>PxI5@E z@3=ueVS~Ke>ii_wM$n<$XFETqx*=R5^6i2}uJ5%y;n1maYB=zT?WwQbo|-jpDY*LC zw&(o(2#RH>GC*};zS9O(G?tWGB5bljMFd-$%Es?#gI?^qM}e`+yHYGh`A*xDyQgiw z&HW>jK}+F6-3@dHWYV93ib;<*P?#< zoObfNA-?0;ftxZPGwN2~n(iCRaWo$H!CUhRuQ66PiIeA;ANkP^x| zdJVFFhF!Vhu+>bB>MXc`?477P6Vf~hJLr2;i z8?{@^GK&Nc9={mX1DiWFBW0(k_K_Yf;orESMAOIx8 zU3nAgRV+S@dZa>z8R}an>PyN`tT4!~ZUVg^mab(q1ZN1MIiyxurTT4aEZY;ixk8h1 ze5IhEcj_EnUgMWgWi=zmDvSk}?m(T@3swYKKkC7RBlCB}mG!=f^+-2Mbh9hN9Wn!v zj8@yAC#qUl9J`$b=SVwOW{HKJQNa%T_$0tvnkAv|aPQ@uAqFI`7mFoo-di~5uM1Hj zi~JHjf`xL3wJFy~@)-T$Kp^0v`PoTV6bUT+z8qO*GDnMg1SDM|X{He5tOU@Eh{$w& z&l^!I0cNF6S`miK8Vh(jTo8Q()6upN9jfG~@l-^7eJ=Iy+=$!U^<>{!>GWBwLr%gCr}Drizq zJLFQ<87&|(97v<2i_TnDui=lALIze>oCIcF=c_H|lbw+PlUr#PdsSktjF+1xV>Kiz z_0nGr;%FLO1D?S=t_^tX5=}QQ3y)rn~rP{yZxOTL133GC5d$%F^ps)WK6?% zL??w-jU&S$Gl@RvX3H!Qbc=07q~tde)nf-N-l#QHLI8gC+%>Mix6E zhD>!ttr|&>G_30Zjp|pW9X?N8k_)a{L38A#iFHgq1yH zzsi0Dsd{X+1Qf-iFyx z8sZhmf}q01k1F$o^btAuU1b86lSq?UMzC3Sic@7m%EDG;*H?oVM2YS|U_^eXYYC{6ewr%QoqNdCg5qYX~iw;TA zl1;RPsB|N$ltZ*&)4ioO4$+eO4#wQ6WYILBk^Hu=U^IYa>DeSpLBJdtrdK3O!~Kmb zmgswdY$?e74g^M2E+kqBJmw+mh*GzEJh=+ll1JT9v$`X#O=D#}>yFx7v@j(aB3aLK zOH@0wqDu}1L_xDEKq`YsJ?0Z(2lb+oC97abI1gC5s00;V<%$9{G9!XTfmySJI;yJF zE9Ondl1EswVQml4L_J^33R06#<}FQfmYk|- za^*xz5$h82q}HQ65knXdK+2icCp0xG<;=HW8O1bL3eq!^2^6mkyp`7i1WHi~)2`99 z2#Q@Ro@6Q~ELD{#l_M%RMrssUp#-iRHF(V6MBc4aff7swfEl4CP%$14)U&DOq6v1? zQYh6O=kWrG;+xeGQ>%tVai}Lr!}25Dmevp&+k-baqAOG!S`!H0AyM??;oGTe4WU)f z$ZsRZkj(B?A?1^@c-7)JDiMszSXw66V62oVeMl6oK@mXLam}*Tz^wec(X)(G)#g_h ziYc@hxl(|OOz|qa)J_64YhiJ+zvf%1s--0L!`v)X5K_Z+m2^o{#Gl=q|8U{qr0^NA z2pnB2qogrdNn^8;#%3jrGae=$PMU6}8qjRT2V|rHAt+{Vz zPr8xhYRQ|;tU^>X%8`PgBWB?R1&M?=$2m0yT|hW_ENMPkNkmsML6L+IMMR*2JNs&} zVilQzRN1Fug+@{8VZJd9Jr>OSs$!)pDO_%&2en+SSZL&VXvEN|B2$q5TU4z0pkk#v zV@CEt3A?+NV52xBFb&@EhJplwq1gq`w9?QCqEXD4fN){bQ${arx~SE#X~S*N&G;ES zU`|y-m_u!NJG2r773108ELKE=imIp-Q&fuDBoLAM5!pDHXBEzdQFmHu(A3^C4XCm} zg&um9uqm11R5+f{nQBa>O+{f=;}Mmo+hvCc9B~(jnxu+K^t1Fw6s#bydZcr^+E2NeF$jqk{i{VnTz#da|#oRDAOP0oGs|kR16!MRl_!`hE>_(=IlkIkBZ4lSqn|c9znQ1r#o` z3ZO!P8-7}P_ppy{3@BlzGyG^x*TN|~1gE3IHUyo!mhQn>-dMPd^6PEtlHvUc5HDT5 zC7`C*4Y7!m)u~l?_JUA#o(cu&3Xk$7lJj;CAuSp$qBJMUS9}EVmKr4UUcwt@^^VyHNUj(lHc{^qvpIsr zO01KbNv|=M(CDk^doGrxp?ZY+swrRL8xac~XCb`JC}I>R9!~sefj1Qx>*lu%Zc7m^ zu^erpU}{c*ah6oH~6FeJ-qa@4<$nVJp$@bQy~3-!d#E^-2si z$+WXG>Z6J;pxQldmXx;-%J+k;9CaL`J{^vSV1mU#?%)z0K9<6Q1yeK?J?I8j=nXg% zELww>M)kV@8S11gMK?Pf>;or2JVG~VuvtrDZshb_xEIxvf_J90^u*R_F#!Z|$t;YJ{m}?k2DDeZl%{%LPVipk+kGzGs zUn^CpP$BQ7_kO{f=S(n6QU&!*Xht`aDi~)_4aFbrQaC6(og}!ip`bt#6qN|HkdRvA zO=01!!@vpsXHI?R;0|$vv52Lv*(eV1a2QoROgFuoq>9CU;E>0`2ItuHO4GAn=$GqF zg;lL`9EP{I!>`es9iZEUN>XyR49i`GN;qh2NL73gB&aK-wBcuF`6mn9dBwwHgu~R6 z-SK4gsz#4cEohHK2ht-%gFu9H35BdKZoq&5O6NfY15nxcIbAd+Tbk_Llve2e>*#1rKh(whqvR>q#(D@eWArO|I|w6#MmIb=pu3NL6Ro<}HB5kZ+a z^or8W7h4+nc_3Ca+QjZ{lq#Nze#U){NAy9$hMYm@DmYics)+eQvi0fmUGif2kq`t6 z2dX(Pd{so`mB7ygqp<-662{&U*&XiF=S|RdCa?DqXNA7Z z;O+>8BdLS+dWRW`m~iaX?Rmsi4ILi6G-vpXY&;c)Cc4P-#ZCV*Fr)ig83zn6I4PrguQ- zDfz%Tt(EC}M;=xW@sQ^YCE+2%+1ImzdRr@)bEJfm_&3zJ_S%G1tk^OHhOb1O-8VoC(l^m!vF|0&oSYc+LQmk0+ zA16wR6|-n-wEUbJ*H6gD(Tco_)d>po*3&~06;PDq(0xOj<#Ev^I71=Q>|p?;nODCm zKPNl}&JwTSeAy$8YQ-|h%*NGtAp)94q^Woelc&+)=WD%`7tuIVC}bn|*jWY*Z} z7o$6-kzCE~f+USh+LvgwFTr?Uit@f>W}W$YA203UHAmnb&n9HIOeE4A9g;e|`(3y^FC(xbJ*=d5Jgu=0pL_uXY#;K{ZXt!sJ z5KW_PsBuYZHzLUre&N$lOi0uYTQmN}98H$a*}g$tLh&2twoFrM6nByay(b^0EJ2@n zNZ1sy(I9A4IspK8fes6Cmf6;ZXO6SX2U zyP9`qnL~$$=uxqV1BiW?DM;n;rbwMC7oN)WOuO((85s|kDYJ<5^`TzCS%OV-CpE z7;*lTE;NoA-O&lNRc{v>2U=)@x3W*70dB&gVCOjG?@kYe{@JpUk;9ds0Z?4;s$Z0> zf}&`-0K&cWbc;CfkOB?4Zz^oEW`0H!vmIHgnL;5OzjIKk=3Ff=4q~D+4;IGVc!dx_ z)s{wQk)@#->mya1_5toe_!|^vXn2-bU}^MhN4=^`YN9^8*@%{;u*66Oi%FbhEd<~O@Rs!OuB}G=u>s0F z;gzaSPmg9J@7Qbv!EapO7T7APlF@5s)Zc~4T52A=XR{G?6O?!c5@M&%$@m`aMz(G@ zf($Gs!O%h~nkB(Xtzt{ehBS3#(7so<5zCuDmm~BXwNp>&qu0pBy+)A9&4SftrQ#_y zOQS9tG1p!rDskVn*NCMjYhU=G=hVWnX}TZE}L}y)qJHa%O1&~@84*o zpIN%vfhMH(Xf*O@H1cRPvTdUg^~eAnU1`&*vdmp+G=e}8Bc)!w?@#v`0c^UJm%O;m zNK{O`y2nT^%=gjI&hNd)2#n?F{716cMpoO8g`y^rt^*%!;wAtg$N`C0zoIU;VTc#8OhpZz*l$Ay-J3a0(Sn^ zV4a*1*5@SCx^ZuGvOW|o5hdlFCQ8&`<)4jrFnp7PD#0uBo@RaExMa2zQW^xUwl0=8 zw`bppUA9OXwBL;WzExfKU^y3YqdC#gkg1hecOzq{fI?p^fl32qBl{K?8}kpe9FmD3 zWQpe!-QuEP4BXrY|M zvd_g!fnt_2`b-0JYb%jz24WI;C zTf6Q@^?6Jz*}*`fC0Fsrn5ZyoXPP0(NvoBkA=kPDBjQ6!Pe)x{(6Wk5!auMCYqse5 z-Ri@6k#}GzqSCamWQYYgg9!%uvojtlzRsA8as}N0XzVe_jz(Hx!M)eArQG?#`WnVB z&k&uJ$q1g*QAI$K&7htcP1tnCqYw|u>EL=8Cj~zn;+#;ksp7BIG$hRkR(KLrrFXUn zIEL^nXtL3>Kt@ziD-0BjnpuW~>-s#7ePCLiOLgv9a^U`QQ}*9LG0b|zN6{UIJjQ`K zJzg+Q1U2*Vf~HtHM2GPLLU#T}7z@HMfB*`iYOnBMLD^5^GXKXu68I0*F=#83LvG}tKdWVU?QMgE$4G-LsG3piY7oFe$!MUg z_GV^5in4y{HsMTW(S}EuiUECERE#{S7^vBh?az~nf%KQeLilEt+|)4e0d6Xe5mp7I zS-}V*SkBd=v7xZWO2bX`NuenLZqu3>kh($3(Cm05=v&HgDe!ywLEMDqu%uEkI_Egv zOqx#%o{M}H%H;hUdcah;pw)GFy$4qCY9gF5r)hE}!mg@eD4VV_d3Y;?<1@9ryc*70 zjqgX@vtw`q7x=uAI%_V1ae>J7MNL3cL9|vIJ83js>ZSI@`1mz6sh#F7bqs1G&WbdB zQ*~tyOQg?W=Jh0si7>oxCplJ_$C$<`dbK%+k0S#dS96e~8QtJ?CT)sd;dS8AIlJZ6 z1rs40aLt2JI9*3^qBgsO4?+=!S2F9uQUBEk{|ShQgB$b#$hHRqD;$<#@V^C|7`R1; zI*mj=498pf53Av+Wq8$80yO)^0a`X#(_DG9^C{t>XuQ9oQ71*?=kI>`{ztnQ=Q_vP ztU=%bc1PUvTU z5CMTj%)L@xo{Dfsx%L_I zle`illzSzvS%?#`vyn5yh=GQ9{sHj4 zWuIP&?3Oh!Ra>aEa#&6k0y0ft6j1eR)#dci{mym2_EOys70M~RMD<(6`}5EYADZDq zGkj=<56$qQ89p?_hi3TD47b({`%5)LkZr{sx{6#63!c5dvECQZjEbzHUI|%(GNCCI z6EcfgpZ8%xT5rHqXLPyfQFz@iZ`9*X>Vd+iz{#l#No~K0@!< zTl$HQ?4Ex73A)M*T^b6_)e>|FAb$p+q5$fz1W?jG&ozNlg)vtAPji{sq}~`&YV8jI zJq@6E(4vac`*r*@&thTiwD3~=B&O;izcN07pFlP|6l6Cm2g|53AQO<{2Myd&WUE!_ zXb0`7#`f3Z2jT@1D51wC_?el0EHGxJBL4`nI>tI5TI#1j{Hu?^{`?L-yWY=k_x;)R zetNs_uU+q_xBLF|df%Vk@B6b0{(N*-FL<`c%tsMSzUew$@$4no!tsu0L3TUd@kSjx ziD+fVua8UqE@brn>>553(x(D=e@#d~@sZurk3T_JnjwsB2dZC$UnddtQ70w8usNxaePndA62>rzUj0 z#$D1TYDVFyOna6VsSHs_GPKND5{ZxpNAq2~RuT+?i@XCr$59JDf57SE_h&!8KN}m; z8at}swGISs+c2tQingRoIn0}sAa@sIO4dRhwaQ4>^JDm8aUK80{qM^03ww5?&rlFF zOEHsJyE^Ogm_Xnf$J-Bg*?YUoynBVe44KysjRX6V$L#bIn`FvgOO!8Vxf;(Y>pO_q ztSwMv%Ue66AQ_L^Gqs>nhKB-e-Lzquex-Q5Y)Tpp+E_u9Mzs+NPSNhfE;q2i#-X-= z@HLHeS~l17mQ!pE3(x|2&P&dg$+L%3m6s2BYl^@YJl^pJ=(npdEvVT$zi%7Z0}Y;KCdxK^d$ms_|(y*=N&qWl+mjkj(6mr8$qcr5jpNL zx8vj8AOQ!jvgg~)*eOs}26FE!%}}qEland=xN2ylyvnGK(On=wX@b-+*e>8ThPucly8=`rL&Hd$xw)I4#b6CL0| z4z^rVJ(*G;ae5+Z9+fFcTPp0(Y|?3^pP&kV2DLjo+I-^gYRw5ed$CU6C$&Ux`UB&I zn)wxFM&#*dOw>B0eDYC!4eu3953aqUUYmsTOK**;XWSb*Z zhMrUOhjB_J(Zg{;^v0U4NWmGuSdqkXm}y0dT%UDnL=netB$sB7@}v4@wk9ae2x2Fp z?8tiY&~pVwbY-e%cM{J}=*6{1sRmxa?6n712I;G4A8%l+6=Eo+mBdLafwqzdsD>I-CUpglRlR!AH;9!} zwGZ8__Nmk(bBFQ0Utfy@R@tlKO?FOL{s8QP8UU|1i zyYuVNep)>$12ZLMxTa?t;I(Cf8(o3Z`3_uuy=Xa`=|IQdrQ$@x&+O?j(D`$fhT9K4 z?PBeDxd*-7{kZ(QUjET^gRHtinskSF)E%f@$W~7eAQ_mbf4zc4+$35tiDrxeUSy}e z|7!6R(&TB%^nI%`Q47VBHy>4nt?&>}8;B>*22beYW{jhWvOs%lC(AkVN?mL9(Nl}= zmPh?DYD#CqDf@b4sE(Jysai>D3!{GdXu<7|Kg;e<&~hdz23UQSgDM7SU(d|=-6vZ3C^$!AytyvKi(d|Trg+}Q%3G2 zq*|jzQzE)=v`oq+!b$bJy=vK7D{&ETObpd4nUnvqx(Z zb5v^}9MFf{sFa=3SV6sir8>nhw=3}N(Z5)m3jDO3 zil%k_jdb)aBA93rEAMJ$M`#w)gAb#j{aRM@!Zo@NN;8Ec_|78|Q<$_VZ-h%|7$}w> zn$o5A(58?>NzJvDFsNZ=ag(u;XdYlgFmH@M=Z5!{x)=N`VguZbak-$vU9U8nVDcka=+GtCt>aclnieqy!oL-$g7;6!%lGy*d__`3!8u2lbQ5o!Tbt$$&tEW}A@p;!wMv;)*1TJ9Z z5nQ2VRPgTNY5m8^YfWDH;r}rt_QSvOU%&eVArei4q~5YQkj>+?J(~sstP@&gSJ8Cr zhyXM;MV9K|jcvz_j+aVDGcBAg9xQoG>HEow2O9q!QZi38?&`tzKT=3{Hk$qX2lOON zzkNJ3HBN)v&&N+nZk<{(4ofm2Ys1ZDo(HpNVlnl6V6Ig2}TF`bV0bTa32o$f=nSsn{>ws7a`dbaKt`;xV1wC&u)+u5{dEE+gz?hQJw zdbY>z&hiGxsCIlo%olcqp1!jOvldzfjUJV#>CPgYa<#s*#>ciR#rQ#Sq0>E>5XnAD znrM=y3~7X>f71>A>=jRuC*R1?o&m>ooBc{Fha}=-8b>F+>~WxMgA}68tri)|z{qzp&V)=44RhCCSJV2BGy3w5mxF*(mLP2^Wpe{1ZA3Q?iNa~OBkmVtUc zK%%T|0lhZ znoI1?+pU)#2o1G8JoxNY`fGnY=2qyM;IT#9w_BbF`VGQNkRd9iV%3-s6bJ1GOOX;( zq-fHL^|YN{UW{eA3u6f9boNpR4{3D)wFifdedDIc_L`uNNqU3iepaeR`UhKzPm zuT^iO2Gaze9(H)pTQxrS_F@lbEqt?jg%t|D^79Pt{@+C9y^rpc?M_7Gu7 z8|pdc>!SI}Yh9pz$N#-;Ys_ubQCh{|RKx0U8;Fh)wIwU^Hj=y`s)Fh~zM+vvJW-=AKZNJh*>ljVzKm+4 zv)|uejBoxE)`GCGH+JyWcpNSdwkJk@m-gB+Ez0-NRAkRKShdVQv`3?@?9%K}C-K(T zLRFKHMD1r2-ps#T%B*IQxzJhR3;0AIP<^QU@1*iS+DELM?GY}sJ)TMT;GKw_E>`Pv zg+}<|BkLx7Aa_%HwW{BI)D>BE4*bA!AiCxsyZKpxFC=P@Wj~xu<6Ec^*QU0K+_Ao} zgctrm?Lo_+^XR31Wa?lqWA^w7T?6fM+B&*F7xq-1UTXGIw3h-iT+!~gsoxpRSE^6e zPqwV&Sk9_dOkz@FT%S_+{{!m;u zegt`Z4u{Sn`iOd$^xDk9H8lQzoW1sNuRX-Z`-+W+g|M=P5MOK|_^gF+Pgn?-A6eHz z*k3mhj@tgBiEv>dOkX*-5B3)Z!v3m-fJTad*3m-n@?Q}5M+1Scq?vhu5C~gqPu78t z=xy?_4elki>r9mIFJ$?GC_k6v=Yo8HU6P~6C{h%Ta$H0j(>rEz+*jm8)ra=?skFaa zmA~NPp~J7&oaufZfwxT6&plMXI~N$|-h}0>dF{%257k4^r0EQ_TCW#xzPubMp`OJdcX5q`s-o1dYrp| z26GL}Vu-eUuad4_SEN9n;UUTFh=bI} zWnS~KWK3~k)pM`+Pqaa=(y}iXdu+d-`h&dbmuq0pV+KJJ8bPNnXIt53k70o?G~R1B zC;knLcz0%Ill4o_b^x5KyveILI@2{(=Zcf%m-WNf2T}5lkLkI_*T)Z!d$Rv#uJ+NX z9D3GZe9h-USK8vTM`dCl*A;G2+O?k2DU!GZx_vXM-}Iu#y_xqYJkr0Qx<9n}U*@@U zUXnIJ&Q0!|wn2KdofD|>T$GwRS#F{Ii#eOYmH zQnt=-LyW*Dv4^sh62eAK!^Bh0#avwx$nt>E4h7!Ydd8cytMQdc`nA`+%kiz2uknX3 zA4xS!jM~%@bGybiSaVV<&{n@Q)z*p;Q^rrOVfrCOW#{VS0fP}PiklxO@&uGfr;zZD zhOa_t!P=&!eh=A>9XFEL7cO67kz0xuaw&#;uS89VvZL!wr;n&yd8@kbHMb~DqHdhW zDTT7v)CTX49}bW0PDu3P*V<3+iuE;ThHMW*c@WfQ=uqVx{~8gWrgkXFuNI`K@cke5 zLzTv^AD&Q$#?`}SbByX&g+7p96A4#w4^`bPzqp?*9$z2Kj#u~@J#`&WG5$s2iC$0U zGDNWu68v&F`UZ+@=s=JAhhQ#kaw;-0qSNjJxK$3z$s*e8+PK(V9c{N zxly)xu)wh6lS8*;!X%lh=dqh`vf1*X_ulTT4t~qA>ec{%b>-0{{eY(7@=^J;_MJg5k(Qw!mil~ z?cg`slj7NRl}V0reDT*ANh+)RN7*+^`NcaFO$-jf)I$z zSKFC!Gx5m|F!FP8u2yE`iCIa+%TV--SImC(u~*>RyO-jFeeu#$imyVEaevG+>y-R0 zE|hYJsz#{-d$lVu1@?-%0qjKvDiKK!Rv=Yk`> z1gDJB%OZ#mef6{!tv=e=9JguB1E>6VuQ#Wa??aS9E-ZaJ0dZ`CyDN`0cV z1on6;gAx(hRTmta$55XgmA_tn7h$Ld%)iw=Iys#;M{v&76{FMyzG7p9JCG3Ep{B`@ z{{C*b4}CX%pz3`gUcL{WiEf z7TjT`Da+R|c=_)f1zsa}dSVdq7`p~CaGFp;^038F6Q^ZG$|4Q^iB$F-gQ1$%+T{Wd z*>xyJh260=tapYx#F!%;FaHr)QBZw3+_o&u`N^6|EgO=jg-A5WFvKQxU6#J99U{QL zOrFu~!*~C|Nb#7H>Ogh4gI0Y3pez;`Ks4zP?hAMWZ zr3E=4oU4GXVm8=}yvFRQ`IkTRkEWHzNRr-UbDg1Q(eM z)8Ydhl<(KQ9NaYe&G_mCm7#Dhxj|>g$oBf4?{NiUS_#W)iZou-Ong_^b^;6t9TuX4 zv6-??*jpl6obV6`>cq<|>Fh;@1jHqr3kRBQo^9tUCqsC)1KErH&Jr{Ki#88iJo& zoh%3Tm9)9`tMVJ_pz{wM9tj^kK?M&!(gReaQPzUV&065eBFNTM45plA272P}RNIY@ z7H(-fkCQ1;d=SoWE=8Sr_V+!Vp#{`MN@wWpMsL0#yv47xu<{Rkq>_xBp0Dm5q!hzc zk`@TsG~7rE%Z9`h4DL_ZRO2Teuy|9gz2dJ#yME=A(9Dbe%|MeEK~B9*U2Gc=d5AG= z&T%75zjR0mpVjmtpcGaj45yr!h3PvvXne^~M*4vi#bZWfW>m^are?7v8pn;Bl7`zH zLLk+h7f$dk)*Z8?1`@hw6ZF_k$Q}zo)gKFS)J`2#p8@>+rZn-#idiHL>0mzzHb;$% zD{0`}7p?NW!iiTCC+{Wu-mE*5tsmniy@-gDBB~T?;yYG236MYs;^uoNuH_D$f6?I^ z#?qJkB_b-^z>|4hR^C^_f%~>`6$>Ot+`-j#3bl!ppD)N;C^nu423nB_kc29jAn>a|6d*=hC){a#Oq>%YrHv zl|NIs2jg`$^s;;rPPP(urP`_#LOjl`$~TW<21B;fj^LngOx6-MiiAWs%H^Nb$jeS( z7`?Yc;YQYsm~_yNv^7*TISY3=Z%RR-^v4`C;XFKP^Uuj-4h+_VP$)ThNG1#qn*yl0 zx}uTR2eKFG75XmOLr!N?6X-HfkbHBZ3?e1y(lZai4?b^vn6zj2R*Kr?>}G4Vf<4#K z__^3RZ~f{PDJ6IOB?oRrihW>$3Mc1)kKT_fd6i`5rQ8!(~X3#N&? zu#lI(I^$)*a$vNxQQ!W-S(~q=v0_i3-|8y-xB~(|w|*VXx-r>TTLAn``SvL~R@z}7 zC|}sSNU%0g^q;p2bKexJ8FKcZbKAmwzBYBT>ErwokDj56B}E^lif}1ZNZn17XPt0` ztTtf&ctI#O@@G+Bt^-nNE0e@@h7f>%Upx7%fre_3ydi=Y=-|!%T~of<5`hvCJ{1Tp zPwN^(($NR04lO0QY9kDXuzw7lz3nMf^+kb`ChMxtj>z-8olt^l`dmR}U%=Wnk@n}= zGDz`&03z3yDxPgqP{ZzO1+sNxu=r&wQUAWyM*J^?8$&+dg4KC6y)+@YV?f{|vkhMq zwrl@kD*APe1|P#=q=vllSma^FJC@CVx!D(Hez(At`-gX?k@pX4PZh4yQfd~#|H2Ic zfOUhcu$=kV!*uR+7KG77a5g^n3xOm*^Nhhe}dc#_R7CtLF|R$5yUVY>W|= zVw6TYn^7{(GLR|gv8uLfgPy@qmvZ0V>sgG=cN_&I5u*GOiVaC`wsNRHcklQ}*LClN zZg_<1tk_I4Pbe7XQW(Y2V+gsar%Q$<49KaH za`}dvk7+9{v*24Xwpw+`PgM`7spR%J1-~Ou3srQ=5bI0xz2>(zz#N+8E-oiZY*dg5 zEUDt|u{m*<0le>=eLV6^(Y9&UL`k+>VF>pDd5);3i#H>49T1&+3KlC5gr63>KGM?T zquWC9X@{LvX(;Z$LupBs9b$78?Uy% zNBEY)v_506q%+-rx1*|yYFEY0DnPOq!d~e`lRcta*{HB2YeoIg5^)s8PczxA;9Y_r|5s+z)YTZ=@U$H3Uuo~^;j8SRq0>%-MhZ`+kRp~aBFFy_d<|9Q0 zQL0dTd%i;I_5wJ#J6`&dPCBYygQbC&&_~nhquyYoLGFSuDhl3=FzT_OT6qY$XDZJ2 zatc~Sy9F_SV{*VTO~an#vDe~Z!)MmTB{zHTm;;g-S~fN@tprTa7xqUqXg?%1CMOXW z1SE=3?09)5b-i&b((O*Ju}8b;%Sdz}Hbp_EG!@)12}D8D{oK9o#^nUco%LQ$az{7N ze3S!II2sBXu*hHn^9%=j)L6Apl~XI`3GkM7q36k1f9rHkRHuT6)3m>;gTH4CVLBkr z>ip9xHo{sMypo!RI2>*Ke)f+Eg=2V}(e;q9STm+Q44sztRZ^*6V8IrdZX`t4RboT2?d4&M1rn!kp)rw${&AHDUNAk`x9R;o=g4^~;3MxkXA|A_{&w^R#0+a~+_H-2|*KBk~?FkLP zFzau^H{hgmS|BaZ*g~BagS>R~<`egqHl5Efucjp~57<3j_4L2rk(zCu^Wp!_)pO4z zHsC5`5UEs zE-=>+6L7|RF7MqpTc6DY?7T9+Vaw}t8#`LY#B-EM5^UK)YPfGM!3U%e}1WV?}O)n{&MSH$#>(~wI>}U zr_^m)l9a*i5Rs@gH+1P6&V%vu1Lkl7D>YHwQK;JYIAJItfD0YoYv6hj0{LxB3+JCb*p|N^;Sn`{OkAd-pekLwrmd? z7+ItpLLWe%Zq=U;XpCF2y{aQ7FB;5bFoE_0U-c(5e1n{=iy@a;cYBOH;SUZSTwXA&y2q!nQChw6@|h_~qFcjBLLD8D}f7 zOUIo4HWTrPP&cQ)Bd79Nd;0=K?f8Q?A9>lZA*IffCOD%RL-x^Po$EMkOzgaKFu{_z zzR85=NWfBBxf0($k?>H!GGN;;&M=YCPes6z+>K)PuO6uNc87WmR$vyPw20rnYcN^( zE>BU{I$j{QPxbre()I0l&{Rcqd(sBMn~Nn#gX#?lD$^u~8B*U$A~hvn%N@|n2`KPX z3&DM^trm$7)}7wD`<0+gs8zi^`JDBYDOrc8@Svxa4uF(URczz^HudpS7!c2_OH%ad z>E`y(HP1B>Pd_b%t3tR3gtNzx%55c#uHjG%PZo})0E`+DM=?l|z`oJk{7Wv7a>mbT z2U;t2AN}bWsdHl4qD>WH4x_HG2^K=m&XnJ^`sZ-r*2&$dyU1k6L`2R@xFV{Tmgl@UK3FW&##ffxrMh zhd6Pe!8|xxvu?)%eG2tFNFaf;!fjyQkl&GY$bbdP6S%KCbIcK#uq3i&`Lg05NcS!7lFc#9U8;tnUo&-5OsrSO z3P|;UeGybkai8FNq~t_5)hw73TeB%1(M}y(E#HvHwID->aVu&4Xw*;*cx>ib#2rza z!}3mX|6X27c*M$B>~pZ&nFD-F=ZI@~ye*YdSs`FvGs9ZLlMmxL8=~x6gbV$C*0^oW zoLwz;UxHg>fG1(Iu<){cd*~JvD4;;(wWmW4*dqe0;Q9Te^}fD*MP^SWC0(OIM*2Sw CSI_(a literal 0 HcmV?d00001 diff --git a/src/assets/TwoFactorSetupMonkeyPeek.tgs b/src/assets/TwoFactorSetupMonkeyPeek.tgs new file mode 100644 index 0000000000000000000000000000000000000000..07cca60eced03eaa6c22a139cfc141b51b1c8ad7 GIT binary patch literal 18008 zcmaHxL$feSuZ6d5+qP}n_I|f*+qP}nwr$(Ceb4s?ZV!^K%F}DqgJf0kqaXnOcYuIz zd?sS4Hxf?jAnat3-0+&OEY_mL>_WoCTq#wRC{r@Vr|DD$=lj}nj9hbO2{A~5q6v;V zR7%{PxpwXh)=ary8t4dK2N6ZqO^TJrsnj0>HT~Y z`59|_zyAZ8;QuSO_VNG9`aV6m_5FUn<@tUb{e66V-ThJZ{T$){jpI+8-1#Mm{~cUi zPQmZ}oW1q!@BO9s{!YdD9b5T*$$PwBPSy3@FX^9@`gwmq{ypK^eN}zm@vH0m?shze z#ZN)~-Stko_1*feJxTq}aev75e&3S&Y~70Z{>0$_-R-?U_XvhqDDeBeO}+6?*6j8% z^!#iP4a*KNG~S%K z^?l#C{e8Xled+K0yq@iS?EMVb-Rr-py1tI(ah~@5P`Lf1{r&3yjotl{x4yXj-IU?` zeVvryABXmRgO@%0#C@85S>IhBe2=7|=QX&_e%u88`j|mIxdJIH2MeVn_OT;E+MZL#HXxI1W z=B1g#&oeNXYitrT0s_Jn8JkLXT!sO(jZRds73;gYE&#jiV<8i2O-s@wi z?*aa2YAo~_Tg_#z;5zm*en+vcp<7RPw2HnDhvOtJ=6S6TZ~OJi?Q8e3j$F)}7uWqZ z)w)qBARg4!b;*0XD758BtgZ(Gz$K5s`>LJmrjv&~sa}oLrtmBTNkYCMGO%VNre(hNM!L2+HuFCS*)YM4+0s@9-E5 zUnAI-rb|&vb7a6=9t7QEOZW~(52}yd{Xpnh7jvczvaD;j#|n|{Nk}F7Wjg{>MQf+* zYF=>g+xxod_H~>7?;f=AR~de6f=vwT@v;wXVdYfP$3)4sRzjTO?~T_(Ny$CahGn%C z;jC~fYgwTK@VWDiTlm^9`d4J#=Ye{=w?rBuO4XR5*MeJO1hxp{SrS+G%fdrV*&91v zYR=tv==TbR-5vF#o>|zD{UpZ8E`iaaNjg{s_}O^H`q?rE8OOO~8gPJ;=7g%$kwWpH z#dt=uQBq(d7(d;(ok{;7m2-|y_&W|1rr1#d^a$Dj^j-h+B8DQpu+sSwmq!qf%$qX* zB*Dwpr1;sxWg2QC4_P+WhRBS1?itb8%8Hs}5Q-Fvq$3rOoKv{&NIcG)-8qY&_8=mW zm|QA?hve6pUo9HxfkviPJ^u_RB?jNXX8p-?~2b+cJ}i5zJZ5F znbpQJ0N`zoB=Oy5DR}`>LLw1oT8{5}j^0#m1P~l5KiZ`XZ-m~w$`oWFxl5&KgQ9Fj zmeQtFbHrf<2b#AwyP!*9z8ah>Rb{AJ5sn+bN+FFO@k}93*JC0T*9_ObUb2sNWwCwzKs zug{mGi7{yum~z4R$!-T!;f5+F2HzBR2OW5~982x$1?G9y=EMDvG7v5@x&eUc^qBz5 z{=Ph}_V*mY1W=B)Z8LqQG~$aZOfaR^qM z^Ir7rh0~*s2XFcYTOv-7t!hzIy+hI~VRtZ#B3{S+-GKk@xFDZPvt|YH|$%|z( z9+pK@$|sr*ea(<)YUd(r0uoV2w zAI+k0Tr^Z15nCNzp#Ah1z<>x-a#G5D!6)G&#R5kW*9_btaU}zGql~Dgilk|vHCeGp zselR^_r9hc(OqG25bK^g2d2C821kOCLy``@BKT*#3+c$<897~6cX%zD3)Q4F?;woc zoKw7ma_hJ@MM(}Pc2F**lyH0Lif{}!?{~^RP{rkuGI~IpMfS0MR`PHjH8Is?P;yhY zt7xs{Hg5nl;G%0bi!W&3*f5(A;wouTN|GM)DE4ro#DXz79ZA9+18Io%WeCw$67fzM zttcyILQZe!R>~ADPpGGGQkxTEqP^NR6AwN&|Amn0w$MlEKjfxrnPTW+$hm>#lOM?( zhQd)adUeNm%zddO#zeSm9m&h`0idG+0$7)l@Wm+o5rQh5u!A7p*bP&VGlVh{`Bb~< z0Ttw3P(2LU3UiFPW(HlbaLEd#0nLd3sU#&t)r#|C9!pfk4<>S{8lp-yMM3&ys@j)5 z*HBC$`I$G=OUQ9$QU0p?cNLS0lDF=6J9Jp@g?@cb8NDJx&e74Ope9t^3dl>S=7&|K z$r5j1vx_T}68Q`FizSTWwS%YXpQ9@J0lk2eHoP=*v>LT>s*~?8hvg>yoelNZjP#tG(r)XR)zxC9xi8Ovn!Sk>_ z8T`{H`=uhdJo>+N-9QcOy@V%|yLe_d23Y>QA&p#UeFp8Zpo_n!$|A5N>0G0oMivIxR|A4ap z4{-VqIQtKn`=3J9e+ugVDb)U_p!1)?=!rv^ukm~LOwHE$n$Jky_d$t^7u|7M*xgLm zv|q;1r|ua7d+kTcUFNf66=$$pP7uXM$<*9r>56?5=kQy0(A7AehDWMma@GuC&lS#P zD62B0@D+QOu@C%^H*=k5O)x*5_>-{WY-n;tyvK7r zj)+f4cXRVRf%Jh#56>E+PWk*@(Z6)h*M#JZqa*k@VN4$Rj?@j;*Z~NNom>&du z_!~#7y5SmAl@m8ZuCzPWBKtAS5?Oe|!{q<&?qir9ikIIc{kv9T7rxAuOvoxA8F~+T z%#&`}iW@5G#*CTaiajX`#c_&WVoAU$i?D6RC6^qB5xNe zi|2U*w(d#br-Ij=Y2S=-1`_nU8SMZ&Nnr*PS0U1PqD)2;0mB#Y zX*@uZr;noG_a!tu@k6Fpwf!suEd!&$v?_WR{&57&p#2W}6EDbB+-3(|#0>IEJ(6gA z1x^Dexlm2!M%U z95jP`&>~U^?261*kGkRtg|b9XFDdj{^X-p<_(at7Ol~2>r$W6elVj*=e5AS`-UpMw zZ@^X9?99a_7AH}6Yc<{9a&j_nO)hCKf&+dQNv5hM2!kk6;PbF+x~2qEdf(1doKvyF z&?Hpat{IYuuyS%juor4mxq2F|2iZEWEZVLDMdJ=mbUoeIga7=O{YhuVDfmjO-n)b# zgd-?jS|9ya0yB5XS$UD8p;z{L<_)Z4$q_i{j&g%a($rBq{FMu(^+PhkQmpmo22%N0 z(^ne{YWFNJ;>e`KE4EDJx}@prYL1&}-<75B{F_L!zyu}bcF#> zLhJpxHoP0N8LUMSB0a^<6a2&fx}4kB0SV#?i2C7lZpa#9gcHHs0 zK`^R2hmidPPJrHpm`KVZt-068<318vbSt1VAVN^jT|*^ zw`ku$Idh?pgi5OiH^42Eiw2znQxQ=#QM(5F}FN~^-k0Pd`toC_zfXAL{(CyZH zdJM;uhtdD;Tz>c3NL%S2Vx_7cAvNA}HbvY{axLKE1j`8HvrflKRE|l$gq3)g ztNA%AVn0{;$f6_M7Zkj9jveQkN+NS0+*bKY@HF=FvJ}KwITw{( z03dJuKhNJ@S#K>`4&~Yf(c4qOl@lut1%8Qr7NL8BmxmZ5q zhClc?OW@24S;%mpjkxfX$j7`+TY14sIwh9)TfxazP~cvci8lc9vQ@xQH1LsQJ%H(% ziF+xxiP7&7C7LIJ$7PIs43J@29vR1*Qe+-! z;AL|8PK6(NrU}1~k1gs`cVi%lUjt6p0I;i0=qSseW9V2u8(2J9m&b{2(H;Eo9sImt zGDbYLs>{AK$WZr(!V~pz2gzXPWx*_Bqr|~5oy`hD1$Eeg>x#r-nM+6a&CACq1(zk2 zpr|&<6+LT;XMFp39Rp2)GV)`Z@KIpp#W4}|6R<~So{Ul`uLyR!?vb_kA}v4$pO$3{N>xeR)JuiOQMz`?45tIAa$pSE6ja^Z8gGc)NxK zS=}C=Hxdy{oa<0?b*`s~e{Q{*5A;7vd=j6$dI38@j)};Lv&RDaae=4aE=Rlqi@QO> zZ0xYVk;Ut}@#C`twt2GXJrSWS3qRbT8zkY$g7x|{Jexy}K>PE&sn70)>pHRHzL{jF zb)EmFIp2=Y4Di|Xss>O0``-W+LbE@&&UP!HVtKLspvXof7fAlA3sXk1Gz1tc)=Lmq z-J9N7K^Z^nc=6VPL|inDQOYeqvxQ5>vtLi?|xA7Id3?c9tFs8O|}M*lF*X91nzJ+-Sd)WC z0>A<-ej(Ipp1h_V>8Q}L0EtmYE)KpVfz~xC)c(7=kYh*{d0X;sIgy8>j{c%OrmEC2 zv)gM+>ASx_%Z{>VWM^kU**gZ<5m51NKYbc9JO+NWB~CjsmJ~4dUtFTlV?f;#7WB$$ za2Hp76SaEKQ|tdn@5|=ZV28u>3gG262^mh;52$jT1G>~BEDufC2s6CRofTD%m#hw& z-7;iX3q5(27wAW?9+s)J(S~BaK#G*Q5 zL_4MKkhc(Ls+D>8A9D z&i$~o9>Kvzn7@(TIuzA-JDz>-wxJBND4JYWwTOkmYxmqzY!dHFsK#BAyqQ4 z+oPVA|8XEBAbxs3<$U!r1QzHafAE&r(X%LfWS_kjH+c|RSYG$*0fm1mkR7%tztO~1 zGmKfR2^9{LcNMFIr<)!ix7t_ z5feX)lQ3)`^(SZetAa_uhOK1IzJH8j8&0xVGMF~h-;8VFHv zn3&u~X8jB#NdPn}KY4sM6=m?ui>(+T_$@#AG@~eKLaM`s|I<{ft1bcfJRr@l?_@;u zc-rVU?b={hf<$|?2o)kQRRQmD?fF)vMi6NMPHAs=^`)2q1@Hhx;v&RjcYZn}8&E@z z1W^i!6EPBGE;mJ&z8SAViim>P=}@*%b~L_=^g${}I32SQ) zs1%ef=Xi!tuZnP1*Sl>qB7ITJbgg>=IWkwN0&}B$)*@KtpenGm)?DCI8PI{|7ld#XNiJswh{`=_pme6gI9(qjh%MUbFET$&{-Q?cvJ zgoqpT27z6z0bG*$LRJ=-!^q;3N89HF`l7gcAvEK~S=W+)JPsv)m_vZuRG?D^me`c1(g3m$ zW*+;9;&Kt;=&?!W*1X6V5f~5a-RHL?#uFwWhktxUO{Pp>i-b$m)Hvgq6+xlKmy$wX zc2=Qui@A{jW4n|Q@5LlY?IUeOh#R+qjoT`hco8Uix#(EnBv$?+kFqZDK`8Jtk$hAe zvWl`ZFU?om((^`w1St^dRYQqD6iWi|s4JzWP>Oi6D;*fSM%nh8i zgKDq=U$WCJwmodbFbebGohBob7sUzZwi9B<`7WT)mo{-?=5A-Ww?t~9WHIr!c4EZf z8&c`23`7gAb>P01jM^Fo`SB_`2S1M(RLWHST9$SMiB^XKbx7a_!chITDI5kU{q_g9 z5JM6qv5T^!!^;9VoNz%*@f`2w<(0A)#4lNkVpsR|A)d)hp4$Pi1Q6*IQy;0x4)M0) zf%j6FC2{qWw)v!!b?pRlcp{ga6nBFifw@Wt^xLNnmpq~{#1dAq7$+eLb{)iP)3-vyU8?2_M}g}|1!@TBe+!(m{;IldbXpf;2cFc z$%-ON+5QCM6|OZ_rgfNBp7U7{7eL*oDsii`pi`6y=R=r!O(r?Wf4jqz?SzWEDL?zp zi}%9iK1;8oMmlw?x73~V(eO78iMexJn%y_h>AxnN>!yfY24%jEKrfHESo*-BmnUio zQ=TD#T^9NX=jn}eCxbvg8=^S|;8D)S)hmvlPe$-Dn=p=>mI3>>+2An6b zzneXRq+RdICT>R_WIR*{Fl0d5#17V4$4WOEEK)`3yGqZvwmM#U)*@aT?(r}ZGgg_J z4co1V;U77iC+kiCTdpK0RO6&tijc74q->nNuMRVO(kSsqJ3_z(cIoP#oKzTu7nG$# zigja}zX)z>i)CL2oiJYK3>%!rEl@#k^}_fB#!WywvneqH?N0b2S_El88qAM(1Zi*H zHgNA3yIoH9+}(mfJt+29U;@lGb9Gb56#8qWK;QSiY~)cA0wTV+ZR7)5qHjH)%lMaG zuPq6##gf!Z()Dk1TFKq+Th|wJTETOU?@b)%Mz>v^xQLlNzNA9S(C+?wCJOB@iy=3V z)>@|5#S6!X4qWb2d$SQE7sx+V2aVRzyZ8FMUC%qaXW})y9k9eYDWU7rc(VZu6A4P5 zI#UTD*q3*m@KH>#b+qGy($+1>@MSDB!kcATkDVZ_Kp}1|FLT$EQw;1Y_vMQl4Y0n-^wLF`JB_UOxvWHcE2 z?p}u*&;^AU|K88_T=CpuqK!BGI1Nqgb^b#c_3d~5QxWy~J^!_YcJ);7Rz^RY73S*G zIr8=~|8lZsQ*jjwJ3yXhqAG2_7C8i3*2?M|-J#NlgLnL*lNz5cto+ zlUDKklZef1jf;M+vpG|i3JjB-Rpxec6Adzi!ILBd>Xcm#bqGh1rSzE^jr>2CRGwPJ zXIZnz<@jHtVty@Em2EI;@s2mMH2apktZUY~Yvjc@RLE;x1-b)!n>io314NqHvTDH5^H4iOun?yWnQ<^or4;VvF%c5@WPX{uoPiGTv5e@m>Rw^1TUWQ$p;fe=B=* zeH4mOOk7s}6hR3LG+rh+#3sqk?OJf|V3U;48DeIvpXT)^xSGm|0l^7=sO;aDewqFn6~ z=c!!NpL`5(csH!EDXOblKRPF{61cc7Mf;W*R&*8OUVXd7O*PRoP9 zh?k=+hZLQNn=s=*FLnns`|jmr0x@TLHZaJHQ*dq*a4FcU7f#O0F@hX=f=842C%A}H zx{B@MUUgLFZT9)2C3K@u$Neh|tg))ELNi)&7DgU!_%7ZG%g3>Lir)eHB9~6%j%zOo zO_!RQq>uF~M)aT+H4!o<3^=>U)d)bUEErzmsH*@YvAelflN;NhCZ8GbbTqHeBNi7v zp;%Il)*8K+cU+gvRHrj+UJl zYvs*|P?cZTMEQ$^h;5oqBlHGzwXg$}XhIMatcq$869uvA=^rYcDhg?ZyELgX+7%I4 zklw^C!5n6^)yx8yow?X^nT}5#{wZu^K4;b0pm!nfkNFyYT03X`VcDu~lr(dIuCSiHB$93WS%8Pm#wSA15K1Xd|Vw|kNLpd}evGn(8wOA`c3^E9z zHr#8j6AY(-98+$V*?~h9TO);wCSzAuL{h10ENUroq12#dNE0hi#AvHHm9tl|JeC&M z>Zj~cWZ476)?1*)BqDpmQ7t`MbA(MrGWdv?a*To(&Tai$q=v390DB7MfqzF%e@vfsQ z!oR_UtI!mOjHsj|gDyxZIAgTbKpmmkaKZ|u8H>8PX<`6brnUTjSqr)hEcCOKSeMjz)Tp3b z694OOi4Xz%;RDW?i2BH$L|m{iOUzH&AUs;82Q;ZLj7J5)%r5-fBpE^v&E-I{$b%A} z7?K63G(k*WLvI*z-bNHdaC@~J{a4SjukH1&77O>VJmhVpMPQVX0_aAfsdUcHJ1cafVQ$>V z;RHT^o&ZgXenO3h1~c>>RJY$AR7U}aDs>Eui%7SjSa~n(Z1(CYsZ#}}UOV}j{~^qf z|7}3jQ8~!8=`8AF9jlDalHsc+wuJH{7A|r10GL&heM-~1Sk4esgYsG4ZO<3zIzU_8 zX55Yn(W^{;pQ9A?X)?u;JFOM|O=Apa<@| zwO+B&l18tm$m|KF-8cBXGjN3?pMP^AV4!wBSZ{#ZVeq0j)&w9jV~>~>7^Mn~f{i^m zQLZoXrFwuVrm7sl8Yao*9L%!aooLRPnK&zx7iS*}8r;hd1a$fHX{ZIZ4UYG)xIzqt z@ER#X!OPL(>2$D=*2lyUe|=fC%a}SS`Zy$93+ic2R0d6!tH)ik!ppB0S+uExX7GM1tf^Mocl1U zzXk0-k5ZfjUOITA8at>(P^?nONsZa;9>L}bJ@c@FG{uS&jt@jPwdRVaS;i6NeW!jt z_K72_$QiZHgCNvH%by9HVY#BpQ(>H4m*Rj}DwYtVG3Bk&-%_ChgIi9Qa1Z9HT&Qq~ z-%2BJ{6(cqmiAZ9{X~%v+rYKFkZ3ysi|DH|7u=^Ygx?BoinInTqU3F_7Nqd z03)1gP&t22{s8!$)PEgdxsX^!RCv|@4JwT>1xTPlKoV|2%uMl6_#OsVQE6P~{M02f z>A%I8p+=Q{WmgN5)Ds>w5efP7xeYj{!YQ#IYayL}Yl~1C?eK0y8X*B*c^f=90pAim z@1^zutK>3sa{(VlkWAHDC9d|!Q$3HA3=RIJ3@V-xu=}X*9ii4j3mUr3j%!0Cjn~TaXclM2hq{_7~s0G>&eJ(K(ZBk#$R!TKS`_1S{zKSJVB?f%ue> zXMI?EAtH8{t-k+S?oDpE8JG4ZJ2{?AM=+*cgnP4KT0h1XF&`|O`oJkqaw$mW< z5(pJHHPgjbgYvs)fHp%mI1UU}4^MVi&VUy@YTleBq!6;#UPaZ0Dr_g87W}NBrln%rkLW zpTv|$>M5MJIsyhrX+WWjr>r+7(+dlUz)iV#YpH>Fz$30nu(%6A2~y=vLfD#$z}ME}CH({G?Kv{%$AAFk3XS4Oiv`&AVRfH7AZ4jqc82QQC}HM92DIFW-XWw&;;ZdHK6TrKLYX=M=V8<(~@Xl+HXNBOvE2~jNKkhUq% zk`=r;a4V;szI5{F-W)v70|pax4*xbq0r?lZK(C1YU)K3(DYrlt`9(vgi`=p>=`Yil7-P4L-=LIL%!M#U>mXH969&ws7#`>i5&ldC`Dd{%5u9JwIb@=m%*Q3~cZK!OYP`GP;Vx_lOG-iMC{GF^ z+Hd6ZjpbW8>P`&%foZd!5Q3N&M3p##5bz0=%u_rBHuGB&lBP$75U|RUFiKp4Ktp0b zbr?~jR?yFr?@$5W!Ik-u_(v)ypS?I1L=KDfZdNHYvb=m0yO|%c(VD6WPGmt@RAWhN zUv}RT8u?MPXQot(?Ra%z<9avFqj(BJB>GylSqvFMl6hm$A{PltJ)I|uW(p_)+PKNY zsXNm`rBJkZCF_{w;Ldc~DDv#KgAr$?fJGW@;CBU8H8pEdT;L-5w7$|1>i4*6QJnc} zSQvL|Md(J-ID8X$7wMXKkTOD0j#p9Q&m)BN{dOQ*_gs^Lg6FyxnYLv(Q8ojrId{v9sLImj*b^ zC6rbZOx!Z{SBqsn0|@xqVzR#`H2|9ycugCuwvRAidQoFbPm2dL{Bw&8$squTWKZQ! zf`LndP!LqcU?iH%-E*eaAS104m&JnymS43+0^=)Ft+L3{m9agCwR~Z3F1R9X9zuv; z!gw{E59vM~WQ3MJlXOU^=O1+Tep@wh5Lc_MC_YsJS0s|=vx77qQ;O^{FHk{J!;R-8 z_T|5Q-RL%wc*_@&T_N1!cmtGw8{PI}mf_UViGkBE0*CocOr)c^ic0yAoPtG|GHJGU z`SDc(hI&QOt6xxj)3z<4xRAb?XaQ(b8-aA1X{`(^Z3%8miOu=ZslY3nG<3Um(wJ(M zZD!jr{GGvekTOBnLH{B1Kuv6|_^?yXejEM~Us$6+`Rb zIBluo4%ustlqd}y?%IbOuy+qshW%3o9fVpiGl#FGBXE@}3gP+2Btbb8W5yO;Cm0s_ z0zs@aHgW8vQ7S!XVRub1N}_v^>qU`nj$QxR)t#k*`SpsxXGSVC*4MU=L!#tcyvNxi?NT%h@Izq z2zz0qY53H=ajL@~KE>~Rg2vvvkoQHf=4N2_5_eepeQYm&6R@Ad9fIOa?P<;fbD4DR zikG$aP4UWe{qMrHbW9#az%|dG9<~k6Efgrs!9opC4_`)8RrjB=!khVKGM7>$3^0J zL=K`;i2zM0%lJ|H{1do*@?V__qRJLygM$Dv<|uaouFd&(2I3D;cWLhcF3JonBeiy@ zDNh2Qj7gCslZg_pMHq6cVX3v}V8 z`J8DHAx%6r`dZedBvmS@6wn~^C4#|4w9B+3iHcz`NHGy*(taJ$C)JiK5)deWjb{+s zIfwky#1>2%{7J_-2Q{UDk7p>t5*21HU`3r4%Na2bi% zOuWr_d0|yX`zF+I82A(Ys~#DuhQfAIIH7N#)v!P+x{V7!FCfx5LHTzc8Nh&=@VPlk z-z)H!QIUq${u^erwf>xU6HsDUNHai;R~{fA!5+xqH_rnoe|riNz_$e#P#|d>@q7sp zLgh`}hYN`D0m6WQ2V`fq9|T^Xdk%m>tx}L>A0pXce_6ugwm%a>%PQLg;9v2hOG1G? zmqzFOpU|JY{NET&foOv!O4ga0H67yzR3vkV6~Hm-L!p8)+7xBK7n(vvMihfw{~j&c zUhRl_ZOc2)AW-xBG(s?a4V5&b9-dQCH>?Cm7>2xQ-K(b$mtIa(nxW0KRv~SHNb=Q@rGi z7&FrOibX#JDn++r0mce27d>-hjr~=(V62uHbR@MT7X^T@93Lamn#6M9U0M5|gP;M2 zEFMIHg;7)b*1An|rv=#DaFzDszMI4E&gHoB=`mtNoQ;pFz;DQLB1$}*1m6Cm1T?Le z8;KvOPy9g%1x&9$ft-)d`4Q^tfS4wj%Wlz)8{Yct(h6+|%9OqC-8YayWWj76^8!R8 zRtP%z4XqFm0#P8DDed1p;_xJIOTHk{D2|(5_*eNIdc4aN)_gUsN-#TeL4=S1 z5D=Dt(wf!ENi&7l*Q8#T%0?B$Qkb-JPu6<7orpG4)nm1HhOXT^az(<~F?fV8(dJrh14%^1wZ@R%UV*ww*lh$<=imdC_GN+BWmd!4;CY#vz0o`t%%XPg}d-!E&URs266;M8$%XG-IX^$0pt7ggFP@T(x(ypO;1A2%f;2jL*^aU1|8hS zENj>JYdOUW=iz7hGB|1L{<%d!~72v)YA*3`>uMj^i+e0 zQpJ)%NZOP?p8a*~u@8JBS(Miq>Y%f38~=@sU#pBQ8~k!zTX9-j@!KP9)l%GEK`m1e z-AwB2iolzMfNz|CB$7g3qCZlW@ku68po7HFs9)w(_3+!OVby9c!n_4gBz8zCMGt;i z-YI0!D9&fp1$jd_TuR&n$PY;C4v3mAb8$9IHQ2LE+p#x&G{C(P)OuP#m7t$gU#f4v zUVlL16+wFGJgm^@u>D~eLY0xy-#>SL&=Gz8nI?MSx8bi`XZ^c~H{FX~KC)f6k}ps7 z?mD-VFHiaYySUqOe{n$BDQ&dr*M1kI2dh++keX<6HQlXAcPl8a26G!zJ#@l91Rl>G z^3b>RXF6a#e4|BjTg@EbZ@7>W%#Z;8Pqp!+K+8Syg68m#F@geJPCo%bCrUq1(3^>m zBb4BuD{V&jUUL4-VIB$ywMmjQLBW|e(Rup7U#iSEJeOtzY~7J|V!CItMsHRvc%Z6m zm22z$c1;IbMzsipYSM;#kkHo(lq3w|56YJ@NkL=I(C->xfv^|y-( z42%rv`tNSW<3Tyfe&@Byk8mMGIp_LF2;Q1nPo@?cATL%Rc`-%*mYt7ENHhDCXaN*Q zZx~C?aOcz!VbP8#FezHK>DRYljcZwb2D;_xJc?tQg!hp^i$ZS-hS*-9rtr`?dU$h} zej)&1*Y9uHfs&u_%+}bwM6Kxk`Hf+~&IRbK*~n4_UUZFAlzvcOqw$)NDm~@s88E2` zL1=f9PQ_Y~%ymm{__7s@Yis{%=m{Oc z+%*j6-1yv(jwlGCXb@ETc~L7H0P*Wu;nU*o(Mh%hi4}jReWhr@DQhTvO9Z5PDPRPe z(|?d4>scmtfk<2wMc~4sp#H(u&d-@dS|%P?!O6I|?H-xg7-kz$bRVkVt^o&TBf085 zQ#O+P=pyI-p$58v-Vp*i;T<;kaZ6V(H$5J{J21p-k-D1!)qkTJFTMy)1x+Edv&Buq z3ZJ3`bU+U}0q%;Gm=0P(GnA2BaNya@_o=DqcN4nK+TsY7q|*AVErRJP;#-KsXeRTv zQCcbji`8tK*oMq64qSgh~#o~KS81b{J z%rah&-NGNwTG!jr&=M8T-;!d&)D6V%AbS@W!*4&vu(PaC*zc*6Aoa#3F03avpAov6 zXH(>1oX0^Y$|#c-A4Kz6)-T@8=*J9u;A6L1T~TK((0OjMX0cBjDB%s6#nbj8ow3uh zAsa$F`21ELq9veUEYpR$3Q}`W)F(?ZF7bAr7jPq&?0#tUgFM%;gM?z?ewZ!uF~}vQ zLWm$Hh!?$P;T@v(+k*BWR12lEDwWI&%h_Bgd@KSOpK~(w*nnavhpIPfCmV#0IFB?e zWStf}ho3d@etKG&6+T;UO6tX5v)zS8`A=t-d6N7pOBNK&ur$T_P%-$Qa_TyxFk&q0gox>B(0g_2$ z5BRNe8P-@J$*TNmS1!GVpr@M*`<|CyUnleE!IchjW7XX^Q5INenW4bUN*sC^J!WR` zXZANW+(#MMx{lv7u^TN;gSD6_p()9&YDhKZ64aAh1V!LiQ298&z7WC1|E!T)n1`4@F@CtF7&~*p&yc08^(km7V|w(!`}h zr(9pP^4jyDP^Hv(3lam1cw8yy+Ua+hrY)&%OX1IBXgg49!c(AU9K05VqJy z^Ph#@wTw|=(e*EJ@&bgBE=Ts~)`nS3*V<$@6)A?K-h5%3VUaW^t@)1cV<50_rr=^D zTk{N2ETb*RZ3z$LxR*pskhp}{|N9~WOHN|TOV>;f08Q~n#!=KR&7+-nnmbMU68gOH3N*^>f^t3W2K|u@@ zH)t(!y$b(n)W7T2-^&)?Pk7%_di|a;R?yG%xP)ht|FOy_Q=|aAvGxaX<9Twvi`{ZH z!us*W8S-${`05_fH;i&{rd1ltyzdTNq)>b(*V`W$=K%;|36QWQywoj$vLWPI&dQJJ zks-Qchpvug=;fQzm!*QLue*ejZJ>sw)()oX4zBbPnJO5@Ue4K^|E7?en}4eGa(`}~ zWb4K2obsPQmfQzY!}HL8zD4!^I<)xtnr$Id_kBkvBlx?w`+k~9Giu=MRA_43#9WqJ z(2~QRQLL0=U=7ey+C@T))K6|)?i5AKO9bxsFK}jQvZEefka|J#%(4sDA@w74klJW4 zsRBP-p;*`5FkgK_KbK73?crr%l?&3D8=GT$d&wX_!?N zK3)=DWvzck92>Xt&BCb$5V3&~Rb}muzKp}+r7uvV$3jo#)7#d za!xGRsmNtNmlO(J4lSbKu5w8mQm(Gkp%;mY!BQ8@iCQZ4DzM-)v00vRjB=$49GFu3 zzX0zA5c)d-F6bFZ(*bFELj0as$uqH188Gzwb@Q%j=@CSMC~nCLev$Wxi3NRS%W(xy zj^=FqG*E8XVsM(HFvQ<4kLQkvP~ZhJw@mrkBGej`hSN<_$f<0DNW z+l6@)Ri(8--l{Mmn-?6joP9!)?UvI-<1}S(qts>+{8bT8mM6c+(Vl_eYn#2Ll}!@% zF^vORr6p_!>Qf*Xi_YXVK6P9}c&#E5Y)lLYVP%(U2wpV=`SZ6Qw1(+h*Az5M4VA6J z|II|BhhCdPGAgXQ>CNtCRzS|<+_kuB093a4yjYuZuC}bLv!`bp{9v$y!7jip)M-7~ zzq93*`CdPIpc!`>R* z{O5RVVWZKJ!XD7xL0FRvF?s9GfV>7M4mD3KB`8bLe0rGsb#{Sae9xbRl$ZL*k3D6J z%CM*mpI>E2@1inX2cmF}%CN91NZquNom{16wR#?aJQ27&8cr5M3`t$ca?V)vmzg`L zg-N{wrX|W>brGWiF3uY~tdHEZ|D1J&8-Hq@z4QL{!2sv4P|;jqz~kJxAs&Sm9fKD* zYCcY6Ew@yNaeY&!8)JKqjI1#sar-1Y4H@{I*Q&Qs!_-2b9(H(8DVs#hLdyDJWl(7M zy{NZ0M$$4#R}r~k`D%?bq*u4+HBDYQwFe6$GlVdKir1pB!z*2&e#QTux3y*QZ65cf zZ;Gd6&UNc(^h|pT2%b^KA2Yg$yN48D_^#a3yaL$j2BP((I`C_QpZN1*;%NSw;pj7ZSV zy5~alvJ_K5v6z^n+SjP|uoUFJqDKW5@ug&m2Y?U_016ALMrnbyQw^)bZ6G>Iq$U!O zw~^$6s0ym{_!i_baYv0hya~^#v*)ZU!U>k5vG@Msot2e;fd;R9LGo?dnJn~%D4tKNnm zSPn$j%zigNEAWLxc>4nC%heY&eg#Cn$ljBQ9WT+p7e4IJ*ztqK)`{t7&R)5T?6fM+IqqCk~2|s^_4IuAndvyyIv;Z zfHFYhFob5&Jc`AVu2n#LP*+|si5WfJQjn1ICksl*Ompsa7W>f-vQEw z)5->tpT##?x8h48niE{@Jufb_C-JvL#2}GLjU2-hE;At?bZddQ@gvCNbJ%p^dqq@| zrE4<>Z=v!3eec@hUR&74`?8J2Lb$Po5HGe6eAW`v6BfeZEw{B0*2hhRt+xN7iEv;c zOh4JT57q|;!uqI%;3I6^I#=bXUz3)yq=}p*oCajNp6MWQK#hEh!u?NBfPrd|S3MA3uOISq7twhP9 UcE3&S{`$}V4>lR)#@lfM0CKgui~s-t literal 0 HcmV?d00001 diff --git a/src/assets/TwoFactorSetupMonkeyTracking.tgs b/src/assets/TwoFactorSetupMonkeyTracking.tgs new file mode 100644 index 0000000000000000000000000000000000000000..ad52d48af38d5bb93542d3b918a6ffacae5f2052 GIT binary patch literal 12805 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 literal 0 HcmV?d00001 diff --git a/src/assets/chat-bg-mobile.jpg b/src/assets/chat-bg-mobile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97c441541945cb372f092f3545db330565338459 GIT binary patch literal 8204 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 UX1W+o@m*<$*dY1E(7$8<59v8NR{#J2 literal 0 HcmV?d00001 diff --git a/src/assets/chat-bubble-green.svg b/src/assets/chat-bubble-green.svg new file mode 100644 index 000000000..6b0ced023 --- /dev/null +++ b/src/assets/chat-bubble-green.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/chat-bubble-white.svg b/src/assets/chat-bubble-white.svg new file mode 100644 index 000000000..ededeb4ad --- /dev/null +++ b/src/assets/chat-bubble-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 b/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..972c566b28fdf977e5a09fe1d1c4295798904efc GIT binary patch literal 6864 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 KU0ZOGIRF48byNxf literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 b/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5ab8a6561a35603d2223a320e335561134c3529e GIT binary patch literal 11056 zcmV-0E6>z-Pew8T0RR9104p#64gdfE091Sc04mr30RR9100000000000000000000 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
  • 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 b/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7aae2e9bcd70cb82f8548dca042501ad4358786d GIT binary patch literal 824 zcmV-81IPS#Pew8T0RR9100TGx4gdfE00rOx00QO!0RR9100000000000000000000 z0000QCL3@ZHU?k-SP={gf*65$3lIPSHUcCA90VW*g8&C08@>bxE(UTkK2@T})}!9C z$7(@1I5_-XEgt@VfB!$%KIdG&_dcNHDpf$Cx&26t&MGH`M1=C4F8qJ?S9j$8(-S*ZOnpnls!G`GW>MGBFb~S@;@_kEq zdY}OYmgurcv^LPE7U0As7(*ZsrQNcY>r;;;IdifP5t44e04yaTgoFkf0)d*TdU5MU zr-HMRgDlpLb;*EpSx(K1>= zdjxHYZqZ&xZl)Q`T2Lt7H8 zP1+@RwQA){VA3xw)R2`S0_%e)+z5S^4u}arOG`&VPfe7RP5_^*>vo{b)-{PmRotU95Y` z1l$IotoS`6p*^f~v6J^Ikn(*#m%i-SqUiot8C(I+e)gUWyo%-TU*lS@svCt7Kve=k zdE~!Ab@+Q+dtP-LEC4_`bj(fw;*Vn1?vRcna@8J&g|d?dn8g#In_>C=`*^mbZLQrpp-Bd2d5|{3llRlr7-~k4qilQg5MDX zr2$@EN{g}=S+hw535z4g3>F0(3dkXVnes807@v}Ni19kmuquW{xIDiJ45?L{F0XN0 zsa|ild{j^;QK|q*;k(bL6;uk?8jHXQ(GGf+}5qcH|CLExXV;uk( CpKj9t literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 b/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..30843410d3fa24e4d5926bc2b07f0cb66d668e50 GIT binary patch literal 10552 zcmV-8DaY1#Pew8T0RR9104X>C4gdfE08kVF04U-B0RR9100000000000000000000 z0000QfleEeLL4>*U;u{<5ey3QJlh@%gIWLqHUcCAhcE;n1%m(wARDDY6Yel$8~}Sj zMobiCd-P``5yHlSh+xkQ{;PyI#sG82%A}0Ol$Mf`F6_1~YX}Ced&V@!x%TyS{5w*N z_~s07hZRln=OMED|4vU=&D{4_WJDnboNovylkoOW|G>|!_ZN(jB~oIcAgvCA77UOy zh#@0$FkkoSTxK!ogDDfVY#|(xAe=cvc<_Yq69_>T0ud$xB3d*=oJ5E;=@8knA#&wH z+;kJ-KSdD5iXlpsLR6@Nplg6&cn$H+JBT&w5Sutn^N8=|dQl0uP}AcEZvr%6X{%}$^bJ5gA*lxaD` z*agIh^G;m29kl`kijyEwYLveQtJG=4a9@*V5433Y&?CKujhHZH+KgFq<}G;cmDg6S z*?>c6&zSXsdr~NUlG7J??YNyaL`0vk32hanHQ}wwZbfeI6t#+jdoeZcd04FmbpsG*WX`CTOxWcqi(l)tq4EFrM3wmv?wNB znAL=en0zGnnswaCM+mQQ#e?&b*t(27<&-0@dbbK!gxBq|5y>|B8IIRACA1CUy_Vgq zT#CBh9edW5@$26P>L3grc)%E3?5zH6vtIrCA1WY%16U~E_#zI3*5p!i%o^d2Owp-T z5ff?x7{3?)L)D8gpguD{h!T*QQlhP>1%6;ICb)WAQ>L^JDPP-Sdms5*Fs~}tX4=aO`@~M&I-#}|-CkDgwj6oeIb|BNE)6h$zk<6-)aC1F!M(^0FRk7l zm0}~|WSUjozM4yF5xW5ghoVP0@d_3f8O7vQYY1LNjbkvkxi;21ISr?^I60G7?EKcQ z+@4&$hS_}Kbm-KrXGTZgZSyEX?7hNBpBwDVlR1&&ALIF6hfiSu&e99%dDH_jn| za|`6W5;-E3^GoC0(mAh6E})9z)o~v6oKFMi)X4Gfb8bzX*8`5y!r8QPl!u&62gmBP z+51)OCqd4wm-8Cth!Ku9!O^BT&NLS>!|`Uhh&hfo&qXY7yyu+DD=zFc=l70dta2f1 zT-b)qF|u)0P=E%UpkoJv2M$V#BYeJDWlilfa8~Lk@wy=k(ovnyfzOw<&x*UrXWdwN zfyh%FPCk<`h44*qbK8!GgG?p1(oA+C6R;A%H%7q_H>XA%SDIY}Dg=923^|=xmHH2< zdii?!CV5|oHyO9eS6Gm@rWzep$hD@x{MNx?}j_=8G2u#rjmL>xO6^`K>l%PdsltxW7Mn_D|lX*M4i(vUuu>B(r z2~zk)SR_SG+zEO#MQ2RU(|I@F7KP<+|CoLXrsn|DBVf80Os|6Jw_rLQDCB@;fpzHu z`vHdm7Xmi|cLN(CSXHiq(Nv+iQCg$gHP?Smm#(m5kN6We<>1E5xiPw0PMo=LwPAD4 zq@H^*Yi55ZT!c5?PMwDri7HC87_s8Sdudq$nnc~YW>D#4eUc>8xF?=UnPE4!<-H8g zd{Ckk*MJ&VwN{HN2jb9fS|AQ9HDBmqh@^ZoXu%KuC`SN-VFWTlP>E24q6QRDP>nFq za1lvJ#WkcM4J$}TChU-dT&y7vH{pO=_z!dxq8LsnK`AzH2Q_d59kr+axhT&l;&n&#WVsnlHAD~sk` zJv%n1=Bi#fm*#st=VtS4;O>M#VTWqX8~{H6$~(YYVD|aIdSLI`0EK5g}h;DW-1Rgch4D+mhK zd5(A;Dp$0~3)<%mtM*{VbMBfG3OeDRHt5V?`)&II9Anyuy|b_ZB*s>~1YmKSf zOYh3Lwhkloysp1ra}C3wu*F4v=g#Zcrg59Q<|Ue#0-I39?CUH9Z-fMUJ6>%%+e2?7 zwr<}vhy(?du-j8iiMpoGaCOJx`kN7X`k%@i;)!7)0c1)gB6g(*2kb+v&gi%{GTEL( zI^G*jSSM%=cbJ}*$ej6q41@QVU&A1e@CZ++VAa8{5;yZ!uhwd_QrnHbzSTP$omBg8 znu-b&`He{AH!=n=N7K5}P-YD0OFSVSojKDBB_gUsa*EYdU7Qzu_%KhG0y~u8)4DP0 z#a&rcJXaJU_Jtt9t?QYvlJxg6TAUc8u;19|0F<~EG7a~+96p#iP9effOWdG)J?^8& zpr|Kee9W}SXR%x8O#WqiW@Ei zfLhP51+&iztnPuu(8f=9L1UM=%mA5Griem#ccRQRNJ>QNBxZ8QCJ4Sd(+mgH!xR_# zQgS=l?I8QyKv*QJdmzy|DdseDtznxk4{0|jO)1V1o!n@yRKP90Har64G+39iv2SqP zY9LOwRJV@qBZ=03Wnhs!`e-xS=-^86Mz6^so3?tDC?0az1u_Y0g(tKPJ3{yS`cTk* zM+tU!$kgFZULF48tFiM;^X5jw?$MyKpdu5!UzHPJ0LMBN9bda+WaS*zWeuf)%VbNv zPnl({-7$CMhGSFbxy!F1=WZ{k5Qt96J63LizLmwV$8<&FeKg(m$ui()In#3 zU9y)bv0G04QVhMe>UAYyp4;Z)%dFwf#=aEw&1k8er!8vB4s9iTKSUJcZf8A9(Ux{w zN}#%o3=!usHEAJRN!{(Igm$@u-L$e)mpTB^Y0~X%S85wOWX~%`v69rZi(*j3K`pSv zZcS=DM~enE%u(_z7CMcA+p@83(8~2zycuiT43#cI$!vzgYu+@O*0PMv| zs)$E&Nkd?CP{@wUwAQyQ*BX*LV~Dpp7vO#`#5K*<8-w?~Zw;kiffJJEE_xR#!H}n#)b)%;hi|!iGN;V1LXGQ@w1};@_)s z;9jNT=bl4>_~;(=@0!a%+^8c#P-kh*%4GFl2|%V{Ndqy=6G#PN`+~_RE@jI+=GNgd z#BD;(Zk!whg#g{idP85x6T2~JbJ@pKG@!_--$gxZdV(O6Q{^2D8m)RDJf=7zVo{9a zN=bzuDnMZ*Qho9St&=FMI6Bcj1K#ME1~L`WC54CxXklk+fl7_b<6zRmcoL0Y6V&@% zBLx$ACWN%ao~7a(c$w?DrGkPmNKIr2(f~shvcJ?1%pH&X+1xj_omVQIE*AEe)oFG< zT+Qsc8jIi**O4?_6bVqZ~{`QG>1WPE8 zlG77QOjm44=iOnIs0{)N?_=3`Jlb-^CaLL>Ln0e9+6js61txaYfT;F&>942o93R|H z%3}b>SstjCn_eoTvbrI4wVU}ScUC)~SbnsZmMS%tg=F6>Nr;hXM{cTXnTAa}mY8|% zqBt17B)HI`A{-|m6V4*D#^wWIC45jFuS*>|MC&F-;Q`vZO|9QIaKN(WZ`mT*tQ?A! z5$CcjE6PNNzZ5AOd+nRaY{XPw+vp}$DTT69_K@K?ip}}AI_M@!b7qSC9brP-=ei+*v8iLitFz&+My1; z)*CfusMes8U;-RGyum|Lol1qUx-eDYKfKg6mj}%p#TGLZ!62)It_@{Wy@9t1H`HEb z2G=mIVW*UPw&#r+@p=&t5e;5e6{D+7$(p3lf)u{n|iQ zsV;nFIc=lJ?ZZVFTn<*^W>BqcL`{>av;p=5b;p)T?LcY81U+t6Stv5sTW>}YEX`poKRNMWyL5&N^2K1MCNP(1Qekp zGc29erlp>(72^WS$QCcQF06=gzGP9$jBnh9?#FsYdsrMA04!qw?Q9EJ9Dl3<`G3xk zmAh!fE(x(iL&>?=ODC@@(7>Sk1vG%W+X9?Yu}}{-$H_S}R^);i>?EnmIU6v!|6F+U z2@|4`i)qO#HwS9#KH}+ z=r@Z0mjSbPO-s4D0(H&zh3X2kI8*8skmEWf5oJ7Z;1o? zFQ-9ZXm#0SdvZOr{hxo%($2}j!rfe(c`dkb>`G+M+a6TiX3imNepG`I)!^4eTwnynk-8W0_icLW@)vQG zV?Rg2?V^w>H(G3jw!>2o4!u&RuvET?X#pI?KLSMh2gu2-*D)#m%nm;XTl<`IF<2(B z0TWCPlt%ttNy>Y{C(g0SekbhrYI4Dvfb!oR_NwHrZ%L2Z%hMiFLQ=Z`7AHwO=Y_1~ zxt{nh`SV!G8w+v4H=7sBXo=NVj(ndqw!7wRZFMC~WwJ>{C5@9E4Ug<8X?#ZVtFjSJ+zQh*I>LEr19O9ACwdvy=kW6N|8te69=I`sduz5 zE?UqS!;QB~KGkkLI%i|=a@8i_s_wQx4y$eOwNHF3Z5Ubjg!+*DkUiyQF)i8S zgX1%2HKW@IiG;D)0aql%-cZNZM73#yL`~+U4oLZXQ6QE{V1f+BbXD-kH|fH#U(eDK zVDU42N}_WlX50y}PC0N%-K5yy^sFvk@Q!szxU!WJXdS{gdSjKHo@6(GF$?UG${__j9 zE26wBMrH;7FCuyj{q-N~Pq>}&I7-xu1>A%We}9V#@r^TQM1?qi15w4+je0}cdY?n6 zQNj1}xkrB=Wbd4!m|U~>zj*c(@x1$R{p>6%_iTif^8F=x%Jf2(hu4cuaoY-am6CTfv3HW*r5LPcRg51;Fv1(4K2KgE?+`{n z×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 G&4Ux0^L!Wp literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 b/src/assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a7b8b2740ad77b75842d86b1c433334011bb7e7 GIT binary patch literal 7924 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 KJQoK`qQwB^)LPd7 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 b/src/assets/fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..23cb3ad4450dff905e3bacac981e5e9b66586e46 GIT binary patch literal 5004 zcmV;76Lai$Pew8T0RR91027P=4gdfE03-AO024O=0RR9100000000000000000000 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 CxrlrK literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 b/src/assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..814b9474cb292ac934a2196854131cbbd4f0feff GIT binary patch literal 6720 zcmV-G8o%XtPew8T0RR9102)954gdfE05og>02%540RR9100000000000000000000 z0000QY8#eT95x1E0EY|_3<|tZu67H85C8!-0we>390VW*f^-KU8;vWo194L&?I}q9 z>jP7Um^z{H|44`or(v^OVmcH;br9F4d%%t|?1}WmMdLJ{-+R&dD=@SkT#)fkq0^te z!{^5}xWpJC$t*^E=>NC*IRpLO8Tdu0s6?nlsGJBx+geHKlxHC6u;0iC8RdY#8@1*59NesQ z2nW1?inm4@zUqVBSk(6af34EioxkvF=bPHFn+{?hADIY)HpW!_YI^m%8i%TDh-z?q zI=loRRDe}O2+4(Agp6Dp86h0Gj$_h`% z36O=?jjz7`YeAvm2LM{raLFt)MK1X$3MxoZR8flJN>Y?oo1(6|6!kTvXsj_s8yzV+ z>qF7cGzx_VxPXfS6yTwt@}%m!ViP2NbRYkMq_2)|KOpIs!So*_5r9|}p!$3s{{tIP zfI`p!4Uf^4VmblJ4^!Jb(??*sM&=l+jFwp*rYn|xL)TQ8n=R>u zQdeE?>c7S>tJIpmZ}Zh7RDPXPrLQdkj16;oUZC6!WI8D&*eO?5TYR!2ScHPA#;Ewt2DdmVJr zSr=V(*Gq4G^g|2;H!?Ogv#_#uG(|>=dT8pQZ-==xwx+r36RcY(wg@PCfjAOK2C155 zKsg|f5-Mm`erXM=2i}fJMl)Q0(Y$4BYv6z*U1OzNy=WBG$;RShHA^-53{=-L*p9>z zFmJN5zAfg~*;?ezyil7BuggnL$OugWa0MqG*$9)oK_U#M(T^wX78*YH?hSTY|;b z9CPxFR{{ye@T6LhZBYZy3zk>BWV&(PA`x5EB&tp!if5^sqZt9#4E;v+d7y*}nlu4swCrPz1Fl4B7VlWJ>&So%5~tppEQ$-wph>r=4vd3oE9Q|_z~%ZJ zuw0cY62b5on#^jD2N)PIV`v1H6(-`M%s^6mO39R^U&WpS#3~VhJeZZn7G{1|xAM>! z+niR!WrPOC79@zZtpR`0PLgztl?YNHH2wy?I?RDps2HKZ?EA`BpnL<0O{&(T-IQ)K zNH8MqK1tPr4NHj|g}+**djbAiI3cOb72{P-NHtFFcy+st2qOVWOs>h9ZkzUOWhs#X z9#~qco-=$=0&n=j9o`0&PQnH)Nop`HY#6XAwLHMO!Jt&LrM@Dy-HJPv0Ow_je5Aoa zzh-MT7GTZ^!Q9duhEXe)F;_n=b5+yT$S%;%V63CJrT@6wLs)YW4jZ*ezF`~Sifh)P z=84ryOt<97m3Do$q%DK(B?ULrX2{Jo*sb|8pV9fITatOx4Ix}w)mq;ytT2*ZWvg(bUO)n@J*Ds>@6##YDvnI0%tgvcr4U)~f zolCoTK=A&W8?HBV!(mwljR?5-davec)_0SQ&yX0ui_!geD;Tt~TIzyg29K-la;S8- zGdZH6b=*RhMaP%qt}M-4Dt^?;C<-oNJ>!Kjj^DR^s7aza|b5< z*wdS*Kl+vbdz!nu>}it!O4IU$B8x5}A^-q<06@Hh8#zw}p-l!b!o-IRW>`OFZn4Y( zbmiJ7==jkMP;PJt08k3I1P3>?s#Z1tSF=WJyqMIG5ru{8NPD=nTM*oJUaT)ySWzr1 z%Q`LVLg_rBOdpX9Fjn_6sC4`8>W_4vfOcy!sooxHysu1dKo3P`myNQW#+@r!8eKLp7x1*Li#W?>la?7vT} zHQ=AW|MY)IpkzFyHJE&FleCdZTbZ?+@sXEv>a3M^kzH3g=04^0$gBETPo3ml32xus z&nN$Sh`p{qy}`;UuYw^es-&_ihN`+!sG3uCrzuX2eD=o17;BvIYp+%_6HGNxbFPq> z2u6!SICCZmQJgkHG)^WVI;X7=;bhjuIIj(~gE-+{APdChbQa>{OcvtjbP*EZWET?T zbQKcE$)QUqJPdS$WZ>i!65;gFB^sUp zI0JRbt`z`63UUVNQYgGAPzq9vGgz16;U$4`kW!o>x|9wt2ULWV=L{86fm78Hc+N^- z7^Je{R1;E#GeSsJPIV#Gh8YQQ&Dj9dfHX9mDMA`?MhR)`;7&F%oY6v>616VP&f5}< zfwbyr1MtbVXU+s6?Ko3~wC79|(t*=lmxbqD1X@52h93gckm>n1Pb&%y8!dJO0GI(# zeqa`?vG9(A>JQZvfB^t#=%@}_Y!EYX=aS%8*1#2YjM7bnW+lB_VxPrRcMB?Zb4gOM zt)LLyDADn4u=RlLq`IyI-9X6ib!=DCJyBa6pC{-By*b>V&D@9aX!+B*Y9M>81ICg zq(j1u_beTdek{e~oAY{xC7)k<`F40I^MHel7!`fiyI|dun26D6RiR5u_aeU*hV6&g zGASOW=;}3P8xQE8m?ox91%_Ty4y;fF#|XgHLMA(~h+%~`^kRCe*PwnpOEgp{A_H-3 zfsd6_F(|V4N~(8yb8@4%)Sds5Kt;!mX#U<87I~58+ECaZVxmX6Y01k_6|s^_Pb-{X z(B(PhmtZ=@JiZ;cr@eqEUS@~FGfCFyDK?ss=MYIHT_yCYd!+v^0My}k-jRt3uM8!dz1jr3C zO5@@CX_76kyzqD=M4Rq@16wj{sT*_oR&+Bqv&TMTl-KyDs;K9^q-hOimp;190*;CI z05^D*_hTgol|LVYw-d`XW2}qd_%cOFttL)(9v45&15qga9|cQ~6Hq=1IM}`(8X}U< z25S4EWNwum&EY6qJ$Dfkt+u^ zCzUM-{ahs1Ll}=6fyAv=5FRy4>Fe4HiEP@&02hwx(Udr{NefSRvWMyHNlX}RFdJNH zL7rP`9@-vO)*o8Bm$*fJ%3VA!7lCDBu~6Y`>|ZK10~xkX9Y(bNR#K9+l}^@}qD8uS ztXJCepBvogl;3083%aTsinXmeoeq6Sg!93V&nxo5_q*c_PyF4#_?8`)P;XmB;~3T zBbB=yzgRbi5=vQ>Vu|A0&_es|WF_^)xh{paCw`=$N+KV)XlS)fm3m~VjL!C>T$)XK zojF+<>wLAE-@E!2e}4_-wq+xSe3Fn5z5&BeF%UPIa)Zs&H1cX%xX*~=L$rVr8|-~b zsKtZ;*RqvGKH%sr97@QZ0;@4%+Pg-N&m{IWKQuABNXNMY8GdeM)h~*L#cui-=oyKx zy@lHDqgV)~IX-@(VtQC?vZvixu9;X)%?Fn-Y7&o%>`Sc@^=>3biK?jOXL`kdl21M| z4*t!PZ9%c-#MJQrT*X5g2DS4m)iGTS;C8o{VW8*dL!TJghx!?xN+j6dvq28PGRD@{ zo0z6fiAJa1$OKmTe*8PRcq5zpj(>cx2dC7%xI;c*@>xlh8_FaeMywtCC^fiZT zp{0t(SN0}*#Qvl#if?C2Y)c8i{< z2l(9lB7Anl{r)->rc=1OqDvUPYxTQF3PxIa(SLyXP3Y?{R)WpD-Q2gA^<6blBc2u+ zM5HBzqm99fH-dctD_GCJ+}>nUaN-eB`|M0>_rN&Ilhn`JDseDm$ zG61iI#)M?H4yAeg84G{cyCi~<9mk}Ud<-@WkiYc6UM-+Y(5c0qk}eP}#mgBQ5Dy42 z1b>k_Yh&%L>1k~Rgv+4H8~g5DjQxJ)?)`_#)q+xIY_DE}|JbyE=CKs7zY{?b? zgzw}Ll-$&!77AhF7cG0bKFpyVZ0%^_qXNDavV(^VM6C}E{EWRw3`TQ)iw3|NFJIH? z&-<=S8}p1Eddy80(lvi|(D;On_>prhU=Km-thKdQv@Hdv;(mjKK7%Q)qa;8;AOxKC z8+4~fb7#c3QJ%h%d+}6G_8EAD6|4i)8j2WifdW4`$_jQs>iv@C!HXw?_%Dg)KkNu> zlwfAoP^1J(WGpHyos>=vI-7~Vk(6XhAlp#%XAEf$zk<(X{1T>kUS<*nZs$cUK}it0 z@V|0$bBwDN<7h0q^)qT~9CH?61%bqU-h=9g^8zDK_mUj6_ZV4TUczr3Xt?g!dtWa! zE$M@AVnPrKh#kJ!;mS0$oJND`+Ip}!fjOJlk(j`T&~RhszqdnpN|=W;B_s$9UYZE< zGg6Kh{n{KxkM%Zm07{@AJtyO2BNJc+smbPmtJe*%LLIc1P^(#k+5FHCMFi{0EN9XG zXFq;IElps~N%Qwp%Ra0ZkxcRRq=to}fVP84y@`k^6QEsnENqQ=`lM~m09L5($>%p~ z!g<`kEDgX*A~li9q-G>gHkSThDVim^X1Fokl8LS}O@&f46dT-pe9}2PFwQqW)ST(; zQ#orIyu&lnWa61&dma$}e>^<56SZpkzV`ghaW4+Z<)drBP^-H+Zzm;M{9? zrq3|?$%a7QgaNR?mI&f=`TGYF4TZO5CuOeGUUt&Zce|t|ua2c?Vk|Bhzdx!j&2eoI zT=$cbrUO0-8K03!;o&0FP=`MvANObRQ^;I$WG;S6*8UEp-?(OEzP)3ZRWE6VnC-70 zSZ?_`u+#+byK+|Jixc=?(BUL_?Z@DFZ(8OD@Nt2CXeg1@6o<^SnSn+sGwZnShYB?bVv!d>F z;_QaZjmE#~$js)R1JTRaPX#Eq?<>uXOfC4zgJR!FzO&XLgpe~6#0wfkSz_o#20k;V}lJj%7_tkET#4dDu#5LSr`yVasy26=j?TS_s zwo+aE^V^*O%eZ*?=LdR9G?2V2kVuaK$DIDO?eI?u#J$-V`w%&TJG84w_!IT*bcndY zvwKu;`w-9lK~nT%^eXYV=$t}IU`j5xW}zMda>ddb<5AeX*=Du&H*VVC1CxZ;$yorXXKfJnY4XBEOL#$N=}Li*vm+jn8m zcYgDSEFQ)G5Zo;uAP&F-#B=@2#Pd41Dbf13Oql5-UO%OaC!SjdXSW4kJE@x(5>1{| zg{_np*Y&1TUZ}Y%9Im-nLz*jKR&P}#R>_CjTUfp`kkhi3bAl6_YdFA_4-gE&BGQ*d zUJfIAM5V!F={z|5!G1zTm&ER4CSO~~l;^!!KIS8@!1|jPN-Ew}dqC3y zk#{`a4+Gps2%&A!VA?x@!OREeKrIsJF74ae*NLis1i#?eWcj*FOCmtT7@~#JU|I+b zfmH4T2nd&bnxj#_?kE9=A&Le4dLvPZ>aR{qA8kTf(jWYEq6nEgSn6onIvSw>;p2!| zAoyV{gxv1w!)R{Y!tnp=GVd#lBE3}^I&X5Cj4gXPE_{=wy8Idl3@&3&W-&~|f=ylH zD!Ee0)L5P<5(5xyIfMuI?rG`cIe=&3l0E-U21a({`1yu0gD?ccC(1I1CF$dzi?hZ< zgR_RgZD$BVGQ|GTzw$B7j@l+$#*UZ4VEmQ5mA*PSW`;L&HwMS9z*1-r@+UPk@knk? zG4+ljZ}b`BGc#=&H**Jj%>cclvKSbqQ|U!;kra4FG>UQM)L?MvxMnpO+D@R41F00} zZ-aiZ6&u5x1q@E}aDQ`R90QjaOO3^)Q1ii^9Vk(%9NkkE8`D!=fgVg#6wMG4PMD>m z9?+CkaIZ7DdqjDwFFOdCIGd{~I_Mb!KuFz;gOd)GV!9Y)$`Df9g5Sg=5R&tK^muID z6;AG5t#BKtn(XXuc(%F-N<ro(OW7t>&0uQf>WA@ZNT0fAl3NW~GIPH5H z0{yrR1CIxZX5nVRw-eyn8wf(vNveVqlVKz+ox@PqQdLFU0_d3-Oc{a-pSF?kW0SU{ z!nU?Bz%p8oK6Y@Z1c$D|&GjVeu`@!_{%k05Zf)h+k{uaDluc#8h<&i_V8 zV{i2$+xu$;wzCUN$zB`j-T#%A9Sg8Xc2zx0Sh|ri7WSAppr$zaWABE?H)##JUJq}~ zD44K(L7La(f5}JEICarSxuCopXA{X@Auzk9F&FU;vqu=U4)u=oVs%NjB zYG_qQL;YPCt!(PH3dT27O&yYmRYuIFY}#-z@xd!V%Mv2vYg0X5+28C$8-S}n3Y-IY zrj-8uo&5KibHN@095etFSbc97oLU0^S9=#I4riIMLUnar^$(1aq$HkpSFbW6bN^|T z*)`8{B9@9(*tP%IRbRvFvMZkzs!(c7&9XEpP7bx);r^GqU5$AxQs}YOp-oi2M;$B|n>PoAuPTyrLBk$(s5uJM zqTbF+lfH7G9+qDL4qi+Lw;;j&jl;#VrN)+A$2n1PTBWZ}S!~_XvO0b8?~Fteq-EAy z8zpO#DsO+VE=kt9--I=Bb!&GMGuJ0J;Gs0W!f?wDXYm`tY2CQOL=8#F%4{N#Hd5EyJgZ# z$y{!YA{xZymto`5`xj^{yEP;%)0cYK8u`CYwNBQMxLBw-&C}};5RLp4Fv9{-O&Jcw zzGXVHO4p;=bf=@l0or4DlES6^Ng957uc$*SiaE(3yOAfEq*!0-r>WDb{C@#PJy0t-BV2*-kS-%vAKJ%EUAY)8>SNBeVBFW zNkTg`Hu0tY!@@G*GYf^a=o>)wQ7j literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 b/src/assets/fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..10cd611dd2089fc3412f86dea1bfec2a543c59e4 GIT binary patch literal 10576 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 b/src/assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9b257dcbd4f2f4cc30cd63a7db9a668d6a0d1a3e GIT binary patch literal 8024 zcmV-eAE)4VPew8T0RR9103TQY4gdfE07BFN03QMX0RR9100000000000000000000 z0000QKpTz>9Dy(fU;u|m5ey33Jj@OYgL(h~HUcCAhj0WS1%h-3AR9Y4RYrx41ArU! zSW%P=MlksQ(*h?lgjFBf>3p3i(8M}J`yM^-_#PC%qGSS-Du^x^vl ze78M+3zt7!yBDvLRa0sV3{e?Y@kzHGl2oz=&#$d{e}g!Bfs#6Gbde<+< z$ORP%qyW%Gu`);!kB=}BG7@Pz0My9@7Nx1@p9TT&2-$$&;Nrud0=NBURRtvUY)H|2 zbC|0wi0IyD|43&!BUy$S!TG{iRN)e^`_=9Ng5?Rw30wC?6M`P7WE9xGCn)pxHq&mRHRBsrR0n{{W>$)q!{3_4vo9uHxLLY$N&HU6BHQWutvaTi@=@>f>;#@s!fA{fC3-|Kner^0U!wzOVAy! z_Y8#U16diVP<HY=q(l#vE;AcWFm2?a@bD$3{!m@u$tcUuXV zaFHlksx%)kaC?3B)}Sf$1%3Ot2prc36!ioh5Py6r zCcK>6rrq(T`aD-dcEfiyI$=_Mvt`t?NyTP8KYTBg$_+O-q{zu?G!z*2DvtpbTkE*c zq*t6X-go8Y0?_l4D`As|J9t)`q`pGA*}L>c2mf309${7DDN*miagVFqx;Fn8J`sS# zqO`HjhnRAyt&h3(x$kew*CqXV-!5gFS*nM~vyW15~1x z8ivy5-~;qJ^l}+LiGrS>*KbZ(HECWqda`NWV6==)`4$JSn*Ec>NVz;fr9Kmr3YkZy zIN2aT6eiRWU<}5bvwPZ^lMg2a8PM?)zwjH=AfO}7KeBB@qwmaK41iJ7=0LQ{8MN!- zzn#OIZPtT2KoVb8xZLRD0^30QG!y>=@q5hx8>s_;&TRoUHrnElIwSV_lLW|qbdn8l zW{UwPktOoc&+M3l6OZ^MDhb(=ttm=L8Y0N2h$x=H86jt)c~$e@ebM~IX0w}h>T*c0 zGiQlJ00EJULJTq|X0eWE0>evUoKl~j;O{ZZNb`zj_C9NV4K`^VAawe2Madva1X28o zy9V%9qharYR895+!-;iKm`9tIwbz zKM+U?0H_5305E)AQ5HZl5V`$0hy@~#!3hurP9I}~ObjrrWilHhE$1T+}~-~(u0Fp=AIJ=7{NBz2#nNql?hB1C9NF zha?FV7_<+aTxurU(P6~Lwn>Jo4L+KY@Q~Q~a9@U9T zz;yz;cMBLZas)W5-uG)O+RWt&mP&2PW!QSW!@e-Tw!2JYoKISiIzPH@xkgQ>t0zZ)Exc6G@)iS`FS;#xD(R4%sbr${d~^}s@tL2cT4nW`bkr@2(;%V zMNzKZ{XECkq?cttbrZQ1;_UPjkDZ1iG6y_yBjOvtOQf8hQxCQ;=n9u#dthZgG{Vs{ zX;4$E6z?zBYL>`p@^l^gQTnhB5xNV_as4%2D1>fhe7IHADhf`r(27HtN(zH?057*b z)o_|l!9Xm<&?QQ}Y`k^2cZLo}WH-~pFe=B`&(YOM5xcq;_*q4-B21g@R0Wvl7MQ7c zQkzoZ=&H=zEGGpY9W0UK_kO4{342uIq1J!NKk?t~f2I1I+kPBBv=OUy6MReOhgMiN z^E|Uief7eE6Sl1iE%?FAJyoWf$}d>5HlFWtS+L)hb^YBTgl^NiTk;gQ)Pk z;Zl_ISvRp5sN~Ff1pZx!4k6pp0MFr4i~>{PDoGFFE*e#0^ZONc=q`;9C516f#@~`C zKGs3n&^Y}=L%T2#o+0nX2;w^G<^I%0`iA@gDy%pdfIk{Ey)l>;XhkNsA7K_u;t0}oh%@OkYQcY7A*j_%%XjB+94`L~ zk!dZx@Jns8LRA1!#Kn2rE_%qo4J=G&pej$}wd(a`E3ml{ppS_3JXu-P%6ss_BFQvN zh(NKU&^Rmx{MIn%|-!FE*ZGl&7~J*A6C;TS)oy9cBd;V_F~7@#3!iPM7# z)PaII3*lX@BFQEctSDFZo=hR;W4*(R-c2<;O{iiNX>JeS}su~P6q?;_Yvr( zYZ)kY=Wq5QP(FCcR*;h`l!dI$I4vSYnv25tCfK`7T_EK+U_XXDy3LjW1)o!?IJ8l+ z^A-^1JzXLv?I<8Tyl9ZOYZMO_s0mIf7rZ&V+Ac^56XUD_IRG6MvpiNHbc70ZVWQwd za&%}#s>?I};pDs9jD)HG236egy2d)59w*E3rlE3}Le^x4G+P)HwA`*d+r>-3U1+oh zz2=M!XLTI5L2rPzX#`|@9o(Ua4PlZ9@_h#_s_m-)-IEF@bMg;A` zMPCPA1JF;Rs|RLnoBhIy!e|^elaksyS1rt?o4*N@cqc&hwBHc zd5)k1jF0xMh_uzJ;e5oET1$hLAtG(5uzKv#ca|vp@kU{sU2aJzOTQA>S zi$#OmW45n>@zKuKozF4w>hE()qD&M_u(VdFkg=_9%1O#El-_8L_gk`c21aFo{cn%i zeW?u!t}af^jPT6{0}YQFEEV==Jjxir+MgaEOpXcG#jgK;cm3|v!}I-{^U4Y`N*cgU zs5T#(d-K0FukF10W>Jnoli@2Q?Vo5#=@kt?RY{;R-29FIy1HVHe2m76eWiRis}y(~ zZOd<`;mzpib)zTO@M}WCD)22CxK^}8tWAJWwU=m;%Skti?Ib%7j8eB38IGSNw5y7z zj-M$~-%_S;XbO7|WvCgfcrLSZ^a6kOUHtK_ypsJK)1V~UE5#GDi`whp-1aIgFhEe= zH|Hl;stzzec~J2-Gy8D;z>c;?d}S;Ak5?m<9CoxJx+~!j%gxsnw2Xq?tphs-tD0~f z*|*BG;I^9iCK&yF{KEXNHXiORWA|_wj6+%Nk7|TGeRB3*ZTCn=7c$&>8_&kn`sN%^ zp#5x=Fa0^YM{`I<_r-v+lAwoqSYJ6!IgOR2-=oYB^dt7>#(Vd)Vu}U&wZeZEcVNBW zjxV~`^hJ(*?T>w!k|y*i@*7;{9mo3qiA?MFxR2SD${(V!J6$w?vT5SIm~ zjK;0tHH(*fX-%KY^@HWU76k9}(s6lI9C$7`GYBlsi7Cwx3+W*ZU){GAlXjPG0Ik~0 zZ+CLbW+YdQ+*2G?NI2-%JypGrNc~^$jQY;TZ&MY537z7ZX_%eUljc89GEY{X z?i4ukKl)c8m$2vXWIbT9KkGDXn0c^g+vN!*n%6^G-Qlg>(YX$0cIh6NGlk5t^vX`A z5=|Mgf?NWK(*H9tZ(uYnpK@)7;EkVC7pot~aF<2Jr`IBwMr^5HTJGA}x2D3+C(6%q zdz@OY*QVi85hb+!f@X=~46i zps-*!EWJBWNE*I7HX|y>70g;~OFmXKR%d5vYbUs|!jk2*3Dr>Awp}#BgjseR@5aHkth4Os~9i%wL)C$U#w0CnKC?!OT1?shTsHllI50n zrKOU>K#=^p^O_H)!Bq|wIPnOTRnN}!MFvcSJAAElQ+#(t>%Y8SBK^g-F<({`h&beh zrS(pSt2FhMKF-O}30UQAuwEoyylrSv$P`Y-YBc2Bx^jfu=V%%1L*hWbp8cT02mnM>0vEcsSS?_Xq*{FMQAQNC(4 zi_Ee?#@(t~JN~T&z*lX<%#+0RZr>_%^$?))bvN==tjH*-80e zpy6S|04kpFfX>6arp>dAhl39h)T`Z#vzJmX=hr12`HC(FatJ!Cow(D zPbo%AZJxAo0LnvgeBF(syzOnOQs4Lhp7p{}Z8HQtdFhe|4tC}dzNB46Lz$%Y;9`ePfTB`K$f7RV;D(Fv$-&B(fvT-c z4_9Ju6x&L69r#dF6Tl45DeALhF5-28Z)a%K6{Rz4$LziX71F;OJ$Hz5u>>Mp53Ignf0IWUgXG0mB?c$3rtt*<^0r04(AE8qCz zcENgFd-G=^>oT*gemAcdO0k5?(2UP7MptyP=1Hq=&T9ZBu^%L>%LnQQ@U-7#)1j^u zR6fv7{YQS)Z+S^R4FA2ozPXmRr8KkB+{50=+}_Rth-bl+{VUX2o$awP)yEe~L!k9@ z(0Xe(1$zf269>CsV^bwFJ14MZe`2V+rM;q!)H)}b(2(#5cP}&^;=ugngVYUZ-?>M4 ziw~&Jtu@`qOj%dvr<)n2rL8sJ+QAU|P_kDvoL4)E~?z=P8!~!;vUSTa(sA@o|lg;HJowoYsxP?dxwttj)jhD ze06$ndKobFyX8YU)aZpi#C~zU*E*#f5+zPKcA{EIavM>6vg7BzzCVBV;eUtvVzy)_ zMCIdAjN{>(JxFo`5R{4BuXAm!TIs7Vmbcm^eDMtDFoxA^<$HLtYbywz05JU zr)mB9yUVe-;)+6|i{NJ7d>ed!AohN4RlnrG^{T13rzeA+z6{Rh#6O*^y3|TFRTT`~ zs{YXXQ$hESsBO1O*BLmOK9H(AaOC>}JE%R7I3A1Q7Mfq*RNO>;)RgDa1U^6^~9nUg~_G9a#$?4dK^=jLcgRP2CaTv zC}fTN&NvKOefgWObB3Ikl~@krFRNa$=@|wmgnQ%>pI)MMNjSELT`Ng$j|xX9b!O@# z?F&LoEBLVbSXXPW?z+mqdROJG{QHaJ%vV$J+vVUb7P_yaraZT;xf1YjQE~A4#Jd%0 zX@aCkVLcq$zy0sJ3ZzbK;BtCrbTlElAn{)Ga@X)L8)y3)dl)28*Dze4=wcB|v?YAp zHq3qkm>kZBD`BW9XPmixB4gV%=a@iC(_lXi(FW z$p?~*q)~ouqVpIZjP=K zFrWYs!`uo2N?28(ljwv-M^u|lBzo`BOq|P-1x%PcN%^R``${+4X2tCm!kAWH8wXSa!rN{(OAsR_O5&c-JOqEIBo^%h z%of@emgbRFv4^U=5I$5l9Z@Fn7mP_9PdG1Xb=(ez=I#qw4z|B+rh23WaLwRD=jGmk zB{7+AIg{*4r$%LLQ#4{H{6)OiqBu)7t`5qhnXDyo2V6Z&H20Mf2O#SQ(?l3PUW0~bS+jJHoc@1=c*Oeu<4i8K%C}fC1G!XF;*}w?8@d=T|e-st}3HU%IO>~f4D&NIcCS5 z^mpCFV3w#RcT;NaK86Fh`H1PB@ra%7>9xOfpE$;f_;><>a?mv+Yyngc@$ddhkRit` zyY4Y)Y>>@b5Y08o$khf@J(32Li!;(qYdBUP#qAmq%!%o^5PN1RX9F<{DHF+NRx0Nl zYUiqB!68+XZ>s4y1u9oXHO@DnJa8JSs$T#tFu|F)E!TCI$wt%a2BvRi-9K{Uz&Bd~ z*uQg~bpJX93;bJs#dtKoIuU13)}0)XC1H9`sGx0rb(`UexrSKPg5y&yOO8Y+t&&ZdaA= zNOWmXwD%^k!LFqq?7?`)vh6dXab4e$RJcL>|982Eommsqj;4~Hc7Ft?KI*y%X2Ci_*$iL4Q%Ny_2Dv=--Bc-17JCI03A#E7J|svG-!ZTc+0VM? z2SAPqBgmmGJJU99>#|gE^qmNk^KL6zqXjEnS*Ts ziPEFo+t%d6%fuPgV8FZ8GNQ>bIoB&-l z$+>9~tXWO1v1bcg8_Hs$e`%S7sM;grS^49aP6ehvNIo#vEvtT{v_=c8EWPb*dAH;L z-w3pTW3&}FPU>Yl>Y`3jPl`G&(+_|s0NpsNe)z-+KBVIaDd$*(pf8U<0YK@Vnyup5 z8xSn|U0me^05JR$lMw)n$N#tAJb%U|OinTZ5}*J81Q1I-qyPyw7yjQJZ0*f>GqeJ+ zZUdPHhBfuJw6>S(r~>9vZ$oF=&_{I)LnkVkWz+kd_nIvm`IW4o_6i%v z6ck(3;FF*y$(uCH-!4$zeptRO7q@lVGjeRqw5)x@`rO&p%mLn&C#=qi>KYpPZC_=o zDIYpxE}hQTSb2&wqrP)R4B>jwTf|j~u->bnzQ`Li(b3|F-iCE-g$lQ1+s6IbYIIva z<}uqwZ5%TqN2o3ECldZx(~~$?tFReFYwp!{vPOHqqc!I%=zFwE$GpnIZdVcQLu7E_4(uwV!!tB6YAwRI{qVm>|DWy5;;DZN` zT>H7pRxd8u7jy5d(`$x&_!{I8GGj{$pfTAza%@ppb3Y&nxDm)SsO91j3 zz7!z0z9j&eg`-Pe>2UjrsHICafUVG#4*0RR9100000000000000000000 z0000QE*phT95x1E0D(*q3<{=Dp-c;c4gdi*0we>37z7{%f^-KU8(SGOqjrmvii_;O zN-(F`njQ276k*a>>z!A(y|qR*d+dQZmgOhrh*~-m2NWm?Gmms2yn_*DXxrGQ)Bio@ zc=&(2|JvskAErK|r#7OoLcl>}1PPe_m5&%C-Ht}cTCN{xoBxhGKuoN_=pSMyU>Cy* ztQ!0KR^W`t^=%D{LR>}=jm=|#_P7$8?}vL`uHE-Kg+n3~LKWeXu($0x^Mg$4GT0C3gSe!jy?@g{!J0Kw05XB1%{58sSxZ z8@j(2x?B_gh&_sQM;d37p^!9y34&yv62xi^5Fw$DzCfUBGdI}fR|ZDH;Qp#&E({(n zPS1tG6Un9dFn~e(M<5=5us9!T1VSz$)RMh0qC~_bbpbF7pnV7c+7|%YOMv!M4&^YQ zJ)Jk1286M9)+^{f0RHyzB10BkUg3j9v)F(Q+vk5h59Gn&e6M9XyYe!V6cAKai^9!W z^Bcu^$R_#x0!92nC6iy|e=qaU*k)&=3muhRW{3Lc%2d=ZWD9R&T-H>T%#Lc-utuUn z$=Tu0Ei?Yo*1$OFBoni_{zGhhvf zX|UQKGhp5``B>QxHh3lnl!IWMXL3k64xaNbUg+$V=b_Y3v29I(R{_xnE&yo{$Zw!H z8>CYJ#nYDYJfk~zigOaH3bZl(o7=4??{k+xr7?v@v4decU20FI#wgUj{4}Q4%TLg# zo~1dU$f!+GFj|+6zJ}0WlGN8jUGa}?8mZ_Tp-t)98R`j6 zHqj_Wnb$o;dD!k`|3mH+Vi;R@ED@(*J6y#>}^rg@(N~8n{c_k z%jn5*;zFVoo7B5T6iY2tr8|4*#8;D*^+cND*hPx%m^-RHp)-q;jMhwRs2;C)RwXddax7}r43YQf6X?;FXgQY;l@I>Q@cVSp?(6Vvvwak)F zb%bqRMLw0W?MHI$bgs-fdhcPW1%2i`^=WK2@k*_RE%YKv{cXG5iJ}*-kZY~EuSeby zl6*LDK1{ntRbQRxEsni_1IhL5&;N1WWJN&4MQC~=5XthjjPf^96%VFRgx!p=QE)l8 zDy5kx)?dOG^)KN|Th-ruSp+x2R0VcxYz&Ba&-jIl6;N>yi1}g6Nu3rF#XdBt8Umf zd2)N(S`hxfJu11RxG1$Dl_d--?iaX1wzI-L~$VRLh?NiS6^(`0aBym$xq7Y%9=p7T$)KNkwA%xUEr)Jhu7J6Ob^aH=ZLvsCwx5L96QetiWLJ-L% zX+3<}hZ0UJ?|Wi{4jflUV!Gj#Kkv47oM~!dlHF6Q`wdQ8`L?W88Rz}F)7*Jm*6PRZ z``cH0+x&F_b;shhw$>D%^4D>xSTd=(XW~45_K;L9h!3LYm3`4i{zgJSc5d(PoaS;Lj8*>35%p2`7cK(HS(IEV$-k8W~T zHYEPFEy;C*)?ee6JW_6D8{43S$)2sVr zJa+^!9s2p}{`O~i_{#qJRN)eG_ufxP#()8+KodS9_KZpMAqb%qOTjn9jwx_HAXut4 zkwB$4!2I2nfQG$Bn1Y7&09Dh2BS9Zuf?n3QOz6XMxMu2e$-)4RhGwQg-eX}1%Rx#v zI<$UQB!^pB&94{k?$5XOn`(78de8XO$$1MIlcs~cq|iouqK=`^UxNg`SYMrs_S7&Ho~a{ z!u1d%@BAVhBt}3VA!9_PcrI?0rBr1rrn{^6BDi|bZZR&T5l=DBdr`HK2VpzDG?(q8b4rk=F_DWxV$&r&nGyP z3cH?q?mCh`2hW<`2XfrUTFCSCxN?WQ-qe}v+F#iP4zOKoP;30PN8n0IWh3u&MPxCS znb*Dz!z^%Y6aFy40H6{>22MSt`}QUO=bq7_;GOfz1CgQp zm6w5$pMf}rks}~}!HhF+eXTBV4I$+!s}L#gxD=}-3>cd{m_q`2FQl)mPj#)9Mhnjx zEMMxOh-6DBdD%Cj+(GhYQ)jMgKiMI>1P`W;UCT8S65GM*DGl}|ylFW0@P@Jm$L}%g z)+)^d`sO$R@)E8P@{*r=#fMgTX`7WJzNF#+sgTlvcop7or;=cF48S_cnZwSW#i^Vr zP<));RVI}6MD?GmeTnl~C`I zIuZz~C(cNN&NUu5b1kkG-i~{<`O*M!vQa9|rj_%p{mkszYUOKzKc~rMqp(!voIKu> zQ-?FI*!52PbV`_PulF%3sTOaRaq7E~UG2f?mav`p^FecqtnC~xv>1=mcX9gctY1gZ zs_8fK`$O&;S$MQR%I*m@J+7u_)h$~k2ZuxnI7FN;f!(l$WebW0~-0rLMQVbsW9nIvv6gmdYVtC7ZhjC&dp9u&zEMFluj7v=gkO? OV3-a4mMl<^oU|>n!IJm@ literal 0 HcmV?d00001 diff --git a/src/assets/fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 b/src/assets/fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e17542dc1eac134727c3522c56ba04a740a634e6 GIT binary patch literal 796 zcmV+%1LOR6Pew8T0RR9100SHV4gdfE00q#S3E)>c_2nkIz1p;*=C8+1luk}Ff zIp(whwf~`H4eF3xmmMf-Xtf05;C-hZ^azBKgiw`qqDBuar2rw6`@5;9d^8`#Lp;VG z13*?fGcJ~sUy+Z2=zDHuZ`m&a5ampuwqQlGh*aNYys+$l_N!cx^rN^IN|W9-fBB24vtK9@`qp6&;9!2^>NB4-!#tq>Lcq<`*?*PuJ!te zfBYvKj+>fntnb(G-nzBF81}6E&S$fITcN46KXu-b|He_@T%X0ZvtwIk<)t^hf6?^H z4R_vJyYbSA@!ElJUoxwH^R0K(Z@g&cdyhxDU#$Qsl1fk1&LKK2+rYJww9(qg(S8`TGKCV25*l*gSkk+tlBx z-K*f)AKMQH-iy`0{_Vf_Y9p(Mftmz@$|3(ZsV(}u=l_dqBPjp?mF#?b0f>LdPj+P1 z&pvBH9YCkGbs$n}!HZ*N#lfpsW?5;2V?drgm06c@W`*?xBO=U^S8j!lAws0cWrz5!iiG a;>@Y0EGw^}E6>iu!9@kM4k7~p0000zWOnxe literal 0 HcmV?d00001 diff --git a/src/assets/fonts/icomoon.woff b/src/assets/fonts/icomoon.woff new file mode 100755 index 0000000000000000000000000000000000000000..ea1ad1bf9cf9a2ef5f4a9ec521a5428be84756c4 GIT binary patch literal 31064 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/icomoon.woff2 b/src/assets/fonts/icomoon.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d5cf3e835dfa6d937759f46c9330cc7fa9ece6a2 GIT binary patch literal 14140 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 \ No newline at end of file diff --git a/src/assets/lang/en-extra.json b/src/assets/lang/en-extra.json new file mode 100644 index 000000000..4950a3527 --- /dev/null +++ b/src/assets/lang/en-extra.json @@ -0,0 +1,102 @@ +{ + "ActionSendTTLPhoto": "un1 sent a self-destructing photo. Please view it on your mobile", + "ActionSendTTLVideo": "un1 sent a self-destructing video. Please view it on your mobile", + "ActionYouSendTTLPhoto": "You sent a self-destructing photo. Please view it on your mobile", + "ActionYouSendTTLVideo": "You sent a self-destructing video. Please view it on your mobile", + "Activity": "Activity", + "AnimalsNature": "Animals & Nature", + "AppName": "Telegram", + "Archived": "Archived", + "BioAbout": "Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco.", + "ChannelInfo": "Channel Info", + "ChatInfo": "Chat Info", + "ChatsAndContacts": "Chats and contacts", + "ChooseDefaultSkinTone": "Choose your default skin tone", + "Connecting": "Connecting...", + "ConnectingToProxy": "Connecting to proxy...", + "ContactJoinedDisabled": "Disabled", + "ContactJoinedEnabled": "Enabled", + "ContinueOnThisLanguage": "Continue in English", + "CopyMessageLink": "Copy Message Link", + "Country": "Country", + "Custom": "Custom", + "DeletedMessage": "Deleted message", + "DragToReposition": "Drag to Reposition", + "EditProfile": "Edit Profile", + "Emoji": "EMOJI", + "EnterFullScreen": "Enter full screen", + "EnterPassword": "Enter a Password", + "ExitFullScreen": "Exit full screen", + "FilterChooseChats": "Please choose at least one chat for this folder.", + "FilterCreateError": "Sorry, you can't add more than 10 folders.", + "Flags": "Flags", + "FoodDrink": "Food & Drink", + "GeneralSettings": "General Settings", + "GoToMessage": "Go to message", + "InputDevice": "Input Device", + "InvalidPassword": "Invalid password. Please check the password and try again.", + "InvalidPhoneNumber": "Invalid phone number. Please check the number and try again.", + "KeepMeSignedIn": "Keep me signed in", + "Keyboard": "Keyboard", + "LeftChannel": "Left channel", + "LeftGroup": "Left group", + "Loading": "Loading...", + "LogInByPhone": "Or log in by using your phone number", + "LogInViaQR": "Quick log in using QR code", + "Microphone": "Microphone", + "More": "More", + "Next": "Next", + "NewLineByEnter": "New line by Enter", + "NewLineByShiftEnter": "New line by Shift + Enter", + "NewVersionText": "New and improved version of Telegram is ready for use.", + "NewVersionTitle": "Update available", + "NotEmojiFound": "No Emoji Found", + "NotificationsDisabled": "Disabled", + "NotificationsEnabled": "Enabled", + "Objects": "Objects", + "OutputDevice": "Output Device", + "PaymentsNotSupported": "Sorry, this Telegram client doesn't support payments yet. Please use one of our mobile apps to do this.", + "PhoneNumber": "Phone Number", + "PhotosTitle": "Photos", + "PollQuizOneRightAnswer": "Quiz has only one right answer.", + "PreviewDisabled": "Disabled", + "PreviewEnabled": "Enabled", + "QRHint": "1. Open Telegram on your phone\n2. Go to Settings > Devices > Scan QR\n3. Scan this image to Log in", + "Recent": "Frequently Used", + "RecordDeniedDescription": "You must allow your browser to access your microphone before being able to record voice notes. Click on the padlock icon next to the URL and then make sure you click Allow in the microphone settings to enable Telegram to access your microphone.", + "RecordDeniedTitle": "Permission Denied", + "Saved": "Saved", + "Search": "Search", + "SearchMessagesIn": "Search messages in", + "SearchResults": "Search Results", + "SelectChatToStartMessaging": "Please select a chat to start messaging", + "SendAsFile": "Send as a file", + "SendAsPhoto": "Send as a photo", + "SendByCommandEnter": "Send by Cmd + Enter", + "SendByControlEnter": "Send by Ctrl + Enter", + "SendByEnter": "Send by Enter", + "SendFileConfirmation": "Are you sure you want to send file?", + "SendFilesConfirmation": "Are you sure you want to send files?", + "SendMessage": "Send Message", + "SignInToTelegram": "Sign in to Telegram", + "SmileysPeople": "Smileys & People", + "StartScreenSharing": "Start screen sharing", + "StartText": "Please confirm your country code and enter your phone number.", + "Stickers": "STICKERS", + "StopScreenSharing": "Stop screen sharing", + "Symbols": "Symbols", + "Text": "Text", + "TravelPlaces": "Travel & Places", + "UnpinAllMessagesAlert": "Do you want to unpin all messages?", + "UpdateDraftConfirmation": "Are you sure you want to update draft?", + "Updating": "Updating...", + "VideosTitle": "Videos", + "ViewChannelInfo": "View channel info", + "ViewGroupInfo": "View group info", + "ViewProfile": "View profile", + "VoiceTitle": "Voice messages", + "WaitingForNetwork": "Waiting for network...", + "WriteChatCant": "Sorry, no way to write here :(", + "YourAccountProtectedWithPassword": "Your account is protected with an additional password.", + "YourPhone": "Your Phone" +} diff --git a/src/assets/lang/es-extra.json b/src/assets/lang/es-extra.json new file mode 100644 index 000000000..df73d7250 --- /dev/null +++ b/src/assets/lang/es-extra.json @@ -0,0 +1,75 @@ +{ + "Activity": "Actividad", + "AnimalsNature": "Animales y naturaleza", + "AppName": "Telegram", + "Archived": "Archivados", + "BioAbout": "Datos como la edad, ocupación o ciudad. Ejemplo: Diseñador de Chicago. 23 años.", + "ChannelInfo": "Info. del canal", + "ChatInfo": "Info. del chat", + "ChatsAndContacts": "Chats y contactos", + "ChooseDefaultSkinTone": "Elige el tono de piel por defecto", + "Connecting": "Conectando...", + "ConnectingToProxy": "Conectando al proxy...", + "ContactJoinedDisabled": "Desactivado", + "ContactJoinedEnabled": "Activado", + "ContinueOnThisLanguage": "Continuar en español", + "CopyMessageLink": "Copiar enlace del mensaje", + "Country": "País", + "Custom": "Personalizado", + "DeletedMessage": "Mensaje eliminado", + "DragToReposition": "Arrastra para posicionar", + "EditProfile": "Editar perfil", + "Emoji": "EMOJIS", + "EnterPassword": "Pon una contraseña", + "Flags": "Banderas", + "FoodDrink": "Comida y bebida", + "GeneralSettings": "General", + "GoToMessage": "Ir al mensaje", + "InvalidPhoneNumber": "Número de teléfono inválido. Por favor, revisa el número y reinténtalo.", + "KeepMeSignedIn": "Recordarme", + "LeftChannel": "Salió del canal", + "LeftGroup": "Salió del grupo", + "Loading": "Cargando...", + "LogInByPhone": "Or log in by using your phone number", + "LogInViaQR": "Quick log in using QR code", + "More": "Más", + "Next": "Siguiente", + "NotEmojiFound": "No se encontraron emojis", + "NotificationsDisabled": "Desactivadas", + "NotificationsEnabled": "Activadas", + "Objects": "Objetos", + "PhoneNumber": "Número de teléfono", + "PhotosTitle": "Fotos", + "PollQuizOneRightAnswer": "Un cuestionario tiene sólo una respuesta correcta.", + "PreviewDisabled": "Desactivada", + "PreviewEnabled": "Activada", + "QRHint": "1. Open Telegram on your phone\n2. Go to Settings > Devices > Scan QR\n3. Scan this image to Log in", + "Recent": "Uso frecuente", + "Saved": "Guardados", + "Search": "Buscar", + "SearchMessagesIn": "Buscar mensajes en", + "SearchResults": "Resultados de búsqueda", + "SelectChatToStartMessaging": "Elige un chat para comenzar", + "SendAsFile": "Enviar como archivo", + "SendAsPhoto": "Enviar como foto", + "SendFileConfirmation": "¿Quieres enviar el archivo?", + "SendFilesConfirmation": "¿Quieres enviar los archivos?", + "SendMessage": "Enviar mensaje", + "SignInToTelegram": "Iniciar sesión en Telegram", + "SmileysPeople": "Emoticonos y personas", + "StartText": "Por favor, confirma el código de tu país y pon tu número de teléfono.", + "Stickers": "STICKERS", + "Symbols": "Símbolos", + "Text": "Texto", + "TravelPlaces": "Viajes y destinos", + "UpdateDraftConfirmation": "¿Quieres actualizar el borrador?", + "Updating": "Actualizando...", + "VideosTitle": "Videos", + "ViewChannelInfo": "Ver info. del canal", + "ViewGroupInfo": "Ver info. del grupo", + "ViewProfile": "Ver perfil", + "VoiceTitle": "Mensajes de voz", + "WaitingForNetwork": "Esperando red...", + "YourAccountProtectedWithPassword": "Tu cuenta está protegida con una contraseña adicional.", + "YourPhone": "Tu teléfono" +} diff --git a/src/assets/lang/it-extra.json b/src/assets/lang/it-extra.json new file mode 100644 index 000000000..874a31a62 --- /dev/null +++ b/src/assets/lang/it-extra.json @@ -0,0 +1,75 @@ +{ + "Activity": "Attività", + "AnimalsNature": "Animali e Natura", + "AppName": "Telegram", + "Archived": "Chat archiviate", + "BioAbout": "Qualsiasi dettaglio come età, lavoro o città.\nEsempio: Designer di 23 anni da San Francisco.", + "ChannelInfo": "Info canale", + "ChatInfo": "Info chat", + "ChatsAndContacts": "Chat e contatti", + "ChooseDefaultSkinTone": "Scegli ", + "Connecting": "Connetto...", + "ConnectingToProxy": "Connetto al proxy...", + "ContactJoinedDisabled": "Disattivato", + "ContactJoinedEnabled": "Attivato", + "ContinueOnThisLanguage": "Continue in English", + "CopyMessageLink": "Copia link messaggio", + "Country": "Paese", + "Custom": "Custom", + "DeletedMessage": "Messaggi cancellati", + "DragToReposition": "Trascina per riposizionare", + "EditProfile": "Modifica profilo", + "Emoji": "EMOJI", + "EnterPassword": "Inserisci password", + "Flags": "Bandiere", + "FoodDrink": "Cibo e Bevande", + "GeneralSettings": "Impostazioni generali", + "GoToMessage": "Vai al messaggio", + "InvalidPhoneNumber": "Numero di telefono non valido. Per favore controlla il numero e riprova.", + "KeepMeSignedIn": "Mantieni l'accesso", + "LeftChannel": "Canale abbandonato", + "LeftGroup": "Gruppo abbandonato", + "Loading": "Carico...", + "LogInByPhone": "Or log in by using your phone number", + "LogInViaQR": "Quick log in using QR code", + "More": "Altro", + "Next": "Avanti", + "NotEmojiFound": "Emoji non trovato", + "NotificationsDisabled": "Disattivate", + "NotificationsEnabled": "Attivate", + "Objects": "Oggetti", + "PhoneNumber": "Numero di telefono", + "PhotosTitle": "Foto", + "PollQuizOneRightAnswer": "Il quiz ha solo una risposta esatta.", + "PreviewDisabled": "Disattivata", + "PreviewEnabled": "Attivata", + "QRHint": "1. Open Telegram on your phone\n2. Go to Settings > Devices > Scan QR\n3. Scan this image to Log in", + "Recent": "Usati di recente", + "Saved": "Messaggi salvati", + "Search": "Cerca", + "SearchMessagesIn": "Cerca messaggi in", + "SearchResults": "Risultati di ricerca", + "SelectChatToStartMessaging": "Seleziona una chat per iniziare a messaggiare", + "SendAsFile": "Invia come file", + "SendAsPhoto": "Invia come immagine", + "SendFileConfirmation": "Sei sicuro di voler mandare il file?", + "SendFilesConfirmation": "Sei sicuro di voler mandare i file?", + "SendMessage": "Invia messaggio", + "SignInToTelegram": "Accedi a Telegram", + "SmileysPeople": "Faccine e Persone", + "StartText": "Conferma il prefisso internazionale e inserisci il tuo numero di telefono.", + "Stickers": "STICKER", + "Symbols": "Simboli", + "Text": "Testo", + "TravelPlaces": "Viaggi e Luoghi", + "UpdateDraftConfirmation": "Sei sicuro di voler aggiornare la bozza?", + "Updating": "Aggiorno...", + "VideosTitle": "Video", + "ViewChannelInfo": "Visualizza info canale", + "ViewGroupInfo": "Visualizza info gruppo", + "ViewProfile": "Visualizza profilo", + "VoiceTitle": "Messaggi vocali", + "WaitingForNetwork": "Attendo la rete...", + "YourAccountProtectedWithPassword": "Il tuo account è protetto con una password aggiuntiva.", + "YourPhone": "Il tuo numero" +} diff --git a/src/assets/lang/pl-extra.json b/src/assets/lang/pl-extra.json new file mode 100644 index 000000000..6d767c450 --- /dev/null +++ b/src/assets/lang/pl-extra.json @@ -0,0 +1,79 @@ +{ + "Activity": "Aktywność", + "AnimalsNature": "Zwierzęta i natura", + "AppName": "Telegram", + "Archived": "Zarchiwizowane", + "BioAbout": "Różne szczegóły takie jak wiek, zawód lub miasto.\nPrzykład: 23 lata, projektant z Warszawy.", + "ChannelInfo": "Info o kanale", + "ChatInfo": "Info o grupie", + "ChatsAndContacts": "Czaty i kontakty", + "ChooseDefaultSkinTone": "Wybierz domyślny odcień skóry", + "Connecting": "Łączenie…", + "ConnectingToProxy": "Łączenie z proxy…", + "ContactJoinedDisabled": "Wyłączone", + "ContactJoinedEnabled": "Włączone", + "ContinueOnThisLanguage": "Kontynuuj po angielsku", + "CopyMessageLink": "Kopiuj link wiadomości", + "Country": "Kraj", + "Custom": "Własne", + "DeletedMessage": "Usunięta wiadomość", + "DragToReposition": "Przeciągnij, aby zmienić położenie", + "EditProfile": "Edytuj profil", + "Emoji": "EMOJI", + "EnterPassword": "Wprowadź hasło", + "FilterChooseChats": "Wybierz co najmniej jeden czat dla tego folderu.", + "FilterCreateError": "Nie można dodać więcej niż 10 folderów.", + "Flags": "Flagi", + "FoodDrink": "Jedzenie i picie", + "GeneralSettings": "Ustawienia ogólne", + "GoToMessage": "Idź do wiadomości", + "InvalidPhoneNumber": "Nieprawidłowy numer telefonu. Sprawdź numer i spróbuj ponownie.", + "KeepMeSignedIn": "Nie wylogowuj mnie", + "LeftChannel": "Opuszczono kanał", + "LeftGroup": "Opuszczono grupę", + "Loading": "Wczytywanie…", + "LogInByPhone": "Lub zaloguj się, używając swojego numeru telefonu", + "LogInViaQR": "Szybkie logowanie przy użyciu kodu QR", + "More": "Więcej", + "Next": "Dalej", + "NotEmojiFound": "Nie znaleziono emoji", + "NotificationsDisabled": "Wyłączone", + "NotificationsEnabled": "Włączone", + "Objects": "Obiekty", + "PhoneNumber": "Numer telefonu", + "PhotosTitle": "Zdjęcia", + "PollQuizOneRightAnswer": "Quiz ma tylko jedną poprawną odpowiedź.", + "PreviewDisabled": "Wyłączony", + "PreviewEnabled": "Włączony", + "QRHint": "1. Otwórz Telegram na swoim telefonie\n2. Przejdź do Ustawienia » Urządzenia » Zeskanuj kod QR\n3. Zeskanuj ten obraz, aby się zalogować", + "Recent": "Często używane", + "RecordDeniedDescription": "Zanim będzie można nagrywać notatki głosowe, należy zezwolić przeglądarce na dostęp do mikrofonu. Kliknij na ikonę kłódki obok adresu URL, a następnie upewnij się, że jest wybrane Zezwól w ustawieniach mikrofonu, aby umożliwić dostęp do twojego mikrofonu.", + "RecordDeniedTitle": "Odmowa dostępu", + "Saved": "Zapisane", + "Search": "Szukaj", + "SearchMessagesIn": "Szukaj wiadomości w", + "SearchResults": "Wyniki wyszukiwania", + "SelectChatToStartMessaging": "Wybierz czat, aby rozpocząć rozmowę", + "SendAsFile": "Wyślij jako plik", + "SendAsPhoto": "Wyślij jako zdjęcie", + "SendFileConfirmation": "Czy na pewno chcesz wysłać plik?", + "SendFilesConfirmation": "Czy na pewno chcesz wysłać pliki?", + "SendMessage": "Wyślij wiadomość", + "SignInToTelegram": "Zaloguj się do Telegrama", + "SmileysPeople": "Uśmieszki i ludzie", + "StartText": "Potwierdź kod twojego kraju i podaj swój numer telefonu.", + "Stickers": "NAKLEJKI", + "Symbols": "Symbole", + "Text": "Tekst", + "TravelPlaces": "Podróże i miejsca", + "UpdateDraftConfirmation": "Czy na pewno chcesz zaktualizować wersję roboczą?", + "Updating": "Aktualizowanie…", + "VideosTitle": "Wideo", + "ViewChannelInfo": "Pokaż info o kanale", + "ViewGroupInfo": "Pokaż info o grupie", + "ViewProfile": "Pokaż profil", + "VoiceTitle": "Wiadomości głosowe", + "WaitingForNetwork": "Czekam na sieć…", + "YourAccountProtectedWithPassword": "Twoje konto jest zabezpieczone dodatkowym hasłem.", + "YourPhone": "Twój numer telefonu" +} diff --git a/src/assets/lang/ru-extra.json b/src/assets/lang/ru-extra.json new file mode 100644 index 000000000..e34b4c3b2 --- /dev/null +++ b/src/assets/lang/ru-extra.json @@ -0,0 +1,76 @@ +{ + "Activity": "Активность", + "AnimalsNature": "Животные и природа", + "AppName": "Telegram", + "Archived": "Архив", + "BioAbout": "Любые подробности, например: возраст, род занятий или город.\nПример: 23 года, дизайнер из Санкт-Петербурга.", + "ChannelInfo": "Информация о канале", + "ChatInfo": "Информация о чате", + "ChatsAndContacts": "Чаты и контакты", + "ChooseDefaultSkinTone": "Выберите тон кожи по умолчанию", + "Connecting": "Соединение...", + "ConnectingToProxy": "Подключение к прокси...", + "ContactJoinedDisabled": "Выключено", + "ContactJoinedEnabled": "Включено", + "ContinueOnThisLanguage": "Продолжить на русском", + "CopyMessageLink": "Копировать ссылку на сообщение", + "Country": "Страна", + "Custom": "Пользовательские", + "DeletedMessage": "Удаленное сообщение", + "DragToReposition": "Перетащите, чтобы изменить положение", + "EditProfile": "Редактировать профиль", + "Emoji": "ЕМОДЗИ", + "EnterPassword": "Введите пароль", + "Flags": "Флаги", + "FoodDrink": "Еда и напитки", + "GeneralSettings": "Основные настройки", + "GoToMessage": "Перейти к сообщению", + "InvalidPhoneNumber": "Некорректный номер телефона. Пожалуйста, проверьте номер и попробуйте ещё раз.", + "KeepMeSignedIn": "Сохранить авторизацию", + "LeftChannel": "Канал покинут", + "LeftGroup": "Группа покинута", + "Loading": "Загрузка...", + "LogInByPhone": "Вход по номеру телефона", + "LogInViaQR": "Быстрый вход по QR-коду", + "More": "Ещё", + "Next": "Далее", + "NotEmojiFound": "Емодзи не найдены", + "NotificationsDisabled": "Выключены", + "NotificationsEnabled": "Включены", + "Objects": "Предметы", + "PhoneNumber": "Телефонный номер", + "PhotosTitle": "Фотографии", + "PollQuizOneRightAnswer": "В викторинах только один правильный ответ.", + "PreviewDisabled": "Выключено", + "PreviewEnabled": "Включено", + "QRHint": "1. Запустите Telegram на телефоне\n2. Откройте настройки > Устройства > Сканировать QR-код.\n3. Сканируйте этот код для авторизации", + "Recent": "Часто используемые", + "Saved": "Избранное", + "Search": "Поиск", + "SearchMessagesIn": "Искать сообщения в", + "SearchResults": "Результаты поиска", + "SelectChatToStartMessaging": "Пожалуйста, выберите, кому хотели бы написать", + "SendAsFile": "Отправить как файл", + "SendAsPhoto": "Отправить как фото", + "SendFileConfirmation": "Вы действительно хотите отправить файл?", + "SendFilesConfirmation": "Вы действительно хотите отправить файлы?", + "SendMessage": "Отправить сообщение", + "SignInToTelegram": "Вход в Telegram", + "SmileysPeople": "Смайлики и люди", + "StartText": "Пожалуйста, укажите код страны и свой номер телефона.", + "Stickers": "СТИКЕРЫ", + "Symbols": "Символы", + "Text": "Текст", + "TravelPlaces": "Путешествия и местности", + "UnpinAllMessagesAlert": "Хотите открепить все сообщения?", + "UpdateDraftConfirmation": "Вы действительно хотите обновить черновик сообщения?", + "Updating": "Обновление...", + "VideosTitle": "Видеозаписи", + "ViewChannelInfo": "Информация о канале", + "ViewGroupInfo": "Информация о группе", + "ViewProfile": "Показать профиль", + "VoiceTitle": "Голосовые сообщения", + "WaitingForNetwork": "Ожидание сети...", + "YourAccountProtectedWithPassword": "Ваш аккаунт защищен дополнительным паролем.", + "YourPhone": "Ваш телефон" +} diff --git a/src/assets/mastercard.svg b/src/assets/mastercard.svg new file mode 100644 index 000000000..73959ae78 --- /dev/null +++ b/src/assets/mastercard.svg @@ -0,0 +1,2 @@ + +image/svg+xml diff --git a/src/assets/media_navigation_next.svg b/src/assets/media_navigation_next.svg new file mode 100644 index 000000000..77ce415cb --- /dev/null +++ b/src/assets/media_navigation_next.svg @@ -0,0 +1 @@ + diff --git a/src/assets/media_navigation_previous.svg b/src/assets/media_navigation_previous.svg new file mode 100644 index 000000000..5e58b96a1 --- /dev/null +++ b/src/assets/media_navigation_previous.svg @@ -0,0 +1 @@ + diff --git a/src/assets/monkey.svg b/src/assets/monkey.svg new file mode 100644 index 000000000..c8eac0c49 --- /dev/null +++ b/src/assets/monkey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stripe-logo.png b/src/assets/stripe-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..17edcd5a4db07f6030492990376221e9e4b30679 GIT binary patch literal 6341 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 Hu0mjf(&+Lw literal 0 HcmV?d00001 diff --git a/src/assets/telegram-logo.svg b/src/assets/telegram-logo.svg new file mode 100644 index 000000000..61e97d8b3 --- /dev/null +++ b/src/assets/telegram-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/visa.svg b/src/assets/visa.svg new file mode 100644 index 000000000..b0953f5b6 --- /dev/null +++ b/src/assets/visa.svg @@ -0,0 +1,2 @@ + +image/svg+xml diff --git a/src/bundles/auth.ts b/src/bundles/auth.ts new file mode 100644 index 000000000..c69454d8a --- /dev/null +++ b/src/bundles/auth.ts @@ -0,0 +1,4 @@ +export { default as AuthCode } from '../components/auth/AuthCode'; +export { default as AuthPassword } from '../components/auth/AuthPassword'; +export { default as AuthRegister } from '../components/auth/AuthRegister'; +export { default as AuthQrCode } from '../components/auth/AuthQrCode'; diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts new file mode 100644 index 000000000..d6584bf8e --- /dev/null +++ b/src/bundles/extra.ts @@ -0,0 +1,46 @@ +export { default as MediaViewer } from '../components/mediaViewer/MediaViewer'; + +export { default as ForwardPicker } from '../components/main/ForwardPicker'; +export { default as Errors } from '../components/main/Errors'; +export { default as Notifications } from '../components/main/Notifications'; + +export { default as CalendarModal } from '../components/common/CalendarModal'; +export { default as DeleteMessageModal } from '../components/common/DeleteMessageModal'; +export { default as PinMessageModal } from '../components/common/PinMessageModal'; +export { default as UnpinAllMessagesModal } from '../components/common/UnpinAllMessagesModal'; +export { default as MessageSelectToolbar } from '../components/middle/MessageSelectToolbar'; + +export { default as LeftSearch } from '../components/left/search/LeftSearch'; +export { default as Settings } from '../components/left/settings/Settings'; +export { default as ContactList } from '../components/left/main/ContactList'; +export { default as NewChat } from '../components/left/newChat/NewChat'; +export { default as NewChatStep1 } from '../components/left/newChat/NewChatStep1'; +export { default as NewChatStep2 } from '../components/left/newChat/NewChatStep2'; +export { default as ArchivedChats } from '../components/left/ArchivedChats'; + +export { default as ContextMenuContainer } from '../components/middle/message/ContextMenuContainer'; +export { default as StickerSetModal } from '../components/common/StickerSetModal'; +export { default as HeaderMenuContainer } from '../components/middle/HeaderMenuContainer'; +export { default as MobileSearch } from '../components/middle/MobileSearch'; + +export { default as AttachmentModal } from '../components/middle/composer/AttachmentModal'; +export { default as PollModal } from '../components/middle/composer/PollModal'; +export { default as SymbolMenu } from '../components/middle/composer/SymbolMenu'; +export { default as AttachMenu } from '../components/middle/composer/AttachMenu'; +export { default as MentionMenu } from '../components/middle/composer/MentionMenu'; +export { default as EmojiTooltip } from '../components/middle/composer/EmojiTooltip'; +export { default as BotKeyboardMenu } from '../components/middle/composer/BotKeyboardMenu'; +export { default as CustomSendMenu } from '../components/middle/composer/CustomSendMenu'; +export { default as DropArea } from '../components/middle/composer/DropArea'; +export { default as TextFormatter } from '../components/middle/composer/TextFormatter'; + +export { default as RightSearch } from '../components/right/RightSearch'; +export { default as StickerSearch } from '../components/right/StickerSearch'; +export { default as GifSearch } from '../components/right/GifSearch'; +export { default as Statistics } from '../components/right/Statistics'; +export { default as PollResults } from '../components/right/PollResults'; + +export { default as Management } from '../components/right/management/Management'; + +export { default as PaymentModal } from '../components/payment/PaymentModal'; +export { default as ReceiptModal } from '../components/payment/ReceiptModal'; diff --git a/src/bundles/main.ts b/src/bundles/main.ts new file mode 100644 index 000000000..519785e61 --- /dev/null +++ b/src/bundles/main.ts @@ -0,0 +1,12 @@ +import { getDispatch } from '../lib/teact/teactn'; + +import { DEBUG } from '../config'; + +export { default as Main } from '../components/main/Main'; + +if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH LOAD MAIN BUNDLE'); +} + +getDispatch().initApi(); diff --git a/src/components/auth/Auth.scss b/src/components/auth/Auth.scss new file mode 100644 index 000000000..96946be84 --- /dev/null +++ b/src/components/auth/Auth.scss @@ -0,0 +1,168 @@ +.auth-form { + width: 100%; + max-width: 25.5rem; + margin: 0 auto; + padding: 1rem; + padding-top: 6rem; + text-align: center; + + @media (min-width: 600px) and (min-height: 450px) { + padding: 1.5rem; + padding-top: 6.8rem; + } + + #logo, .AvatarEditable label { + display: block; + margin-left: auto; + margin-right: auto; + width: 7.5rem; + height: 7.5rem; + margin-bottom: 1.75rem; + + @media (min-width: 600px) and (min-height: 450px) { + width: 10rem; + height: 10rem; + margin-bottom: 2.5rem; + } + } + + #logo { + background-size: 100%; + background: url('../../assets/telegram-logo.svg') center no-repeat; + } + + // Prevent loading additional 10 kB of Roboto font on initial load. + .caption-image { + margin-bottom: 0.5rem; + height: 19px; + background: url('../../assets/auth-caption.png') center center no-repeat; + background-size: auto 100%; + + @media (min-width: 600px) { + height: 48px; + background-size: 273px auto; + } + } + + h2 { + font-size: 1.25rem; + line-height: 1; + + @media (min-width: 600px) { + font-size: 2rem; + line-height: 1.5; + } + } + + .note { + font-size: 0.875rem; + line-height: 1.35; + margin-bottom: 2.5rem; + color: var(--color-text-secondary); + + @media (min-width: 600px) { + font-size: 1rem; + margin-bottom: 3rem; + } + } +} + +#auth-registration-form, +#auth-phone-number-form, +#auth-code-form, +#auth-password-form, +#auth-qr-form { + height: 100%; + overflow-y: auto; +} + +#auth-phone-number-form { + form { + min-height: 26.25rem; + } + + .Button { + margin-top: 2.75rem; + } + + .Button + .Button { + margin-top: 1rem; + } +} + +#auth-code-form, +#auth-password-form { + h2 { + display: flex; + align-items: center; + justify-content: center; + } +} + +.auth-number-edit { + width: 2.5rem; + height: 2.5rem; + padding: 0.5rem; + font-size: 1.5rem; + color: var(--color-text-secondary); + opacity: 0.75; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + &:hover, &:focus { + opacity: 1; + } +} + +#auth-qr-form { + .qr-container { + height: 280px; + + opacity: 1; + transform: scale(1); + transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1), opacity .3s; + + &.pre-animate { + opacity: 0.5; + transform: scale(0.8); + } + } + + h3 { + margin: 1.5rem 0 1rem 0; + } + + ol { + list-style: none; + counter-reset: item; + padding: 0 2rem; + + li { + counter-increment: item; + text-align: left; + margin: 0.75rem 0; + display: flex; + + &::before { + content: counter(item); + display: flex; + justify-content: center; + align-items: center; + min-width: 1.4rem; + height: 1.4rem; + padding: 0; + margin: 0 0.75rem 0 0; + background: var(--color-primary); + border-radius: 50%; + font-size: smaller; + color: white; + } + } + } +} + +#sign-in-password { + word-break: normal !important; +} diff --git a/src/components/auth/Auth.tsx b/src/components/auth/Auth.tsx new file mode 100644 index 000000000..c557de1c6 --- /dev/null +++ b/src/components/auth/Auth.tsx @@ -0,0 +1,44 @@ +import React, { FC, useEffect, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions, GlobalState } from '../../global/types'; + +import '../../modules/actions/initial'; +import { pick } from '../../util/iteratees'; + +import UiLoader from '../common/UiLoader'; +import AuthPhoneNumber from './AuthPhoneNumber'; +import AuthCode from './AuthCode.async'; +import AuthPassword from './AuthPassword.async'; +import AuthRegister from './AuthRegister.async'; +import AuthQrCode from './AuthQrCode.async'; + +import './Auth.scss'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const Auth: FC = ({ authState, initApi }) => { + useEffect(() => { + initApi(); + }, [initApi]); + + switch (authState) { + case 'authorizationStateWaitCode': + return ; + case 'authorizationStateWaitPassword': + return ; + case 'authorizationStateWaitRegistration': + return ; + case 'authorizationStateWaitQrCode': + return ; + case 'authorizationStateWaitPhoneNumber': + default: + return ; + } +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['authState']), + (global, actions): DispatchProps => pick(actions, ['initApi']), +)(Auth)); diff --git a/src/components/auth/AuthCode.async.tsx b/src/components/auth/AuthCode.async.tsx new file mode 100644 index 000000000..2b314c9d9 --- /dev/null +++ b/src/components/auth/AuthCode.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const AuthCodeAsync: FC = () => { + const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode'); + + return AuthCode ? : ; +}; + +export default AuthCodeAsync; diff --git a/src/components/auth/AuthCode.tsx b/src/components/auth/AuthCode.tsx new file mode 100644 index 000000000..0d144bc40 --- /dev/null +++ b/src/components/auth/AuthCode.tsx @@ -0,0 +1,120 @@ +import { FormEvent } from 'react'; +import React, { + FC, useState, useEffect, useCallback, memo, useRef, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; +import { GlobalState, GlobalActions } from '../../global/types'; + +import { IS_TOUCH_ENV } from '../../util/environment'; +import { pick } from '../../util/iteratees'; + +import InputText from '../ui/InputText'; +import Loading from '../ui/Loading'; +import TrackingMonkey from '../common/TrackingMonkey'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const CODE_LENGTH = 5; + +const AuthCode: FC = ({ + authPhoneNumber, authIsCodeViaApp, authIsLoading, authError, setAuthCode, returnToAuthPhoneNumber, clearAuthError, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [code, setCode] = useState(''); + const [isTracking, setIsTracking] = useState(false); + const [trackingDirection, setTrackingDirection] = useState(1); + + useEffect(() => { + if (!IS_TOUCH_ENV) { + inputRef.current!.focus(); + } + }, []); + + const onCodeChange = useCallback((e: FormEvent) => { + if (authError) { + clearAuthError(); + } + + const { currentTarget: target } = e; + target.value = target.value.replace(/[^\d]+/, '').substr(0, CODE_LENGTH); + + if (target.value === code) { + return; + } + + setCode(target.value); + + if (!isTracking) { + setIsTracking(true); + } else if (!target.value.length) { + setIsTracking(false); + } + + if (code && code.length > target.value.length) { + setTrackingDirection(-1); + } else { + setTrackingDirection(1); + } + + if (target.value.length === CODE_LENGTH) { + setAuthCode({ code: target.value }); + } + }, [authError, clearAuthError, code, isTracking, setAuthCode]); + + return ( +

    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']), + (setGlobal, actions): DispatchProps => pick(actions, ['setAuthCode', 'returnToAuthPhoneNumber', 'clearAuthError']), +)(AuthCode)); diff --git a/src/components/auth/AuthPassword.async.tsx b/src/components/auth/AuthPassword.async.tsx new file mode 100644 index 000000000..52c871710 --- /dev/null +++ b/src/components/auth/AuthPassword.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const AuthPasswordAsync: FC = () => { + const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword'); + + return AuthPassword ? : ; +}; + +export default AuthPasswordAsync; diff --git a/src/components/auth/AuthPassword.tsx b/src/components/auth/AuthPassword.tsx new file mode 100644 index 000000000..e181872f0 --- /dev/null +++ b/src/components/auth/AuthPassword.tsx @@ -0,0 +1,55 @@ +import React, { + FC, memo, useCallback, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalState, GlobalActions } from '../../global/types'; + +import { pick } from '../../util/iteratees'; + +import MonkeyPassword from '../common/PasswordMonkey'; +import PasswordForm from '../common/PasswordForm'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const AuthPassword: FC = ({ + authIsLoading, authError, authHint, setAuthPassword, clearAuthError, +}) => { + const [showPassword, setShowPassword] = useState(false); + + const handleChangePasswordVisibility = useCallback((isVisible) => { + setShowPassword(isVisible); + }, []); + + const handleSubmit = useCallback((password: string) => { + setAuthPassword({ password }); + }, [setAuthPassword]); + + return ( +
    +
    + +

    Enter Your Password

    +

    + Your account is protected with +
    an additional password. +

    + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']), + (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']), +)(AuthPassword)); diff --git a/src/components/auth/AuthPhoneNumber.tsx b/src/components/auth/AuthPhoneNumber.tsx new file mode 100644 index 000000000..0450fedf1 --- /dev/null +++ b/src/components/auth/AuthPhoneNumber.tsx @@ -0,0 +1,236 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useState, useEffect, useCallback, useLayoutEffect, useRef, memo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalState, GlobalActions } from '../../global/types'; + +import { + MEDIA_CACHE_NAME, + MEDIA_CACHE_NAME_AVATARS, + MEDIA_PROGRESSIVE_CACHE_NAME, + CUSTOM_BG_CACHE_NAME, + LANG_CACHE_NAME, +} from '../../config'; +import { IS_TOUCH_ENV } from '../../util/environment'; +import * as cacheApi from '../../util/cacheApi'; +import { formatPhoneNumber, getCountryFromPhoneNumber, getCountryById } from '../../util/phoneNumber'; +import preloadFonts from '../../util/fonts'; +import { preloadImage } from '../../util/files'; +import { pick } from '../../util/iteratees'; + +import Button from '../ui/Button'; +import InputText from '../ui/InputText'; +import CountryCodeInput from './CountryCodeInput'; +import Checkbox from '../ui/Checkbox'; +import Loading from '../ui/Loading'; + +// @ts-ignore +import monkeyPath from '../../assets/monkey.svg'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const MIN_NUMBER_LENGTH = 10; +// Cache clearing may be heavy so we delay it +const CLEAR_CACHE_DELAY = 2000; + +let isPreloadInitiated = false; + +const AuthPhoneNumber: FC = ({ + connectionState, + authState, + authPhoneNumber, + authIsLoading, + authIsLoadingQrCode, + authError, + authRememberMe, + authNearestCountry, + setAuthPhoneNumber, + setAuthRememberMe, + loadNearestCountry, + clearAuthError, + gotToAuthQrCode, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [country, setCountry] = useState(); + const [phoneNumber, setPhoneNumber] = useState(); + const [isTouched, setIsTouched] = useState(false); + const [lastSelection, setLastSelection] = useState<[number, number] | undefined>(); + + const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber; + const canSubmit = fullNumber && fullNumber.replace(/[^\d]+/g, '').length >= MIN_NUMBER_LENGTH; + + useEffect(() => { + if (!IS_TOUCH_ENV) { + inputRef.current!.focus(); + } + }, [country]); + + useEffect(() => { + if (connectionState === 'connectionStateReady' && !authNearestCountry) { + loadNearestCountry(); + } + }, [connectionState, authNearestCountry, loadNearestCountry]); + + useEffect(() => { + if (authNearestCountry && !country && !isTouched) { + setCountry(getCountryById(authNearestCountry)); + } + }, [country, authNearestCountry, isTouched]); + + const parseFullNumber = useCallback((newFullNumber: string) => { + const suggestedCountry = getCountryFromPhoneNumber(newFullNumber); + const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id) + ? suggestedCountry + : country; + + if (!newFullNumber.length) { + setCountry(undefined); + } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) { + setCountry(selectedCountry); + } + + setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry)); + }, [country]); + + useEffect(() => { + if (phoneNumber === undefined && authPhoneNumber) { + parseFullNumber(authPhoneNumber); + } + }, [authPhoneNumber, phoneNumber, parseFullNumber]); + + useLayoutEffect(() => { + if (inputRef.current && lastSelection) { + inputRef.current.setSelectionRange(...lastSelection); + } + }, [lastSelection]); + + // Media cache storage is always enabled, so we clear it only when user by any chance returned to the auth page + useEffect(() => { + setTimeout(() => { + cacheApi.clear(MEDIA_CACHE_NAME); + cacheApi.clear(MEDIA_CACHE_NAME_AVATARS); + cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME); + cacheApi.clear(CUSTOM_BG_CACHE_NAME); + cacheApi.clear(LANG_CACHE_NAME); + }, CLEAR_CACHE_DELAY); + }, []); + + const handlePhoneNumberChange = useCallback((e: ChangeEvent) => { + if (authError) { + clearAuthError(); + } + + // This is for further screens. We delay it until user input to speed up the initial loading. + if (!isPreloadInitiated) { + isPreloadInitiated = true; + preloadFonts(); + preloadImage(monkeyPath); + } + + const { value, selectionStart, selectionEnd } = e.target; + setLastSelection( + selectionStart && selectionEnd && selectionEnd < value.length + ? [selectionStart, selectionEnd] + : undefined, + ); + + setIsTouched(true); + parseFullNumber(value); + }, [authError, clearAuthError, parseFullNumber]); + + const handleKeepSessionChange = useCallback((e: ChangeEvent) => { + setAuthRememberMe(e.target.checked); + }, [setAuthRememberMe]); + + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); + + if (authIsLoading) { + return; + } + + if (canSubmit) { + setAuthPhoneNumber({ phoneNumber: fullNumber }); + } + } + + const isAuthReady = authState === 'authorizationStateWaitPhoneNumber'; + + return ( +
    +
    + + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, [ + 'connectionState', + 'authState', + 'authPhoneNumber', + 'authIsLoading', + 'authIsLoadingQrCode', + 'authError', + 'authRememberMe', + 'authNearestCountry', + ]), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setAuthPhoneNumber', + 'setAuthRememberMe', + 'clearAuthError', + 'loadNearestCountry', + 'gotToAuthQrCode', + ]), +)(AuthPhoneNumber)); diff --git a/src/components/auth/AuthQrCode.async.tsx b/src/components/auth/AuthQrCode.async.tsx new file mode 100644 index 000000000..0efa8035a --- /dev/null +++ b/src/components/auth/AuthQrCode.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const AuthQrCodeAsync: FC = () => { + const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode'); + + return AuthQrCode ? : ; +}; + +export default AuthQrCodeAsync; diff --git a/src/components/auth/AuthQrCode.tsx b/src/components/auth/AuthQrCode.tsx new file mode 100644 index 000000000..d3f99dca6 --- /dev/null +++ b/src/components/auth/AuthQrCode.tsx @@ -0,0 +1,64 @@ +import QrCreator from 'qr-creator'; +import React, { + FC, useEffect, useRef, memo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; +import { GlobalState, GlobalActions } from '../../global/types'; + +import { pick } from '../../util/iteratees'; + +import Loading from '../ui/Loading'; +import Button from '../ui/Button'; +import buildClassName from '../../util/buildClassName'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const DATA_PREFIX = 'tg://login?token='; + +const AuthCode: FC = ({ + connectionState, authQrCode, returnToAuthPhoneNumber, +}) => { + // eslint-disable-next-line no-null/no-null + const qrCodeRef = useRef(null); + + useEffect(() => { + if (!authQrCode || connectionState !== 'connectionStateReady') { + return; + } + + const container = qrCodeRef.current!; + + container.innerHTML = ''; + container.classList.remove('pre-animate'); + QrCreator.render({ + text: `${DATA_PREFIX}${authQrCode.token}`, + radius: 0.5, + ecLevel: 'M', + fill: '#4E96D4', + size: 280, + }, container); + }, [connectionState, authQrCode]); + + return ( +
    +
    +
    + {!authQrCode && } +
    +

    Log in to Telegram by QR Code

    +
      +
    1. Open Telegram on your phone
    2. +
    3. Go to Settings > Devices > Scan QR
    4. +
    5. Point your phone at this screen to confirm login
    6. +
    + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['connectionState', 'authQrCode']), + (setGlobal, actions): DispatchProps => pick(actions, ['returnToAuthPhoneNumber']), +)(AuthCode)); diff --git a/src/components/auth/AuthRegister.async.tsx b/src/components/auth/AuthRegister.async.tsx new file mode 100644 index 000000000..5b5a124d4 --- /dev/null +++ b/src/components/auth/AuthRegister.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const AuthRegisterAsync: FC = () => { + const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister'); + + return AuthRegister ? : ; +}; + +export default AuthRegisterAsync; diff --git a/src/components/auth/AuthRegister.tsx b/src/components/auth/AuthRegister.tsx new file mode 100644 index 000000000..39f888f19 --- /dev/null +++ b/src/components/auth/AuthRegister.tsx @@ -0,0 +1,88 @@ +import { ChangeEvent } from 'react'; +import React, { FC, useState, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalState, GlobalActions } from '../../global/types'; + +import { pick } from '../../util/iteratees'; + +import Button from '../ui/Button'; +import InputText from '../ui/InputText'; +import AvatarEditable from '../ui/AvatarEditable'; + +type StateProps = Pick; +type DispatchProps = Pick; + +const AuthRegister: FC = ({ + authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto, +}) => { + const [isButtonShown, setIsButtonShown] = useState(false); + const [croppedFile, setCroppedFile] = useState(); + const [firstName, setFirstName] = useState(''); + const [lastName, setLastName] = useState(''); + + function handleFirstNameChange(event: ChangeEvent) { + if (authError) { + clearAuthError(); + } + + const { target } = event; + + setFirstName(target.value); + setIsButtonShown(target.value.length > 0); + } + + function handleLastNameChange(event: ChangeEvent) { + const { target } = event; + + setLastName(target.value); + } + + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); + + signUp({ firstName, lastName }); + + if (croppedFile) { + uploadProfilePhoto({ file: croppedFile }); + } + } + + return ( +
    +
    +
    + +

    Your Name

    +

    + Enter your name and add +
    a profile picture. +

    + + + {isButtonShown && ( + + )} + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['authIsLoading', 'authError']), + (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']), +)(AuthRegister)); diff --git a/src/components/auth/CountryCodeInput.scss b/src/components/auth/CountryCodeInput.scss new file mode 100644 index 000000000..4363fca7c --- /dev/null +++ b/src/components/auth/CountryCodeInput.scss @@ -0,0 +1,90 @@ +.CountryCodeInput { + + .input-group { + cursor: pointer; + + z-index: var(--z-country-code-input-group); + + .Spinner { + position: absolute; + top: 1rem; + right: 0.75rem; + opacity: 0.5; + --spinner-size: 1.5rem; + } + + // Prevent loading additional 10 kB of icomoon font on initial load. + .css-icon-down { + position: absolute; + top: 1.125rem; + right: 1rem; + width: .75rem; + height: .75rem; + border: 2px solid var(--color-text-secondary); + border-top: 0; + border-left: 0; + transform: scaleY(1) rotate(45deg); + transition: color .2s ease, transform .2s ease, top .2s ease; + + &.open { + border-color: var(--color-primary); + transform: scaleY(-1) rotate(45deg); + top: 1.5rem; + } + } + } + + .bubble { + width: 100%; + max-height: 23.5rem; + overflow-y: auto; + transform-origin: top center !important; + transform: scale(0.95); + + &.open { + transform: scaleY(1); + } + } + + .MenuItem { + button { + display: flex; + align-items: center; + } + + &.no-results button { + justify-content: center; + padding: .5rem 1rem; + + span { + font-size: 0.875rem; + } + } + } + + .country-flag { + font-size: 2rem; + margin-right: 2rem; + + .emoji { + width: 2rem; + height: 2rem; + display: inline-block; + vertical-align: 4px; + margin: -.5rem .125rem; + } + } + + .country-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-right: 1rem; + text-align: left; + } + + .country-code { + margin-left: auto; + opacity: 0.5; + } +} diff --git a/src/components/auth/CountryCodeInput.tsx b/src/components/auth/CountryCodeInput.tsx new file mode 100644 index 000000000..4586f5ca5 --- /dev/null +++ b/src/components/auth/CountryCodeInput.tsx @@ -0,0 +1,152 @@ +import React, { + FC, useState, memo, useCallback, useRef, +} from '../../lib/teact/teact'; + +import { countryList } from '../../util/phoneNumber'; +import searchWords from '../../util/searchWords'; +import buildClassName from '../../util/buildClassName'; +import renderText from '../common/helpers/renderText'; + +import DropdownMenu from '../ui/DropdownMenu'; +import MenuItem from '../ui/MenuItem'; +import Spinner from '../ui/Spinner'; + +import './CountryCodeInput.scss'; +import { ANIMATION_END_DELAY } from '../../config'; + +type OwnProps = { + id: string; + value?: Country; + isLoading?: boolean; + onChange: (value: Country) => void; +}; + +const MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY; +const SELECT_TIMEOUT = 50; + +const CountryCodeInput: FC = ({ + id, + value, + isLoading, + onChange, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [filter, setFilter] = useState(); + const [filteredList, setFilteredList] = useState(countryList); + + function updateFilter(filterValue?: string) { + setFilter(filterValue); + setFilteredList(getFilteredList(filterValue)); + } + + const handleChange = useCallback((e: React.SyntheticEvent) => { + const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset; + const country = countryList.find((c) => c.id === countryId); + + if (country) { + onChange(country); + } + + setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION); + }, [onChange]); + + const handleInput = useCallback((e: React.FormEvent) => { + updateFilter(e.currentTarget.value); + }, []); + + const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.keyCode !== 8) { + return; + } + + const target = e.currentTarget; + if (value && filter === undefined) { + target.value = ''; + } + + updateFilter(target.value); + }, [filter, value]); + + const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => { + const handleTrigger = () => { + if (isOpen) { + return; + } + + setTimeout(() => { + inputRef.current!.select(); + }, SELECT_TIMEOUT); + + onTrigger(); + + const formEl = document.getElementById('auth-phone-number-form')!; + formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' }); + }; + + const inputValue = filter !== undefined + ? filter + : (value && value.name) || ''; + + return ( +
    + + + {isLoading ? ( + + ) : ( + + )} +
    + ); + }; + + return ( + + {filteredList.map((country: Country) => ( + + + {renderText(country.flag, ['hq_emoji'])} + {country.name} + {country.code} + + ))} + {!filteredList.length && ( + + No countries matched your filter. + + )} + + ); +}; + +function getFilteredList(filter = ''): Country[] { + return filter.length + ? countryList.filter((country) => searchWords(country.name, filter)) + : countryList; +} + +export default memo(CountryCodeInput); diff --git a/src/components/common/AnimatedEmoji.scss b/src/components/common/AnimatedEmoji.scss new file mode 100644 index 000000000..40bbecf6c --- /dev/null +++ b/src/components/common/AnimatedEmoji.scss @@ -0,0 +1,8 @@ +.AnimatedEmoji { + margin-bottom: 0.75rem; + + img { + width: 100%; + height: 100%; + } +} diff --git a/src/components/common/AnimatedEmoji.tsx b/src/components/common/AnimatedEmoji.tsx new file mode 100644 index 000000000..7b6c5ec5b --- /dev/null +++ b/src/components/common/AnimatedEmoji.tsx @@ -0,0 +1,86 @@ +import React, { + FC, useCallback, useRef, useState, +} from '../../lib/teact/teact'; + +import { ApiMediaFormat, ApiSticker } from '../../api/types'; + +import { STICKER_SIZE_TWO_FA } from '../../config'; +import { getStickerDimensions } from './helpers/mediaDimensions'; +import { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver'; +import useMedia from '../../hooks/useMedia'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; +import useFlag from '../../hooks/useFlag'; + +import AnimatedSticker from './AnimatedSticker'; + +import './AnimatedEmoji.scss'; + +type OwnProps = { + sticker: ApiSticker; + observeIntersection?: ObserveFn; + isInline?: boolean; + lastSyncTime?: number; +}; + +const QUALITY = 1; +const RESIZE_FACTOR = 0.5; + +const AnimatedEmoji: FC = ({ + sticker, isInline = false, observeIntersection, lastSyncTime, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const [isAnimationLoaded, markAnimationLoaded] = useFlag(); + const localMediaHash = `sticker${sticker.id}`; + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl, lastSyncTime); + const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow'); + + const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime); + const isMediaLoaded = Boolean(mediaData); + + const [playKey, setPlayKey] = useState(String(Math.random())); + const handleClick = useCallback(() => { + setPlayKey(String(Math.random())); + }, []); + + let width: number; + if (isInline) { + width = getStickerDimensions(sticker).width * RESIZE_FACTOR; + } else { + width = STICKER_SIZE_TWO_FA; + } + + const style = `width: ${width}px; height: ${width}px;`; + + return ( +
    + {previewBlobUrl && !isAnimationLoaded && ( + + )} + {isMediaLoaded && ( + + )} +
    + ); +}; + +export default AnimatedEmoji; diff --git a/src/components/common/AnimatedSticker.tsx b/src/components/common/AnimatedSticker.tsx new file mode 100644 index 000000000..e000412ad --- /dev/null +++ b/src/components/common/AnimatedSticker.tsx @@ -0,0 +1,212 @@ +import React, { + FC, useEffect, useRef, memo, useCallback, useState, +} from '../../lib/teact/teact'; + +import { IS_IOS } from '../../util/environment'; +import { fastRaf } from '../../util/schedulers'; +import buildClassName from '../../util/buildClassName'; +import useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck'; +import useBackgroundMode from '../../hooks/useBackgroundMode'; + +type OwnProps = { + className?: string; + id: string; + animationData: AnyLiteral; + play?: boolean | string; + playSegment?: [number, number]; + speed?: number; + noLoop?: boolean; + size: number; + quality?: number; + isLowPriority?: boolean; + onLoad?: NoneToVoidFunction; +}; + +type RLottieClass = typeof import('../../lib/rlottie/RLottie').default; +type RLottieInstance = import('../../lib/rlottie/RLottie').default; +let lottiePromise: Promise; +let RLottie: RLottieClass; + +// Time supposed for judges to measure "Transferred Size" in Dev Tools +const LOTTIE_LOAD_DELAY = 5000; + +async function ensureLottie() { + if (!lottiePromise) { + lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise; + RLottie = (await lottiePromise as any).default; + } + + return lottiePromise; +} + +setTimeout(ensureLottie, LOTTIE_LOAD_DELAY); + +const AnimatedSticker: FC = ({ + className, + id, + animationData, + play, + playSegment, + speed, + noLoop, + size, + quality, + isLowPriority, + onLoad, +}) => { + const [animation, setAnimation] = useState(); + // eslint-disable-next-line no-null/no-null + const container = useRef(null); + const wasPlaying = useRef(false); + const isFrozen = useRef(false); + + const playRef = useRef(); + playRef.current = play; + const playSegmentRef = useRef<[number, number]>(); + playSegmentRef.current = playSegment; + + useEffect(() => { + if (animation || !animationData) { + return; + } + + const exec = () => { + if (!container.current) { + return; + } + + const newAnimation = new RLottie( + id, + container.current, + animationData, + { + noLoop, + size, + quality, + isLowPriority, + }, + onLoad, + ); + + if (speed) { + newAnimation.setSpeed(speed); + } + + setAnimation(newAnimation); + }; + + if (RLottie) { + exec(); + } else { + ensureLottie().then(() => { + fastRaf(() => { + if (container.current) { + exec(); + } + }); + }); + } + }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]); + + useEffect(() => { + return () => { + if (animation) { + animation.destroy(); + } + }; + }, [animation]); + + const playAnimation = useCallback((shouldRestart = false) => { + if (animation && (playRef.current || playSegmentRef.current)) { + if (playSegmentRef.current) { + animation.playSegment(playSegmentRef.current); + } else if (shouldRestart) { + animation.goToAndPlay(0); + } else { + animation.play(); + } + } + }, [animation]); + + const pauseAnimation = useCallback(() => { + if (!animation) { + return; + } + + animation.pause(); + }, [animation]); + + const freezeAnimation = useCallback(() => { + isFrozen.current = true; + + if (!animation) { + return; + } + + if (!wasPlaying.current) { + wasPlaying.current = animation.isPlaying(); + } + + pauseAnimation(); + }, [animation, pauseAnimation]); + + const unfreezeAnimation = useCallback(() => { + if (wasPlaying.current) { + playAnimation(); + } + + wasPlaying.current = false; + isFrozen.current = false; + }, [playAnimation]); + + const unfreezeAnimationOnRaf = useCallback(() => { + fastRaf(unfreezeAnimation); + }, [unfreezeAnimation]); + + useEffect(() => { + if (!animation) { + return; + } + + if (play || playSegment) { + if (isFrozen.current) { + wasPlaying.current = true; + } else { + playAnimation(noLoop); + } + } else { + // eslint-disable-next-line no-lonely-if + if (isFrozen.current) { + wasPlaying.current = false; + } else { + pauseAnimation(); + } + } + }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]); + + useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation); + // Pausing frame may not happen in background + // so we need to make sure it happens right after focusing, + // then we can play again. + useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf); + + const fullClassName = buildClassName( + 'AnimatedSticker', + className, + // Workaround for an iOS bug when animated stickers sometimes disappear + IS_IOS && play && 'is-playing', + ); + + const style = size ? `width: ${size}px; height: ${size}px;` : undefined; + + return ( +
    + ); +}; + +export default memo(AnimatedSticker); diff --git a/src/components/common/Audio.scss b/src/components/common/Audio.scss new file mode 100644 index 000000000..3a52c8489 --- /dev/null +++ b/src/components/common/Audio.scss @@ -0,0 +1,230 @@ +.Audio { + display: flex; + align-items: flex-start; + + &.media-inner { + overflow: visible; + } + + &.own { + --color-text-secondary: var(--accent-color); + --color-interactive-active: var(--color-text-green); + --color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4); + --color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4); // Overlays underlying inactive color + + .Button { + --color-primary: var(--color-text-green); + --color-primary-shade: var(--color-green); + --color-primary-shade-darker: var(--color-green-darker); + --color-white: var(--color-background-own); + } + } + + .toggle-play { + margin-right: .5rem; + + &.smaller { + width: 3rem; + height: 3rem; + margin-right: .75rem; + + i { + font-size: 1.625rem; + margin-top: -.025rem; + } + } + + i { + position: absolute; + + &.icon-play { + margin-left: .125rem; + @media (max-width: 600px) { + margin-left: .0625rem; + } + } + } + + .icon-play, .icon-pause { + opacity: 1; + transform: scale(1); + transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1); + } + + &.play .icon-pause, + &.pause .icon-play, + &.loading .icon-play, + &.loading .icon-pause { + opacity: 0; + transform: scale(.5); + } + } + + .content { + align-self: center; + min-width: 0; + flex-grow: 1; + } + + .content-row { + display: flex; + justify-content: space-between; + } + + .title { + font-weight: 500; + margin: 0; + line-height: 1.25; + overflow: hidden; + text-overflow: ellipsis; + } + + .voice-duration { + margin: .25rem 0 0; + font-size: .875rem; + color: var(--color-text-secondary); + + span { + margin-left: 0.25rem; + font-size: 1.5rem; + line-height: .875rem; + vertical-align: middle; + } + } + + &:not(.own) .voice-duration span { + color: var(--color-primary); + } + + .waveform { + cursor: pointer; + margin-left: 1px; + } + + .meta, + .performer, + .date { + font-size: .875rem; + line-height: 1; + color: var(--color-text-secondary); + margin: 0; + } + + .duration { + margin: .1875rem 0 0; + font-size: .875rem; + color: var(--color-text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .seekline { + width: calc(100% - 2px); + padding-left: 6px; + margin-bottom: .3125rem; + height: 12px; + position: relative; + margin-left: -6px; + top: 1px; + cursor: pointer; + + &::before { + content: ''; + position: absolute; + width: 100%; + left: 6px; + top: 6px; + height: 2px; + background-color: var(--color-interactive-inactive); + border-radius: 2px; + } + } + + .seekline-buffered-progress, .seekline-play-progress { + position: absolute; + height: 2px; + border-radius: 2px; + overflow: hidden; + width: 100%; + top: 6px; + left: 6px; + + i { + position: absolute; + width: 100%; + background-color: var(--color-interactive-active); + height: 2px; + border-radius: 2px; + right: 100%; + } + } + + .seekline-buffered-progress i { + background-color: var(--color-interactive-buffered) !important; + } + + .seekline-thumb { + position: absolute; + width: 100%; + top: 7px; + left: 0; + + i { + pointer-events: none; + position: absolute; + width: 100%; + right: 100%; + + &::after { + content: ''; + position: absolute; + top: -6px; + right: -12px; + width: 12px; + height: 12px; + border-radius: 6px; + background: var(--color-interactive-active); + } + } + } + + &.bigger { + .content { + margin-top: .1875rem; + } + + .title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; + line-height: 1.5rem; + } + + .meta, + .performer, + .date { + line-height: 1.0625rem; + } + + .seekline { + top: 2px; + margin-bottom: .5rem; + } + + .duration { + line-height: 1rem; + } + + .media-loading { + top: 0.1875rem; + left: 0.1875rem; + } + } + + .ProgressSpinner.size-s svg { + width: 2.25rem; + height: 2.25rem; + } +} diff --git a/src/components/common/Audio.tsx b/src/components/common/Audio.tsx new file mode 100644 index 000000000..f047892df --- /dev/null +++ b/src/components/common/Audio.tsx @@ -0,0 +1,417 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../lib/teact/teact'; + +import { + ApiAudio, ApiMessage, ApiVoice, +} from '../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat'; +import { + getMediaDuration, + getMediaTransferState, + getMessageKey, + getMessageMediaFormat, + getMessageMediaHash, + isMessageLocal, + isOwnMessage, +} from '../../modules/helpers'; +import { renderWaveformToDataUri } from './helpers/waveform'; +import buildClassName from '../../util/buildClassName'; +import renderText from './helpers/renderText'; +import { decodeWaveform, interpolateArray } from '../../util/waveform'; +import useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress'; +import useShowTransition from '../../hooks/useShowTransition'; +import useBuffering from '../../hooks/useBuffering'; +import useAudioPlayer from '../../hooks/useAudioPlayer'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import ProgressSpinner from '../ui/ProgressSpinner'; +import Link from '../ui/Link'; + +import './Audio.scss'; + +type OwnProps = { + message: ApiMessage; + senderTitle?: string; + uploadProgress?: number; + renderingFor?: 'searchResult' | 'sharedMedia'; + date?: number; + lastSyncTime?: number; + className?: string; + isSelectable?: boolean; + isSelected?: boolean; + onPlay: (messageId: number, chatId: number) => void; + onReadMedia?: () => void; + onCancelUpload?: () => void; + onDateClick?: (messageId: number, chatId: number) => void; +}; + +interface ISeekMethods { + handleStartSeek: (e: React.MouseEvent) => void; + handleSeek: (e: React.MouseEvent) => void; + handleStopSeek: () => void; +} + +const AVG_VOICE_DURATION = 30; +const MIN_SPIKES = IS_MOBILE_SCREEN ? 20 : 25; +const MAX_SPIKES = IS_MOBILE_SCREEN ? 50 : 75; +// This is needed for browsers requiring user interaction before playing. +const PRELOAD = true; + +const Audio: FC = ({ + message, + senderTitle, + uploadProgress, + renderingFor, + date, + lastSyncTime, + className, + isSelectable, + isSelected, + onPlay, + onReadMedia, + onCancelUpload, + onDateClick, +}) => { + const { content: { audio, voice }, isMediaUnread } = message; + const isVoice = Boolean(voice); + const isSeeking = useRef(false); + + const [isActivated, setIsActivated] = useState(false); + const shouldDownload = (isActivated || PRELOAD) && lastSyncTime; + + const { mediaData, downloadProgress } = useMediaWithDownloadProgress( + getMessageMediaHash(message, 'inline'), + !shouldDownload, + getMessageMediaFormat(message, 'inline'), + ); + + function handleForcePlay() { + setIsActivated(true); + onPlay(message.id, message.chatId); + } + + const { + isBuffered, bufferedProgress, bufferingHandlers, checkBuffering, + } = useBuffering(); + + const { + isPlaying, playProgress, playPause, setCurrentTime, duration, + } = useAudioPlayer( + getMessageKey(message), + getMediaDuration(message)!, + mediaData, + bufferingHandlers, + checkBuffering, + isActivated, + handleForcePlay, + isMessageLocal(message), + ); + + useEffect(() => { + setIsActivated(isPlaying); + }, [isPlaying]); + + const { + isUploading, isTransferring, transferProgress, + } = getMediaTransferState(message, uploadProgress || downloadProgress, isActivated && !isBuffered); + + const { + shouldRender: shouldRenderSpinner, + transitionClassNames: spinnerClassNames, + } = useShowTransition(isTransferring); + + const handleButtonClick = useCallback(() => { + if (isUploading) { + if (onCancelUpload) { + onCancelUpload(); + } + + return; + } + + if (!isPlaying) { + onPlay(message.id, message.chatId); + } + + setIsActivated(!isActivated); + playPause(); + }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]); + + useEffect(() => { + if (isPlaying && onReadMedia && isMediaUnread) { + onReadMedia(); + } + }, [isPlaying, isMediaUnread, onReadMedia]); + + const handleSeek = useCallback((e: React.MouseEvent) => { + if (isSeeking.current) { + const seekBar = e.currentTarget.closest('.seekline,.waveform'); + if (seekBar) { + const { width, left } = seekBar.getBoundingClientRect(); + setCurrentTime(duration * ((e.clientX - left) / width)); + } + } + }, [duration, setCurrentTime]); + + const handleStartSeek = useCallback((e: React.MouseEvent) => { + isSeeking.current = true; + handleSeek(e); + }, [handleSeek]); + + const handleStopSeek = useCallback(() => { + isSeeking.current = false; + }, []); + + const handleDateClick = useCallback(() => { + onDateClick!(message.id, message.chatId); + }, [onDateClick, message.id, message.chatId]); + + useLang(); + + function getFirstLine() { + if (isVoice) { + return senderTitle || 'Voice'; + } + + const { title, fileName } = audio!; + + return title || fileName; + } + + function getSecondLine() { + if (isVoice) { + return formatMediaDuration(voice!.duration); + } + + const { performer } = audio!; + + return ( + <> + {performer && renderText(performer)} + {performer && senderTitle && } + {senderTitle && renderText(senderTitle)} + + ); + } + + const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek }; + const isOwn = isOwnMessage(message); + const renderedWaveform = useMemo( + () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers), + [voice, playProgress, isOwn, seekHandlers], + ); + + const fullClassName = buildClassName( + 'Audio media-inner', + className, + isOwn && !renderingFor && 'own', + renderingFor && 'bigger', + isSelected && 'audio-is-selected', + ); + + const buttonClassNames = ['toggle-play']; + if (shouldRenderSpinner) { + buttonClassNames.push('loading'); + } else if (isPlaying) { + buttonClassNames.push('pause'); + } else if (!isPlaying) { + buttonClassNames.push('play'); + } + + const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1); + const contentClassName = buildClassName('content', showSeekline && 'with-seekline'); + + function renderSearchResult() { + return ( + <> +
    +
    +

    {renderText(getFirstLine())}

    + +
    + {date && ( + + {formatPastTimeShort(date * 1000)} + + )} +
    +
    + + {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)} + {!showSeekline && ( +

    + {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined} + {getSecondLine()} +

    + )} +
    + + ); + } + + return ( +
    + {isSelectable && ( +
    + {isSelected && } +
    + )} + + {shouldRenderSpinner && ( +
    + +
    + )} + {renderingFor === 'searchResult' && renderSearchResult()} + {renderingFor !== 'searchResult' && audio && renderAudio( + audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date, + onDateClick ? handleDateClick : undefined, + )} + {renderingFor !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)} +
    + ); +}; + +function renderAudio( + audio: ApiAudio, + isPlaying: boolean, + playProgress: number, + bufferedProgress: number, + seekHandlers: ISeekMethods, + date?: number, + handleDateClick?: () => void, +) { + const { + title, performer, duration, fileName, + } = audio; + const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1); + + return ( +
    +

    {renderText(title || fileName)}

    + {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)} + {!showSeekline && ( +
    + {renderText(performer || 'Unknown')} + {date && ( + <> + {' '} + • + {' '} + {formatMediaDateTime(date * 1000)} + + )} +
    + )} +

    + {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined} + {formatMediaDuration(duration)} +

    +
    + ); +} + +function renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) { + return ( +
    + {renderedWaveform} +

    + {formatMediaDuration(voice.duration)} + {isMediaUnread && } +

    +
    + ); +} + +function renderWaveform( + voice: ApiVoice, playProgress = 0, isOwn = false, { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods, +) { + const { waveform, duration } = voice; + + if (!waveform) { + return undefined; + } + + const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1); + const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor); + const decodedWaveform = decodeWaveform(new Uint8Array(waveform)); + const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount); + const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, { + peak, + fillStyle: isOwn ? '#B0DEA6' : '#CBCBCB', + progressFillStyle: isOwn ? '#53ad53' : '#54a3e6', + }); + + return ( + // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions + + ); +} + +function renderSeekline( + playProgress: number, + bufferedProgress: number, + { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods, +) { + return ( +
    + + + + + + + + + +
    + ); +} + +export default memo(Audio); diff --git a/src/components/common/Avatar.scss b/src/components/common/Avatar.scss new file mode 100644 index 000000000..a90a5dd5f --- /dev/null +++ b/src/components/common/Avatar.scss @@ -0,0 +1,162 @@ +.Avatar { + --color-user: var(--color-primary); + flex: none; + align-items: center; + justify-content: center; + width: 3.375rem; + height: 3.375rem; + border-radius: 50%; + background: linear-gradient(white -125%, var(--color-user)); + color: white; + font-weight: bold; + display: flex; + white-space: nowrap; + + img:not(.emoji) { + border-radius: 50%; + } + + .emoji { + width: 1rem; + height: 1rem; + } + + i { + font-size: 2.5rem; + } + + &.size-micro { + width: 1rem; + height: 1rem; + font-size: 0.5125rem; + + .emoji { + width: .5625rem; + height: .5625rem; + } + } + + &.size-tiny { + width: 2rem; + height: 2rem; + font-size: .875rem; + + .emoji { + width: .875rem; + height: .875rem; + } + } + + &.size-small { + width: 2.125rem; + height: 2.125rem; + font-size: 0.875rem; + + .emoji { + width: .875rem; + height: .875rem; + } + } + + &.size-medium { + width: 2.75rem; + height: 2.75rem; + font-size: 1.1875rem; + + .emoji { + width: 1rem; + height: 1rem; + } + } + + &.size-large { + font-size: 1.3125rem; + + i { + font-size: 3.5rem; + } + + .emoji { + width: 1.3125rem; + height: 1.3125rem; + } + } + + &.size-jumbo { + width: 7.5rem; + height: 7.5rem; + font-size: 3.5rem; + + i { + font-size: 6rem; + } + + .emoji { + width: 3.5rem; + height: 3.5rem; + } + } + + &.online { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + bottom: 0.05rem; + right: 0.05rem; + width: 0.875rem; + height: 0.875rem; + border-radius: 50%; + border: 2px solid white; + background-color: #0ac630; + flex-shrink: 0; + } + } + + &.interactive { + cursor: pointer; + } + + img:not(.emoji) { + width: 100%; + height: 100%; + } + + &.color-bg-1 { + --color-user: var(--color-user-1); + } + + &.color-bg-2 { + --color-user: var(--color-user-2); + } + + &.color-bg-4 { + --color-user: var(--color-user-4); + } + + &.color-bg-5 { + --color-user: var(--color-user-5); + } + + &.color-bg-6 { + --color-user: var(--color-user-6); + } + + &.color-bg-7 { + --color-user: var(--color-user-7); + } + + &.color-bg-8 { + --color-user: var(--color-user-8); + } + + &.saved-messages { + --color-user: var(--color-primary); + } + + &.deleted-account { + --color-user: var(--color-gray); + } +} diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx new file mode 100644 index 000000000..4a79a82b3 --- /dev/null +++ b/src/components/common/Avatar.tsx @@ -0,0 +1,104 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; + +import { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types'; + +import { IS_TEST } from '../../config'; +import { + getChatAvatarHash, getChatTitle, isChatPrivate, + getUserFullName, isUserOnline, isDeletedUser, getUserColorKey, +} from '../../modules/helpers'; +import { getFirstLetters } from '../../util/textFormat'; +import buildClassName from '../../util/buildClassName'; +import renderText from './helpers/renderText'; +import useMedia from '../../hooks/useMedia'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; +import useLang from '../../hooks/useLang'; + +import './Avatar.scss'; + +type OwnProps = { + className?: string; + size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo'; + withOnlineStatus?: boolean; + chat?: ApiChat; + user?: ApiUser; + text?: string; + isSavedMessages?: boolean; + lastSyncTime?: number; + onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void; +}; + +const Avatar: FC = ({ + className, + size = 'large', + chat, + user, + text, + withOnlineStatus, + isSavedMessages, + lastSyncTime, + onClick, +}) => { + const isDeleted = user && isDeletedUser(user); + let imageHash: string | undefined; + + if (!isSavedMessages && !isDeleted) { + if (user) { + imageHash = getChatAvatarHash(user); + } else if (chat) { + imageHash = getChatAvatarHash(chat); + } + } + + const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime); + const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow'); + + useLang(); + + let content: string | undefined = ''; + + if (isSavedMessages) { + content = ; + } else if (isDeleted) { + content = ; + } else if (shouldRenderFullMedia) { + content = ; + } else if (user) { + const userFullName = getUserFullName(user); + content = userFullName ? getFirstLetters(userFullName, 2) : undefined; + } else if (chat) { + const title = getChatTitle(chat); + content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1); + } else if (text) { + content = getFirstLetters(text, 2); + } + + const isOnline = !isSavedMessages && user && isUserOnline(user); + const fullClassName = buildClassName( + `Avatar size-${size}`, + className, + `color-bg-${getUserColorKey(user || chat)}`, + isSavedMessages && 'saved-messages', + isDeleted && 'deleted-account', + withOnlineStatus && isOnline && 'online', + onClick && 'interactive', + (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo', + ); + + const handleClick = useCallback((e: ReactMouseEvent) => { + if (onClick) { + onClick(e, isSavedMessages || shouldRenderFullMedia); + } + }, [onClick, isSavedMessages, shouldRenderFullMedia]); + + const senderId = (user || chat) && (user || chat)!.id; + + return ( +
    + {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content} +
    + ); +}; + +export default memo(Avatar); diff --git a/src/components/common/CalendarModal.async.tsx b/src/components/common/CalendarModal.async.tsx new file mode 100644 index 000000000..6ed58f1aa --- /dev/null +++ b/src/components/common/CalendarModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './CalendarModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const CalendarModalAsync: FC = (props) => { + const { isOpen } = props; + const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return CalendarModal ? : undefined; +}; + +export default CalendarModalAsync; diff --git a/src/components/common/CalendarModal.scss b/src/components/common/CalendarModal.scss new file mode 100644 index 000000000..62af82b36 --- /dev/null +++ b/src/components/common/CalendarModal.scss @@ -0,0 +1,132 @@ +.CalendarModal { + .modal-dialog { + max-width: 26.25rem; + .modal-content { + padding: .375rem 1rem 1rem; + } + } + + .timepicker { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 1.5rem; + + .form-control { + max-width: 5rem; + text-align: center; + + &:first-child { + margin-right: 1rem; + } + &:last-child { + margin-left: 1rem; + } + } + } + + .footer { + display: flex; + justify-content: flex-end; + flex-direction: column; + + .Button { + text-transform: none; + + + .Button { + margin-top: .5rem; + } + } + } + + .month-selector { + display: flex; + align-items: center; + + h4 { + flex: 1; + margin: 0 0 0 1.25rem; + font-size: 1.25rem; + + @media (max-width: 600px) { + margin-left: .75rem; + } + + & ~ .Button { + color: var(--color-primary) + } + } + + .Button.hidden { + opacity: 0.5; + pointer-events: none; + } + } + + .day-button { + position: relative; + border-radius: 4rem; + outline: none !important; + font-weight: 500; + margin: .125rem .625rem; + + @media (max-width: 600px) { + margin: .25rem .375rem; + } + + &.weekday { + margin-bottom: 0; + height: 1rem; + } + + &.clickable { + cursor: pointer; + + &:hover { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + } + + &.selected { + background-color: var(--color-primary); + color: white; + } + } + + &.disabled { + opacity: 0.25; + pointer-events: none; + } + + &::before { + content: ""; + display: block; + padding-top: 100%; + } + + span { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.875rem; + } + } + + .calendar-wrapper { + display: flex; + align-items: center; + justify-content: center; + min-height: 17rem; + margin: 1.5rem -0.5rem 0.5rem; + } + + .calendar-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + width: 100%; + } +} diff --git a/src/components/common/CalendarModal.tsx b/src/components/common/CalendarModal.tsx new file mode 100644 index 000000000..7c6c28258 --- /dev/null +++ b/src/components/common/CalendarModal.tsx @@ -0,0 +1,302 @@ +import React, { + FC, memo, useState, useEffect, useMemo, useCallback, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; +import { + formatMonthAndYear, formatHumanDate, formatTime, +} from '../../util/dateFormat'; +import { IS_MOBILE_SCREEN } from '../../util/environment'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +import './CalendarModal.scss'; + +export type OwnProps = { + selectedAt?: number; + maxAt?: number; + isFutureMode?: boolean; + isPastMode?: boolean; + isOpen: boolean; + withTimePicker?: boolean; + submitButtonLabel?: string; + secondButtonLabel?: string; + onClose: () => void; + onSubmit: (date: Date) => void; + onSecondButtonClick?: NoneToVoidFunction; +}; + +const WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; + +const CalendarModal: FC = ({ + selectedAt, + maxAt, + isFutureMode, + isPastMode, + isOpen, + withTimePicker, + submitButtonLabel, + secondButtonLabel, + onClose, + onSubmit, + onSecondButtonClick, +}) => { + const now = new Date(); + const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]); + const maxDate = maxAt ? new Date(maxAt) : undefined; + + const [selectedDate, setSelectedDate] = useState(defaultSelectedDate); + const [selectedHours, setSelectedHours] = useState( + formatInputTime(defaultSelectedDate.getHours()), + ); + const [selectedMinutes, setSelectedMinutes] = useState( + formatInputTime(defaultSelectedDate.getMinutes()), + ); + + const currentYear = selectedDate.getFullYear(); + const currentMonth = selectedDate.getMonth(); + const currentDate = selectedDate.getDate(); + + useEffect(() => { + if (isOpen) { + setSelectedDate(defaultSelectedDate); + } + }, [isOpen, defaultSelectedDate]); + + const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth()) + || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth()); + const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth(); + + const calendarGrid = useMemo(() => ( + buildCalendarGrid(currentYear, currentMonth) + ), [currentMonth, currentYear]); + + function handlePrevMonth() { + setSelectedDate((d) => { + const dateCopy = new Date(d); + dateCopy.setMonth(dateCopy.getMonth() - 1); + + return dateCopy; + }); + } + + function handleNextMonth() { + setSelectedDate((d) => { + const dateCopy = new Date(d); + dateCopy.setMonth(dateCopy.getMonth() + 1); + + return dateCopy; + }); + } + + function handleDateSelect(date: number) { + setSelectedDate((d) => { + const dateCopy = new Date(d); + dateCopy.setDate(date); + + return dateCopy; + }); + } + + function handleSubmit() { + onSubmit(selectedDate); + } + + const handleChangeHours = useCallback((e: React.ChangeEvent) => { + const value = e.target.value.replace(/[^\d]+/g, ''); + if (!value.length) { + setSelectedHours(''); + e.target.value = ''; + return; + } + + const hours = Math.max(0, Math.min(Number(value), 23)); + + const date = new Date(selectedDate.getTime()); + date.setHours(hours); + setSelectedDate(date); + + const hoursStr = formatInputTime(hours); + setSelectedHours(hoursStr); + e.target.value = hoursStr; + }, [selectedDate]); + + const handleChangeMinutes = useCallback((e: React.ChangeEvent) => { + const value = e.target.value.replace(/[^\d]+/g, ''); + if (!value.length) { + setSelectedMinutes(''); + e.target.value = ''; + return; + } + + const minutes = Math.max(0, Math.min(Number(value), 59)); + + const date = new Date(selectedDate.getTime()); + date.setMinutes(minutes); + setSelectedDate(date); + + const minutesStr = formatInputTime(minutes); + setSelectedMinutes(minutesStr); + e.target.value = minutesStr; + }, [selectedDate]); + + function renderTimePicker() { + return ( +
    + + : + +
    + ); + } + + return ( + +
    +
    + + +

    + {formatMonthAndYear(selectedDate, IS_MOBILE_SCREEN)} +

    + + + + +
    +
    + +
    +
    + {WEEKDAY_LETTERS.map((letter) => ( +
    + {letter} +
    + ))} + {calendarGrid.map((gridDate) => ( +
    handleDateSelect(gridDate)} + className={buildClassName( + 'day-button', + isDisabledDay( + currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate, + ) + ? 'disabled' + : `${gridDate ? 'clickable' : ''}`, + gridDate === currentDate && 'selected', + )} + > + {!!gridDate && ( + {gridDate} + )} +
    + ))} +
    +
    + + {withTimePicker && renderTimePicker()} + +
    + + {secondButtonLabel && ( + + )} +
    +
    + ); +}; + +function buildCalendarGrid(year: number, month: number) { + const grid: number[] = []; + + const date = new Date(); + date.setFullYear(year); + date.setMonth(month); + date.setDate(1); + + const monthStartDay = date.getDay(); + // Fill empty cells + for (let i = 1; i < monthStartDay; i++) { + grid.push(0); + } + + while (date.getMonth() === month) { + const gridDate = date.getDate(); + grid.push(gridDate); + date.setDate(gridDate + 1); + } + + return grid; +} + +function isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) { + const selectedDay = new Date(year, month, day, 0, 0, 0, 0); + const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0); + const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0); + + if (fixedMaxDate && selectedDay > fixedMaxDate) { + return true; + } else if (fixedMinDate && selectedDay < fixedMinDate) { + return true; + } + + return false; +} + +function formatInputTime(value: string | number) { + return String(value).padStart(2, '0'); +} + +function formatSubmitLabel(date: Date) { + const day = formatHumanDate(date, true); + + return `Send ${day === 'Today' ? day : `on ${day}`} at ${formatTime(date)}`; +} + +export default memo(CalendarModal); diff --git a/src/components/common/ChatLink.tsx b/src/components/common/ChatLink.tsx new file mode 100644 index 000000000..06f8afab3 --- /dev/null +++ b/src/components/common/ChatLink.tsx @@ -0,0 +1,40 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; + +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; + +import Link from '../ui/Link'; + +type OwnProps = { + className?: string; + chatId?: number; + children: any; +}; + +type DispatchProps = Pick; + +const ChatLink: FC = ({ + className, chatId, openChat, children, +}) => { + const handleClick = useCallback(() => { + if (chatId) { + openChat({ id: chatId }); + } + }, [chatId, openChat]); + + if (!chatId) { + return children; + } + + return ( + {children} + ); +}; + +export default withGlobal( + undefined, + (setGlobal, actions): DispatchProps => pick(actions, ['openChat']), +)(ChatLink); diff --git a/src/components/common/DeleteChatModal.scss b/src/components/common/DeleteChatModal.scss new file mode 100644 index 000000000..1fbdf91c0 --- /dev/null +++ b/src/components/common/DeleteChatModal.scss @@ -0,0 +1,21 @@ +.DeleteChatModal { + .modal-dialog { + max-width: 20rem; + } + + .modal-header { + padding: 1.125rem 1.25rem 0; + } + + .modal-title:not(:only-child) { + margin: 0 0 0 .75rem; + } + + .modal-content { + padding: .5rem 1.25rem; + } + + .confirm-dialog-button { + margin-right: -.625rem; + } +} diff --git a/src/components/common/DeleteChatModal.tsx b/src/components/common/DeleteChatModal.tsx new file mode 100644 index 000000000..b66bc04b8 --- /dev/null +++ b/src/components/common/DeleteChatModal.tsx @@ -0,0 +1,192 @@ +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiChat } from '../../api/types'; +import { GlobalActions } from '../../global/types'; + +import { selectIsChatWithSelf, selectUser } from '../../modules/selectors'; +import { + isChatPrivate, + getUserFirstName, + getPrivateChatUserId, + isChatBasicGroup, + isChatSuperGroup, + isChatChannel, + getChatTitle, +} from '../../modules/helpers'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Avatar from './Avatar'; +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +import './DeleteChatModal.scss'; + +export type OwnProps = { + isOpen: boolean; + chat: ApiChat; + onClose: () => void; +}; + +type StateProps = { + isChannel: boolean; + isChatWithSelf?: boolean; + isPrivateChat: boolean; + isBasicGroup: boolean; + isSuperGroup: boolean; + canDeleteForAll?: boolean; + chatTitle: string; + contactFirstName?: string; +}; + +type DispatchProps = Pick; + +const DeleteChatModal: FC = ({ + isOpen, + chat, + isChannel, + isPrivateChat, + isChatWithSelf, + isBasicGroup, + isSuperGroup, + canDeleteForAll, + chatTitle, + contactFirstName, + onClose, + leaveChannel, + deleteHistory, + deleteChannel, +}) => { + const handleDeleteMessageForAll = useCallback(() => { + deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: true }); + onClose(); + }, [deleteHistory, chat.id, chat.lastMessage, onClose]); + + const handleDeleteChat = useCallback(() => { + if (isPrivateChat || isBasicGroup) { + deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false }); + } else if ((isChannel || isSuperGroup) && !chat.isCreator) { + leaveChannel({ chatId: chat.id }); + } else if ((isChannel || isSuperGroup) && chat.isCreator) { + deleteChannel({ chatId: chat.id }); + } + onClose(); + }, [ + isPrivateChat, + isBasicGroup, + isChannel, + isSuperGroup, + chat.isCreator, + chat.lastMessage, + chat.id, + onClose, + deleteHistory, + leaveChannel, + deleteChannel, + ]); + + const lang = useLang(); + + function renderHeader() { + return ( +
    + +

    {renderTitle()}

    +
    + ); + } + + function renderTitle() { + if (isChannel && !chat.isCreator) { + return 'Leave Channel?'; + } + + if (isChannel && chat.isCreator) { + return 'Delete and Leave Channel?'; + } + + if (isBasicGroup || isSuperGroup) { + return 'Leave Group?'; + } + + return 'Delete Chat?'; + } + + function renderMessage() { + if (isChannel && !chat.isCreator) { + return

    Are you sure you want to leave channel {chatTitle}?

    ; + } + if (isChannel && chat.isCreator) { + return

    Are you sure you want to delete and leave channel {chatTitle}?

    ; + } + + if (isBasicGroup || isSuperGroup) { + return

    Are you sure you want to leave group {chatTitle}?

    ; + } + + return

    Are you sure you want to delete chat with {contactFirstName}?

    ; + } + + function renderActionText() { + if (isChannel && !chat.isCreator) { + return 'Leave Channel'; + } + if (isChannel && chat.isCreator) { + return 'Delete and Leave Channel'; + } + + if (isBasicGroup || isSuperGroup) { + return 'Leave Group'; + } + + return `Delete${canDeleteForAll ? ' just for me' : ''}`; + } + + return ( + + {renderMessage()} + {canDeleteForAll && ( + + )} + + + + ); +}; + +export default memo(withGlobal( + (global, { chat }): StateProps => { + const isPrivateChat = isChatPrivate(chat.id); + const isChatWithSelf = selectIsChatWithSelf(global, chat.id); + const canDeleteForAll = (isPrivateChat && !isChatWithSelf); + const contactFirstName = chat && isChatPrivate(chat.id) + ? getUserFirstName(selectUser(global, getPrivateChatUserId(chat)!)) + : undefined; + + return { + isPrivateChat, + isChatWithSelf, + isChannel: isChatChannel(chat), + isBasicGroup: isChatBasicGroup(chat), + isSuperGroup: isChatSuperGroup(chat), + canDeleteForAll, + chatTitle: getChatTitle(chat), + contactFirstName, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['leaveChannel', 'deleteHistory', 'deleteChannel']), +)(DeleteChatModal)); diff --git a/src/components/common/DeleteMessageModal.async.tsx b/src/components/common/DeleteMessageModal.async.tsx new file mode 100644 index 000000000..233a704fe --- /dev/null +++ b/src/components/common/DeleteMessageModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './DeleteMessageModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const DeleteMessageModalAsync: FC = (props) => { + const { isOpen } = props; + const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return DeleteMessageModal ? : undefined; +}; + +export default DeleteMessageModalAsync; diff --git a/src/components/common/DeleteMessageModal.tsx b/src/components/common/DeleteMessageModal.tsx new file mode 100644 index 000000000..a1f7a2a2d --- /dev/null +++ b/src/components/common/DeleteMessageModal.tsx @@ -0,0 +1,135 @@ +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiMessage } from '../../api/types'; +import { IAlbum } from '../../types'; + +import { GlobalActions } from '../../global/types'; + +import { + selectAllowedMessageActions, + selectChat, + selectCurrentMessageList, + selectUser, +} from '../../modules/selectors'; +import { + isChatPrivate, + getUserFirstName, + getPrivateChatUserId, + isChatBasicGroup, + isChatSuperGroup, +} from '../../modules/helpers'; +import renderText from './helpers/renderText'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +export type OwnProps = { + isOpen: boolean; + isSchedule: boolean; + message: ApiMessage; + album?: IAlbum; + onClose: () => void; +}; + +type StateProps = { + canDeleteForAll?: boolean; + contactFirstName?: string; + willDeleteForCurrentUserOnly?: boolean; + willDeleteForAll?: boolean; +}; + +type DispatchProps = Pick; + +const DeleteMessageModal: FC = ({ + isOpen, + isSchedule, + message, + album, + canDeleteForAll, + contactFirstName, + willDeleteForCurrentUserOnly, + willDeleteForAll, + onClose, + deleteMessages, + deleteScheduledMessages, +}) => { + const handleDeleteMessageForAll = useCallback(() => { + const messageIds = album && album.messages + ? album.messages.map(({ id }) => id) + : [message.id]; + deleteMessages({ messageIds, shouldDeleteForAll: true }); + onClose(); + }, [deleteMessages, message.id, onClose, album]); + + const handleDeleteMessageForSelf = useCallback(() => { + const messageIds = album && album.messages + ? album.messages.map(({ id }) => id) + : [message.id]; + if (isSchedule) { + deleteScheduledMessages({ messageIds }); + } else { + deleteMessages({ + messageIds, + shouldDeleteForAll: false, + }); + } + onClose(); + }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]); + + const lang = useLang(); + + return ( + +

    {lang('AreYouSureDeleteSingleMessage')}

    + {willDeleteForCurrentUserOnly && ( +

    This will delete it just for you, not for other participants in the chat.

    + )} + {willDeleteForAll && ( +

    This will delete it for everyone in this chat.

    + )} + {canDeleteForAll && ( + + )} + + +
    + ); +}; + +export default memo(withGlobal( + (global, { message, isSchedule }): StateProps => { + const { threadId } = selectCurrentMessageList(global) || {}; + const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {}; + const chat = selectChat(global, message.chatId); + const contactFirstName = chat && isChatPrivate(chat.id) + ? getUserFirstName(selectUser(global, getPrivateChatUserId(chat)!)) + : undefined; + + const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll; + const willDeleteForAll = chat && isChatSuperGroup(chat); + + return { + canDeleteForAll: !isSchedule && canDeleteForAll, + contactFirstName, + willDeleteForCurrentUserOnly, + willDeleteForAll, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'deleteMessages', 'deleteScheduledMessages', + ]), +)(DeleteMessageModal)); diff --git a/src/components/common/Document.tsx b/src/components/common/Document.tsx new file mode 100644 index 000000000..5f72f83ec --- /dev/null +++ b/src/components/common/Document.tsx @@ -0,0 +1,111 @@ +import React, { + FC, useCallback, useEffect, useState, memo, useRef, +} from '../../lib/teact/teact'; + +import { ApiMessage } from '../../api/types'; + +import { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo'; +import { getMediaTransferState, getMessageMediaHash, getMessageMediaThumbDataUri } from '../../modules/helpers'; +import { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver'; +import useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress'; +import useMedia from '../../hooks/useMedia'; +import download from '../../util/download'; + +import File from './File'; + +type OwnProps = { + message: ApiMessage; + observeIntersection?: ObserveFn; + smaller?: boolean; + isSelected?: boolean; + isSelectable?: boolean; + uploadProgress?: number; + withDate?: boolean; + datetime?: number; + className?: string; + sender?: string; + onCancelUpload?: () => void; + onDateClick?: (messageId: number, chatId: number) => void; +}; + +const Document: FC = ({ + message, + observeIntersection, + smaller, + uploadProgress, + withDate, + datetime, + className, + sender, + isSelected, + isSelectable, + onCancelUpload, + onDateClick, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const document = message.content.document!; + const extension = getDocumentExtension(document) || ''; + const { fileName, size, timestamp } = document; + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const [isDownloadAllowed, setIsDownloadAllowed] = useState(false); + const { + mediaData, downloadProgress, + } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed); + const { + isUploading, isTransferring, transferProgress, + } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed); + + const hasPreview = getDocumentHasPreview(document); + const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined; + const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined; + const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting); + + const handleClick = useCallback(() => { + if (isUploading) { + if (onCancelUpload) { + onCancelUpload(); + } + } else { + setIsDownloadAllowed((isAllowed) => !isAllowed); + } + }, [isUploading, onCancelUpload]); + + const handleDateClick = useCallback(() => { + onDateClick!(message.id, message.chatId); + }, [onDateClick, message.id, message.chatId]); + + useEffect(() => { + if (isDownloadAllowed && mediaData) { + download(mediaData, fileName); + setIsDownloadAllowed(false); + } + }, [fileName, mediaData, isDownloadAllowed]); + + return ( + + ); +}; + +export default memo(Document); diff --git a/src/components/common/EmbeddedMessage.scss b/src/components/common/EmbeddedMessage.scss new file mode 100644 index 000000000..256ce04a0 --- /dev/null +++ b/src/components/common/EmbeddedMessage.scss @@ -0,0 +1,129 @@ +.EmbeddedMessage { + display: flex; + align-items: center; + font-size: 0.875rem; + line-height: 1.125rem; + margin: 0 -0.25rem .0625rem; + padding: .1875rem 0.25rem .1875rem .4375rem; + border-radius: var(--border-radius-messages-small); + position: relative; + overflow: hidden; + cursor: pointer; + + body.animation-level-1 & { + .ripple-container { + display: none; + } + } + + .custom-shape & { + max-width: 15rem; + padding: 0.5rem; + margin: 0; + background-color: var(--background-color); + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + + &::before { + left: .625rem; + top: .625rem; + bottom: .625rem; + } + + img:not(.emoji) { + margin-left: .5rem; + } + } + + &::before { + content: ''; + display: block; + position: absolute; + top: .3125rem; + bottom: .3125rem; + left: .3125rem; + width: 2px; + background: var(--accent-color); + border-radius: 2px; + } + + &:hover { + background-color: var(--hover-color); + } + + &:active { + background-color: var(--active-color); + } + + .message-text { + overflow: hidden; + margin-left: 0.5rem; + + .message-title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 0.125rem; + } + + p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 1.125rem; + margin-bottom: 0; + + &::after { + content: none; + display: none; + } + } + + .emoji { + width: 1.125rem !important; + height: 1.125rem !important; + vertical-align: -4px !important; + } + } + + .embedded-action-message { + color: var(--accent-color); + opacity: 0.75; + } + + img:not(.emoji) { + width: 2rem; + height: 2rem; + object-fit: cover; + border-radius: .25rem; + margin-left: .25rem; + flex-shrink: 0; + } + + &.inside-input { + padding-left: 0.5625rem; + margin: 0 0 -.125rem -0.1875rem; + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: 1fr; + width: 100%; + --accent-color: var(--color-primary); + --hover-color: rgba(var(--color-text-secondary-rgb), 0.08); + + &::before { + bottom: .3125rem; + } + + img:not(.emoji) { + margin-left: .125rem; + } + + .message-text { + margin-left: .375rem; + } + + .message-title { + font-weight: 500; + color: var(--accent-color); + } + } +} diff --git a/src/components/common/EmbeddedMessage.tsx b/src/components/common/EmbeddedMessage.tsx new file mode 100644 index 000000000..fc883ca99 --- /dev/null +++ b/src/components/common/EmbeddedMessage.tsx @@ -0,0 +1,91 @@ +import React, { FC, useRef } from '../../lib/teact/teact'; + +import { ApiUser, ApiMessage, ApiChat } from '../../api/types'; + +import { + getMessageMediaHash, + isActionMessage, + getMessageSummaryText, + getSenderTitle, +} from '../../modules/helpers'; +import renderText from './helpers/renderText'; +import { getPictogramDimensions } from './helpers/mediaDimensions'; +import buildClassName from '../../util/buildClassName'; +import { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver'; +import useMedia from '../../hooks/useMedia'; +import useWebpThumbnail from '../../hooks/useWebpThumbnail'; +import useLang from '../../hooks/useLang'; + +import ActionMessage from '../middle/ActionMessage'; + +import './EmbeddedMessage.scss'; + +type OwnProps = { + observeIntersection?: ObserveFn; + className?: string; + message?: ApiMessage; + sender?: ApiUser | ApiChat; + title?: string; + customText?: string; + onClick: NoneToVoidFunction; +}; + +const NBSP = '\u00A0'; + +const EmbeddedMessage: FC = ({ + className, + message, + sender, + title, + customText, + observeIntersection, + onClick, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting); + const pictogramId = message && `sticker-reply-thumb${message.id}`; + const mediaThumbnail = useWebpThumbnail(message); + + useLang(); + + const senderTitle = sender && getSenderTitle(sender); + + return ( +
    + {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl)} +
    +
    {renderText(senderTitle || title || NBSP)}
    +

    + {!message ? ( + customText || NBSP + ) : isActionMessage(message) ? ( + + ) : ( + renderText(getMessageSummaryText(message, Boolean(mediaThumbnail))) + )} +

    +
    +
    + ); +}; + +function renderPictogram( + id: string | undefined, + thumbDataUri: string, + blobUrl?: string, +) { + const { width, height } = getPictogramDimensions(); + + return ( + + ); +} + +export default EmbeddedMessage; diff --git a/src/components/common/File.scss b/src/components/common/File.scss new file mode 100644 index 000000000..01bad572e --- /dev/null +++ b/src/components/common/File.scss @@ -0,0 +1,208 @@ +.File { + --secondary-color: var(--color-text-secondary); + + .Message.own & { + --secondary-color: var(--color-text-green); + } + + .content-inner & { + min-width: 14rem; + } + + display: flex; + align-items: center; + + .file-icon-container { + position: relative; + } + + .file-progress, + .file-icon, + .file-preview { + width: 3.375rem; + height: 3.375rem; + margin-right: .75rem; + border-radius: var(--border-radius-messages-small); + background: var(--color-primary); + display: flex; + align-items: center; + justify-content: center; + } + + .file-progress { + position: absolute; + top: 0; + left: 0; + } + + .file-icon { + padding: 1rem .75rem .5rem; + align-items: flex-end; + flex-shrink: 0; + position: relative; + color: white; + + .file-ext { + font-size: 1rem; + font-weight: 500; + transition: opacity .15s; + } + + &::after { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + border-bottom-left-radius: 0.25rem; + background: rgba(black, 0.25); + border-color: transparent var(--background-color) transparent var(--background-color); + border-width: 0 1.125rem 1.125rem 0; + border-style: solid; + transition: border-width .15s ease-in; + } + } + + .file-preview { + background: transparent; + overflow: hidden; + + & + .icon-download, + & + .file-progress { + background: rgba(black, 0.5); + border-radius: var(--border-radius-messages-small); + } + + img { + object-fit: cover; + } + } + + .icon-download { + color: #fff; + font-size: 1.5rem; + position: absolute; + top: 0; + left: 0; + width: 3.375rem; + height: 3.375rem; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity .25s; + } + + &.interactive .file-icon-container { + cursor: pointer; + + &:hover { + .file-icon::after { + border-width: 0; + } + + .icon-download { + opacity: 1; + + &.hidden { + opacity: 0; + } + } + + .file-ext { + opacity: 0; + } + } + } + + .file-info { + margin-top: .1875rem; + margin-right: .125rem; + white-space: nowrap; + overflow: hidden; + flex-grow: 1; + + & + .Link { + font-size: .75rem; + color: var(--color-text-secondary); + padding-left: 1rem; + white-space: nowrap; + } + } + + .file-title { + font-size: 1rem; + line-height: 1.5rem; + font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + + .emoji { + vertical-align: -4px; + } + } + + .file-subtitle { + font-size: .875rem; + line-height: .9375rem; + color: var(--secondary-color); + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + + span + span { + &::before { + content: '\00a0\2022\00a0'; + } + } + } + + &.smaller { + --background-color: #fff; + --border-radius-messages-small: .3125rem; + + .icon-download, + .file-progress, + .file-icon, + .file-preview { + width: 3rem; + height: 3rem; + } + + .file-icon { + padding-bottom: .375rem; + + &::after { + border-width: 0 1rem 1rem 0; + } + } + + .file-info { + margin-top: -.125rem; + } + + .file-title { + font-weight: 400; + } + + .file-subtitle { + line-height: 1rem; + } + } +} + +// Document extension colors +.File .file-progress, +.File .file-icon { + &.red { + background-color: var(--color-error); + } + + &.orange { + background-color: var(--color-warning); + } + + &.green { + background-color: var(--color-text-green); + } +} diff --git a/src/components/common/File.tsx b/src/components/common/File.tsx new file mode 100644 index 000000000..a12016396 --- /dev/null +++ b/src/components/common/File.tsx @@ -0,0 +1,151 @@ +import { RefObject } from 'react'; +import React, { FC, memo, useRef } from '../../lib/teact/teact'; + +import useShowTransition from '../../hooks/useShowTransition'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; +import buildClassName from '../../util/buildClassName'; +import { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat'; +import { getColorFromExtension, getFileSizeString } from './helpers/documentInfo'; +import { getDocumentThumbnailDimensions } from './helpers/mediaDimensions'; +import renderText from './helpers/renderText'; + +import ProgressSpinner from '../ui/ProgressSpinner'; +import Link from '../ui/Link'; + +import './File.scss'; + +type OwnProps = { + ref?: RefObject; + name: string; + extension?: string; + size: number; + timestamp?: number; + sender?: string; + thumbnailDataUri?: string; + previewData?: string; + className?: string; + smaller?: boolean; + isTransferring?: boolean; + isUploading?: boolean; + isSelectable?: boolean; + isSelected?: boolean; + transferProgress?: number; + onClick?: () => void; + onDateClick?: (e: React.MouseEvent) => void; +}; + +const File: FC = ({ + ref, + name, + size, + extension = '', + timestamp, + sender, + thumbnailDataUri, + previewData, + className, + smaller, + isTransferring, + isUploading, + isSelectable, + isSelected, + transferProgress, + onClick, + onDateClick, +}) => { + // eslint-disable-next-line no-null/no-null + let elementRef = useRef(null); + if (ref) { + elementRef = ref; + } + + const { + shouldRender: shouldSpinnerRender, + transitionClassNames: spinnerClassNames, + } = useShowTransition(isTransferring, undefined, true); + const color = getColorFromExtension(extension); + const sizeString = getFileSizeString(size); + + const { + shouldRenderThumb, shouldRenderFullMedia, transitionClassNames, + } = useTransitionForMedia(previewData, 'slow'); + const { width, height } = getDocumentThumbnailDimensions(smaller); + + const fullClassName = buildClassName( + 'File', + className, + smaller && 'smaller', + onClick && !isUploading && 'interactive', + isSelected && 'file-is-selected', + ); + + return ( +
    + {isSelectable && ( +
    + {isSelected && } +
    + )} +
    + {thumbnailDataUri || previewData ? ( +
    + {shouldRenderThumb && ( + + )} + {shouldRenderFullMedia && ( + + )} +
    + ) : ( +
    + {extension.length <= 4 && ( + {extension} + )} +
    + )} + {shouldSpinnerRender && ( +
    + +
    + )} + {onClick && } +
    +
    +
    {renderText(name)}
    +
    + + {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString} + + {sender && {renderText(sender)}} + {!sender && timestamp && ( + <> + {' '} + {formatMediaDateTime(timestamp * 1000)} + + )} +
    +
    + {sender && timestamp && ( + {formatPastTimeShort(timestamp * 1000)} + )} +
    + ); +}; + +export default memo(File); diff --git a/src/components/common/GifButton.scss b/src/components/common/GifButton.scss new file mode 100644 index 000000000..d0575d49b --- /dev/null +++ b/src/components/common/GifButton.scss @@ -0,0 +1,43 @@ +.GifButton { + display: flex; + align-items: center; + justify-content: center; + height: 6.25rem; + background-color: transparent; + cursor: pointer; + overflow: hidden; + position: relative; + + &:last-child { + margin-bottom: 1rem; + } + + &.vertical { + grid-column-end: span 1; + } + + &.horizontal { + grid-column-end: span 2; + } + + .preview { + background-size: cover !important; + background: transparent no-repeat center; + } + + .preview, video { + width: 100%; + height: 100%; + object-fit: cover; + } + + &:not(.shown) { + display: block !important; + visibility: hidden; + } + + .Spinner { + position: absolute; + pointer-events: none; + } +} diff --git a/src/components/common/GifButton.tsx b/src/components/common/GifButton.tsx new file mode 100644 index 000000000..a86c58b93 --- /dev/null +++ b/src/components/common/GifButton.tsx @@ -0,0 +1,98 @@ +import React, { + FC, memo, useCallback, useRef, +} from '../../lib/teact/teact'; + +import { ApiMediaFormat, ApiVideo } from '../../api/types'; + +import buildClassName from '../../util/buildClassName'; +import { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver'; +import useMedia from '../../hooks/useMedia'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; +import useBlur from '../../hooks/useBlur'; +import useVideoCleanup from '../../hooks/useVideoCleanup'; +import useBuffering from '../../hooks/useBuffering'; + +import Spinner from '../ui/Spinner'; + +import './GifButton.scss'; + +type OwnProps = { + gif: ApiVideo; + observeIntersection: ObserveFn; + isDisabled?: boolean; + onClick: (gif: ApiVideo) => void; +}; + +const GifButton: FC = ({ + gif, observeIntersection, isDisabled, onClick, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + // eslint-disable-next-line no-null/no-null + const videoRef = useRef(null); + + const localMediaHash = `gif${gif.id}`; + const isIntersecting = useIsIntersecting(ref, observeIntersection); + const loadAndPlay = isIntersecting && !isDisabled; + const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl); + const thumbDataUri = useBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl)); + const previewData = previewBlobUrl || thumbDataUri; + const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl); + const shouldRenderVideo = Boolean(loadAndPlay && videoData); + const { transitionClassNames } = useTransitionForMedia(previewData || videoData, 'slow'); + const { isBuffered, bufferingHandlers } = useBuffering(true); + const shouldRenderSpinner = loadAndPlay && !isBuffered; + + useVideoCleanup(videoRef, [shouldRenderVideo]); + + const handleClick = useCallback( + () => onClick({ + ...gif, + blobUrl: videoData, + }), + [onClick, gif, videoData], + ); + + const className = buildClassName( + 'GifButton', + gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal', + transitionClassNames, + localMediaHash, + ); + + return ( +
    + {previewData && !shouldRenderVideo && ( +
    + )} + {shouldRenderVideo && ( + + )} + {shouldRenderSpinner && ( + + )} +
    + ); +}; + +export default memo(GifButton); diff --git a/src/components/common/GroupChatInfo.tsx b/src/components/common/GroupChatInfo.tsx new file mode 100644 index 000000000..c0b243731 --- /dev/null +++ b/src/components/common/GroupChatInfo.tsx @@ -0,0 +1,171 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { + FC, useEffect, useCallback, memo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiChat, ApiTypingStatus } from '../../api/types'; +import { GlobalActions, GlobalState } from '../../global/types'; +import { MediaViewerOrigin } from '../../types'; + +import { + getChatTypeString, + getChatTitle, + isChatSuperGroup, +} from '../../modules/helpers'; +import { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors'; +import renderText from './helpers/renderText'; +import { pick } from '../../util/iteratees'; +import useLang, { LangFn } from '../../hooks/useLang'; + +import Avatar from './Avatar'; +import VerifiedIcon from './VerifiedIcon'; +import TypingStatus from './TypingStatus'; + +type OwnProps = { + chatId: number; + typingStatus?: ApiTypingStatus; + avatarSize?: 'small' | 'medium' | 'large' | 'jumbo'; + withMediaViewer?: boolean; + withHandle?: boolean; + withFullInfo?: boolean; + withUpdatingStatus?: boolean; + withChatType?: boolean; +}; + +type StateProps = { + chat?: ApiChat; + onlineCount?: number; + areMessagesLoaded: boolean; +} & Pick; + +type DispatchProps = Pick; + +const GroupChatInfo: FC = ({ + typingStatus, + avatarSize = 'medium', + withMediaViewer, + withHandle, + withFullInfo, + withUpdatingStatus, + withChatType, + chat, + onlineCount, + areMessagesLoaded, + lastSyncTime, + loadFullChat, + loadSuperGroupOnlines, + openMediaViewer, +}) => { + const isSuperGroup = chat && isChatSuperGroup(chat); + const { id: chatId, isMin, isRestricted } = chat || {}; + + useEffect(() => { + if (chatId && !isMin && withFullInfo && lastSyncTime) { + loadFullChat({ chatId }); + + if (isSuperGroup) { + loadSuperGroupOnlines({ chatId }); + } + } + }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup, loadSuperGroupOnlines]); + + const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => { + if (chat && hasPhoto) { + e.stopPropagation(); + openMediaViewer({ + avatarOwnerId: chat.id, + origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, + }); + } + }, [chat, avatarSize, openMediaViewer]); + + const lang = useLang(); + + if (!chat) { + return undefined; + } + + function renderStatusOrTyping() { + if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) { + return ( + {lang('Updating')} + ); + } + + if (!chat) { + return undefined; + } + + if (typingStatus) { + return ; + } + + if (withChatType) { + return ( +
    {lang(getChatTypeString(chat))}
    + ); + } + + const handle = withHandle ? chat.username : undefined; + const groupStatus = getGroupStatus(chat, lang); + const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined; + + return ( +
    + {handle && {handle}} + {groupStatus} + {onlineStatus && {onlineStatus}} +
    + ); + } + + return ( +
    + +
    +
    +

    {renderText(getChatTitle(chat))}

    + {chat.isVerified && } +
    + {renderStatusOrTyping()} +
    +
    + ); +}; + +function getGroupStatus(chat: ApiChat, lang: LangFn) { + const chatTypeString = lang(getChatTypeString(chat)); + const { membersCount } = chat; + + if (chat.isRestricted) { + return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible'; + } + + if (!membersCount) { + return chatTypeString; + } + + return chatTypeString === 'Channel' + ? lang('Subscribers', membersCount, 'i') + : lang('Members', membersCount, 'i'); +} + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const { lastSyncTime } = global; + const chat = selectChat(global, chatId); + const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined; + const areMessagesLoaded = Boolean(selectChatMessages(global, chatId)); + + return { + lastSyncTime, chat, onlineCount, areMessagesLoaded, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'loadSuperGroupOnlines', 'openMediaViewer']), +)(GroupChatInfo)); diff --git a/src/components/common/LastMessageMeta.scss b/src/components/common/LastMessageMeta.scss new file mode 100644 index 000000000..83b045f01 --- /dev/null +++ b/src/components/common/LastMessageMeta.scss @@ -0,0 +1,20 @@ +.LastMessageMeta { + margin-right: .2rem; + padding: .3rem 0 .15rem; + flex-shrink: 0; + font-size: 0.75rem; + line-height: 1; + display: flex; + align-items: center; + + .MessageOutgoingStatus { + color: var(--color-text-green); + margin-right: 0.1rem; + font-size: 1.15rem; + } + + .time { + color: var(--color-text-meta); + line-height: 1.15rem; + } +} diff --git a/src/components/common/LastMessageMeta.tsx b/src/components/common/LastMessageMeta.tsx new file mode 100644 index 000000000..6a4e02e69 --- /dev/null +++ b/src/components/common/LastMessageMeta.tsx @@ -0,0 +1,24 @@ +import React, { FC } from '../../lib/teact/teact'; + +import { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types'; +import { formatPastTimeShort } from '../../util/dateFormat'; +import MessageOutgoingStatus from './MessageOutgoingStatus'; +import './LastMessageMeta.scss'; + +type OwnProps = { + message: ApiMessage; + outgoingStatus?: ApiMessageOutgoingStatus; +}; + +const LastMessageMeta: FC = ({ message, outgoingStatus }) => { + return ( +
    + {outgoingStatus && ( + + )} + {formatPastTimeShort(message.date * 1000)} +
    + ); +}; + +export default LastMessageMeta; diff --git a/src/components/common/Media.scss b/src/components/common/Media.scss new file mode 100644 index 000000000..6206fd6c3 --- /dev/null +++ b/src/components/common/Media.scss @@ -0,0 +1,28 @@ +.Media { + height: 0; + padding-bottom: 100%; + overflow: hidden; + position: relative; + cursor: pointer; + + .video-duration { + position: absolute; + left: .25rem; + top: .25rem; + background: rgba(0, 0, 0, .25); + color: #fff; + font-size: .75rem; + padding: 0 .3125rem; + border-radius: .1875rem; + line-height: 1.125rem; + } + + img { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + object-fit: cover; + } +} diff --git a/src/components/common/Media.tsx b/src/components/common/Media.tsx new file mode 100644 index 000000000..20f56289d --- /dev/null +++ b/src/components/common/Media.tsx @@ -0,0 +1,48 @@ +import React, { FC, memo, useCallback } from '../../lib/teact/teact'; + +import { ApiMessage } from '../../api/types'; + +import { formatMediaDuration } from '../../util/dateFormat'; +import { + getMessageMediaHash, + getMessageMediaThumbDataUri, + getMessageVideo, +} from '../../modules/helpers'; +import useMedia from '../../hooks/useMedia'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; + +import './Media.scss'; + +type OwnProps = { + message: ApiMessage; + idPrefix?: string; + onClick?: (messageId: number, chatId: number) => void; +}; + +const Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => { + const handleClick = useCallback(() => { + onClick!(message.id, message.chatId); + }, [message.id, message.chatId, onClick]); + + const thumbDataUri = getMessageMediaThumbDataUri(message); + const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram')); + const { + shouldRenderThumb, shouldRenderFullMedia, transitionClassNames, + } = useTransitionForMedia(mediaBlobUrl, 'slow'); + + const video = getMessageVideo(message); + + return ( +
    + {shouldRenderThumb && ( + + )} + {shouldRenderFullMedia && ( + + )} + {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}} +
    + ); +}; + +export default memo(Media); diff --git a/src/components/common/MessageLink.tsx b/src/components/common/MessageLink.tsx new file mode 100644 index 000000000..658a9ff18 --- /dev/null +++ b/src/components/common/MessageLink.tsx @@ -0,0 +1,41 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiMessage } from '../../api/types'; + +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; + +import Link from '../ui/Link'; + +type OwnProps = { + className?: string; + message?: ApiMessage; + children: any; +}; + +type DispatchProps = Pick; + +const MessageLink: FC = ({ + className, message, children, focusMessage, +}) => { + const handleMessageClick = useCallback((): void => { + if (message) { + focusMessage({ chatId: message.chatId, messageId: message.id }); + } + }, [focusMessage, message]); + + if (!message) { + return children; + } + + return ( + {children} + ); +}; + +export default withGlobal( + undefined, + (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']), +)(MessageLink); diff --git a/src/components/common/MessageOutgoingStatus.scss b/src/components/common/MessageOutgoingStatus.scss new file mode 100644 index 000000000..9f5b9e38c --- /dev/null +++ b/src/components/common/MessageOutgoingStatus.scss @@ -0,0 +1,22 @@ +.MessageOutgoingStatus { + position: relative; + width: 1.19rem; + height: 1.19rem; + overflow: hidden; + display: inline-block; + line-height: 1; + font-size: 1.1875rem; + + i { + background: var(--background-color); + } + + .icon-message-succeeded { + padding-left: 0.13rem; + } + + .Transition { + width: 100%; + height: 100%; + } +} diff --git a/src/components/common/MessageOutgoingStatus.tsx b/src/components/common/MessageOutgoingStatus.tsx new file mode 100644 index 000000000..ad183663b --- /dev/null +++ b/src/components/common/MessageOutgoingStatus.tsx @@ -0,0 +1,29 @@ +import React, { FC } from '../../lib/teact/teact'; + +import { ApiMessageOutgoingStatus } from '../../api/types'; + +import Transition from '../ui/Transition'; + +import './MessageOutgoingStatus.scss'; + +type OwnProps = { + status: ApiMessageOutgoingStatus; +}; + +enum Keys { + failed, pending, succeeded, read, +} + +const MessageOutgoingStatus: FC = ({ status }) => { + return ( +
    + + {() => ( + + )} + +
    + ); +}; + +export default MessageOutgoingStatus; diff --git a/src/components/common/NothingFound.scss b/src/components/common/NothingFound.scss new file mode 100644 index 000000000..30e7fcf19 --- /dev/null +++ b/src/components/common/NothingFound.scss @@ -0,0 +1,10 @@ +.NothingFound { + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-meta); + + .AnimatedSticker { + margin: 0 auto; + } +} diff --git a/src/components/common/NothingFound.tsx b/src/components/common/NothingFound.tsx new file mode 100644 index 000000000..9555537d2 --- /dev/null +++ b/src/components/common/NothingFound.tsx @@ -0,0 +1,24 @@ +import React, { FC, memo } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; +import useShowTransition from '../../hooks/useShowTransition'; + +import './NothingFound.scss'; + +interface OwnProps { + text?: string; +} + +const DEFAULT_TEXT = 'Nothing found.'; + +const NothingFound: FC = ({ text = DEFAULT_TEXT }) => { + const { transitionClassNames } = useShowTransition(true); + + return ( +
    + {text} +
    + ); +}; + +export default memo(NothingFound); diff --git a/src/components/common/PasswordForm.tsx b/src/components/common/PasswordForm.tsx new file mode 100644 index 000000000..76a63a0ae --- /dev/null +++ b/src/components/common/PasswordForm.tsx @@ -0,0 +1,114 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, memo, useEffect, useRef, useState, +} from '../../lib/teact/teact'; + +import { MIN_PASSWORD_LENGTH } from '../../config'; +import { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../util/environment'; +import buildClassName from '../../util/buildClassName'; + +import Button from '../ui/Button'; + +type OwnProps = { + submitLabel?: string; + error?: string; + hint?: string; + placeholder?: string; + isLoading?: boolean; + isPasswordVisible?: boolean; + clearError: NoneToVoidFunction; + onChangePasswordVisibility: (state: boolean) => void; + onInputChange?: (password: string) => void; + onSubmit: (password: string) => void; +}; + +const FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400; + +const PasswordForm: FC = ({ + isLoading = false, + isPasswordVisible, + error, + hint, + placeholder = 'Password', + submitLabel = 'Next', + clearError, + onChangePasswordVisibility, + onInputChange, + onSubmit, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [password, setPassword] = useState(''); + const [canSubmit, setCanSubmit] = useState(false); + + useEffect(() => { + if (!IS_TOUCH_ENV) { + setTimeout(() => { + inputRef.current!.focus(); + }, FOCUS_DELAY_TIMEOUT_MS); + } + }, []); + + function onPasswordChange(e: ChangeEvent) { + if (error) { + clearError(); + } + + const { target } = e; + setPassword(target.value); + setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH); + if (onInputChange) { + onInputChange(target.value); + } + } + + function togglePasswordVisibility() { + onChangePasswordVisibility(!isPasswordVisible); + } + + function handleSubmit(event: React.FormEvent) { + event.preventDefault(); + + if (isLoading) { + return; + } + + if (canSubmit) { + onSubmit(password); + } + } + + return ( +
    +
    + + +
    + +
    +
    + {canSubmit && ( + + )} + + ); +}; + +export default memo(PasswordForm); diff --git a/src/components/common/PasswordMonkey.scss b/src/components/common/PasswordMonkey.scss new file mode 100644 index 000000000..48c5dc0c0 --- /dev/null +++ b/src/components/common/PasswordMonkey.scss @@ -0,0 +1,39 @@ +#monkey { + position: relative; + display: block; + margin-left: auto; + margin-right: auto; + width: 7.5rem; + height: 7.5rem; + margin-bottom: 1.75rem; + + @media (min-width: 600px) and (min-height: 450px) { + width: 10rem; + height: 10rem; + margin-bottom: 2.5rem; + } + + &.big { + width: 10rem; + height: 10rem; + } + + .AnimatedSticker { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + + &.hidden { + display: none + } + } + + .monkey-preview { + width: 100%; + height: 100%; + background-size: 100%; + background: url('../../assets/monkey.svg') center; + } +} diff --git a/src/components/common/PasswordMonkey.tsx b/src/components/common/PasswordMonkey.tsx new file mode 100644 index 000000000..8b0730146 --- /dev/null +++ b/src/components/common/PasswordMonkey.tsx @@ -0,0 +1,76 @@ +import React, { + FC, useState, useEffect, useCallback, memo, +} from '../../lib/teact/teact'; + +import { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config'; +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import getAnimationData from './helpers/animatedAssets'; + +import AnimatedSticker from './AnimatedSticker'; + +import './PasswordMonkey.scss'; + +type OwnProps = { + isPasswordVisible: boolean; + isBig?: boolean; +}; + +const PEEK_MONKEY_SHOW_DELAY = 2000; +const SEGMENT_COVER_EYES: [number, number] = [0, 50]; +const SEGMENT_UNCOVER_EYE: [number, number] = [0, 20]; +const SEGMENT_COVER_EYE: [number, number] = [20, 0]; +const STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH; + +const PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => { + const [closeMonkeyData, setCloseMonkeyData] = useState>(); + const [peekMonkeyData, setPeekMonkeyData] = useState>(); + const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false); + const [isPeekShown, setIsPeekShown] = useState(false); + + useEffect(() => { + if (!closeMonkeyData) { + getAnimationData('MonkeyClose').then(setCloseMonkeyData); + } else { + setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY); + } + }, [closeMonkeyData]); + + useEffect(() => { + if (!peekMonkeyData) { + getAnimationData('MonkeyPeek').then(setPeekMonkeyData); + } + }, [peekMonkeyData]); + + const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []); + + return ( +
    + {!isFirstMonkeyLoaded && ( +
    + )} + {closeMonkeyData && ( + + )} + {peekMonkeyData && ( + + )} +
    + ); +}; + +export default memo(PasswordMonkey); diff --git a/src/components/common/Picker.scss b/src/components/common/Picker.scss new file mode 100644 index 000000000..4fa045aec --- /dev/null +++ b/src/components/common/Picker.scss @@ -0,0 +1,53 @@ +.Picker { + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + + .picker-header { + padding: 0 1rem 0.25rem 0.75rem; + border-bottom: 1px solid var(--color-borders); + display: flex; + flex-flow: row wrap; + flex-shrink: 0; + + overflow-y: auto; + max-height: 20rem; + + .input-group { + margin-bottom: 0.5rem; + margin-left: 0.5rem; + flex-grow: 1; + } + + .form-control { + height: 2rem; + border: none; + border-radius: 0; + padding: 0; + box-shadow: none; + } + } + + .picker-list { + flex-grow: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 0.5rem; + + @media (max-width: 600px) { + padding-left: 0 !important; + padding-right: 0 !important; + } + } + + .no-results { + height: 100%; + margin: 0; + padding: 1rem 1rem; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-secondary); + } +} diff --git a/src/components/common/Picker.tsx b/src/components/common/Picker.tsx new file mode 100644 index 000000000..969caae6a --- /dev/null +++ b/src/components/common/Picker.tsx @@ -0,0 +1,136 @@ +import React, { + FC, useCallback, useRef, useEffect, memo, +} from '../../lib/teact/teact'; + +import { isChatPrivate } from '../../modules/helpers'; + +import InfiniteScroll from '../ui/InfiniteScroll'; +import Checkbox from '../ui/Checkbox'; +import InputText from '../ui/InputText'; +import ListItem from '../ui/ListItem'; +import PrivateChatInfo from './PrivateChatInfo'; +import GroupChatInfo from './GroupChatInfo'; +import PickerSelectedItem from './PickerSelectedItem'; +import useInfiniteScroll from '../../hooks/useInfiniteScroll'; +import useLang from '../../hooks/useLang'; + +import Loading from '../ui/Loading'; + +import './Picker.scss'; + +type OwnProps = { + itemIds: number[]; + selectedIds: number[]; + filterValue?: string; + filterPlaceholder?: string; + notFoundText?: string; + searchInputId?: string; + isLoading?: boolean; + onSelectedIdsChange: (ids: number[]) => void; + onFilterChange: (value: string) => void; + onLoadMore?: () => void; +}; + +// Focus slows down animation, also it breaks transition layout in Chrome +const FOCUS_DELAY_MS = 500; + +const MAX_FULL_ITEMS = 10; +const ALWAYS_FULL_ITEMS_COUNT = 5; + +const Picker: FC = ({ + itemIds, + selectedIds, + filterValue, + filterPlaceholder, + notFoundText, + searchInputId, + isLoading, + onSelectedIdsChange, + onFilterChange, + onLoadMore, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS; + + useEffect(() => { + setTimeout(() => { + requestAnimationFrame(() => { + inputRef.current!.focus(); + }); + }, FOCUS_DELAY_MS); + }, []); + + const handleItemClick = useCallback((id: number) => { + const newSelectedIds = [...selectedIds]; + if (newSelectedIds.includes(id)) { + newSelectedIds.splice(newSelectedIds.indexOf(id), 1); + } else { + newSelectedIds.push(id); + } + onSelectedIdsChange(newSelectedIds); + onFilterChange(''); + }, [selectedIds, onSelectedIdsChange, onFilterChange]); + + const handleFilterChange = useCallback((e: React.ChangeEvent) => { + const { value } = e.currentTarget; + onFilterChange(value); + }, [onFilterChange]); + + const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue)); + + const lang = useLang(); + + return ( +
    +
    + {selectedIds.map((id, i) => ( + + ))} + +
    + + {viewportIds && viewportIds.length ? ( + + {viewportIds.map((id) => ( + handleItemClick(id)} + ripple + > + + {isChatPrivate(id) ? ( + + ) : ( + + )} + + ))} + + ) : !isLoading && viewportIds && !viewportIds.length ? ( +

    {notFoundText || 'Sorry, nothing found.'}

    + ) : ( + + )} +
    + ); +}; + +export default memo(Picker); diff --git a/src/components/common/PickerSelectedItem.scss b/src/components/common/PickerSelectedItem.scss new file mode 100644 index 000000000..ea356337e --- /dev/null +++ b/src/components/common/PickerSelectedItem.scss @@ -0,0 +1,120 @@ +.PickerSelectedItem { + display: flex; + align-items: center; + background: var(--color-chat-hover); + height: 2rem; + min-width: 2rem; + margin-left: 0.5rem; + margin-bottom: 0.5rem; + padding-right: 1rem; + border-radius: 1rem; + cursor: pointer; + position: relative; + overflow: hidden; + flex-shrink: 1; + transition: background-color .15s ease; + + max-width: calc(50% - 0.5rem); + + &.minimized { + padding-right: 0; + } + + &:hover { + background-color: var(--color-chat-active); + } + + &.closeable:hover { + background-color: rgba(var(--color-error-rgb), 0.16); + + .item-remove { + opacity: 1; + } + + .Avatar, .item-icon { + opacity: 0; + } + } + + &.search-date { + .item-remove { + background: var(--color-primary); + } + + &:hover { + background: var(--color-chat-hover); + } + + .item-name { + font-size: 0.875rem; + } + } + + .SearchInput & { + flex: 1 0 auto; + position: relative; + top: .25rem; + left: -.125rem; + + color: var(--color-text-secondary); + } + + .Avatar, .item-icon { + width: 2rem; + height: 2rem; + opacity: 1; + flex-shrink: 0; + transition: opacity .15s ease; + + i { + font-size: 2rem; + } + } + + .item-icon { + display: flex; + align-items: center; + justify-content: center; + padding: 0.375rem; + border-radius: 50%; + background-color: var(--color-primary); + color: white; + + i { + font-size: 1.25rem; + position: relative; + top: -1px; + } + } + + .item-name { + margin-left: 0.5rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + .emoji.emoji-small { + width: 1.125rem; + height: 1.125rem; + background-size: 1.125rem; + vertical-align: -2px; + } + } + + .item-remove { + position: absolute; + left: 0; + top: 0; + width: 2rem; + height: 2rem; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--color-error); + font-size: 1.5rem; + color: white; + opacity: 0; + transition: opacity .15s ease; + } +} diff --git a/src/components/common/PickerSelectedItem.tsx b/src/components/common/PickerSelectedItem.tsx new file mode 100644 index 000000000..46aa87821 --- /dev/null +++ b/src/components/common/PickerSelectedItem.tsx @@ -0,0 +1,115 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiChat, ApiUser } from '../../api/types'; + +import { selectChat, selectUser } from '../../modules/selectors'; +import { getChatTitle, getUserFirstName, isChatPrivate } from '../../modules/helpers'; +import renderText from './helpers/renderText'; +import buildClassName from '../../util/buildClassName'; +import useLang from '../../hooks/useLang'; + +import Avatar from './Avatar'; + +import './PickerSelectedItem.scss'; + +type OwnProps = { + chatOrUserId?: number; + icon?: string; + title?: string; + isMinimized?: boolean; + canClose?: boolean; + onClick: (arg: any) => void; + clickArg: any; + className?: string; +}; + +type StateProps = { + chat?: ApiChat; + user?: ApiUser; +}; + +const PickerSelectedItem: FC = ({ + icon, + title, + isMinimized, + canClose, + onClick, + clickArg, + chat, + user, + className, +}) => { + useLang(); + + let iconElement: any; + let titleText: any; + + if (icon && title) { + iconElement = ( +
    + +
    + ); + + titleText = title; + } else if (chat || user) { + iconElement = ( + + ); + + const name = !chat || (user && !user.isSelf) + ? getUserFirstName(user) + : getChatTitle(chat, user); + + titleText = name ? renderText(name) : undefined; + } + + const fullClassName = buildClassName( + 'PickerSelectedItem', + className, + isMinimized && 'minimized', + canClose && 'closeable', + ); + + return ( +
    onClick(clickArg)} + title={isMinimized ? titleText : undefined} + > + {iconElement} + {!isMinimized && ( +
    + {titleText} +
    + )} + {canClose && ( +
    + +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { chatOrUserId }): StateProps => { + if (!chatOrUserId) { + return {}; + } + + const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined; + const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined; + + return { + chat, + user, + }; + }, +)(PickerSelectedItem)); diff --git a/src/components/common/PinMessageModal.async.tsx b/src/components/common/PinMessageModal.async.tsx new file mode 100644 index 000000000..402a4bb59 --- /dev/null +++ b/src/components/common/PinMessageModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './PinMessageModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const PinMessageModalAsync: FC = (props) => { + const { isOpen } = props; + const PinMessageModal = useModuleLoader(Bundles.Extra, 'PinMessageModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return PinMessageModal ? : undefined; +}; + +export default PinMessageModalAsync; diff --git a/src/components/common/PinMessageModal.tsx b/src/components/common/PinMessageModal.tsx new file mode 100644 index 000000000..6e0fd2467 --- /dev/null +++ b/src/components/common/PinMessageModal.tsx @@ -0,0 +1,133 @@ +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; + +import { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors'; +import { + isChatPrivate, + getUserFirstName, + getPrivateChatUserId, + isChatBasicGroup, + isChatSuperGroup, + isChatChannel, +} from '../../modules/helpers'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +export type OwnProps = { + isOpen: boolean; + chatId: number; + messageId: number; + onClose: () => void; +}; + +type StateProps = { + isChannel: boolean; + isPrivateChat: boolean; + isChatWithSelf: boolean; + isGroup: boolean; + isSuperGroup: boolean; + canPinForAll: boolean; + contactFirstName?: string; +}; + +type DispatchProps = Pick; + +const PinMessageModal: FC = ({ + isOpen, + messageId, + chatId, + isChannel, + isGroup, + isSuperGroup, + canPinForAll, + contactFirstName, + onClose, + pinMessage, +}) => { + const handlePinMessageForAll = useCallback(() => { + pinMessage({ + chatId, messageId, isUnpin: false, + }); + onClose(); + }, [pinMessage, chatId, messageId, onClose]); + + const handlePinMessage = useCallback(() => { + pinMessage({ + chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true, + }); + onClose(); + }, [chatId, messageId, onClose, pinMessage]); + + const lang = useLang(); + + function renderModalHeader() { + return ( +
    +

    {lang('PinMessageAlertTitle')}

    +
    + ); + } + + function renderMessage() { + if (isChannel) { + return

    {lang('PinMessageAlertChannel')}

    ; + } + + if (isGroup || isSuperGroup) { + return

    {lang('PinMessageAlert')}

    ; + } + + return

    {lang('PinMessageAlertChat')}

    ; + } + + return ( + + {renderMessage()} + + {canPinForAll && ( + + )} + + + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const isPrivateChat = isChatPrivate(chatId); + const isChatWithSelf = selectIsChatWithSelf(global, chatId); + const chat = selectChat(global, chatId); + const isChannel = !!chat && isChatChannel(chat); + const isGroup = !!chat && isChatBasicGroup(chat); + const isSuperGroup = !!chat && isChatSuperGroup(chat); + const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup; + const contactFirstName = chat && isChatPrivate(chat.id) + ? getUserFirstName(selectUser(global, getPrivateChatUserId(chat)!)) + : undefined; + + return { + isPrivateChat, + isChatWithSelf, + isChannel, + isGroup, + isSuperGroup, + canPinForAll, + contactFirstName, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']), +)(PinMessageModal)); diff --git a/src/components/common/PrivateChatInfo.tsx b/src/components/common/PrivateChatInfo.tsx new file mode 100644 index 000000000..4aa0d6a6b --- /dev/null +++ b/src/components/common/PrivateChatInfo.tsx @@ -0,0 +1,150 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { + FC, useEffect, useCallback, memo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiUser, ApiTypingStatus } from '../../api/types'; +import { GlobalActions, GlobalState } from '../../global/types'; +import { MediaViewerOrigin } from '../../types'; + +import { selectChatMessages, selectUser } from '../../modules/selectors'; +import { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers'; +import renderText from './helpers/renderText'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Avatar from './Avatar'; +import VerifiedIcon from './VerifiedIcon'; +import TypingStatus from './TypingStatus'; + +type OwnProps = { + userId: number; + typingStatus?: ApiTypingStatus; + avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo'; + forceShowSelf?: boolean; + status?: string; + withMediaViewer?: boolean; + withHandle?: boolean; + withFullInfo?: boolean; + withUpdatingStatus?: boolean; + noStatusOrTyping?: boolean; +}; + +type StateProps = { + user?: ApiUser; + isSavedMessages?: boolean; + areMessagesLoaded: boolean; +} & Pick; + +type DispatchProps = Pick; + +const PrivateChatInfo: FC = ({ + typingStatus, + avatarSize = 'medium', + status, + withMediaViewer, + withHandle, + withFullInfo, + withUpdatingStatus, + noStatusOrTyping, + user, + isSavedMessages, + areMessagesLoaded, + lastSyncTime, + loadFullUser, + openMediaViewer, +}) => { + const { id: userId } = user || {}; + const fullName = getUserFullName(user); + + useEffect(() => { + if (withFullInfo && lastSyncTime && userId) { + loadFullUser({ userId }); + } + }, [userId, loadFullUser, lastSyncTime, withFullInfo]); + + const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => { + if (user && hasPhoto) { + e.stopPropagation(); + openMediaViewer({ + avatarOwnerId: user.id, + origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, + }); + } + }, [user, avatarSize, openMediaViewer]); + + const lang = useLang(); + + if (!user) { + return undefined; + } + + function renderStatusOrTyping() { + if (status) { + return ( + {status} + ); + } + + if (withUpdatingStatus && !areMessagesLoaded) { + return ( + {lang('Updating')} + ); + } + + if (!user) { + return undefined; + } + + if (typingStatus) { + return ; + } + + return ( +
    + {withHandle && user.username && {user.username}} + {getUserStatus(user, lang)} +
    + ); + } + + return ( +
    + +
    + {isSavedMessages ? ( +
    +

    {lang('SavedMessages')}

    +
    + ) : ( +
    +

    {fullName && renderText(fullName)}

    + {user && user.isVerified && } +
    + )} + {!isSavedMessages && !noStatusOrTyping && renderStatusOrTyping()} +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { userId, forceShowSelf }): StateProps => { + const { lastSyncTime } = global; + const user = selectUser(global, userId); + const isSavedMessages = !forceShowSelf && user && user.isSelf; + const areMessagesLoaded = Boolean(selectChatMessages(global, userId)); + + return { + lastSyncTime, user, isSavedMessages, areMessagesLoaded, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']), +)(PrivateChatInfo)); diff --git a/src/components/common/SafeLink.tsx b/src/components/common/SafeLink.tsx new file mode 100644 index 000000000..cf2103d33 --- /dev/null +++ b/src/components/common/SafeLink.tsx @@ -0,0 +1,105 @@ +import React, { FC, memo, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; +import convertPunycode from '../../lib/punycode'; +import { GlobalActions } from '../../global/types'; + +import { DEBUG, RE_TME_LINK } from '../../config'; +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; + +type OwnProps = { + url?: string; + text: string; + className?: string; + children?: any; +}; + +type DispatchProps = Pick; + +const SafeLink: FC = ({ + url, + text, + className, + children, + openTelegramLink, +}) => { + const handleClick = useCallback((e: React.MouseEvent) => { + if ( + e.ctrlKey || e.altKey || e.shiftKey || e.metaKey + || !url || !url.match(RE_TME_LINK) + ) { + return true; + } + + e.preventDefault(); + openTelegramLink({ url }); + + return false; + }, [openTelegramLink, url]); + + if (!url) { + return undefined; + } + + const classNames = buildClassName( + className || 'text-entity-link', + text.length > 50 && 'long-word-break-all', + ); + + return ( +
    + {children || text} + + ); +}; + +function getHref(url?: string) { + if (!url) { + return undefined; + } + + return url.includes('://') ? url : `http://${url}`; +} + +function getDecodedUrl(url?: string) { + if (!url) { + return undefined; + } + + const href = getHref(url); + if (!href) { + return undefined; + } + + try { + let decodedHref = decodeURI(href); + + const match = decodedHref.match(/^https?:\/\/([^/:?#]+)(?:[/:?#]|$)/i); + if (!match) { + return undefined; + } + const domain = match[1]; + decodedHref = decodedHref.replace(domain, convertPunycode(domain)); + + return decodedHref; + } catch (error) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('SafeLink.getDecodedUrl error ', url, error); + } + } + + return undefined; +} + +export default memo(withGlobal( + undefined, + (setGlobal, actions): DispatchProps => pick(actions, ['openTelegramLink']), +)(SafeLink)); diff --git a/src/components/common/StickerButton.scss b/src/components/common/StickerButton.scss new file mode 100644 index 000000000..4fc23299c --- /dev/null +++ b/src/components/common/StickerButton.scss @@ -0,0 +1,57 @@ +.StickerButton { + display: inline-block; + width: 4rem; + height: 4rem; + margin: 0.5rem; + border-radius: var(--border-radius-messages-small); + background: transparent no-repeat center; + background-size: contain; + cursor: pointer; + transition: background-color .15s ease, opacity .3s ease !important; + position: relative; + + @media (max-width: 600px) { + margin: 0.25rem; + } + + &.set-button { + width: 2.75rem !important; + height: 2.75rem; + margin: 0 0.5rem; + } + + .AnimatedSticker, img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + img { + object-fit: contain; + } + + .sticker-unfave-button { + position: absolute; + top: -0.5rem; + right: -0.5rem; + width: 1.25rem; + height: 1.25rem; + padding: 0.125rem; + + i { + font-size: 1rem; + } + + opacity: 0; + } + + &:hover { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + + .sticker-unfave-button { + opacity: 1; + } + } +} diff --git a/src/components/common/StickerButton.tsx b/src/components/common/StickerButton.tsx new file mode 100644 index 000000000..e33558bf2 --- /dev/null +++ b/src/components/common/StickerButton.tsx @@ -0,0 +1,124 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { + FC, memo, useEffect, useRef, +} from '../../lib/teact/teact'; + +import { ApiMediaFormat, ApiSticker } from '../../api/types'; + +import { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver'; +import useMedia from '../../hooks/useMedia'; +import useTransitionForMedia from '../../hooks/useTransitionForMedia'; +import useFlag from '../../hooks/useFlag'; +import buildClassName from '../../util/buildClassName'; + +import AnimatedSticker from './AnimatedSticker'; +import Button from '../ui/Button'; + +import './StickerButton.scss'; + +type OwnProps = { + sticker: ApiSticker; + size: number; + observeIntersection: ObserveFn; + noAnimate?: boolean; + title?: string; + className?: string; + onClick?: (arg: any) => void; + clickArg?: any; + onUnfaveClick?: (sticker: ApiSticker) => void; +}; + +const StickerButton: FC = ({ + sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const { isAnimated } = sticker; + const localMediaHash = `sticker${sticker.id}`; + const stickerSelector = `sticker-button-${sticker.id}`; + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined; + const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl); + + const shouldPlay = isIntersecting && !noAnimate; + const lottieData = useMedia(localMediaHash, !shouldPlay, ApiMediaFormat.Lottie); + const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData)); + const canAnimatedPlay = isAnimationLoaded && shouldPlay; + + const { + shouldRenderThumb, + shouldRenderFullMedia: shouldRenderPreview, + transitionClassNames: previewTransitionClassNames, + } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow'); + + // To avoid flickering + useEffect(() => { + if (!shouldPlay) { + unmarkLoaded(); + } + }, [unmarkLoaded, shouldPlay]); + + function handleClick() { + if (onClick) { + onClick(clickArg); + } + } + + function handleUnfaveClick(e: ReactMouseEvent) { + e.stopPropagation(); + e.preventDefault(); + + onUnfaveClick!(sticker); + } + + const fullClassName = buildClassName( + 'StickerButton', + isAnimated && 'animated', + stickerSelector, + className, + ); + + const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : ''; + + return ( +
    + {shouldRenderPreview && !canAnimatedPlay && ( + // eslint-disable-next-line jsx-a11y/alt-text + + )} + {shouldPlay && lottieData && ( + + )} + {onUnfaveClick && ( + + )} +
    + ); +}; + +export default memo(StickerButton); diff --git a/src/components/common/StickerSetModal.async.tsx b/src/components/common/StickerSetModal.async.tsx new file mode 100644 index 000000000..acd490819 --- /dev/null +++ b/src/components/common/StickerSetModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './StickerSetModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const StickerSetModalAsync: FC = (props) => { + const { isOpen } = props; + const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return StickerSetModal ? : undefined; +}; + +export default StickerSetModalAsync; diff --git a/src/components/common/StickerSetModal.scss b/src/components/common/StickerSetModal.scss new file mode 100644 index 000000000..06bdd81b6 --- /dev/null +++ b/src/components/common/StickerSetModal.scss @@ -0,0 +1,48 @@ +.StickerSetModal { + .modal-dialog { + width: 26.25rem; + max-width: 100%; + } + + @media (max-width: 600px) { + .modal-dialog { + width: 18.875rem; + } + } + + .modal-header { + padding: 0.5rem 1rem; + } + + .modal-content { + text-align: center; + padding: 0; + } + + .stickers { + position: relative; + width: 100%; + height: 19rem; + max-height: 50vh; + overflow-y: auto; + padding: 0 0.25rem; + text-align: left; + } + + .button-wrapper { + padding: 0.5rem 0; + border-top: 1px solid var(--color-borders); + box-shadow: 0 0 2px rgba(114, 114, 114, 0.25); + + button { + display: inline-block; + } + } + + .Loading { + width: 100%; + height: 22.8125rem; + max-height: calc(50vh + 3.8125rem); + } +} + diff --git a/src/components/common/StickerSetModal.tsx b/src/components/common/StickerSetModal.tsx new file mode 100644 index 000000000..a4bad5fa7 --- /dev/null +++ b/src/components/common/StickerSetModal.tsx @@ -0,0 +1,121 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiSticker, ApiStickerSet } from '../../api/types'; +import { GlobalActions } from '../../global/types'; + +import { STICKER_SIZE_MODAL } from '../../config'; +import { pick } from '../../util/iteratees'; +import { selectStickerSet } from '../../modules/selectors'; +import { useIntersectionObserver } from '../../hooks/useIntersectionObserver'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; +import Loading from '../ui/Loading'; +import StickerButton from './StickerButton'; + +import './StickerSetModal.scss'; + +export type OwnProps = { + isOpen: boolean; + fromSticker: ApiSticker; + onClose: () => void; +}; + +type StateProps = { + stickerSet?: ApiStickerSet; +}; + +type DispatchProps = Pick; + +const INTERSECTION_THROTTLE = 200; + +const StickerSetModal: FC = ({ + isOpen, + fromSticker, + stickerSet, + onClose, + loadStickers, + toggleStickerSet, + sendMessage, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const { + observe: observeIntersection, + } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen }); + + useEffect(() => { + if (isOpen) { + const { stickerSetId, stickerSetAccessHash } = fromSticker; + loadStickers({ stickerSetId, stickerSetAccessHash }); + } + }, [isOpen, fromSticker, loadStickers]); + + const handleSelect = useCallback((sticker: ApiSticker) => { + sticker = { + ...sticker, + isPreloadedGlobally: true, + }; + + sendMessage({ sticker }); + onClose(); + }, [onClose, sendMessage]); + + const handleButtonClick = useCallback(() => { + toggleStickerSet({ stickerSetId: fromSticker.stickerSetId }); + onClose(); + }, [fromSticker.stickerSetId, onClose, toggleStickerSet]); + + return ( + + {stickerSet && stickerSet.stickers ? ( + <> +
    + {stickerSet.stickers.map((sticker) => ( + + ))} +
    +
    + +
    + + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { fromSticker }: OwnProps) => { + return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadStickers', + 'toggleStickerSet', + 'sendMessage', + ]), +)(StickerSetModal)); diff --git a/src/components/common/TrackingMonkey.tsx b/src/components/common/TrackingMonkey.tsx new file mode 100644 index 000000000..d192bb8bf --- /dev/null +++ b/src/components/common/TrackingMonkey.tsx @@ -0,0 +1,102 @@ +import React, { + FC, useState, useEffect, useCallback, memo, +} from '../../lib/teact/teact'; + +import { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config'; +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import getAnimationData from './helpers/animatedAssets'; + +import AnimatedSticker from './AnimatedSticker'; + +import './PasswordMonkey.scss'; + +type OwnProps = { + code: string; + codeLength: number; + trackingDirection: number; + isTracking: boolean; + isBig?: boolean; +}; + +const TRACKING_START_FRAME = 15; +const TRACKING_END_FRAME = 180; +const STICKER_SIZE = IS_MOBILE_SCREEN ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH; + +const TrackingMonkey: FC = ({ + code, + codeLength, + trackingDirection, + isTracking, + isBig, +}) => { + const [idleMonkeyData, setIdleMonkeyData] = useState>(); + const [trackingMonkeyData, setTrackingMonkeyData] = useState>(); + const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false); + const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength; + + useEffect(() => { + if (!idleMonkeyData) { + getAnimationData('MonkeyIdle').then(setIdleMonkeyData); + } + }, [idleMonkeyData]); + + useEffect(() => { + if (!trackingMonkeyData) { + getAnimationData('MonkeyTracking').then(setTrackingMonkeyData); + } + }, [trackingMonkeyData]); + + const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []); + + function getTrackingFrames(): [number, number] { + const startFrame = (code && code.length > 1) || trackingDirection < 0 + ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1) + : 0; + const endFrame = code.length === codeLength + ? TRACKING_END_FRAME + : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length; + + if (trackingDirection < 1) { + return [ + endFrame, + startFrame, + ]; + } + + return [ + startFrame, + endFrame, + ]; + } + + return ( +
    + {!isFirstMonkeyLoaded && ( +
    + )} + {idleMonkeyData && ( + + )} + {trackingMonkeyData && ( + + )} +
    + ); +}; + +export default memo(TrackingMonkey); diff --git a/src/components/common/TypingStatus.scss b/src/components/common/TypingStatus.scss new file mode 100644 index 000000000..317647420 --- /dev/null +++ b/src/components/common/TypingStatus.scss @@ -0,0 +1,28 @@ +.typing-status { + display: flex; + align-items: baseline; + + .sender-name { + &::after { + content: '\00a0is\00a0'; + color: var(--color-text-secondary); + } + } + + .ellipsis { + display: flex; + width: 1rem; + overflow: hidden; + + &::after { + content: '...'; + animation: typing-animation 1s steps(4, start) infinite; + } + } +} + +@keyframes typing-animation { + from { + transform: translateX(-1rem); + } +} diff --git a/src/components/common/TypingStatus.tsx b/src/components/common/TypingStatus.tsx new file mode 100644 index 000000000..c63cc4d9f --- /dev/null +++ b/src/components/common/TypingStatus.tsx @@ -0,0 +1,44 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiUser, ApiTypingStatus } from '../../api/types'; + +import { selectUser } from '../../modules/selectors'; +import { getUserFirstName } from '../../modules/helpers'; +import renderText from './helpers/renderText'; + +import './TypingStatus.scss'; + +type OwnProps = { + typingStatus: ApiTypingStatus; +}; + +type StateProps = { + typingUser?: ApiUser; +}; + +const TypingStatus: FC = ({ typingStatus, typingUser }) => { + const typingUserName = typingUser && !typingUser.isSelf && getUserFirstName(typingUser); + + return ( +

    + {typingUserName && ( + {renderText(typingUserName)} + )} + {typingStatus.action} + +

    + ); +}; + +export default memo(withGlobal( + (global, { typingStatus }): StateProps => { + if (!typingStatus.userId) { + return {}; + } + + const typingUser = selectUser(global, typingStatus.userId); + + return { typingUser }; + }, +)(TypingStatus)); diff --git a/src/components/common/UiLoader.scss b/src/components/common/UiLoader.scss new file mode 100644 index 000000000..1eca85ae1 --- /dev/null +++ b/src/components/common/UiLoader.scss @@ -0,0 +1,108 @@ +#UiLoader { + height: 100%; + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100); + } + + .mask { + position: fixed; + top: 0; + left: 0; + right: 0; + margin: 0 auto; + width: 100%; + max-width: 1680px; + height: 100%; + z-index: var(--z-ui-loader-mask); + display: flex; + + .left { + flex: 1; + background: white; + min-width: 15.5rem; + max-width: 26.5rem; + + @media (min-width: 1680px) { + border-left: 1px solid var(--color-borders); + } + + @media (max-width: 1275px) { + flex: 2; + } + + @media (max-width: 925px) { + min-width: 26.5rem; + } + + @media (max-width: 600px) { + max-width: none; + width: 100vw; + } + } + + .middle { + flex: 3; + border-left: 1px solid var(--color-borders); + border-right: 1px solid var(--color-borders); + position: relative; + z-index: 1; + overflow: hidden; + + &::before { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: rgb(230, 235, 238) url('../../assets/chat-bg.jpg') no-repeat center; + background-size: cover; + z-index: -1; + transform-origin: left center; + } + + &.with-right-column::before { + transform: scale(0.67); + } + + @media screen and (min-width: 1276px) { + &::before { + margin: -16rem -5rem -20rem 0; + } + } + + &.custom-bg-image::before { + margin: -1rem; + background-image: none !important; + } + + @media (max-width: 1275px) { + flex: 3; + border-right: none; + } + + @media (max-width: 600px) { + display: none; + } + } + + .right { + position: absolute; + top: 0; + right: 0; + z-index: 1; + height: 100%; + width: var(--right-column-width); + min-width: 15.5rem; + max-width: 26.5rem; + border-left: 1px solid var(--color-borders); + background: white; + } + } + + .blank { + flex: 1; + background: white; + } +} diff --git a/src/components/common/UiLoader.tsx b/src/components/common/UiLoader.tsx new file mode 100644 index 000000000..bba3d1990 --- /dev/null +++ b/src/components/common/UiLoader.tsx @@ -0,0 +1,156 @@ +import React, { FC, useEffect } from '../../lib/teact/teact'; +import { getGlobal, withGlobal } from '../../lib/teact/teactn'; + +import { ApiMediaFormat } from '../../api/types'; +import { GlobalActions, GlobalState } from '../../global/types'; + +import { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting +import useFlag from '../../hooks/useFlag'; +import useShowTransition from '../../hooks/useShowTransition'; +import { pause } from '../../util/schedulers'; +import { preloadImage } from '../../util/files'; +import preloadFonts from '../../util/fonts'; +import * as mediaLoader from '../../util/mediaLoader'; +import { Bundles, loadModule } from '../../util/moduleLoader'; +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; + +import './UiLoader.scss'; + +// @ts-ignore +import telegramLogoPath from '../../assets/telegram-logo.svg'; +// @ts-ignore +import authCaptionPath from '../../assets/auth-caption.png'; +// @ts-ignore +import monkeyPath from '../../assets/monkey.svg'; +import { selectIsRightColumnShown } from '../../modules/selectors'; + +type OwnProps = { + page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode'; + children: any; +}; + +type StateProps = Pick & { + hasCustomBackground?: boolean; + isRightColumnShown?: boolean; +}; + +type DispatchProps = Pick; + +const MAX_PRELOAD_DELAY = 700; +const SECOND_STATE_DELAY = 1000; +const AVATARS_TO_PRELOAD = 10; + +function preloadAvatars() { + const { listIds, byId } = getGlobal().chats; + if (!listIds.active) { + return undefined; + } + + return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => { + const chat = byId[chatId]; + if (!chat) { + return undefined; + } + + const avatarHash = getChatAvatarHash(chat); + if (!avatarHash) { + return undefined; + } + + return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri); + })); +} + +const preloadTasks = { + main: () => Promise.all([ + loadModule(Bundles.Main, 'Main') + .then(preloadFonts), + preloadAvatars(), + ]), + authPhoneNumber: () => Promise.all([ + preloadImage(authCaptionPath), + preloadImage(telegramLogoPath), + ]), + authCode: () => Promise.all([ + preloadImage(monkeyPath), + preloadFonts(), + ]), + authPassword: () => preloadImage(monkeyPath), + authQrCode: preloadFonts, +}; + +const UiLoader: FC = ({ + page, + children, + hasCustomBackground, + isRightColumnShown, + setIsUiReady, +}) => { + const [isReady, markReady] = useFlag(); + const { + shouldRender: shouldRenderMask, transitionClassNames, + } = useShowTransition(!isReady, undefined, true); + + useEffect(() => { + let timeout: number | undefined; + + Promise.race([ + pause(MAX_PRELOAD_DELAY), + preloadTasks[page](), + ]).then(() => { + markReady(); + setIsUiReady({ uiReadyState: 1 }); + + timeout = window.setTimeout(() => { + setIsUiReady({ uiReadyState: 2 }); + }, SECOND_STATE_DELAY); + }); + + return () => { + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + setIsUiReady({ uiReadyState: 0 }); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
    + {children} + {shouldRenderMask && ( +
    + {page === 'main' ? ( + <> +
    +
    + {isRightColumnShown &&
    } + + ) : ( +
    + )} +
    + )} +
    + ); +}; + +export default withGlobal( + (global): StateProps => { + return { + uiReadyState: global.uiReadyState, + hasCustomBackground: Boolean(global.settings.byKey.customBackground), + isRightColumnShown: selectIsRightColumnShown(global), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']), +)(UiLoader); diff --git a/src/components/common/UnpinAllMessagesModal.async.tsx b/src/components/common/UnpinAllMessagesModal.async.tsx new file mode 100644 index 000000000..c4c889671 --- /dev/null +++ b/src/components/common/UnpinAllMessagesModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './UnpinAllMessagesModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const UnpinAllMessagesModalAsync: FC = (props) => { + const { isOpen } = props; + const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return UnpinAllMessagesModal ? : undefined; +}; + +export default UnpinAllMessagesModalAsync; diff --git a/src/components/common/UnpinAllMessagesModal.tsx b/src/components/common/UnpinAllMessagesModal.tsx new file mode 100644 index 000000000..5da66e536 --- /dev/null +++ b/src/components/common/UnpinAllMessagesModal.tsx @@ -0,0 +1,65 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { selectPinnedIds } from '../../modules/selectors'; +import useLang from '../../hooks/useLang'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +export type OwnProps = { + isOpen: boolean; + chatId?: number; + onClose: () => void; + onUnpin: () => void; +}; + +type StateProps = { + pinnedMessagesCount: number; +}; + +const UnpinAllMessagesModal: FC = ({ + isOpen, + pinnedMessagesCount, + onClose, + onUnpin, +}) => { + const lang = useLang(); + + function renderModalHeader() { + return ( +
    +

    {lang('UnpinAllMessages')}

    +
    + ); + } + + function renderMessage() { + return

    Do you want to unpin all {pinnedMessagesCount} messages in this chat?

    ; + } + + return ( + + {renderMessage()} + + + + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const pinnedIds = chatId ? selectPinnedIds(global, chatId) : []; + + return { + pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0, + }; + }, +)(UnpinAllMessagesModal)); diff --git a/src/components/common/UserLink.tsx b/src/components/common/UserLink.tsx new file mode 100644 index 000000000..5cf5bbee3 --- /dev/null +++ b/src/components/common/UserLink.tsx @@ -0,0 +1,41 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiChat, ApiUser } from '../../api/types'; + +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; + +import Link from '../ui/Link'; + +type OwnProps = { + className?: string; + sender?: ApiUser | ApiChat; + children: any; +}; + +type DispatchProps = Pick; + +const UserLink: FC = ({ + className, sender, openUserInfo, children, +}) => { + const handleClick = useCallback(() => { + if (sender) { + openUserInfo({ id: sender.id }); + } + }, [sender, openUserInfo]); + + if (!sender) { + return children; + } + + return ( + {children} + ); +}; + +export default withGlobal( + undefined, + (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']), +)(UserLink); diff --git a/src/components/common/UsernameInput.tsx b/src/components/common/UsernameInput.tsx new file mode 100644 index 000000000..f85ef84fe --- /dev/null +++ b/src/components/common/UsernameInput.tsx @@ -0,0 +1,108 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useState, useCallback, memo, useEffect, useMemo, +} from '../../lib/teact/teact'; + +import { debounce } from '../../util/schedulers'; +import useLang from '../../hooks/useLang'; + +import InputText from '../ui/InputText'; + +type OwnProps = { + currentUsername?: string; + asLink?: boolean; + isLoading?: boolean; + isUsernameAvailable?: boolean; + checkUsername: AnyToVoidFunction; + onChange: (value: string | false) => void; +}; + +const MIN_USERNAME_LENGTH = 5; +const MAX_USERNAME_LENGTH = 32; +const LINK_PREFIX = 'https://t.me/'; +const LINK_PREFIX_REGEX = /https:\/\/t\.me\/?/i; +const USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/; + +const runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false); + +function isUsernameValid(username: string) { + return username.length >= MIN_USERNAME_LENGTH + && username.length <= MAX_USERNAME_LENGTH + && USERNAME_REGEX.test(username); +} + +const SettingsEditProfile: FC = ({ + currentUsername, + asLink, + isLoading, + isUsernameAvailable, + checkUsername, + onChange, +}) => { + const [username, setUsername] = useState(currentUsername || ''); + + const lang = useLang(); + const langPrefix = asLink ? 'SetUrl' : 'Username'; + const label = asLink ? lang('SetUrlPlaceholder') : lang('Username'); + + const [usernameSuccess, usernameError] = useMemo(() => { + if (!username.length) { + return []; + } + + if (username.length < MIN_USERNAME_LENGTH) { + return [undefined, `${label} is too short`]; + } + if (username.length > MAX_USERNAME_LENGTH) { + return [undefined, `${label} is too long`]; + } + if (!USERNAME_REGEX.test(username)) { + return [undefined, `${label} contains invalid characters`]; + } + + if (isUsernameAvailable === undefined) { + return []; + } + + // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required + return [ + isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined, + isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined, + ]; + }, [username, isUsernameAvailable, lang, langPrefix, label]); + + useEffect(() => { + setUsername(currentUsername || ''); + }, [asLink, currentUsername]); + + const handleUsernameChange = useCallback((e: ChangeEvent) => { + const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, ''); + setUsername(newUsername); + e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`; + + const isValid = isUsernameValid(newUsername); + + if (isValid) { + runDebouncedForCheckUsername(() => { + checkUsername({ username: newUsername }); + }); + } + + if (onChange) { + onChange(isValid ? newUsername : false); + } + }, [asLink, checkUsername, onChange]); + + return ( + + ); +}; + +export default memo(SettingsEditProfile); diff --git a/src/components/common/VerifiedIcon.scss b/src/components/common/VerifiedIcon.scss new file mode 100644 index 000000000..7a6c5449c --- /dev/null +++ b/src/components/common/VerifiedIcon.scss @@ -0,0 +1,10 @@ +.VerifiedIcon { + display: inline-block; + flex-shrink: 0; + width: 1.5rem; + height: 1.5rem; + background-image: url('../../assets/icon-verified.svg'); + background-repeat: no-repeat; + background-size: 100%; + background-position: center; +} diff --git a/src/components/common/VerifiedIcon.tsx b/src/components/common/VerifiedIcon.tsx new file mode 100644 index 000000000..f6dc5bb0a --- /dev/null +++ b/src/components/common/VerifiedIcon.tsx @@ -0,0 +1,11 @@ +import React, { FC } from '../../lib/teact/teact'; + +import './VerifiedIcon.scss'; + +const VerifiedIcon: FC = () => { + return ( + + ); +}; + +export default VerifiedIcon; diff --git a/src/components/common/WebLink.scss b/src/components/common/WebLink.scss new file mode 100644 index 000000000..131602e26 --- /dev/null +++ b/src/components/common/WebLink.scss @@ -0,0 +1,83 @@ +.WebLink { + min-height: 3rem; + padding: .25rem 0 0 3.75rem; + font-size: 0.875rem; + line-height: 1.125rem; + position: relative; + + & + & { + margin-top: 1.5rem; + } + + &.without-photo::before { + content: attr(data-initial); + width: 3rem; + height: 3rem; + position: absolute; + left: 0; + top: 0; + background-color: var(--color-webpage-initial-background); + color: #fff; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--border-radius-messages-small); + text-transform: uppercase; + font-weight: 500; + font-size: 1.5rem; + } + + .Media { + position: absolute; + left: 0; + top: 0; + width: 3rem; + height: 3rem; + cursor: default !important; + padding-bottom: unset !important; + border-radius: var(--border-radius-messages-small) !important; + } + + .site-name, + .site-description, + .site-title { + word-break: break-word; + } + + .site-name { + display: block; + color: var(--color-links); + font-weight: 400; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .site-title { + font-size: 1rem; + font-weight: 400; + margin-bottom: .0625rem; + line-height: 1.3125rem; + } + + .sender-name, + .site-description { + margin-bottom: 0; + color: var(--color-text-secondary); + line-height: 1.125rem; + max-height: 2.25rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .sender-name { + margin-top: .25rem; + } + + .site-description .emoji { + width: 1rem !important; + height: 1rem !important; + } +} diff --git a/src/components/common/WebLink.tsx b/src/components/common/WebLink.tsx new file mode 100644 index 000000000..788a36600 --- /dev/null +++ b/src/components/common/WebLink.tsx @@ -0,0 +1,97 @@ +import React, { FC, memo, useCallback } from '../../lib/teact/teact'; + +import { ApiMessage, ApiWebPage } from '../../api/types'; + +import { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers'; +import buildClassName from '../../util/buildClassName'; +import trimText from '../../util/trimText'; +import renderText from './helpers/renderText'; +import { formatPastTimeShort } from '../../util/dateFormat'; + +import Media from './Media'; +import Link from '../ui/Link'; + +import './WebLink.scss'; + +const MAX_TEXT_LENGTH = 170; // symbols + +type OwnProps = { + message: ApiMessage; + senderTitle?: string; + onMessageClick: (messageId: number, chatId: number) => void; +}; + +const WebLink: FC = ({ message, senderTitle, onMessageClick }) => { + let linkData: ApiWebPage | undefined = getMessageWebPage(message); + + if (!linkData) { + const link = getFirstLinkInMessage(message); + if (link) { + const { url, domain } = link; + const messageText = getMessageSummaryText(message); + + linkData = { + siteName: domain.replace(/^www./, ''), + url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`, + description: messageText !== url ? messageText : undefined, + } as ApiWebPage; + } + } + + const handleMessageClick = useCallback(() => { + onMessageClick(message.id, message.chatId); + }, [onMessageClick, message.id, message.chatId]); + + if (!linkData) { + return undefined; + } + + const { + siteName, + url, + displayUrl, + title, + description, + photo, + } = linkData; + + const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH); + + const className = buildClassName( + 'WebLink scroll-item', + !photo && 'without-photo', + ); + + return ( +
    + {photo && ( + + )} +
    + {renderText(title || siteName || displayUrl)} + {truncatedDescription && ( + {renderText(truncatedDescription)} + )} + + {url.replace('mailto:', '') || displayUrl} + + {senderTitle &&
    {renderText(senderTitle)}
    } +
    + {senderTitle && ( +
    + + {formatPastTimeShort(message.date * 1000)} + +
    + )} +
    + ); +}; + +export default memo(WebLink); diff --git a/src/components/common/helpers/animatedAssets.ts b/src/components/common/helpers/animatedAssets.ts new file mode 100644 index 000000000..34819ec53 --- /dev/null +++ b/src/components/common/helpers/animatedAssets.ts @@ -0,0 +1,34 @@ +import { ApiMediaFormat } from '../../../api/types'; + +import * as mediaLoader from '../../../util/mediaLoader'; + +// @ts-ignore +import MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs'; +// @ts-ignore +import MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs'; +// @ts-ignore +import MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs'; +// @ts-ignore +import MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs'; +// @ts-ignore +import FoldersAll from '../../../assets/FoldersAll.tgs'; +// @ts-ignore +import FoldersNew from '../../../assets/FoldersNew.tgs'; +// @ts-ignore +import DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs'; + +export const ANIMATED_STICKERS_PATHS = { + MonkeyIdle, + MonkeyTracking, + MonkeyClose, + MonkeyPeek, + FoldersAll, + FoldersNew, + DiscussionGroups, +}; + +export default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) { + const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, ''); + + return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie); +} diff --git a/src/components/common/helpers/detectCardType.ts b/src/components/common/helpers/detectCardType.ts new file mode 100644 index 000000000..7002e93fd --- /dev/null +++ b/src/components/common/helpers/detectCardType.ts @@ -0,0 +1,31 @@ +const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/; +const MASTERCARD1 = /^5[1-5][0-9]{11,14}$/; +const MASTERCARD2 = /^2[2-7][0-9]{11,14}$/; + +export enum CardType { + Default, + Visa, + Mastercard, +} + +const cards: Record = { + [CardType.Default]: '', + [CardType.Visa]: 'visa', + [CardType.Mastercard]: 'mastercard', +}; + +export function detectCardType(cardNumber: string): number { + cardNumber = cardNumber.replace(/\s/g, ''); + if (VISA.test(cardNumber)) { + return CardType.Visa; + } + if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) { + return CardType.Mastercard; + } + return CardType.Default; +} + +export function detectCardTypeText(cardNumber: string): string { + const cardType = detectCardType(cardNumber); + return cards[cardType as number] || ''; +} diff --git a/src/components/common/helpers/documentInfo.ts b/src/components/common/helpers/documentInfo.ts new file mode 100644 index 000000000..aeb6f00b3 --- /dev/null +++ b/src/components/common/helpers/documentInfo.ts @@ -0,0 +1,54 @@ +import { ApiDocument } from '../../../api/types'; + +const ONE_GIGABYTE = 1024 * 1024 * 1024; +const ONE_MEGABYTE = 1024 * 1024; + +export function getFileSizeString(bytes: number) { + if (bytes > (ONE_GIGABYTE / 2)) { + return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`; + } + if (bytes > (ONE_MEGABYTE / 2)) { + return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`; + } + return `${(bytes / (1024)).toFixed(1)} KB`; +} + +export function getDocumentExtension(document: ApiDocument) { + const { fileName, mimeType } = document; + + return getFileExtension(fileName, mimeType); +} + +export function getFileExtension(fileName: string, mimeType: string) { + if (fileName && fileName.indexOf('.') !== -1) { + return fileName.split('.').pop(); + } else { + return mimeType.split('/').pop(); + } +} + +export function getColorFromExtension(extension: string) { + switch (extension) { + case 'apk': + case 'xls': + case 'xlsx': + return 'green'; + case 'zip': + case 'rar': + case '7z': + case 'tar': + case 'gz': + case 'ppt': + case 'pptx': + return 'orange'; + case 'pdf': + case 'xps': + return 'red'; + default: + return 'default'; + } +} + +export function getDocumentHasPreview(document: ApiDocument) { + return Boolean(document.previewBlobUrl || document.thumbnail); +} diff --git a/src/components/common/helpers/mediaDimensions.ts b/src/components/common/helpers/mediaDimensions.ts new file mode 100644 index 000000000..148bd690c --- /dev/null +++ b/src/components/common/helpers/mediaDimensions.ts @@ -0,0 +1,202 @@ +import { ApiPhoto, ApiVideo, ApiSticker } from '../../../api/types'; +import { getPhotoInlineDimensions, getVideoDimensions, IDimensions } from '../../../modules/helpers'; +import windowSize from '../../../util/windowSize'; +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config'; + +export const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)'; +export const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10); +export const ROUND_VIDEO_DIMENSIONS = 200; +export const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 }; + +const DEFAULT_MEDIA_DIMENSIONS: IDimensions = { width: 100, height: 100 }; +const LIKE_STICKER_ID = '1258816259753933'; +const MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH = 0.69; + +let cachedMaxWidth: number | undefined; + +function getMaxMessageWidthRem(fromOwnMessage: boolean) { + const regularMaxWidth = fromOwnMessage ? 30 : 29; + if (!IS_MOBILE_SCREEN) { + return regularMaxWidth; + } + + // @optimization Limitation: changing device screen width not supported + if (!cachedMaxWidth) { + cachedMaxWidth = Math.min( + regularMaxWidth, + Math.floor(window.innerWidth * MOBILE_SCREEN_MAX_MESSAGE_SCREEN_WIDTH) / REM, + ); + } + + return cachedMaxWidth; +} + +function getAvailableWidth( + fromOwnMessage: boolean, + isForwarded?: boolean, + isWebPagePhoto?: boolean, +) { + const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0; + const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage) - extraPaddingRem; + + return availableWidthRem * REM; +} + +function getAvailableHeight(isGif?: boolean, aspectRatio?: number) { + if ( + isGif && aspectRatio + && aspectRatio >= 0.75 && aspectRatio <= 1.25 + ) { + return 20 * REM; + } + + return 27 * REM; +} + +function calculateDimensionsForMessageMedia({ + width, + height, + fromOwnMessage, + isForwarded, + isWebPagePhoto, + isGif, +}: { + width: number; + height: number; + fromOwnMessage: boolean; + isForwarded?: boolean; + isWebPagePhoto?: boolean; + isGif?: boolean; +}): IDimensions { + const aspectRatio = height / width; + const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto); + const availableHeight = getAvailableHeight(isGif, aspectRatio); + + return calculateDimensions(availableWidth, availableHeight, width, height); +} + +export function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): IDimensions { + const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY); + const { width: windowWidth, height: windowHeight } = windowSize.get(); + let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25; + if (withFooter) { + occupiedHeightRem = mql.matches ? 10 : 15; + } + + return { + width: windowWidth, + height: windowHeight - occupiedHeightRem * REM, + }; +} + +export function calculateInlineImageDimensions( + photo: ApiPhoto, + fromOwnMessage: boolean, + isForwarded?: boolean, + isWebPagePhoto?: boolean, +) { + const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS; + + return calculateDimensionsForMessageMedia({ + width, + height, + fromOwnMessage, + isForwarded, + isWebPagePhoto, + }); +} + +export function calculateVideoDimensions( + video: ApiVideo, + fromOwnMessage: boolean, + isForwarded?: boolean, +) { + const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS; + + return calculateDimensionsForMessageMedia({ + width, + height, + fromOwnMessage, + isForwarded, + isGif: video.isGif, + }); +} + +export function getPictogramDimensions(): IDimensions { + return { + width: 2 * REM, + height: 2 * REM, + }; +} + +export function getDocumentThumbnailDimensions(smaller?: boolean): IDimensions { + if (smaller) { + return { + width: 3 * REM, + height: 3 * REM, + }; + } + + return { + width: 3.375 * REM, + height: 3.375 * REM, + }; +} + +export function getStickerDimensions(sticker: ApiSticker): IDimensions { + const { width } = sticker; + let { height } = sticker; + + // For some reason this sticker has some weird `height` value + if (sticker.id === LIKE_STICKER_ID) { + height = width; + } + + const aspectRatio = (height && width) && height / width; + const baseWidth = (IS_MOBILE_SCREEN ? STICKER_SIZE_INLINE_MOBILE_FACTOR : STICKER_SIZE_INLINE_DESKTOP_FACTOR) * REM; + const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth; + + if (aspectRatio && calculatedHeight > baseWidth) { + return { + width: Math.round(baseWidth / aspectRatio), + height: baseWidth, + }; + } + + return { + width: baseWidth, + height: calculatedHeight, + }; +} + +export function calculateMediaViewerDimensions( + { width, height }: IDimensions, withFooter: boolean, isVideo: boolean = false, +): IDimensions { + const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo); + + return calculateDimensions(availableWidth, availableHeight, width, height); +} + +export function calculateDimensions( + availableWidth: number, + availableHeight: number, + mediaWidth: number, + mediaHeight: number, +): IDimensions { + const aspectRatio = mediaHeight / mediaWidth; + const calculatedWidth = Math.min(mediaWidth, availableWidth); + const calculatedHeight = Math.round(calculatedWidth * aspectRatio); + + if (calculatedHeight > availableHeight) { + return { + width: Math.round(availableHeight / aspectRatio), + height: availableHeight, + }; + } + + return { + width: calculatedWidth, + height: Math.round(calculatedWidth * aspectRatio), + }; +} diff --git a/src/components/common/helpers/parseEmojiOnlyString.ts b/src/components/common/helpers/parseEmojiOnlyString.ts new file mode 100644 index 000000000..6500e22bf --- /dev/null +++ b/src/components/common/helpers/parseEmojiOnlyString.ts @@ -0,0 +1,29 @@ +// @ts-ignore +import twemojiRegex from '../../../lib/twemojiRegex'; + +const DETECT_UP_TO = 3; +const MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji. +const RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, ''); + +export default (text: string): number | false => { + if (text.length > MAX_LENGTH) { + return false; + } + + const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY)); + if (!isEmojiOnly) { + return false; + } + + let emojiCount = 0; + while (twemojiRegex.exec(text)) { + emojiCount++; + + if (emojiCount > DETECT_UP_TO) { + twemojiRegex.lastIndex = 0; + return false; + } + } + + return emojiCount; +}; diff --git a/src/components/common/helpers/renderActionMessageText.tsx b/src/components/common/helpers/renderActionMessageText.tsx new file mode 100644 index 000000000..552504ac4 --- /dev/null +++ b/src/components/common/helpers/renderActionMessageText.tsx @@ -0,0 +1,193 @@ +import React from '../../../lib/teact/teact'; + +import { ApiChat, ApiMessage, ApiUser } from '../../../api/types'; +import { + getChatTitle, + getMessageContent, + getMessageSummaryText, + getUserFullName, + isChat, +} from '../../../modules/helpers'; +import trimText from '../../../util/trimText'; +import { TextPart } from './renderMessageText'; +import renderText from './renderText'; + +import UserLink from '../UserLink'; +import MessageLink from '../MessageLink'; +import ChatLink from '../ChatLink'; + +interface ActionMessageTextOptions { + maxTextLength?: number; + asPlain?: boolean; + isEmbedded?: boolean; +} + +const NBSP = '\u00A0'; + +export function renderActionMessageText( + message: ApiMessage, + actionOrigin?: ApiUser | ApiChat, + targetUser?: ApiUser, + targetMessage?: ApiMessage, + targetChatId?: number, + options: ActionMessageTextOptions = {}, +) { + if (!message.content.action) { + return []; + } + const { text } = message.content.action; + const content: TextPart[] = []; + const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 16 }; + + let unprocessed: string; + let processed = processPlaceholder( + text, + '%action_origin%', + actionOrigin + ? (!options.isEmbedded && renderOriginContent(actionOrigin, options.asPlain)) || NBSP + : 'User', + ); + + unprocessed = processed.pop() as string; + content.push(...processed); + + processed = processPlaceholder( + unprocessed, + '%target_user%', + targetUser + ? renderUserContent(targetUser, options.asPlain) + : 'User', + ); + + unprocessed = processed.pop() as string; + content.push(...processed); + + processed = processPlaceholder( + unprocessed, + '%message%', + targetMessage + ? renderMessageContent(targetMessage, textOptions) + : 'a message', + ); + unprocessed = processed.pop() as string; + content.push(...processed); + + processed = processPlaceholder( + unprocessed, + '%product%', + targetMessage + ? renderProductContent(targetMessage) + : 'a product', + ); + unprocessed = processed.pop() as string; + content.push(...processed); + + processed = processPlaceholder( + unprocessed, + '%target_chat%', + targetChatId + ? renderMigratedContent(targetChatId, options.asPlain) + : 'another chat', + ); + content.push(...processed); + + if (options.asPlain) { + return content.join('').trim(); + } + + return content; +} + +function renderProductContent(message: ApiMessage) { + return message.content && message.content.invoice + ? message.content.invoice.title + : 'a product'; +} + +function renderMessageContent(message: ApiMessage, options: ActionMessageTextOptions = {}) { + const text = getMessageSummaryText(message); + const { + photo, video, document, sticker, + } = getMessageContent(message); + + const showQuotes = text && !photo && !video && !document && !sticker; + let messageText = trimText(text as string, options.maxTextLength)!; + + if (photo) { + messageText = 'a photo'; + } else if (video) { + messageText = video.isGif ? 'a GIF' : 'a video'; + } else if (document) { + messageText = 'a document'; + } else if (sticker) { + messageText = `«${text}»`; + } + + if (options.asPlain) { + return showQuotes ? `«${messageText}»` : messageText; + } + + if (showQuotes) { + return ( + + « + {renderText(messageText)} + » + + ); + } + + return ( + {renderText(messageText)} + ); +} + +function renderOriginContent(origin: ApiUser | ApiChat, asPlain?: boolean) { + return isChat(origin) + ? renderChatContent(origin, asPlain) + : renderUserContent(origin, asPlain); +} + +function renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined { + const text = trimText(getUserFullName(sender)); + + if (asPlain) { + return text; + } + + return {sender && renderText(text!)}; +} + +function renderChatContent(chat: ApiChat, asPlain?: boolean): string | TextPart | undefined { + const text = trimText(getChatTitle(chat)); + + if (asPlain) { + return text; + } + + return {chat && renderText(text!)}; +} + +function renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined { + const text = 'another chat'; + + if (asPlain) { + return text; + } + + return {text}; +} + +function processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart): TextPart[] { + const placeholderPosition = text.indexOf(placeholder); + if (placeholderPosition < 0 || !replaceValue) { + return [text]; + } + + const content: TextPart[] = []; + content.push(text.substring(0, placeholderPosition)); + content.push(replaceValue); + content.push(text.substring(placeholderPosition + placeholder.length)); + + return content; +} diff --git a/src/components/common/helpers/renderMessageText.tsx b/src/components/common/helpers/renderMessageText.tsx new file mode 100644 index 000000000..d0c026efb --- /dev/null +++ b/src/components/common/helpers/renderMessageText.tsx @@ -0,0 +1,399 @@ +import { MouseEvent } from 'react'; +import React from '../../../lib/teact/teact'; +import { getDispatch } from '../../../lib/teact/teactn'; + +import { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types'; + +import { getMessageText } from '../../../modules/helpers'; +import renderText from './renderText'; + +import MentionLink from '../../middle/message/MentionLink'; +import SafeLink from '../SafeLink'; + +export type TextPart = string | Element; + +export function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) { + const formattedText = message.content.text; + + if (!formattedText || !formattedText.text) { + const rawText = getMessageText(message); + return rawText ? [rawText] : undefined; + } + const { text, entities } = formattedText; + + return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji); +} + +interface IOrganizedEntity { + entity: ApiMessageEntity; + organizedIndexes: Set; + nestedEntities: IOrganizedEntity[]; +} + +function organizeEntity( + entity: ApiMessageEntity, + index: number, + entities: ApiMessageEntity[], + organizedEntityIndexes: Set, +): IOrganizedEntity | undefined { + const { offset, length } = entity; + const organizedIndexes = new Set([index]); + + if (organizedEntityIndexes.has(index)) { + return undefined; + } + + // Determine any nested entities inside current entity + const nestedEntities = entities + .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length) + .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes)) + .filter(Boolean as any); + + nestedEntities.forEach((e) => e.organizedIndexes.forEach((i) => organizedIndexes.add(i))); + + return { + entity, + organizedIndexes, + nestedEntities, + }; +} + +// Organize entities in a tree-like structure to better represent how the text will be displayed +function organizeEntities(entities: ApiMessageEntity[]) { + const organizedEntityIndexes: Set = new Set(); + const organizedEntities: IOrganizedEntity[] = []; + + entities.forEach((entity, index) => { + if (organizedEntityIndexes.has(index)) { + return; + } + + const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes); + if (organizedEntity) { + organizedEntity.organizedIndexes.forEach((organizedIndex) => { + organizedEntityIndexes.add(organizedIndex); + }); + + organizedEntities.push(organizedEntity); + } + }); + + return organizedEntities; +} + +export function renderTextWithEntities( + text: string, + entities?: ApiMessageEntity[], + highlight?: string, + shouldRenderHqEmoji?: boolean, + shouldRenderAsHtml?: boolean, +) { + if (!entities || !entities.length) { + return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml); + } + + const result: TextPart[] = []; + let deleteLineBreakAfterPre = false; + + const organizedEntites = organizeEntities(entities); + + // Recursive function to render regular and nested entities + function renderEntity( + textPartStart: number, + textPartEnd: number, + organizedEntity: IOrganizedEntity, + isLastEntity: boolean, + ) { + const renderResult: TextPart[] = []; + const { entity, nestedEntities } = organizedEntity; + const { offset, length, type } = entity; + + // Render text before the entity + let textBefore = text.substring(textPartStart, offset); + const textBeforeLength = textBefore.length; + if (textBefore) { + if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\n') { + textBefore = textBefore.substr(1); + deleteLineBreakAfterPre = false; + } + if (textBefore) { + renderResult.push(...renderMessagePart( + textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, + ) as TextPart[]); + } + } + + const entityStartIndex = textPartStart + textBeforeLength; + const entityEndIndex = entityStartIndex + length; + + let entityContent: TextPart = text.substring(offset, offset + length); + const nestedEntityContent: TextPart[] = []; + + if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\n') { + entityContent = entityContent.substr(1); + deleteLineBreakAfterPre = false; + } + + if (type === ApiMessageEntityTypes.Pre) { + deleteLineBreakAfterPre = true; + } + + // Render nested entities, if any + if (nestedEntities.length) { + let nestedIndex = entityStartIndex; + + nestedEntities.forEach((nestedEntity, nestedEntityIndex) => { + const { + renderResult: nestedResult, + entityEndIndex: nestedEntityEndIndex, + } = renderEntity( + nestedIndex, + entityEndIndex, + nestedEntity, + nestedEntityIndex === nestedEntities.length - 1, + ); + + nestedEntityContent.push(...nestedResult); + nestedIndex = nestedEntityEndIndex; + }); + } + + // Render the entity itself + const newEntity = shouldRenderAsHtml + ? processEntityAsHtml(entity, entityContent, nestedEntityContent) + : processEntity(entity, entityContent, nestedEntityContent); + + if (Array.isArray(newEntity)) { + renderResult.push(...newEntity); + } else { + renderResult.push(newEntity); + } + + // Render text after the entity, if it is the last entity in the text, + // or the last nested entity inside of another entity + if (isLastEntity && entityEndIndex < textPartEnd) { + let textAfter = text.substring(entityEndIndex, textPartEnd); + if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\n') { + textAfter = textAfter.substring(1); + } + if (textAfter) { + renderResult.push(...renderMessagePart( + textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, + ) as TextPart[]); + } + } + + return { + renderResult, + entityEndIndex, + }; + } + + // Process highest-level entities + let index = 0; + + organizedEntites.forEach((entity, arrayIndex) => { + const { renderResult, entityEndIndex } = renderEntity( + index, + text.length, + entity, + arrayIndex === organizedEntites.length - 1, + ); + + result.push(...renderResult); + index = entityEndIndex; + }); + + return result; +} + +function processEntity( + entity: ApiMessageEntity, + entityContent: TextPart, + nestedEntityContent: TextPart[], +) { + const entityText = typeof entityContent === 'string' && entityContent; + const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent; + + if (!entityText) { + return renderMessagePart(renderedContent); + } + + switch (entity.type) { + case ApiMessageEntityTypes.Bold: + return {renderMessagePart(renderedContent)}; + case ApiMessageEntityTypes.Blockquote: + return
    {renderMessagePart(renderedContent)}
    ; + case ApiMessageEntityTypes.BotCommand: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Hashtag: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Cashtag: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Code: + return {renderMessagePart(renderedContent)}; + case ApiMessageEntityTypes.Email: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Italic: + return {renderMessagePart(renderedContent)}; + case ApiMessageEntityTypes.MentionName: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Mention: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Phone: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Pre: + return
    {renderMessagePart(renderedContent)}
    ; + case ApiMessageEntityTypes.Strike: + return {renderMessagePart(renderedContent)}; + case ApiMessageEntityTypes.TextUrl: + case ApiMessageEntityTypes.Url: + return ( + + {renderMessagePart(renderedContent)} + + ); + case ApiMessageEntityTypes.Underline: + return {renderMessagePart(renderedContent)}; + default: + return renderMessagePart(renderedContent); + } +} + +function renderMessagePart( + content: TextPart | TextPart[], + highlight?: string, + shouldRenderHqEmoji?: boolean, + shouldRenderAsHtml?: boolean, +) { + if (Array.isArray(content)) { + const result: TextPart[] = []; + + content.forEach((c) => { + result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml)); + }); + + return result; + } + + if (shouldRenderAsHtml) { + return renderText(content, ['emoji_html', 'br_html']); + } + + const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji'; + + if (highlight) { + return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight }); + } else { + return renderText(content, [emojiFilter, 'br']); + } +} + +function getLinkUrl(entityContent: string, entity: ApiMessageEntity) { + const { type, url } = entity; + return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent; +} + +function handleBotCommandClick(e: MouseEvent) { + getDispatch().sendBotCommand({ command: e.currentTarget.innerText }); +} + +function handleHashtagClick(e: MouseEvent) { + getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText }); + getDispatch().searchTextMessagesLocal(); +} + +function processEntityAsHtml( + entity: ApiMessageEntity, + entityContent: TextPart, + nestedEntityContent: TextPart[], +) { + const rawEntityText = typeof entityContent === 'string' && entityContent; + + const renderedContent = nestedEntityContent.length + ? nestedEntityContent.join('') + : renderText(entityContent, ['emoji_html', 'br_html']).join(''); + + if (!rawEntityText) { + return renderedContent; + } + + switch (entity.type) { + case ApiMessageEntityTypes.Bold: + return `${renderedContent}`; + case ApiMessageEntityTypes.Italic: + return `${renderedContent}`; + case ApiMessageEntityTypes.Underline: + return `${renderedContent}`; + case ApiMessageEntityTypes.Code: + return `${renderedContent}`; + case ApiMessageEntityTypes.Pre: + return `\`\`\`
    ${renderedContent}
    \`\`\``; + case ApiMessageEntityTypes.Strike: + return `${renderedContent}`; + case ApiMessageEntityTypes.MentionName: + return `${renderedContent}`; + case ApiMessageEntityTypes.Url: + case ApiMessageEntityTypes.TextUrl: + return `${renderedContent}`; + default: + return renderedContent; + } +} diff --git a/src/components/common/helpers/renderText.tsx b/src/components/common/helpers/renderText.tsx new file mode 100644 index 000000000..dfa5104a2 --- /dev/null +++ b/src/components/common/helpers/renderText.tsx @@ -0,0 +1,254 @@ +import React from '../../../lib/teact/teact'; +import EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex'; + +import { RE_LINK_TEMPLATE } from '../../../config'; +import { IS_EMOJI_SUPPORTED } from '../../../util/environment'; +import { nativeToUnfified } from '../../../util/emoji'; +import buildClassName from '../../../util/buildClassName'; + +import MentionLink from '../../middle/message/MentionLink'; +import SafeLink from '../SafeLink'; + +type TextPart = string | Element; + +const RE_LETTER_OR_DIGIT = /^[\d\wа-яё]$/i; +const SIMPLE_MARKDOWN_REGEX = /(\*\*|__).+?\1/g; + +export default function renderText( + part: TextPart, + filters: Array<( + 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' | + 'simple_markdown' | 'simple_markdown_html' + )> = ['emoji'], + params?: { highlight: string | undefined }, +): TextPart[] { + if (typeof part !== 'string') { + return [part]; + } + + return filters.reduce((text, filter) => { + switch (filter) { + case 'escape_html': + return escapeHtml(text); + + case 'hq_emoji': + EMOJI_REGEX.lastIndex = 0; + return replaceEmojis(text, 'big', 'jsx'); + + case 'emoji': + EMOJI_REGEX.lastIndex = 0; + return replaceEmojis(text, 'small', 'jsx'); + + case 'emoji_html': + EMOJI_REGEX.lastIndex = 0; + return replaceEmojis(text, 'small', 'html'); + + case 'br': + return addLineBreaks(text, 'jsx'); + + case 'br_html': + return addLineBreaks(text, 'html'); + + case 'highlight': + return addHighlight(text, params!.highlight); + + case 'links': + return addLinks(text); + + case 'simple_markdown': + return replaceSimpleMarkdown(text, 'jsx'); + + case 'simple_markdown_html': + return replaceSimpleMarkdown(text, 'html'); + } + + return text; + }, [part] as TextPart[]); +} + +function escapeHtml(textParts: TextPart[]): TextPart[] { + const divEl = document.createElement('div'); + return textParts.reduce((result, part) => { + if (typeof part !== 'string') { + return [...result, part]; + } + + divEl.innerText = part; + + return [...result, divEl.innerHTML]; + }, [] as TextPart[]); +} + +function replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] { + if (IS_EMOJI_SUPPORTED) { + return textParts; + } + + return textParts.reduce((result, part) => { + if (typeof part !== 'string') { + return [...result, part]; + } + + const parts = part.split(EMOJI_REGEX); + const emojis = part.match(EMOJI_REGEX) || []; + result.push(parts[0]); + + return emojis.reduce((emojiResult: TextPart[], emoji, i) => { + const code = nativeToUnfified(removeVS16s(emoji)); + const className = buildClassName( + 'emoji', + size === 'small' && 'emoji-small', + ); + if (type === 'jsx') { + emojiResult.push( + {emoji}, + ); + } + if (type === 'html') { + emojiResult.push( + // For preventing extra spaces in html + // eslint-disable-next-line max-len + `${emoji}`, + ); + } + + const index = i * 2 + 2; + if (parts[index]) { + emojiResult.push(parts[index]); + } + + return emojiResult; + }, result); + }, [] as TextPart[]); +} + +function addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] { + return textParts.reduce((result, part) => { + if (typeof part !== 'string') { + return [...result, part]; + } + + return [...result, ...part + .split(/\r\n|\r|\n/g) + .reduce((parts: TextPart[], line: string, i, source) => { + // This adds non-breaking space if line was indented with spaces, to preserve the indentation + const trimmedLine = line.trimLeft(); + const indentLength = line.length - trimmedLine.length; + parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine); + + if (i !== source.length - 1) { + parts.push( + type === 'jsx' ?
    : '
    ', + ); + } + + return parts; + }, [])]; + }, [] as TextPart[]); +} + +function addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] { + return textParts.reduce((result, part) => { + if (typeof part !== 'string' || !highlight) { + return [...result, part]; + } + + const lowerCaseText = part.toLowerCase(); + const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase()); + const nextSymbol = lowerCaseText[queryPosition + highlight.length]; + if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) { + return [...result, part]; + } + + const newParts: TextPart[] = []; + newParts.push(part.substring(0, queryPosition)); + newParts.push( + + {part.substring(queryPosition, queryPosition + highlight.length)} + , + ); + newParts.push(part.substring(queryPosition + highlight.length)); + + return [...result, ...newParts]; + }, [] as TextPart[]); +} + +const RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'ig'); +const RE_MENTION = /@[\w\d_-]+/ig; + +function addLinks(textParts: TextPart[]): TextPart[] { + return textParts.reduce((result, part) => { + if (typeof part !== 'string') { + return [...result, part]; + } + + const links = [...(part.match(RE_LINK) || []), ...(part.match(RE_MENTION) || [])]; + if (!links.length) { + return [...result, part]; + } + + const content: TextPart[] = []; + + let nextLink = links.shift(); + let lastIndex = 0; + while (nextLink) { + const index = part.indexOf(nextLink, lastIndex); + content.push(part.substring(lastIndex, index)); + if (nextLink.startsWith('@')) { + content.push( + + {nextLink} + , + ); + } else { + content.push( + , + ); + } + lastIndex = index + nextLink.length; + nextLink = links.shift(); + } + content.push(part.substring(lastIndex)); + + return [...result, ...content]; + }, [] as TextPart[]); +} + +function replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] { + return textParts.reduce((result, part) => { + if (typeof part !== 'string') { + return [...result, part]; + } + + const parts = part.split(SIMPLE_MARKDOWN_REGEX); + const entities = part.match(SIMPLE_MARKDOWN_REGEX) || []; + result.push(parts[0]); + + return entities.reduce((entityResult: TextPart[], entity, i) => { + if (type === 'jsx') { + entityResult.push( + entity.startsWith('**') + ? {entity.replace(/\*\*/g, '')} + : {entity.replace(/__/g, '')}, + ); + } else { + entityResult.push( + entity.startsWith('**') + ? `${entity.replace(/\*\*/g, '')}` + : `${entity.replace(/__/g, '')}`, + ); + } + + const index = i * 2 + 2; + if (parts[index]) { + entityResult.push(parts[index]); + } + + return entityResult; + }, result); + }, [] as TextPart[]); +} diff --git a/src/components/common/helpers/waveform.ts b/src/components/common/helpers/waveform.ts new file mode 100644 index 000000000..1738ffe2c --- /dev/null +++ b/src/components/common/helpers/waveform.ts @@ -0,0 +1,63 @@ +type IWaveformProps = { + peak: number; + fillStyle: string; + progressFillStyle: string; +}; + +const SPIKE_WIDTH = 2; +const SPIKE_STEP = 4; +const SPIKE_RADIUS = 1; +const HEIGHT = 23; + +export function renderWaveformToDataUri( + spikes: number[], + progress: number, + { + peak, fillStyle, progressFillStyle, + }: IWaveformProps, +) { + const width = spikes.length * SPIKE_STEP; + const height = HEIGHT; + + const canvas = document.createElement('canvas'); + canvas.width = width * 2; + canvas.height = height * 2; + canvas.style.width = `${width}px`; + canvas.style.height = `${height}px`; + + const ctx = canvas.getContext('2d')!; + ctx.scale(2, 2); + + spikes.forEach((item, i) => { + ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1; + ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle; + const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak))); + roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS); + ctx.fill(); + }); + + return { + src: canvas.toDataURL(), + width, + height, + }; +} + +function roundedRectangle( + ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, +) { + if (width < 2 * radius) { + radius = width / 2; + } + if (height < 2 * radius) { + radius = height / 2; + } + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.arcTo(x + width, y, x + width, y - height, radius); + ctx.arcTo(x + width, y - height, x, y - height, radius); + ctx.arcTo(x, y - height, x, y, radius); + ctx.arcTo(x, y, x + width, y, radius); + ctx.closePath(); +} diff --git a/src/components/left/ArchivedChats.async.tsx b/src/components/left/ArchivedChats.async.tsx new file mode 100644 index 000000000..e6c2cdcab --- /dev/null +++ b/src/components/left/ArchivedChats.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './ArchivedChats'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const ArchivedChatsAsync: FC = (props) => { + const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ArchivedChats ? : ; +}; + +export default ArchivedChatsAsync; diff --git a/src/components/left/ArchivedChats.scss b/src/components/left/ArchivedChats.scss new file mode 100644 index 000000000..86344dbd1 --- /dev/null +++ b/src/components/left/ArchivedChats.scss @@ -0,0 +1,8 @@ +.ArchivedChats { + height: 100%; + overflow: hidden; + + .chat-list { + height: calc(100% - var(--header-height)); + } +} diff --git a/src/components/left/ArchivedChats.tsx b/src/components/left/ArchivedChats.tsx new file mode 100644 index 000000000..009d9000d --- /dev/null +++ b/src/components/left/ArchivedChats.tsx @@ -0,0 +1,36 @@ +import React, { FC, memo } from '../../lib/teact/teact'; + +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import ChatList from './main/ChatList'; + +import './ArchivedChats.scss'; + +export type OwnProps = { + onReset: () => void; +}; + +const ArchivedChats: FC = ({ onReset }) => { + const lang = useLang(); + + return ( +
    +
    + +

    {lang('ArchivedChats')}

    +
    + +
    + ); +}; + +export default memo(ArchivedChats); diff --git a/src/components/left/ConnectionState.scss b/src/components/left/ConnectionState.scss new file mode 100644 index 000000000..195e3d773 --- /dev/null +++ b/src/components/left/ConnectionState.scss @@ -0,0 +1,27 @@ +#ConnectionState { + flex: 0 0 auto; + display: flex; + align-items: center; + margin: 0 0.5rem 0.5rem; + padding: 0.75rem; + background: var(--color-yellow); + border-radius: var(--border-radius-default); + + > .Spinner { + --spinner-size: 1.75rem; + } + + > .state-text { + color: var(--color-text-lighter); + font-weight: 500; + line-height: 2rem; + margin-left: 1.9rem; + white-space: nowrap; + } + + @media (max-width: 950px) { + > .state-text { + margin-left: 1.2rem; + } + } +} diff --git a/src/components/left/ConnectionState.tsx b/src/components/left/ConnectionState.tsx new file mode 100644 index 000000000..0c348ddf6 --- /dev/null +++ b/src/components/left/ConnectionState.tsx @@ -0,0 +1,30 @@ +import React, { FC } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalState } from '../../global/types'; + +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Spinner from '../ui/Spinner'; + +import './ConnectionState.scss'; + +type StateProps = Pick; + +const ConnectionState: FC = ({ connectionState }) => { + const lang = useLang(); + + const isConnecting = connectionState === 'connectionStateConnecting'; + + return isConnecting && ( +
    + +
    {lang('WaitingForNetwork')}
    +
    + ); +}; + +export default withGlobal( + (global): StateProps => pick(global, ['connectionState']), +)(ConnectionState); diff --git a/src/components/left/LeftColumn.scss b/src/components/left/LeftColumn.scss new file mode 100644 index 000000000..484dc9088 --- /dev/null +++ b/src/components/left/LeftColumn.scss @@ -0,0 +1,36 @@ +#LeftColumn { + overflow: hidden; +} + +#NewChat { + height: 100%; +} + +.left-header { + height: var(--header-height); + padding: 0.375rem 1.25rem .5rem 0.8125rem; + display: flex; + align-items: center; + flex-shrink: 0; + background-color: var(--color-background); + + h3 { + margin-bottom: 0; + font-size: 1.25rem; + font-weight: 500; + margin-left: 1.375rem; + } + + .SearchInput { + margin-left: 0.875rem; + max-width: calc(100% - 3.625rem); + + @media (max-width: 600px) { + max-width: calc(100% - 3.375rem); + } + } + + @media (max-width: 600px) { + padding: 0.5rem; + } +} diff --git a/src/components/left/LeftColumn.tsx b/src/components/left/LeftColumn.tsx new file mode 100644 index 000000000..8348eacee --- /dev/null +++ b/src/components/left/LeftColumn.tsx @@ -0,0 +1,297 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { LeftColumnContent, SettingsScreens } from '../../types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; +import { pick } from '../../util/iteratees'; + +import Transition from '../ui/Transition'; +import LeftMain from './main/LeftMain'; +import Settings from './settings/Settings.async'; +import NewChat from './newChat/NewChat.async'; +import ArchivedChats from './ArchivedChats.async'; + +import './LeftColumn.scss'; + +type StateProps = { + searchQuery?: string; + searchDate?: number; +}; + +type DispatchProps = Pick; + +enum ContentType { + Main, + // eslint-disable-next-line no-shadow + Settings, + Archived, + // eslint-disable-next-line no-shadow + NewGroup, + // eslint-disable-next-line no-shadow + NewChannel +} + +const RENDER_COUNT = Object.keys(ContentType).length / 2; +const RESET_TRANSITION_DELAY_MS = 250; + +const LeftColumn: FC = ({ + searchQuery, + searchDate, + setGlobalSearchQuery, + setGlobalSearchChatId, + resetChatCreation, + setGlobalSearchDate, + loadPasswordInfo, + clearTwoFaError, +}) => { + const [content, setContent] = useState(LeftColumnContent.ChatList); + const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main); + const [contactsFilter, setContactsFilter] = useState(''); + + // Used to reset child components in background. + const [lastResetTime, setLastResetTime] = useState(0); + + let contentType: ContentType = ContentType.Main; + switch (content) { + case LeftColumnContent.Archived: + contentType = ContentType.Archived; + break; + case LeftColumnContent.Settings: + contentType = ContentType.Settings; + break; + case LeftColumnContent.NewChannelStep1: + case LeftColumnContent.NewChannelStep2: + contentType = ContentType.NewChannel; + break; + case LeftColumnContent.NewGroupStep1: + case LeftColumnContent.NewGroupStep2: + contentType = ContentType.NewGroup; + break; + } + + const handleReset = useCallback((forceReturnToChatList?: boolean) => { + if ( + content === LeftColumnContent.NewGroupStep2 + && !forceReturnToChatList + ) { + setContent(LeftColumnContent.NewGroupStep1); + return; + } + + if (content === LeftColumnContent.NewGroupStep1) { + const pickerSearchInput = document.getElementById('new-group-picker-search'); + if (pickerSearchInput) { + pickerSearchInput.blur(); + } + } + + if (content === LeftColumnContent.Settings) { + switch (settingsScreen) { + case SettingsScreens.EditProfile: + case SettingsScreens.Folders: + case SettingsScreens.General: + case SettingsScreens.Notifications: + case SettingsScreens.Privacy: + case SettingsScreens.Language: + setSettingsScreen(SettingsScreens.Main); + return; + + case SettingsScreens.GeneralChatBackground: + setSettingsScreen(SettingsScreens.General); + return; + case SettingsScreens.GeneralChatBackgroundColor: + setSettingsScreen(SettingsScreens.GeneralChatBackground); + return; + + case SettingsScreens.PrivacyPhoneNumber: + case SettingsScreens.PrivacyLastSeen: + case SettingsScreens.PrivacyProfilePhoto: + case SettingsScreens.PrivacyForwarding: + case SettingsScreens.PrivacyGroupChats: + case SettingsScreens.PrivacyActiveSessions: + case SettingsScreens.PrivacyBlockedUsers: + case SettingsScreens.TwoFaDisabled: + case SettingsScreens.TwoFaEnabled: + case SettingsScreens.TwoFaCongratulations: + setSettingsScreen(SettingsScreens.Privacy); + return; + case SettingsScreens.PrivacyPhoneNumberAllowedContacts: + case SettingsScreens.PrivacyPhoneNumberDeniedContacts: + setSettingsScreen(SettingsScreens.PrivacyPhoneNumber); + return; + case SettingsScreens.PrivacyLastSeenAllowedContacts: + case SettingsScreens.PrivacyLastSeenDeniedContacts: + setSettingsScreen(SettingsScreens.PrivacyLastSeen); + return; + case SettingsScreens.PrivacyProfilePhotoAllowedContacts: + case SettingsScreens.PrivacyProfilePhotoDeniedContacts: + setSettingsScreen(SettingsScreens.PrivacyProfilePhoto); + return; + case SettingsScreens.PrivacyForwardingAllowedContacts: + case SettingsScreens.PrivacyForwardingDeniedContacts: + setSettingsScreen(SettingsScreens.PrivacyForwarding); + return; + case SettingsScreens.PrivacyGroupChatsAllowedContacts: + case SettingsScreens.PrivacyGroupChatsDeniedContacts: + setSettingsScreen(SettingsScreens.PrivacyGroupChats); + return; + case SettingsScreens.TwoFaNewPassword: + setSettingsScreen(SettingsScreens.TwoFaDisabled); + return; + case SettingsScreens.TwoFaNewPasswordConfirm: + setSettingsScreen(SettingsScreens.TwoFaNewPassword); + return; + case SettingsScreens.TwoFaNewPasswordHint: + setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm); + return; + case SettingsScreens.TwoFaNewPasswordEmail: + setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint); + return; + case SettingsScreens.TwoFaNewPasswordEmailCode: + setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail); + return; + case SettingsScreens.TwoFaChangePasswordCurrent: + case SettingsScreens.TwoFaTurnOff: + case SettingsScreens.TwoFaRecoveryEmailCurrentPassword: + setSettingsScreen(SettingsScreens.TwoFaEnabled); + return; + case SettingsScreens.TwoFaChangePasswordNew: + setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent); + return; + case SettingsScreens.TwoFaChangePasswordConfirm: + setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew); + return; + case SettingsScreens.TwoFaChangePasswordHint: + setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm); + return; + case SettingsScreens.TwoFaRecoveryEmail: + setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword); + return; + case SettingsScreens.TwoFaRecoveryEmailCode: + setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail); + return; + + case SettingsScreens.FoldersCreateFolder: + case SettingsScreens.FoldersEditFolder: + setSettingsScreen(SettingsScreens.Folders); + return; + default: + break; + } + } + + setContent(LeftColumnContent.ChatList); + setContactsFilter(''); + setGlobalSearchQuery({ query: '' }); + setGlobalSearchDate({ date: undefined }); + setGlobalSearchChatId({ id: undefined }); + resetChatCreation(); + setTimeout(() => { + setLastResetTime(Date.now()); + }, RESET_TRANSITION_DELAY_MS); + }, [content, setGlobalSearchQuery, setGlobalSearchChatId, setGlobalSearchDate, resetChatCreation, settingsScreen]); + + const handleSearchQuery = useCallback((query: string) => { + if (content === LeftColumnContent.Contacts) { + setContactsFilter(query); + return; + } + + setContent(LeftColumnContent.GlobalSearch); + + if (query !== searchQuery) { + setGlobalSearchQuery({ query }); + } + }, [content, setGlobalSearchQuery, searchQuery]); + + useEffect( + () => (content !== LeftColumnContent.ChatList ? captureEscKeyListener(() => handleReset()) : undefined), + [content, handleReset], + ); + + useEffect(() => { + clearTwoFaError(); + + if (settingsScreen === SettingsScreens.Privacy) { + loadPasswordInfo(); + } + }, [clearTwoFaError, loadPasswordInfo, settingsScreen]); + + return ( + + {() => { + switch (contentType) { + case ContentType.Archived: + return ( + + ); + case ContentType.Settings: + return ( + + ); + case ContentType.NewChannel: + return ( + + ); + case ContentType.NewGroup: + return ( + + ); + default: + return ( + + ); + } + }} + + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { query, date } = global.globalSearch; + return { searchQuery: query, searchDate: date }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate', + 'loadPasswordInfo', 'clearTwoFaError', + ]), +)(LeftColumn)); diff --git a/src/components/left/NewChatButton.scss b/src/components/left/NewChatButton.scss new file mode 100644 index 000000000..6f65655ee --- /dev/null +++ b/src/components/left/NewChatButton.scss @@ -0,0 +1,78 @@ +.NewChatButton { + position: absolute; + right: 1rem; + bottom: 1rem; + transform: translateY(5rem); + + transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1); + + body.animation-level-0 & { + transform: none !important; + opacity: 0; + + transition: opacity .15s; + + &.revealed { + opacity: 1; + } + } + + &.revealed { + transform: translateY(0); + @media (max-width: 600px) { + // Force rendering in the composite layer to fix the z-index rendering issue + transform: translate3d(0,0,10px); + transform-style: preserve-3d; + } + } + + &.menu-is-open { + &::before { + content: ''; + display: block; + position: absolute; + top: -13rem; + left: -11rem; + right: -1rem; + bottom: -1rem; + z-index: -1; + } + } + + .is-touch-env & { + .Menu > .backdrop { + position: absolute; + left: -100vw; + right: -100vw; + top: -100vh; + bottom: -100vh; + } + } + + > .Button { + .icon-new-chat-filled, + .icon-close { + position: absolute; + } + + &:not(.active) { + .icon-new-chat-filled { + animation: grow-icon .4s ease-out; + } + + .icon-close { + animation: hide-icon .4s forwards ease-out; + } + } + + &.active { + .icon-close { + animation: grow-icon .4s ease-out; + } + + .icon-new-chat-filled { + animation: hide-icon .4s forwards ease-out; + } + } + } +} diff --git a/src/components/left/NewChatButton.tsx b/src/components/left/NewChatButton.tsx new file mode 100644 index 000000000..356a99837 --- /dev/null +++ b/src/components/left/NewChatButton.tsx @@ -0,0 +1,104 @@ +import React, { + FC, useCallback, useState, useEffect, memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import Menu from '../ui/Menu'; +import MenuItem from '../ui/MenuItem'; + +import './NewChatButton.scss'; + +const MENU_CLOSE_DELAY_MS = 750; +let closeTimeout: number | undefined; + +type OwnProps = { + isShown: boolean; + onNewPrivateChat: () => void; + onNewChannel: () => void; + onNewGroup: () => void; +}; + +const NewChatButton: FC = ({ + isShown, + onNewPrivateChat, + onNewChannel, + onNewGroup, +}) => { + const [isMenuOpen, setIsMenuOpen] = useState(false); + + useEffect(() => { + if (!isShown) { + setIsMenuOpen(false); + } + }, [isShown]); + + const lang = useLang(); + + const fabClassName = buildClassName( + 'NewChatButton', + isShown && 'revealed', + isMenuOpen && 'menu-is-open', + ); + + const toggleIsMenuOpen = () => { + setIsMenuOpen(!isMenuOpen); + }; + + const handleClose = () => { + setIsMenuOpen(false); + }; + + const handleMouseEnter = useCallback(() => { + if (closeTimeout) { + clearTimeout(closeTimeout); + closeTimeout = undefined; + } + }, []); + + const handleMouseLeave = useCallback(() => { + if (closeTimeout) { + clearTimeout(closeTimeout); + closeTimeout = undefined; + } + + closeTimeout = window.setTimeout(() => { + setIsMenuOpen(false); + }, MENU_CLOSE_DELAY_MS); + }, []); + + return ( +
    + + + {lang('NewChannel')} + {lang('NewGroup')} + New Private Chat + +
    + ); +}; + +export default memo(NewChatButton); diff --git a/src/components/left/main/Badge.scss b/src/components/left/main/Badge.scss new file mode 100644 index 000000000..94df86c87 --- /dev/null +++ b/src/components/left/main/Badge.scss @@ -0,0 +1,66 @@ +.Badge-transition { + transform: scale(1); + opacity: 1; + transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1); + + &:not(.open) { + transform: scale(0); + opacity: 0; + } + + &:not(.shown) { + display: none; + } + + &.closing { + transition: transform .2s ease-out, opacity .2s ease-out; + } +} + +.Badge-wrapper { + display: flex; + margin-left: 1.5rem; + + .Badge { + margin-left: 0.5rem; + } +} + +.Badge { + min-width: 1.5rem; + height: 1.5rem; + background: var(--color-gray); + border-radius: 0.75rem; + padding: 0 .45rem; + color: white; + font-size: 0.875rem; + line-height: 1.5rem; + font-weight: 500; + text-align: center; + flex-shrink: 0; + + &.mention, &.unread:not(.muted) { + background: var(--color-green); + } + + &.pinned { + width: 1.5rem; + padding: 0; + + i { + font-size: 1.5rem; + } + } + + &.mention { + width: 1.5rem; + padding: 0.25rem; + + i { + font-size: 1rem; + vertical-align: super; + } + } +} + + diff --git a/src/components/left/main/Badge.tsx b/src/components/left/main/Badge.tsx new file mode 100644 index 000000000..67f0b109d --- /dev/null +++ b/src/components/left/main/Badge.tsx @@ -0,0 +1,68 @@ +import React, { FC } from '../../../lib/teact/teact'; + +import { ApiChat } from '../../../api/types'; + +import { formatIntegerCompact } from '../../../util/textFormat'; +import buildClassName from '../../../util/buildClassName'; + +import ShowTransition from '../../ui/ShowTransition'; + +import './Badge.scss'; + +type OwnProps = { + chat: ApiChat; + isPinned?: boolean; +}; + +const Badge: FC = ({ chat, isPinned }) => { + const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned); + const className = buildClassName( + 'Badge', + chat.isMuted && 'muted', + isPinned && 'pinned', + Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread', + ); + + function renderContent() { + if (chat.unreadCount) { + if (chat.unreadMentionsCount) { + return ( +
    +
    + +
    +
    + {formatIntegerCompact(chat.unreadCount)} +
    +
    + ); + } + + return ( +
    + {formatIntegerCompact(chat.unreadCount)} +
    + ); + } else if (chat.hasUnreadMark) { + return ( +
    + ); + } else if (isPinned) { + return ( +
    + +
    + ); + } + + return undefined; + } + + return ( + + {renderContent} + + ); +}; + +export default Badge; diff --git a/src/components/left/main/Chat.scss b/src/components/left/main/Chat.scss new file mode 100644 index 000000000..9de407746 --- /dev/null +++ b/src/components/left/main/Chat.scss @@ -0,0 +1,100 @@ +.Chat { + --background-color: white; + + position: absolute; + top: 0; + left: 0; + margin: 0; + width: 100%; + + &.animate-opacity { + will-change: opacity; + transition: opacity .2s ease-out; + } + + &.animate-transform { + will-change: transform; + transition: transform .2s ease-out; + } + + &:hover, &.selected, &.ListItem.has-menu-open { + .Avatar.online::after { + border-color: var(--color-chat-hover); + } + } + + &.selected { + --background-color: var(--color-chat-hover); + } + + .info { + .title, .subtitle { + padding-right: .15rem; + } + + h3 { + width: auto; + max-width: 80%; + } + + .icon-muted-chat { + font-size: 1.2rem; + margin-left: 0.25rem; + margin-top: -0.1rem; + color: #C6C8CA; + } + + .LastMessageMeta { + margin-left: auto; + } + + .last-message, .typing-status { + padding-right: 0.25rem; + flex-grow: 1; + color: var(--color-text-secondary); + + .sender-name { + color: var(--color-text); + } + + .draft { + color: var(--color-error); + } + } + + .last-message { + .sender-name, .draft { + &::after { + content: ': '; + } + } + + .media-preview { + position: relative; + } + + img { + width: 1.25rem; + height: 1.25rem; + object-fit: cover; + border-radius: .125rem; + vertical-align: -.25rem; + margin-right: .25rem; + } + + .emoji-small { + width: 1rem; + height: 1rem; + vertical-align: -.125rem; + } + + .icon-play { + font-size: .75rem; + color: #fff; + position: absolute; + left: .25rem; + top: .1875rem; + } + } + } +} diff --git a/src/components/left/main/Chat.tsx b/src/components/left/main/Chat.tsx new file mode 100644 index 000000000..e77daeccd --- /dev/null +++ b/src/components/left/main/Chat.tsx @@ -0,0 +1,325 @@ +import React, { + FC, memo, useCallback, useLayoutEffect, useRef, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import useLang from '../../../hooks/useLang'; + +import { GlobalActions, MessageListType } from '../../../global/types'; +import { + ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID, +} from '../../../api/types'; + +import { ANIMATION_END_DELAY } from '../../../config'; +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { + getChatTitle, + isChatPrivate, + isActionMessage, + getPrivateChatUserId, + getMessageAction, + getMessageSenderName, + isChatChannel, + getMessageMediaHash, + getMessageSummaryText, + getMessageMediaThumbDataUri, + getMessageVideo, + getMessageSticker, +} from '../../../modules/helpers'; +import { + selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList, +} from '../../../modules/selectors'; +import { renderActionMessageText } from '../../common/helpers/renderActionMessageText'; +import renderText from '../../common/helpers/renderText'; +import { fastRaf } from '../../../util/schedulers'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import useEnsureMessage from '../../../hooks/useEnsureMessage'; +import useChatContextActions from '../../../hooks/useChatContextActions'; +import useFlag from '../../../hooks/useFlag'; +import useMedia from '../../../hooks/useMedia'; +import { ChatAnimationTypes } from './hooks'; + +import Avatar from '../../common/Avatar'; +import VerifiedIcon from '../../common/VerifiedIcon'; +import TypingStatus from '../../common/TypingStatus'; +import LastMessageMeta from '../../common/LastMessageMeta'; +import DeleteChatModal from '../../common/DeleteChatModal'; +import ListItem from '../../ui/ListItem'; +import Badge from './Badge'; + +import './Chat.scss'; + +type OwnProps = { + style?: string; + chatId: number; + folderId?: number; + orderDiff: number; + animationType: ChatAnimationTypes; + isSelected: boolean; + isPinned?: boolean; +}; + +type StateProps = { + chat?: ApiChat; + privateChatUser?: ApiUser; + actionTargetUser?: ApiUser; + actionTargetMessage?: ApiMessage; + actionTargetChatId?: number; + lastMessageSender?: ApiUser; + lastMessageOutgoingStatus?: ApiMessageOutgoingStatus; + draft?: ApiFormattedText; + messageListType?: MessageListType; + animationLevel?: number; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const ANIMATION_DURATION = 200; + +const Chat: FC = ({ + style, + chatId, + folderId, + orderDiff, + animationType, + isSelected, + isPinned, + chat, + privateChatUser, + actionTargetUser, + lastMessageSender, + lastMessageOutgoingStatus, + actionTargetMessage, + actionTargetChatId, + draft, + messageListType, + animationLevel, + lastSyncTime, + openChat, + focusLastMessage, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag(); + + const { lastMessage, typingStatus } = chat || {}; + const isAction = lastMessage && isActionMessage(lastMessage); + + useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage); + + const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage) + ? getMessageMediaThumbDataUri(lastMessage) + : undefined; + const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined); + + // Sets animation excess values when `orderDiff` changes and then resets excess values to animate. + useLayoutEffect(() => { + if (animationLevel === 0) { + return; + } + + const element = ref.current!; + + // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType` + if (animationType === ChatAnimationTypes.Opacity) { + element.style.opacity = '0'; + + fastRaf(() => { + element.classList.add('animate-opacity'); + element.style.opacity = '1'; + }); + } else if (animationType === ChatAnimationTypes.Move) { + element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`; + + fastRaf(() => { + element.classList.add('animate-transform'); + element.style.transform = ''; + }); + } else { + return; + } + + setTimeout(() => { + fastRaf(() => { + element.classList.remove('animate-opacity', 'animate-transform'); + element.style.opacity = ''; + element.style.transform = ''; + }); + }, ANIMATION_DURATION + ANIMATION_END_DELAY); + }, [animationLevel, orderDiff, animationType]); + + const handleClick = useCallback(() => { + openChat({ id: chatId }); + + if (isSelected && messageListType === 'thread') { + focusLastMessage(); + } + }, [ + isSelected, + messageListType, + openChat, + chatId, + focusLastMessage, + ]); + + const contextActions = useChatContextActions({ + chat, + privateChatUser, + handleDelete: openDeleteModal, + folderId, + isPinned, + }); + + const lang = useLang(); + + if (!chat) { + return undefined; + } + + function renderLastMessageOrTyping() { + if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) { + return ; + } + + if (draft && draft.text.length) { + return ( +

    + {lang('Draft')} + {renderText(draft.text)} +

    + ); + } + + if (!lastMessage) { + return undefined; + } + + if (isAction) { + const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId) + ? chat + : lastMessageSender; + + return ( +

    + {renderText(renderActionMessageText( + lastMessage, + actionOrigin, + actionTargetUser, + actionTargetMessage, + actionTargetChatId, + { asPlain: true }, + ) as string)} +

    + ); + } + + const senderName = getMessageSenderName(chatId, lastMessageSender); + + return ( +

    + {senderName && ( + {renderText(senderName)} + )} + {renderMessageSummary(lastMessage!, mediaBlobUrl || mediaThumbnail)} +

    + ); + } + + const className = buildClassName( + 'Chat chat-item-clickable', + isChatPrivate(chatId) ? 'private' : 'group', + isSelected && 'selected', + ); + + return ( + + +
    +
    +

    {renderText(getChatTitle(chat, privateChatUser))}

    + {chat.isVerified && } + {chat.isMuted && } + {chat.lastMessage && ( + + )} +
    +
    + {renderLastMessageOrTyping()} + +
    +
    + +
    + ); +}; + +function renderMessageSummary(message: ApiMessage, blobUrl?: string) { + if (!blobUrl) { + return renderText(getMessageSummaryText(message)); + } + + return ( + + + {getMessageVideo(message) && } + {renderText(getMessageSummaryText(message, true))} + + ); +} + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + if (!chat || !chat.lastMessage) { + return {}; + } + + const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage; + const lastMessageSender = senderId ? selectUser(global, senderId) : undefined; + const lastMessageAction = getMessageAction(chat.lastMessage); + const actionTargetMessage = lastMessageAction && replyToMessageId + ? selectChatMessage(global, chat.id, replyToMessageId) + : undefined; + const { targetUserId: actionTargetUserId, targetChatId: actionTargetChatId } = lastMessageAction || {}; + const privateChatUserId = getPrivateChatUserId(chat); + const { type: messageListType } = selectCurrentMessageList(global) || {}; + + return { + chat, + lastMessageSender, + ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }), + ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }), + ...(actionTargetUserId && { actionTargetUser: selectUser(global, actionTargetUserId) }), + actionTargetChatId, + actionTargetMessage, + draft: selectDraft(global, chatId, MAIN_THREAD_ID), + messageListType, + animationLevel: global.settings.byKey.animationLevel, + lastSyncTime: global.lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChat', + 'focusLastMessage', + ]), +)(Chat)); diff --git a/src/components/left/main/ChatFolders.tsx b/src/components/left/main/ChatFolders.tsx new file mode 100644 index 000000000..b65a1c9a3 --- /dev/null +++ b/src/components/left/main/ChatFolders.tsx @@ -0,0 +1,182 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { IS_TOUCH_ENV } from '../../../util/environment'; +import { buildCollectionByKey, pick } from '../../../util/iteratees'; +import { captureEvents, SwipeDirection } from '../../../util/captureEvents'; +import { getFolderUnreadDialogs } from '../../../modules/helpers'; +import useShowTransition from '../../../hooks/useShowTransition'; +import buildClassName from '../../../util/buildClassName'; +import useThrottledMemo from '../../../hooks/useThrottledMemo'; +import useLang from '../../../hooks/useLang'; + +import Transition from '../../ui/Transition'; +import TabList from '../../ui/TabList'; +import ChatList from './ChatList'; + +type StateProps = { + chatsById: Record; + usersById: Record; + chatFoldersById: Record; + orderedFolderIds?: number[]; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const INFO_THROTTLE = 3000; + +const ChatFolders: FC = ({ + chatsById, + usersById, + chatFoldersById, + orderedFolderIds, + lastSyncTime, + loadChatFolders, +}) => { + // eslint-disable-next-line no-null/no-null + const transitionRef = useRef(null); + + const [activeTab, setActiveTab] = useState(0); + + useEffect(() => { + if (lastSyncTime) { + loadChatFolders(); + } + }, [lastSyncTime, loadChatFolders]); + + const displayedFolders = useMemo(() => { + return orderedFolderIds + ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean) + : undefined; + }, [chatFoldersById, orderedFolderIds]); + + const folderCountersById = useThrottledMemo(() => { + if (!displayedFolders || !displayedFolders.length) { + return undefined; + } + + const chatIds = Object.keys(chatsById).map(Number); + const counters = displayedFolders.map((folder) => { + const { + unreadDialogsCount, hasActiveDialogs, + } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds) || {}; + + return { + id: folder.id, + badgeCount: unreadDialogsCount, + isBadgeActive: hasActiveDialogs, + }; + }); + + return buildCollectionByKey(counters, 'id'); + }, INFO_THROTTLE, [displayedFolders, chatsById, usersById]); + + const folderTabs = useMemo(() => { + if (!displayedFolders || !displayedFolders.length) { + return undefined; + } + + return [ + { title: 'All' }, + ...displayedFolders.map((folder) => ({ + title: folder.title, + ...(folderCountersById && folderCountersById[folder.id]), + })), + ]; + }, [displayedFolders, folderCountersById]); + + const handleSwitchTab = useCallback((index: number) => { + setActiveTab(index); + }, []); + + // Prevent `activeTab` pointing at non-existing folder after update + useEffect(() => { + if (!folderTabs || !folderTabs.length) { + return; + } + + if (activeTab >= folderTabs.length) { + setActiveTab(0); + } + }, [activeTab, folderTabs]); + + useEffect(() => { + if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) { + return undefined; + } + + return captureEvents(transitionRef.current, { + onSwipe: ((e, direction) => { + if (direction === SwipeDirection.Left) { + setActiveTab(Math.min(activeTab + 1, folderTabs.length - 1)); + } else if (direction === SwipeDirection.Right) { + setActiveTab(Math.max(0, activeTab - 1)); + } + }), + }); + }, [activeTab, folderTabs]); + + const { + shouldRender: shouldRenderPlaceholder, transitionClassNames, + } = useShowTransition(!orderedFolderIds, undefined, true); + + const lang = useLang(); + + function renderCurrentTab() { + const activeFolder = Object.values(chatFoldersById) + .find(({ title }) => title === folderTabs![activeTab].title); + + if (!activeFolder || activeTab === 0) { + return ; + } + + return ; + } + + return ( +
    + {folderTabs && folderTabs.length ? ( + + ) : shouldRenderPlaceholder ? ( +
    + ) : undefined} + + {renderCurrentTab} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + chats: { byId: chatsById }, + users: { byId: usersById }, + chatFolders: { + byId: chatFoldersById, + orderedIds: orderedFolderIds, + }, + lastSyncTime, + } = global; + + return { + chatsById, + usersById, + chatFoldersById, + orderedFolderIds, + lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadChatFolders']), +)(ChatFolders)); diff --git a/src/components/left/main/ChatList.tsx b/src/components/left/main/ChatList.tsx new file mode 100644 index 000000000..2d2ae157a --- /dev/null +++ b/src/components/left/main/ChatList.tsx @@ -0,0 +1,208 @@ +import React, { + FC, memo, useMemo, useCallback, useEffect, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { + ApiChat, ApiChatFolder, ApiUser, MAIN_THREAD_ID, +} from '../../../api/types'; + +import { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config'; +import { IS_ANDROID } from '../../../util/environment'; +import usePrevious from '../../../hooks/usePrevious'; +import { mapValues, pick } from '../../../util/iteratees'; +import { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers'; +import { selectChatFolder, selectCurrentMessageList } from '../../../modules/selectors'; +import useInfiniteScroll from '../../../hooks/useInfiniteScroll'; +import { useChatAnimationType } from './hooks'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import Loading from '../../ui/Loading'; +import Chat from './Chat'; + +type OwnProps = { + folderType: 'all' | 'archived' | 'folder'; + folderId?: number; + noChatsText?: string; +}; + +type StateProps = { + chatsById: Record; + usersById: Record; + chatFolder?: ApiChatFolder; + listIds?: number[]; + currentChatId?: number; + orderedPinnedIds?: number[]; + lastSyncTime?: number; + isInDiscussionThread?: boolean; +}; + +type DispatchProps = Pick; + +enum FolderTypeToListType { + 'all' = 'active', + 'archived' = 'archived' +} + +const ChatList: FC = ({ + folderType, + folderId, + noChatsText = 'Chat list is empty.', + chatFolder, + chatsById, + usersById, + listIds, + currentChatId, + orderedPinnedIds, + lastSyncTime, + isInDiscussionThread, + loadMoreChats, + preloadTopChatMessages, +}) => { + const [currentListIds, currentPinnedIds] = useMemo(() => { + return folderType === 'folder' && chatFolder + ? prepareFolderListIds(chatsById, usersById, chatFolder) + : [listIds, orderedPinnedIds]; + }, [folderType, chatsById, usersById, chatFolder, listIds, orderedPinnedIds]); + + const [orderById, orderedIds] = useMemo(() => { + if (!currentListIds || (folderType === 'folder' && !chatFolder)) { + return []; + } + const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType); + const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats]; + const newOrderedIds = singleList.map(({ id }) => id); + const newOrderById = singleList.reduce((acc, chat, i) => { + acc[chat.id] = i; + return acc; + }, {} as Record); + + return [newOrderById, newOrderedIds]; + }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]); + + const prevOrderById = usePrevious(orderById); + + const orderDiffById = orderById && prevOrderById + ? mapValues(orderById, (order, id) => { + return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity); + }) + : {}; + + const loadMoreOfType = useCallback(() => { + loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' }); + }, [loadMoreChats, folderType]); + + const [viewportIds, getMore] = useInfiniteScroll( + lastSyncTime ? loadMoreOfType : undefined, + orderedIds, + undefined, + CHAT_LIST_SLICE, + folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED, + ); + + // TODO Refactor to not call `prepareChatList` twice + const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType); + + useEffect(() => { + if (lastSyncTime && folderType === 'all') { + preloadTopChatMessages(); + } + }, [lastSyncTime, folderType, preloadTopChatMessages]); + + const getAnimationType = useChatAnimationType(orderDiffById); + + function renderChats() { + const viewportOffset = orderedIds!.indexOf(viewportIds![0]); + const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length; + + return ( +
    + {chatArrays!.pinnedChats.map(({ id }, i) => ( + + ))} + {chatArrays!.otherChats.map((chat, i) => ( + + ))} +
    + ); + } + + return ( + + {viewportIds && viewportIds.length && chatArrays ? ( + renderChats() + ) : viewportIds && !viewportIds.length ? ( +
    {noChatsText}
    + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { folderType, folderId }): StateProps => { + const { + chats: { + listIds, + byId: chatsById, + orderedPinnedIds, + }, + users: { byId: usersById }, + lastSyncTime, + } = global; + const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {}; + + const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined; + const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined; + + return { + chatsById, + usersById, + currentChatId, + lastSyncTime, + ...(listType ? { + listIds: listIds[listType], + orderedPinnedIds: orderedPinnedIds[listType], + } : { + chatFolder, + }), + isInDiscussionThread: currentThreadId !== MAIN_THREAD_ID, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats', 'preloadTopChatMessages']), +)(ChatList)); diff --git a/src/components/left/main/ContactList.async.tsx b/src/components/left/main/ContactList.async.tsx new file mode 100644 index 000000000..4c8844e27 --- /dev/null +++ b/src/components/left/main/ContactList.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; +import { OwnProps } from './ContactList'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const ContactListAsync: FC = (props) => { + const ContactList = useModuleLoader(Bundles.Extra, 'ContactList'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ContactList ? : ; +}; + +export default ContactListAsync; diff --git a/src/components/left/main/ContactList.tsx b/src/components/left/main/ContactList.tsx new file mode 100644 index 000000000..43191559c --- /dev/null +++ b/src/components/left/main/ContactList.tsx @@ -0,0 +1,106 @@ +import React, { + FC, useEffect, useCallback, useMemo, memo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiUser } from '../../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { throttle } from '../../../util/schedulers'; +import searchWords from '../../../util/searchWords'; +import { pick } from '../../../util/iteratees'; +import { getUserFullName, getSortedUserIds } from '../../../modules/helpers'; +import useInfiniteScroll from '../../../hooks/useInfiniteScroll'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import InfiniteScroll from '../../ui/InfiniteScroll'; +import ListItem from '../../ui/ListItem'; +import Loading from '../../ui/Loading'; + +export type OwnProps = { + filter: string; +}; + +type StateProps = { + usersById: Record; + contactIds?: number[]; +}; + +type DispatchProps = Pick; + +const runThrottled = throttle((cb) => cb(), 60000, true); + +const ContactList: FC = ({ + filter, usersById, contactIds, loadContactList, openChat, +}) => { + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadContactList(); + }); + }); + + const handleClick = useCallback( + (id: number) => { + openChat({ id }); + }, + [openChat], + ); + + const listIds = useMemo(() => { + if (!contactIds) { + return undefined; + } + + const resultIds = filter ? contactIds.filter((id) => { + const user = usersById[id]; + if (!user) { + return false; + } + const fullName = getUserFullName(user); + return fullName && searchWords(fullName, filter); + }) : contactIds; + + return getSortedUserIds(resultIds, usersById); + }, [filter, usersById, contactIds]); + + const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter)); + + return ( + + {viewportIds && viewportIds.length ? ( + viewportIds.map((id) => ( + handleClick(id)} + ripple={!IS_MOBILE_SCREEN} + > + + + )) + ) : viewportIds && !viewportIds.length ? ( +

    + {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'} +

    + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { userIds: contactIds } = global.contactList || {}; + const { byId: usersById } = global.users; + + return { + usersById, + contactIds, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']), +)(ContactList)); diff --git a/src/components/left/main/LeftMain.scss b/src/components/left/main/LeftMain.scss new file mode 100644 index 000000000..01b7b8b04 --- /dev/null +++ b/src/components/left/main/LeftMain.scss @@ -0,0 +1,58 @@ +#LeftColumn-main { + height: 100%; + position: relative; + display: flex; + flex-direction: column; + overflow: hidden; + z-index: 1; + + > .Transition { + flex: 1; + overflow: hidden; + } + + .ChatFolders { + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + + .tabs-placeholder { + height: 2.625rem; + transition: height 150ms ease; + + &:not(.open) { + height: 0; + } + } + + .TabList { + justify-content: flex-start; + padding-left: .5625rem; + padding-bottom: 1px; + border-bottom: 0; + z-index: 1; + } + + .Tab { + flex: 0 0 auto; + padding-left: 0.625rem; + padding-right: 0.625rem; + + > span { + padding-left: 0.5rem; + padding-right: 0.5rem; + } + } + + > .Transition { + flex: 1; + overflow: hidden; + } + } + + .chat-list, .RecentContacts, .LeftSearch, .search-content { + height: 100%; + overflow-y: auto; + } +} diff --git a/src/components/left/main/LeftMain.tsx b/src/components/left/main/LeftMain.tsx new file mode 100644 index 000000000..0c87192e4 --- /dev/null +++ b/src/components/left/main/LeftMain.tsx @@ -0,0 +1,156 @@ +import React, { + FC, memo, useState, useRef, useCallback, useEffect, +} from '../../../lib/teact/teact'; + +import { LeftColumnContent } from '../../../types'; + +import { IS_TOUCH_ENV } from '../../../util/environment'; + +import Transition from '../../ui/Transition'; +import LeftMainHeader from './LeftMainHeader'; +import ConnectionState from '../ConnectionState'; +import ChatFolders from './ChatFolders'; +import LeftSearch from '../search/LeftSearch.async'; +import ContactList from './ContactList.async'; +import NewChatButton from '../NewChatButton'; + +import './LeftMain.scss'; + +type OwnProps = { + content: LeftColumnContent; + searchQuery?: string; + searchDate?: number; + contactsFilter: string; + onSearchQuery: (query: string) => void; + onContentChange: (content: LeftColumnContent) => void; + onReset: () => void; +}; + +type StateProps = {}; + +const TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2; +const BUTTON_CLOSE_DELAY_MS = 250; +let closeTimeout: number | undefined; + +const LeftMain: FC = ({ + content, + searchQuery, + searchDate, + contactsFilter, + onSearchQuery, + onContentChange, + onReset, +}) => { + const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV); + + const isMouseInside = useRef(false); + + const handleSelectSettings = useCallback(() => { + onContentChange(LeftColumnContent.Settings); + }, [onContentChange]); + + const handleSelectContacts = useCallback(() => { + onContentChange(LeftColumnContent.Contacts); + }, [onContentChange]); + + const handleSelectNewChannel = useCallback(() => { + onContentChange(LeftColumnContent.NewChannelStep1); + }, [onContentChange]); + + const handleSelectNewGroup = useCallback(() => { + onContentChange(LeftColumnContent.NewGroupStep1); + }, [onContentChange]); + + const handleSelectArchived = useCallback(() => { + onContentChange(LeftColumnContent.Archived); + }, [onContentChange]); + + const handleMouseEnter = useCallback(() => { + if (content !== LeftColumnContent.ChatList) { + return; + } + isMouseInside.current = true; + setIsNewChatButtonShown(true); + }, [content]); + + const handleMouseLeave = useCallback(() => { + isMouseInside.current = false; + + if (closeTimeout) { + clearTimeout(closeTimeout); + closeTimeout = undefined; + } + + closeTimeout = window.setTimeout(() => { + if (!isMouseInside.current) { + setIsNewChatButtonShown(false); + } + }, BUTTON_CLOSE_DELAY_MS); + }, []); + + useEffect(() => { + let autoCloseTimeout: number | undefined; + if (content !== LeftColumnContent.ChatList) { + autoCloseTimeout = window.setTimeout(() => { + setIsNewChatButtonShown(false); + }, BUTTON_CLOSE_DELAY_MS); + } else if (isMouseInside.current || IS_TOUCH_ENV) { + setIsNewChatButtonShown(true); + } + + return () => { + if (autoCloseTimeout) { + clearTimeout(autoCloseTimeout); + autoCloseTimeout = undefined; + } + }; + }, [content]); + + return ( +
    + + + + {() => { + switch (content) { + case LeftColumnContent.ChatList: + return ; + case LeftColumnContent.GlobalSearch: + return ( + + ); + case LeftColumnContent.Contacts: + return ; + default: + return undefined; + } + }} + + +
    + ); +}; + +export default memo(LeftMain); diff --git a/src/components/left/main/LeftMainHeader.scss b/src/components/left/main/LeftMainHeader.scss new file mode 100644 index 000000000..54f9fa9fa --- /dev/null +++ b/src/components/left/main/LeftMainHeader.scss @@ -0,0 +1,66 @@ +@import '../../../styles/mixins'; + +#LeftMainHeader { + position: relative; + + .animated-menu-icon { + position: absolute; + + &, &::before, &::after { + width: 1.125rem; + height: 0.125rem; + border-radius: 0.125rem; + background-color: var(--color-text-secondary); + transition: transform .25s; + transform: rotate(0); + } + + &::before, &::after { + position: absolute; + left: 0; + content: ''; + } + + &::before { + top: -0.3125rem; + } + + &::after { + top: 0.3125rem; + } + + &.state-back { + transform: rotate(180deg); + + &::before { + transform: rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem); + } + + &::after { + transform: rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem); + } + } + } + + .archived-badge { + min-width: 1.5rem; + height: 1.5rem; + margin-left: 2rem; + background: var(--color-gray); + border-radius: 0.75rem; + padding: 0 .45rem; + color: white; + font-size: 0.875rem; + line-height: 1.5rem; + font-weight: 500; + text-align: center; + flex-shrink: 0; + } + + // @optimization + @include while-transition() { + .Menu .bubble { + transition: none !important; + } + } +} diff --git a/src/components/left/main/LeftMainHeader.tsx b/src/components/left/main/LeftMainHeader.tsx new file mode 100644 index 000000000..3ef0c5655 --- /dev/null +++ b/src/components/left/main/LeftMainHeader.tsx @@ -0,0 +1,232 @@ +import React, { + FC, useCallback, useMemo, memo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { LeftColumnContent } from '../../../types'; +import { ApiChat } from '../../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import { isChatArchived } from '../../../modules/helpers'; +import { formatDateToString } from '../../../util/dateFormat'; +import useLang from '../../../hooks/useLang'; + +import DropdownMenu from '../../ui/DropdownMenu'; +import MenuItem from '../../ui/MenuItem'; +import Button from '../../ui/Button'; +import SearchInput from '../../ui/SearchInput'; +import PickerSelectedItem from '../../common/PickerSelectedItem'; + +import './LeftMainHeader.scss'; + +type OwnProps = { + content: LeftColumnContent; + contactsFilter: string; + onSearchQuery: (query: string) => void; + onSelectSettings: () => void; + onSelectContacts: () => void; + onSelectNewGroup: () => void; + onSelectArchived: () => void; + onReset: () => void; +}; + +type StateProps = { + searchQuery?: string; + isLoading: boolean; + currentUserId?: number; + globalSearchChatId?: number; + searchDate?: number; + chatsById?: Record; +}; + +type DispatchProps = Pick; + +const LeftMainHeader: FC = ({ + content, + contactsFilter, + onSearchQuery, + onSelectSettings, + onSelectContacts, + onSelectNewGroup, + onSelectArchived, + setGlobalSearchChatId, + onReset, + searchQuery, + isLoading, + currentUserId, + globalSearchChatId, + searchDate, + chatsById, + openChat, + openSupportChat, + setGlobalSearchDate, +}) => { + const hasMenu = content === LeftColumnContent.ChatList; + const clearedDateSearchParam = { date: undefined }; + const clearedChatSearchParam = { id: undefined }; + const selectedSearchDate = useMemo(() => { + return searchDate + ? formatDateToString(new Date(searchDate * 1000)) + : undefined; + }, [searchDate]); + const archivedUnreadChatsCount = useMemo(() => { + if (!hasMenu || !chatsById) { + return 0; + } + + return Object.values(chatsById).reduce((total, chat) => { + if (!isChatArchived(chat)) { + return total; + } + + return chat.unreadCount ? total + 1 : total; + }, 0); + }, [hasMenu, chatsById]); + + const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => { + return ({ onTrigger, isOpen }) => ( + + ); + }, [hasMenu, onReset]); + + const handleSearchFocus = useCallback(() => { + if (!searchQuery) { + onSearchQuery(''); + } + }, [searchQuery, onSearchQuery]); + + const handleSelectSaved = useCallback(() => { + openChat({ id: currentUserId }); + }, [currentUserId, openChat]); + + const lang = useLang(); + + const isSearchFocused = Boolean(globalSearchChatId) + || content === LeftColumnContent.GlobalSearch + || content === LeftColumnContent.Contacts; + + const searchInputPlaceholder = content === LeftColumnContent.Contacts + ? lang('SearchFriends') + : lang('Search'); + + return ( +
    +
    + + + {lang('NewGroup')} + + + {lang('Contacts')} + + + {lang('Archived')} + {archivedUnreadChatsCount > 0 && ( +
    {archivedUnreadChatsCount}
    + )} +
    + + {lang('Saved')} + + + {lang('Settings')} + + + {lang('BotHelp')} + +
    + + {selectedSearchDate && ( + + )} + {globalSearchChatId && ( + + )} + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + query: searchQuery, fetchingStatus, chatId, date, + } = global.globalSearch; + const { currentUserId } = global; + const { byId: chatsById } = global.chats; + + return { + searchQuery, + isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false, + currentUserId, + chatsById, + globalSearchChatId: chatId, + searchDate: date, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChat', + 'openSupportChat', + 'setGlobalSearchDate', + 'setGlobalSearchChatId', + ]), +)(LeftMainHeader)); diff --git a/src/components/left/main/hooks/index.ts b/src/components/left/main/hooks/index.ts new file mode 100644 index 000000000..a4f4418bf --- /dev/null +++ b/src/components/left/main/hooks/index.ts @@ -0,0 +1 @@ +export * from './useChatAnimationType'; diff --git a/src/components/left/main/hooks/useChatAnimationType.ts b/src/components/left/main/hooks/useChatAnimationType.ts new file mode 100644 index 000000000..e34f382b5 --- /dev/null +++ b/src/components/left/main/hooks/useChatAnimationType.ts @@ -0,0 +1,35 @@ +import { useCallback } from '../../../../lib/teact/teact'; + +export enum ChatAnimationTypes { + Move, + Opacity, + None, +} + +export function useChatAnimationType(orderDiffById: Record) { + const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]); + const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]); + + const orderDiffIds = Object.keys(orderDiffById).map(Number); + const numberOfUp = orderDiffIds.filter(movesUp).length; + const numberOfDown = orderDiffIds.filter(movesDown).length; + + return useCallback((chatId: number): ChatAnimationTypes => { + const orderDiff = orderDiffById[chatId]; + + if (orderDiff === 0) { + return ChatAnimationTypes.None; + } + + if ( + orderDiff === Infinity + || orderDiff === -Infinity + || (movesUp(chatId) && numberOfUp <= numberOfDown) + || (movesDown(chatId) && numberOfDown < numberOfUp) + ) { + return ChatAnimationTypes.Opacity; + } + + return ChatAnimationTypes.Move; + }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]); +} diff --git a/src/components/left/newChat/NewChat.async.tsx b/src/components/left/newChat/NewChat.async.tsx new file mode 100644 index 000000000..4d8876213 --- /dev/null +++ b/src/components/left/newChat/NewChat.async.tsx @@ -0,0 +1,16 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; + +import { OwnProps } from './NewChat'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const NewChatAsync: FC = (props) => { + const NewChat = useModuleLoader(Bundles.Extra, 'NewChat'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return NewChat ? : ; +}; + +export default NewChatAsync; diff --git a/src/components/left/newChat/NewChat.scss b/src/components/left/newChat/NewChat.scss new file mode 100644 index 000000000..ecb48baa4 --- /dev/null +++ b/src/components/left/newChat/NewChat.scss @@ -0,0 +1,46 @@ +.NewChat { + height: 100%; + overflow: hidden; + position: relative; + + &-inner { + height: calc(100% - var(--header-height)); + overflow: hidden; + + &.step-2 { + padding: 0 1.25rem; + display: flex; + flex-direction: column; + + .note, .error { + font-size: 0.875rem; + line-height: 1.25rem; + margin: 1.5rem 0.25rem; + } + + .error { + color: var(--color-error); + } + + .note { + margin-top: -0.5625rem; + color: var(--color-text-secondary); + } + + .chat-members-heading { + color: var(--color-text-secondary); + font-size: 1rem; + font-weight: 500; + margin: 1rem 0.25rem; + } + + .chat-members-list { + margin: 0 -1.25rem; + padding: 0 1rem 1rem; + + overflow-x: hidden; + flex-grow: 1; + } + } + } +} diff --git a/src/components/left/newChat/NewChat.tsx b/src/components/left/newChat/NewChat.tsx new file mode 100644 index 000000000..4b8696688 --- /dev/null +++ b/src/components/left/newChat/NewChat.tsx @@ -0,0 +1,73 @@ +import React, { + FC, memo, useCallback, useState, +} from '../../../lib/teact/teact'; + +import { LeftColumnContent } from '../../../types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; + +import Transition from '../../ui/Transition'; +import NewChatStep1 from './NewChatStep1'; +import NewChatStep2 from './NewChatStep2'; + +import './NewChat.scss'; + +export type OwnProps = { + isChannel?: boolean; + content: LeftColumnContent; + onContentChange: (content: LeftColumnContent) => void; + onReset: () => void; +}; + +const RENDER_COUNT = Object.keys(LeftColumnContent).length / 2; + +const NewChat: FC = ({ + isChannel = false, + content, + onContentChange, + onReset, +}) => { + const [newChatMemberIds, setNewChatMemberIds] = useState([]); + + const handleNextStep = useCallback(() => { + onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2); + }, [isChannel, onContentChange]); + + return ( + + {() => { + switch (content) { + case LeftColumnContent.NewChannelStep1: + case LeftColumnContent.NewGroupStep1: + return ( + + ); + case LeftColumnContent.NewChannelStep2: + case LeftColumnContent.NewGroupStep2: + return ( + + ); + default: + return undefined; + } + }} + + ); +}; + +export default memo(NewChat); diff --git a/src/components/left/newChat/NewChatStep1.async.tsx b/src/components/left/newChat/NewChatStep1.async.tsx new file mode 100644 index 000000000..b5396d6b2 --- /dev/null +++ b/src/components/left/newChat/NewChatStep1.async.tsx @@ -0,0 +1,16 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; + +import { OwnProps } from './NewChatStep1'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const NewChatStep1Async: FC = (props) => { + const NewChatStep1 = useModuleLoader(Bundles.Extra, 'NewChatStep1'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return NewChatStep1 ? : ; +}; + +export default NewChatStep1Async; diff --git a/src/components/left/newChat/NewChatStep1.tsx b/src/components/left/newChat/NewChatStep1.tsx new file mode 100644 index 000000000..a4f8266aa --- /dev/null +++ b/src/components/left/newChat/NewChatStep1.tsx @@ -0,0 +1,163 @@ +import React, { + FC, useCallback, useEffect, useMemo, memo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiUser } from '../../../api/types'; + +import { pick, unique } from '../../../util/iteratees'; +import { throttle } from '../../../util/schedulers'; +import searchWords from '../../../util/searchWords'; +import { getSortedUserIds, getUserFullName } from '../../../modules/helpers'; +import useLang from '../../../hooks/useLang'; + +import Picker from '../../common/Picker'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Button from '../../ui/Button'; + +export type OwnProps = { + isChannel?: boolean; + selectedMemberIds: number[]; + onSelectedMemberIdsChange: (ids: number[]) => void; + onNextStep: () => void; + onReset: () => void; +}; + +type StateProps = { + usersById: Record; + localContactIds?: number[]; + searchQuery?: string; + isSearching?: boolean; + localUsers?: ApiUser[]; + globalUsers?: ApiUser[]; +}; + +type DispatchProps = Pick; + +const runThrottled = throttle((cb) => cb(), 60000, true); + +const NewChatStep1: FC = ({ + isChannel, + selectedMemberIds, + onSelectedMemberIdsChange, + onNextStep, + onReset, + usersById, + localContactIds, + searchQuery, + isSearching, + localUsers, + globalUsers, + loadContactList, + setGlobalSearchQuery, +}) => { + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadContactList(); + }); + }); + + const handleFilterChange = useCallback((query: string) => { + setGlobalSearchQuery({ query }); + }, [setGlobalSearchQuery]); + + const displayedIds = useMemo(() => { + if (!searchQuery) { + return localContactIds || []; + } + + const foundLocalContacts = localContactIds ? localContactIds.filter((id) => { + const user = usersById[id]; + if (!user) { + return false; + } + const fullName = getUserFullName(user); + return fullName && searchWords(fullName, searchQuery); + }) : []; + + return getSortedUserIds( + unique([ + ...foundLocalContacts, + ...(localUsers ? localUsers.map((user) => user.id) : []), + ...(globalUsers ? globalUsers.map((user) => user.id) : []), + ]) as number[], + usersById, + selectedMemberIds, + ); + }, [searchQuery, localContactIds, localUsers, globalUsers, usersById, selectedMemberIds]); + + const handleNextStep = useCallback(() => { + if (selectedMemberIds.length) { + setGlobalSearchQuery({ query: '' }); + onNextStep(); + } + }, [selectedMemberIds, setGlobalSearchQuery, onNextStep]); + + const lang = useLang(); + + return ( +
    +
    + +

    {lang('GroupAddMembers')}

    +
    +
    + + + + + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { userIds: localContactIds } = global.contactList || {}; + const { byId: usersById } = global.users; + + const { + query: searchQuery, + fetchingStatus, + globalResults, + localResults, + } = global.globalSearch; + const { users: globalUsers } = globalResults || {}; + const { users: localUsers } = localResults || {}; + + return { + usersById, + localContactIds, + searchQuery, + isSearching: fetchingStatus && fetchingStatus.chats, + globalUsers, + localUsers, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']), +)(NewChatStep1)); diff --git a/src/components/left/newChat/NewChatStep2.async.tsx b/src/components/left/newChat/NewChatStep2.async.tsx new file mode 100644 index 000000000..093abea83 --- /dev/null +++ b/src/components/left/newChat/NewChatStep2.async.tsx @@ -0,0 +1,16 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; + +import { OwnProps } from './NewChatStep2'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const NewChatStep2Async: FC = (props) => { + const NewChatStep2 = useModuleLoader(Bundles.Extra, 'NewChatStep2'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return NewChatStep2 ? : ; +}; + +export default NewChatStep2Async; diff --git a/src/components/left/newChat/NewChatStep2.tsx b/src/components/left/newChat/NewChatStep2.tsx new file mode 100644 index 000000000..420029793 --- /dev/null +++ b/src/components/left/newChat/NewChatStep2.tsx @@ -0,0 +1,199 @@ +import React, { + FC, useState, useCallback, useEffect, memo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ChatCreationProgress } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; + +import InputText from '../../ui/InputText'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import AvatarEditable from '../../ui/AvatarEditable'; +import Button from '../../ui/Button'; +import ListItem from '../../ui/ListItem'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; + +export type OwnProps = { + isChannel?: boolean; + memberIds: number[]; + onReset: (forceReturnToChatList?: boolean) => void; +}; + +type StateProps = { + creationProgress?: ChatCreationProgress; + creationError?: string; +}; + +type DispatchProps = Pick; + +// TODO @implement +const MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user + +const NewChatStep2: FC = ({ + isChannel, + memberIds, + onReset, + creationProgress, + creationError, + createGroupChat, + createChannel, +}) => { + const lang = useLang(); + + const [title, setTitle] = useState(''); + const [about, setAbout] = useState(''); + const [photo, setPhoto] = useState(); + const [error, setError] = useState(); + + const chatTitleEmptyError = 'Chat title can\'t be empty'; + const channelTitleEmptyError = 'Channel title can\'t be empty'; + const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported'; + + const isLoading = creationProgress === ChatCreationProgress.InProgress; + + const handleTitleChange = useCallback((e: React.ChangeEvent) => { + const { value } = e.currentTarget; + const newValue = value.replace(/^\s+/, ''); + + setTitle(newValue); + + if (newValue !== value) { + e.currentTarget.value = newValue; + } + }, []); + + const handleDescriptionChange = useCallback((e: React.ChangeEvent) => { + setAbout(e.currentTarget.value); + }, []); + + const handleCreateGroup = useCallback(() => { + if (!title.length) { + setError(chatTitleEmptyError); + return; + } + + if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) { + setError(chatTooManyUsersError); + return; + } + + createGroupChat({ + title, + photo, + memberIds, + }); + }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]); + + const handleCreateChannel = useCallback(() => { + if (!title.length) { + setError(channelTitleEmptyError); + return; + } + + createChannel({ + title, + about, + photo, + memberIds, + }); + }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]); + + useEffect(() => { + if (creationProgress === ChatCreationProgress.Complete) { + onReset(true); + } + }, [creationProgress, onReset]); + + const renderedError = creationError || ( + error !== chatTitleEmptyError && error !== channelTitleEmptyError + ? error + : undefined + ); + + return ( +
    +
    + +

    {lang(isChannel ? 'NewChannel' : 'NewGroup')}

    +
    +
    + + + {isChannel && ( + <> + +

    {lang('DescriptionInfo')}

    + + )} + + {renderedError && ( +

    {renderedError}

    + )} + +

    {lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

    + +
    + {memberIds.map((id) => ( + + + + ))} +
    +
    + + + {isLoading ? ( + + ) : ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + progress: creationProgress, + error: creationError, + } = global.chatCreation || {}; + + return { + creationProgress, + creationError, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'createGroupChat', 'createChannel', + ]), +)(NewChatStep2)); diff --git a/src/components/left/search/AudioResults.tsx b/src/components/left/search/AudioResults.tsx new file mode 100644 index 000000000..4da2131da --- /dev/null +++ b/src/components/left/search/AudioResults.tsx @@ -0,0 +1,132 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection } from '../../../types'; + +import { SLIDE_TRANSITION_DURATION } from '../../../config'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { createMapStateToProps, StateProps } from './helpers/createMapStateToProps'; +import { pick } from '../../../util/iteratees'; +import { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat'; +import { getSenderName } from './helpers/getSenderName'; +import { throttle } from '../../../util/schedulers'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import Audio from '../../common/Audio'; +import NothingFound from '../../common/NothingFound'; +import Loading from '../../ui/Loading'; + +export type OwnProps = { + isVoice?: boolean; + searchQuery?: string; +}; + +type DispatchProps = Pick; + +const runThrottled = throttle((cb) => cb(), 500, true); + +const AudioResults: FC = ({ + isVoice, + searchQuery, + searchChatId, + isLoading, + chatsById, + usersById, + globalMessagesByChatId, + foundIds, + lastSyncTime, + searchMessagesGlobal, + focusMessage, + openAudioPlayer, +}) => { + const currentType = isVoice ? 'voice' : 'audio'; + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: currentType, + query: searchQuery, + chatId: searchChatId, + }); + }); + } + }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]); + + const foundMessages = useMemo(() => { + if (!foundIds || !globalMessagesByChatId) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds.map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + + return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]; + }).filter(Boolean); + }, [globalMessagesByChatId, foundIds]); + + const handleMessageFocus = useCallback((messageId: number, chatId: number) => { + focusMessage({ chatId, messageId }); + }, [focusMessage]); + + const handlePlayAudio = useCallback((messageId: number, chatId: number) => { + openAudioPlayer({ chatId, messageId }); + }, [openAudioPlayer]); + + function renderList() { + return foundMessages.map((message, index) => { + const shouldDrawDateDivider = index === 0 + || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date); + return ( +
    + {shouldDrawDateDivider && ( +

    {formatMonthAndYear(new Date(message.date * 1000))}

    + )} +
    + ); + }); + } + + const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading; + + return ( +
    + + {!canRenderContents && } + {canRenderContents && (!foundIds || foundIds.length === 0) && } + {canRenderContents && foundIds && foundIds.length > 0 && renderList()} + +
    + ); +}; + +export default memo(withGlobal( + createMapStateToProps('audio'), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'searchMessagesGlobal', + 'focusMessage', + 'openAudioPlayer', + ]), +)(AudioResults)); diff --git a/src/components/left/search/ChatMessage.scss b/src/components/left/search/ChatMessage.scss new file mode 100644 index 000000000..b867d5258 --- /dev/null +++ b/src/components/left/search/ChatMessage.scss @@ -0,0 +1,78 @@ +.ChatMessage { + &:first-child { + margin-top: .5rem; + } + &:hover, &.selected { + .Avatar.online::after { + border-color: var(--color-chat-hover); + } + } + + .ListItem-button { + padding: .25rem .5rem; + } + + .info { + .title { + flex-grow: 1; + } + + h3 { + font-size: 1rem; + width: auto; + } + + .subtitle { + color: var(--color-text-secondary); + + .matching-text-highlight { + color: var(--color-text); + background: #CAE3F7; + border-radius: 0.25rem; + padding: 0 0.125rem; + } + } + + .message { + flex-grow: 1; + color: var(--color-text-secondary); + overflow: hidden; + text-overflow: ellipsis; + + .sender-name { + color: var(--color-text); + } + .sender-name { + &::after { + content: ': '; + } + } + + .media-preview { + position: relative; + } + + img { + width: 1.25rem; + height: 1.25rem; + object-fit: cover; + border-radius: .125rem; + vertical-align: -.25rem; + margin-right: .25rem; + } + + .icon-play { + font-size: .75rem; + color: #fff; + position: absolute; + left: .25rem; + top: .1875rem; + } + } + } + + .info-row { + display: flex; + justify-content: space-between; + } +} diff --git a/src/components/left/search/ChatMessage.tsx b/src/components/left/search/ChatMessage.tsx new file mode 100644 index 000000000..2ed98f041 --- /dev/null +++ b/src/components/left/search/ChatMessage.tsx @@ -0,0 +1,139 @@ +import React, { + FC, memo, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { + ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, +} from '../../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { + getChatTitle, + getPrivateChatUserId, + getMessageMediaHash, + getMessageSummaryText, + getMessageMediaThumbDataUri, + getMessageVideo, +} from '../../../modules/helpers'; +import { selectChat, selectUser } from '../../../modules/selectors'; +import renderText from '../../common/helpers/renderText'; +import { pick } from '../../../util/iteratees'; +import useMedia from '../../../hooks/useMedia'; +import { formatPastTimeShort } from '../../../util/dateFormat'; +import useLang from '../../../hooks/useLang'; + +import Avatar from '../../common/Avatar'; +import VerifiedIcon from '../../common/VerifiedIcon'; +import ListItem from '../../ui/ListItem'; +import Link from '../../ui/Link'; + +import './ChatMessage.scss'; + +type OwnProps = { + searchQuery?: string; + message: ApiMessage; + chatId: number; +}; + +type StateProps = { + chat?: ApiChat; + privateChatUser?: ApiUser; + lastMessageOutgoingStatus?: ApiMessageOutgoingStatus; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const ChatMessage: FC = ({ + message, + searchQuery, + chatId, + chat, + privateChatUser, + focusMessage, + lastSyncTime, +}) => { + const mediaThumbnail = getMessageMediaThumbDataUri(message); + const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro')); + + const handleClick = useCallback(() => { + focusMessage({ chatId, messageId: message.id }); + }, [chatId, focusMessage, message.id]); + + useLang(); + + if (!chat) { + return undefined; + } + + return ( + + +
    +
    +
    +

    {renderText(getChatTitle(chat, privateChatUser))}

    + {chat.isVerified && } +
    +
    + + {formatPastTimeShort(message.date * 1000)} + +
    + +
    +
    +
    + {renderMessageSummary(message, mediaBlobUrl || mediaThumbnail, searchQuery)} +
    +
    +
    +
    + ); +}; + +function renderMessageSummary(message: ApiMessage, blobUrl?: string, searchQuery?: string) { + if (!blobUrl) { + return renderText(getMessageSummaryText(message)); + } + + return ( + + + {getMessageVideo(message) && } + {renderText(getMessageSummaryText(message, true), ['emoji', 'highlight'], { highlight: searchQuery })} + + ); +} + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + if (!chat) { + return {}; + } + + const privateChatUserId = getPrivateChatUserId(chat); + + return { + chat, + ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }), + lastSyncTime: global.lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'focusMessage', + ]), +)(ChatMessage)); diff --git a/src/components/left/search/ChatMessageResults.tsx b/src/components/left/search/ChatMessageResults.tsx new file mode 100644 index 000000000..50a0841b0 --- /dev/null +++ b/src/components/left/search/ChatMessageResults.tsx @@ -0,0 +1,141 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiMessage } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import { getMessageSummaryText } from '../../../modules/helpers'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { throttle } from '../../../util/schedulers'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import ChatMessage from './ChatMessage'; +import NothingFound from '../../common/NothingFound'; +import DateSuggest from './DateSuggest'; + +export type OwnProps = { + searchQuery?: string; + dateSearchQuery?: string; + onReset: () => void; + onSearchDateSelect: (value: Date) => void; +}; + +type StateProps = { + currentUserId?: number; + foundIds?: string[]; + globalMessagesByChatId?: Record }>; + chatsById: Record; + fetchingStatus?: { chats?: boolean; messages?: boolean }; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const runThrottled = throttle((cb) => cb(), 500, true); + +const ChatMessageResults: FC = ({ + searchQuery, + currentUserId, + dateSearchQuery, + foundIds, + globalMessagesByChatId, + chatsById, + fetchingStatus, + lastSyncTime, + searchMessagesGlobal, + onSearchDateSelect, +}) => { + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: 'text', + query: searchQuery, + chatId: currentUserId, + }); + }); + } + }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]); + + const foundMessages = useMemo(() => { + if (!foundIds || foundIds.length === 0) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds + .map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + + return ( + globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId] + ); + }) + .filter(Boolean as any) + .sort((a, b) => b.date - a.date); + }, [foundIds, globalMessagesByChatId]); + + function renderFoundMessage(message: ApiMessage) { + const text = getMessageSummaryText(message); + const chat = chatsById[message.chatId]; + + if (!text || !chat) { + return undefined; + } + + return ( + + ); + } + + const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length; + + return ( +
    + + {dateSearchQuery && ( +
    + +
    + )} + {nothingFound && } + {!!foundMessages.length && foundMessages.map(renderFoundMessage)} +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { byId: chatsById } = global.chats; + const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global; + const { fetchingStatus, resultsByType } = global.globalSearch; + + const { foundIds } = (resultsByType && resultsByType.text) || {}; + + return { + currentUserId, + foundIds, + globalMessagesByChatId, + chatsById, + fetchingStatus, + lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']), +)(ChatMessageResults)); diff --git a/src/components/left/search/ChatResults.tsx b/src/components/left/search/ChatResults.tsx new file mode 100644 index 000000000..4f7e6d144 --- /dev/null +++ b/src/components/left/search/ChatResults.tsx @@ -0,0 +1,315 @@ +import React, { + FC, memo, useCallback, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiUser, ApiChat, ApiMessage } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection } from '../../../types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import searchWords from '../../../util/searchWords'; +import { unique, pick } from '../../../util/iteratees'; +import { getUserFullName, getMessageSummaryText } from '../../../modules/helpers'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { throttle } from '../../../util/schedulers'; +import useLang from '../../../hooks/useLang'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import LeftSearchResultChat from './LeftSearchResultChat'; +import RecentContacts from './RecentContacts'; +import ChatMessage from './ChatMessage'; +import DateSuggest from './DateSuggest'; +import Link from '../../ui/Link'; +import NothingFound from '../../common/NothingFound'; +import PickerSelectedItem from '../../common/PickerSelectedItem'; +import { getTranslation } from '../../../util/langProvider'; + +export type OwnProps = { + searchQuery?: string; + dateSearchQuery?: string; + searchDate?: number; + onReset: () => void; + onSearchDateSelect: (value: Date) => void; +}; + +type StateProps = { + currentUserId?: number; + localContactIds?: number[]; + localChats?: ApiChat[]; + localUsers?: ApiUser[]; + globalChats?: ApiChat[]; + globalUsers?: ApiUser[]; + foundIds?: string[]; + globalMessagesByChatId?: Record }>; + chatsById: Record; + usersById: Record; + fetchingStatus?: { chats?: boolean; messages?: boolean }; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4; +const LESS_LIST_ITEMS_AMOUNT = 3; + +const sortSearchResults = (a: ApiChat | ApiUser, b: ApiChat | ApiUser) => Number(b.isVerified) - Number(a.isVerified); +const runThrottled = throttle((cb) => cb(), 500, true); + +const ChatResults: FC = ({ + searchQuery, searchDate, dateSearchQuery, currentUserId, + localContactIds, localChats, localUsers, globalChats, globalUsers, + foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime, + onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId, +}) => { + const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false); + const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false); + + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: 'text', + query: searchQuery, + }); + }); + } + }, [lastSyncTime, searchMessagesGlobal, searchQuery]); + + const handleChatClick = useCallback( + (id: number) => { + openChat({ id }); + + if (id !== currentUserId) { + addRecentlyFoundChatId({ id }); + } + + if (!IS_MOBILE_SCREEN) { + onReset(); + } + }, + [currentUserId, openChat, addRecentlyFoundChatId, onReset], + ); + + const handlePickerItemClick = useCallback((id: number) => { + setGlobalSearchChatId({ id }); + }, [setGlobalSearchChatId]); + + const localResults = useMemo(() => { + if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) { + return MEMO_EMPTY_ARRAY; + } + + const foundLocalContacts = localContactIds + ? localContactIds.filter((id) => { + const user = usersById[id]; + if (!user) { + return false; + } + + const fullName = getUserFullName(user); + return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery); + }).map((id) => usersById[id]) + : []; + + return unique([ + ...(searchWords(getTranslation('SavedMessages'), searchQuery) ? [currentUserId] : []), + ...([ + ...foundLocalContacts, + ...(localChats || []), + ...(localUsers || []), + ].sort(sortSearchResults).map((chat) => chat.id)), + ]) as number[]; + }, [searchQuery, localContactIds, localChats, localUsers, usersById, currentUserId]); + + const globalResults = useMemo(() => { + if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChats || !globalUsers) { + return MEMO_EMPTY_ARRAY; + } + + return unique([...globalChats, ...globalUsers].sort(sortSearchResults).map((chat) => chat.id)); + }, [globalChats, globalUsers, searchQuery]); + + const foundMessages = useMemo(() => { + if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds + .map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + + return ( + globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId] + ); + }) + .filter(Boolean as any) + .sort((a, b) => b.date - a.date); + }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]); + + const handleClickShowMoreLocal = useCallback(() => { + setShouldShowMoreLocal(!shouldShowMoreLocal); + }, [shouldShowMoreLocal]); + + const handleClickShowMoreGlobal = useCallback(() => { + setShouldShowMoreGlobal(!shouldShowMoreGlobal); + }, [shouldShowMoreGlobal]); + + const lang = useLang(); + + function renderFoundMessage(message: ApiMessage) { + const text = getMessageSummaryText(message); + const chat = chatsById[message.chatId]; + + if (!text || !chat) { + return undefined; + } + + return ( + + ); + } + + const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages + && !localResults.length && !globalResults.length && !foundMessages.length; + + if (!searchQuery && !searchDate) { + return ; + } + + return ( + + {dateSearchQuery && ( +
    + +
    + )} + {nothingFound && } + {!!localResults.length && ( +
    + {localResults.map((id) => ( + + ))} +
    + )} + {!!localResults.length && ( +
    +

    + {localResults.length > LESS_LIST_ITEMS_AMOUNT && ( + {shouldShowMoreLocal ? 'Show less' : 'Show more'} + )} + Contacts and Chats +

    + {localResults.map((id, index) => { + if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) { + return undefined; + } + + return ( + + ); + })} +
    + )} + {!!globalResults.length && ( +
    +

    + {globalResults.length > LESS_LIST_ITEMS_AMOUNT && ( + {shouldShowMoreGlobal ? 'Show less' : 'Show more'} + )} + Global Search +

    + {globalResults.map((id, index) => { + if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) { + return undefined; + } + + return ( + + ); + })} +
    + )} + {!!foundMessages.length && ( +
    +

    {lang('SearchMessages')}

    + {foundMessages.map(renderFoundMessage)} +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { byId: chatsById } = global.chats; + const { byId: usersById } = global.users; + + const { userIds: localContactIds } = global.contactList || {}; + + if (!localContactIds) { + return { + chatsById, + usersById, + }; + } + + const { currentUserId, messages, lastSyncTime } = global; + const { + fetchingStatus, globalResults, localResults, resultsByType, + } = global.globalSearch; + const { + chats: globalChats, + users: globalUsers, + } = globalResults || {}; + const { chats: localChats, users: localUsers } = localResults || {}; + const { byChatId: globalMessagesByChatId } = messages; + const { foundIds } = (resultsByType && resultsByType.text) || {}; + + return { + currentUserId, + localContactIds, + localChats, + localUsers, + globalChats, + globalUsers, + foundIds, + globalMessagesByChatId, + chatsById, + usersById, + fetchingStatus, + lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChat', + 'addRecentlyFoundChatId', + 'searchMessagesGlobal', + 'setGlobalSearchChatId', + ]), +)(ChatResults)); diff --git a/src/components/left/search/DateSuggest.scss b/src/components/left/search/DateSuggest.scss new file mode 100644 index 000000000..bc24c2268 --- /dev/null +++ b/src/components/left/search/DateSuggest.scss @@ -0,0 +1,25 @@ +.DateSuggest { + display: flex; + height: 2rem; + flex-direction: row; + justify-content: space-between; + margin-left: .5rem; + margin-bottom: .5rem; + + .date-item { + display: flex; + flex: 1 1 auto; + min-width: 8rem; + margin-top: .375rem; + cursor: pointer; + font-size: .875rem; + font-weight: 500; + color: var(--color-text-secondary); + + .icon-calendar { + font-size: 1.25rem; + margin-right: .25rem; + } + } + +} \ No newline at end of file diff --git a/src/components/left/search/DateSuggest.tsx b/src/components/left/search/DateSuggest.tsx new file mode 100644 index 000000000..df1b22c92 --- /dev/null +++ b/src/components/left/search/DateSuggest.tsx @@ -0,0 +1,57 @@ +import React, { FC, memo, useMemo } from '../../../lib/teact/teact'; +import { formatDateToString } from '../../../util/dateFormat'; + +import './DateSuggest.scss'; + +const SUGGESTION_COUNT = 8; + +export type OwnProps = { + searchDate: string; + onSelect: (value: Date) => void; +}; + +const DateSuggest: FC = ({ + searchDate, onSelect, +}) => { + const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]); + return ( +
    + {suggestions.map(({ date, text }) => { + return ( +
    onSelect(date)} + className="date-item" + key={text} + > + + {text} +
    + ); + })} +
    + ); +}; + +function getSuggestionsFromDate(searchDate: string) { + const hasYear = searchDate.match(/^\d{2,4}-\d{2}-\d{2}$/g); + if (hasYear) { + const date = new Date(searchDate); + return [{ date, text: formatDateToString(date) }]; + } + + const suggestion = []; + const currentDate = new Date(); + const currentYear = currentDate.getFullYear(); + const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime() + ? currentYear + : currentYear - 1; + + for (let i = 0; i < SUGGESTION_COUNT; i++) { + const date = new Date(`${latestYear - i}-${searchDate}`); + suggestion.push({ date, text: formatDateToString(date) }); + } + + return suggestion; +} + +export default memo(DateSuggest); diff --git a/src/components/left/search/FileResults.tsx b/src/components/left/search/FileResults.tsx new file mode 100644 index 000000000..ccaf0291e --- /dev/null +++ b/src/components/left/search/FileResults.tsx @@ -0,0 +1,125 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiMessage } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection } from '../../../types'; + +import { SLIDE_TRANSITION_DURATION } from '../../../config'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { createMapStateToProps, StateProps } from './helpers/createMapStateToProps'; +import { pick } from '../../../util/iteratees'; +import { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat'; +import { getSenderName } from './helpers/getSenderName'; +import { throttle } from '../../../util/schedulers'; +import { getMessageDocument } from '../../../modules/helpers'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; + +import Document from '../../common/Document'; +import InfiniteScroll from '../../ui/InfiniteScroll'; +import NothingFound from '../../common/NothingFound'; +import Loading from '../../ui/Loading'; + +export type OwnProps = { + searchQuery?: string; +}; + +type DispatchProps = Pick; + +const CURRENT_TYPE = 'documents'; +const runThrottled = throttle((cb) => cb(), 500, true); + +const FileResults: FC = ({ + searchQuery, + searchChatId, + isLoading, + chatsById, + usersById, + globalMessagesByChatId, + foundIds, + lastSyncTime, + searchMessagesGlobal, + focusMessage, +}) => { + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: CURRENT_TYPE, + query: searchQuery, + chatId: searchChatId, + }); + }); + } + }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]); + + const foundMessages = useMemo(() => { + if (!foundIds || !globalMessagesByChatId) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds.map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]; + + return message && getMessageDocument(message) ? message : undefined; + }).filter(Boolean) as ApiMessage[]; + }, [globalMessagesByChatId, foundIds]); + + const handleMessageFocus = useCallback((messageId: number, chatId: number) => { + focusMessage({ chatId, messageId }); + }, [focusMessage]); + + function renderList() { + return foundMessages.map((message, index) => { + const shouldDrawDateDivider = index === 0 + || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date); + return ( +
    + {shouldDrawDateDivider && ( +

    {formatMonthAndYear(new Date(message.date * 1000))}

    + )} + +
    + ); + }); + } + + const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading; + + return ( +
    + + {!canRenderContents && } + {canRenderContents && (!foundIds || foundIds.length === 0) && } + {canRenderContents && foundIds && foundIds.length > 0 && renderList()} + +
    + ); +}; + +export default memo(withGlobal( + createMapStateToProps(CURRENT_TYPE), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'searchMessagesGlobal', + 'focusMessage', + ]), +)(FileResults)); diff --git a/src/components/left/search/LeftSearch.async.tsx b/src/components/left/search/LeftSearch.async.tsx new file mode 100644 index 000000000..a16ca183c --- /dev/null +++ b/src/components/left/search/LeftSearch.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; +import { OwnProps } from './LeftSearch'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const LeftSearchAsync: FC = (props) => { + const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return LeftSearch ? : ; +}; + +export default LeftSearchAsync; diff --git a/src/components/left/search/LeftSearch.scss b/src/components/left/search/LeftSearch.scss new file mode 100644 index 000000000..adb84eb73 --- /dev/null +++ b/src/components/left/search/LeftSearch.scss @@ -0,0 +1,185 @@ +.LeftSearch { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + + & > .Transition { + flex: 1; + overflow: hidden; + } + + .TabList { + padding-bottom: 1px; + z-index: 1; + } + + .documents-list { + padding: 0 1.25rem 1.25rem; + + .ListItem + .ListItem { + margin-top: 1.25rem; + } + } + + .section-heading { + position: relative; + padding-top: 1.25rem; + padding-left: 1.25rem; + margin: 0 0 1rem -1.25rem !important; + + font-weight: 500; + font-size: .9375rem; + color: var(--color-text-secondary); + + &::before { + content: ''; + position: absolute; + width: 100%; + height: 1px; + background: var(--color-borders); + left: .625rem; + top: -1px; + } + } + + .LeftSearch .search-section .section-heading, + .RecentContacts .search-section .section-heading { + margin-left: -1rem !important; + width: calc(100% + 2rem); + box-shadow: 0 -1px 0 0 var(--color-borders); + + &::before { + display: none; + } + } + + .WebLink { + display: flex; + } + + .content:not(.with-seekline) { + align-self: center; + min-width: 0; + flex-grow: 1; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + } + + .message-date { + font-size: .75rem; + color: var(--color-text-secondary); + padding-left: 1rem; + white-space: nowrap; + } + + .media-list { + display: grid; + padding: .5rem; + grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 1fr; + grid-gap: .25rem; + } + + .Audio { + .duration span { + padding: 0 .25rem; + } + + .ProgressSpinner { + margin: -.1875rem 0 0 -.1875rem; + } + } + + .ListItem.search-result { + .ChatInfo { + .handle { + color: var(--color-primary); + + &::before { + content: '@'; + } + + &::after { + content: ', '; + color: var(--color-text-secondary); + } + } + } + } + + .ListItem.search-result-message { + .sender-name { + color: var(--color-text); + + &::after { + content: ': '; + white-space: pre; + } + } + } + + @media (max-width: 600px) { + .ListItem { + margin: 0 -0.625rem; + } + } + + .search-section { + padding: 0 1rem 0.5rem; + + .section-heading { + color: var(--color-text-secondary); + font-size: .9375rem; + font-weight: 500; + margin-bottom: 0 !important; + padding-top: .875rem; + + .Link { + float: right; + color: var(--color-links); + font-weight: 400; + margin-right: 1rem; + + &:focus, + &:hover { + color: var(--color-links-hover); + } + } + } + + .Loading { + height: 4.5rem; + margin-bottom: 0.5rem; + } + } + + .chat-selection { + padding-top: .5rem; + display: flex; + flex-shrink: 0; + flex-wrap: nowrap; + justify-content: space-between; + align-items: flex-end; + box-shadow: inset 0 -1px 0 0 var(--color-borders); + background-color: white; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + overflow-y: hidden; + + scrollbar-color: rgba(0, 0, 0, 0); + + > .PickerSelectedItem { + flex: 0 0 auto; + + &:last-child { + margin-right: auto; + } + } + } + + .NothingFound { + height: 100%; + } +} diff --git a/src/components/left/search/LeftSearch.tsx b/src/components/left/search/LeftSearch.tsx new file mode 100644 index 000000000..f4c22fb99 --- /dev/null +++ b/src/components/left/search/LeftSearch.tsx @@ -0,0 +1,137 @@ +import React, { + FC, memo, useCallback, useState, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { GlobalSearchContent } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import { parseDateString } from '../../../util/dateFormat'; + +import TabList from '../../ui/TabList'; +import Transition from '../../ui/Transition'; +import ChatResults from './ChatResults'; +import UserChatResults from './ChatMessageResults'; +import MediaResults from './MediaResults'; +import LinkResults from './LinkResults'; +import FileResults from './FileResults'; +import AudioResults from './AudioResults'; + +import './LeftSearch.scss'; + +export type OwnProps = { + searchQuery?: string; + searchDate?: number; + onReset: () => void; +}; + +type StateProps = { + currentContent?: GlobalSearchContent; + chatId?: number; +}; + +type DispatchProps = Pick; + +const TABS = [ + { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' }, + { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' }, + { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' }, + { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' }, + { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' }, + { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' }, +]; + +const CHAT_TABS = [ + { type: GlobalSearchContent.ChatList, title: 'All Messages' }, + ...TABS.slice(1), +]; + +const TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2; + +const LeftSearch: FC = ({ + searchQuery, + searchDate, + currentContent = GlobalSearchContent.ChatList, + chatId, + setGlobalSearchContent, + setGlobalSearchDate, + onReset, +}) => { + const [activeTab, setActiveTab] = useState(0); + const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]); + + const handleSwitchTab = useCallback((index: number) => { + const tab = TABS[index]; + setGlobalSearchContent({ content: tab.type }); + setActiveTab(index); + }, [setGlobalSearchContent]); + + const handleSearchDateSelect = useCallback((value: Date) => { + setGlobalSearchDate({ date: value.getTime() / 1000 }); + }, [setGlobalSearchDate]); + + return ( +
    + + + {() => { + switch (currentContent) { + case GlobalSearchContent.ChatList: + if (chatId) { + return ( + + ); + } + return ( + + ); + case GlobalSearchContent.Media: + return ; + case GlobalSearchContent.Links: + return ; + case GlobalSearchContent.Files: + return ; + case GlobalSearchContent.Music: + return ( + + ); + case GlobalSearchContent.Voice: + return ( + + ); + default: + return undefined; + } + }} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { currentContent, chatId } = global.globalSearch; + + return { currentContent, chatId }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']), +)(LeftSearch)); diff --git a/src/components/left/search/LeftSearchResultChat.tsx b/src/components/left/search/LeftSearchResultChat.tsx new file mode 100644 index 000000000..13d83b4a0 --- /dev/null +++ b/src/components/left/search/LeftSearchResultChat.tsx @@ -0,0 +1,82 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiUser } from '../../../api/types'; + +import useChatContextActions from '../../../hooks/useChatContextActions'; +import useFlag from '../../../hooks/useFlag'; +import { isChatPrivate, getPrivateChatUserId } from '../../../modules/helpers'; +import { selectChat, selectUser, selectIsChatPinned } from '../../../modules/selectors'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import GroupChatInfo from '../../common/GroupChatInfo'; +import DeleteChatModal from '../../common/DeleteChatModal'; +import ListItem from '../../ui/ListItem'; + +type OwnProps = { + chatId: number; + withHandle?: boolean; + onClick: (id: number) => void; +}; + +type StateProps = { + chat?: ApiChat; + privateChatUser?: ApiUser; + isPinned?: boolean; +}; + +const LeftSearchResultChat: FC = ({ + chatId, + chat, + privateChatUser, + isPinned, + withHandle, + onClick, +}) => { + const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag(); + + const contextActions = useChatContextActions({ + chat, + privateChatUser, + isPinned, + handleDelete: openDeleteModal, + }); + + if (!chat) { + return undefined; + } + + return ( + onClick(chatId)} + contextActions={contextActions} + > + {isChatPrivate(chatId) ? ( + + ) : ( + + )} + + + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const privateChatUserId = chat && getPrivateChatUserId(chat); + const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined; + const isPinned = selectIsChatPinned(global, chatId); + + return { + chat, + privateChatUser, + isPinned, + }; + }, +)(LeftSearchResultChat)); diff --git a/src/components/left/search/LinkResults.tsx b/src/components/left/search/LinkResults.tsx new file mode 100644 index 000000000..c830609f7 --- /dev/null +++ b/src/components/left/search/LinkResults.tsx @@ -0,0 +1,119 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection } from '../../../types'; + +import { SLIDE_TRANSITION_DURATION } from '../../../config'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { createMapStateToProps, StateProps } from './helpers/createMapStateToProps'; +import { pick } from '../../../util/iteratees'; +import { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat'; +import { getSenderName } from './helpers/getSenderName'; +import { throttle } from '../../../util/schedulers'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import WebLink from '../../common/WebLink'; +import NothingFound from '../../common/NothingFound'; +import Loading from '../../ui/Loading'; + +export type OwnProps = { + searchQuery?: string; +}; + +type DispatchProps = Pick; + +const CURRENT_TYPE = 'links'; +const runThrottled = throttle((cb) => cb(), 500, true); + +const LinkResults: FC = ({ + searchQuery, + searchChatId, + isLoading, + chatsById, + usersById, + globalMessagesByChatId, + foundIds, + lastSyncTime, + searchMessagesGlobal, + focusMessage, +}) => { + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: CURRENT_TYPE, + query: searchQuery, + chatId: searchChatId, + }); + }); + } + }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]); + + const foundMessages = useMemo(() => { + if (!foundIds || !globalMessagesByChatId) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds.map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + + return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]; + }).filter(Boolean); + }, [globalMessagesByChatId, foundIds]); + + const handleMessageFocus = useCallback((messageId: number, chatId: number) => { + focusMessage({ chatId, messageId }); + }, [focusMessage]); + + function renderList() { + return foundMessages.map((message, index) => { + const shouldDrawDateDivider = index === 0 + || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date); + return ( +
    + {shouldDrawDateDivider && ( +

    {formatMonthAndYear(new Date(message.date * 1000))}

    + )} + +
    + ); + }); + } + + const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading; + + return ( +
    + + {!canRenderContents && } + {canRenderContents && (!foundIds || foundIds.length === 0) && } + {canRenderContents && foundIds && foundIds.length > 0 && renderList()} + +
    + ); +}; + +export default memo(withGlobal( + createMapStateToProps(CURRENT_TYPE), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'searchMessagesGlobal', + 'focusMessage', + ]), +)(LinkResults)); diff --git a/src/components/left/search/MediaResults.tsx b/src/components/left/search/MediaResults.tsx new file mode 100644 index 000000000..2b3e010d1 --- /dev/null +++ b/src/components/left/search/MediaResults.tsx @@ -0,0 +1,132 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { LoadMoreDirection, MediaViewerOrigin } from '../../../types'; + +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { createMapStateToProps, StateProps } from './helpers/createMapStateToProps'; +import { pick } from '../../../util/iteratees'; +import buildClassName from '../../../util/buildClassName'; +import { throttle } from '../../../util/schedulers'; + +import InfiniteScroll from '../../ui/InfiniteScroll'; +import Media from '../../common/Media'; +import ChatMessage from './ChatMessage'; +import NothingFound from '../../common/NothingFound'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; +import { SLIDE_TRANSITION_DURATION } from '../../../config'; +import Loading from '../../ui/Loading'; + +export type OwnProps = { + searchQuery?: string; +}; + +type DispatchProps = Pick; + +const CURRENT_TYPE = 'media'; +const runThrottled = throttle((cb) => cb(), 500, true); + +const MediaResults: FC = ({ + searchQuery, + searchChatId, + isLoading, + globalMessagesByChatId, + foundIds, + lastSyncTime, + searchMessagesGlobal, + openMediaViewer, +}) => { + const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + if (lastSyncTime && direction === LoadMoreDirection.Backwards) { + runThrottled(() => { + searchMessagesGlobal({ + type: CURRENT_TYPE, + query: searchQuery, + chatId: searchChatId, + }); + }); + } + }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]); + + const foundMessages = useMemo(() => { + if (!foundIds || !globalMessagesByChatId) { + return MEMO_EMPTY_ARRAY; + } + + return foundIds.map((id) => { + const [chatId, messageId] = id.split('_').map(Number); + + return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]; + }).filter(Boolean); + }, [globalMessagesByChatId, foundIds]); + + const handleSelectMedia = useCallback((messageId: number, chatId: number) => { + openMediaViewer({ + chatId, + messageId, + origin: MediaViewerOrigin.SearchResult, + }); + }, [openMediaViewer]); + + function renderGallery() { + return ( +
    + {foundMessages.map((message) => ( + + ))} +
    + ); + } + + function renderSearchResult() { + return foundMessages.map((message) => ( + + )); + } + + const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading; + const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery; + const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery; + + const classNames = buildClassName( + 'search-content custom-scroll', + isMessageList && 'chat-list', + ); + + return ( +
    + + {!canRenderContents && } + {canRenderContents && (!foundIds || foundIds.length === 0) && } + {isMediaGrid && renderGallery()} + {isMessageList && renderSearchResult()} + +
    + ); +}; + +export default memo(withGlobal( + createMapStateToProps(CURRENT_TYPE), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'searchMessagesGlobal', + 'openMediaViewer', + ]), +)(MediaResults)); diff --git a/src/components/left/search/RecentContacts.scss b/src/components/left/search/RecentContacts.scss new file mode 100644 index 000000000..b5e5220a1 --- /dev/null +++ b/src/components/left/search/RecentContacts.scss @@ -0,0 +1,81 @@ +.RecentContacts { + .Loading { + min-height: 75vh; + } + + .top-peers-section { + padding: .5rem 1rem; + } + + .top-peers { + height: 6rem; + margin: 0 -1rem; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + + scrollbar-width: none; + scrollbar-color: rgba(0, 0, 0, 0); + + &::-webkit-scrollbar { + height: 0; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0); + } + } + + .top-peer-item { + display: inline-block; + width: 4.5rem; + height: 6rem; + padding: 0.625rem 0.25rem; + margin-left: 0.5rem; + border-radius: var(--border-radius-default); + cursor: pointer; + position: relative; + overflow: hidden; + + &:first-child { + margin-left: 0.125rem; + } + + &:last-child { + margin-right: 0.125rem; + } + + .Avatar { + margin: 0 auto 0.375rem; + } + + &:hover { + background: var(--color-chat-hover); + } + + .top-peer-name { + text-align: center; + white-space: nowrap; + font-size: 0.75rem; + overflow: hidden; + text-overflow: ellipsis; + + .emoji-small { + width: 1rem; + height: 1rem; + background-size: 1rem; + margin-right: 1px; + vertical-align: -3px; + } + } + } + + .recent-chats-header { + display: flex; + align-items: center; + + .Button { + margin-left: auto; + } + } +} diff --git a/src/components/left/search/RecentContacts.tsx b/src/components/left/search/RecentContacts.tsx new file mode 100644 index 000000000..a4d4662aa --- /dev/null +++ b/src/components/left/search/RecentContacts.tsx @@ -0,0 +1,132 @@ +import React, { + FC, useEffect, useCallback, useRef, memo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiUser } from '../../../api/types'; + +import { getUserFirstName } from '../../../modules/helpers'; +import renderText from '../../common/helpers/renderText'; +import { throttle } from '../../../util/schedulers'; +import { pick } from '../../../util/iteratees'; +import useHorizontalScroll from '../../../hooks/useHorizontalScroll'; +import useLang from '../../../hooks/useLang'; + +import Avatar from '../../common/Avatar'; +import Button from '../../ui/Button'; +import LeftSearchResultChat from './LeftSearchResultChat'; + +import './RecentContacts.scss'; + +type OwnProps = { + onReset: () => void; +}; + +type StateProps = { + topUserIds?: number[]; + usersById: Record; + recentlyFoundChatIds?: number[]; +}; + +type DispatchProps = Pick; + +const SEARCH_CLOSE_TIMEOUT_MS = 250; +const runThrottled = throttle((cb) => cb(), 60000, true); + +const RecentContacts: FC = ({ + topUserIds, usersById, recentlyFoundChatIds, + onReset, loadTopUsers, loadContactList, openChat, + addRecentlyFoundChatId, clearRecentlyFoundChats, +}) => { + // eslint-disable-next-line no-null/no-null + const topUsersRef = useRef(null); + + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadTopUsers(); + // Loading full contact list for quick local search before user enters the query + loadContactList(); + }); + }, [loadTopUsers, loadContactList]); + + useHorizontalScroll(topUsersRef, !topUserIds); + + const handleClick = useCallback( + (id: number) => { + openChat({ id }); + onReset(); + setTimeout(() => { + addRecentlyFoundChatId({ id }); + }, SEARCH_CLOSE_TIMEOUT_MS); + }, + [openChat, addRecentlyFoundChatId, onReset], + ); + + const lang = useLang(); + + return ( +
    + {topUserIds && ( +
    +
    + {topUserIds.map((userId) => ( +
    handleClick(userId)}> + +
    {renderText(getUserFirstName(usersById[userId])!)}
    +
    + ))} +
    +
    + )} + {recentlyFoundChatIds && ( +
    +

    + {lang('Recent')} + + +

    + {recentlyFoundChatIds.map((id) => ( + + ))} +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { userIds: topUserIds } = global.topPeers; + const usersById = global.users.byId; + const { recentlyFoundChatIds } = global.globalSearch; + + return { + topUserIds, + usersById, + recentlyFoundChatIds, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadTopUsers', + 'loadContactList', + 'openChat', + 'addRecentlyFoundChatId', + 'clearRecentlyFoundChats', + ]), +)(RecentContacts)); diff --git a/src/components/left/search/helpers/createMapStateToProps.ts b/src/components/left/search/helpers/createMapStateToProps.ts new file mode 100644 index 000000000..584650df6 --- /dev/null +++ b/src/components/left/search/helpers/createMapStateToProps.ts @@ -0,0 +1,43 @@ +import { GlobalState } from '../../../../global/types'; +import { + ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser, +} from '../../../../api/types'; + +export type StateProps = { + isLoading?: boolean; + chatsById: Record; + usersById: Record; + globalMessagesByChatId?: Record }>; + foundIds?: string[]; + lastSyncTime?: number; + searchChatId?: number; +}; + +export function createMapStateToProps(type: ApiGlobalMessageSearchType) { + return (global: GlobalState, props: any) => { + const { byId: chatsById } = global.chats; + const { byId: usersById } = global.users; + const { + fetchingStatus, resultsByType, chatId, + } = global.globalSearch; + + // One component is used for two different types of results. + // The differences between them are only in the isVoice property. + // The rest of the search results use their own personal components. + const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio'); + + const { byChatId: globalMessagesByChatId } = global.messages; + const { foundIds } = (resultsByType && resultsByType[currentType]) || {}; + + return { + isLoading: foundIds === undefined + || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false), + chatsById, + usersById, + globalMessagesByChatId, + foundIds, + searchChatId: chatId, + lastSyncTime: global.lastSyncTime, + }; + }; +} diff --git a/src/components/left/search/helpers/getSenderName.ts b/src/components/left/search/helpers/getSenderName.ts new file mode 100644 index 000000000..7076a5c5a --- /dev/null +++ b/src/components/left/search/helpers/getSenderName.ts @@ -0,0 +1,31 @@ +import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types'; +import { + getChatTitle, + getSenderTitle, + isChatPrivate, + isChatGroup, +} from '../../../../modules/helpers'; + +export function getSenderName( + message: ApiMessage, chatsById: Record, usersById: Record, +) { + const { senderId } = message; + if (!senderId) { + return undefined; + } + + const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId]; + + let senderName = getSenderTitle(sender); + + const chat = chatsById[message.chatId]; + if (chat) { + if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) { + senderName = `You → ${getChatTitle(chat)}`; + } else if (isChatGroup(chat)) { + senderName += ` → ${getChatTitle(chat)}`; + } + } + + return senderName; +} diff --git a/src/components/left/settings/Settings.async.tsx b/src/components/left/settings/Settings.async.tsx new file mode 100644 index 000000000..244a14484 --- /dev/null +++ b/src/components/left/settings/Settings.async.tsx @@ -0,0 +1,16 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; + +import { OwnProps } from './Settings'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; +import Loading from '../../ui/Loading'; + +const SettingsAsync: FC = (props) => { + const Settings = useModuleLoader(Bundles.Extra, 'Settings'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return Settings ? : ; +}; + +export default SettingsAsync; diff --git a/src/components/left/settings/Settings.scss b/src/components/left/settings/Settings.scss new file mode 100644 index 000000000..864db14a0 --- /dev/null +++ b/src/components/left/settings/Settings.scss @@ -0,0 +1,282 @@ +#Settings { + height: 100%; + + > div { + display: flex; + flex-direction: column; + overflow: hidden; + } +} + +.settings-main-header { + display: flex; + flex-grow: 1; + justify-content: space-between; + align-items: center; +} + +.settings-more-menu { + .bubble { + width: auto; + + .MenuItem button { + padding-left: 1rem !important; + padding-right: 2rem !important; + } + } +} + +.settings-content { + height: calc(100% - var(--header-height)); + overflow-y: auto; + + &.infinite-scroll { + display: flex; + flex-direction: column; + + & > .custom-scroll { + flex: 1 1 auto; + height: auto; + } + } + + #monkey { + margin-top: .5rem; + margin-bottom: 1rem; + } + + .AnimatedEmoji { + margin-top: .5rem; + margin-bottom: 1.5rem; + } +} + +.settings-content-header { + display: flex; + flex-direction: column; + align-items: center; + padding: 0 1.5rem 1rem; + text-align: center; + + .input-group { + width: 100%; + } +} + +.settings-content-icon { + width: 5rem; + height: 5rem; + margin-bottom: 2.5rem; + position: relative; + + .AnimatedSticker { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + + &.hidden { + display: none + } + } +} + +.settings-main-menu { + padding: 0 0.5rem 1rem; +} + +.settings-current-user { + margin-bottom: 1.125rem; + text-align: center; + + .Avatar { + margin: 0 auto 1.5rem; + } + + .name { + display: flex; + justify-content: center; + align-items: center; + font-weight: 500; + font-size: 1.5rem; + line-height: 2rem; + margin: 0; + + .VerifiedIcon { + margin-left: 0.25rem; + margin-top: 0.1rem; + } + } + + .phone { + font-size: 0.875rem; + color: #868e96; + margin: 0; + } +} + +.settings-item { + border-top: 1px solid var(--color-borders); + padding: 1.5rem 1.5rem 1rem; + + &.no-border { + border-top: none; + } + + &-header { + font-size: 1rem; + color: var(--color-text-secondary); + margin-bottom: 2rem; + position: relative; + } + + &-description { + font-size: 0.875rem; + color: var(--color-text-secondary); + margin-top: -0.5rem; + margin-bottom: 1.5rem; + + .settings-content.two-fa & { + font-size: 1rem; + } + } + + &-description-larger { + font-size: 1rem; + line-height: 1.3125rem; + color: var(--color-text-secondary); + margin-top: 2rem; + margin-bottom: 0.75rem; + } + + .ListItem { + margin: 0 -1rem 1rem; + + &:last-child { + margin-bottom: 0; + } + + .multiline-menu-item { + white-space: initial; + + &.full-size { + width: 100%; + } + + .date { + float: right; + font-size: 0.75rem; + margin-left: 1rem; + color: var(--color-text-secondary); + } + + .title, .subtitle { + display: block; + text-align: left; + } + + .title { + line-height: 1.25rem; + } + + .subtitle { + font-size: 0.875rem; + line-height: 1.5rem; + color: var(--color-text-secondary); + + & + .subtitle { + margin-top: -0.25rem; + } + + &.black { + color: var(--color-text); + } + + &.tight { + line-height: 1.3125rem; + margin-bottom: .1875rem; + } + } + } + + &.destructive { + .ListItem-button { + color: var(--color-error); + + i { + color: inherit; + } + } + } + + &.blocked-list-item { + margin-bottom: 0.5rem; + + .ListItem-button { + align-items: center; + text-align: left; + padding: 0.5rem; + } + + .Avatar { + width: 3rem; + height: 3rem; + margin-right: 1rem; + } + + .contact-name { + font-size: 1rem; + line-height: 1rem; + margin-bottom: 0.25rem; + font-weight: 500; + } + + .contact-phone { + font-size: 0.875rem; + line-height: 1rem; + color: var(--color-text-secondary); + } + } + } + + .RangeSlider { + margin-bottom: 1.0625rem; + } + + .Checkbox, .radio-group { + margin: 0 -1rem 0.5rem; + } + + .radio-group { + .Radio:last-child { + margin-bottom: 0; + } + } + + .Radio + .Radio, .Checkbox + .Checkbox { + margin-top: 2rem; + } +} + +.settings-fab-wrapper { + height: calc(100% - var(--header-height)); + position: relative; + overflow: hidden; + + .settings-content { + height: 100%; + } + + .FloatingActionButton { + right: 1.5rem; + } +} + +.settings-edit-profile { + padding: 0 1.5rem; +} + +.username-link { + color: var(--color-links); +} diff --git a/src/components/left/settings/Settings.tsx b/src/components/left/settings/Settings.tsx new file mode 100644 index 000000000..275b069bc --- /dev/null +++ b/src/components/left/settings/Settings.tsx @@ -0,0 +1,225 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; + +import { SettingsScreens } from '../../../types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import useFoldersReducer from '../../../hooks/reducers/useFoldersReducer'; +import useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer'; + +import Transition from '../../ui/Transition'; +import SettingsHeader from './SettingsHeader'; +import SettingsMain from './SettingsMain'; +import SettingsEditProfile from './SettingsEditProfile'; +import SettingsFolders from './folders/SettingsFolders'; +import SettingsGeneral from './SettingsGeneral'; +import SettingsGeneralBackground from './SettingsGeneralBackground'; +import SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor'; +import SettingsNotifications from './SettingsNotifications'; +import SettingsPrivacy from './SettingsPrivacy'; +import SettingsLanguage from './SettingsLanguage'; +import SettingsPrivacyVisibility from './SettingsPrivacyVisibility'; +import SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions'; +import SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers'; +import SettingsTwoFa from './twoFa/SettingsTwoFa'; +import SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList'; + +import './Settings.scss'; + +const TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2; +const TRANSITION_DURATION = 200; + +export type OwnProps = { + currentScreen: SettingsScreens; + onScreenSelect: (screen: SettingsScreens) => void; + onReset: () => void; +}; + +const Settings: FC = ({ + currentScreen, + onScreenSelect, + onReset, +}) => { + const [foldersState, foldersDispatch] = useFoldersReducer(); + const [twoFaState, twoFaDispatch] = useTwoFaReducer(); + + const handleReset = useCallback(() => { + if ( + currentScreen === SettingsScreens.FoldersCreateFolder + || currentScreen === SettingsScreens.FoldersEditFolder + ) { + setTimeout(() => { + foldersDispatch({ type: 'reset' }); + }, TRANSITION_DURATION); + } + + if ( + currentScreen === SettingsScreens.FoldersIncludedChats + || currentScreen === SettingsScreens.FoldersExcludedChats + ) { + if (foldersState.mode === 'create') { + onScreenSelect(SettingsScreens.FoldersCreateFolder); + } else { + onScreenSelect(SettingsScreens.FoldersEditFolder); + } + return; + } + + onReset(); + }, [ + foldersState.mode, foldersDispatch, + currentScreen, onReset, onScreenSelect, + ]); + + const handleSaveFilter = useCallback(() => { + foldersDispatch({ type: 'saveFilters' }); + handleReset(); + }, [foldersDispatch, handleReset]); + + function renderCurrentSectionContent() { + switch (currentScreen) { + case SettingsScreens.Main: + return ( + + ); + case SettingsScreens.EditProfile: + return ( + + ); + case SettingsScreens.General: + return ( + + ); + case SettingsScreens.Notifications: + return ( + + ); + case SettingsScreens.Privacy: + return ( + + ); + case SettingsScreens.Language: + return ( + + ); + case SettingsScreens.GeneralChatBackground: + return ( + + ); + case SettingsScreens.GeneralChatBackgroundColor: + return ( + + ); + case SettingsScreens.PrivacyActiveSessions: + return ( + + ); + case SettingsScreens.PrivacyBlockedUsers: + return ( + + ); + case SettingsScreens.PrivacyPhoneNumber: + case SettingsScreens.PrivacyLastSeen: + case SettingsScreens.PrivacyProfilePhoto: + case SettingsScreens.PrivacyForwarding: + case SettingsScreens.PrivacyGroupChats: + return ( + + ); + + case SettingsScreens.PrivacyPhoneNumberAllowedContacts: + case SettingsScreens.PrivacyLastSeenAllowedContacts: + case SettingsScreens.PrivacyProfilePhotoAllowedContacts: + case SettingsScreens.PrivacyForwardingAllowedContacts: + case SettingsScreens.PrivacyGroupChatsAllowedContacts: + return ( + + ); + + case SettingsScreens.PrivacyPhoneNumberDeniedContacts: + case SettingsScreens.PrivacyLastSeenDeniedContacts: + case SettingsScreens.PrivacyProfilePhotoDeniedContacts: + case SettingsScreens.PrivacyForwardingDeniedContacts: + case SettingsScreens.PrivacyGroupChatsDeniedContacts: + return ( + + ); + + case SettingsScreens.Folders: + case SettingsScreens.FoldersCreateFolder: + case SettingsScreens.FoldersEditFolder: + case SettingsScreens.FoldersIncludedChats: + case SettingsScreens.FoldersExcludedChats: + return ( + + ); + + case SettingsScreens.TwoFaDisabled: + case SettingsScreens.TwoFaNewPassword: + case SettingsScreens.TwoFaNewPasswordConfirm: + case SettingsScreens.TwoFaNewPasswordHint: + case SettingsScreens.TwoFaNewPasswordEmail: + case SettingsScreens.TwoFaNewPasswordEmailCode: + case SettingsScreens.TwoFaCongratulations: + case SettingsScreens.TwoFaEnabled: + case SettingsScreens.TwoFaChangePasswordCurrent: + case SettingsScreens.TwoFaChangePasswordNew: + case SettingsScreens.TwoFaChangePasswordConfirm: + case SettingsScreens.TwoFaChangePasswordHint: + case SettingsScreens.TwoFaTurnOff: + case SettingsScreens.TwoFaRecoveryEmailCurrentPassword: + case SettingsScreens.TwoFaRecoveryEmail: + case SettingsScreens.TwoFaRecoveryEmailCode: + return ( + + ); + + default: + return undefined; + } + } + + function renderCurrentSection() { + return ( + <> + + {renderCurrentSectionContent()} + + ); + } + + return ( + + {renderCurrentSection} + + ); +}; + +export default memo(Settings); diff --git a/src/components/left/settings/SettingsEditProfile.tsx b/src/components/left/settings/SettingsEditProfile.tsx new file mode 100644 index 000000000..8ff3f5d71 --- /dev/null +++ b/src/components/left/settings/SettingsEditProfile.tsx @@ -0,0 +1,282 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useState, useCallback, memo, useEffect, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiMediaFormat } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; +import { ProfileEditProgress } from '../../../types'; + +import { throttle } from '../../../util/schedulers'; +import { pick } from '../../../util/iteratees'; +import { selectUser } from '../../../modules/selectors'; +import { getChatAvatarHash } from '../../../modules/helpers'; +import useMedia from '../../../hooks/useMedia'; +import useLang from '../../../hooks/useLang'; + +import AvatarEditable from '../../ui/AvatarEditable'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import InputText from '../../ui/InputText'; +import renderText from '../../common/helpers/renderText'; +import UsernameInput from '../../common/UsernameInput'; + +type StateProps = { + currentAvatarHash?: string; + currentFirstName?: string; + currentLastName?: string; + currentBio?: string; + currentUsername?: string; + progress?: ProfileEditProgress; + isUsernameAvailable?: boolean; +}; + +type DispatchProps = Pick; + +const runThrottled = throttle((cb) => cb(), 60000, true); + +const MAX_BIO_LENGTH = 70; + +const ERROR_FIRST_NAME_MISSING = 'Please provide your first name'; +const ERROR_BIO_TOO_LONG = 'Bio can\' be longer than 70 characters'; + +const SettingsEditProfile: FC = ({ + currentAvatarHash, + currentFirstName, + currentLastName, + currentBio, + currentUsername, + progress, + isUsernameAvailable, + loadCurrentUser, + updateProfile, + checkUsername, +}) => { + const [isUsernameTouched, setIsUsernameTouched] = useState(false); + const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false); + const [error, setError] = useState(); + + const [photo, setPhoto] = useState(); + const [firstName, setFirstName] = useState(currentFirstName || ''); + const [lastName, setLastName] = useState(currentLastName || ''); + const [bio, setBio] = useState(currentBio || ''); + const [username, setUsername] = useState(currentUsername || ''); + + const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl); + + const isLoading = progress === ProfileEditProgress.InProgress; + const isUsernameError = username === false; + + const isSaveButtonShown = useMemo(() => { + if (isUsernameError) { + return false; + } + + return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true; + }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]); + + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadCurrentUser(); + }); + }, [loadCurrentUser]); + + useEffect(() => { + setPhoto(undefined); + }, [currentAvatarBlobUrl]); + + useEffect(() => { + setFirstName(currentFirstName || ''); + setLastName(currentLastName || ''); + setBio(currentBio || ''); + }, [currentFirstName, currentLastName, currentBio]); + + useEffect(() => { + setUsername(currentUsername || ''); + }, [currentUsername]); + + useEffect(() => { + if (progress === ProfileEditProgress.Complete) { + setIsProfileFieldsTouched(false); + setIsUsernameTouched(false); + setError(undefined); + } + }, [progress]); + + const handlePhotoChange = useCallback((newPhoto: File) => { + setPhoto(newPhoto); + }, []); + + const handleFirstNameChange = useCallback((e: ChangeEvent) => { + setFirstName(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleLastNameChange = useCallback((e: ChangeEvent) => { + setLastName(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleBioChange = useCallback((e: ChangeEvent) => { + setBio(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleUsernameChange = useCallback((value: string | false) => { + setUsername(value); + setIsUsernameTouched(true); + }, []); + + const handleProfileSave = useCallback(() => { + const trimmedFirstName = firstName.trim(); + const trimmedLastName = lastName.trim(); + const trimmedBio = bio.trim(); + + if (!trimmedFirstName.length) { + setError(ERROR_FIRST_NAME_MISSING); + return; + } + + if (trimmedBio.length > MAX_BIO_LENGTH) { + setError(ERROR_BIO_TOO_LONG); + return; + } + + updateProfile({ + photo, + ...(isProfileFieldsTouched && { + firstName: trimmedFirstName, + lastName: trimmedLastName, + bio: trimmedBio, + }), + ...(isUsernameTouched && { + username, + }), + }); + }, [ + photo, + firstName, lastName, bio, isProfileFieldsTouched, + username, isUsernameTouched, + updateProfile, + ]); + + const lang = useLang(); + + return ( +
    +
    +
    + + + + + +

    + {renderText(lang('BioAbout'), ['br', 'simple_markdown'])} +

    +
    + +
    +

    {lang('Username')}

    + + + +

    + {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])} +

    + {username && ( +

    + This link opens a chat with you:
    + https://t.me/{username} +

    + )} +
    +
    + + + {isLoading ? ( + + ) : ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { currentUserId } = global; + const { progress, isUsernameAvailable } = global.profileEdit || {}; + const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined; + + if (!currentUser) { + return { + progress, + isUsernameAvailable, + }; + } + + const { + firstName: currentFirstName, + lastName: currentLastName, + username: currentUsername, + fullInfo, + } = currentUser; + const { bio: currentBio } = fullInfo || {}; + const currentAvatarHash = getChatAvatarHash(currentUser); + + return { + currentAvatarHash, + currentFirstName, + currentLastName, + currentBio, + currentUsername, + progress, + isUsernameAvailable, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadCurrentUser', + 'updateProfile', + 'checkUsername', + ]), +)(SettingsEditProfile)); diff --git a/src/components/left/settings/SettingsGeneral.tsx b/src/components/left/settings/SettingsGeneral.tsx new file mode 100644 index 000000000..0f77ba424 --- /dev/null +++ b/src/components/left/settings/SettingsGeneral.tsx @@ -0,0 +1,253 @@ +import React, { + FC, useCallback, memo, useEffect, useRef, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { SettingsScreens, ISettings } from '../../../types'; +import { ApiSticker, ApiStickerSet } from '../../../api/types'; + +import { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment'; +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; +import useFlag from '../../../hooks/useFlag'; +import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; + +import ListItem from '../../ui/ListItem'; +import RangeSlider from '../../ui/RangeSlider'; +import Checkbox from '../../ui/Checkbox'; +import RadioGroup from '../../ui/RadioGroup'; +import SettingsStickerSet from './SettingsStickerSet'; +import StickerSetModal from '../../common/StickerSetModal.async'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = ISettings['byKey'] & { + stickerSetIds?: string[]; + stickerSetsById?: Record; +}; + +type DispatchProps = Pick; + +const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [ + { value: 'enter', label: 'Send by Enter', subLabel: 'New line by Shift + Enter' }, + { value: 'ctrl-enter', label: `Send by ${IS_MAC_OS ? 'Cmd' : 'Ctrl'} + Enter`, subLabel: 'New line by Enter' }, +] : undefined; + +const ANIMATION_LEVEL_OPTIONS = [ + 'Solid and Steady', + 'Nice and Fast', + 'Lots of Stuff', +]; + +const SettingsGeneral: FC = ({ + onScreenSelect, + stickerSetIds, + stickerSetsById, + messageTextSize, + animationLevel, + messageSendKeyCombo, + shouldAutoDownloadMediaFromContacts, + shouldAutoDownloadMediaInPrivateChats, + shouldAutoDownloadMediaInGroups, + shouldAutoDownloadMediaInChannels, + shouldAutoPlayGifs, + shouldAutoPlayVideos, + shouldSuggestStickers, + shouldLoopStickers, + setSettingOption, + loadStickerSets, + loadAddedStickers, +}) => { + // eslint-disable-next-line no-null/no-null + const stickerSettingsRef = useRef(null); + const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef }); + const [isModalOpen, openModal, closeModal] = useFlag(); + const [sticker, setSticker] = useState(); + + useEffect(() => { + loadStickerSets(); + }, [loadStickerSets]); + + useEffect(() => { + if (stickerSetIds && stickerSetIds.length) { + loadAddedStickers(); + } + }, [stickerSetIds, loadAddedStickers]); + + const handleAnimationLevelChange = useCallback((newLevel: number) => { + ANIMATION_LEVEL_OPTIONS.forEach((_, i) => { + document.body.classList.toggle(`animation-level-${i}`, newLevel === i); + }); + + setSettingOption({ animationLevel: newLevel }); + }, [setSettingOption]); + + const handleMessageTextSizeChange = useCallback((newSize: number) => { + document.documentElement.style.setProperty('--message-text-size', `${newSize}px`); + + setSettingOption({ messageTextSize: newSize }); + }, [setSettingOption]); + + const handleStickerSetClick = useCallback((value: ApiSticker) => { + setSticker(value); + openModal(); + }, [openModal]); + + const lang = useLang(); + + + const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => { + return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false; + }).filter(Boolean); + + return ( +
    +
    +

    {lang('SETTINGS')}

    + + + + onScreenSelect(SettingsScreens.GeneralChatBackground)} + > + {lang('ChatBackground')} + +
    + +
    +

    + Animation Level +

    +

    Choose the desired animations amount.

    + + +
    + + {KEYBOARD_SEND_OPTIONS && ( +
    +

    {lang('Keyboard')}

    + + setSettingOption({ messageSendKeyCombo: value })} + selected={messageSendKeyCombo} + /> +
    + )} + +
    +

    {lang('AutoDownloadMedia')}

    + + setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })} + /> + setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })} + /> + setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })} + /> + setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })} + /> +
    + +
    +

    {lang('AutoplayMedia')}

    + + setSettingOption({ shouldAutoPlayGifs: isChecked })} + /> + setSettingOption({ shouldAutoPlayVideos: isChecked })} + /> +
    + +
    +

    {lang('AccDescrStickers')}

    + + setSettingOption({ shouldSuggestStickers: isChecked })} + /> + setSettingOption({ shouldLoopStickers: isChecked })} + /> + +
    + {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => ( + + ))} +
    + {sticker && ( + + )} +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + return { + ...pick(global.settings.byKey, + [ + 'messageTextSize', + 'animationLevel', + 'messageSendKeyCombo', + 'shouldAutoDownloadMediaFromContacts', + 'shouldAutoDownloadMediaInPrivateChats', + 'shouldAutoDownloadMediaInGroups', + 'shouldAutoDownloadMediaInChannels', + 'shouldAutoPlayGifs', + 'shouldAutoPlayVideos', + 'shouldSuggestStickers', + 'shouldLoopStickers', + ]), + stickerSetIds: global.stickers.added.setIds, + stickerSetsById: global.stickers.setsById, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setSettingOption', 'loadStickerSets', 'loadAddedStickers', + ]), +)(SettingsGeneral)); diff --git a/src/components/left/settings/SettingsGeneralBackground.scss b/src/components/left/settings/SettingsGeneralBackground.scss new file mode 100644 index 000000000..4e3a05ba5 --- /dev/null +++ b/src/components/left/settings/SettingsGeneralBackground.scss @@ -0,0 +1,14 @@ +.SettingsGeneralBackground { + .settings-wallpapers { + display: grid; + padding: .5rem; + grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 1fr; + grid-gap: .25rem; + } + + .Loading { + height: auto !important; + margin-top: 5rem; + } +} diff --git a/src/components/left/settings/SettingsGeneralBackground.tsx b/src/components/left/settings/SettingsGeneralBackground.tsx new file mode 100644 index 000000000..04ae269f0 --- /dev/null +++ b/src/components/left/settings/SettingsGeneralBackground.tsx @@ -0,0 +1,149 @@ +import React, { + FC, memo, useEffect, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { SettingsScreens, UPLOADING_WALLPAPER_SLUG } from '../../../types'; +import { ApiWallpaper } from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import { throttle } from '../../../util/schedulers'; +import { openSystemFilesDialog } from '../../../util/systemFilesDialog'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import Loading from '../../ui/Loading'; +import WallpaperTile from './WallpaperTile'; + +import './SettingsGeneralBackground.scss'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + customBackground?: string; + isBackgroundBlurred?: boolean; + loadedWallpapers?: ApiWallpaper[]; +}; + +type DispatchProps = Pick; + +const SUPPORTED_TYPES = 'image/jpeg'; + +const runThrottled = throttle((cb) => cb(), 60000, true); + +const SettingsGeneralBackground: FC = ({ + onScreenSelect, + customBackground, + isBackgroundBlurred, + loadedWallpapers, + setSettingOption, + loadWallpapers, + uploadWallpaper, +}) => { + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadWallpapers(); + }); + }, [loadWallpapers]); + + const handleFileSelect = useCallback((e: Event) => { + const { files } = e.target as HTMLInputElement; + + if (files && files.length > 0) { + uploadWallpaper(files[0]); + } + }, [uploadWallpaper]); + + const handleUploadWallpaper = useCallback(() => { + openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true); + }, [handleFileSelect]); + + const handleSetColor = useCallback(() => { + onScreenSelect(SettingsScreens.GeneralChatBackgroundColor); + }, [onScreenSelect]); + + const handleResetToDefault = useCallback(() => { + setSettingOption({ customBackground: undefined }); + }, [setSettingOption]); + + const handleWallPaperSelect = useCallback((slug: string) => { + setSettingOption({ customBackground: slug }); + }, [setSettingOption]); + + const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => { + setSettingOption({ isBackgroundBlurred: e.target.checked }); + }, [setSettingOption]); + + const lang = useLang(); + + const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG; + + return ( +
    +
    + + {lang('UploadImage')} + + + + {lang('SetColor')} + + + + {lang('ThemeResetToDefaults')} + + + +
    + + {loadedWallpapers ? ( +
    + {loadedWallpapers.map((wallpaper) => ( + + ))} +
    + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { isBackgroundBlurred, customBackground } = global.settings.byKey; + const { loadedWallpapers } = global.settings; + + return { + customBackground, + isBackgroundBlurred, + loadedWallpapers, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setSettingOption', 'loadWallpapers', 'uploadWallpaper', + ]), +)(SettingsGeneralBackground)); diff --git a/src/components/left/settings/SettingsGeneralBackgroundColor.scss b/src/components/left/settings/SettingsGeneralBackgroundColor.scss new file mode 100644 index 000000000..63b9000a8 --- /dev/null +++ b/src/components/left/settings/SettingsGeneralBackgroundColor.scss @@ -0,0 +1,87 @@ +.SettingsGeneralBackgroundColor { + &:not(.is-dragging) .handle { + transition: transform 300ms ease; + } + + .color-picker, .hue-picker { + position: relative; + } + + .color-picker { + margin-top: 1rem; + height: 12rem; + } + + .hue-picker { + margin: 2rem 0; + height: 0.5rem; + } + + canvas { + display: block; + width: 100%; + height: 100%; + border-radius: var(--border-radius-default); + cursor: pointer; + } + + .handle { + position: absolute; + top: -0.75rem; + left: -0.75rem; + width: 1.5rem; + height: 1.5rem; + border: 0.125rem solid white; + border-radius: 0.75rem; + cursor: grab; + } + + .hue-picker .handle { + top: -0.5rem; + } + + .tools { + margin-bottom: 0.625rem; + display: flex; + + .input-group { + margin-bottom: 0; + } + + .input-group:first-child { + margin-right: 0.5rem; + } + + .input-group:last-child { + margin-left: 0.5rem; + } + } + + .predefined-colors { + display: grid; + padding: .5rem; + grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 1fr; + grid-gap: .25rem; + + div { + cursor: pointer; + box-shadow: inset 0 0 0 0 white; + transition: box-shadow 300ms ease; + + &.active { + border: 0.125rem solid var(--color-primary); + box-shadow: inset 0 0 0 0.3125rem white; + } + + // A hack to make a square + &:before { + display: block; + content: ""; + width: 100%; + padding-top: 100%; + pointer-events: none; + } + } + } +} diff --git a/src/components/left/settings/SettingsGeneralBackgroundColor.tsx b/src/components/left/settings/SettingsGeneralBackgroundColor.tsx new file mode 100644 index 000000000..6e7c42d4e --- /dev/null +++ b/src/components/left/settings/SettingsGeneralBackgroundColor.tsx @@ -0,0 +1,334 @@ +import { ChangeEvent, MutableRefObject, RefObject } from 'react'; +import React, { + FC, memo, useCallback, useEffect, useRef, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { SettingsScreens } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import { + hex2rgb, hsb2rgb, rgb2hex, rgb2hsb, +} from '../../../util/colors'; +import { captureEvents, RealTouchEvent } from '../../../util/captureEvents'; +import useFlag from '../../../hooks/useFlag'; +import buildClassName from '../../../util/buildClassName'; + +import InputText from '../../ui/InputText'; + +import './SettingsGeneralBackgroundColor.scss'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + customBackground?: string; +}; + +type DispatchProps = Pick; + +interface CanvasRects { + colorRect: { + offsetLeft: number; + top: number; + width: number; + height: number; + }; + hueRect: { + offsetLeft: number; + width: number; + }; +} + +const DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee')); +const PREDEFINED_COLORS = [ + '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e', + '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851', +]; + +const SettingsGeneralBackground: FC = ({ + customBackground, + setSettingOption, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const colorPickerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const huePickerRef = useRef(null); + const isFirstRunRef = useRef(true); + + const [hsb, setHsb] = useState(getInitialHsb(customBackground)); + // Cache for drag handlers + const hsbRef = useRef(hsb); + useEffect(() => { + hsbRef.current = hsb; + }, [hsb]); + + const [isDragging, markIsDragging, unmarkIsDragging] = useFlag(); + const [rgbInput, setRgbInput] = useState(''); + const [hexInput, setHexInput] = useState(''); + + const rectsRef = useRef(); + const colorCtxRef = useRef(); + + // Setup: cache rects, subscribe for drag events + useEffect(() => { + // We use `offsetLeft` instead of `left` to support screen transition + const colorRect = { + offsetLeft: colorPickerRef.current!.offsetLeft, + ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']), + }; + const hueRect = { + offsetLeft: huePickerRef.current!.offsetLeft, + ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']), + }; + + rectsRef.current = { colorRect, hueRect }; + + function handleColorDrag(e: MouseEvent | RealTouchEvent) { + const colorPosition = [ + Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1), + Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1), + ]; + + const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!); + + setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!)); + markIsDragging(); + } + + captureEvents(colorPickerRef.current!, { + onCapture: handleColorDrag, + onDrag: handleColorDrag, + onRelease: unmarkIsDragging, + onClick: unmarkIsDragging, + withCursor: true, + }); + + function handleHueDrag(e: MouseEvent | RealTouchEvent) { + const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!); + const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1); + + setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!)); + markIsDragging(); + } + + captureEvents(huePickerRef.current!, { + onCapture: handleHueDrag, + onDrag: handleHueDrag, + onRelease: unmarkIsDragging, + onClick: unmarkIsDragging, + withCursor: true, + }); + }, [markIsDragging, unmarkIsDragging]); + + const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {}; + const hex = rgb2hex(hsb2rgb(hsb)); + const hue = hsb[0]; + const hueHex = rgb2hex(hsb2rgb([hue, 1, 1])); + + // Save value and update inputs when HSL changes + useEffect(() => { + const rgb = hsb2rgb(hsb); + const color = `#${rgb2hex(rgb)}`; + + setRgbInput(rgb.join(', ')); + setHexInput(color); + + if (!isFirstRunRef.current) { + setSettingOption({ customBackground: color }); + } + isFirstRunRef.current = false; + }, [hsb, setSettingOption]); + + // Redraw color picker when hue changes + useEffect(() => { + drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef); + }, [hue]); + + // Initially draw hue picker + useEffect(() => { + drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement); + }, []); + + const handleRgbChange = useCallback((e: ChangeEvent) => { + const rgbValue = e.currentTarget.value.replace(/[^\d, ]/g, '').slice(0, 13); + + if (rgbValue.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)) { + const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number]; + setHsb(rgb2hsb(rgb)); + } + + e.currentTarget.value = rgbValue; + }, []); + + const handleHexChange = useCallback((e: ChangeEvent) => { + const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6); + + if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) { + setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', '')))); + } + + e.currentTarget.value = hexValue; + }, []); + + const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => { + setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', '')))); + }, []); + + const className = buildClassName( + 'SettingsGeneralBackgroundColor settings-content custom-scroll', + isDragging && 'is-dragging', + ); + + return ( +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    + {PREDEFINED_COLORS.map((color) => ( +
    + ))} +
    +
    + ); +}; + +function getInitialHsb(customBackground?: string) { + return customBackground && customBackground.startsWith('#') + ? rgb2hsb(hex2rgb(customBackground.replace('#', ''))) + : DEFAULT_HSB; +} + +function hsb2positions(hsb: [number, number, number], rects: CanvasRects) { + return { + colorPosition: [ + Math.round((hsb[1]) * (rects.colorRect.width - 1)), + Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)), + ], + huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)), + }; +} + +function positions2hsb( + { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number }, + rects: CanvasRects, +): [number, number, number] { + return [ + huePosition / (rects.hueRect.width - 1), + colorPosition[0] / (rects.colorRect.width - 1), + 1 - colorPosition[1] / (rects.colorRect.height - 1), + ]; +} + +function drawColor( + canvas: HTMLCanvasElement, + hue: number, + colorCtxRef: MutableRefObject, + rectsRef: RefObject, +) { + let w: number; + let h: number; + let ctx: CanvasRenderingContext2D; + + if (!colorCtxRef.current || !rectsRef.current) { + // First run + w = canvas.offsetWidth; + h = canvas.offsetHeight; + ctx = canvas.getContext('2d')!; + + canvas.width = w; + canvas.height = h; + + colorCtxRef.current = ctx; + } else { + w = rectsRef.current.colorRect.width; + h = rectsRef.current.colorRect.height; + ctx = colorCtxRef.current; + } + + const imgData = ctx!.createImageData(w, h); + const pixels = imgData.data; + const col = hsb2rgb([hue, 1, 1]); + + let index = 0; + + for (let y = 0; y < h; y++) { + const perY = 1 - y / (h - 1); + const st = [255 * perY, 255 * perY, 255 * perY]; + const ed = [col[0] * perY, col[1] * perY, col[2] * perY]; + for (let x = 0; x < w; x++) { + const perX = x / (w - 1); + pixels[index++] = st[0] + (ed[0] - st[0]) * perX; + pixels[index++] = st[1] + (ed[1] - st[1]) * perX; + pixels[index++] = st[2] + (ed[2] - st[2]) * perX; + pixels[index++] = 255; + } + } + + ctx!.putImageData(imgData, 0, 0); +} + +function drawHue(canvas: HTMLCanvasElement) { + const w = canvas.offsetWidth; + const h = 1; + canvas.width = w; + canvas.height = h; + const ctx = canvas.getContext('2d')!; + + const imgData = ctx.createImageData(w, h); + const pixels = imgData.data; + + let index = 0; + + for (let x = 0; x < w; x++) { + const hue = x / (w - 1); + const rgb = hsb2rgb([hue, 1, 1]); + /* eslint-disable prefer-destructuring */ + pixels[index++] = rgb[0]; + pixels[index++] = rgb[1]; + pixels[index++] = rgb[2]; + /* eslint-enable prefer-destructuring */ + pixels[index++] = 255; + } + + ctx.putImageData(imgData, 0, 0); +} + +export default memo(withGlobal( + (global): StateProps => { + return { + customBackground: global.settings.byKey.customBackground, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setSettingOption']), +)(SettingsGeneralBackground)); diff --git a/src/components/left/settings/SettingsHeader.tsx b/src/components/left/settings/SettingsHeader.tsx new file mode 100644 index 000000000..811205b2b --- /dev/null +++ b/src/components/left/settings/SettingsHeader.tsx @@ -0,0 +1,249 @@ +import React, { + FC, useCallback, useMemo, memo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { SettingsScreens } from '../../../types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; + +import DropdownMenu from '../../ui/DropdownMenu'; +import MenuItem from '../../ui/MenuItem'; +import Button from '../../ui/Button'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +type OwnProps = { + currentScreen: SettingsScreens; + editedFolderId?: number; + onReset: () => void; + onSaveFilter: () => void; +}; + +type DispatchProps = Pick; + +const SettingsHeader: FC = ({ + currentScreen, + editedFolderId, + onReset, + onSaveFilter, + signOut, + deleteChatFolder, +}) => { + const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false); + const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false); + + const openSignOutConfirmation = useCallback(() => { + setIsSignOutDialogOpen(true); + }, []); + + const closeSignOutConfirmation = useCallback(() => { + setIsSignOutDialogOpen(false); + }, []); + + const openDeleteFolderConfirmation = useCallback(() => { + setIsDeleteFolderDialogOpen(true); + }, []); + + const closeDeleteFolderConfirmation = useCallback(() => { + setIsDeleteFolderDialogOpen(false); + }, []); + + const handleSignOutMessage = useCallback(() => { + closeSignOutConfirmation(); + signOut(); + }, [closeSignOutConfirmation, signOut]); + + const handleDeleteFolderMessage = useCallback(() => { + closeDeleteFolderConfirmation(); + deleteChatFolder({ id: editedFolderId }); + onReset(); + }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]); + + const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => { + return ({ onTrigger, isOpen }) => ( + + ); + }, []); + + const lang = useLang(); + + function renderHeaderContent() { + switch (currentScreen) { + case SettingsScreens.EditProfile: + return

    {lang('EditProfile')}

    ; + case SettingsScreens.General: + return

    {lang('General')}

    ; + case SettingsScreens.Notifications: + return

    {lang('Notifications')}

    ; + case SettingsScreens.Privacy: + return

    {lang('PrivacySettings')}

    ; + case SettingsScreens.Language: + return

    {lang('Language')}

    ; + + case SettingsScreens.GeneralChatBackground: + return

    {lang('ChatBackground')}

    ; + case SettingsScreens.GeneralChatBackgroundColor: + return

    {lang('SetColor')}

    ; + + case SettingsScreens.PrivacyPhoneNumber: + return

    {lang('PrivacyPhone')}

    ; + case SettingsScreens.PrivacyLastSeen: + return

    {lang('PrivacyLastSeen')}

    ; + case SettingsScreens.PrivacyProfilePhoto: + return

    {lang('Privacy.ProfilePhoto')}

    ; + case SettingsScreens.PrivacyForwarding: + return

    {lang('PrivacyForwards')}

    ; + case SettingsScreens.PrivacyGroupChats: + return

    {lang('AutodownloadGroupChats')}

    ; + case SettingsScreens.PrivacyPhoneNumberAllowedContacts: + case SettingsScreens.PrivacyLastSeenAllowedContacts: + case SettingsScreens.PrivacyProfilePhotoAllowedContacts: + case SettingsScreens.PrivacyForwardingAllowedContacts: + case SettingsScreens.PrivacyGroupChatsAllowedContacts: + return

    {lang('AlwaysShareWith')}

    ; + case SettingsScreens.PrivacyPhoneNumberDeniedContacts: + case SettingsScreens.PrivacyLastSeenDeniedContacts: + case SettingsScreens.PrivacyProfilePhotoDeniedContacts: + case SettingsScreens.PrivacyForwardingDeniedContacts: + case SettingsScreens.PrivacyGroupChatsDeniedContacts: + return

    {lang('NeverShareWith')}

    ; + + case SettingsScreens.PrivacyActiveSessions: + return

    {lang('SessionsTitle')}

    ; + case SettingsScreens.PrivacyBlockedUsers: + return

    {lang('BlockedUsers')}

    ; + + case SettingsScreens.TwoFaDisabled: + case SettingsScreens.TwoFaEnabled: + return

    {lang('TwoStepVerification')}

    ; + case SettingsScreens.TwoFaNewPassword: + case SettingsScreens.TwoFaChangePasswordNew: + case SettingsScreens.TwoFaChangePasswordConfirm: + return

    {lang('EnterPassword')}

    ; + case SettingsScreens.TwoFaNewPasswordConfirm: + return

    {lang('PleaseReEnterPassword')}

    ; + case SettingsScreens.TwoFaNewPasswordHint: + case SettingsScreens.TwoFaChangePasswordHint: + return

    {lang('PasswordHint')}

    ; + case SettingsScreens.TwoFaNewPasswordEmail: + case SettingsScreens.TwoFaRecoveryEmail: + return

    {lang('RecoveryEmailTitle')}

    ; + case SettingsScreens.TwoFaNewPasswordEmailCode: + case SettingsScreens.TwoFaRecoveryEmailCode: + return

    Recovery Email Code

    ; + case SettingsScreens.TwoFaCongratulations: + return

    {lang('TwoStepVerificationPasswordSet')}

    ; + case SettingsScreens.TwoFaChangePasswordCurrent: + case SettingsScreens.TwoFaTurnOff: + case SettingsScreens.TwoFaRecoveryEmailCurrentPassword: + return

    {lang('PleaseEnterCurrentPassword')}

    ; + + case SettingsScreens.Folders: + return

    {lang('Filters')}

    ; + case SettingsScreens.FoldersCreateFolder: + return

    {lang('FilterNew')}

    ; + case SettingsScreens.FoldersEditFolder: + return ( +
    +

    {lang('FilterEdit')}

    + + {editedFolderId && ( + + Delete Folder + + )} +
    + ); + case SettingsScreens.FoldersIncludedChats: + case SettingsScreens.FoldersExcludedChats: + return ( +
    + {currentScreen === SettingsScreens.FoldersIncludedChats ? ( +

    {lang('FilterInclude')}

    + ) : ( +

    {lang('FilterExclude')}

    + )} + + +
    + ); + + default: + return ( +
    +

    {lang('SETTINGS')}

    + + + {lang('LogOutTitle')} + +
    + ); + } + } + + return ( +
    + + {renderHeaderContent()} + + +
    + ); +}; + +export default memo(withGlobal( + undefined, + (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']), +)(SettingsHeader)); diff --git a/src/components/left/settings/SettingsLanguage.tsx b/src/components/left/settings/SettingsLanguage.tsx new file mode 100644 index 000000000..a21049f7d --- /dev/null +++ b/src/components/left/settings/SettingsLanguage.tsx @@ -0,0 +1,84 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ISettings } from '../../../types'; +import { ApiLanguage } from '../../../api/types'; + +import { setLanguage } from '../../../util/langProvider'; +import { pick } from '../../../util/iteratees'; + +import RadioGroup from '../../ui/RadioGroup'; +import Loading from '../../ui/Loading'; +import useFlag from '../../../hooks/useFlag'; + +type StateProps = Pick; + +type DispatchProps = Pick; + +const SettingsLanguage: FC = ({ + languages, + language, + loadLanguages, + setSettingOption, +}) => { + const [selectedLanguage, setSelectedLanguage] = useState(language); + const [isLoading, markIsLoading, unmarkIsLoading] = useFlag(); + + // TODO Throttle + useEffect(() => { + loadLanguages(); + }, [loadLanguages]); + + const handleChange = useCallback((langCode: string) => { + setSelectedLanguage(langCode); + markIsLoading(); + + setLanguage(langCode, () => { + unmarkIsLoading(); + setSettingOption({ language: langCode }); + }); + }, [markIsLoading, unmarkIsLoading, setSettingOption]); + + const options = useMemo(() => { + return languages ? buildOptions(languages) : undefined; + }, [languages]); + + return ( +
    + {options ? ( + + ) : ( + + )} +
    + ); +}; + +function buildOptions(languages: ApiLanguage[]) { + return languages.map(({ langCode, nativeName, name }) => ({ + value: langCode, + label: nativeName, + subLabel: name, + })); +} + +export default memo(withGlobal( + (global): StateProps => { + return { + languages: global.settings.byKey.languages, + language: global.settings.byKey.language, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadLanguages', 'setSettingOption', + ]), +)(SettingsLanguage)); diff --git a/src/components/left/settings/SettingsMain.tsx b/src/components/left/settings/SettingsMain.tsx new file mode 100644 index 000000000..d458c0deb --- /dev/null +++ b/src/components/left/settings/SettingsMain.tsx @@ -0,0 +1,88 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { SettingsScreens } from '../../../types'; +import { ApiUser } from '../../../api/types'; + +import { selectUser } from '../../../modules/selectors'; +import { getUserFullName } from '../../../modules/helpers'; +import { formatPhoneNumberWithCode } from '../../../util/phoneNumber'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import Avatar from '../../common/Avatar'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + currentUser?: ApiUser; +}; + +const SettingsMain: FC = ({ + onScreenSelect, + currentUser, +}) => { + const lang = useLang(); + + return ( +
    +
    + {currentUser && ( +
    + +

    {getUserFullName(currentUser)}

    +

    {formatPhoneNumberWithCode(currentUser.phoneNumber)}

    +
    + )} + onScreenSelect(SettingsScreens.EditProfile)} + > + {lang('EditProfile')} + + onScreenSelect(SettingsScreens.Folders)} + > + {lang('Filters')} + + onScreenSelect(SettingsScreens.General)} + > + {lang('GeneralSettings')} + + onScreenSelect(SettingsScreens.Notifications)} + > + {lang('Notifications')} + + onScreenSelect(SettingsScreens.Privacy)} + > + {lang('PrivacySettings')} + + onScreenSelect(SettingsScreens.Language)} + > + {lang('Language')} + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { currentUserId } = global; + + return { + currentUser: currentUserId ? selectUser(global, currentUserId) : undefined, + }; + }, +)(SettingsMain)); diff --git a/src/components/left/settings/SettingsNotifications.tsx b/src/components/left/settings/SettingsNotifications.tsx new file mode 100644 index 000000000..cf8c4be6a --- /dev/null +++ b/src/components/left/settings/SettingsNotifications.tsx @@ -0,0 +1,157 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, memo, useCallback, useEffect, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; + +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; + +import Checkbox from '../../ui/Checkbox'; + +type StateProps = { + hasPrivateChatsNotifications: boolean; + hasPrivateChatsMessagePreview: boolean; + hasGroupNotifications: boolean; + hasGroupMessagePreview: boolean; + hasBroadcastNotifications: boolean; + hasBroadcastMessagePreview: boolean; + hasContactJoinedNotifications: boolean; +}; + +type DispatchProps = Pick; + +const SettingsNotifications: FC = ({ + hasPrivateChatsNotifications, + hasPrivateChatsMessagePreview, + hasGroupNotifications, + hasGroupMessagePreview, + hasBroadcastNotifications, + hasBroadcastMessagePreview, + hasContactJoinedNotifications, + loadNotificationsSettings, + updateContactSignUpNotification, + updateNotificationSettings, +}) => { + useEffect(() => { + loadNotificationsSettings(); + }, [loadNotificationsSettings]); + + const handleSettingsChange = useCallback(( + e: ChangeEvent, + peerType: 'contact' | 'group' | 'broadcast', + setting: 'silent' | 'showPreviews', + ) => { + const currentIsSilent = peerType === 'contact' + ? !hasPrivateChatsNotifications + : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications); + const currentIsShowPreviews = peerType === 'contact' + ? hasPrivateChatsMessagePreview + : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview); + + updateNotificationSettings({ + peerType, + ...(setting === 'silent' && { isSilent: !e.target.checked, isShowPreviews: currentIsShowPreviews }), + ...(setting === 'showPreviews' && { isShowPreviews: e.target.checked, isSilent: currentIsSilent }), + }); + }, [ + hasBroadcastMessagePreview, hasBroadcastNotifications, + hasGroupMessagePreview, hasGroupNotifications, + hasPrivateChatsMessagePreview, hasPrivateChatsNotifications, + updateNotificationSettings, + ]); + + const handleContactNotificationChange = useCallback((e: ChangeEvent) => { + updateContactSignUpNotification({ + isSilent: !e.target.checked, + }); + }, [updateContactSignUpNotification]); + + const lang = useLang(); + + return ( +
    +
    +

    {lang('AutodownloadPrivateChats')}

    + + { handleSettingsChange(e, 'contact', 'silent'); }} + /> + { handleSettingsChange(e, 'contact', 'showPreviews'); }} + /> +
    + +
    +

    {lang('FilterGroups')}

    + + { handleSettingsChange(e, 'group', 'silent'); }} + /> + { handleSettingsChange(e, 'group', 'showPreviews'); }} + /> +
    + +
    +

    {lang('FilterChannels')}

    + + { handleSettingsChange(e, 'broadcast', 'silent'); }} + /> + { handleSettingsChange(e, 'broadcast', 'showPreviews'); }} + /> +
    + +
    +

    {lang('PhoneOther')}

    + + +
    +
    + ); +}; + +export default memo(withGlobal((global): StateProps => { + return { + hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications), + hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview), + hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications), + hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview), + hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications), + hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview), + hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications), + }; +}, +(setGlobal, actions): DispatchProps => pick(actions, [ + 'loadNotificationsSettings', + 'updateContactSignUpNotification', + 'updateNotificationSettings', +]))(SettingsNotifications)); diff --git a/src/components/left/settings/SettingsPrivacy.tsx b/src/components/left/settings/SettingsPrivacy.tsx new file mode 100644 index 000000000..d9e75f12d --- /dev/null +++ b/src/components/left/settings/SettingsPrivacy.tsx @@ -0,0 +1,189 @@ +import React, { FC, memo, useEffect } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { PrivacyVisibility, SettingsScreens } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + hasPassword?: boolean; + blockedCount: number; + sessionsCount: number; + visibilityPrivacyPhoneNumber?: PrivacyVisibility; + visibilityPrivacyLastSeen?: PrivacyVisibility; + visibilityPrivacyProfilePhoto?: PrivacyVisibility; + visibilityPrivacyForwarding?: PrivacyVisibility; + visibilityPrivacyGroupChats?: PrivacyVisibility; +}; + +type DispatchProps = Pick; + +const SettingsPrivacy: FC = ({ + onScreenSelect, + hasPassword, + blockedCount, + sessionsCount, + visibilityPrivacyPhoneNumber, + visibilityPrivacyLastSeen, + visibilityPrivacyProfilePhoto, + visibilityPrivacyForwarding, + visibilityPrivacyGroupChats, + loadPrivacySettings, + loadBlockedContacts, + loadAuthorizations, +}) => { + useEffect(() => { + loadBlockedContacts(); + loadAuthorizations(); + loadPrivacySettings(); + }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings]); + + const lang = useLang(); + + function getVisibilityValue(visibility?: PrivacyVisibility) { + switch (visibility) { + case 'everybody': + return lang('P2PEverybody'); + + case 'contacts': + return lang('P2PContacts'); + + case 'nobody': + return lang('P2PNobody'); + } + + return undefined; + } + + return ( +
    +
    + onScreenSelect(SettingsScreens.PrivacyBlockedUsers)} + > +
    + {lang('BlockedUsers')} + {blockedCount > 0 && ( + + {lang('Users', blockedCount)} + + )} +
    +
    + onScreenSelect( + hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled, + )} + > +
    + {lang('TwoStepVerification')} + {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')} +
    +
    + onScreenSelect(SettingsScreens.PrivacyActiveSessions)} + > +
    + {lang('SessionsTitle')} + {sessionsCount > 0 && ( + + {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`} + + )} +
    +
    +
    + +
    +

    {lang('PrivacyTitle')}

    + + onScreenSelect(SettingsScreens.PrivacyPhoneNumber)} + > +
    + {lang('PrivacyPhoneTitle')} + {getVisibilityValue(visibilityPrivacyPhoneNumber)} +
    +
    + onScreenSelect(SettingsScreens.PrivacyLastSeen)} + > +
    + {lang('LastSeenTitle')} + {getVisibilityValue(visibilityPrivacyLastSeen)} +
    +
    + onScreenSelect(SettingsScreens.PrivacyProfilePhoto)} + > +
    + {lang('PrivacyProfilePhotoTitle')} + {getVisibilityValue(visibilityPrivacyProfilePhoto)} +
    +
    + onScreenSelect(SettingsScreens.PrivacyForwarding)} + > +
    + {lang('PrivacyForwardsTitle')} + {getVisibilityValue(visibilityPrivacyForwarding)} +
    +
    + onScreenSelect(SettingsScreens.PrivacyGroupChats)} + > +
    + {lang('WhoCanAddMe')} + {getVisibilityValue(visibilityPrivacyGroupChats)} +
    +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + settings: { + byKey: { hasPassword }, + privacy, + }, + blocked, + activeSessions, + } = global; + + return { + hasPassword, + blockedCount: blocked.totalCount, + sessionsCount: activeSessions.length, + visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility, + visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility, + visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility, + visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility, + visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', + ]), +)(SettingsPrivacy)); diff --git a/src/components/left/settings/SettingsPrivacyActiveSessions.tsx b/src/components/left/settings/SettingsPrivacyActiveSessions.tsx new file mode 100644 index 000000000..27d9ebf24 --- /dev/null +++ b/src/components/left/settings/SettingsPrivacyActiveSessions.tsx @@ -0,0 +1,148 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiSession } from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import { formatPastTimeShort } from '../../../util/dateFormat'; +import useFlag from '../../../hooks/useFlag'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +type StateProps = { + activeSessions: ApiSession[]; +}; + +type DispatchProps = Pick; + +const SettingsPrivacyActiveSessions: FC = ({ + activeSessions, + loadAuthorizations, + terminateAuthorization, + terminateAllAuthorizations, +}) => { + const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag(); + useEffect(() => { + loadAuthorizations(); + }, [loadAuthorizations]); + + const handleTerminateSessionClick = useCallback((hash: string) => { + terminateAuthorization({ hash }); + }, [terminateAuthorization]); + + const handleTerminateAllSessions = useCallback(() => { + closeConfirmTerminateAllDialog(); + terminateAllAuthorizations(); + }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]); + + const currentSession = useMemo(() => { + return activeSessions.find((session) => session.isCurrent); + }, [activeSessions]); + + const otherSessions = useMemo(() => { + return activeSessions.filter((session) => !session.isCurrent); + }, [activeSessions]); + + const lang = useLang(); + + function renderCurrentSession(session: ApiSession) { + return ( +
    +

    {lang('AuthSessions.CurrentSession')}

    + + +
    + {session.appName} + {getDeviceEnvironment(session)} + {session.ip} - {getLocation(session)} +
    +
    + + + {lang('TerminateAllSessions')} + +
    + ); + } + + function renderOtherSessions(sessions: ApiSession[]) { + return ( +
    +

    Other Sessions

    + + {sessions.map(renderSession)} +
    + ); + } + + function renderSession(session: ApiSession) { + return ( + { + handleTerminateSessionClick(session.hash); + }, + }]} + > +
    + {formatPastTimeShort(session.dateActive * 1000)} + {session.appName} + {getDeviceEnvironment(session)} + {session.ip} - {getLocation(session)} +
    +
    + ); + } + + return ( +
    + {currentSession && renderCurrentSession(currentSession)} + + {otherSessions && renderOtherSessions(otherSessions)} + + {otherSessions && ( + + )}; +
    + ); +}; + +function getLocation(session: ApiSession) { + return [session.region, session.country].filter(Boolean).join(', '); +} + +function getDeviceEnvironment(session: ApiSession) { + return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`; +} + +export default memo(withGlobal( + (global): StateProps => ({ activeSessions: global.activeSessions }), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations', + ]), +)(SettingsPrivacyActiveSessions)); diff --git a/src/components/left/settings/SettingsPrivacyBlockedUsers.tsx b/src/components/left/settings/SettingsPrivacyBlockedUsers.tsx new file mode 100644 index 000000000..da83c0d91 --- /dev/null +++ b/src/components/left/settings/SettingsPrivacyBlockedUsers.tsx @@ -0,0 +1,142 @@ +import React, { + FC, memo, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat, ApiUser } from '../../../api/types'; + +import { CHAT_HEIGHT_PX } from '../../../config'; +import { formatPhoneNumberWithCode } from '../../../util/phoneNumber'; +import { pick } from '../../../util/iteratees'; +import { + getChatTitle, getUserFullName, isChatPrivate, +} from '../../../modules/helpers'; +import renderText from '../../common/helpers/renderText'; +import buildClassName from '../../../util/buildClassName'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Avatar from '../../common/Avatar'; +import Loading from '../../ui/Loading'; + +type StateProps = { + chatsByIds: Record; + usersByIds: Record; + blockedIds: number[]; +}; + +type DispatchProps = Pick; + +const SettingsPrivacyBlockedUsers: FC = ({ + chatsByIds, + usersByIds, + blockedIds, + unblockContact, +}) => { + const handleUnblockClick = useCallback((contactId: number) => { + unblockContact({ contactId }); + }, [unblockContact]); + + const lang = useLang(); + + function renderContact(contactId: number, i: number, viewportOffset: number) { + const isPrivate = isChatPrivate(contactId); + const user = isPrivate ? usersByIds[contactId] : undefined; + const chat = !isPrivate ? chatsByIds[contactId] : undefined; + + const className = buildClassName( + 'Chat chat-item-clickable blocked-list-item', + isPrivate ? 'private' : 'group', + ); + + return ( + { + handleUnblockClick(contactId); + }, + }]} + style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`} + > + +
    +

    {renderText((isPrivate ? getUserFullName(user) : getChatTitle(chat!)) || '')}

    + {user && user.phoneNumber && ( +
    {formatPhoneNumberWithCode(user.phoneNumber)}
    + )} + {user && !user.phoneNumber && user.username && ( +
    @{user.username}
    + )} +
    +
    + ); + } + + return ( +
    +
    +
    +

    + {lang('BlockedUsersInfo')} +

    +
    + +
    + {blockedIds && blockedIds.length ? ( +
    + {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))} +
    + ) : blockedIds && !blockedIds.length ? ( +
    + List is empty +
    + ) : ( + + )} +
    +
    + + { + }} + className="not-implemented" + ariaLabel="Add a blocked user" + > + + +
    + ); +}; + + +export default memo(withGlobal( + (global): StateProps => { + const { + chats: { + byId: chatsByIds, + }, + users: { + byId: usersByIds, + }, + blocked: { + ids, + }, + } = global; + + return { + chatsByIds, + usersByIds, + blockedIds: ids, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']), +)(SettingsPrivacyBlockedUsers)); diff --git a/src/components/left/settings/SettingsPrivacyVisibility.tsx b/src/components/left/settings/SettingsPrivacyVisibility.tsx new file mode 100644 index 000000000..3dd5dc6f8 --- /dev/null +++ b/src/components/left/settings/SettingsPrivacyVisibility.tsx @@ -0,0 +1,242 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat, ApiUser } from '../../../api/types'; +import { ApiPrivacySettings, SettingsScreens } from '../../../types'; + +import useLang from '../../../hooks/useLang'; +import { pick } from '../../../util/iteratees'; + +import ListItem from '../../ui/ListItem'; +import RadioGroup from '../../ui/RadioGroup'; +import { getPrivacyKey } from './helper/privacy'; + +type OwnProps = { + screen: SettingsScreens; + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = Partial & { + chatsById?: Record; + usersById?: Record; +}; + +type DispatchProps = Pick; + +const SettingsPrivacyVisibility: FC = ({ + screen, + onScreenSelect, + visibility, + allowUserIds, + allowChatIds, + blockUserIds, + blockChatIds, + chatsById, + setPrivacyVisibility, +}) => { + const lang = useLang(); + + const visibilityOptions = useMemo(() => { + switch (screen) { + case SettingsScreens.PrivacyProfilePhoto: + case SettingsScreens.PrivacyGroupChats: + return [ + { value: 'everybody', label: lang('P2PEverybody') }, + { value: 'contacts', label: lang('P2PContacts') }, + ]; + + default: + return [ + { value: 'everybody', label: lang('P2PEverybody') }, + { value: 'contacts', label: lang('P2PContacts') }, + { value: 'nobody', label: lang('P2PNobody') }, + ]; + } + }, [lang, screen]); + + const exceptionLists = { + shouldShowDenied: visibility !== 'nobody', + shouldShowAllowed: visibility !== 'everybody', + }; + + const privacyKey = getPrivacyKey(screen); + + const headerText = useMemo(() => { + switch (screen) { + case SettingsScreens.PrivacyPhoneNumber: + return lang('PrivacyPhoneTitle'); + case SettingsScreens.PrivacyLastSeen: + return lang('LastSeenTitle'); + case SettingsScreens.PrivacyProfilePhoto: + return lang('PrivacyProfilePhotoTitle'); + case SettingsScreens.PrivacyForwarding: + return lang('PrivacyForwardsTitle'); + case SettingsScreens.PrivacyGroupChats: + return lang('WhoCanAddMe'); + default: + return undefined; + } + }, [lang, screen]); + + const descriptionText = useMemo(() => { + switch (screen) { + case SettingsScreens.PrivacyLastSeen: + return lang('CustomHelp'); + default: + return undefined; + } + }, [lang, screen]); + + const allowedContactsScreen = (() => { + switch (screen) { + case SettingsScreens.PrivacyPhoneNumber: + return SettingsScreens.PrivacyPhoneNumberAllowedContacts; + case SettingsScreens.PrivacyLastSeen: + return SettingsScreens.PrivacyLastSeenAllowedContacts; + case SettingsScreens.PrivacyProfilePhoto: + return SettingsScreens.PrivacyProfilePhotoAllowedContacts; + case SettingsScreens.PrivacyForwarding: + return SettingsScreens.PrivacyForwardingAllowedContacts; + default: + return SettingsScreens.PrivacyGroupChatsAllowedContacts; + } + })(); + + const deniedContactsScreen = (() => { + switch (screen) { + case SettingsScreens.PrivacyPhoneNumber: + return SettingsScreens.PrivacyPhoneNumberDeniedContacts; + case SettingsScreens.PrivacyLastSeen: + return SettingsScreens.PrivacyLastSeenDeniedContacts; + case SettingsScreens.PrivacyProfilePhoto: + return SettingsScreens.PrivacyProfilePhotoDeniedContacts; + case SettingsScreens.PrivacyForwarding: + return SettingsScreens.PrivacyForwardingDeniedContacts; + default: + return SettingsScreens.PrivacyGroupChatsDeniedContacts; + } + })(); + + const allowedCount = useMemo(() => { + if (!allowUserIds || !allowChatIds || !chatsById) { + return 0; + } + + return allowChatIds.reduce((result, chatId) => { + return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0); + }, allowUserIds.length); + }, [allowChatIds, allowUserIds, chatsById]); + + const blockCount = useMemo(() => { + if (!blockUserIds || !blockChatIds || !chatsById) { + return 0; + } + + return blockChatIds.reduce((result, chatId) => { + return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0); + }, blockUserIds.length); + }, [blockChatIds, blockUserIds, chatsById]); + + const handleVisibilityChange = useCallback((value) => { + setPrivacyVisibility({ + privacyKey, + visibility: value, + }); + }, [privacyKey, setPrivacyVisibility]); + + return ( +
    +
    +

    {headerText}

    + + + + {descriptionText && ( +

    {descriptionText}

    + )} +
    + +
    +

    {lang('PrivacyExceptions')}

    + + {exceptionLists.shouldShowAllowed && ( + { onScreenSelect(allowedContactsScreen); }} + > +
    + {allowedCount > 0 && +{allowedCount}} + {lang('AlwaysShareWith')} + {lang('EditAdminAddUsers')} +
    +
    + )} + {exceptionLists.shouldShowDenied && ( + { onScreenSelect(deniedContactsScreen); }} + > +
    + {blockCount > 0 && −{blockCount}} + {lang('NeverShareWith')} + {lang('EditAdminAddUsers')} +
    +
    + )} +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { screen }): StateProps => { + let privacySettings: ApiPrivacySettings | undefined; + + const { + chats: { byId: chatsById }, + settings: { privacy }, + } = global; + + switch (screen) { + case SettingsScreens.PrivacyPhoneNumber: + privacySettings = privacy.phoneNumber; + break; + + case SettingsScreens.PrivacyLastSeen: + privacySettings = privacy.lastSeen; + break; + + case SettingsScreens.PrivacyProfilePhoto: + privacySettings = privacy.profilePhoto; + break; + + case SettingsScreens.PrivacyForwarding: + privacySettings = privacy.forwards; + break; + + case SettingsScreens.PrivacyGroupChats: + privacySettings = privacy.chatInvite; + break; + } + + if (!privacySettings) { + return {}; + } + + return { + ...privacySettings, + chatsById, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']), +)(SettingsPrivacyVisibility)); diff --git a/src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx b/src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx new file mode 100644 index 000000000..458a6d446 --- /dev/null +++ b/src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx @@ -0,0 +1,193 @@ +import React, { + FC, memo, useCallback, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions, GlobalState } from '../../../global/types'; +import { ApiChat } from '../../../api/types'; +import { ApiPrivacySettings, SettingsScreens } from '../../../types'; + +import useLang from '../../../hooks/useLang'; +import { pick } from '../../../util/iteratees'; +import searchWords from '../../../util/searchWords'; +import { getPrivacyKey } from './helper/privacy'; +import { + getChatTitle, isChatGroup, isChatPrivate, prepareChatList, +} from '../../../modules/helpers'; + +import Picker from '../../common/Picker'; +import FloatingActionButton from '../../ui/FloatingActionButton'; + +export type OwnProps = { + isAllowList?: boolean; + screen: SettingsScreens; + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + currentUserId?: number; + chatsById: Record; + listIds?: number[]; + orderedPinnedIds?: number[]; + archivedListIds?: number[]; + archivedPinnedIds?: number[]; + settings?: ApiPrivacySettings; +}; + +type DispatchProps = Pick; + +const SettingsPrivacyVisibilityExceptionList: FC = ({ + currentUserId, + isAllowList, + screen, + settings, + chatsById, + listIds, + orderedPinnedIds, + archivedListIds, + archivedPinnedIds, + setPrivacySettings, + onScreenSelect, +}) => { + const selectedContactIds = useMemo(() => { + if (!settings) { + return []; + } + + if (isAllowList) { + return [...settings.allowUserIds, ...settings.allowChatIds]; + } else { + return [...settings.blockUserIds, ...settings.blockChatIds]; + } + }, [isAllowList, settings]); + const [searchQuery, setSearchQuery] = useState(''); + const [isSubmitShown, setIsSubmitShown] = useState(false); + const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds); + + const chats = useMemo(() => { + const activeChatArrays = listIds + ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all') + : undefined; + const archivedChatArrays = archivedListIds + ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived') + : undefined; + + if (!activeChatArrays && !archivedChatArrays) { + return undefined; + } + + return [ + ...(activeChatArrays + ? [ + ...activeChatArrays.pinnedChats, + ...activeChatArrays.otherChats, + ] + : [] + ), + ...(archivedChatArrays ? archivedChatArrays.otherChats : []), + ]; + }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]); + + const displayedIds = useMemo(() => { + if (!chats) { + return undefined; + } + + return chats + .filter((chat) => ( + ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat)) + && ( + !searchQuery + || searchWords(getChatTitle(chat), searchQuery) + || selectedContactIds.includes(chat.id) + ) + )) + .map(({ id }) => id); + }, [chats, currentUserId, searchQuery, selectedContactIds]); + + const handleSelectedContactIdsChange = useCallback((value: number[]) => { + setNewSelectedContactIds(value); + setIsSubmitShown(true); + }, []); + + const handleSubmit = useCallback(() => { + setPrivacySettings({ + privacyKey: getPrivacyKey(screen), + isAllowList: Boolean(isAllowList), + contactsIds: newSelectedContactIds, + }); + + onScreenSelect(SettingsScreens.Privacy); + }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]); + + const lang = useLang(); + + return ( +
    + + + + + +
    + ); +}; + +function getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) { + const { privacy } = global.settings; + switch (screen) { + case SettingsScreens.PrivacyPhoneNumberAllowedContacts: + case SettingsScreens.PrivacyPhoneNumberDeniedContacts: + return privacy.phoneNumber; + case SettingsScreens.PrivacyLastSeenAllowedContacts: + case SettingsScreens.PrivacyLastSeenDeniedContacts: + return privacy.lastSeen; + case SettingsScreens.PrivacyProfilePhotoAllowedContacts: + case SettingsScreens.PrivacyProfilePhotoDeniedContacts: + return privacy.profilePhoto; + case SettingsScreens.PrivacyForwardingAllowedContacts: + case SettingsScreens.PrivacyForwardingDeniedContacts: + return privacy.forwards; + case SettingsScreens.PrivacyGroupChatsDeniedContacts: + case SettingsScreens.PrivacyGroupChatsAllowedContacts: + return privacy.chatInvite; + } + + return undefined; +} + +export default memo(withGlobal( + (global, { screen }): StateProps => { + const { + chats: { + byId: chatsById, + listIds, + orderedPinnedIds, + }, + currentUserId, + } = global; + + return { + currentUserId, + chatsById, + listIds: listIds.active, + orderedPinnedIds: orderedPinnedIds.active, + archivedPinnedIds: orderedPinnedIds.archived, + archivedListIds: listIds.archived, + settings: getCurrentPrivacySettings(global, screen), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']), +)(SettingsPrivacyVisibilityExceptionList)); diff --git a/src/components/left/settings/SettingsStickerSet.scss b/src/components/left/settings/SettingsStickerSet.scss new file mode 100644 index 000000000..bfc8a4baf --- /dev/null +++ b/src/components/left/settings/SettingsStickerSet.scss @@ -0,0 +1,25 @@ +.SettingsStickerSet { + .settings-item &.ListItem { + margin-bottom: .5rem; + } + + .StickerButton, + .Button { + width: 3rem; + height: 3rem; + margin: 0 .5rem 0 0; + padding: 0; + flex: 0 0 3rem; + } + + img { + max-width: 100%; + max-height: 100%; + } + + .multiline-menu-item { + display: flex; + flex-direction: column; + justify-content: center; + } +} diff --git a/src/components/left/settings/SettingsStickerSet.tsx b/src/components/left/settings/SettingsStickerSet.tsx new file mode 100644 index 000000000..a45c6105b --- /dev/null +++ b/src/components/left/settings/SettingsStickerSet.tsx @@ -0,0 +1,90 @@ +import React, { + FC, memo, +} from '../../../lib/teact/teact'; +import { ApiSticker, ApiStickerSet } from '../../../api/types'; + +import { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config'; +import { ObserveFn } from '../../../hooks/useIntersectionObserver'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import Button from '../../ui/Button'; +import StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated'; +import StickerSetCover from '../../middle/composer/StickerSetCover'; +import StickerButton from '../../common/StickerButton'; + +import './SettingsStickerSet.scss'; + +type OwnProps = { + stickerSet?: ApiStickerSet; + observeIntersection: ObserveFn; + onClick: (value: ApiSticker) => void; +}; + +const SettingsStickerSet: FC = ({ + stickerSet, + observeIntersection, + onClick, +}) => { + const lang = useLang(); + + if (!stickerSet || !stickerSet.stickers) { + return undefined; + } + + const firstSticker = stickerSet.stickers && stickerSet.stickers[0]; + + if (stickerSet.hasThumbnail || !firstSticker) { + return ( + firstSticker && onClick(firstSticker)} + > + +
    +
    {stickerSet.title}
    +
    {lang('StickerPack.StickerCount', stickerSet.count, 'i')}
    +
    +
    + ); + } else { + return ( + onClick(firstSticker)} + > + +
    +
    {stickerSet.title}
    +
    {lang('StickerPack.StickerCount', stickerSet.count, 'i')}
    +
    +
    + ); + } +}; + +export default memo(SettingsStickerSet); diff --git a/src/components/left/settings/WallpaperTile.scss b/src/components/left/settings/WallpaperTile.scss new file mode 100644 index 000000000..1115e407c --- /dev/null +++ b/src/components/left/settings/WallpaperTile.scss @@ -0,0 +1,55 @@ +.WallpaperTile { + height: 0; + padding-bottom: 100%; + cursor: pointer; + position: relative; + + .media-inner, + &::after { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + } + + .media-inner { + overflow: hidden; + transform: scale(1); + transition: transform .15s ease; + + img { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + object-fit: cover; + } + } + + &::after { + content: ""; + display: block; + border: 2px solid var(--color-primary); + opacity: 0; + transition: opacity .15s ease; + } + + &.selected { + &::after { + opacity: 1; + } + + .media-inner { + transform: scale(0.9); + } + } + + .spinner-container { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/components/left/settings/WallpaperTile.tsx b/src/components/left/settings/WallpaperTile.tsx new file mode 100644 index 000000000..d517a98d1 --- /dev/null +++ b/src/components/left/settings/WallpaperTile.tsx @@ -0,0 +1,114 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { ApiWallpaper } from '../../../api/types'; +import { UPLOADING_WALLPAPER_SLUG } from '../../../types'; + +import { CUSTOM_BG_CACHE_NAME } from '../../../config'; +import * as cacheApi from '../../../util/cacheApi'; +import { fetchBlob } from '../../../util/files'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import buildClassName from '../../../util/buildClassName'; +import useMedia from '../../../hooks/useMedia'; +import useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress'; +import useShowTransition from '../../../hooks/useShowTransition'; +import usePrevious from '../../../hooks/usePrevious'; +import useBlur from '../../../hooks/useBlur'; + +import ProgressSpinner from '../../ui/ProgressSpinner'; + +import './WallpaperTile.scss'; + +type OwnProps = { + wallpaper: ApiWallpaper; + isSelected: boolean; + onClick: (slug: string) => void; +}; + +const ANIMATION_DURATION = 300; + +const WallpaperTile: FC = ({ + wallpaper, + isSelected, + onClick, +}) => { + const { slug, document } = wallpaper; + + const localMediaHash = `wallpaper${document.id!}`; + const localBlobUrl = document.previewBlobUrl; + const previewBlobUrl = useMedia(`${localMediaHash}?size=m`); + const thumbDataUri = useBlur( + document.thumbnail && document.thumbnail.dataUri, + Boolean(previewBlobUrl), + ANIMATION_DURATION, + ); + const { + shouldRenderThumb, shouldRenderFullMedia, transitionClassNames, + } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow'); + const [isDownloadAllowed, setIsDownloadAllowed] = useState(false); + const { + mediaData: fullMedia, downloadProgress, + } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed); + const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false; + const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition( + (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG, + undefined, + wasDownloadDisabled, + 'slow', + ); + + const handleSelect = useCallback(() => { + (async () => { + const blob = await fetchBlob(fullMedia!); + await cacheApi.save(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, blob); + onClick(slug); + })(); + }, [fullMedia, onClick, slug]); + + useEffect(() => { + if (fullMedia) { + handleSelect(); + } + }, [fullMedia, handleSelect]); + + const handleClick = useCallback(() => { + if (fullMedia) { + handleSelect(); + } else { + setIsDownloadAllowed((isAllowed) => !isAllowed); + } + }, [fullMedia, handleSelect]); + + const className = buildClassName( + 'WallpaperTile', + isSelected && 'selected', + ); + + return ( +
    +
    + {shouldRenderThumb && ( + + )} + {shouldRenderFullMedia && ( + + )} + {shouldRenderSpinner && ( +
    + +
    + )} +
    +
    + ); +}; + +export default memo(WallpaperTile); diff --git a/src/components/left/settings/folders/SettingsFolders.scss b/src/components/left/settings/folders/SettingsFolders.scss new file mode 100644 index 000000000..9e1f93c5a --- /dev/null +++ b/src/components/left/settings/folders/SettingsFolders.scss @@ -0,0 +1,60 @@ +.settings-folders-recommended-item { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; +} + +.settings-folders-list-item { + .ChatInfo { + display: flex; + align-items: center; + + .Avatar { + margin-left: -0.25rem; + margin-right: 1.5rem; + } + + .title { + display: flex; + justify-content: flex-start; + align-items: center; + + h3 { + font-size: 1rem; + font-weight: 500; + line-height: 1.3125; + margin: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: left; + } + } + + .status { + display: none; + } + } + + .ListItem-button { + i { + opacity: 0.9; + } + } + + &.color-primary .ListItem-button { + color: var(--color-primary); + + i { + opacity: 1; + color: inherit; + } + } +} + +.settings-item .ShowMoreButton { + margin: 0 -1rem; + width: calc(100% + 2rem); + padding-left: 1rem !important; +} diff --git a/src/components/left/settings/folders/SettingsFolders.tsx b/src/components/left/settings/folders/SettingsFolders.tsx new file mode 100644 index 000000000..4f6dd8b39 --- /dev/null +++ b/src/components/left/settings/folders/SettingsFolders.tsx @@ -0,0 +1,120 @@ +import React, { FC, memo, useCallback } from '../../../../lib/teact/teact'; + +import { ApiChatFolder } from '../../../../api/types'; +import { SettingsScreens } from '../../../../types'; + +import { FoldersState, FolderEditDispatch } from '../../../../hooks/reducers/useFoldersReducer'; + +import SettingsFoldersMain from './SettingsFoldersMain'; +import SettingsFoldersEdit from './SettingsFoldersEdit'; +import SettingsFoldersChatFilters from './SettingsFoldersChatFilters'; + +import './SettingsFolders.scss'; + +const TRANSITION_DURATION = 200; + +export type OwnProps = { + currentScreen: SettingsScreens; + state: FoldersState; + dispatch: FolderEditDispatch; + onScreenSelect: (screen: SettingsScreens) => void; + onReset: () => void; +}; + +const SettingsFolders: FC = ({ + currentScreen, + state, + dispatch, + onScreenSelect, + onReset, +}) => { + const handleReset = useCallback(() => { + if ( + currentScreen === SettingsScreens.FoldersCreateFolder + || currentScreen === SettingsScreens.FoldersEditFolder + ) { + setTimeout(() => { + dispatch({ type: 'reset' }); + }, TRANSITION_DURATION); + } + + if ( + currentScreen === SettingsScreens.FoldersIncludedChats + || currentScreen === SettingsScreens.FoldersExcludedChats + ) { + if (state.mode === 'create') { + onScreenSelect(SettingsScreens.FoldersCreateFolder); + } else { + onScreenSelect(SettingsScreens.FoldersEditFolder); + } + return; + } + + onReset(); + }, [ + state.mode, dispatch, + currentScreen, onReset, onScreenSelect, + ]); + + const handleCreateFolder = useCallback(() => { + dispatch({ type: 'reset' }); + onScreenSelect(SettingsScreens.FoldersCreateFolder); + }, [onScreenSelect, dispatch]); + + const handleEditFolder = useCallback((folder: ApiChatFolder) => { + dispatch({ type: 'editFolder', payload: folder }); + onScreenSelect(SettingsScreens.FoldersEditFolder); + }, [dispatch, onScreenSelect]); + + const handleAddIncludedChats = useCallback(() => { + dispatch({ type: 'editIncludeFilters' }); + onScreenSelect(SettingsScreens.FoldersIncludedChats); + }, [dispatch, onScreenSelect]); + + const handleAddExcludedChats = useCallback(() => { + dispatch({ type: 'editExcludeFilters' }); + onScreenSelect(SettingsScreens.FoldersExcludedChats); + }, [dispatch, onScreenSelect]); + + switch (currentScreen) { + case SettingsScreens.Folders: + return ( + + ); + case SettingsScreens.FoldersCreateFolder: + case SettingsScreens.FoldersEditFolder: + return ( + + ); + case SettingsScreens.FoldersIncludedChats: + return ( + + ); + case SettingsScreens.FoldersExcludedChats: + return ( + + ); + + default: + return undefined; + } +}; + +export default memo(SettingsFolders); diff --git a/src/components/left/settings/folders/SettingsFoldersChatFilters.tsx b/src/components/left/settings/folders/SettingsFoldersChatFilters.tsx new file mode 100644 index 000000000..3b1019f78 --- /dev/null +++ b/src/components/left/settings/folders/SettingsFoldersChatFilters.tsx @@ -0,0 +1,171 @@ +import React, { + FC, memo, useMemo, useCallback, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../../global/types'; +import { ApiChat } from '../../../../api/types'; + +import { pick } from '../../../../util/iteratees'; +import searchWords from '../../../../util/searchWords'; +import { prepareChatList, getChatTitle } from '../../../../modules/helpers'; +import { + FoldersState, + FolderEditDispatch, + selectChatFilters, +} from '../../../../hooks/reducers/useFoldersReducer'; + +import SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker'; + +import Loading from '../../../ui/Loading'; + +type OwnProps = { + mode: 'included' | 'excluded'; + state: FoldersState; + dispatch: FolderEditDispatch; +}; + +type StateProps = { + chatsById: Record; + listIds?: number[]; + orderedPinnedIds?: number[]; + archivedListIds?: number[]; + archivedPinnedIds?: number[]; +}; + +type DispatchProps = Pick; + +const SettingsFoldersChatFilters: FC = ({ + mode, + state, + dispatch, + chatsById, + listIds, + orderedPinnedIds, + archivedListIds, + archivedPinnedIds, + loadMoreChats, +}) => { + const { chatFilter } = state; + const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true); + + const chats = useMemo(() => { + const activeChatArrays = listIds + ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all') + : undefined; + const archivedChatArrays = archivedListIds + ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived') + : undefined; + + if (!activeChatArrays && !archivedChatArrays) { + return undefined; + } + + return [ + ...(activeChatArrays + ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats] + : [] + ), + ...(archivedChatArrays ? archivedChatArrays.otherChats : []), + ]; + }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]); + + const displayedIds = useMemo(() => { + if (!chats) { + return undefined; + } + + return chats + .filter((chat) => ( + !chatFilter + || searchWords(getChatTitle(chat), chatFilter) + || selectedChatIds.includes(chat.id) + )) + .map(({ id }) => id); + }, [chats, chatFilter, selectedChatIds]); + + const handleFilterChange = useCallback((newFilter: string) => { + dispatch({ + type: 'setChatFilter', + payload: newFilter, + }); + }, [dispatch]); + + const handleSelectedIdsChange = useCallback((ids: number[]) => { + if (mode === 'included') { + dispatch({ + type: 'setIncludeFilters', + payload: { ...state.includeFilters, includedChatIds: ids }, + }); + } else { + dispatch({ + type: 'setExcludeFilters', + payload: { ...state.excludeFilters, excludedChatIds: ids }, + }); + } + }, [mode, state, dispatch]); + + const handleSelectedChatTypesChange = useCallback((keys: string[]) => { + const newFilters: Record = {}; + keys.forEach((key) => { + newFilters[key] = true; + }); + + if (mode === 'included') { + dispatch({ + type: 'setIncludeFilters', + payload: { + includedChatIds: selectedChatIds, + ...newFilters, + }, + }); + } else { + dispatch({ + type: 'setExcludeFilters', + payload: { + excludedChatIds: selectedChatIds, + ...newFilters, + }, + }); + } + }, [mode, selectedChatIds, dispatch]); + + if (!displayedIds) { + return ; + } + + return ( + + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + chats: { + byId: chatsById, + listIds, + orderedPinnedIds, + }, + } = global; + + return { + chatsById, + listIds: listIds.active, + orderedPinnedIds: orderedPinnedIds.active, + archivedPinnedIds: orderedPinnedIds.archived, + archivedListIds: listIds.archived, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']), +)(SettingsFoldersChatFilters)); diff --git a/src/components/left/settings/folders/SettingsFoldersChatsPicker.scss b/src/components/left/settings/folders/SettingsFoldersChatsPicker.scss new file mode 100644 index 000000000..4dae4c3cd --- /dev/null +++ b/src/components/left/settings/folders/SettingsFoldersChatsPicker.scss @@ -0,0 +1,57 @@ +.SettingsFoldersChatsPicker { + height: calc(100% - var(--header-height)); + + .picker-header { + box-shadow: 0 0 2px rgba(114, 114, 114, 0.25); + + .max-items-reached { + margin-bottom: 0.5rem; + margin-left: 0.5rem; + flex-grow: 1; + } + + .max-items-reached { + color: var(--color-text-secondary); + } + } + + .picker-list { + padding: 0 0.5rem 0.5rem; + + .no-results { + height: 10rem; + } + } + + .ListItem.picker-list-item { + &.chat-type-item .ListItem-button { + padding: 0.875rem 0.75rem; + } + + &.chat-item .ListItem-button { + padding: 0.5rem 0.75rem; + } + + .Checkbox { + margin-left: auto; + padding-left: 3.25rem; + } + + .chat-type { + font-size: 1rem; + font-weight: 400; + margin: 0; + } + } + + .settings-item-header { + margin-left: 0.75rem; + margin-top: 1rem; + margin-bottom: 0.5rem; + } + + .picker-list-divider { + margin: 0.5rem -0.5rem 0; + border-bottom: 1px solid var(--color-borders); + } +} diff --git a/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx b/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx new file mode 100644 index 000000000..197844939 --- /dev/null +++ b/src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx @@ -0,0 +1,212 @@ +import React, { + FC, useCallback, useRef, useEffect, memo, +} from '../../../../lib/teact/teact'; + +import { isChatPrivate } from '../../../../modules/helpers'; +import { + INCLUDED_CHAT_TYPES, + EXCLUDED_CHAT_TYPES, + FolderChatType, +} from '../../../../hooks/reducers/useFoldersReducer'; +import useInfiniteScroll from '../../../../hooks/useInfiniteScroll'; +import useLang from '../../../../hooks/useLang'; + +import Checkbox from '../../../ui/Checkbox'; +import InputText from '../../../ui/InputText'; +import ListItem from '../../../ui/ListItem'; +import PrivateChatInfo from '../../../common/PrivateChatInfo'; +import GroupChatInfo from '../../../common/GroupChatInfo'; +import PickerSelectedItem from '../../../common/PickerSelectedItem'; +import InfiniteScroll from '../../../ui/InfiniteScroll'; +import Loading from '../../../ui/Loading'; + +import '../../../common/Picker.scss'; +import './SettingsFoldersChatsPicker.scss'; + +type OwnProps = { + mode: 'included' | 'excluded'; + chatIds: number[]; + selectedIds: number[]; + selectedChatTypes: string[]; + filterValue?: string; + onSelectedIdsChange: (ids: number[]) => void; + onSelectedChatTypesChange: (types: string[]) => void; + onFilterChange: (value: string) => void; + onLoadMore: () => void; +}; + +// Focus slows down animation, also it breaks transition layout in Chrome +const FOCUS_DELAY_MS = 500; + +const MAX_CHATS = 100; +const MAX_FULL_ITEMS = 10; +const ALWAYS_FULL_ITEMS_COUNT = 5; + +const SettingsFoldersChatsPicker: FC = ({ + mode, + chatIds, + selectedIds, + selectedChatTypes, + filterValue, + onSelectedIdsChange, + onSelectedChatTypesChange, + onFilterChange, + onLoadMore, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES; + const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS; + const hasMaxChats = selectedIds.length >= MAX_CHATS; + + useEffect(() => { + setTimeout(() => { + requestAnimationFrame(() => { + inputRef.current!.focus(); + }); + }, FOCUS_DELAY_MS); + }, []); + + const handleItemClick = useCallback((id: number) => { + const newSelectedIds = [...selectedIds]; + if (newSelectedIds.includes(id)) { + newSelectedIds.splice(newSelectedIds.indexOf(id), 1); + } else { + newSelectedIds.push(id); + } + onSelectedIdsChange(newSelectedIds); + }, [selectedIds, onSelectedIdsChange]); + + const handleChatTypeClick = useCallback((key: FolderChatType['key']) => { + const newSelectedChatTypes = [...selectedChatTypes]; + if (newSelectedChatTypes.includes(key)) { + newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1); + } else { + newSelectedChatTypes.push(key); + } + onSelectedChatTypesChange(newSelectedChatTypes); + }, [selectedChatTypes, onSelectedChatTypesChange]); + + const handleFilterChange = useCallback((e: React.ChangeEvent) => { + const { value } = e.currentTarget; + onFilterChange(value); + }, [onFilterChange]); + + const lang = useLang(); + + function renderSelectedChatType(key: string) { + const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey); + if (!selectedType) { + return undefined; + } + + return ( + + ); + } + + function renderChatType(type: FolderChatType) { + return ( + handleChatTypeClick(type.key)} + ripple + > + +

    {lang(type.title)}

    + +
    + ); + } + + function renderItem(id: number) { + const isSelected = selectedIds.includes(id); + + return ( + handleItemClick(id)} + ripple + disabled={!isSelected && hasMaxChats} + > + {isChatPrivate(id) ? ( + + ) : ( + + )} + + + ); + } + + const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue)); + + return ( +
    +
    + {selectedChatTypes.map(renderSelectedChatType)} + {selectedIds.map((id, i) => ( + + ))} + {!hasMaxChats ? ( + + ) : ( +

    {`Sorry, you can't add more than ${MAX_CHATS} chats.`}

    + )} +
    + + {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && ( + <> +

    {lang('FilterChatTypes')}

    + {chatTypes.map(renderChatType)} +
    +

    {lang('FilterChats')}

    + + )} + + {viewportIds && viewportIds.length ? ( + viewportIds.map(renderItem) + ) : viewportIds && !viewportIds.length ? ( +

    Sorry, nothing found.

    + ) : ( + + )} + +
    + ); +}; + +export default memo(SettingsFoldersChatsPicker); diff --git a/src/components/left/settings/folders/SettingsFoldersEdit.tsx b/src/components/left/settings/folders/SettingsFoldersEdit.tsx new file mode 100644 index 000000000..f5c2f0f22 --- /dev/null +++ b/src/components/left/settings/folders/SettingsFoldersEdit.tsx @@ -0,0 +1,314 @@ +import React, { + FC, memo, useCallback, useState, useEffect, useMemo, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../../global/types'; + +import { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config'; +import { pick, findIntersectionWithSet } from '../../../../util/iteratees'; +import { isChatPrivate } from '../../../../modules/helpers'; +import getAnimationData from '../../../common/helpers/animatedAssets'; +import { + FoldersState, + FolderEditDispatch, + INCLUDED_CHAT_TYPES, + EXCLUDED_CHAT_TYPES, + selectChatFilters, +} from '../../../../hooks/reducers/useFoldersReducer'; +import useLang from '../../../../hooks/useLang'; + +import ListItem from '../../../ui/ListItem'; +import AnimatedSticker from '../../../common/AnimatedSticker'; +import InputText from '../../../ui/InputText'; +import PrivateChatInfo from '../../../common/PrivateChatInfo'; +import GroupChatInfo from '../../../common/GroupChatInfo'; +import FloatingActionButton from '../../../ui/FloatingActionButton'; +import Spinner from '../../../ui/Spinner'; +import ShowMoreButton from '../../../ui/ShowMoreButton'; + +type OwnProps = { + state: FoldersState; + dispatch: FolderEditDispatch; + onAddIncludedChats: () => void; + onAddExcludedChats: () => void; + onReset: () => void; +}; + +type StateProps = { + loadedActiveChatIds?: number[]; + loadedArchivedChatIds?: number[]; +}; + +type DispatchProps = Pick; + +const SUBMIT_TIMEOUT = 500; + +const INITIAL_CHATS_LIMIT = 5; + +const ERROR_NO_TITLE = 'Please provide a title for this folder.'; +const ERROR_NO_CHATS = 'Please select at least one chat for this folder.'; + +const SettingsFoldersEdit: FC = ({ + state, + dispatch, + onAddIncludedChats, + onAddExcludedChats, + onReset, + loadedActiveChatIds, + loadedArchivedChatIds, + editChatFolder, + addChatFolder, + loadMoreChats, +}) => { + const [animationData, setAnimationData] = useState>(); + const [isAnimationLoaded, setIsAnimationLoaded] = useState(false); + const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []); + + const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false); + const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false); + + const { + selectedChatIds: includedChatIds, + selectedChatTypes: includedChatTypes, + } = selectChatFilters(state, 'included'); + const { + selectedChatIds: excludedChatIds, + selectedChatTypes: excludedChatTypes, + } = selectChatFilters(state, 'excluded'); + + useEffect(() => { + if (!animationData) { + getAnimationData('FoldersNew').then(setAnimationData); + } + }, [animationData]); + + useEffect(() => { + setIsIncludedChatsListExpanded(false); + setIsExcludedChatsListExpanded(false); + }, [state.folderId]); + + const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => { + const allLoadedChatsSet = new Set([ + ...loadedActiveChatIds || [], + ...loadedArchivedChatIds || [], + ]); + + const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet); + const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet); + + return [ + isIncludedChatsListExpanded + ? loadedIncludedChatIds + : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length), + isExcludedChatsListExpanded + ? loadedExcludedChatIds + : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length), + ]; + }, [ + excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes, + isExcludedChatsListExpanded, isIncludedChatsListExpanded, + loadedActiveChatIds, loadedArchivedChatIds, + ]); + + useEffect(() => { + if ( + visibleIncludedChatIds.length < includedChatIds.length + || visibleExcludedChatIds.length < excludedChatIds.length + ) { + loadMoreChats({ listType: 'active' }); + } + }, [ + loadMoreChats, + excludedChatIds.length, + includedChatIds.length, + visibleExcludedChatIds.length, + visibleIncludedChatIds.length, + ]); + + const lang = useLang(); + + function handleChange(event: React.ChangeEvent) { + const { currentTarget } = event; + dispatch({ type: 'setTitle', payload: currentTarget.value.trim() }); + } + + function handleSubmit() { + const { title } = state.folder; + + if (!title) { + dispatch({ type: 'setError', payload: ERROR_NO_TITLE }); + return; + } + + if (!includedChatIds.length && !Object.keys(includedChatTypes).length) { + dispatch({ type: 'setError', payload: ERROR_NO_CHATS }); + return; + } + + dispatch({ type: 'setIsLoading', payload: true }); + if (state.mode === 'edit') { + editChatFolder({ id: state.folderId, folderUpdate: state.folder }); + } else { + addChatFolder({ folder: state.folder }); + } + + setTimeout(() => { + onReset(); + }, SUBMIT_TIMEOUT); + } + + function renderChatType(key: string, mode: 'included' | 'excluded') { + const chatType = mode === 'included' + ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key) + : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key); + + if (!chatType) { + return undefined; + } + + return ( + + {lang(chatType.title)} + + ); + } + + function renderChats(mode: 'included' | 'excluded') { + const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes; + const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds; + + const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded; + const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds; + const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length; + const clickHandler = mode === 'included' + ? () => setIsIncludedChatsListExpanded(true) + : () => setIsExcludedChatsListExpanded(true); + + return ( + <> + {selectedChatTypes.map((key) => renderChatType(key, mode))} + {visibleChatIds.map((id) => ( + + {isChatPrivate(id) ? ( + + ) : ( + + )} + + ))} + {(!isExpanded && leftChatsCount > 0) && ( + + )} + + ); + } + + return ( +
    +
    +
    +
    + {animationData && ( + + )} +
    + + {state.mode === 'create' && ( +

    + {lang('FilterIncludeInfo')} +

    + )} + + +
    + +
    + {state.error && state.error === ERROR_NO_CHATS && ( +

    + {state.error} +

    + )} + +

    {lang('FilterInclude')}

    + + + {lang('FilterAddChats')} + + + {renderChats('included')} +
    + +
    +

    {lang('FilterExclude')}

    + + + {lang('FilterAddChats')} + + + {renderChats('excluded')} +
    +
    + + + {state.isLoading ? ( + + ) : ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { listIds } = global.chats; + + return { + loadedActiveChatIds: listIds.active, + loadedArchivedChatIds: listIds.archived, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']), +)(SettingsFoldersEdit)); diff --git a/src/components/left/settings/folders/SettingsFoldersMain.tsx b/src/components/left/settings/folders/SettingsFoldersMain.tsx new file mode 100644 index 000000000..f5e3171b4 --- /dev/null +++ b/src/components/left/settings/folders/SettingsFoldersMain.tsx @@ -0,0 +1,229 @@ +import React, { + FC, memo, useMemo, useCallback, useState, useEffect, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../../global/types'; +import { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types'; + +import { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config'; +import { pick } from '../../../../util/iteratees'; +import { throttle } from '../../../../util/schedulers'; +import getAnimationData from '../../../common/helpers/animatedAssets'; +import { getFolderDescriptionText } from '../../../../modules/helpers'; +import useLang from '../../../../hooks/useLang'; + +import ListItem from '../../../ui/ListItem'; +import Button from '../../../ui/Button'; +import Loading from '../../../ui/Loading'; +import AnimatedSticker from '../../../common/AnimatedSticker'; + +type OwnProps = { + onCreateFolder: () => void; + onEditFolder: (folder: ApiChatFolder) => void; +}; + +type StateProps = { + chatsById: Record; + usersById: Record; + orderedFolderIds?: number[]; + foldersById: Record; + recommendedChatFolders?: ApiChatFolder[]; +}; + +type DispatchProps = Pick; + +const runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true); + +const MAX_ALLOWED_FOLDERS = 10; + +const SettingsFoldersMain: FC = ({ + onCreateFolder, + onEditFolder, + chatsById, + usersById, + orderedFolderIds, + foldersById, + recommendedChatFolders, + loadRecommendedChatFolders, + addChatFolder, + showError, +}) => { + const [animationData, setAnimationData] = useState>(); + const [isAnimationLoaded, setIsAnimationLoaded] = useState(false); + const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []); + + useEffect(() => { + if (!animationData) { + getAnimationData('FoldersAll').then(setAnimationData); + } + }, [animationData]); + + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottledForLoadRecommended(() => { + loadRecommendedChatFolders(); + }); + }, [loadRecommendedChatFolders]); + + const handleCreateFolder = useCallback(() => { + if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) { + showError({ + error: { + message: 'DIALOG_FILTERS_TOO_MUCH', + }, + }); + + return; + } + + onCreateFolder(); + }, [foldersById, showError, onCreateFolder]); + + const lang = useLang(); + + const userFolders = useMemo(() => { + if (!orderedFolderIds) { + return undefined; + } + + const chatIds = Object.keys(chatsById).map(Number); + + return orderedFolderIds.map((id) => { + const folder = foldersById[id]; + + return { + id: folder.id, + title: folder.title, + subtitle: getFolderDescriptionText(chatsById, usersById, folder, chatIds, lang), + }; + }); + }, [orderedFolderIds, chatsById, foldersById, usersById, lang]); + + const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => { + if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) { + showError({ + error: { + message: 'DIALOG_FILTERS_TOO_MUCH', + }, + }); + + return; + } + + addChatFolder({ folder }); + }, [foldersById, addChatFolder, showError]); + + return ( +
    +
    +
    + {animationData && ( + + )} +
    + +

    + {lang('CreateNewFilterInfo')} +

    + + +
    + +
    +

    {lang('Filters')}

    + + {userFolders && userFolders.length ? userFolders.map((folder) => ( + onEditFolder(foldersById[folder.id])} + > +
    + {folder.title} + {folder.subtitle} +
    +
    + )) : userFolders && !userFolders.length ? ( +

    + You have no folders yet. +

    + ) : } +
    + + {(recommendedChatFolders && !!recommendedChatFolders.length) && ( +
    +

    {lang('FilterRecommended')}

    + + {recommendedChatFolders.map((folder) => ( + handleCreateFolderFromRecommended(folder)} + > +
    +
    + {folder.title} + {folder.description} +
    + + +
    +
    + ))} +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + chats: { byId: chatsById }, + users: { byId: usersById }, + } = global; + + const { + orderedIds: orderedFolderIds, + byId: foldersById, + recommended: recommendedChatFolders, + } = global.chatFolders; + + return { + chatsById, + usersById, + orderedFolderIds, + foldersById, + recommendedChatFolders, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showError']), +)(SettingsFoldersMain)); diff --git a/src/components/left/settings/helper/privacy.ts b/src/components/left/settings/helper/privacy.ts new file mode 100644 index 000000000..45a833509 --- /dev/null +++ b/src/components/left/settings/helper/privacy.ts @@ -0,0 +1,28 @@ +import { ApiPrivacyKey, SettingsScreens } from '../../../../types'; + +export function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined { + switch (screen) { + case SettingsScreens.PrivacyPhoneNumber: + case SettingsScreens.PrivacyPhoneNumberAllowedContacts: + case SettingsScreens.PrivacyPhoneNumberDeniedContacts: + return 'phoneNumber'; + case SettingsScreens.PrivacyLastSeen: + case SettingsScreens.PrivacyLastSeenAllowedContacts: + case SettingsScreens.PrivacyLastSeenDeniedContacts: + return 'lastSeen'; + case SettingsScreens.PrivacyProfilePhoto: + case SettingsScreens.PrivacyProfilePhotoAllowedContacts: + case SettingsScreens.PrivacyProfilePhotoDeniedContacts: + return 'profilePhoto'; + case SettingsScreens.PrivacyForwarding: + case SettingsScreens.PrivacyForwardingAllowedContacts: + case SettingsScreens.PrivacyForwardingDeniedContacts: + return 'forwards'; + case SettingsScreens.PrivacyGroupChats: + case SettingsScreens.PrivacyGroupChatsAllowedContacts: + case SettingsScreens.PrivacyGroupChatsDeniedContacts: + return 'chatInvite'; + } + + return undefined; +} diff --git a/src/components/left/settings/twoFa/SettingsTwoFa.tsx b/src/components/left/settings/twoFa/SettingsTwoFa.tsx new file mode 100644 index 000000000..b94f3c0ff --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFa.tsx @@ -0,0 +1,323 @@ +import React, { + FC, memo, useCallback, useEffect, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { GlobalActions, GlobalState } from '../../../../global/types'; +import { SettingsScreens } from '../../../../types'; + +import { pick } from '../../../../util/iteratees'; +import { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer'; +import useLang from '../../../../hooks/useLang'; + +import SettingsTwoFaEnabled from './SettingsTwoFaEnabled'; +import SettingsTwoFaPassword from './SettingsTwoFaPassword'; +import SettingsTwoFaStart from './SettingsTwoFaStart'; +import SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm'; +import SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations'; +import SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode'; + +export type OwnProps = { + state: TwoFaState; + currentScreen: SettingsScreens; + dispatch: TwoFaDispatch; + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = GlobalState['twoFaSettings']; + +type DispatchProps = Pick; + +const SettingsTwoFa: FC = ({ + currentScreen, + state, + hint, + isLoading, + error, + waitingEmailCodeLength, + dispatch, + onScreenSelect, + updatePassword, + checkPassword, + clearTwoFaError, + updateRecoveryEmail, + provideTwoFaEmailCode, + clearPassword, +}) => { + useEffect(() => { + if (waitingEmailCodeLength) { + if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) { + onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode); + } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) { + onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode); + } + } + }, [currentScreen, onScreenSelect, waitingEmailCodeLength]); + + const handleStartWizard = useCallback(() => { + dispatch({ type: 'reset' }); + onScreenSelect(SettingsScreens.TwoFaNewPassword); + }, [dispatch, onScreenSelect]); + + const handleNewPassword = useCallback((value: string) => { + dispatch({ type: 'setPassword', payload: value }); + onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm); + }, [dispatch, onScreenSelect]); + + const handleNewPasswordConfirm = useCallback(() => { + onScreenSelect(SettingsScreens.TwoFaNewPasswordHint); + }, [onScreenSelect]); + + const handleNewPasswordHint = useCallback((value?: string) => { + dispatch({ type: 'setHint', payload: value }); + onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail); + }, [dispatch, onScreenSelect]); + + const handleNewPasswordEmail = useCallback((value?: string) => { + dispatch({ type: 'setEmail', payload: value }); + updatePassword({ + ...state, + email: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.TwoFaCongratulations); + }, + }); + }, [dispatch, onScreenSelect, state, updatePassword]); + + const handleChangePasswordCurrent = useCallback((value: string) => { + dispatch({ type: 'setCurrentPassword', payload: value }); + checkPassword({ + currentPassword: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.TwoFaChangePasswordNew); + }, + }); + }, [checkPassword, dispatch, onScreenSelect]); + + const handleChangePasswordNew = useCallback((value: string) => { + dispatch({ type: 'setPassword', payload: value }); + onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm); + }, [dispatch, onScreenSelect]); + + const handleChangePasswordConfirm = useCallback(() => { + onScreenSelect(SettingsScreens.TwoFaChangePasswordHint); + }, [onScreenSelect]); + + const handleChangePasswordHint = useCallback((value?: string) => { + dispatch({ type: 'setHint', payload: value }); + updatePassword({ + ...state, + hint: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.TwoFaCongratulations); + }, + }); + }, [dispatch, onScreenSelect, state, updatePassword]); + + const handleTurnOff = useCallback((value: string) => { + clearPassword({ + currentPassword: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.Privacy); + }, + }); + }, [clearPassword, onScreenSelect]); + + const handleRecoveryEmailCurrentPassword = useCallback((value: string) => { + dispatch({ type: 'setCurrentPassword', payload: value }); + checkPassword({ + currentPassword: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.TwoFaRecoveryEmail); + }, + }); + }, [checkPassword, dispatch, onScreenSelect]); + + const handleRecoveryEmail = useCallback((value?: string) => { + dispatch({ type: 'setEmail', payload: value }); + updateRecoveryEmail({ + ...state, + email: value, + onSuccess: () => { + onScreenSelect(SettingsScreens.TwoFaCongratulations); + }, + }); + }, [dispatch, onScreenSelect, state, updateRecoveryEmail]); + + const handleEmailCode = useCallback((code: string) => { + provideTwoFaEmailCode({ code }); + }, [provideTwoFaEmailCode]); + + const lang = useLang(); + + switch (currentScreen) { + case SettingsScreens.TwoFaDisabled: + return ( + + ); + + case SettingsScreens.TwoFaNewPassword: + return ( + + ); + + case SettingsScreens.TwoFaNewPasswordConfirm: + return ( + + ); + + case SettingsScreens.TwoFaNewPasswordHint: + return ( + + ); + + case SettingsScreens.TwoFaNewPasswordEmail: + return ( + + ); + + case SettingsScreens.TwoFaNewPasswordEmailCode: + return ( + + ); + + case SettingsScreens.TwoFaCongratulations: + return ( + + ); + + case SettingsScreens.TwoFaEnabled: + return ( + + ); + + case SettingsScreens.TwoFaChangePasswordCurrent: + return ( + + ); + + case SettingsScreens.TwoFaChangePasswordNew: + return ( + + ); + + case SettingsScreens.TwoFaChangePasswordConfirm: + return ( + + ); + + case SettingsScreens.TwoFaChangePasswordHint: + return ( + + ); + + case SettingsScreens.TwoFaTurnOff: + return ( + + ); + + case SettingsScreens.TwoFaRecoveryEmailCurrentPassword: + return ( + + ); + + case SettingsScreens.TwoFaRecoveryEmail: + return ( + + ); + + case SettingsScreens.TwoFaRecoveryEmailCode: + return ( + + ); + + default: + return undefined; + } +}; + +export default memo(withGlobal( + (global): StateProps => ({ ...global.twoFaSettings }), + (setGlobal, actions): DispatchProps => pick(actions, [ + 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode', + 'checkPassword', 'clearTwoFaError', + ]), +)(SettingsTwoFa)); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx b/src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx new file mode 100644 index 000000000..1c73fdcef --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx @@ -0,0 +1,51 @@ +import React, { FC, memo } from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; +import { SettingsScreens } from '../../../../types'; + +import { selectAnimatedEmoji } from '../../../../modules/selectors'; +import useLang from '../../../../hooks/useLang'; + +import Button from '../../../ui/Button'; +import AnimatedEmoji from '../../../common/AnimatedEmoji'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + animatedEmoji: ApiSticker; +}; + +const SettingsTwoFaCongratulations: FC = ({ + animatedEmoji, onScreenSelect, +}) => { + const lang = useLang(); + + const handleClick = () => { + onScreenSelect(SettingsScreens.Privacy); + }; + + return ( +
    +
    + + +

    + {lang('TwoStepVerificationPasswordSetInfo')} +

    +
    + +
    + +
    +
    + ); +}; + +export default memo(withGlobal((global) => { + return { + animatedEmoji: selectAnimatedEmoji(global, '🥳'), + }; +})(SettingsTwoFaCongratulations)); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx b/src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx new file mode 100644 index 000000000..fd1588359 --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx @@ -0,0 +1,94 @@ +import React, { + FC, memo, useEffect, useRef, useState, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; + +import { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment'; +import { selectAnimatedEmoji } from '../../../../modules/selectors'; +import useLang from '../../../../hooks/useLang'; + +import AnimatedEmoji from '../../../common/AnimatedEmoji'; +import InputText from '../../../ui/InputText'; +import Loading from '../../../ui/Loading'; + +type OwnProps = { + isLoading?: boolean; + error?: string; + clearError: NoneToVoidFunction; + onSubmit: (hint: string) => void; +}; + +type StateProps = { + animatedEmoji: ApiSticker; + codeLength: number; +}; + +const FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400; + +const SettingsTwoFaEmailCode: FC = ({ + animatedEmoji, + codeLength, + isLoading, + error, + clearError, + onSubmit, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [value, setValue] = useState(''); + + useEffect(() => { + if (!IS_TOUCH_ENV) { + setTimeout(() => { + inputRef.current!.focus(); + }, FOCUS_DELAY_TIMEOUT_MS); + } + }, []); + + const lang = useLang(); + + const handleInputChange = (e: React.ChangeEvent) => { + if (error && clearError) { + clearError(); + } + + const newValue = e.target.value.slice(0, codeLength); + + if (newValue.length === codeLength) { + onSubmit(newValue); + } + + setValue(newValue); + e.target.value = newValue; + }; + + return ( +
    +
    + +
    + +
    + + {isLoading && } +
    +
    + ); +}; + +export default memo(withGlobal((global) => { + return { + animatedEmoji: selectAnimatedEmoji(global, '💌'), + codeLength: global.twoFaSettings.waitingEmailCodeLength, + }; +})(SettingsTwoFaEmailCode)); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx b/src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx new file mode 100644 index 000000000..d9965b8f9 --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx @@ -0,0 +1,65 @@ +import React, { FC, memo } from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; +import { SettingsScreens } from '../../../../types'; + +import { selectAnimatedEmoji } from '../../../../modules/selectors'; +import useLang from '../../../../hooks/useLang'; + +import ListItem from '../../../ui/ListItem'; +import AnimatedEmoji from '../../../common/AnimatedEmoji'; +import renderText from '../../../common/helpers/renderText'; + +type OwnProps = { + onScreenSelect: (screen: SettingsScreens) => void; +}; + +type StateProps = { + animatedEmoji: ApiSticker; +}; + +const SettingsTwoFaEnabled: FC = ({ + animatedEmoji, onScreenSelect, +}) => { + const lang = useLang(); + + return ( +
    +
    + + +

    + {renderText(lang('EnabledPasswordText'), ['br'])} +

    +
    + +
    + onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)} + > + {lang('ChangePassword')} + + onScreenSelect(SettingsScreens.TwoFaTurnOff)} + > + {lang('TurnPasswordOff')} + + onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)} + > + {lang('SetRecoveryEmail')} + +
    +
    + ); +}; + +export default memo(withGlobal((global) => { + return { + animatedEmoji: selectAnimatedEmoji(global, '🔐'), + }; +})(SettingsTwoFaEnabled)); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx b/src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx new file mode 100644 index 000000000..398edac73 --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx @@ -0,0 +1,76 @@ +import React, { + FC, memo, useCallback, useState, +} from '../../../../lib/teact/teact'; + +import useLang from '../../../../hooks/useLang'; + +import PasswordMonkey from '../../../common/PasswordMonkey'; +import PasswordForm from '../../../common/PasswordForm'; + +type OwnProps = { + error?: string; + isLoading?: boolean; + expectedPassword?: string; + placeholder?: string; + hint?: string; + submitLabel?: string; + clearError?: NoneToVoidFunction; + onSubmit: (password: string) => void; +}; + +const EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal'; + +const SettingsTwoFaPassword: FC = ({ + error, + isLoading, + expectedPassword, + placeholder = 'Current Password', + hint, + submitLabel, + clearError, + onSubmit, +}) => { + const [validationError, setValidationError] = useState(''); + const [shouldShowPassword, setShouldShowPassword] = useState(false); + + const handleSubmit = useCallback((newPassword) => { + if (expectedPassword && newPassword !== expectedPassword) { + setValidationError(EQUAL_PASSWORD_ERROR); + } else { + onSubmit(newPassword); + } + }, [onSubmit, expectedPassword]); + + const handleClearError = useCallback(() => { + if (clearError) { + clearError(); + } + setValidationError(''); + }, [clearError]); + + const lang = useLang(); + + return ( +
    +
    + +
    + +
    + +
    +
    + ); +}; + +export default memo(SettingsTwoFaPassword); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx b/src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx new file mode 100644 index 000000000..f5617d586 --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx @@ -0,0 +1,158 @@ +import React, { + FC, memo, useEffect, useRef, useState, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; + +import { IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../../../util/environment'; +import { selectAnimatedEmoji } from '../../../../modules/selectors'; +import useFlag from '../../../../hooks/useFlag'; +import useLang from '../../../../hooks/useLang'; + +import Button from '../../../ui/Button'; +import Modal from '../../../ui/Modal'; +import AnimatedEmoji from '../../../common/AnimatedEmoji'; +import InputText from '../../../ui/InputText'; +import renderText from '../../../common/helpers/renderText'; + +type OwnProps = { + icon: 'hint' | 'email'; + type?: 'text' | 'email'; + isLoading?: boolean; + error?: string; + placeholder: string; + shouldConfirm?: boolean; + clearError?: NoneToVoidFunction; + onSubmit: (value?: string) => void; +}; + +type StateProps = { + animatedEmoji: ApiSticker; +}; + +const FOCUS_DELAY_TIMEOUT_MS = IS_MOBILE_SCREEN ? 550 : 400; + +const SettingsTwoFaSkippableForm: FC = ({ + animatedEmoji, + type = 'text', + isLoading, + error, + placeholder, + shouldConfirm, + clearError, + onSubmit, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const [value, setValue] = useState(''); + const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false); + + useEffect(() => { + if (!IS_TOUCH_ENV) { + setTimeout(() => { + inputRef.current!.focus(); + }, FOCUS_DELAY_TIMEOUT_MS); + } + }, []); + + const handleInputChange = (e: React.ChangeEvent) => { + if (error && clearError) { + clearError(); + } + + setValue(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + if (!inputRef.current) { + return; + } + + onSubmit(value); + }; + + const handleSkip = () => { + onSubmit(); + }; + + const handleSkipConfirm = () => { + unmarkIsConfirmShown(); + onSubmit(); + }; + + const lang = useLang(); + + return ( +
    +
    + +
    + +
    +
    + + + {value ? ( + + ) : ( + + )} + + {shouldConfirm && ( + + {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])} +
    + + +
    +
    + )} +
    +
    + ); +}; + +export default memo(withGlobal((global, { icon }) => { + return { + animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'), + }; +})(SettingsTwoFaSkippableForm)); diff --git a/src/components/left/settings/twoFa/SettingsTwoFaStart.tsx b/src/components/left/settings/twoFa/SettingsTwoFaStart.tsx new file mode 100644 index 000000000..ec0b66154 --- /dev/null +++ b/src/components/left/settings/twoFa/SettingsTwoFaStart.tsx @@ -0,0 +1,44 @@ +import React, { FC, memo } from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; + +import { selectAnimatedEmoji } from '../../../../modules/selectors'; +import useLang from '../../../../hooks/useLang'; + +import Button from '../../../ui/Button'; +import AnimatedEmoji from '../../../common/AnimatedEmoji'; + +type OwnProps = { + onStart: NoneToVoidFunction; +}; + +type StateProps = { + animatedEmoji: ApiSticker; +}; + +const SettingsTwoFaStart: FC = ({ animatedEmoji, onStart }) => { + const lang = useLang(); + + return ( +
    +
    + + +

    + {lang('SetAdditionalPasswordInfo')} +

    +
    + +
    + +
    +
    + ); +}; + +export default memo(withGlobal((global) => { + return { + animatedEmoji: selectAnimatedEmoji(global, '🔐'), + }; +})(SettingsTwoFaStart)); diff --git a/src/components/main/Errors.async.tsx b/src/components/main/Errors.async.tsx new file mode 100644 index 000000000..8df3a4be2 --- /dev/null +++ b/src/components/main/Errors.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const ErrorsAsync: FC = ({ isOpen }) => { + const Errors = useModuleLoader(Bundles.Extra, 'Errors', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return Errors ? : undefined; +}; + +export default ErrorsAsync; diff --git a/src/components/main/Errors.scss b/src/components/main/Errors.scss new file mode 100644 index 000000000..e763a8ec1 --- /dev/null +++ b/src/components/main/Errors.scss @@ -0,0 +1,8 @@ +#Errors { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: var(--z-modal); +} diff --git a/src/components/main/Errors.tsx b/src/components/main/Errors.tsx new file mode 100644 index 000000000..76953beb3 --- /dev/null +++ b/src/components/main/Errors.tsx @@ -0,0 +1,57 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiError } from '../../api/types'; + +import getReadableErrorText from '../../util/getReadableErrorText'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +import './Errors.scss'; + +type StateProps = { + errors: ApiError[]; +}; + +type DispatchProps = Pick; + +const Errors: FC = ({ errors, dismissError }) => { + const lang = useLang(); + + if (!errors.length) { + return undefined; + } + + return ( +
    + {errors.map((error) => ( + +

    {getReadableErrorText(error)}

    + +
    + ))} +
    + ); +}; + +function getErrorHeader(error: ApiError) { + if (error.isSlowMode) { + return 'Slowmode enabled'; + } + + return 'Something went wrong'; +} + +export default memo(withGlobal( + (global): StateProps => pick(global, ['errors']), + (setGlobal, actions): DispatchProps => pick(actions, ['dismissError']), +)(Errors)); diff --git a/src/components/main/ForwardPicker.async.tsx b/src/components/main/ForwardPicker.async.tsx new file mode 100644 index 000000000..f232fcc5b --- /dev/null +++ b/src/components/main/ForwardPicker.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; +import { OwnProps } from './ForwardPicker'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const ForwardPickerAsync: FC = (props) => { + const { isOpen } = props; + const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ForwardPicker ? : undefined; +}; + +export default ForwardPickerAsync; diff --git a/src/components/main/ForwardPicker.scss b/src/components/main/ForwardPicker.scss new file mode 100644 index 000000000..e5195a88c --- /dev/null +++ b/src/components/main/ForwardPicker.scss @@ -0,0 +1,60 @@ +.ForwardPicker { + z-index: var(--z-media-viewer); + + .modal-dialog { + height: 70%; + max-width: 25rem; + + @media (max-width: 600px) { + height: 90%; + } + } + + .modal-header { + display: flex; + align-items: center; + padding: 0.25rem 0.5rem; + + .Button { + margin-right: 0.5rem; + } + + .input-group { + margin: 0; + } + + .form-control { + border: none; + box-shadow: none !important; + + height: 2.75rem; + padding: 0.5rem; + font-size: 1.25rem; + line-height: 1.75rem; + } + } + + .modal-content { + padding: 0; + overflow: hidden; + display: flex; + flex-direction: column; + + .picker-list { + height: 100%; + overflow-x: hidden; + overflow-y: auto; + padding: 0 1rem 1rem; + } + } + + .no-results { + height: 100%; + margin: 0; + padding: 1rem 1rem; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-secondary); + } +} diff --git a/src/components/main/ForwardPicker.tsx b/src/components/main/ForwardPicker.tsx new file mode 100644 index 000000000..ef15be453 --- /dev/null +++ b/src/components/main/ForwardPicker.tsx @@ -0,0 +1,190 @@ +import React, { + FC, useMemo, useState, memo, useRef, useEffect, useCallback, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiChat, ApiUser } from '../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { getChatTitle, prepareChatList, isChatPrivate } from '../../modules/helpers'; +import { selectUser } from '../../modules/selectors'; +import searchWords from '../../util/searchWords'; +import { pick } from '../../util/iteratees'; +import useInfiniteScroll from '../../hooks/useInfiniteScroll'; +import useLang from '../../hooks/useLang'; + +import Loading from '../ui/Loading'; +import Modal from '../ui/Modal'; +import InputText from '../ui/InputText'; +import Button from '../ui/Button'; +import InfiniteScroll from '../ui/InfiniteScroll'; +import ListItem from '../ui/ListItem'; +import PrivateChatInfo from '../common/PrivateChatInfo'; +import GroupChatInfo from '../common/GroupChatInfo'; + +import './ForwardPicker.scss'; + +export type OwnProps = { + isOpen: boolean; +}; + +type StateProps = { + chatsById: Record; + listIds?: number[]; + orderedPinnedIds?: number[]; + currentUser?: ApiUser; +}; + +type DispatchProps = Pick; + +// Focus slows down animation, also it breaks transition layout in Chrome +const FOCUS_DELAY_MS = 500; +const MODAL_HIDE_DELAY_MS = 300; + +const ForwardPicker: FC = ({ + chatsById, + listIds, + orderedPinnedIds, + currentUser, + isOpen, + setForwardChatId, + exitForwardMode, + loadMoreChats, +}) => { + const [filter, setFilter] = useState(''); + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + useEffect(() => { + if (isOpen) { + if (!IS_MOBILE_SCREEN) { + setTimeout(() => { + requestAnimationFrame(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }); + }, FOCUS_DELAY_MS); + } + } else { + if (inputRef.current) { + inputRef.current.blur(); + } + + setTimeout(() => { + setFilter(''); + }, MODAL_HIDE_DELAY_MS); + } + }, [isOpen]); + + const chats = useMemo(() => { + const chatArrays = listIds ? prepareChatList(chatsById, listIds, orderedPinnedIds) : undefined; + if (!chatArrays) { + return undefined; + } + + const chatWithSelf = currentUser ? chatsById[currentUser.id] : undefined; + + return [ + ...(chatWithSelf ? [chatWithSelf] : []), + ...chatArrays.pinnedChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id), + ...chatArrays.otherChats.filter(({ id }) => !chatWithSelf || id !== chatWithSelf.id), + ]; + }, [chatsById, listIds, orderedPinnedIds, currentUser]); + + const chatIds = useMemo(() => { + if (!chats) { + return undefined; + } + + return chats + .filter((chat) => (!filter || searchWords(getChatTitle(chat, currentUser), filter))) + .map(({ id }) => id); + }, [chats, filter, currentUser]); + + const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter)); + + const handleFilterChange = useCallback((e: React.ChangeEvent) => { + setFilter(e.currentTarget.value); + }, []); + + const lang = useLang(); + + const modalHeader = ( +
    + + +
    + ); + + return ( + + {viewportIds && viewportIds.length ? ( + + {viewportIds.map((id) => ( + setForwardChatId({ id })} + > + {isChatPrivate(id) ? ( + + ) : ( + + )} + + ))} + + ) : viewportIds && !viewportIds.length ? ( +

    Sorry, nothing found.

    + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + chats: { + byId: chatsById, + listIds, + orderedPinnedIds, + }, + currentUserId, + } = global; + + return { + chatsById, + listIds: listIds.active, + orderedPinnedIds: orderedPinnedIds.active, + currentUser: currentUserId ? selectUser(global, currentUserId) : undefined, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']), +)(ForwardPicker)); diff --git a/src/components/main/Main.async.tsx b/src/components/main/Main.async.tsx new file mode 100644 index 000000000..8f5af1207 --- /dev/null +++ b/src/components/main/Main.async.tsx @@ -0,0 +1,12 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const MainAsync: FC = () => { + const Main = useModuleLoader(Bundles.Main, 'Main'); + + return Main ?
    : undefined; +}; + +export default MainAsync; diff --git a/src/components/main/Main.scss b/src/components/main/Main.scss new file mode 100644 index 000000000..f9800fdb1 --- /dev/null +++ b/src/components/main/Main.scss @@ -0,0 +1,172 @@ +#Main { + display: flex; + height: 100%; + text-align: left; + overflow: hidden; + + @media (min-width: 1276px) { + position: relative; + } + + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100); + } +} + +#LeftColumn { + flex: 1; + min-width: 18rem; + max-width: 26.5rem; + height: 100%; + + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100); + } + + @media (min-width: 1680px) { + border-left: 1px solid var(--color-borders); + } + + @media (max-width: 1275px) { + flex: 2; + } + + @media (max-width: 925px) { + position: fixed; + left: 0; + top: 0; + height: calc(var(--vh, 1vh) * 100); + width: 26.5rem; + + transform: translate3d(-5rem, 0, 0); + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none; + } + + &::after { + content: ''; + display: block; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: black; + opacity: var(--layer-blackout-opacity); + transition: opacity var(--layer-transition); + z-index: 1; + + body.animation-level-0 & { + transition: none; + } + + // @optimization + body.is-android & { + display: none; + } + + body.is-android .middle-column-shown & { + display: block; + } + } + + #Main:not(.middle-column-open) & { + transform: translate3d(0, 0, 0); + + &::after { + opacity: 0; + pointer-events: none; + } + } + + // @optimization + #Main.middle-column-open & { + .custom-scroll { + overflow: hidden; + } + } + } + + @media (max-width: 600px) { + max-width: none; + width: 100vw; + transform: translate3d(-20vw, 0, 0); + } +} + +#RightColumn { + @media (min-width: 1680px) { + border-right: 1px solid var(--color-borders); + } + + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100 + 1px); + } +} + +#MiddleColumn { + flex: 3; + border-left: 1px solid var(--color-borders); + max-width: 75vw; + + @media (max-width: 1275px) { + max-width: calc(100vw - 26.5rem); + } + + @media (max-width: 66.25rem) { + max-width: 60vw; + } + + @media (min-width: 1680px) { + border-right: 1px solid var(--color-borders); + max-width: calc(1680px - 26.5rem); + } + + @media (max-width: 925px) { + max-width: none; + position: fixed; + left: 0; + top: 0; + bottom: 0; + right: 0; + + transform: translate3d(0, 0, 0); + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none; + } + + #Main:not(.middle-column-open) & { + transform: translate3d(26.5rem, 0, 0); + } + } + + @media (max-width: 600px) { + border-left: none; + + #Main:not(.middle-column-open) & { + transform: translate3d(100vw, 0, 0); + } + + #Main.right-column-open & { + transform: translate3d(-20vw, 0, 0); + } + } +} + +.SymbolMenu { + @media (max-width: 600px) { + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none; + } + + body:not(.is-middle-column-open) & { + transform: translate3d(100vw, 0, 0) !important; + } + } +} diff --git a/src/components/main/Main.tsx b/src/components/main/Main.tsx new file mode 100644 index 000000000..5952e3ea3 --- /dev/null +++ b/src/components/main/Main.tsx @@ -0,0 +1,135 @@ +import React, { FC, useEffect, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; + +import '../../modules/actions/all'; +import { ANIMATION_END_DELAY, DEBUG } from '../../config'; +import { pick } from '../../util/iteratees'; +import { selectIsForwardModalOpen, selectIsMediaViewerOpen, selectIsRightColumnShown } from '../../modules/selectors'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; +import useShowTransition from '../../hooks/useShowTransition'; + +import LeftColumn from '../left/LeftColumn'; +import MiddleColumn from '../middle/MiddleColumn'; +import RightColumn from '../right/RightColumn'; +import MediaViewer from '../mediaViewer/MediaViewer.async'; +import ForwardPicker from './ForwardPicker.async'; +import Notifications from './Notifications.async'; +import Errors from './Errors.async'; + +import './Main.scss'; +import buildClassName from '../../util/buildClassName'; + +type StateProps = { + animationLevel: number; + lastSyncTime?: number; + isLeftColumnShown: boolean; + isRightColumnShown: boolean; + isMediaViewerOpen: boolean; + isForwardModalOpen: boolean; + hasNotifications: boolean; + hasErrors: boolean; +}; + +type DispatchProps = Pick; + +const ANIMATION_DURATION = 350; + +let timeout: number | undefined; + +let DEBUG_isLogged = false; + +const Main: FC = ({ + lastSyncTime, + loadAnimatedEmojis, + isLeftColumnShown, + isRightColumnShown, + isMediaViewerOpen, + isForwardModalOpen, + animationLevel, + hasNotifications, + hasErrors, +}) => { + if (DEBUG && !DEBUG_isLogged) { + DEBUG_isLogged = true; + // eslint-disable-next-line no-console + console.log('>>> RENDER MAIN'); + } + + // Initial API calls + useEffect(() => { + if (lastSyncTime) { + loadAnimatedEmojis(); + } + }, [lastSyncTime, loadAnimatedEmojis]); + + const { + transitionClassNames: middleColumnTransitionClassNames, + } = useShowTransition(!isLeftColumnShown, undefined, true); + + const { + transitionClassNames: rightColumnTransitionClassNames, + } = useShowTransition(isRightColumnShown, undefined, true); + + const className = buildClassName( + middleColumnTransitionClassNames.replace(/([\w-]+)/g, 'middle-column-$1'), + rightColumnTransitionClassNames.replace(/([\w-]+)/g, 'right-column-$1'), + ); + + useEffect(() => { + // For animating Symbol Menu on mobile + document.body.classList.toggle('is-middle-column-open', className.includes('middle-column-open')); + // For animating components in portals (i.e. Notification) + document.body.classList.toggle('is-right-column-shown', className.includes('right-column-open')); + }, [className]); + + // Add `body` classes when toggling right column + useEffect(() => { + if (animationLevel > 0) { + document.body.classList.add('animating-right-column'); + dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY); + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + timeout = window.setTimeout(() => { + document.body.classList.remove('animating-right-column'); + timeout = undefined; + }, ANIMATION_DURATION + ANIMATION_END_DELAY); + } + }, [animationLevel, isRightColumnShown]); + + function stopEvent(e: React.MouseEvent) { + e.preventDefault(); + e.stopPropagation(); + } + + return ( +
    + + + + + + + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => ({ + animationLevel: global.settings.byKey.animationLevel, + lastSyncTime: global.lastSyncTime, + isLeftColumnShown: global.isLeftColumnShown, + isRightColumnShown: selectIsRightColumnShown(global), + isMediaViewerOpen: selectIsMediaViewerOpen(global), + isForwardModalOpen: selectIsForwardModalOpen(global), + hasNotifications: Boolean(global.notifications.length), + hasErrors: Boolean(global.errors.length), + }), + (setGlobal, actions): DispatchProps => pick(actions, ['loadAnimatedEmojis']), +)(Main)); diff --git a/src/components/main/Notifications.async.tsx b/src/components/main/Notifications.async.tsx new file mode 100644 index 000000000..3bba91cf5 --- /dev/null +++ b/src/components/main/Notifications.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const NotificationsAsync: FC = ({ isOpen }) => { + const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return Notifications ? : undefined; +}; + +export default NotificationsAsync; diff --git a/src/components/main/Notifications.tsx b/src/components/main/Notifications.tsx new file mode 100644 index 000000000..98f1a1f72 --- /dev/null +++ b/src/components/main/Notifications.tsx @@ -0,0 +1,38 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiNotification } from '../../api/types'; + +import { pick } from '../../util/iteratees'; + +import Notification from '../ui/Notification'; +import renderText from '../common/helpers/renderText'; + +type StateProps = { + notifications: ApiNotification[]; +}; + +type DispatchProps = Pick; + +const Notifications: FC = ({ notifications, dismissNotification }) => { + if (!notifications.length) { + return undefined; + } + + return ( +
    + {notifications.map(({ message }) => ( + + ))} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['notifications']), + (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']), +)(Notifications)); diff --git a/src/components/mediaViewer/MediaViewer.async.tsx b/src/components/mediaViewer/MediaViewer.async.tsx new file mode 100644 index 000000000..1b0efe89b --- /dev/null +++ b/src/components/mediaViewer/MediaViewer.async.tsx @@ -0,0 +1,16 @@ +import React, { FC, memo } from '../../lib/teact/teact'; + +import { Bundles } from '../../util/moduleLoader'; +import useModuleLoader from '../../hooks/useModuleLoader'; + +interface OwnProps { + isOpen: boolean; +} + +const MediaViewerAsync: FC = ({ isOpen }) => { + const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen); + + return MediaViewer ? : undefined; +}; + +export default memo(MediaViewerAsync); diff --git a/src/components/mediaViewer/MediaViewer.scss b/src/components/mediaViewer/MediaViewer.scss new file mode 100644 index 000000000..71175d3d8 --- /dev/null +++ b/src/components/mediaViewer/MediaViewer.scss @@ -0,0 +1,241 @@ +#MediaViewer { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100%; + background: rgba(0, 0, 0, .9); + color: #fff; + z-index: var(--z-media-viewer); + padding: 0.5rem 0; + + display: grid; + grid-template-columns: auto; + grid-template-rows: 2.75rem 1fr; + grid-column-gap: 0; + grid-row-gap: 0; + justify-items: stretch; + align-items: center; + + // Potential perf improvement + &:not(.shown) { + display: block !important; + transform: scale(0); + } + + body.ghost-animating & { + > .pan-wrapper, > .Transition, > button { + display: none; + } + } + + body.animation-level-2 & { + transition-duration: .3s !important; + } + + &:not(.open), + .closing { + .SenderInfo { + pointer-events: none; + transition: none; + } + } + + &.zoomed { + .navigation { + display: none; + } + + .media-viewer-head { + z-index: 2; + } + + .media-viewer-content { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + padding: 0; + z-index: 1; + } + } + + .media-viewer-head { + display: flex; + grid-area: 1 / 1 / 2 / -2; + padding: 0 1.25rem; + position: relative; + z-index: var(--z-media-viewer-head); + + & > .Transition { + width: 100%; + } + + @media (max-width: 600px) { + padding: 0 0.5rem; + + .media-viewer-close { + margin-right: 1.5rem; + } + } + } + + & > .Transition, + & > .pan-wrapper { + grid-area: 1 / 1 / -1 / -1; + } + + & > .Transition, + & > .pan-wrapper .Transition { + position: relative; + justify-self: center; + text-align: center; + width: 100%; + height: 100%; + display: flex; + align-items: center; + overflow: hidden; + } + + .media-viewer-content { + position: relative; + z-index: 1; + padding: 3.25rem 0; + height: 100%; + display: inline-flex; + justify-content: center; + align-items: center; + + &.has-footer { + padding: 7rem 0; + @media (min-width: 600px) { + min-width: 600px; + } + + @media (max-height: 640px) { + padding: 4rem 0; + } + + > img { + max-height: calc(100vh - 15rem); + @media (max-height: 640px) { + max-height: calc(100vh - 10rem); + } + } + } + + .thumbnail { + position: relative; + + img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } + + > img { + max-width: 100vw; + max-height: calc(100vh - 8.25rem); + object-fit: contain; + transition: transform .2s; + } + + .spinner-wrapper { + max-width: 100vw; + margin: auto; + } + + .Spinner { + margin: auto; + } + } + + .navigation { + position: fixed; + top: 4rem; + width: 10vw; + bottom: 0; + border: none; + padding: 0; + margin: 0; + appearance: none; + background: transparent no-repeat; + background-size: 1.25rem; + opacity: 0; + transition: opacity .15s; + outline: none; + cursor: pointer; + z-index: 1; + + @media (max-width: 600px) { + width: 20vw; + } + + &:hover, .is-touch-env & { + opacity: 1; + } + + &.prev { + left: 0; + background-image: url("../../assets/media_navigation_previous.svg"); + background-position: 1.25rem calc(50% - 2rem); + } + + &.next { + right: 0; + background-image: url("../../assets/media_navigation_next.svg"); + background-position: calc(100% - 1.25rem) calc(50% - 2rem); + } + + &.inline { + top: calc(50% - 3rem); + bottom: unset; + height: 6rem; + background-position-y: center; + + @media (max-width: 600px) { + opacity: 0; + transition: opacity .15s ease-in; + pointer-events: none; + + .video-controls-visible & { + opacity: 1; + pointer-events: all; + } + } + } + } +} + +.ghost { + position: absolute; + z-index: var(--z-media-viewer); + will-change: transform, opacity; + overflow: hidden; + border-radius: 0; + transition: transform .2s ease, opacity .2s ease; + + &.rounded-corners { + border-radius: var(--border-radius-messages); + } + + &.circle { + border-radius: 50%; + } + + body.is-ios & { + transition: transform .2s ease, opacity .2s ease, border-radius .2s ease !important; + } + + img, + video { + width: 100%; + height: 100%; + user-select: none; + -webkit-user-select: none; + object-fit: cover; + } +} diff --git a/src/components/mediaViewer/MediaViewer.tsx b/src/components/mediaViewer/MediaViewer.tsx new file mode 100644 index 000000000..903b4c797 --- /dev/null +++ b/src/components/mediaViewer/MediaViewer.tsx @@ -0,0 +1,632 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { + ApiChat, ApiMediaFormat, ApiMessage, ApiUser, +} from '../../api/types'; +import { MediaViewerOrigin } from '../../types'; + +import { ANIMATION_END_DELAY } from '../../config'; +import { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment'; +import { + AVATAR_FULL_DIMENSIONS, + MEDIA_VIEWER_MEDIA_QUERY, + calculateMediaViewerDimensions, +} from '../common/helpers/mediaDimensions'; +import { + selectChat, + selectChatMessage, + selectChatMessages, + selectCurrentMediaSearch, + selectListedIds, + selectOutlyingIds, + selectScheduledMessage, + selectScheduledMessages, + selectUser, +} from '../../modules/selectors'; +import { + getChatAvatarHash, + getChatMediaMessageIds, + getMessageMediaFilename, + getMessageMediaFormat, + getMessageMediaHash, + getMessageMediaThumbDataUri, + getMessagePhoto, + getMessageVideo, + getMessageWebPagePhoto, + getPhotoFullDimensions, + getVideoDimensions, + IDimensions, +} from '../../modules/helpers'; +import { pick } from '../../util/iteratees'; +import { captureEvents, SwipeDirection } from '../../util/captureEvents'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; +import { stopCurrentAudio } from '../../util/audioPlayer'; +import useForceUpdate from '../../hooks/useForceUpdate'; +import useMedia from '../../hooks/useMedia'; +import useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress'; +import useBlurSync from '../../hooks/useBlurSync'; +import usePrevious from '../../hooks/usePrevious'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; +import { renderMessageText } from '../common/helpers/renderMessageText'; +import { animateClosing, animateOpening } from './helpers/ghostAnimation'; +import useLang from '../../hooks/useLang'; + +import Spinner from '../ui/Spinner'; +import ShowTransition from '../ui/ShowTransition'; +import Transition from '../ui/Transition'; +import Button from '../ui/Button'; +import SenderInfo from './SenderInfo'; +import MediaViewerActions from './MediaViewerActions'; +import MediaViewerFooter from './MediaViewerFooter'; +import VideoPlayer from './VideoPlayer'; +import ZoomControls from './ZoomControls'; +import PanZoom from './PanZoom'; + +import './MediaViewer.scss'; + +type StateProps = { + chatId?: number; + threadId?: number; + messageId?: number; + senderId?: number; + origin?: MediaViewerOrigin; + avatarOwner?: ApiChat | ApiUser; + message?: ApiMessage; + chatMessages?: Record; + collectionIds?: number[]; + animationLevel: 0 | 1 | 2; +}; + +type DispatchProps = Pick; + +const ANIMATION_DURATION = 350; + +const MediaViewer: FC = ({ + chatId, + threadId, + messageId, + senderId, + origin, + avatarOwner, + message, + chatMessages, + collectionIds, + openMediaViewer, + closeMediaViewer, + openForwardMenu, + focusMessage, + animationLevel, +}) => { + // eslint-disable-next-line no-null/no-null + const animationKey = useRef(null); + const isOpen = Boolean(avatarOwner || messageId); + const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined; + const photo = message ? getMessagePhoto(message) : undefined; + const video = message ? getMessageVideo(message) : undefined; + const isWebPagePhoto = Boolean(webPagePhoto); + const isPhoto = Boolean(photo || webPagePhoto); + const isVideo = Boolean(video); + const isGif = video ? video.isGif : undefined; + const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia; + const isFromSearch = origin === MediaViewerOrigin.SearchResult; + const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none'; + const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none'; + const isGhostAnimation = animationLevel === 2; + const fileName = avatarOwner ? `avatar${avatarOwner.id}.jpg` : message && getMessageMediaFilename(message); + const prevSenderId = usePrevious(senderId); + const [canPanZoomWrap, setCanPanZoomWrap] = useState(false); + const [isZoomed, setIsZoomed] = useState(false); + const [zoomLevel, setZoomLevel] = useState(1); + const [panDelta, setPanDelta] = useState({ x: 0, y: 0 }); + + const messageIds = useMemo(() => { + return isWebPagePhoto && messageId + ? [messageId] + : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia); + }, [isWebPagePhoto, messageId, chatMessages, collectionIds, isFromSharedMedia]); + + const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1; + const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1; + const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1; + if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) { + animationKey.current = selectedMediaMessageIndex; + } + + function getMediaHash(full?: boolean) { + if (avatarOwner) { + return getChatAvatarHash(avatarOwner, full ? 'big' : 'normal'); + } + + return message && getMessageMediaHash(message, full ? 'viewerFull' : 'viewerPreview'); + } + + const blobUrlPictogram = useMedia( + message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'), + undefined, + ApiMediaFormat.BlobUrl, + undefined, + isGhostAnimation && ANIMATION_DURATION, + ); + const blobUrlPreview = useMedia( + getMediaHash(), + undefined, + avatarOwner ? ApiMediaFormat.DataUri : ApiMediaFormat.BlobUrl, + undefined, + isGhostAnimation && ANIMATION_DURATION, + ); + const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress( + getMediaHash(true), + undefined, + message && getMessageMediaFormat(message, 'viewerFull'), + undefined, + isGhostAnimation && ANIMATION_DURATION, + ); + + const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined; + let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram; + const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message)); + if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) { + bestImageData = thumbDataUri; + } + + const photoDimensions = isPhoto ? getPhotoFullDimensions(( + isWebPagePhoto ? getMessageWebPagePhoto(message!) : getMessagePhoto(message!) + )!) : undefined; + const videoDimensions = isVideo ? getVideoDimensions(getMessageVideo(message!)!) : undefined; + + useEffect(() => { + if (!IS_MOBILE_SCREEN) { + return; + } + + document.body.classList.toggle('is-media-viewer-open', isOpen); + }, [isOpen]); + + const forceUpdate = useForceUpdate(); + useEffect(() => { + const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY); + if (typeof mql.addEventListener === 'function') { + mql.addEventListener('change', forceUpdate); + } else if (typeof mql.addListener === 'function') { + mql.addListener(forceUpdate); + } + + return () => { + if (typeof mql.removeEventListener === 'function') { + mql.removeEventListener('change', forceUpdate); + } else if (typeof mql.removeListener === 'function') { + mql.removeListener(forceUpdate); + } + }; + }, [forceUpdate]); + + const prevMessage = usePrevious(message); + const prevOrigin = usePrevious(origin); + const prevAvatarOwner = usePrevious(avatarOwner); + const prevBestImageData = usePrevious(bestImageData); + useEffect(() => { + if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) { + dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY); + const textParts = message ? renderMessageText(message) : undefined; + const hasFooter = Boolean(textParts); + animateOpening(hasFooter, origin!, bestImageData!, message); + } + + if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) { + dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY); + animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined); + } + }, [ + isGhostAnimation, isOpen, origin, prevOrigin, + message, prevMessage, prevAvatarOwner, bestImageData, prevBestImageData, + ]); + + useEffect(() => { + let timer: number | undefined; + + if (isZoomed) { + setCanPanZoomWrap(true); + } else { + timer = window.setTimeout(() => { + setCanPanZoomWrap(false); + }, ANIMATION_DURATION); + } + + return () => { + if (timer) { + window.clearTimeout(timer); + } + }; + }, [isZoomed]); + + const closeZoom = () => { + setIsZoomed(false); + setZoomLevel(1); + setPanDelta({ x: 0, y: 0 }); + }; + + const handleZoomToggle = useCallback(() => { + setIsZoomed(!isZoomed); + setZoomLevel(!isZoomed ? 1.5 : 1); + if (isZoomed) { + setPanDelta({ x: 0, y: 0 }); + } + }, [isZoomed]); + + const handleZoomValue = useCallback((level: number, canCloseZoom = false) => { + setZoomLevel(level); + if (level === 1 && canCloseZoom) { + closeZoom(); + } + }, []); + + const close = useCallback(() => { + closeMediaViewer(); + closeZoom(); + }, [closeMediaViewer]); + + const handleFooterClick = useCallback(() => { + close(); + focusMessage({ chatId, threadId, messageId }); + }, [close, chatId, threadId, focusMessage, messageId]); + + const handleForward = useCallback(() => { + openForwardMenu({ fromChatId: chatId, messageIds: [messageId] }); + closeZoom(); + }, [openForwardMenu, chatId, messageId]); + + useEffect(() => (isOpen ? captureEscKeyListener(() => { + if (isZoomed) { + closeZoom(); + } else { + close(); + } + }) : undefined), [close, isOpen, isZoomed]); + + useEffect(() => { + if (isVideo && !isGif) { + stopCurrentAudio(); + } + }, [isGif, isVideo]); + + const getMessageId = useCallback((fromId: number, direction: number): number => { + let index = messageIds.indexOf(fromId); + if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) { + index += direction; + } + + return messageIds[index]; + }, [messageIds]); + + const selectPreviousMedia = useCallback(() => { + if (isFirst) { + return; + } + + openMediaViewer({ + chatId, + threadId, + messageId: messageId ? getMessageId(messageId, -1) : undefined, + origin, + }); + }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]); + + const selectNextMedia = useCallback(() => { + if (isLast) { + return; + } + + openMediaViewer({ + chatId, + threadId, + messageId: messageId ? getMessageId(messageId, 1) : undefined, + origin, + }); + }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + switch (e.key) { + case 'Left': // IE/Edge specific value + case 'ArrowLeft': + selectPreviousMedia(); + break; + + case 'Right': // IE/Edge specific value + case 'ArrowRight': + selectNextMedia(); + break; + } + }; + + document.addEventListener('keydown', handleKeyDown, false); + + return () => { + document.removeEventListener('keydown', handleKeyDown, false); + }; + }); + + // Support for swipe gestures and closing on click + useEffect(() => { + const element = document.querySelector('.slide-container > .active, .slide-container > .to'); + if (!element) { + return undefined; + } + + const shouldCloseOnVideo = isGif && !IS_IOS; + + return captureEvents(element, { + // eslint-disable-next-line max-len + excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`, + onClick: () => { + if (!isZoomed) { + close(); + } + }, + onSwipe: IS_TOUCH_ENV ? (e, direction) => { + if (direction === SwipeDirection.Right) { + selectPreviousMedia(); + } else if (direction === SwipeDirection.Left) { + selectNextMedia(); + } else { + close(); + } + } : undefined, + }); + }, [close, isGif, isZoomed, selectNextMedia, selectPreviousMedia, canPanZoomWrap]); + + const handlePan = useCallback((x: number, y: number) => { + setPanDelta({ x, y }); + }, []); + + const lang = useLang(); + + function renderSlide(isActive: boolean) { + if (avatarOwner) { + return ( +
    + {renderPhoto(fullMediaData || blobUrlPreview, calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false))} +
    + ); + } else if (message) { + const textParts = renderMessageText(message); + const hasFooter = Boolean(textParts); + + return ( +
    + {isPhoto && renderPhoto( + localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram, + message && calculateMediaViewerDimensions(photoDimensions!, hasFooter), + )} + {isVideo && ( + + )} + {textParts && ( + + )} +
    + ); + } + + return undefined; + } + + function renderSenderInfo() { + return ( + + ); + } + + return ( + + {() => ( + <> +
    + {IS_MOBILE_SCREEN && ( + + )} + + {renderSenderInfo} + + +
    + + + {renderSlide} + + + {!isFirst && ( + + ); + }, []); + + if (IS_MOBILE_SCREEN) { + return ( +
    + + {!isAvatar && ( + + {lang('Forward')} + + )} + {isVideo ? ( + + {isVideoDownloadAllowed ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'} + + ) : ( + + {lang('AccActionDownload')} + + )} + + {isVideoDownloadAllowed && } +
    + ); + } + + return ( +
    + {!isAvatar && ( + <> + + + )} + {isVideo ? ( + + ) : ( + + )} + + +
    + ); +}; + +export default MediaViewerActions; diff --git a/src/components/mediaViewer/MediaViewerFooter.scss b/src/components/mediaViewer/MediaViewerFooter.scss new file mode 100644 index 000000000..ea5de80ce --- /dev/null +++ b/src/components/mediaViewer/MediaViewerFooter.scss @@ -0,0 +1,95 @@ +.MediaViewerFooter { + position: absolute; + bottom: 0; + padding: 1rem 0; + width: 100%; + + #MediaViewer.zoomed & { + display: none; + } + + @media (max-height: 640px) { + padding: .5rem 0 0; + } + + @media (max-width: 600px) { + padding-bottom: 4.5rem; + background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%); + + &.hideable { + opacity: 0; + pointer-events: none; + + .video-controls-visible & { + opacity: 1; + pointer-events: all; + } + } + } + + .media-viewer-footer-content { + position: relative; + max-width: var(--messages-container-width); + margin: auto; + cursor: pointer; + opacity: .5; + transition: opacity .15s; + + &:hover { + opacity: 1; + } + + @media (max-width: 600px) { + opacity: 1; + } + } + + .media-text { + margin-bottom: 0; + overflow: auto; + padding: 0 .5rem; + text-align: center; + color: rgba(255, 255, 255, .9); + font-size: .9375rem; + letter-spacing: .025rem; + max-height: 4.25rem; + + @media (max-height: 640px) { + max-height: 2.75rem; + } + + .emoji { + width: .9375rem; + height: .9375rem; + vertical-align: -2px; + } + + &.multiline { + &::before { + content: ''; + position: absolute; + left: -.75rem; + right: -.75rem; + top: -.25rem; + bottom: -.25rem; + background: rgba(0, 0, 0, .75); + border-radius: var(--border-radius-default); + z-index: var(--z-below); + + @media (max-width: 600px) { + display: none; + background: none; + } + } + } + } + + a { + color: var(--color-links); + + &:hover, + &:focus { + color: var(--color-links-hover); + } + } +} diff --git a/src/components/mediaViewer/MediaViewerFooter.tsx b/src/components/mediaViewer/MediaViewerFooter.tsx new file mode 100644 index 000000000..6f4a017b1 --- /dev/null +++ b/src/components/mediaViewer/MediaViewerFooter.tsx @@ -0,0 +1,56 @@ +import React, { FC, useEffect, useState } from '../../lib/teact/teact'; +import { throttle } from '../../util/schedulers'; +import { TextPart } from '../common/helpers/renderMessageText'; +import { REM } from '../common/helpers/mediaDimensions'; + +import './MediaViewerFooter.scss'; + +const RESIZE_THROTTLE_MS = 500; + +type OwnProps = { + text: TextPart | TextPart[]; + onClick: () => void; + isHideable: boolean; +}; + +const MediaViewerFooter: FC = ({ text = '', isHideable, onClick }) => { + const [isMultiline, setIsMultiline] = useState(false); + useEffect(() => { + const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null; + + const checkIsMultiline = () => { + const height = footerContent ? footerContent.clientHeight : 0; + + setIsMultiline(height > REM * 2); + }; + + // First run for initial detection of multiline footer text + checkIsMultiline(); + + const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true); + + window.addEventListener('resize', handleResize, false); + + return () => { + window.removeEventListener('resize', handleResize, false); + }; + }, []); + + function stopEvent(e: React.MouseEvent) { + if (text) { + e.stopPropagation(); + } + } + + return ( +
    + {text && ( +
    +

    {text}

    +
    + )} +
    + ); +}; + +export default MediaViewerFooter; diff --git a/src/components/mediaViewer/PanZoom.scss b/src/components/mediaViewer/PanZoom.scss new file mode 100644 index 000000000..58b681c86 --- /dev/null +++ b/src/components/mediaViewer/PanZoom.scss @@ -0,0 +1,25 @@ +.pan-wrapper, +.pan-container { + position: relative; + width: 100%; + height: 100%; +} + +.pan-wrapper { + cursor: move; + user-select: none; +} + +.pan-container { + transition: transform .2s ease-in; + + .pan-wrapper.move & { + transition: none; + } + + .zoomed & { + position: fixed; + top: 0; + left: 0; + } +} diff --git a/src/components/mediaViewer/PanZoom.tsx b/src/components/mediaViewer/PanZoom.tsx new file mode 100644 index 000000000..d92c9824b --- /dev/null +++ b/src/components/mediaViewer/PanZoom.tsx @@ -0,0 +1,211 @@ +/* + @source https://github.com/ajainarayanan/react-pan-zoom + + Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768 + without jqueryUI or jquery dependency. +*/ +import React, { + FC, memo, useEffect, useRef, useState, +} from '../../lib/teact/teact'; + +import { areSortedArraysEqual } from '../../util/iteratees'; + +import './PanZoom.scss'; + +export interface IDragData { + x: number; + y: number; + dx: number; + dy: number; +} + +export interface OwnProps { + children: any; + className?: string; + noWrap: boolean; + canPan: boolean; + zoomLevel: number; + panDeltaX: number; + panDeltaY: number; + onPan?: (x: number, y: number) => void; +} + +const INITIAL_MATRIX = [ + 1, 0, 0, 1, 0, 0, +]; + +const SCALE_VALUES = { + 1: 1, + 1.5: 1.5, + 2: 2.2, + 2.5: 3.3, + 3: 5.5, +}; + +const ZOOM_SAFE_AREA = 150; + +function calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) { + const image = wrapper && wrapper.querySelector('.active img'); + if (!wrapper || !image) { + return matrixData; + } + const wrapperRect = wrapper.getBoundingClientRect(); + const imageRect = image.getBoundingClientRect(); + + const newImgWidth = (imageRect.width / oldScale) * matrixData[0]; + const newImgHeight = (imageRect.height / oldScale) * matrixData[3]; + const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4]; + const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5]; + if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) { + matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA; + } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) { + matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA; + } + if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) { + matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA; + } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) { + matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA; + } + + return matrixData; +} + +const PanZoom: FC = ({ + children, + className, + noWrap, + canPan, + zoomLevel, + panDeltaX, + panDeltaY, + onPan, +}) => { + const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel; + const [isDragging, setIsDragging] = useState(false); + const [dragData, setDragData] = useState({ + dx: panDeltaX, dy: panDeltaY, x: 0, y: 0, + }); + // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix() + const [matrixData, setMatrixData] = useState(INITIAL_MATRIX); + // Used to set cursor while moving. + // eslint-disable-next-line no-null/no-null + const panWrapperRef = useRef(null); + // Used to set transform for pan. + // eslint-disable-next-line no-null/no-null + const panContainerRef = useRef(null); + + useEffect(() => { + const newZoomLevel = tunedZoomLevel || matrixData[0]; + const newPandx = panDeltaX || matrixData[4]; + const newPandy = panDeltaY || matrixData[5]; + + const newMatrixData = [...matrixData]; + if (matrixData[0] !== newZoomLevel) { + newMatrixData[0] = newZoomLevel || newMatrixData[0]; + newMatrixData[3] = newZoomLevel || newMatrixData[3]; + } + if (matrixData[4] !== newPandx) { + newMatrixData[4] = newPandx; + } + if (matrixData[5] !== newPandy) { + newMatrixData[5] = newPandy; + } + + if (!areSortedArraysEqual(matrixData, newMatrixData)) { + setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current)); + } + // eslint-disable-next-line + }, [panDeltaX, panDeltaY, tunedZoomLevel]); + + useEffect(() => { + if (!canPan) { + setMatrixData(INITIAL_MATRIX); + } + }, [canPan]); + + useEffect(() => { + if (panContainerRef.current) { + panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`; + } + }, [noWrap, matrixData]); + + const handleMouseDown = (e: React.MouseEvent) => { + if (!canPan) { + return; + } + + e.stopPropagation(); + e.preventDefault(); + + const offsetX = matrixData[4]; + const offsetY = matrixData[5]; + const newDragData: IDragData = { + dx: offsetX, + dy: offsetY, + x: e.pageX, + y: e.pageY, + }; + setDragData(newDragData); + setIsDragging(true); + + if (panWrapperRef.current) { + panWrapperRef.current.classList.add('move'); + } + }; + + const handleMouseUp = () => { + setIsDragging(false); + + if (panWrapperRef.current) { + panWrapperRef.current.classList.remove('move'); + } + + if (onPan) { + onPan(matrixData[4], matrixData[5]); + } + }; + + function getNewMatrixData(x: number, y: number): number[] { + const newMatrixData = [...matrixData]; + const deltaX = dragData.x - x; + const deltaY = dragData.y - y; + newMatrixData[4] = dragData.dx - deltaX; + newMatrixData[5] = dragData.dy - deltaY; + + return newMatrixData; + } + + const handleMouseMove = (e: React.MouseEvent) => { + if (isDragging) { + const newMatrixData = getNewMatrixData(e.pageX, e.pageY); + setMatrixData(newMatrixData); + + if (panContainerRef.current) { + panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`; + } + } + }; + + if (noWrap) { + return children; + } + + return ( +
    +
    + {children} +
    +
    + ); +}; + +export default memo(PanZoom); diff --git a/src/components/mediaViewer/SenderInfo.scss b/src/components/mediaViewer/SenderInfo.scss new file mode 100644 index 000000000..9603042d8 --- /dev/null +++ b/src/components/mediaViewer/SenderInfo.scss @@ -0,0 +1,42 @@ +.SenderInfo { + display: flex; + align-content: center; + color: white; + cursor: pointer; + + opacity: .5; + transition: .15s opacity; + + &:hover { + opacity: 1; + } + + .Avatar { + margin-right: 1rem; + + @media (max-width: 600px) { + display: none; + } + } + + .meta { + display: flex; + flex-direction: column; + justify-content: center; + max-width: 100%; + } + + .title { + line-height: 1.45rem; + font-weight: 500; + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; + } + + .date { + line-height: 1.25rem; + font-size: 0.875rem; + letter-spacing: -0.01rem; + } +} diff --git a/src/components/mediaViewer/SenderInfo.tsx b/src/components/mediaViewer/SenderInfo.tsx new file mode 100644 index 000000000..3fef50b25 --- /dev/null +++ b/src/components/mediaViewer/SenderInfo.tsx @@ -0,0 +1,92 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiChat, ApiMessage, ApiUser } from '../../api/types'; + +import { getSenderTitle, isChatPrivate } from '../../modules/helpers'; +import { formatMediaDateTime } from '../../util/dateFormat'; +import renderText from '../common/helpers/renderText'; +import { + selectChat, + selectChatMessage, + selectSender, + selectUser, +} from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Avatar from '../common/Avatar'; + +import './SenderInfo.scss'; + +type OwnProps = { + chatId?: number; + messageId?: number; + isAvatar?: boolean; +}; + +type StateProps = { + sender?: ApiUser | ApiChat; + message?: ApiMessage; +}; + +type DispatchProps = Pick; + +const SenderInfo: FC = ({ + chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage, +}) => { + const handleFocusMessage = useCallback(() => { + closeMediaViewer(); + focusMessage({ chatId, messageId }); + }, [chatId, focusMessage, messageId, closeMediaViewer]); + + useLang(); + + if (!sender || (!message && !isAvatar)) { + return undefined; + } + + const isFromChat = sender.id < 0; + const senderTitle = getSenderTitle(sender); + + return ( +
    + {isFromChat ? ( + + ) : ( + + )} +
    +
    + {senderTitle && renderText(senderTitle)} +
    +
    + {isAvatar ? 'Profile photo' : formatMediaDateTime(message!.date * 1000)} +
    +
    +
    + ); +}; + +export default withGlobal( + (global, { chatId, messageId, isAvatar }): StateProps => { + if (isAvatar && chatId) { + return { + sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId), + }; + } + + if (!messageId || !chatId) { + return {}; + } + + const message = selectChatMessage(global, chatId, messageId); + + return { + message, + sender: message && selectSender(global, message), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']), +)(SenderInfo); diff --git a/src/components/mediaViewer/VideoPlayer.scss b/src/components/mediaViewer/VideoPlayer.scss new file mode 100644 index 000000000..44edf2fbf --- /dev/null +++ b/src/components/mediaViewer/VideoPlayer.scss @@ -0,0 +1,87 @@ +.VideoPlayer { + position: relative; + display: inline-flex; + flex-direction: column; + overflow: hidden; + + #MediaViewer.zoomed & { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + > div { + width: 100% !important; + height: 100% !important; + } + video { + max-height: none !important; + } + } + + @media (min-width: 601px) { + // Safari: custom controls are not displayed after exiting full screen mode. + z-index: 1; + } + + @media (max-width: 600px) { + overflow: visible; + } + + @media (max-height: 640px) { + margin-bottom: 1.75rem; + @at-root .has-footer #{&} { + margin-bottom: 0; + } + } + + video { + display: block; + max-height: calc(100vh - 8.25rem); + margin: auto; + object-fit: contain; + outline: none; + width: 100%; + height: 100%; + background: no-repeat 50% 50%; + background-size: contain; + + @media (max-height: 640px) { + max-height: calc(100vh - 10rem); + } + @at-root .has-footer #{&} { + max-height: calc(100vh - 15rem); + @media (max-height: 640px) { + max-height: calc(100vh - 10rem); + } + } + } + + .spinner-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + + .buffering { + background: rgba(0, 0, 0, 0.25); + color: #fff; + font-size: 0.75rem; + position: absolute; + left: 0.1875rem; + top: 0.1875rem; + z-index: 1; + padding: 0 0.375rem; + border-radius: 0.75rem; + line-height: 1.125rem; + } + + .ProgressSpinner { + cursor: pointer; + } + } +} diff --git a/src/components/mediaViewer/VideoPlayer.tsx b/src/components/mediaViewer/VideoPlayer.tsx new file mode 100644 index 000000000..039d15367 --- /dev/null +++ b/src/components/mediaViewer/VideoPlayer.tsx @@ -0,0 +1,205 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, useState, +} from '../../lib/teact/teact'; + +import { IDimensions } from '../../modules/helpers'; + +import { IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV } from '../../util/environment'; +import useShowTransition from '../../hooks/useShowTransition'; +import useBuffering from '../../hooks/useBuffering'; +import useFullscreenStatus from '../../hooks/useFullscreen'; +import useVideoCleanup from '../../hooks/useVideoCleanup'; +import safePlay from '../../util/safePlay'; + +import VideoPlayerControls from './VideoPlayerControls'; +import ProgressSpinner from '../ui/ProgressSpinner'; + +import './VideoPlayer.scss'; + +type OwnProps = { + url?: string; + isGif?: boolean; + posterData?: string; + posterSize?: IDimensions; + downloadProgress?: number; + fileSize: number; + isMediaViewerOpen?: boolean; + noPlay?: boolean; + onClose: (e: React.MouseEvent) => void; +}; + +const MOBILE_VERSION_CONTROL_WIDTH = 400; + +const VideoPlayer: FC = ({ + url, + isGif, + posterData, + posterSize, + downloadProgress, + fileSize, + isMediaViewerOpen, + noPlay, + onClose, +}) => { + // eslint-disable-next-line no-null/no-null + const videoRef = useRef(null); + const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS); + const [currentTime, setCurrentTime] = useState(0); + const [isControlsVisible, setIsControlsVisible] = useState(true); + + const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed); + + const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering(); + const { + shouldRender: shouldRenderSpinner, + transitionClassNames: spinnerClassNames, + } = useShowTransition(!isBuffered, undefined, undefined, 'slow'); + + useEffect(() => { + if (noPlay || !isMediaViewerOpen) { + videoRef.current!.pause(); + } else if (url && !IS_TOUCH_ENV) { + // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`), + // so we force it here. Contrary, iOS does not allow to call `play` without mouse event, + // so we need to use `autoPlay` instead to allow pre-buffering. + safePlay(videoRef.current!); + } + }, [noPlay, isMediaViewerOpen, url]); + + useEffect(() => { + if (videoRef.current!.currentTime === videoRef.current!.duration) { + setCurrentTime(0); + setIsPlayed(false); + } else { + setCurrentTime(videoRef.current!.currentTime); + } + }, [currentTime]); + + const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => { + e.stopPropagation(); + if (isPlayed) { + videoRef.current!.pause(); + setIsPlayed(false); + } else { + videoRef.current!.play(); + setIsPlayed(true); + } + }, [isPlayed]); + + useVideoCleanup(videoRef, []); + + const handleMouseOver = useCallback(() => { + setIsControlsVisible(true); + }, []); + + const handleMouseOut = useCallback(() => { + setIsControlsVisible(false); + }, []); + + const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => { + setCurrentTime(e.currentTarget.currentTime); + }, []); + + const handleEnded = useCallback(() => { + setCurrentTime(0); + setIsPlayed(false); + }, []); + + const handleFullscreenChange = useCallback(() => { + if (isFullscreen && exitFullscreen) { + exitFullscreen(); + } else if (!isFullscreen && setFullscreen) { + setFullscreen(); + } + }, [exitFullscreen, isFullscreen, setFullscreen]); + + const handleSeek = useCallback((e: React.ChangeEvent) => { + e.stopPropagation(); + + videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100; + }, []); + + const toggleControls = useCallback((e: React.MouseEvent) => { + e.stopPropagation(); + setIsControlsVisible(!isControlsVisible); + }, [isControlsVisible]); + + useEffect(() => { + const togglePayingStateBySpace = (e: KeyboardEvent) => { + if (e.key === 'Enter' || e.key === ' ') { + togglePlayState(e); + } + }; + + document.addEventListener('keydown', togglePayingStateBySpace, false); + + return () => { + document.removeEventListener('keydown', togglePayingStateBySpace, false); + }; + }, [togglePlayState]); + + const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`; + const videoStyle = `background-image: url(${posterData})`; + + return ( +
    +
    + {/* eslint-disable-next-line jsx-a11y/media-has-caption */} + +
    + {shouldRenderSpinner && ( +
    + {!isBuffered &&
    Buffering...
    } + +
    + )} + {!isGif && !shouldRenderSpinner && ( + + )} +
    + ); +}; + +export default memo(VideoPlayer); diff --git a/src/components/mediaViewer/VideoPlayerControls.scss b/src/components/mediaViewer/VideoPlayerControls.scss new file mode 100644 index 000000000..54e6e1dab --- /dev/null +++ b/src/components/mediaViewer/VideoPlayerControls.scss @@ -0,0 +1,160 @@ +.VideoPlayerControls { + display: flex; + align-items: center; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + padding-top: .625rem; + font-size: .875rem; + background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%); + + #MediaViewer.zoomed & { + display: none; + } + + @media (max-width: 600px) { + position: fixed; + padding: 1.25rem .5rem .75rem; + background: none; + z-index: var(--z-media-viewer); + } + + &.mobile { + .player-file-size { + position: static; + left: auto; + transform: none; + margin-left: auto; + } + + .fullscreen { + margin-left: 1rem; + } + + .player-time + .fullscreen { + margin-left: auto; + } + } + + .Button { + width: 2.25rem; + padding: 0; + margin: .25rem; + height: 1.75rem; + @media (max-width: 600px) { + height: 2.25rem; + } + } + + .play i { + line-height: 1.5rem; + } + + .player-time { + margin: 0 1rem; + white-space: nowrap; + } + + .fullscreen { + margin-left: auto; + @media (max-width: 600px) { + margin-left: 1rem; + } + i { + line-height: 1.75rem; + @media (max-width: 600px) { + font-size: 1.5rem; + } + } + } + + @media (max-width: 600px) { + .player-time + .fullscreen { + margin-left: auto; + } + } + + .player-file-size { + position: absolute; + left: 50%; + transform: translateX(-50%); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + @media (max-width: 600px) { + position: static; + left: auto; + transform: none; + margin-left: auto; + margin-right: 1rem; + & + .fullscreen { + margin-left: 0; + } + } + } + + .player-seekline { + position: absolute; + left: 1rem; + right: 1rem; + top: 0; + height: 1rem; + + + &-track { + position: absolute; + top: 50%; + left: -.25rem; + right: -.25rem; + height: 5px; + transform: translateY(-50%); + background-color: rgba(255, 255, 255, 0.16); + border-radius: var(--border-radius-default); + } + + &-buffered, + &-played, + &-input { + position: absolute; + top: 0; + left: 0; + height: 100%; + border-radius: var(--border-radius-default); + } + + &-buffered { + background-color: rgba(255, 255, 255, 0.5); + } + + &-played { + background: var(--color-primary); + + &::after { + content: ''; + position: absolute; + width: .75rem; + height: .75rem; + border-radius: 50%; + background-color: var(--color-primary); + right: 0; + top: 50%; + transform: translate(.325rem, -50%); + } + } + + &-input { + width: 100%; + opacity: 0; + margin: 0; + padding: 0; + cursor: pointer; + overflow: hidden; + + &::-webkit-slider-thumb { + margin-top: -2rem; + } + } + } +} diff --git a/src/components/mediaViewer/VideoPlayerControls.tsx b/src/components/mediaViewer/VideoPlayerControls.tsx new file mode 100644 index 000000000..56c422ac3 --- /dev/null +++ b/src/components/mediaViewer/VideoPlayerControls.tsx @@ -0,0 +1,170 @@ +import React, { FC, useState, useEffect } from '../../lib/teact/teact'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { formatMediaDuration } from '../../util/dateFormat'; +import formatFileSize from './helpers/formatFileSize'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; + +import './VideoPlayerControls.scss'; + +type IProps = { + bufferedProgress: number; + currentTime: number; + duration: number; + fileSize: number; + isForceVisible: boolean; + isForceMobileVersion?: boolean; + isPlayed: boolean; + isFullscreenSupported: boolean; + isFullscreen: boolean; + onChangeFullscreen: (e: React.MouseEvent) => void; + onPlayPause: (e: React.MouseEvent) => void; + onSeek: OnChangeHandler; +}; + +type OnChangeHandler = (e: React.ChangeEvent) => void; + +const stopEvent = (e: React.MouseEvent) => { + e.stopPropagation(); +}; + +const HIDE_CONTROLS_TIMEOUT_MS = 800; + +const VideoPlayerControls: FC = ({ + bufferedProgress, + currentTime, + duration, + fileSize, + isForceVisible, + isForceMobileVersion, + isPlayed, + isFullscreenSupported, + isFullscreen, + onChangeFullscreen, + onPlayPause, + onSeek, +}) => { + const [isVisible, setVisibility] = useState(true); + + useEffect(() => { + if (isForceVisible) { + setVisibility(isForceVisible); + } + }, [isForceVisible]); + + useEffect(() => { + let timeout: number | undefined; + + if (!isForceVisible) { + if (IS_MOBILE_SCREEN) { + setVisibility(false); + } else { + timeout = window.setTimeout(() => { + setVisibility(false); + }, HIDE_CONTROLS_TIMEOUT_MS); + } + } + + return () => { + if (timeout) { + window.clearTimeout(timeout); + } + }; + }, [isForceVisible]); + + useEffect(() => { + if (isVisible || isForceVisible) { + document.body.classList.add('video-controls-visible'); + } + + return () => { + document.body.classList.remove('video-controls-visible'); + }; + }, [isForceVisible, isVisible]); + + const lang = useLang(); + + if (!isVisible && !isForceVisible) { + return undefined; + } + + return ( +
    + {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)} + + {renderTime(currentTime, duration)} + {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)} + {isFullscreenSupported && ( + + )} +
    + ); +}; + +function renderTime(currentTime: number, duration: number) { + return ( +
    + {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`} +
    + ); +} + +function renderFileSize(downloadedPercent: number, totalSize: number) { + return ( +
    + {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`} +
    + ); +} + +function renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) { + const percentagePlayed = (currentTime / duration) * 100; + const percentageBuffered = bufferedProgress * 100; + + return ( +
    +
    +
    +
    + +
    +
    + ); +} + +export default VideoPlayerControls; diff --git a/src/components/mediaViewer/ZoomControls.scss b/src/components/mediaViewer/ZoomControls.scss new file mode 100644 index 000000000..cbb50ec0c --- /dev/null +++ b/src/components/mediaViewer/ZoomControls.scss @@ -0,0 +1,99 @@ +.ZoomControls { + position: absolute; + bottom: 1.25rem; + left: 50%; + background: rgba(0,0,0,.5); + border-radius: var(--border-radius-default); + width: 100%; + height: 3.375rem; + max-width: 274px; + transform: translate3d(-50%, 0, 10px); + transition: opacity .3s ease-in; + pointer-events: none; + + &.open { + z-index: var(--z-media-viewer); + pointer-events: all; + } + + .zoom-out, + .zoom-in { + position: absolute; + top: 0.4375rem; + width: 2.5rem; + height: 2.5rem; + color: #fff; + + i { + font-size: 1.5rem; + } + } + + .zoom-out { + left: .5rem; + } + + .zoom-in { + right: .5rem; + } + + .seekline { + position: absolute; + left: 3.25rem; + right: 3.25rem; + top: 1.125rem; + height: 1rem; + + &-track { + position: absolute; + top: 50%; + left: -.25rem; + right: -.25rem; + height: 2px; + transform: translateY(-50%); + background-color: rgba(255, 255, 255, .5); + border-radius: var(--border-radius-default); + } + + &-played, + &-input { + position: absolute; + top: 0; + left: 0; + height: 100%; + border-radius: var(--border-radius-default); + } + + &-played { + background: #fff; + transition: width 200ms; + + &::after { + content: ''; + position: absolute; + width: .75rem; + height: .75rem; + border-radius: 50%; + background-color: #fff; + right: 0; + top: 50%; + transform: translate(.325rem, -50%); + } + } + + &-input { + width: 100%; + height: 1rem; + top: -.375rem; + opacity: 0; + margin: 0; + padding: 0; + cursor: pointer; + overflow: hidden; + + &::-webkit-slider-thumb { + margin-top: -2rem; + } + } + } +} diff --git a/src/components/mediaViewer/ZoomControls.tsx b/src/components/mediaViewer/ZoomControls.tsx new file mode 100644 index 000000000..6a1331164 --- /dev/null +++ b/src/components/mediaViewer/ZoomControls.tsx @@ -0,0 +1,126 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, useState, +} from '../../lib/teact/teact'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import buildClassName from '../../util/buildClassName'; +import usePrevious from '../../hooks/usePrevious'; +import useShowTransition from '../../hooks/useShowTransition'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; + +import './ZoomControls.scss'; + +type OwnProps = { + isShown: boolean; + onChangeZoom: (level: number, canCloseZoom?: boolean) => void; +}; + +export const MAX_ZOOM_LEVEL = 3; +export const MIN_ZOOM_LEVEL = 1; +const ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL); +const RESET_ZOOM_LEVEL = 1.5; + +const ZoomControls: FC = ({ isShown, onChangeZoom }) => { + const { transitionClassNames } = useShowTransition(isShown); + const prevIsShown = usePrevious(isShown); + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + const [zoomLevel, setZoomLevel] = useState(1); + const isSeeking = useRef(false); + + useEffect(() => { + if (isShown && !prevIsShown) { + setZoomLevel(RESET_ZOOM_LEVEL); + } + }, [isShown, prevIsShown]); + + const handleZoomOut = () => { + if (inputRef.current) { + setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5)); + } + }; + + const handleZoomIn = () => { + if (inputRef.current) { + setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5)); + } + }; + + const handleStartSeek = useCallback(() => { + isSeeking.current = true; + }, []); + + const handleStopSeek = useCallback(() => { + isSeeking.current = false; + if (zoomLevel === 1) { + onChangeZoom(zoomLevel, !isSeeking.current); + } + }, [onChangeZoom, zoomLevel]); + + const handleSeeklineChange = (e:React.ChangeEvent) => { + setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL))); + }; + + useEffect(() => { + onChangeZoom(zoomLevel, !isSeeking.current); + }, [zoomLevel, onChangeZoom]); + + const lang = useLang(); + + const className = buildClassName( + 'ZoomControls', + transitionClassNames, + ); + + return ( +
    + + +
    +
    +
    + +
    +
    +
    + ); +}; + +export default memo(ZoomControls); diff --git a/src/components/mediaViewer/helpers/formatFileSize.ts b/src/components/mediaViewer/helpers/formatFileSize.ts new file mode 100644 index 000000000..b353115db --- /dev/null +++ b/src/components/mediaViewer/helpers/formatFileSize.ts @@ -0,0 +1,7 @@ +const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB']; + +export default (bytes: number) => { + const number = Math.floor(Math.log(bytes) / Math.log(1024)); + + return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`; +}; diff --git a/src/components/mediaViewer/helpers/ghostAnimation.ts b/src/components/mediaViewer/helpers/ghostAnimation.ts new file mode 100644 index 000000000..fb6d7e40c --- /dev/null +++ b/src/components/mediaViewer/helpers/ghostAnimation.ts @@ -0,0 +1,330 @@ +import { ApiMessage } from '../../../api/types'; +import { MediaViewerOrigin } from '../../../types'; + +import { ANIMATION_END_DELAY } from '../../../config'; +import { getMessageContent, getPhotoFullDimensions, getVideoDimensions } from '../../../modules/helpers'; +import { + AVATAR_FULL_DIMENSIONS, + calculateDimensions, + getMediaViewerAvailableDimensions, + MEDIA_VIEWER_MEDIA_QUERY, + REM, +} from '../../common/helpers/mediaDimensions'; + +import windowSize from '../../../util/windowSize'; + +const ANIMATION_DURATION = 200; + +export function animateOpening( + hasFooter: boolean, origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage, +) { + const { mediaEl: fromImage } = getNodes(origin, message); + if (!fromImage) { + return; + } + + const { width: windowWidth } = windowSize.get(); + + let isVideo = false; + let mediaSize; + if (message) { + const { photo, video, webPage } = getMessageContent(message); + isVideo = Boolean(video); + mediaSize = video ? getVideoDimensions(video)! : getPhotoFullDimensions((photo || webPage!.photo)!)!; + } else { + mediaSize = AVATAR_FULL_DIMENSIONS; + } + + // eslint-disable-next-line max-len + const { + width: availableWidth, height: availableHeight, + } = getMediaViewerAvailableDimensions(hasFooter, isVideo); + const { width: toWidth, height: toHeight } = calculateDimensions( + availableWidth, availableHeight, mediaSize.width, mediaSize.height, + ); + const toLeft = (windowWidth - toWidth) / 2; + const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2; + + let { + top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight, + } = fromImage.getBoundingClientRect(); + + if ([ + MediaViewerOrigin.SharedMedia, + MediaViewerOrigin.Album, + MediaViewerOrigin.ScheduledAlbum, + MediaViewerOrigin.SearchResult, + ].includes(origin)) { + const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight); + fromTop = uncovered.top; + fromLeft = uncovered.left; + fromWidth = uncovered.width; + fromHeight = uncovered.height; + } + + const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2); + const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2); + const fromScaleX = fromWidth / toWidth; + const fromScaleY = fromHeight / toHeight; + + const ghost = createGhost(bestImageData || fromImage); + applyStyles(ghost, { + top: `${toTop}px`, + left: `${toLeft}px`, + width: `${toWidth}px`, + height: `${toHeight}px`, + transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`, + }); + applyShape(ghost, origin); + + document.body.classList.add('ghost-animating'); + + requestAnimationFrame(() => { + document.body.appendChild(ghost); + + requestAnimationFrame(() => { + ghost.style.transform = ''; + clearShape(ghost); + + setTimeout(() => { + requestAnimationFrame(() => { + document.body.removeChild(ghost); + document.body.classList.remove('ghost-animating'); + }); + }, ANIMATION_DURATION + ANIMATION_END_DELAY); + }); + }); +} + +export function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) { + const { container, mediaEl: toImage } = getNodes(origin, message); + if (!toImage) { + return; + } + + const fromImage = document.getElementById('MediaViewer')!.querySelector( + '.active .media-viewer-content img, .active .media-viewer-content video', + ); + if (!fromImage || !toImage) { + return; + } + + const { + top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight, + } = fromImage.getBoundingClientRect(); + const { + top: targetTop, left: toLeft, width: toWidth, height: toHeight, + } = toImage.getBoundingClientRect(); + + let toTop = targetTop; + if (!isElementInViewport(container)) { + const { height: windowHeight } = windowSize.get(); + toTop = targetTop < fromTop ? -toHeight : windowHeight; + } + + const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2); + const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2); + let fromScaleX = fromWidth / toWidth; + let fromScaleY = fromHeight / toHeight; + + const shouldFadeOut = ( + [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin) + && !isMessageImageFullyVisible(container, toImage) + ) || ( + [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin) + && !isMessageImageFullyVisible(container, toImage) + ); + + if ([ + MediaViewerOrigin.SharedMedia, + MediaViewerOrigin.Album, + MediaViewerOrigin.ScheduledAlbum, + MediaViewerOrigin.SearchResult, + ].includes(origin)) { + if (fromScaleX > fromScaleY) { + fromScaleX = fromScaleY; + } else if (fromScaleY > fromScaleX) { + fromScaleY = fromScaleX; + } + } + + const ghost = createGhost(bestImageData || toImage); + applyStyles(ghost, { + top: `${toTop}px`, + left: `${toLeft}px`, + width: `${toWidth}px`, + height: `${toHeight}px`, + transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`, + }); + + requestAnimationFrame(() => { + document.body.classList.add('ghost-animating'); + document.body.appendChild(ghost); + + requestAnimationFrame(() => { + ghost.style.transform = ''; + if (shouldFadeOut) { + ghost.style.opacity = '0'; + } + + applyShape(ghost, origin); + + setTimeout(() => { + requestAnimationFrame(() => { + document.body.removeChild(ghost); + document.body.classList.remove('ghost-animating'); + }); + }, ANIMATION_DURATION + ANIMATION_END_DELAY); + }); + }); +} + +function createGhost(source: string | HTMLImageElement | HTMLVideoElement) { + const ghost = document.createElement('div'); + ghost.classList.add('ghost'); + + const img = new Image(); + + if (typeof source === 'string') { + img.src = source; + } else if (source instanceof HTMLVideoElement) { + img.src = source.poster; + } else { + img.src = source.src; + } + + ghost.appendChild(img); + + return ghost; +} + +function uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) { + if (realWidth === realHeight) { + const size = Math.max(width, height) * (realWidth / realHeight); + left -= (size - width) / 2; + top -= (size - height) / 2; + width = size; + height = size; + } else if (realWidth > realHeight) { + const srcWidth = width; + width = height * (realWidth / realHeight); + left -= (width - srcWidth) / 2; + } else if (realHeight > realWidth) { + const srcHeight = height; + height = width * (realHeight / realWidth); + top -= (height - srcHeight) / 2; + } + + return { + top, left, width, height, + }; +} + +function isElementInViewport(el: HTMLElement) { + if (el.style.display === 'none') { + return false; + } + + const rect = el.getBoundingClientRect(); + const { height: windowHeight } = windowSize.get(); + + return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0); +} + +function isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) { + const messageListElement = document.querySelector('.active > .MessageList')!; + let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop; + if (container.id.includes('album-media-')) { + imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop; + } + + return imgOffsetTop > messageListElement.scrollTop + && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight; +} + +function getTopOffset(hasFooter: boolean) { + const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY); + let topOffsetRem = 4.125; + if (hasFooter) { + topOffsetRem += mql.matches ? 0.875 : 3.375; + } + + return topOffsetRem * REM; +} + +function applyStyles(element: HTMLElement, styles: Record) { + Object.assign(element.style, styles); +} + +function getNodes(origin: MediaViewerOrigin, message?: ApiMessage) { + let containerSelector; + let mediaSelector; + + switch (origin) { + case MediaViewerOrigin.Album: + case MediaViewerOrigin.ScheduledAlbum: + containerSelector = `.active > .MessageList #album-media-${message!.id}`; + mediaSelector = '.full-media'; + break; + + case MediaViewerOrigin.SharedMedia: + containerSelector = `#shared-media${message!.id}`; + mediaSelector = 'img'; + break; + + case MediaViewerOrigin.SearchResult: + containerSelector = `#search-media${message!.id}`; + mediaSelector = 'img'; + break; + + case MediaViewerOrigin.MiddleHeaderAvatar: + containerSelector = '.MiddleHeader .ChatInfo .Avatar'; + mediaSelector = 'img.avatar-media'; + break; + + case MediaViewerOrigin.ProfileAvatar: + containerSelector = '#RightColumn .active .profile-info .Avatar'; + mediaSelector = 'img.avatar-media'; + break; + + case MediaViewerOrigin.ScheduledInline: + case MediaViewerOrigin.Inline: + default: + containerSelector = `.active > .MessageList #message${message!.id}`; + mediaSelector = '.message-content .full-media, .message-content .thumbnail'; + } + + const container = document.querySelector(containerSelector)!; + const mediaEls = container && container.querySelectorAll(mediaSelector); + + return { + container, + mediaEl: mediaEls && mediaEls[mediaEls.length - 1], + }; +} + +function applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) { + switch (origin) { + case MediaViewerOrigin.Album: + case MediaViewerOrigin.ScheduledAlbum: + case MediaViewerOrigin.Inline: + case MediaViewerOrigin.ScheduledInline: + ghost.classList.add('rounded-corners'); + break; + + case MediaViewerOrigin.SharedMedia: + case MediaViewerOrigin.SearchResult: + (ghost.firstChild as HTMLElement).style.objectFit = 'cover'; + break; + + case MediaViewerOrigin.MiddleHeaderAvatar: + case MediaViewerOrigin.ProfileAvatar: + ghost.classList.add('circle'); + break; + } +} + +function clearShape(ghost: HTMLDivElement) { + (ghost.firstChild as HTMLElement).style.objectFit = 'default'; + ghost.classList.remove('rounded-corners', 'circle'); +} diff --git a/src/components/middle/ActionMessage.tsx b/src/components/middle/ActionMessage.tsx new file mode 100644 index 000000000..e91264339 --- /dev/null +++ b/src/components/middle/ActionMessage.tsx @@ -0,0 +1,135 @@ +import React, { FC, memo, useRef } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiUser, ApiMessage, ApiChat } from '../../api/types'; +import { FocusDirection } from '../../types'; + +import { + selectUser, + selectChatMessage, + selectIsMessageFocused, + selectChat, +} from '../../modules/selectors'; +import { isChatChannel } from '../../modules/helpers'; +import buildClassName from '../../util/buildClassName'; +import renderText from '../common/helpers/renderText'; +import { renderActionMessageText } from '../common/helpers/renderActionMessageText'; +import useEnsureMessage from '../../hooks/useEnsureMessage'; +import useContextMenuHandlers from '../../hooks/useContextMenuHandlers'; +import { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver'; +import useFocusMessage from './message/hooks/useFocusMessage'; +import useLang from '../../hooks/useLang'; + +import ContextMenuContainer from './message/ContextMenuContainer.async'; + +type OwnProps = { + message: ApiMessage; + observeIntersection?: ObserveFn; + isEmbedded?: boolean; +}; + +type StateProps = { + sender?: ApiUser | ApiChat; + targetUser?: ApiUser; + targetMessage?: ApiMessage; + targetChatId?: number; + isFocused: boolean; + focusDirection?: FocusDirection; + noFocusHighlight?: boolean; +}; + +const ActionMessage: FC = ({ + message, + observeIntersection, + isEmbedded, + sender, + targetUser, + targetMessage, + targetChatId, + isFocused, + focusDirection, + noFocusHighlight, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + useOnIntersect(ref, observeIntersection); + useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage); + useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight); + + useLang(); + + const content = renderActionMessageText( + message, + sender, + targetUser, + targetMessage, + targetChatId, + isEmbedded ? { isEmbedded: true, asPlain: true } : undefined, + ); + const { + isContextMenuOpen, contextMenuPosition, + handleBeforeContextMenu, handleContextMenu, + handleContextMenuClose, handleContextMenuHide, + } = useContextMenuHandlers(ref); + const isContextMenuShown = contextMenuPosition !== undefined; + + if (isEmbedded) { + return {renderText(content as string)}; + } + + return ( +
    + {content} + {contextMenuPosition && ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { message }): StateProps => { + const userId = message.senderId; + const { targetUserId, targetChatId } = message.content.action || {}; + const targetMessageId = message.replyToMessageId; + const targetMessage = targetMessageId + ? selectChatMessage(global, message.chatId, targetMessageId) + : undefined; + + const isFocused = selectIsMessageFocused(global, message); + const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {}; + + const chat = selectChat(global, message.chatId); + const sender = chat && (isChatChannel(chat) || userId === message.chatId) + ? chat + : userId ? selectUser(global, userId) : undefined; + + return { + sender, + ...(targetUserId && { targetUser: selectUser(global, targetUserId) }), + targetChatId, + targetMessage, + isFocused, + ...(isFocused && { focusDirection, noFocusHighlight }), + }; + }, +)(ActionMessage)); diff --git a/src/components/middle/AudioPlayer.scss b/src/components/middle/AudioPlayer.scss new file mode 100644 index 000000000..2fa30ca6b --- /dev/null +++ b/src/components/middle/AudioPlayer.scss @@ -0,0 +1,106 @@ +.AudioPlayer { + display: flex; + margin-left: auto; + margin-top: -.25rem; + margin-bottom: -.25rem; + + body.animation-level-0 & { + transition: none !important; + } + + > .Button { + flex-shrink: 0; + margin: .125rem; + } + + > .toggle-play { + --color-text-secondary: var(--color-primary); + --color-text-secondary-rgb: var(--color-primary-shade-rgb); + --color-primary-shade: var(--color-green); + --color-white: var(--color-background-own); + } + + .MiddleHeader & + .HeaderActions { + margin-left: 1.5rem; + } + + .toggle-play { + &.smaller { + width: 3rem; + height: 3rem; + + i { + font-size: 1.625rem; + margin-top: -.025rem; + } + } + + i { + position: absolute; + font-size: 1.9375rem; + margin-top: -.05rem; + + &.icon-play { + margin-left: .1rem; + } + } + + .icon-play, .icon-pause { + opacity: 1; + transform: scale(1); + transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1); + } + + &.play .icon-pause, + &.pause .icon-play, + &.loading .icon-play, + &.loading .icon-pause { + opacity: 0; + transform: scale(.5); + } + } + + &-content { + display: flex; + justify-content: center; + flex-direction: column; + flex-shrink: 1; + padding: .25rem .5rem; + position: relative; + overflow: hidden; + cursor: pointer; + max-width: 15rem; + border-radius: var(--border-radius-messages-small); + + &:hover { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + } + + @media (min-width: 1440px) and (max-width: 1500px) { + max-width: 14rem; + } + + .AudioPlayer & .title { + display: block; + font-weight: 500; + font-size: 0.875rem !important; + line-height: 1rem; + height: 1rem; + margin-bottom: 0.125rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .subtitle { + font-size: 0.85rem !important; + color: var(--color-text-secondary); + line-height: 1.125rem; + height: 1.125rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + } + } +} diff --git a/src/components/middle/AudioPlayer.tsx b/src/components/middle/AudioPlayer.tsx new file mode 100644 index 000000000..cd4360a9c --- /dev/null +++ b/src/components/middle/AudioPlayer.tsx @@ -0,0 +1,122 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiAudio, ApiMessage } from '../../api/types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import * as mediaLoader from '../../util/mediaLoader'; +import { + getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle, +} from '../../modules/helpers'; +import { selectSender } from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import renderText from '../common/helpers/renderText'; +import useAudioPlayer from '../../hooks/useAudioPlayer'; +import buildClassName from '../../util/buildClassName'; +import useLang from '../../hooks/useLang'; + +import RippleEffect from '../ui/RippleEffect'; +import Button from '../ui/Button'; + +import './AudioPlayer.scss'; + +type OwnProps = { + message: ApiMessage; + className?: string; +}; + +type StateProps = { + senderName?: string; +}; + +type DispatchProps = Pick; + +const AudioPlayer: FC = ({ + message, className, senderName, focusMessage, closeAudioPlayer, +}) => { + const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined); + const { playPause, isPlaying } = useAudioPlayer( + getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true, + ); + + const handleClick = useCallback(() => { + focusMessage({ chatId: message.chatId, messageId: message.id }); + }, [focusMessage, message.chatId, message.id]); + + const handleClose = useCallback(() => { + if (isPlaying) { + playPause(); + } + closeAudioPlayer(); + }, [closeAudioPlayer, isPlaying, playPause]); + + const lang = useLang(); + + const audio = getMessageAudio(message); + + return ( +
    + + +
    + {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)} + +
    + + +
    + ); +}; + +function renderAudio(audio: ApiAudio) { + const { title, performer, fileName } = audio; + + return ( + <> +
    {renderText(title || fileName)}
    + {performer && ( +
    {renderText(performer)}
    + )} + + ); +} + +function renderVoice(subtitle: string, senderName?: string) { + return ( + <> +
    {senderName && renderText(senderName)}
    +
    {subtitle}
    + + ); +} + +export default withGlobal( + (global, { message }) => { + const sender = selectSender(global, message); + const senderName = sender ? getSenderTitle(sender) : undefined; + + return { senderName }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']), +)(AudioPlayer); diff --git a/src/components/middle/DeleteSelectedMessagesModal.tsx b/src/components/middle/DeleteSelectedMessagesModal.tsx new file mode 100644 index 000000000..12ee8bac0 --- /dev/null +++ b/src/components/middle/DeleteSelectedMessagesModal.tsx @@ -0,0 +1,129 @@ +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; + +import { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors'; +import { + isChatPrivate, + getUserFirstName, + getPrivateChatUserId, + isChatBasicGroup, + isChatSuperGroup, +} from '../../modules/helpers'; +import renderText from '../common/helpers/renderText'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +export type OwnProps = { + isOpen: boolean; + isSchedule: boolean; + onClose: () => void; +}; + +type StateProps = { + selectedMessageIds?: number[]; + canDeleteForAll?: boolean; + contactFirstName?: string; + willDeleteForCurrentUserOnly?: boolean; + willDeleteForAll?: boolean; +}; + +type DispatchProps = Pick; + +const DeleteSelectedMessagesModal: FC = ({ + isOpen, + isSchedule, + selectedMessageIds, + canDeleteForAll, + contactFirstName, + willDeleteForCurrentUserOnly, + willDeleteForAll, + onClose, + deleteMessages, + deleteScheduledMessages, + exitMessageSelectMode, +}) => { + const handleDeleteMessageForAll = useCallback(() => { + deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true }); + exitMessageSelectMode(); + onClose(); + }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]); + + const handleDeleteMessageForSelf = useCallback(() => { + if (isSchedule) { + deleteScheduledMessages({ messageIds: selectedMessageIds }); + } else { + deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false }); + } + + exitMessageSelectMode(); + onClose(); + }, [ + isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages, + ]); + + const lang = useLang(); + + if (!selectedMessageIds) { + return undefined; + } + + return ( + +

    {lang('AreYouSureDeleteFewMessages')}

    + {willDeleteForCurrentUserOnly && ( +

    This will delete them just for you, not for other participants in the chat.

    + )} + {willDeleteForAll && ( +

    This will delete them for everyone in this chat.

    + )} + {canDeleteForAll && ( + + )} + + +
    + ); +}; + +export default memo(withGlobal( + (global, { isSchedule }): StateProps => { + const { messageIds: selectedMessageIds } = global.selectedMessages || {}; + const { canDeleteForAll } = selectCanDeleteSelectedMessages(global); + const chat = selectCurrentChat(global); + const contactFirstName = chat && isChatPrivate(chat.id) + ? getUserFirstName(selectUser(global, getPrivateChatUserId(chat)!)) + : undefined; + + const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll; + const willDeleteForAll = chat && isChatSuperGroup(chat); + + return { + selectedMessageIds, + canDeleteForAll: !isSchedule && canDeleteForAll, + contactFirstName, + willDeleteForCurrentUserOnly, + willDeleteForAll, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'deleteMessages', + 'deleteScheduledMessages', + 'exitMessageSelectMode', + ]), +)(DeleteSelectedMessagesModal)); diff --git a/src/components/middle/HeaderActions.tsx b/src/components/middle/HeaderActions.tsx new file mode 100644 index 000000000..72e13c303 --- /dev/null +++ b/src/components/middle/HeaderActions.tsx @@ -0,0 +1,238 @@ +import React, { + FC, + memo, + useRef, + useCallback, + useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions, MessageListType } from '../../global/types'; +import { MAIN_THREAD_ID } from '../../api/types'; +import { IAnchorPosition } from '../../types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { pick } from '../../util/iteratees'; +import { isChatChannel, isChatSuperGroup } from '../../modules/helpers'; +import { + selectChat, + selectIsChatBotNotStarted, selectIsChatWithSelf, + selectIsInSelectMode, + selectIsRightColumnShown, +} from '../../modules/selectors'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import HeaderMenuContainer from './HeaderMenuContainer.async'; + +interface OwnProps { + chatId: number; + threadId: number; + messageListType: MessageListType; +} + +interface StateProps { + noMenu?: boolean; + isChannel?: boolean; + isRightColumnShown?: boolean; + canStartBot?: boolean; + canSubscribe?: boolean; + canSearch?: boolean; + canMute?: boolean; + canSelect?: boolean; + canSeeStatistics?: boolean; + canLeave?: boolean; +} + +type DispatchProps = Pick; + +// Chrome breaks layout when focusing input during transition +const SEARCH_FOCUS_DELAY_MS = 400; + +const HeaderActions: FC = ({ + chatId, + threadId, + noMenu, + isChannel, + canStartBot, + canSubscribe, + canSearch, + canMute, + canSelect, + canSeeStatistics, + canLeave, + isRightColumnShown, + joinChannel, + sendBotCommand, + openLocalTextSearch, +}) => { + // eslint-disable-next-line no-null/no-null + const menuButtonRef = useRef(null); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [menuPosition, setMenuPosition] = useState(undefined); + + const handleHeaderMenuOpen = useCallback(() => { + setIsMenuOpen(true); + const rect = menuButtonRef.current!.getBoundingClientRect(); + setMenuPosition({ x: rect.right, y: rect.bottom }); + }, []); + + const handleHeaderMenuClose = useCallback(() => { + setIsMenuOpen(false); + }, []); + + const handleHeaderMenuHide = useCallback(() => { + setMenuPosition(undefined); + }, []); + + const handleSubscribeClick = useCallback(() => { + joinChannel({ chatId }); + }, [joinChannel, chatId]); + + const handleStartBot = useCallback(() => { + sendBotCommand({ command: '/start' }); + }, [sendBotCommand]); + + const handleSearchClick = useCallback(() => { + openLocalTextSearch(); + + if (IS_MOBILE_SCREEN) { + // iOS requires synchronous focus on user event. + const searchInput = document.querySelector('#MobileSearch input')!; + searchInput.focus(); + } else { + setTimeout(() => { + const searchInput = document.querySelector('.RightHeader .SearchInput input'); + if (searchInput) { + searchInput.focus(); + } + }, SEARCH_FOCUS_DELAY_MS); + } + }, [openLocalTextSearch]); + + const lang = useLang(); + + return ( +
    + {!IS_MOBILE_SCREEN && canSubscribe && ( + + )} + {!IS_MOBILE_SCREEN && canStartBot && ( + + )} + {!IS_MOBILE_SCREEN && canSearch && ( + + )} + {(IS_MOBILE_SCREEN || !canSubscribe) && ( + + )} + {menuPosition && ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId, threadId, messageListType }): StateProps => { + const chat = selectChat(global, chatId); + const isChannel = Boolean(chat && isChatChannel(chat)); + + if (chat && chat.isRestricted) { + return { + noMenu: true, + }; + } + + const isChatWithSelf = selectIsChatWithSelf(global, chatId); + const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID; + const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID; + const isRightColumnShown = selectIsRightColumnShown(global); + + const canStartBot = Boolean(selectIsChatBotNotStarted(global, chatId)); + const canSubscribe = Boolean( + isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined, + ); + const canSearch = isMainThread || isDiscussionThread; + const canMute = isMainThread && !isChatWithSelf && !canSubscribe; + const canSelect = !selectIsInSelectMode(global); + const canSeeStatistics = isMainThread; + const canLeave = isMainThread && !canSubscribe; + + const noMenu = !( + (IS_MOBILE_SCREEN && canSubscribe) + || (IS_MOBILE_SCREEN && canSearch) + || canMute + || canSelect + || canSeeStatistics + || canLeave + ); + + return { + noMenu, + isChannel, + isRightColumnShown, + canStartBot, + canSubscribe, + canSearch, + canMute, + canSelect, + canSeeStatistics, + canLeave, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'joinChannel', 'sendBotCommand', 'openLocalTextSearch', + ]), +)(HeaderActions)); diff --git a/src/components/middle/HeaderMenuContainer.async.tsx b/src/components/middle/HeaderMenuContainer.async.tsx new file mode 100644 index 000000000..2017d175a --- /dev/null +++ b/src/components/middle/HeaderMenuContainer.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './HeaderMenuContainer'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const HeaderMenuContainerAsync: FC = (props) => { + const { isOpen } = props; + const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return HeaderMenuContainer ? : undefined; +}; + +export default HeaderMenuContainerAsync; diff --git a/src/components/middle/HeaderMenuContainer.scss b/src/components/middle/HeaderMenuContainer.scss new file mode 100644 index 000000000..28fde774f --- /dev/null +++ b/src/components/middle/HeaderMenuContainer.scss @@ -0,0 +1,22 @@ +.HeaderMenuContainer { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 100vh; + z-index: var(--z-header-menu); + + .Menu { + position: absolute; + font-size: 1rem; + + .backdrop { + z-index: var(--z-header-menu-backdrop); + } + + .bubble { + z-index: var(--z-header-menu); + --offset-y: calc(100% + 1rem); + } + } +} diff --git a/src/components/middle/HeaderMenuContainer.tsx b/src/components/middle/HeaderMenuContainer.tsx new file mode 100644 index 000000000..2350383ad --- /dev/null +++ b/src/components/middle/HeaderMenuContainer.tsx @@ -0,0 +1,219 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiChat } from '../../api/types'; +import { IAnchorPosition } from '../../types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { disableScrolling, enableScrolling } from '../../util/scrollLock'; +import { selectChat } from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import { isChatPrivate, getCanDeleteChat } from '../../modules/helpers'; +import useShowTransition from '../../hooks/useShowTransition'; +import useLang from '../../hooks/useLang'; + +import Portal from '../ui/Portal'; +import Menu from '../ui/Menu'; +import MenuItem from '../ui/MenuItem'; +import DeleteChatModal from '../common/DeleteChatModal'; + +import './HeaderMenuContainer.scss'; + +type DispatchProps = Pick; + +export type OwnProps = { + chatId: number; + threadId: number; + isOpen: boolean; + anchor: IAnchorPosition; + isChannel?: boolean; + canSubscribe?: boolean; + canSearch?: boolean; + canMute?: boolean; + canSelect?: boolean; + canSeeStatistics?: boolean; + canLeave?: boolean; + onSubscribeChannel: () => void; + onSearchClick: () => void; + onClose: () => void; + onCloseAnimationEnd: () => void; +}; + +type StateProps = { + chat?: ApiChat; + isPrivate?: boolean; + isMuted?: boolean; + canDeleteChat?: boolean; +}; + +const HeaderMenuContainer: FC = ({ + chatId, + isOpen, + anchor, + isChannel, + canSubscribe, + canSearch, + canMute, + canSelect, + canSeeStatistics, + canLeave, + chat, + isPrivate, + isMuted, + canDeleteChat, + onSubscribeChannel, + onSearchClick, + onClose, + onCloseAnimationEnd, + updateChatMutedState, + toggleStatistics, + enterMessageSelectMode, +}) => { + const [isMenuOpen, setIsMenuOpen] = useState(true); + const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); + const { x, y } = anchor; + + useShowTransition(isOpen, onCloseAnimationEnd, undefined, false); + + const handleDelete = useCallback(() => { + setIsMenuOpen(false); + setIsDeleteModalOpen(true); + }, []); + + const closeMenu = useCallback(() => { + setIsMenuOpen(false); + onClose(); + }, [onClose]); + + const closeDeleteModal = useCallback(() => { + setIsDeleteModalOpen(false); + onClose(); + }, [onClose]); + + const handleToggleMuteClick = useCallback(() => { + updateChatMutedState({ chatId, isMuted: !isMuted }); + closeMenu(); + }, [chatId, closeMenu, isMuted, updateChatMutedState]); + + const handleSubscribe = useCallback(() => { + onSubscribeChannel(); + closeMenu(); + }, [closeMenu, onSubscribeChannel]); + + const handleSearch = useCallback(() => { + onSearchClick(); + closeMenu(); + }, [closeMenu, onSearchClick]); + + const handleStatistics = useCallback(() => { + toggleStatistics(); + closeMenu(); + }, [closeMenu, toggleStatistics]); + + const handleSelectMessages = useCallback(() => { + enterMessageSelectMode(); + closeMenu(); + }, [closeMenu, enterMessageSelectMode]); + + useEffect(() => { + disableScrolling(); + + return enableScrolling; + }, []); + + const lang = useLang(); + + return ( + +
    + + {IS_MOBILE_SCREEN && canSubscribe && ( + + {lang(isChannel ? 'Subscribe' : 'Join Group')} + + )} + {IS_MOBILE_SCREEN && canSearch && ( + + {lang('Search')} + + )} + {canMute && ( + + {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')} + + )} + {canSelect && ( + + {lang('ReportSelectMessages')} + + )} + {canSeeStatistics && ( + + {lang('Statistics')} + + )} + {canLeave && ( + + {lang(isPrivate ? 'Delete' : (canDeleteChat ? 'Delete and Leave' : 'Leave'))} + + )} + + {chat && ( + + )} +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + if (!chat || chat.isRestricted) { + return {}; + } + + return { + chat, + isMuted: chat.isMuted, + isPrivate: isChatPrivate(chat.id), + canDeleteChat: getCanDeleteChat(chat), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'updateChatMutedState', + 'toggleStatistics', + 'enterMessageSelectMode', + ]), +)(HeaderMenuContainer)); diff --git a/src/components/middle/HeaderPinnedMessage.tsx b/src/components/middle/HeaderPinnedMessage.tsx new file mode 100644 index 000000000..5f9cdba8e --- /dev/null +++ b/src/components/middle/HeaderPinnedMessage.tsx @@ -0,0 +1,110 @@ +import React, { FC, memo, useCallback } from '../../lib/teact/teact'; + +import { ApiMessage } from '../../api/types'; + +import { getPictogramDimensions } from '../common/helpers/mediaDimensions'; +import { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers'; +import renderText from '../common/helpers/renderText'; +import useMedia from '../../hooks/useMedia'; +import useWebpThumbnail from '../../hooks/useWebpThumbnail'; + +import ConfirmDialog from '../ui/ConfirmDialog'; +import Button from '../ui/Button'; +import RippleEffect from '../ui/RippleEffect'; +import buildClassName from '../../util/buildClassName'; +import useFlag from '../../hooks/useFlag'; +import useLang from '../../hooks/useLang'; + +import PinnedMessageNavigation from './PinnedMessageNavigation'; + +type OwnProps = { + message: ApiMessage; + index: number; + count: number; + customTitle?: string; + className?: string; + onUnpinMessage?: (id: number) => void; + onClick?: () => void; + onAllPinnedClick?: () => void; +}; + +const HeaderPinnedMessage: FC = ({ + message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick, +}) => { + const mediaThumbnail = useWebpThumbnail(message); + const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram')); + + const text = getMessageSummaryText(message, Boolean(mediaThumbnail)); + const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag(); + + const handleUnpinMessage = useCallback(() => { + closeUnpinDialog(); + + if (onUnpinMessage) { + onUnpinMessage(message.id); + } + }, [closeUnpinDialog, onUnpinMessage, message.id]); + + const lang = useLang(); + + return ( +
    + {count > 1 && ( + + )} + {onUnpinMessage && ( + + )} + +
    + + {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)} +
    +
    + {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`} +
    +

    {renderText(text)}

    +
    + + +
    +
    + ); +}; + +function renderPictogram(thumbDataUri: string, blobUrl?: string) { + const { width, height } = getPictogramDimensions(); + + return ( + + ); +} + +export default memo(HeaderPinnedMessage); diff --git a/src/components/middle/MessageList.scss b/src/components/middle/MessageList.scss new file mode 100644 index 000000000..0b7d3868a --- /dev/null +++ b/src/components/middle/MessageList.scss @@ -0,0 +1,278 @@ +.MessageList { + flex: 1; + width: 100%; + overflow-anchor: none; + overflow: scroll; + overflow-x: hidden; + overflow-y: overlay; + + body.hide-mask-shadow .mask-image-disabled &, + .mask-image-enabled & { + mask-image: linear-gradient(to top, transparent 0, #000 1rem); + } + + .custom-bg-image.mask-image-disabled & { + margin-bottom: .3rem; + } + + @media (pointer: coarse) { + -webkit-user-select: none; + -webkit-touch-callout: none; + user-select: none; + touch-callout: none; + } + + &.no-avatars .Message > .Avatar { + display: none; + } + + .messages-container { + width: 100%; + max-width: var(--messages-container-width); + min-height: 100%; + margin: 0 auto; + display: flex; + justify-content: flex-end; + flex-direction: column; + padding: 1rem 1rem .5rem 1.125rem; + + .force-messages-scroll & { + margin-top: 100vh !important; + } + + @media (max-width: 600px) { + width: 100vw; + padding: 2.75rem 0.5rem 0.5rem; + // Patch for an issue on Android when rotating device + margin: 0; + } + } + + &.bottom-padding { + .messages-container { + padding-bottom: 1rem; + } + + &-big { + .messages-container { + padding-bottom: 4.75rem; + + @media (max-width: 600px) { + padding-bottom: 3.5rem; + } + } + } + } + + &.select-mode-active { + .messages-container { + padding-bottom: 5.25rem; + } + } + + .Message, + .ActionMessage { + position: relative; + + &::before { + content: ""; + position: absolute; + top: -0.3125rem; + bottom: -0.3125rem; + left: -50vw; + right: -50vw; + background: black; + z-index: -1; + + opacity: 0; + transition: opacity var(--select-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + + &:not(.last-in-group) { + &::before { + bottom: -0.1875rem; + } + } + + &:not(.first-in-group) { + &::before { + top: -0.1875rem; + } + } + + &.focused::before { + // @optimization + transition: none !important; + } + + &.focused, + &.is-forwarding, + &.is-selected, + &.has-menu-open { + &::before { + opacity: 0.1; + } + } + } + + > .empty { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + + .sticky-date, + .local-action-message, + .ActionMessage, + .empty { + text-align: center; + + > span { + display: inline-block; + background: rgba(var(--color-text-secondary-rgb), 0.45); + color: white; + font-size: 0.9375rem; + font-weight: 500; + line-height: 1.5rem; + padding: 0 .5rem; + border-radius: 0.75rem; + word-break: break-word; + } + + &.rich { + > span { + max-width: 80%; + text-align: left; + } + + a { + &, &:visited { + color: var(--color-links-darker) !important; + } + + &:hover, &:active { + color: var(--color-links-darker-hover) !important; + } + } + } + } + + .sticky-date { + margin-top: 1rem; + margin-bottom: 1rem; + z-index: var(--z-sticky-date); + pointer-events: none; + opacity: 1; + transition: opacity .3s ease; + + body:not(.is-scrolling-messages) &.stuck { + opacity: 0; + } + + body.animation-level-0 & { + transition: none; + } + } + + &.scrolled .sticky-date { + position: sticky; + top: 0.625rem; + } + + .has-header-tools & .sticky-date { + top: 3.75rem; + } + + .local-action-message, + .ActionMessage { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + } + + .ActionMessage { + .action-link { + cursor: pointer; + + &:hover { + text-decoration: underline; + } + } + } + + .sticky-date + .ActionMessage { + margin-top: -0.5rem; + } + + @media (min-width: 1276px) { + width: 100%; + transform: translate3d(0, 0, 0); + transition: transform var(--layer-transition); + + .messages-container { + width: calc(100% - var(--right-column-width)); + } + + body.animation-level-0 & { + transition: none; + } + + #Main.right-column-open & { + transform: translate3d(calc(var(--right-column-width) / -2), 0, 0); + } + + body:not(.animating-right-column) #Main.right-column-open &.select-mode-active, + #Main.right-column-open &:not(.select-mode-active), + body.animating-right-column &:not(.select-mode-active) { + width: calc(100% - var(--right-column-width)); + + .messages-container { + width: 100%; + } + } + } + + @media (max-width: 600px) { + transition: transform var(--layer-transition); + + body.enable-symbol-menu-transforms & { + transform: translate3d(0, 0, 0); + } + + body.is-symbol-menu-open & { + transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0); + } + } + + &.select-mode-active, + &.has-focusing, + body.has-context-menu &, + .animating > div > & { + /* + We need to remove the width of the scrollbar for the full-width selection and + compensate for it with a right padding + */ + &::-webkit-scrollbar { + width: 0; + } + + padding-right: 0; + + /* Styles for Firefox */ + @supports (scrollbar-width: none) { + padding-right: .6875rem; + scrollbar-width: none; + } + } + + .is-safari &.select-mode-active, + .is-safari &.has-focusing, + .is-safari.has-context-menu .messages-layout > & { + padding-right: .375rem; + } +} diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx new file mode 100644 index 000000000..0769a8723 --- /dev/null +++ b/src/components/middle/MessageList.tsx @@ -0,0 +1,768 @@ +import React, { + FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, +} from '../../lib/teact/teact'; +import { getGlobal, withGlobal } from '../../lib/teact/teactn'; + +import { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types'; +import { GlobalActions, MessageListType } from '../../global/types'; +import { LoadMoreDirection } from '../../types'; + +import { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE, SCHEDULED_WHEN_ONLINE } from '../../config'; +import { IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN } from '../../util/environment'; +import { + selectChatMessages, + selectIsViewportNewest, + selectFirstUnreadId, + selectFocusedMessageId, + selectChat, + selectIsInSelectMode, + selectIsChatWithSelf, + selectChatBot, + selectIsChatBotNotStarted, + selectScrollOffset, + selectThreadTopMessageId, + selectFirstMessageId, + selectScheduledMessages, selectCurrentMessageIds, +} from '../../modules/selectors'; +import { + getMessageOriginalId, + isActionMessage, + isChatChannel, + isChatPrivate, + isOwnMessage, + getCanPostInChat, +} from '../../modules/helpers'; +import { + compact, + flatten, + orderBy, + pick, +} from '../../util/iteratees'; +import { + fastRaf, debounce, throttleWithTickEnd, +} from '../../util/schedulers'; +import { formatHumanDate } from '../../util/dateFormat'; +import useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps'; +import buildClassName from '../../util/buildClassName'; +import { groupMessages, MessageDateGroup, isAlbum } from './helpers/groupMessages'; +import { ObserveFn, useIntersectionObserver } from '../../hooks/useIntersectionObserver'; +import useOnChange from '../../hooks/useOnChange'; +import useStickyDates from './hooks/useStickyDates'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; +import resetScroll from '../../util/resetScroll'; +import fastSmoothScroll from '../../util/fastSmoothScroll'; +import renderText from '../common/helpers/renderText'; +import useLang, { LangFn } from '../../hooks/useLang'; + +import Loading from '../ui/Loading'; +import MessageScroll from './MessageScroll'; +import Message from './message/Message'; +import ActionMessage from './ActionMessage'; + +import './MessageList.scss'; + +type OwnProps = { + chatId: number; + threadId: number; + type: MessageListType; + onFabToggle: (show: boolean) => void; + hasTools?: boolean; + bottomOffset: 'none' | 'small' | 'big'; +}; + +type StateProps = { + isChatLoaded?: boolean; + isChannelChat?: boolean; + canPost?: boolean; + isChatWithSelf?: boolean; + messageIds?: number[]; + messagesById?: Record; + firstUnreadId?: number; + isViewportNewest?: boolean; + isRestricted?: boolean; + restrictionReason?: ApiRestrictionReason; + focusingId?: number; + isSelectModeActive?: boolean; + animationLevel?: number; + lastMessage?: ApiMessage; + botDescription?: string; + threadTopMessageId?: number; + threadFirstMessageId?: number; + hasLinkedChat?: boolean; +}; + +type DispatchProps = Pick; + +const BOTTOM_THRESHOLD = 100; +const UNREAD_DIVIDER_TOP = 10; +const UNREAD_DIVIDER_TOP_WITH_TOOLS = 60; +const SCROLL_DEBOUNCE = 200; +const INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350; +const INTERSECTION_MARGIN_FOR_MEDIA = IS_MOBILE_SCREEN ? 300 : 500; +const FOCUSING_DURATION = 1000; +const BOTTOM_FOCUS_MARGIN = 20; +const SELECT_MODE_ANIMATION_DURATION = 200; +const FOCUSING_FADE_ANIMATION_DURATION = 200; +const UNREAD_DIVIDER_CLASS = 'unread-divider'; + +const runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false); +const runThrottledOnTickEnd = throttleWithTickEnd((cb) => cb()); + +const MessageList: FC = ({ + chatId, + threadId, + type, + hasTools, + onFabToggle, + isChatLoaded, + isChannelChat, + canPost, + bottomOffset, + isChatWithSelf, + messageIds, + messagesById, + firstUnreadId, + isViewportNewest, + threadFirstMessageId, + isRestricted, + restrictionReason, + focusingId, + isSelectModeActive, + animationLevel, + loadViewportMessages, + markMessageListRead, + markMessagesRead, + setScrollOffset, + lastMessage, + botDescription, + threadTopMessageId, + hasLinkedChat, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const scrollOffsetRef = useRef(); + const anchorIdRef = useRef(); + const anchorTopRef = useRef(); + const listItemElementsRef = useRef(); + // Updated when opening chat (to preserve divider even after messages are read) + const memoUnreadDividerBeforeIdRef = useRef(); + // Updated every time (to be used from intersection callback closure) + const memoFirstUnreadIdRef = useRef(); + const memoFocusingIdRef = useRef(); + const isScrollTopJustUpdatedRef = useRef(false); + + const [containerHeight, setContainerHeight] = useState(); + const [hasFocusing, setHasFocusing] = useState(Boolean(focusingId)); + + useOnChange(() => { + anchorIdRef.current = undefined; + + memoUnreadDividerBeforeIdRef.current = firstUnreadId; + + // We update local cached `scrollOffsetRef` when opening chat. + // Then we update global version every second on scrolling. + scrollOffsetRef.current = (type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0; + }, [Boolean(messageIds)]); + + useOnChange(() => { + memoFirstUnreadIdRef.current = firstUnreadId; + }, [firstUnreadId]); + + const { + observe: observeIntersectionForMedia, freeze: freezeForMedia, unfreeze: unfreezeForMedia, + } = useIntersectionObserver({ + rootRef: containerRef, + throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA, + margin: INTERSECTION_MARGIN_FOR_MEDIA, + }); + + const { + observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading, + } = useIntersectionObserver({ + rootRef: containerRef, + }, (entries) => { + if (type !== 'thread') { + return; + } + + let maxId = 0; + const mentionIds: number[] = []; + + entries.forEach((entry) => { + const { isIntersecting, target } = entry; + + if (!isIntersecting) { + return; + } + + const { dataset } = target as HTMLDivElement; + + const messageId = Number(dataset.lastMessageId || dataset.messageId); + if (messageId > maxId) { + maxId = messageId; + } + + if (dataset.hasUnreadMention) { + mentionIds.push(messageId); + } + }); + + if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) { + markMessageListRead({ maxId }); + } + + if (mentionIds.length) { + markMessagesRead({ messageIds: mentionIds }); + } + }); + + useOnChange(() => { + memoFocusingIdRef.current = focusingId; + + if (focusingId) { + freezeForMedia(); + freezeForReading(); + } else { + unfreezeForReading(); + unfreezeForMedia(); + } + }, [focusingId]); + + const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({ + rootRef: containerRef, + throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA, + }); + + useEffect(() => { + if (focusingId) { + setHasFocusing(true); + } else { + setTimeout(() => { + setHasFocusing(false); + }, FOCUSING_FADE_ANIMATION_DURATION); + } + }, [focusingId]); + + const messageGroups = useMemo(() => { + if (!messageIds || !messagesById) { + return undefined; + } + + const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0]) + ? [threadTopMessageId, ...messageIds] + : messageIds; + + if (!viewportIds.length) { + return undefined; + } + + const listedMessages = viewportIds.map((id) => messagesById[id]); + return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current); + }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]); + + const [loadMoreBackwards, loadMoreForwards, loadMoreAround] = useMemo( + () => (type === 'thread' ? [ + debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false), + debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false), + debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false), + ] : []), + // eslint-disable-next-line react-hooks/exhaustive-deps + [loadViewportMessages, messageIds], + ); + + const { isScrolled, updateStickyDates } = useStickyDates(); + + const handleScroll = useCallback(() => { + if (isScrollTopJustUpdatedRef.current) { + isScrollTopJustUpdatedRef.current = false; + return; + } + + const container = containerRef.current!; + + updateStickyDates(container, hasTools); + + runDebouncedForScroll(() => { + fastRaf(() => { + if (!container.parentElement) { + return; + } + + scrollOffsetRef.current = container.scrollHeight - container.scrollTop; + + if (type === 'thread') { + setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current }); + } + }); + }); + }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]); + + // Container resize observer (caused by Composer reply/webpage panels) + useEffect(() => { + if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') { + return undefined; + } + + const observer = new ResizeObserver(([entry]) => { + // During animation + if (!(entry.target as HTMLDivElement).offsetParent) { + return; + } + + setContainerHeight(entry.contentRect.height); + }); + + observer.observe(containerRef.current!); + + return () => { + observer.disconnect(); + }; + }, []); + + // Workaround for an iOS bug when animated stickers sometimes disappear + useLayoutEffect(() => { + if (!IS_IOS) { + return; + } + + runThrottledOnTickEnd(() => { + if (!(containerRef.current as HTMLDivElement).querySelector('.AnimatedSticker.is-playing')) { + return; + } + + const style = (containerRef.current as HTMLDivElement).style as any; + style.webkitOverflowScrolling = style.webkitOverflowScrolling === 'auto' ? '' : 'auto'; + }); + }); + + // Initial message loading + useEffect(() => { + if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) { + return; + } + + const container = containerRef.current!; + + if (!messageIds || ( + messageIds.length < MESSAGE_LIST_SLICE / 2 + && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight + )) { + loadMoreAround(); + } + }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]); + + // Handles updated message list, takes care of scroll repositioning + useLayoutEffectWithPrevDeps(([ + prevMessageIds, prevIsViewportNewest, prevContainerHeight, + ]: [ + typeof messageIds, typeof isViewportNewest, typeof containerHeight + ]) => { + const container = containerRef.current!; + listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item')); + + // During animation + if (!container.offsetParent) { + return; + } + + // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement` + // is a Transition slide and its CSS class can not be reset in a declarative way. + const shouldForceScroll = ( + isViewportNewest + && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2) + && !container.parentElement!.classList.contains('force-messages-scroll') + && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2 + ); + + if (shouldForceScroll) { + container.parentElement!.classList.add('force-messages-scroll'); + + setTimeout(() => { + if (container.parentElement) { + container.parentElement.classList.remove('force-messages-scroll'); + } + }, FOCUSING_DURATION); + } + + const { scrollTop, scrollHeight, offsetHeight } = container; + const scrollOffset = scrollOffsetRef.current!; + const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1]; + + // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset` + // right away (before animation) which creates inconsistency until the animation completes. + // To workaround that, we calculate `isAtBottom` with a "buffer" of the latest message height (this is approximate). + const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0; + const isAtBottom = isViewportNewest && prevIsViewportNewest && ( + scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD + ); + + let newScrollTop!: number; + + const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0]; + const hasLastMessageChanged = ( + messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1] + ); + if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged) { + if (lastItemElement) { + fastRaf(() => { + fastSmoothScroll(container, lastItemElement, 'end', BOTTOM_FOCUS_MARGIN); + }); + } + + newScrollTop = scrollHeight - offsetHeight; + scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight); + + // Scroll still needs to be restored after container resize + if (!shouldForceScroll) { + return; + } + } + + if (process.env.APP_ENV === 'perf') { + // eslint-disable-next-line no-console + console.time('scrollTop'); + } + + const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight; + const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`); + const unreadDivider = ( + !anchor + && memoUnreadDividerBeforeIdRef.current + && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`) + ); + + if (isAtBottom && isResized) { + newScrollTop = scrollHeight - offsetHeight; + } else if (anchor) { + const newAnchorTop = anchor.getBoundingClientRect().top; + newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0)); + } else if (unreadDivider) { + newScrollTop = unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP); + } else { + newScrollTop = scrollHeight - scrollOffset; + } + + resetScroll(container, newScrollTop); + + if (!memoFocusingIdRef.current) { + isScrollTopJustUpdatedRef.current = true; + fastRaf(() => { + isScrollTopJustUpdatedRef.current = false; + }); + } + + scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight); + + if (process.env.APP_ENV === 'perf') { + // eslint-disable-next-line no-console + console.timeEnd('scrollTop'); + } + }, [messageIds, isViewportNewest, containerHeight, hasTools]); + + useEffect(() => { + if (!animationLevel || animationLevel > 0) { + dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY); + } + }, [animationLevel, isSelectModeActive]); + + const lang = useLang(); + + const isPrivate = Boolean(chatId && isChatPrivate(chatId)); + const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf); + + const className = buildClassName( + 'MessageList custom-scroll', + !withUsers && 'no-avatars', + isChannelChat && 'no-avatars', + (!canPost || bottomOffset !== 'none') && 'bottom-padding', + (bottomOffset !== 'none') && `bottom-padding-${bottomOffset}`, + isSelectModeActive && 'select-mode-active', + hasFocusing && 'has-focusing', + isScrolled && 'scrolled', + ); + + return ( +
    + {isRestricted ? ( +
    + + {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`} + +
    + ) : botDescription ? ( +
    {renderText(lang(botDescription), ['br', 'emoji', 'links'])}
    + ) : messageIds && messageGroups ? ( + // @ts-ignore + + {messageGroups && renderMessages( + lang, + messageGroups, + observeIntersectionForReading, + observeIntersectionForMedia, + observeIntersectionForAnimatedStickers, + withUsers, + anchorIdRef, + memoUnreadDividerBeforeIdRef, + threadId, + type, + threadTopMessageId, + threadFirstMessageId, + hasLinkedChat, + type === 'scheduled', + )} + + ) : messageIds ? ( +
    {lang('NoMessages')}
    + ) : lastMessage ? ( +
    + {renderMessages( + lang, + groupMessages([lastMessage]), + observeIntersectionForReading, + observeIntersectionForMedia, + observeIntersectionForAnimatedStickers, + withUsers, + anchorIdRef, + memoUnreadDividerBeforeIdRef, + threadId, + type, + threadTopMessageId, + threadFirstMessageId, + hasLinkedChat, + false, + )} +
    + ) : ( + + )} +
    + ); +}; + +function renderMessages( + lang: LangFn, + messageGroups: MessageDateGroup[], + observeIntersectionForReading: ObserveFn, + observeIntersectionForMedia: ObserveFn, + observeIntersectionForAnimatedStickers: ObserveFn, + withUsers: boolean, + currentAnchorIdRef: { current: string | undefined }, + memoFirstUnreadIdRef: { current: number | undefined }, + threadId: number, + type: MessageListType, + threadTopMessageId?: number, + threadFirstMessageId?: number, + hasLinkedChat?: boolean, + isSchedule = false, +) { + const unreadDivider = ( +
    + {lang('UnreadMessages')} +
    + ); + + const dateGroups = messageGroups.map(( + dateGroup: MessageDateGroup, + dateGroupIndex: number, + dateGroupsArray: MessageDateGroup[], + ) => { + const senderGroups = dateGroup.senderGroups.map(( + senderGroup, + senderGroupIndex, + senderGroupsArray, + ) => { + if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) { + const message = senderGroup[0]; + + return compact([ + message.id === memoFirstUnreadIdRef.current && unreadDivider, + , + ]); + } + + let currentDocumentGroupId: string | undefined; + + return flatten(senderGroup.map(( + messageOrAlbum, + messageIndex, + ) => { + const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum; + const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined; + const isOwn = isOwnMessage(message); + const isMessageAlbum = isAlbum(messageOrAlbum); + const nextMessage = senderGroup[messageIndex + 1]; + + if (message.previousLocalId && currentAnchorIdRef.current === `message${message.previousLocalId}`) { + currentAnchorIdRef.current = `message${message.id}`; + } + + const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined; + const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined; + + const position = { + isFirstInGroup: messageIndex === 0, + isLastInGroup: messageIndex === senderGroup.length - 1, + isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId), + isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId), + isLastInList: ( + messageIndex === senderGroup.length - 1 + && senderGroupIndex === senderGroupsArray.length - 1 + && dateGroupIndex === dateGroupsArray.length - 1 + ), + }; + + currentDocumentGroupId = documentGroupId; + + const shouldRenderUnreadDivider = ( + (message.id === memoFirstUnreadIdRef.current && memoFirstUnreadIdRef.current !== threadFirstMessageId) + || (message.id === threadTopMessageId && memoFirstUnreadIdRef.current === threadFirstMessageId) + ); + const originalId = getMessageOriginalId(message); + // Scheduled messages can have local IDs in the middle of the list, + // and keys should be ordered, so we prefix it with a date. + // However, this may lead to issues if server date is not synchronized with the local one. + const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`; + + return compact([ + shouldRenderUnreadDivider && unreadDivider, + , + message.id === threadTopMessageId && ( +
    + {lang('DiscussionStarted')} +
    + ), + ]); + })); + }); + + return ( +
    +
    + + {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && ( + lang('MessageScheduledUntilOnline') + )} + {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && ( + lang('MessageScheduledOn', formatHumanDate(dateGroup.datetime, undefined, true)) + )} + {!isSchedule && formatHumanDate(dateGroup.datetime)} + +
    + {flatten(senderGroups)} +
    + ); + }); + + return flatten(dateGroups); +} + +export default memo(withGlobal( + (global, { chatId, threadId, type }): StateProps => { + const chat = selectChat(global, chatId); + if (!chat) { + return {}; + } + + const messageIds = selectCurrentMessageIds(global, chatId, threadId, type); + const messagesById = type === 'scheduled' + ? selectScheduledMessages(global, chatId) + : selectChatMessages(global, chatId); + const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId); + + if ( + threadId !== MAIN_THREAD_ID + && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId]) + ) { + return {}; + } + + const { isRestricted, restrictionReason, lastMessage } = chat; + const focusingId = selectFocusedMessageId(global, chatId); + + const withLastMessageWhenPreloading = ( + threadId === MAIN_THREAD_ID + && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId + ); + + let botDescription: string | undefined; + if (selectIsChatBotNotStarted(global, chatId)) { + const chatBot = selectChatBot(global, chatId)!; + if (chatBot.fullInfo) { + botDescription = chatBot.fullInfo.botDescription || 'NoMessages'; + } else { + botDescription = 'Updating bot info...'; + } + } + + return { + isChatLoaded: true, + isRestricted, + restrictionReason, + isChannelChat: isChatChannel(chat), + canPost: getCanPostInChat(chat, threadId), + isChatWithSelf: selectIsChatWithSelf(global, chatId), + messageIds, + messagesById, + firstUnreadId: selectFirstUnreadId(global, chatId, threadId), + isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId), + threadFirstMessageId: selectFirstMessageId(global, chatId, threadId), + focusingId, + isSelectModeActive: selectIsInSelectMode(global), + animationLevel: global.settings.byKey.animationLevel, + ...(withLastMessageWhenPreloading && { lastMessage }), + botDescription, + threadTopMessageId, + hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo) + ? Boolean(chat.fullInfo.linkedChatId) + : undefined, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadViewportMessages', + 'markMessageListRead', + 'markMessagesRead', + 'setScrollOffset', + ]), +)(MessageList)); diff --git a/src/components/middle/MessageScroll.tsx b/src/components/middle/MessageScroll.tsx new file mode 100644 index 000000000..7b7ff9fc0 --- /dev/null +++ b/src/components/middle/MessageScroll.tsx @@ -0,0 +1,155 @@ +import { MutableRefObject } from 'react'; +import React, { FC, useCallback, useRef } from '../../lib/teact/teact'; + +import { MESSAGE_LIST_SENSITIVE_AREA } from '../../config'; +import resetScroll from '../../util/resetScroll'; +import { useIntersectionObserver, useOnIntersect } from '../../hooks/useIntersectionObserver'; +import useOnChange from '../../hooks/useOnChange'; + +type OwnProps = { + containerRef: MutableRefObject; + className: string; + messageIds: number[]; + containerHeight?: number; + listItemElementsRef: MutableRefObject; + anchorIdRef: MutableRefObject; + anchorTopRef: MutableRefObject; + loadMoreForwards?: NoneToVoidFunction; + loadMoreBackwards?: NoneToVoidFunction; + isViewportNewest?: boolean; + firstUnreadId?: number; + focusingId?: number; + onFabToggle: AnyToVoidFunction; + children: any; +}; + +const FAB_THRESHOLD = 100; + +const MessageScroll: FC = ({ + containerRef, + className, + messageIds, + containerHeight, + listItemElementsRef, + focusingId, + anchorIdRef, + anchorTopRef, + loadMoreForwards, + loadMoreBackwards, + isViewportNewest, + firstUnreadId, + onFabToggle, + children, +}) => { + // eslint-disable-next-line no-null/no-null + const backwardsTriggerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const forwardsTriggerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const fabTriggerRef = useRef(null); + + const updateFabVisibility = useCallback(() => { + if (!messageIds || !messageIds.length) { + onFabToggle(false); + return; + } + + if (!isViewportNewest) { + onFabToggle(true); + return; + } + + const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!; + const scrollBottom = scrollHeight - scrollTop - offsetHeight; + const isNearBottom = scrollBottom <= FAB_THRESHOLD; + const isAtBottom = scrollBottom === 0; + + onFabToggle(firstUnreadId ? !isAtBottom : !isNearBottom); + }, [messageIds, isViewportNewest, containerRef, onFabToggle, firstUnreadId]); + + const { observe: observeIntersection, freeze, unfreeze } = useIntersectionObserver({ + rootRef: containerRef, + margin: MESSAGE_LIST_SENSITIVE_AREA, + }, (entries) => { + if (!loadMoreForwards || !loadMoreBackwards) { + return; + } + + const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting); + if (!triggerEntry) { + return; + } + + const { target } = triggerEntry; + + if (target.className === 'backwards-trigger') { + resetScroll(containerRef.current!); + loadMoreBackwards(); + } else if (target.className === 'forwards-trigger' && (target as HTMLDivElement).dataset.isActive) { + resetScroll(containerRef.current!); + loadMoreForwards(); + } + }); + + useOnChange(() => { + if (focusingId) { + freeze(); + } else { + unfreeze(); + } + }, [focusingId]); + + useOnIntersect(backwardsTriggerRef, observeIntersection); + useOnIntersect(forwardsTriggerRef, observeIntersection); + + const { observe: observeIntersectionForFab } = useIntersectionObserver({ + rootRef: containerRef, + margin: FAB_THRESHOLD, + }, ([{ target }]) => { + if ((target as HTMLDivElement).dataset.isActive) { + updateFabVisibility(); + } + }); + + useOnIntersect(fabTriggerRef, observeIntersectionForFab); + + useOnChange(() => { + if (!listItemElementsRef.current) { + return; + } + + const preservedItemElements = listItemElementsRef.current + .filter((element) => messageIds.includes(Number(element.dataset.messageId))); + + // We avoid the very first item as it may be a partly-loaded album + // and also because it may be removed when messages limit is reached + const anchor = preservedItemElements[1] || preservedItemElements[0]; + if (!anchor) { + return; + } + + anchorIdRef.current = anchor.id; + anchorTopRef.current = anchor.getBoundingClientRect().top; + }, [messageIds, containerHeight]); + + return ( +
    +
    + {children} +
    +
    +
    + ); +}; + +export default MessageScroll; diff --git a/src/components/middle/MessageSelectToolbar.async.tsx b/src/components/middle/MessageSelectToolbar.async.tsx new file mode 100644 index 000000000..a19554866 --- /dev/null +++ b/src/components/middle/MessageSelectToolbar.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; +import { OwnProps } from './MessageSelectToolbar'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const MessageSelectToolbarAsync: FC = (props) => { + const { isActive } = props; + const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive); + + // eslint-disable-next-line react/jsx-props-no-spreading + return MessageSelectToolbar ? : undefined; +}; + +export default MessageSelectToolbarAsync; diff --git a/src/components/middle/MessageSelectToolbar.scss b/src/components/middle/MessageSelectToolbar.scss new file mode 100644 index 000000000..823c7cd2b --- /dev/null +++ b/src/components/middle/MessageSelectToolbar.scss @@ -0,0 +1,138 @@ +.MessageSelectToolbar { + position: absolute; + bottom: 0.5rem; + left: .5rem; + right: .5rem; + width: auto; + z-index: 20; + justify-content: center; + margin: 0; + + .mask-image-disabled &::before { + left: auto !important; + right: auto !important; + height: 3.5rem; + border-radius: var(--border-radius-messages); + } + + @media (min-width: 601px) { + left: 1rem; + right: 1rem; + bottom: 1.25rem; + + .no-composer & { + top: -4.75rem; + } + } + + opacity: 1; + + &-inner { + transform: scaleX(1); + transition: transform var(--select-transition), opacity var(--select-transition); + } + + &.with-composer .MessageSelectToolbar-inner { + transform: scaleX(1) translateX(0); + } + + .no-composer .messaging-disabled + & { + top: auto; + } + + .no-composer .unpin-button-container + & { + top: auto; + margin-bottom: 1rem; + } + + body.animation-level-0 & { + transition: none !important; + } + + &:not(.shown) { + opacity: 0; + pointer-events: none; + + &-inner { + transform: scaleX(var(--toolbar-hidden-scale, 1)); + } + + &.with-composer .MessageSelectToolbar-inner { + transform: scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0)); + } + } + + &::before { + z-index: -1; + max-width: 32rem; + width: 100%; + left: auto; + right: auto; + } + + &-inner { + width: 100%; + max-width: 32rem; + display: flex; + align-items: center; + padding: 0.25rem; + + background: white; + border-radius: var(--border-radius-messages); + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + font-weight: 500; + + @media (max-width: 600px) { + padding: 0; + max-width: none; + } + + > .Button { + width: 3rem; + height: 3rem; + + @media (max-width: 600px) { + width: 2.875rem; + height: 2.875rem; + } + } + } + + &-count { + margin-left: 1rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + @media (max-width: 600px) { + margin-right: 0.5rem; + } + } + + &-actions { + margin-left: auto; + display: flex; + + .MenuItem { + border-radius: var(--border-radius-default); + padding: 0.75rem 2rem 0.75rem 1rem; + + i { + margin-right: 1rem; + } + + @media (max-width: 600px) { + padding: 0.6875rem; + border-radius: 50%; + + i { + margin-right: 0; + } + + .item-text { + display: none; + } + } + } + } +} diff --git a/src/components/middle/MessageSelectToolbar.tsx b/src/components/middle/MessageSelectToolbar.tsx new file mode 100644 index 000000000..487fc5b7e --- /dev/null +++ b/src/components/middle/MessageSelectToolbar.tsx @@ -0,0 +1,137 @@ +import React, { FC, memo, useEffect } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions, MessageListType } from '../../global/types'; + +import { + selectCanDeleteSelectedMessages, + selectCurrentMessageList, + selectSelectedMessagesCount, +} from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import useFlag from '../../hooks/useFlag'; +import captureKeyboardListeners from '../../util/captureKeyboardListeners'; +import buildClassName from '../../util/buildClassName'; +import usePrevious from '../../hooks/usePrevious'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import MenuItem from '../ui/MenuItem'; + +import DeleteSelectedMessagesModal from './DeleteSelectedMessagesModal'; + +import './MessageSelectToolbar.scss'; + +export type OwnProps = { + isActive?: boolean; + canPost?: boolean; + messageListType?: MessageListType; +}; + +type StateProps = { + isSchedule: boolean; + selectedMessagesCount?: number; + canDeleteMessages?: boolean; +}; + +type DispatchProps = Pick; + +const MessageSelectToolbar: FC = ({ + canPost, + isActive, + messageListType, + isSchedule, + selectedMessagesCount, + canDeleteMessages, + exitMessageSelectMode, + openForwardMenuForSelectedMessages, +}) => { + const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag(); + + useEffect(() => { + return isActive && !isDeleteModalOpen + ? captureKeyboardListeners({ + onBackspace: openDeleteModal, + onDelete: openDeleteModal, + onEsc: exitMessageSelectMode, + }) + : undefined; + }, [isActive, isDeleteModalOpen, openDeleteModal, exitMessageSelectMode]); + + const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true); + const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount; + + const lang = useLang(); + + const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount); + + const className = buildClassName( + 'MessageSelectToolbar', + canPost && 'with-composer', + isActive && 'shown', + ); + + return ( +
    +
    + + + {formattedMessagesCount} + + + {!!selectedMessagesCount && ( +
    + {messageListType !== 'scheduled' && ( + + + {lang('Forward')} + + + )} + + + {lang('Delete')} + + +
    + )} +
    + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { type: messageListType } = selectCurrentMessageList(global) || {}; + const { canDelete } = selectCanDeleteSelectedMessages(global); + + return { + isSchedule: messageListType === 'scheduled', + selectedMessagesCount: selectSelectedMessagesCount(global), + canDeleteMessages: canDelete, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']), +)(MessageSelectToolbar)); diff --git a/src/components/middle/MiddleColumn.scss b/src/components/middle/MiddleColumn.scss new file mode 100644 index 000000000..7cddc8096 --- /dev/null +++ b/src/components/middle/MiddleColumn.scss @@ -0,0 +1,369 @@ +#middle-column-bg { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow: hidden; + z-index: -1; + + &::before { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: rgb(230, 235, 238); + background-image: url('../../assets/chat-bg.jpg'); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + + transition: background-image .3s ease; + + body.animation-level-0 & { + transition: none; + } + + @media (max-width: 600px) { + background-image: url('../../assets/chat-bg-mobile.jpg'); + } + } + + .custom-bg-image > &::before { + background-image: var(--custom-background) !important; + background-color: var(--custom-background) !important; + filter: blur(0); + transform: scale(1.1); + } + + .custom-bg-image.blurred > &::before { + filter: blur(12px); + } + + @media screen and (min-width: 1276px) { + body.animation-level-2 &::before { + margin: -16rem -5rem -20rem 0; + overflow: hidden; + transform: scale(1); + transform-origin: left center; + transition: transform var(--layer-transition); + } + + body.animation-level-2 .custom-bg-image > &::before { + margin: -16rem -5rem -20rem -1rem; + transition: transform var(--layer-transition), background .3s ease; + } + + body.animation-level-2 #Main.right-column-open :not(.custom-bg-image) > &::before { + transform: scale(0.67); + } + } +} + +#MiddleColumn { + display: flex; + justify-content: center; + height: 100%; + position: relative; + z-index: 1; + + @media (max-width: 600px) { + overflow: hidden; + } + + .messages-layout { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + height: 100%; + position: relative; + overflow: hidden; + + > .Transition { + width: 100%; + height: 100%; + overflow: hidden; + + > div { + display: flex; + flex-direction: column; + align-items: center; + } + } + } + + .messaging-disabled { + &-inner { + width: 100%; + padding: 1rem; + border-radius: var(--border-radius-messages); + background: white; + color: var(--color-text-secondary); + text-align: center; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + } + } + + .Composer { + #message-compose { + transform: scaleX(1) translateX(0); + transition: transform var(--select-transition), border-bottom-right-radius var(--select-transition); + + &::before { + transform: scaleX(-1) translateX(0); + transition: transform var(--select-transition); + } + + body.animation-level-0 & { + &, &::before { + transition: none !important; + } + } + } + + .message-input-wrapper, &::before { + opacity: 1; + transition: opacity var(--select-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + + > .Button { + opacity: 1; + transform: scale(1); + transition: opacity var(--select-transition), transform var(--select-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + + &.hover-disabled, &:not(.shown) { + pointer-events: none; + } + + &:not(.shown) { + .ComposerEmbeddedMessage { + height: 0; + } + + #message-compose { + transform: scaleX(var(--composer-hidden-scale, 1)) translateX(var(--composer-translate-x, 0)); + border-bottom-right-radius: var(--border-radius-messages); + + &::before { + transform: scaleX(-1) translateX(200%); + } + } + + #editable-message-text { + height: 3.5rem !important; + + @media (max-width: 600px) { + height: 2.5rem !important; + } + } + + .message-input-wrapper, &::before { + opacity: 0; + } + + > .Button { + opacity: 0 !important; + transform: scale(0.5); + } + } + } + + .messaging-disabled { + transform: scaleX(1); + transition: transform var(--select-transition); + + .messaging-disabled-inner span { + opacity: 1; + transition: opacity var(--select-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + + body.animation-level-0 & { + transition: none !important; + } + + &:not(.shown) { + transform: scaleX(var(--composer-hidden-scale, 1)); + pointer-events: none; + + .messaging-disabled-inner span { + opacity: 0; + } + } + } + + .middle-column-footer { + width: 100%; + max-width: var(--messages-container-width); + padding: 0 1rem; + position: relative; + display: flex; + align-items: flex-end; + z-index: var(--z-middle-footer); + + transform: translate3d(0, 0, 0); + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none !important; + } + + @media (min-width: 1276px) { + width: calc(100% - var(--right-column-width)); + + #Main.right-column-open & { + transform: translate3d(calc(var(--right-column-width) / -2), 0, 0); + } + } + + @media (max-width: 600px) { + padding: 0 0.5rem; + + body.is-symbol-menu-open & { + transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0); + } + } + } +} + +/* Common styles for message list fade-out shadow */ +.Composer, +.MessageSelectToolbar, +.messaging-disabled { + margin-bottom: 1.25rem; + + @media (max-width: 600px) { + margin-bottom: 0.5rem; + } +} + +.Composer, +.MessageSelectToolbar, +.unpin-all-button, +.messaging-disabled { + width: 100%; + display: flex; + justify-content: center; + position: relative; + + .mask-image-disabled &::before { + --shadow-color: #84a686; + + content: ""; + display: block; + position: absolute; + top: 0; + left: 0.125rem; + right: 0.125rem; + height: 1.5rem; + box-shadow: 0 0 .5rem .5rem var(--shadow-color); + background: var(--shadow-color); + z-index: -1; + + @media (max-width: 600px) { + left: 0; + right: 0; + z-index: -1; + --shadow-color: #678a64; + + body.is-symbol-menu-open & { + --shadow-color: #b4bf9e; + } + } + + @media screen and (min-height: 750px) { + --shadow-color: #759b72; + } + + @media screen and (min-width: 1276px) { + body.animation-level-2 & { + --shadow-color: #97af8e; + } + + body.animation-level-2 #Main.right-column-open & { + --shadow-color: #84a686; + } + + @media (min-height: 750px) { + body.animation-level-2 & { + --shadow-color: #91a67f; + } + + body.animation-level-2 #Main.right-column-open & { + --shadow-color: #759b72; + } + } + } + } + + .custom-bg-image &::before { + display: none; + } +} + +.unpin-button-container { + width: 100%; + display: flex; + justify-content: center; + position: absolute; + margin-top: 0.25rem; + padding-bottom: 1rem; + + .unpin-all-button { + text-transform: capitalize; + color: var(--color-black); + height: 3.125rem; + overflow: visible; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + + &:hover { + .icon-unpin { + color: var(--color-white); + } + } + + .select-mode-active + .middle-column-footer & { + display: none; + } + + .mask-image-disabled &::before { + height: 3.125rem; + border-radius: var(--border-radius-messages); + } + + @media (max-width: 600px) { + height: 2.5rem; + } + + .icon-unpin { + margin-right: .75rem; + margin-left: -0.438rem; + color: var(--color-text-secondary); + font-size: 1.5rem; + } + } + + @media (max-width: 600px) { + padding-bottom: 0.75rem; + } + + .mask-image-disabled &::before { + background: unset; + } +} diff --git a/src/components/middle/MiddleColumn.tsx b/src/components/middle/MiddleColumn.tsx new file mode 100644 index 000000000..134fbd248 --- /dev/null +++ b/src/components/middle/MiddleColumn.tsx @@ -0,0 +1,333 @@ +import React, { + FC, useEffect, useState, memo, useMemo, useCallback, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { MAIN_THREAD_ID } from '../../api/types'; +import { GlobalActions, MessageListType } from '../../global/types'; + +import { + MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN, + MOBILE_SCREEN_MAX_WIDTH, + MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, + SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, + SAFE_SCREEN_WIDTH_FOR_CHAT_INFO, + CONTENT_TYPES_FOR_QUICK_UPLOAD, + ANIMATION_LEVEL_MAX, + ANIMATION_END_DELAY, +} from '../../config'; +import { IS_MOBILE_SCREEN, IS_TOUCH_ENV, MASK_IMAGE_ENABLED } from '../../util/environment'; +import { DropAreaState } from './composer/DropArea'; +import { + selectChat, + selectCurrentMessageList, + selectCurrentTextSearch, + selectIsChatBotNotStarted, + selectIsInSelectMode, + selectIsRightColumnShown, + selectPinnedIds, +} from '../../modules/selectors'; +import { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; +import useCustomBackground from '../../hooks/useCustomBackground'; +import useWindowSize from '../../hooks/useWindowSize'; +import usePrevForAnimation from '../../hooks/usePrevForAnimation'; +import calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms'; +import useLang from '../../hooks/useLang'; + +import Transition from '../ui/Transition'; +import MiddleHeader from './MiddleHeader'; +import MessageList from './MessageList'; +import ScrollDownButton from './ScrollDownButton'; +import Composer from './composer/Composer'; +import Button from '../ui/Button'; +import MobileSearch from './MobileSearch.async'; +import MessageSelectToolbar from './MessageSelectToolbar.async'; +import UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async'; + +import './MiddleColumn.scss'; + +type StateProps = { + chatId?: number; + threadId?: number; + messageListType?: MessageListType; + isPrivate?: boolean; + isPinnedMessageList?: boolean; + canPost?: boolean; + messageSendingRestrictionReason?: string; + hasPinnedOrAudioMessage?: boolean; + customBackground?: string; + isRightColumnShown?: boolean; + isBackgroundBlurred?: boolean; + isMobileSearchActive?: boolean; + isSelectModeActive?: boolean; + animationLevel?: number; +}; + +type DispatchProps = Pick; + +const CLOSE_ANIMATION_DURATION = IS_MOBILE_SCREEN ? 450 + ANIMATION_END_DELAY : undefined; + +function canBeQuicklyUploaded(item: DataTransferItem) { + return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(item.type); +} + +const MiddleColumn: FC = ({ + chatId, + threadId, + messageListType, + isPrivate, + isPinnedMessageList, + canPost, + messageSendingRestrictionReason, + hasPinnedOrAudioMessage, + customBackground, + isRightColumnShown, + isBackgroundBlurred, + isMobileSearchActive, + isSelectModeActive, + animationLevel, + openChat, + unpinAllMessages, + loadUser, +}) => { + const { width: windowWidth } = useWindowSize(); + + const [dropAreaState, setDropAreaState] = useState(DropAreaState.None); + const [isFabShown, setIsFabShown] = useState(false); + const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false); + + const renderingChatId = usePrevForAnimation(chatId, CLOSE_ANIMATION_DURATION); + const renderingThreadId = usePrevForAnimation(threadId, CLOSE_ANIMATION_DURATION); + const renderingMessageListType = usePrevForAnimation(messageListType, CLOSE_ANIMATION_DURATION); + const renderingCanPost = usePrevForAnimation(canPost, CLOSE_ANIMATION_DURATION); + + useEffect(() => { + return chatId + ? captureEscKeyListener(() => { + openChat({ id: undefined }); + }) + : undefined; + }, [chatId, openChat]); + + useEffect(() => { + setDropAreaState(DropAreaState.None); + }, [chatId]); + + useEffect(() => { + if (isPrivate) { + loadUser({ userId: chatId }); + } + }, [chatId, isPrivate, loadUser]); + + const handleDragEnter = useCallback((e: React.DragEvent) => { + if (IS_TOUCH_ENV) { + return; + } + + const { items } = e.dataTransfer || {}; + const shouldDrawQuick = items && Array.from(items).every(canBeQuicklyUploaded); + + setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document); + }, []); + + const handleHideDropArea = useCallback(() => { + setDropAreaState(DropAreaState.None); + }, []); + + const handleOpenUnpinModal = useCallback(() => { + setIsUnpinModalOpen(true); + }, []); + + const closeUnpinModal = useCallback(() => { + setIsUnpinModalOpen(false); + }, []); + + const handleUnpinAllMessages = useCallback(() => { + unpinAllMessages({ chatId }); + closeUnpinModal(); + openChat({ id: chatId }); + }, [unpinAllMessages, openChat, closeUnpinModal, chatId]); + + const customBackgroundValue = useCustomBackground(customBackground); + + const hasTools = hasPinnedOrAudioMessage && ( + windowWidth < MOBILE_SCREEN_MAX_WIDTH + || ( + isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN + && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN + ) || ( + windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN + && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO + ) + ); + + const className = buildClassName( + hasTools && 'has-header-tools', + customBackground && 'custom-bg-image', + customBackground && isBackgroundBlurred && 'blurred', + MASK_IMAGE_ENABLED ? 'mask-image-enabled' : 'mask-image-disabled', + ); + + const messagingDisabledClassName = buildClassName( + 'messaging-disabled', + !isSelectModeActive && 'shown', + ); + + // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS + const { + composerHiddenScale, toolbarHiddenScale, + composerTranslateX, toolbarTranslateX, + } = useMemo( + () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost), + [renderingCanPost, windowWidth], + ); + + const lang = useLang(); + + return ( +
    +
    +
    + {renderingChatId && renderingThreadId && ( + <> +
    + + + {() => ( + <> + +
    + {renderingCanPost && ( + + )} + {isPinnedMessageList && ( +
    + +
    + )} + {!renderingCanPost && messageSendingRestrictionReason && ( +
    +
    + + {messageSendingRestrictionReason} + +
    +
    + )} + +
    + + )} +
    + + +
    + {IS_MOBILE_SCREEN && } + + )} + {chatId && ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { isBackgroundBlurred, customBackground } = global.settings.byKey; + + const currentMessageList = selectCurrentMessageList(global); + const { chats: { listIds } } = global; + if (!currentMessageList || !listIds.active) { + return { + customBackground, + isBackgroundBlurred, + }; + } + + const { chatId, threadId, type: messageListType } = currentMessageList; + const chat = selectChat(global, chatId); + const pinnedIds = selectPinnedIds(global, chatId); + const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer; + + const canPost = chat && getCanPostInChat(chat, threadId); + const isBotNotStarted = selectIsChatBotNotStarted(global, chatId); + const isPinnedMessageList = messageListType === 'pinned'; + return { + chatId, + threadId, + messageListType, + isPrivate: isChatPrivate(chatId), + canPost: !isPinnedMessageList && (!chat || canPost) && (!isBotNotStarted || IS_MOBILE_SCREEN), + isPinnedMessageList, + messageSendingRestrictionReason: chat && getMessageSendingRestrictionReason(chat), + hasPinnedOrAudioMessage: Boolean(pinnedIds && pinnedIds.length) || Boolean(audioChatId && audioMessageId), + customBackground, + isRightColumnShown: selectIsRightColumnShown(global), + isBackgroundBlurred, + isMobileSearchActive: Boolean(IS_MOBILE_SCREEN && selectCurrentTextSearch(global)), + isSelectModeActive: selectIsInSelectMode(global), + animationLevel: global.settings.byKey.animationLevel, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChat', 'unpinAllMessages', 'loadUser', + ]), +)(MiddleColumn)); diff --git a/src/components/middle/MiddleHeader.scss b/src/components/middle/MiddleHeader.scss new file mode 100644 index 000000000..b059ff6c8 --- /dev/null +++ b/src/components/middle/MiddleHeader.scss @@ -0,0 +1,467 @@ +@import '../../styles/mixins'; + +@mixin mobile-header-styles() { + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + position: absolute; + top: 100%; + left: 0; + right: 0; + height: 2.875rem; + overflow: hidden; + box-shadow: 0 2px 2px rgba(114, 114, 114, 0.17); + + display: flex; + flex-direction: row-reverse; + padding: 0.375rem 0.5rem; + padding-left: 0.75rem; + background: var(--color-background); + + &::before { + content: ""; + display: block; + position: absolute; + top: -2px; + left: 0; + right: 0; + height: 2px; + box-shadow: 0 2px 2px rgba(114, 114, 114, 0.17); + } + + .HeaderPinnedMessage { + max-width: unset; + } + } + + .AudioPlayer { + height: 3.25rem; + + flex-direction: row; + padding: 0.375rem 0.5rem; + + &-content { + padding: 0 0.5rem; + flex-grow: 1 + } + + > .Button { + margin: 0; + } + + > .player-close { + margin-left: auto; + } + } + + .HeaderPinnedMessage { + flex-grow: 1; + padding-top: 0; + padding-bottom: 0; + + &::before { + top: 0.125rem; + bottom: 0.125rem; + } + + .message-text { + max-width: none; + } + } +} + +.MiddleHeader { + display: flex; + align-items: center; + width: 100%; + box-shadow: 0 2px 2px rgba(114, 114, 114, 0.17); + background: #fff; + padding: .5rem .8125rem .5rem 1.5rem; + position: relative; + z-index: var(--z-middle-header); + + @media (max-width: 600px) { + padding: 0.5rem; + position: relative; + // Force rendering in the composite layer to fix the z-index rendering issue + transform: translate3d(0, 0, 10px); + transform-style: preserve-3d; + } + + .Transition { + width: 100%; + // https://dfmcphee.com/flex-items-and-min-width-0/ + // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size + min-width: 0; + + > div { + display: flex; + align-items: center; + width: 100%; + } + } + + .back-button { + margin-left: -0.5rem; + margin-right: 0.5rem; + position: relative; + + @media (max-width: 600px) { + margin-left: 0; + } + + .unread-count { + min-width: 1.25rem; + height: 1.25rem; + padding: 0 0.375rem; + border-radius: 0.625rem; + font-size: 0.75rem; + line-height: 1.25rem; + font-weight: 500; + text-align: center; + + position: absolute; + top: -0.25rem; + right: -0.5rem; + + background: var(--color-gray); + color: white; + pointer-events: none; + + &.active { + background: var(--color-primary); + } + } + } + + .chat-info-wrapper { + flex-grow: 1; + overflow: hidden; + } + + .header-tools { + display: flex; + align-items: center; + justify-content: flex-end; + margin-left: auto; + flex-shrink: 0; + + body.animation-level-0 & { + &, + .HeaderPinnedMessage-wrapper, + .AudioPlayer, + .HeaderActions { + transition: none !important; + } + } + + @media (min-width: 1276px) and (max-width: 1439px) { + .HeaderActions { + transform: translate3d(0, 0, 0); + transition: transform var(--layer-transition); + + #Main.right-column-open & { + transform: translate3d(calc(var(--right-column-width) * -1), 0, 0); + } + } + } + + @media (min-width: 1440px) { + transform: translate3d(0, 0, 0); + transition: transform var(--layer-transition); + + #Main.right-column-open & { + transform: translate3d(calc(var(--right-column-width) * -1), 0, 0); + } + } + + // @optimization + @include while-transition() { + pointer-events: none; + } + } + + @media (min-width: 1276px) and (max-width: 1439px) { + &:not(.tools-stacked) .header-tools { + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + opacity: 1; + + #Main.right-column-open & { + opacity: 0; + } + } + } + } + + &.tools-stacked .header-tools { + @include mobile-header-styles(); + + @media (min-width: 1150px) { + #Main.right-column-open & { + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + padding-right: calc(0.5rem + var(--right-column-width)); + } + } + } + } + + &.tools-stacked.animated .header-tools { + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + animation: fade-in var(--layer-transition) forwards; + + body.animation-level-0 & { + animation: none; + } + } + } + + h3 { + font-weight: 500; + font-size: 1.125rem; + line-height: 1.375rem; + white-space: pre; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + + @media (max-width: 600px) { + display: block; + overflow: hidden; + text-overflow: ellipsis; + } + + @media (min-width: 1275px) { + #Main.right-column-open & { + max-width: calc(100% - var(--right-column-width)); + } + } + } + + .ChatInfo { + cursor: pointer; + display: flex; + align-items: center; + + .info { + display: flex; + flex-direction: column; + justify-content: center; + flex-grow: 1; + overflow: hidden; + } + + .title { + display: flex; + align-items: center; + + .VerifiedIcon { + width: 1.25rem; + height: 1.25rem; + margin-left: 0.25rem; + margin-top: 0.05rem; + } + } + } + + .Avatar { + margin-right: .625rem; + width: 2.5rem; + height: 2.5rem; + font-size: 1.0625rem; + } + + .status, .typing-status { + font-size: 0.875rem; + line-height: 1.125rem; + margin: 0; + color: var(--color-text-secondary); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + + &.online { + color: var(--color-primary); + } + } + + .Button.smaller { + width: 2.5rem; + height: 2.5rem; + } + + .HeaderPinnedMessage-wrapper { + display: flex; + align-items: center; + margin-left: auto; + cursor: default; + flex-direction: row-reverse; + + body.animation-level-1 & { + .ripple-container { + display: none; + } + } + + .HeaderPinnedMessage { + min-width: 16rem; + } + + > .Button { + flex-shrink: 0; + } + } + + .HeaderPinnedMessage { + display: flex; + flex-shrink: 1; + padding: 0.25rem; + margin-top: -0.25rem; + margin-bottom: -0.25rem; + padding-left: 0.375rem; + border-radius: var(--border-radius-messages-small); + position: relative; + overflow: hidden; + cursor: pointer; + + &:hover { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + } + + .pinned-message-border { + position: relative; + height: 2.25rem; + margin: 0.125rem 0; + width: 0.125rem; + min-width: 0.125rem; + overflow: hidden; + + .pinned-message-border-wrapper-1 { + height: 2.25rem; + width: 0.125rem; + border-radius: 0.0625rem; + background: var(--color-primary); + } + + .pinned-message-border-wrapper { + background-color: rgba(var(--color-primary-rgb), 0.5); + position: relative; + will-change: transform; + transition: transform .25s ease-in-out; + } + + .pinned-message-border-mark { + position: absolute; + left: 0; + top: 0; + width: 0.125rem; + background: var(--color-primary); + border-radius: 0.0625rem; + will-change: transform; + transition: transform .25s ease-in-out; + } + } + + .message-text { + overflow: hidden; + margin-left: 0.4rem; + margin-top: 0.125rem; + max-width: 15rem; + + @media (min-width: 1440px) and (max-width: 1500px) { + max-width: 14rem; + } + + .title { + font-weight: 500; + font-size: 0.875rem; + line-height: 1rem; + height: 1rem; + color: var(--color-primary); + margin-bottom: 0.125rem; + white-space: pre; + } + + p { + font-size: 0.875rem; + line-height: 1.125rem; + height: 1.125rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + } + } + + .emoji-small { + width: 1rem; + height: 1rem; + } + + & > img { + width: 2.25rem; + height: 2.25rem; + object-fit: cover; + border-radius: 0.25rem; + margin-left: 0.4rem; + margin-top: 0.125rem; + flex-shrink: 0; + + & + .message-text { + max-width: 12rem; + } + } + } + + .HeaderActions { + flex-shrink: 0; + margin-left: auto; + display: flex; + align-items: center; + justify-content: flex-end; + + .toggle-right-pane-button { + &.active { + color: var(--color-primary); + opacity: 1; + } + } + } + + .HeaderPinnedMessage-wrapper, .HeaderActions { + .Button { + margin-left: 0.25rem; + + &.tiny { + margin-right: .625rem; + } + } + } + + @media (max-width: 600px) { + @include mobile-header-styles(); + + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + // Force rendering in the composite layer to fix the z-index rendering issue + transform: translate3d(0, 0, 0); + } + } + + @media (min-width: 925px) and (max-width: 1149.9px) { + .HeaderPinnedMessage-wrapper, + .AudioPlayer { + position: absolute; + } + } +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/src/components/middle/MiddleHeader.tsx b/src/components/middle/MiddleHeader.tsx new file mode 100644 index 000000000..99faff837 --- /dev/null +++ b/src/components/middle/MiddleHeader.tsx @@ -0,0 +1,495 @@ +import React, { + FC, useCallback, useMemo, memo, useEffect, useRef, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; +import cycleRestrict from '../../util/cycleRestrict'; + +import { GlobalActions, MessageListType } from '../../global/types'; +import { + ApiMessage, + ApiChat, + ApiTypingStatus, + MAIN_THREAD_ID, +} from '../../api/types'; + +import { + MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN, + MOBILE_SCREEN_MAX_WIDTH, + EDITABLE_INPUT_ID, + MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, + SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, + SAFE_SCREEN_WIDTH_FOR_CHAT_INFO, +} from '../../config'; +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { + isChatPrivate, + isChatArchived, + getMessageKey, + getChatTitle, + getSenderTitle, +} from '../../modules/helpers'; +import { + selectChat, + selectChatMessage, + selectAllowedMessageActions, + selectIsRightColumnShown, + selectThreadTopMessageId, + selectThreadOriginChat, + selectThreadInfo, + selectChatMessages, + selectPinnedIds, + selectIsChatWithSelf, + selectForwardedSender, + selectScheduledIds, + selectIsInSelectMode, + selectIsChatWithBot, +} from '../../modules/selectors'; +import useEnsureMessage from '../../hooks/useEnsureMessage'; +import useWindowSize from '../../hooks/useWindowSize'; +import useShowTransition from '../../hooks/useShowTransition'; +import useCurrentOrPrev from '../../hooks/useCurrentOrPrev'; +import { pick } from '../../util/iteratees'; +import { formatIntegerCompact } from '../../util/textFormat'; +import buildClassName from '../../util/buildClassName'; +import useLang from '../../hooks/useLang'; + +import PrivateChatInfo from '../common/PrivateChatInfo'; +import GroupChatInfo from '../common/GroupChatInfo'; +import Transition from '../ui/Transition'; +import Button from '../ui/Button'; +import HeaderActions from './HeaderActions'; +import HeaderPinnedMessage from './HeaderPinnedMessage'; +import AudioPlayer from './AudioPlayer'; + +import './MiddleHeader.scss'; + +const ANIMATION_DURATION = 350; + +type OwnProps = { + chatId: number; + threadId: number; + messageListType: MessageListType; +}; + +type StateProps = { + pinnedMessageIds?: number[] | number; + messagesById?: Record; + canUnpin?: boolean; + topMessageTitle?: string; + typingStatus?: ApiTypingStatus; + isSelectModeActive?: boolean; + isLeftColumnShown?: boolean; + isRightColumnShown?: boolean; + audioMessage?: ApiMessage; + chatTitleLength?: number; + chatsById?: Record; + originChatId: number; + messagesCount?: number; + isChatWithSelf?: boolean; + isChatWithBot?: boolean; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const MiddleHeader: FC = ({ + chatId, + threadId, + messageListType, + pinnedMessageIds, + messagesById, + canUnpin, + topMessageTitle, + typingStatus, + isSelectModeActive, + isLeftColumnShown, + isRightColumnShown, + audioMessage, + chatTitleLength, + chatsById, + originChatId, + messagesCount, + isChatWithSelf, + isChatWithBot, + lastSyncTime, + openChatWithInfo, + pinMessage, + focusMessage, + openChat, + loadPinnedMessages, + toggleLeftColumn, + exitMessageSelectMode, +}) => { + const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0); + const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds; + const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined; + const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0); + + useEffect(() => { + if (threadId === MAIN_THREAD_ID && lastSyncTime) { + loadPinnedMessages({ chatId }); + } + }, [chatId, loadPinnedMessages, lastSyncTime, threadId]); + + useEffect(() => { + setPinnedMessageIndex(0); + }, [chatId]); + + // Modify index after unpinning + useEffect(() => { + setPinnedMessageIndex(pinnedMessagesCount ? cycleRestrict(pinnedMessagesCount, pinnedMessageIndex) : -1); + }, [pinnedMessagesCount, pinnedMessageIndex]); + + useEnsureMessage(chatId, pinnedMessageId, pinnedMessage); + + const { width: windowWidth } = useWindowSize(); + + const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN; + const shouldShowCloseButton = windowWidth >= MOBILE_SCREEN_MAX_WIDTH && isLeftColumnShown; + + // eslint-disable-next-line no-null/no-null + const componentRef = useRef(null); + const shouldAnimateTools = useRef(true); + + const handleHeaderClick = useCallback(() => { + openChatWithInfo({ id: chatId }); + }, [openChatWithInfo, chatId]); + + const handleUnpinMessage = useCallback((messageId: number) => { + pinMessage({ chatId, messageId, isUnpin: true }); + }, [pinMessage, chatId]); + + const handlePinnedMessageClick = useCallback((): void => { + if (pinnedMessage) { + focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id }); + + const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1); + setPinnedMessageIndex(newIndex); + } + }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]); + + const handleAllPinnedClick = useCallback(() => { + openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' }); + }, [openChat, chatId]); + + const handleBackClick = useCallback(() => { + if (IS_MOBILE_SCREEN) { + const messageInput = document.getElementById(EDITABLE_INPUT_ID); + if (messageInput) { + messageInput.blur(); + } + } + if (threadId === MAIN_THREAD_ID && messageListType === 'thread') { + if (IS_MOBILE_SCREEN) { + openChat({ id: undefined }); + } else { + toggleLeftColumn(); + } + + return; + } + + if (messageListType === 'scheduled' && isSelectModeActive) { + exitMessageSelectMode(); + } + openChat({ id: originChatId, threadId: MAIN_THREAD_ID }); + }, [openChat, originChatId, threadId, messageListType, toggleLeftColumn, isSelectModeActive, exitMessageSelectMode]); + + const unreadCount = useMemo(() => { + if (!isLeftColumnHideable || !chatsById) { + return undefined; + } + + let isActive = false; + + const totalCount = Object.values(chatsById).reduce((total, chat) => { + if (isChatArchived(chat)) { + return total; + } + + const count = chat.unreadCount || 0; + if (count && (!chat.isMuted || chat.unreadMentionsCount)) { + isActive = true; + } + + return total + count; + }, 0); + + if (!totalCount) { + return undefined; + } + + return { + isActive, + totalCount, + }; + }, [isLeftColumnHideable, chatsById]); + + const canToolsCollideWithChatInfo = ( + windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN + && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO + ) || ( + windowWidth > MOBILE_SCREEN_MAX_WIDTH + && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN + && (!chatTitleLength || chatTitleLength > 30) + ); + const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || ( + windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN + && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN + ); + + const { + shouldRender: shouldRenderAudioPlayer, + transitionClassNames: audioPlayerClassNames, + } = useShowTransition(Boolean(audioMessage)); + + const renderingAudioMessage = useCurrentOrPrev(audioMessage); + + const { + shouldRender: shouldRenderPinnedMessage, + transitionClassNames: pinnedMessageClassNames, + } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer); + + const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage); + const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle); + + const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage) + || (shouldRenderAudioPlayer && renderingAudioMessage); + + // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens + useEffect(() => { + const componentEl = componentRef.current; + if (!componentEl) { + return; + } + + if (!shouldUseStackedToolsClass || !canRevealTools) { + componentEl.classList.remove('tools-stacked', 'animated'); + shouldAnimateTools.current = true; + return; + } + + if (isRightColumnShown || canToolsCollideWithChatInfo) { + if (shouldAnimateTools.current) { + componentEl.classList.add('tools-stacked', 'animated'); + shouldAnimateTools.current = false; + } + + // Remove animation class to prevent it messing up the show transitions + setTimeout(() => { + componentEl.classList.remove('animated'); + }, ANIMATION_DURATION); + } else { + componentEl.classList.remove('tools-stacked'); + shouldAnimateTools.current = true; + } + }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]); + + const lang = useLang(); + + function renderInfo() { + return ( + messageListType === 'thread' && threadId === MAIN_THREAD_ID ? ( + renderMainThreadInfo() + ) : messageListType === 'thread' ? ( + <> + {renderBackButton()} +

    + {lang('CommentsCount', messagesCount)} +

    + + ) : messageListType === 'pinned' ? ( + <> + {renderBackButton()} +

    + {lang('PinnedMessagesCount', messagesCount)} +

    + + ) : messageListType === 'scheduled' ? ( + <> + {renderBackButton()} +

    + {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)} +

    + + ) : undefined + ); + } + + function renderMainThreadInfo() { + return ( + <> + {isLeftColumnHideable && renderBackButton(shouldShowCloseButton, unreadCount)} +
    + {isChatPrivate(chatId) ? ( + + ) : ( + + )} +
    + + ); + } + + function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) { + return ( +
    + + {unreadCountInfo && ( +
    + {formatIntegerCompact(unreadCountInfo.totalCount)} +
    + )} +
    + ); + } + + return ( +
    + + {renderInfo} + + +
    + {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && ( + + )} + {shouldRenderAudioPlayer && renderingAudioMessage && ( + + )} + +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId, threadId, messageListType }): StateProps => { + const { isLeftColumnShown, lastSyncTime } = global; + const { byId: chatsById } = global.chats; + const chat = selectChat(global, chatId); + + const { typingStatus } = chat || {}; + + const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer; + const audioMessage = audioChatId && audioMessageId + ? selectChatMessage(global, audioChatId, audioMessageId) + : undefined; + + const originChat = selectThreadOriginChat(global, chatId, threadId); + + let messagesCount: number | undefined; + if (messageListType === 'pinned') { + const pinnedIds = selectPinnedIds(global, chatId); + messagesCount = pinnedIds && pinnedIds.length; + } else if (messageListType === 'scheduled') { + const scheduledIds = selectScheduledIds(global, chatId); + messagesCount = scheduledIds && scheduledIds.length; + } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) { + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (threadInfo) { + messagesCount = threadInfo.messagesCount; + } + } + + let state: StateProps = { + typingStatus, + isLeftColumnShown, + isRightColumnShown: selectIsRightColumnShown(global), + isSelectModeActive: selectIsInSelectMode(global), + audioMessage, + chatTitleLength: chat && getChatTitle(chat).length, + chatsById, + originChatId: originChat ? originChat.id : chatId, + messagesCount, + isChatWithSelf: selectIsChatWithSelf(global, chatId), + isChatWithBot: chat && selectIsChatWithBot(global, chat), + lastSyncTime, + }; + + const messagesById = selectChatMessages(global, chatId); + if (messageListType === 'thread' && messagesById) { + if (threadId === MAIN_THREAD_ID) { + const pinnedMessageIds = selectPinnedIds(global, chatId); + + if (pinnedMessageIds && pinnedMessageIds.length) { + const firstPinnedMessage = messagesById[pinnedMessageIds[0]]; + const { + canUnpin, + } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {}; + state = { + ...state, + pinnedMessageIds, + messagesById, + canUnpin, + }; + } + } else { + const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId); + const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined; + const sender = message ? selectForwardedSender(global, message) : undefined; + const topMessageTitle = sender ? getSenderTitle(sender) : undefined; + + state = { + ...state, + pinnedMessageIds: pinnedMessageId, + messagesById, + canUnpin: false, + topMessageTitle, + }; + } + } + + return state; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChatWithInfo', + 'pinMessage', + 'focusMessage', + 'openChat', + 'loadPinnedMessages', + 'toggleLeftColumn', + 'exitMessageSelectMode', + ]), +)(MiddleHeader)); diff --git a/src/components/middle/MobileSearch.async.tsx b/src/components/middle/MobileSearch.async.tsx new file mode 100644 index 000000000..e6d73ba36 --- /dev/null +++ b/src/components/middle/MobileSearch.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './MobileSearch'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const MobileSearchAsync: FC = (props) => { + const { isActive } = props; + const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true); + + // eslint-disable-next-line react/jsx-props-no-spreading + return MobileSearch ? : undefined; +}; + +export default MobileSearchAsync; diff --git a/src/components/middle/MobileSearch.scss b/src/components/middle/MobileSearch.scss new file mode 100644 index 000000000..c26fae35f --- /dev/null +++ b/src/components/middle/MobileSearch.scss @@ -0,0 +1,43 @@ +#MobileSearch > .header { + position: absolute; + top: 0; + left: 0; + z-index: var(--z-mobile-search); + width: 100%; + height: 3.5rem; + background: white; + display: flex; + align-items: center; + padding: 0 0.5rem 0 0.25rem; + + > .SearchInput { + margin-left: 0.25rem; + flex: 1; + } +} + +#MobileSearch > .footer { + position: absolute; + bottom: 0; + left: 0; + z-index: var(--z-mobile-search); + width: 100%; + height: 3.5rem; + background: white; + display: flex; + align-items: center; + padding-left: 1rem; + padding-right: 0.5rem; + + > .counter { + flex: 1; + color: var(--color-text-secondary); + } +} + +#MobileSearch:not(.active) { + .header, .footer { + // `display: none` will prevent synchronous focus on iOS + transform: translateX(-999rem); + } +} diff --git a/src/components/middle/MobileSearch.tsx b/src/components/middle/MobileSearch.tsx new file mode 100644 index 000000000..0f6c4d039 --- /dev/null +++ b/src/components/middle/MobileSearch.tsx @@ -0,0 +1,242 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiChat } from '../../api/types'; +import { GlobalActions } from '../../global/types'; + +import { debounce } from '../../util/schedulers'; +import { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import useFlag from '../../hooks/useFlag'; +import useLang from '../../hooks/useLang'; + +import Button from '../ui/Button'; +import SearchInput from '../ui/SearchInput'; +import CalendarModal from '../common/CalendarModal'; + +import './MobileSearch.scss'; + +export type OwnProps = { + isActive: boolean; +}; + +type StateProps = { + isActive?: boolean; + chat?: ApiChat; + query?: string; + totalCount?: number; + foundIds?: number[]; +}; + +type DispatchProps = Pick; + +const runDebouncedForSearch = debounce((cb) => cb(), 200, false); + +const MobileSearchFooter: FC = ({ + isActive, + chat, + query, + totalCount, + foundIds, + setLocalTextSearchQuery, + searchTextMessagesLocal, + focusMessage, + closeLocalTextSearch, + searchMessagesByDate, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + const [focusedIndex, setFocusedIndex] = useState(0); + const [isCalendarOpen, openCalendar, closeCalendar] = useFlag(); + + // Fix for iOS keyboard + useEffect(() => { + const { visualViewport } = window as any; + if (!visualViewport) { + return undefined; + } + + const mainEl = document.getElementById('Main') as HTMLDivElement; + const handleResize = () => { + const { activeElement } = document; + if (activeElement && (activeElement === inputRef.current)) { + const { pageTop, height } = visualViewport; + mainEl.style.transform = `translateY(${pageTop}px)`; + mainEl.style.height = `${height}px`; + document.documentElement.scrollTop = pageTop; + } else { + mainEl.style.transform = ''; + mainEl.style.height = ''; + } + }; + + visualViewport.addEventListener('resize', handleResize); + + return () => { + visualViewport.removeEventListener('resize', handleResize); + }; + }, []); + + // Focus message + useEffect(() => { + if (chat && foundIds && foundIds.length) { + focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] }); + setFocusedIndex(0); + } else { + setFocusedIndex(-1); + } + }, [chat, focusMessage, foundIds]); + + // Disable native up/down buttons on iOS + useEffect(() => { + Array.from(document.querySelectorAll('input')).forEach((input) => { + input.disabled = Boolean(isActive && input !== inputRef.current); + }); + + Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => { + div.contentEditable = isActive ? 'false' : 'true'; + }); + }, [isActive]); + + // Blur on exit + useEffect(() => { + if (!isActive) { + inputRef.current!.blur(); + } + }, [isActive]); + + useLayoutEffect(() => { + const searchInput = document.querySelector('#MobileSearch input')!; + searchInput.blur(); + }, [isCalendarOpen]); + + const handleMessageSearchQueryChange = useCallback((newQuery: string) => { + setLocalTextSearchQuery({ query: newQuery }); + + if (newQuery.length) { + runDebouncedForSearch(searchTextMessagesLocal); + } + }, [searchTextMessagesLocal, setLocalTextSearchQuery]); + + const handleJumpToDate = useCallback((date: Date) => { + searchMessagesByDate({ timestamp: date.valueOf() / 1000 }); + closeCalendar(); + }, [closeCalendar, searchMessagesByDate]); + + const handleUp = useCallback(() => { + if (chat && foundIds) { + const newFocusIndex = focusedIndex + 1; + focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] }); + setFocusedIndex(newFocusIndex); + } + }, [chat, focusedIndex, focusMessage, foundIds]); + + const handleDown = useCallback(() => { + if (chat && foundIds) { + const newFocusIndex = focusedIndex - 1; + focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] }); + setFocusedIndex(newFocusIndex); + } + }, [chat, focusedIndex, focusMessage, foundIds]); + + const lang = useLang(); + + return ( +
    +
    + + +
    +
    +
    + {query ? ( + foundIds && foundIds.length ? ( + `${focusedIndex + 1} of ${totalCount}` + ) : foundIds && !foundIds.length ? ( + 'No results' + ) : ( + '' + ) + ) : ( + + )} +
    + + +
    + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const chat = selectCurrentChat(global); + if (!chat) { + return {}; + } + + const { query, results } = selectCurrentTextSearch(global) || {}; + const { totalCount, foundIds } = results || {}; + + return { + chat, + query, + totalCount, + foundIds, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setLocalTextSearchQuery', + 'searchTextMessagesLocal', + 'focusMessage', + 'closeLocalTextSearch', + 'searchMessagesByDate', + ]), +)(MobileSearchFooter)); diff --git a/src/components/middle/PinnedMessageNavigation.tsx b/src/components/middle/PinnedMessageNavigation.tsx new file mode 100644 index 000000000..e95afeeb6 --- /dev/null +++ b/src/components/middle/PinnedMessageNavigation.tsx @@ -0,0 +1,223 @@ +import React, { + FC, + useRef, + useEffect, + useMemo, + memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +type OwnProps = { + count: number; + index: number; +}; + +const BORDER_MASK_LEVEL = 4; + +const PinnedMessageNavigation: FC = ({ + count, index, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const markupParams = useMemo(() => { + return calculateMarkup(count, index); + }, [count, index]); + + useEffect(() => { + if (!containerRef.current) { + return; + } + + const { + trackHeight, + trackTranslateY, + markHeight, + markTranslateY, + clipPathId, + clipPath, + } = markupParams; + + const firstChild = containerRef.current.firstElementChild; + if (containerRef && containerRef.current) { + const currentElement = containerRef.current; + const { style } = currentElement; + style.height = `${trackHeight}px`; + style.transform = `translateY(-${trackTranslateY}px)`; + style.clipPath = `url("#${clipPathId}")`; + const svg = currentElement.querySelector('svg'); + const div = currentElement.querySelector('div'); + const defs = currentElement.querySelector('defs'); + if (!svg) { + if (firstChild) { + firstChild.innerHTML = ` ${clipPath} `; + } + } + if (defs) { + defs.innerHTML = clipPath; + } + if (div) { + div.style.height = `${markHeight}px`; + div.style.transform = `translateY(${markTranslateY}px)`; + } + } + }, [markupParams]); + + if (count === 1) { + return ( +
    +
    +
    + ); + } + + const { + trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId, + } = markupParams; + + return ( +
    BORDER_MASK_LEVEL && 'pinned-message-border-mask')}> +
    + +
    +
    +
    + ); +}; + +function calculateMarkup(count: number, index: number) { + const reverseIndex = count - index - 1; + const barHeight = getBarHeight(count); + const markHeight = getMarkHeight(count, reverseIndex); + const trackHeight = getTrackHeight(count, barHeight); + + const clipPathId = `clipPath${count}`; + const clipPath = getClipPath(clipPathId, barHeight, count); + + const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count); + const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight); + return { + markHeight, + clipPath, + markTranslateY, + trackTranslateY, + trackHeight, + clipPathId, + }; +} + +function getBarHeight(count: number): number { + let barHeight = 8; + if (count === 1) { + barHeight = 36; + } else if (count === 2) { + barHeight = 17; + } else if (count === 3) { + barHeight = 11; + } else if (count === 4) { + barHeight = 7.5; + } else if (count > 3) { + barHeight = 7.5; + } + + return barHeight; +} + +function getMarkHeight(count: number, index: number) { + let barHeight = 36; + if (count === 1) { + barHeight = 36; + } else if (count === 2) { + barHeight = 17; + } else if (count === 3) { + barHeight = index === 1 ? 12 : 11; + } else if (count === 4) { + barHeight = 7.5; + } else if (count > 3) { + barHeight = 7.5; + } + + return barHeight; +} + +function getTrackHeight(count: number, barHeight: number) { + return count <= 3 ? 36 : barHeight * count + 2 * (count - 1); +} + +function getClipPath(id: string, barHeight: number, count: number) { + const radius = 1; + + let d = ''; + if (count === 3) { + d = drawRect(0, 0, 2, barHeight, radius) + + drawRect(0, 12, 2, barHeight + 1, radius) + + drawRect(0, 25, 2, barHeight, radius); + } else { + for (let i = 0; i < count; i++) { + d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius); + } + } + + return ( + ` + + ` + ); +} + +function drawRect(x: number, y: number, width: number, height: number, radius: number) { + return `M${x},${y + radius}a${radius},${radius},0,0,1, + ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`; +} + +function getMarkTranslateY(index: number, barHeight: number, count: number) { + if (count === 1) { + return 0; + } else if (count === 2) { + return index === 0 ? 0 : barHeight + 2; + } + + if (count === 3) { + if (index === 0) { + return 0; + } else if (index === 1) { + return 12; + } + + return 25; + } else { + return (barHeight + 2) * index; + } +} + +function getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) { + if (count <= 4) { + return 0; + } + + if (index <= 1) { + return 0; + } else if (index >= count - 2) { + return trackHeight - 36; + } + + return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2); +} + +export default memo(PinnedMessageNavigation); diff --git a/src/components/middle/ScrollDownButton.scss b/src/components/middle/ScrollDownButton.scss new file mode 100644 index 000000000..ef7d28b4a --- /dev/null +++ b/src/components/middle/ScrollDownButton.scss @@ -0,0 +1,99 @@ +.ScrollDownButton { + --base-bottom-pos: 6rem; + + position: absolute; + bottom: var(--base-bottom-pos); + right: 1rem; + opacity: 0; + transform: translateY(4.5rem); + transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1), opacity .2s ease; + z-index: 10; + pointer-events: none; + + body.animation-level-0 & { + transform: none !important; + + transition: opacity .15s; + } + + @media (max-width: 600px) { + right: 0.5rem; + bottom: 4.5rem; + } + + &-inner { + display: flex; + flex-direction: column; + align-items: center; + + > .Button { + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + + i { + font-size: 1.75rem; + } + } + + @media (min-width: 1276px) { + transform: translateX(0); + + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none !important; + } + + #Main.right-column-open & { + transform: translateX(calc(-1 * var(--right-column-width))); + } + } + + @media (max-width: 600px) { + > .Button { + width: 2.875rem; + height: 2.875rem; + } + } + } + + &.revealed { + transform: translateY(0); + opacity: 1; + pointer-events: all; + + &.no-composer { + transform: translateY(2.5rem); + } + } + + .unread-count { + min-width: 1.5rem; + height: 1.5rem; + padding: 0 .45rem; + border-radius: 0.75rem; + font-size: 0.875rem; + line-height: 1.5rem; + font-weight: 500; + text-align: center; + + position: absolute; + top: -0.3rem; + right: -0.3rem; + + background: var(--color-green); + color: white; + + pointer-events: none; + + @media (max-width: 600px) { + top: -0.7rem; + right: auto; + } + } + + @media (max-width: 600px) { + body.is-symbol-menu-open & { + bottom: calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height)); + } + } +} diff --git a/src/components/middle/ScrollDownButton.tsx b/src/components/middle/ScrollDownButton.tsx new file mode 100644 index 000000000..8870269c4 --- /dev/null +++ b/src/components/middle/ScrollDownButton.tsx @@ -0,0 +1,106 @@ +import React, { + FC, useCallback, memo, useRef, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions, MessageListType } from '../../global/types'; +import { MAIN_THREAD_ID } from '../../api/types'; + +import { selectChat, selectCurrentMessageList } from '../../modules/selectors'; +import { getCanPostInChat } from '../../modules/helpers'; +import { formatIntegerCompact } from '../../util/textFormat'; +import buildClassName from '../../util/buildClassName'; +import { pick } from '../../util/iteratees'; +import fastSmoothScroll from '../../util/fastSmoothScroll'; + +import Button from '../ui/Button'; + +import './ScrollDownButton.scss'; + +type OwnProps = { + isShown: boolean; +}; + +type StateProps = { + messageListType?: MessageListType; + canPost?: boolean; + unreadCount?: number; +}; + +type DispatchProps = Pick; + +const FOCUS_MARGIN = 20; + +const ScrollDownButton: FC = ({ + isShown, + messageListType, + canPost, + unreadCount, + focusLastMessage, +}) => { + // eslint-disable-next-line no-null/no-null + const elementRef = useRef(null); + + const handleClick = useCallback(() => { + if (!isShown) { + return; + } + + if (messageListType === 'thread') { + focusLastMessage(); + } else { + const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!; + const messsageElements = messagesContainer.querySelectorAll('.message-list-item'); + const lastMessageElement = messsageElements[messsageElements.length - 1]; + if (!lastMessageElement) { + return; + } + + fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN); + } + }, [isShown, messageListType, focusLastMessage]); + + const fabClassName = buildClassName( + 'ScrollDownButton', + isShown && 'revealed', + !canPost && 'no-composer', + ); + + return ( +
    +
    + + {Boolean(unreadCount) && ( +
    {formatIntegerCompact(unreadCount!)}
    + )} +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return {}; + } + + const { chatId, threadId, type: messageListType } = currentMessageList; + const chat = selectChat(global, chatId); + const canPost = chat && getCanPostInChat(chat, threadId); + + return { + messageListType, + canPost, + unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['focusLastMessage']), +)(ScrollDownButton)); diff --git a/src/components/middle/composer/AttachMenu.async.tsx b/src/components/middle/composer/AttachMenu.async.tsx new file mode 100644 index 000000000..f183d78ab --- /dev/null +++ b/src/components/middle/composer/AttachMenu.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './AttachMenu'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const AttachMenuAsync: FC = (props) => { + const { isOpen } = props; + const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return AttachMenu ? : undefined; +}; + +export default AttachMenuAsync; diff --git a/src/components/middle/composer/AttachMenu.scss b/src/components/middle/composer/AttachMenu.scss new file mode 100644 index 000000000..e306bd4ab --- /dev/null +++ b/src/components/middle/composer/AttachMenu.scss @@ -0,0 +1,18 @@ +.AttachMenu { + position: relative; + + .is-pointer-env & { + > .backdrop { + position: absolute; + top: -1rem; + left: auto; + right: 0; + width: 3.5rem; + } + } + + + .media-disabled > button { + white-space: normal; + } +} diff --git a/src/components/middle/composer/AttachMenu.tsx b/src/components/middle/composer/AttachMenu.tsx new file mode 100644 index 000000000..d2a9250c1 --- /dev/null +++ b/src/components/middle/composer/AttachMenu.tsx @@ -0,0 +1,84 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; + +import { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config'; +import { IS_TOUCH_ENV } from '../../../util/environment'; +import { openSystemFilesDialog } from '../../../util/systemFilesDialog'; +import { IAllowedAttachmentOptions } from '../../../modules/helpers'; +import useMouseInside from '../../../hooks/useMouseInside'; +import useLang from '../../../hooks/useLang'; + +import Menu from '../../ui/Menu'; +import MenuItem from '../../ui/MenuItem'; + +import './AttachMenu.scss'; + +export type OwnProps = { + isOpen: boolean; + allowedAttachmentOptions: IAllowedAttachmentOptions; + onFileSelect: (files: File[], isQuick: boolean) => void; + onPollCreate: () => void; + onClose: () => void; +}; + +const AttachMenu: FC = ({ + isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose, +}) => { + const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose); + + const handleFileSelect = useCallback((e: Event, isQuick: boolean) => { + const { files } = e.target as HTMLInputElement; + + if (files && files.length > 0) { + onFileSelect(Array.from(files), isQuick); + } + }, [onFileSelect]); + + const handleQuickSelect = useCallback(() => { + openSystemFilesDialog( + CONTENT_TYPES_FOR_QUICK_UPLOAD, + (e) => handleFileSelect(e, true), + ); + }, [handleFileSelect]); + + const handleDocumentSelect = useCallback(() => { + openSystemFilesDialog('*', (e) => handleFileSelect(e, false)); + }, [handleFileSelect]); + + const lang = useLang(); + + const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions; + + return ( + + {/* + ** Using ternary operator here causes some attributes from first clause + ** transferring to the fragment content in the second clause + */} + {!canAttachMedia && ( + Posting media content is not allowed in this group. + )} + {canAttachMedia && ( + <> + {lang('AttachmentMenu.PhotoOrVideo')} + Document + + )} + {canAttachPolls && ( + {lang('Poll')} + )} + + ); +}; + +export default memo(AttachMenu); diff --git a/src/components/middle/composer/AttachmentModal.async.tsx b/src/components/middle/composer/AttachmentModal.async.tsx new file mode 100644 index 000000000..a40feb0a1 --- /dev/null +++ b/src/components/middle/composer/AttachmentModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './AttachmentModal'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const AttachmentModalAsync: FC = (props) => { + const { attachments } = props; + const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length); + + // eslint-disable-next-line react/jsx-props-no-spreading + return AttachmentModal ? : undefined; +}; + +export default AttachmentModalAsync; diff --git a/src/components/middle/composer/AttachmentModal.scss b/src/components/middle/composer/AttachmentModal.scss new file mode 100644 index 000000000..c395ac70a --- /dev/null +++ b/src/components/middle/composer/AttachmentModal.scss @@ -0,0 +1,77 @@ +.AttachmentModal { + --border-radius-default: 0.625rem; + + .modal-dialog { + max-width: 26.25rem; + @media(max-width: 600px) { + max-height: 100%; + padding-bottom: 1.5rem; + } + } + + .modal-content { + padding: .5rem 1.25rem 1.875rem; + max-height: calc(100vh - 3.25rem); + @media(max-width: 600px) { + padding-bottom: .25rem; + } + } + + .media-wrapper { + max-height: 26rem; + overflow: auto; + display: flex; + flex-wrap: wrap; + margin-bottom: 1.5rem; + + video, + img { + flex: 1; + width: calc(50% - 0.15rem); + height: 12rem; + margin-bottom: 0.3rem; + border-radius: var(--border-radius-default); + object-fit: cover; + + &:only-child { + height: auto; + max-height: 25rem; + margin-bottom: 0; + } + + &:nth-child(even) { + margin-left: 0.3rem; + } + } + } + + .document-wrapper { + max-height: 25rem; + overflow: auto; + flex-shrink: 0; + display: flex; + flex-direction: column; + margin: .75rem 0 1.75rem; + + .File:not(:last-child) { + margin-bottom: 1.5rem; + } + + .file-icon { + cursor: default !important; + } + } + + .attachment-caption-wrapper { + position: relative; + + .form-control { + background: white; + } + + .MentionMenu { + right: 0 !important; + z-index: 0; + } + } +} diff --git a/src/components/middle/composer/AttachmentModal.tsx b/src/components/middle/composer/AttachmentModal.tsx new file mode 100644 index 000000000..0568786ea --- /dev/null +++ b/src/components/middle/composer/AttachmentModal.tsx @@ -0,0 +1,161 @@ +import React, { + FC, memo, useCallback, useEffect, +} from '../../../lib/teact/teact'; + +import { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types'; +import { EDITABLE_INPUT_MODAL_ID } from '../../../config'; + +import { getFileExtension } from '../../common/helpers/documentInfo'; +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import usePrevious from '../../../hooks/usePrevious'; +import useMentionMenu from './hooks/useMentionMenu'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; +import Modal from '../../ui/Modal'; +import File from '../../common/File'; +import MessageInput from './MessageInput'; +import MentionMenu from './MentionMenu'; + +import './AttachmentModal.scss'; + +export type OwnProps = { + attachments: ApiAttachment[]; + caption: string; + canSuggestMembers?: boolean; + currentUserId?: number; + groupChatMembers?: ApiChatMember[]; + usersById?: Record; + onCaptionUpdate: (html: string) => void; + onSend: () => void; + onClear: () => void; +}; + +const AttachmentModal: FC = ({ + attachments, + caption, + canSuggestMembers, + groupChatMembers, + currentUserId, + usersById, + onCaptionUpdate, + onSend, + onClear, +}) => { + const prevAttachments = usePrevious(attachments); + const renderingAttachments = attachments.length ? attachments : prevAttachments; + const isOpen = Boolean(attachments.length); + + const { + isMentionMenuOpen, mentionFilter, + closeMentionMenu, insertMention, + mentionFilteredMembers, + } = useMentionMenu( + canSuggestMembers && isOpen, + caption, + onCaptionUpdate, + EDITABLE_INPUT_MODAL_ID, + groupChatMembers, + currentUserId, + usersById, + ); + + useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]); + + const sendAttachments = useCallback(() => { + if (isOpen) { + onSend(); + } + }, [isOpen, onSend]); + + const lang = useLang(); + + if (!renderingAttachments) { + return undefined; + } + + const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/')); + const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/')); + + let title = ''; + if (areAllPhotos) { + title = renderingAttachments.length === 1 ? 'Send Photo' : `Send ${renderingAttachments.length} Photos`; + } else if (areAllVideos) { + title = renderingAttachments.length === 1 ? 'Send Video' : `Send ${renderingAttachments.length} Videos`; + } else { + title = renderingAttachments.length === 1 ? 'Send File' : `Send ${renderingAttachments.length} Files`; + } + + const isQuick = renderingAttachments.every((a) => a.quick); + + function renderHeader() { + if (!renderingAttachments) { + return undefined; + } + + return ( +
    + +
    {title}
    + +
    + ); + } + + return ( + + {isQuick ? ( +
    + {renderingAttachments.map((attachment) => ( + attachment.mimeType.startsWith('image/') + ? + :
    + ) : ( +
    + {renderingAttachments.map((attachment) => ( + + ))} +
    + )} + +
    + + +
    +
    + ); +}; + +export default memo(AttachmentModal); diff --git a/src/components/middle/composer/BotKeyboardMenu.async.tsx b/src/components/middle/composer/BotKeyboardMenu.async.tsx new file mode 100644 index 000000000..8258875bb --- /dev/null +++ b/src/components/middle/composer/BotKeyboardMenu.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './BotKeyboardMenu'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const BotKeyboardMenuAsync: FC = (props) => { + const { isOpen } = props; + const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return BotKeyboardMenu ? : undefined; +}; + +export default BotKeyboardMenuAsync; diff --git a/src/components/middle/composer/BotKeyboardMenu.scss b/src/components/middle/composer/BotKeyboardMenu.scss new file mode 100644 index 000000000..a459fbe2e --- /dev/null +++ b/src/components/middle/composer/BotKeyboardMenu.scss @@ -0,0 +1,50 @@ +.KeyboardMenu { + .bubble { + width: 100% !important; + max-width: 27rem; + border-radius: var(--border-radius-default-small); + } + + .content { + display: flex; + flex-direction: column; + padding: .1875rem .625rem; + max-height: 80vh; + overflow: auto; + + @media (max-width: 600px) { + max-height: 75vh; + } + + .row { + display: flex; + flex-direction: row; + } + + .row + .row { + margin-top: .375rem; + } + + .Button { + flex: 1; + width: auto; + height: auto; + min-height: 3.0625rem; + border-radius: var(--border-radius-messages-small); + border: 2px solid var(--color-primary); + background: #fff; + color: var(--color-primary); + font-weight: 500; + text-transform: none; + + &:hover { + color: #fff; + border-color: var(--color-primary-shade); + } + } + + .Button + .Button { + margin-left: .375rem; + } + } +} diff --git a/src/components/middle/composer/BotKeyboardMenu.tsx b/src/components/middle/composer/BotKeyboardMenu.tsx new file mode 100644 index 000000000..b17a69373 --- /dev/null +++ b/src/components/middle/composer/BotKeyboardMenu.tsx @@ -0,0 +1,82 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiMessage } from '../../../api/types'; + +import { IS_TOUCH_ENV } from '../../../util/environment'; +import { pick } from '../../../util/iteratees'; +import { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors'; +import useMouseInside from '../../../hooks/useMouseInside'; + +import Menu from '../../ui/Menu'; +import Button from '../../ui/Button'; + +import './BotKeyboardMenu.scss'; + +export type OwnProps = { + isOpen: boolean; + messageId: number; + onClose: NoneToVoidFunction; +}; + +type StateProps = { + message?: ApiMessage; +}; + +type DispatchProps = Pick; + +const BotKeyboardMenu: FC = ({ + isOpen, message, onClose, clickInlineButton, +}) => { + const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose); + + if (!message || !message.keyboardButtons) { + return undefined; + } + + return ( + +
    + {message.keyboardButtons.map((row) => ( +
    + {row.map((button) => ( + + ))} +
    + ))} +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { messageId }): StateProps => { + const { chatId } = selectCurrentMessageList(global) || {}; + if (!chatId) { + return {}; + } + + return { message: selectChatMessage(global, chatId, messageId) }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'clickInlineButton', + ]), +)(BotKeyboardMenu)); diff --git a/src/components/middle/composer/Composer.scss b/src/components/middle/composer/Composer.scss new file mode 100644 index 000000000..fc95ec6c2 --- /dev/null +++ b/src/components/middle/composer/Composer.scss @@ -0,0 +1,369 @@ +.Composer { + align-items: flex-end; + + .select-mode-active + .middle-column-footer & { + @media (min-width: 601px) { + position: absolute; + padding-right: 2rem; + margin-top: -.5rem; + } + + @media (max-width: 600px) { + padding-right: 1rem; + } + + &::before { + right: 2.125rem; + + @media (max-width: 600px) { + right: 1rem; + } + } + } + + .hide-mask-shadow &::before { + opacity: 0 !important; + } + + > .Button { + flex-shrink: 0; + margin-left: .5rem; + + @media (max-width: 600px) { + width: 2.875rem; + height: 2.875rem; + } + + .icon-send, + .icon-microphone-alt, + .icon-check { + position: absolute; + } + + &:not(:active):not(:focus):not(:hover) { + .icon-send, + .icon-check { + color: var(--color-primary); + } + } + + &.cancel { + position: relative; + z-index: 1; + + &:hover, &.active { + background: var(--color-chat-hover); + } + } + + &.recording { + position: relative; + z-index: 0; + transition: box-shadow .1s; + } + + &.send { + .icon-send { + animation: grow-icon .4s ease-out; + } + + .icon-microphone-alt, + .icon-check { + animation: hide-icon .4s forwards ease-out; + } + } + + &.record { + .icon-microphone-alt { + animation: grow-icon .4s ease-out; + } + + .icon-send, + .icon-check { + animation: hide-icon .4s forwards ease-out; + } + } + + &.edit { + .icon-send, + .icon-microphone-alt { + animation: hide-icon .4s forwards ease-out; + } + + .icon-check { + animation: grow-icon .4s ease-out; + } + } + + body.animation-level-0 &, body.animation-level-1 & { + .icon-send, .icon-microphone-alt, .icon-check { + animation-duration: 0ms !important; + } + } + } + + .mobile-symbol-menu-button { + width: 2.875rem; + height: 2.875rem; + position: relative; + + .icon-smile, + .icon-keyboard, + .Spinner { + position: absolute; + } + + .Spinner { + --spinner-size: 1.5rem; + } + + .icon-smile { + animation: grow-icon .4s ease-out; + } + + .icon-keyboard, .Spinner { + animation: hide-icon .4s forwards ease-out; + } + + &.is-loading { + .Spinner { + animation: grow-icon .4s ease-out; + } + + .icon-keyboard, .icon-smile { + animation: hide-icon .4s forwards ease-out; + } + } + + &.menu-opened { + .icon-keyboard { + animation: grow-icon .4s ease-out; + } + + .icon-smile, .Spinner { + animation: hide-icon .4s forwards ease-out; + } + } + } +} + +#message-compose { + flex-grow: 1; + max-width: calc(100% - 4rem); + background: white; + border-radius: var(--border-radius-messages); + border-bottom-right-radius: 0; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + position: relative; + z-index: 1; + + &::before { + content: ''; + display: block; + position: absolute; + bottom: -.1875rem; + right: -.5625rem; + width: .5625rem; + height: 1.25rem; + // background-image: url('../../../../assets/chat-bubble-white.svg'); + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOSIgaGVpZ2h0PSIyMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PGZpbHRlciB4PSItNTAlIiB5PSItMTQuNyUiIHdpZHRoPSIyMDAlIiBoZWlnaHQ9IjE0MS4yJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iYSI+PGZlT2Zmc2V0IGR5PSIxIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIi8+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMSIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIi8+PGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAuMDYyMTk2MjQ4MiAwIDAgMCAwIDAuMTM4NTc0MTQ0IDAgMCAwIDAgMC4xODUwMzczNjQgMCAwIDAgMC4xNSAwIiBpbj0ic2hhZG93Qmx1ck91dGVyMSIvPjwvZmlsdGVyPjxwYXRoIGQ9Ik0zIDE3aDZWMGMtLjE5MyAyLjg0LS44NzYgNS43NjctMi4wNSA4Ljc4Mi0uOTA0IDIuMzI1LTIuNDQ2IDQuNDg1LTQuNjI1IDYuNDhBMSAxIDAgMDAzIDE3eiIgaWQ9ImIiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNhKSIgeGxpbms6aHJlZj0iI2IiLz48dXNlIGZpbGw9IiNGRkYiIHhsaW5rOmhyZWY9IiNiIi8+PC9nPjwvc3ZnPg==); + background-position: bottom left; + transform: scaleX(-1); + } + + @media (max-width: 600px) { + max-width: calc(100% - 3rem); + } +} + +.message-input-wrapper { + display: flex; + + > .Button { + flex-shrink: 0; + background: none !important; + width: 3.375rem; + height: 3.375rem; + margin: 0; + padding: 0.625rem; + align-self: flex-end; + + @media (max-width: 600px) { + width: 2.875rem; + height: 2.875rem; + margin: 0 0.25rem; + } + + + .Button { + margin-left: -.25rem; + } + + &.scheduled-button i::after { + content: ''; + position: absolute; + top: .75rem; + right: .75rem; + border: .1875rem solid #fff; + box-sizing: content-box; + width: .5rem; + height: .5rem; + border-radius: 50%; + background: var(--color-green-darker); + box-shadow: -.375rem -.25rem 0 -.1875rem #fff; + @media (max-width: 600px) { + top: .5rem; + right: .5rem; + } + } + } + + > .input-group { + flex-grow: 1; + margin-bottom: 0; + } + + .recording-state { + display: inline-block; + position: relative; + line-height: 3.5rem; + height: 3.5rem; + padding: 0 3.125rem 0 1rem; + + &::after { + content: ''; + width: 10px; + height: 10px; + background: var(--color-error); + border-radius: 5px; + position: absolute; + top: 50%; + margin-top: -5px; + right: 1.375rem; + } + + @media (max-width: 600px) { + height: 2.875rem; + line-height: 2.875rem; + } + } +} + +#message-input-text, +#caption-input-text { + position: relative; + + .form-control { + padding-top: calc(1rem - var(--border-width)); + padding-bottom: calc(1rem - var(--border-width)); + overflow: hidden; + line-height: 1.5rem; + + &.overflown { + overflow-y: auto; + overflow-x: hidden; + } + + &.touched, &:focus { + & + .placeholder-text { + display: none; + } + } + + &.focus-disabled { + pointer-events: none; + } + } + + .placeholder-text { + position: absolute; + bottom: 1rem; + color: var(--color-placeholders); + pointer-events: none; + + @media (max-width: 600px) { + bottom: 0.6875rem; + } + } + + .text-entity-link { + color: var(--color-links) !important; + cursor: default; + text-decoration: none; + + &:hover, &:active, &:visited { + color: var(--color-links-hover) !important; + } + } + + .clone { + position: absolute; + top: 0; + left: 0; + opacity: 0; + pointer-events: none; + z-index: -10; + } +} + +#message-input-text { + flex-grow: 1; + + .form-control { + margin-bottom: 0; + background: transparent !important; + border: none !important; + border-radius: 0 !important; + box-shadow: none !important; + caret-color: var(--color-text); + min-height: 3.5rem; + max-height: 26rem; + + @media (max-width: 600px) { + height: 2.875rem; + min-height: 2.875rem; + max-height: 16rem; + padding-top: calc(0.6875rem - var(--border-width)); + padding-bottom: calc(0.6875rem - var(--border-width)); + } + + transition: height 100ms ease; + + body.animation-level-0 & { + transition: none !important; + } + } + + &:not(:only-child) { + .form-control { + padding-left: 0; + padding-right: 0; + } + } + + .ComposerEmbeddedMessage + .message-input-wrapper &, + .WebPagePreview + .message-input-wrapper & { + .form-control.overflown { + margin-top: 0.75rem; + } + } + + .emoji { + width: 1.25rem; + height: 1.25rem; + margin: 0 1px -5px; + vertical-align: 0; + pointer-events: none; + } +} + +#caption-input-text { + .form-control { + min-height: 3.25rem; + max-height: 15rem; + } + + .placeholder-text { + bottom: 1rem; + left: 1rem; + } +} diff --git a/src/components/middle/composer/Composer.tsx b/src/components/middle/composer/Composer.tsx new file mode 100644 index 000000000..8bf2a32e6 --- /dev/null +++ b/src/components/middle/composer/Composer.tsx @@ -0,0 +1,914 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions, GlobalState, MessageListType } from '../../../global/types'; +import { + ApiAttachment, + ApiSticker, + ApiVideo, + ApiNewPoll, + ApiMessage, + ApiFormattedText, + ApiChat, + ApiChatMember, + ApiUser, + MAIN_THREAD_ID, +} from '../../../api/types'; + +import { EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config'; +import { IS_EMOJI_SUPPORTED, IS_VOICE_RECORDING_SUPPORTED, IS_MOBILE_SCREEN } from '../../../util/environment'; +import { + selectChat, + selectIsChatWithBot, + selectIsRightColumnShown, + selectIsInSelectMode, + selectNewestMessageWithBotKeyboardButtons, + selectDraft, + selectScheduledIds, + selectEditingMessage, + selectIsChatWithSelf, + selectChatUser, +} from '../../../modules/selectors'; +import { + getAllowedAttachmentOptions, + getChatSlowModeOptions, + isChatGroup, + isChatPrivate, + isChatAdmin, +} from '../../../modules/helpers'; +import { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat'; +import focusEditableElement from '../../../util/focusEditableElement'; +import parseMessageInput from './helpers/parseMessageInput'; +import buildAttachment from './helpers/buildAttachment'; +import renderText from '../../common/helpers/renderText'; +import insertHtmlInSelection from '../../../util/insertHtmlInSelection'; +import deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection'; +import { pick } from '../../../util/iteratees'; +import buildClassName from '../../../util/buildClassName'; +import { isSelectionInsideInput } from './helpers/selection'; + +import useFlag from '../../../hooks/useFlag'; +import useVoiceRecording from './hooks/useVoiceRecording'; +import useClipboardPaste from './hooks/useClipboardPaste'; +import useDraft from './hooks/useDraft'; +import useEditing from './hooks/useEditing'; +import usePrevious from '../../../hooks/usePrevious'; +import useEmojiTooltip from './hooks/useEmojiTooltip'; +import useMentionMenu from './hooks/useMentionMenu'; +import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers'; +import useLang from '../../../hooks/useLang'; + +import DeleteMessageModal from '../../common/DeleteMessageModal.async'; +import Button from '../../ui/Button'; +import ResponsiveHoverButton from '../../ui/ResponsiveHoverButton'; +import Spinner from '../../ui/Spinner'; +import AttachMenu from './AttachMenu.async'; +import SymbolMenu from './SymbolMenu.async'; +import MentionMenu from './MentionMenu.async'; +import CustomSendMenu from './CustomSendMenu.async'; +import EmojiTooltip from './EmojiTooltip.async'; +import BotKeyboardMenu from './BotKeyboardMenu.async'; +import MessageInput from './MessageInput'; +import ComposerEmbeddedMessage from './ComposerEmbeddedMessage'; +import AttachmentModal from './AttachmentModal.async'; +import PollModal from './PollModal.async'; +import DropArea, { DropAreaState } from './DropArea.async'; +import WebPagePreview from './WebPagePreview'; +import Portal from '../../ui/Portal'; +import CalendarModal from '../../common/CalendarModal.async'; +import PaymentModal from '../../payment/PaymentModal.async'; +import ReceiptModal from '../../payment/ReceiptModal.async'; + +import './Composer.scss'; + +type OwnProps = { + chatId: number; + threadId: number; + messageListType: MessageListType; + dropAreaState: string; + onDropHide: NoneToVoidFunction; +}; + +type StateProps = { + editingMessage?: ApiMessage; + chat?: ApiChat; + draft?: ApiFormattedText; + isChatWithBot?: boolean; + isChatWithSelf?: boolean; + isRightColumnShown?: boolean; + isSelectModeActive?: boolean; + isForwarding?: boolean; + canSuggestMembers?: boolean; + isPollModalOpen?: boolean; + isPaymentModalOpen?: boolean; + isReceiptModalOpen?: boolean; + botKeyboardMessageId?: number; + withScheduledButton?: boolean; + shouldSchedule?: boolean; + canScheduleUntilOnline?: boolean; + stickersForEmoji?: ApiSticker[]; + groupChatMembers?: ApiChatMember[]; + currentUserId?: number; + usersById?: Record; + lastSyncTime?: number; + contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled']; + shouldSuggestStickers?: boolean; +} & Pick; + +type DispatchProps = Pick; + +enum MainButtonState { + Send = 'send', + Record = 'record', + Edit = 'edit', +} + +const VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg'; +// When voice recording is active, composer placeholder will hide to prevent overlapping +const SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px + +const MOBILE_KEYBOARD_HIDE_DELAY_MS = 100; +const SELECT_MODE_TRANSITION_MS = 200; +const CAPTION_MAX_LENGTH = 1024; +const SENDING_ANIMATION_DURATION = 350; + +const Composer: FC = ({ + dropAreaState, + shouldSchedule, + canScheduleUntilOnline, + onDropHide, + editingMessage, + chatId, + threadId, + messageListType, + draft, + chat, + connectionState, + isChatWithBot, + isChatWithSelf, + isRightColumnShown, + isSelectModeActive, + isForwarding, + canSuggestMembers, + isPollModalOpen, + isPaymentModalOpen, + isReceiptModalOpen, + botKeyboardMessageId, + withScheduledButton, + stickersForEmoji, + groupChatMembers, + currentUserId, + usersById, + lastSyncTime, + contentToBeScheduled, + shouldSuggestStickers, + sendMessage, + editMessage, + saveDraft, + clearDraft, + showError, + setStickerSearchQuery, + setGifSearchQuery, + forwardMessages, + openPollModal, + closePollModal, + loadScheduledHistory, + closePaymentModal, + openChat, + clearReceipt, +}) => { + const [html, setHtml] = useState(''); + const lastMessageSendTimeSeconds = useRef(); + const prevDropAreaState = usePrevious(dropAreaState); + const [isCalendarOpen, openCalendar, closeCalendar] = useFlag(); + const [ + scheduledMessageArgs, setScheduledMessageArgs, + ] = useState(); + + // Cache for frequently updated state + const htmlRef = useRef(html); + useEffect(() => { + htmlRef.current = html; + }, [html]); + + useEffect(() => { + lastMessageSendTimeSeconds.current = undefined; + }, [chatId]); + + useEffect(() => { + if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID) { + loadScheduledHistory(); + } + }, [chatId, loadScheduledHistory, lastSyncTime, threadId]); + + useEffect(() => { + if (contentToBeScheduled) { + setScheduledMessageArgs(contentToBeScheduled); + openCalendar(); + } + }, [contentToBeScheduled, openCalendar]); + + const [attachments, setAttachments] = useState([]); + + const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag(); + const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag(); + const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag(); + const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag(); + const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag(); + const [isHoverDisabled, disableHover, enableHover] = useFlag(); + + const { + startRecordingVoice, + stopRecordingVoice, + pauseRecordingVoice, + activeVoiceRecording, + currentRecordTime, + recordButtonRef: mainButtonRef, + startRecordTimeRef, + } = useVoiceRecording(); + + const mainButtonState = editingMessage + ? MainButtonState.Edit + : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding + ? MainButtonState.Send + : MainButtonState.Record; + const canShowCustomSendMenu = !shouldSchedule; + + const { + isMentionMenuOpen, mentionFilter, + closeMentionMenu, insertMention, + mentionFilteredMembers, + } = useMentionMenu( + canSuggestMembers && !attachments.length, + html, + setHtml, + undefined, + groupChatMembers, + currentUserId, + usersById, + ); + + const { + isContextMenuOpen: isCustomSendMenuOpen, + handleContextMenu, + handleContextMenuClose, + handleContextMenuHide, + } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu)); + + const allowedAttachmentOptions = useMemo(() => { + return getAllowedAttachmentOptions(chat, isChatWithBot); + }, [chat, isChatWithBot]); + + const isAdmin = chat && isChatAdmin(chat); + const slowMode = getChatSlowModeOptions(chat); + + const { isEmojiTooltipOpen, closeEmojiTooltip } = useEmojiTooltip( + Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length), + html, + stickersForEmoji, + ); + + const insertTextAndUpdateCursor = useCallback((text: string) => { + const selection = window.getSelection()!; + const messageInput = document.getElementById(EDITABLE_INPUT_ID)!; + const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html']) + .join('') + .replace(/\u200b+/g, '\u200b'); + if (selection.rangeCount) { + const selectionRange = selection.getRangeAt(0); + if (isSelectionInsideInput(selectionRange)) { + if (IS_EMOJI_SUPPORTED) { + // Insertion will trigger `onChange` in MessageInput, so no need to setHtml in state + document.execCommand('insertText', false, text); + } else { + insertHtmlInSelection(newHtml); + messageInput.dispatchEvent(new Event('input', { bubbles: true })); + } + + return; + } + + setHtml(`${htmlRef.current!}${newHtml}`); + + if (!IS_MOBILE_SCREEN) { + // If selection is outside of input, set cursor at the end of input + requestAnimationFrame(() => { + focusEditableElement(messageInput); + }); + } + } else if (IS_MOBILE_SCREEN) { + setHtml(`${htmlRef.current!}${newHtml}`); + } + }, []); + + const removeSymbol = useCallback(() => { + const selection = window.getSelection()!; + + if (selection.rangeCount) { + const selectionRange = selection.getRangeAt(0); + if (isSelectionInsideInput(selectionRange)) { + document.execCommand('delete', false); + return; + } + } + + setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!)); + }, []); + + const resetComposer = useCallback(() => { + setHtml(''); + setAttachments([]); + closeEmojiTooltip(); + closeCalendar(); + setScheduledMessageArgs(undefined); + closeMentionMenu(); + + if (IS_MOBILE_SCREEN) { + // @perf + setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION); + } else { + closeSymbolMenu(); + } + }, [closeEmojiTooltip, closeCalendar, closeMentionMenu, closeSymbolMenu]); + + // Handle chat change + const prevChatId = usePrevious(chatId); + useEffect(() => { + if (!prevChatId || chatId === prevChatId) { + return; + } + + stopRecordingVoice(); + resetComposer(); + }, [chatId, prevChatId, resetComposer, stopRecordingVoice]); + + const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage); + useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft); + useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage); + + const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => { + setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick)))); + }, []); + + const handleClearAttachment = useCallback(() => { + setAttachments([]); + }, []); + + const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => { + if (connectionState !== 'connectionStateReady') { + return; + } + + let currentAttachments = attachments; + + if (activeVoiceRecording) { + const record = await stopRecordingVoice(); + if (record) { + const { blob, duration, waveform } = record; + currentAttachments = [await buildAttachment( + VOICE_RECORDING_FILENAME, + blob, + false, + { voice: { duration, waveform } }, + )]; + } + } + + const { text, entities } = parseMessageInput(htmlRef.current!); + if (!currentAttachments.length && !text && !isForwarding) { + return; + } + + if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) { + const extraLength = text.length - CAPTION_MAX_LENGTH; + showError({ + error: { + message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS', + textParams: { + '{EXTRA_CHARS_COUNT}': extraLength, + '{PLURAL_S}': extraLength > 1 ? 's' : '', + }, + }, + }); + return; + } + + if (currentAttachments.length || text) { + if (slowMode && !isAdmin) { + const nowSeconds = Math.floor(Date.now() / 1000); + const secondsSinceLastMessage = lastMessageSendTimeSeconds.current + && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current); + const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds; + + if ( + (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds) + || nextSendDateNotReached + ) { + const secondsRemaining = nextSendDateNotReached + ? slowMode.nextSendDate! - nowSeconds + : slowMode.seconds - secondsSinceLastMessage!; + showError({ + error: { + message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`, + isSlowMode: true, + }, + }); + + const messageInput = document.getElementById(EDITABLE_INPUT_ID)!; + messageInput.blur(); + + return; + } + } + + sendMessage({ + text, + entities, + attachments: currentAttachments, + scheduledAt, + isSilent, + }); + } + if (isForwarding) { + forwardMessages(); + } + + lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000); + + clearDraft({ chatId, localOnly: true }); + + // Wait until message animation starts + requestAnimationFrame(resetComposer); + }, [ + activeVoiceRecording, attachments, connectionState, chatId, slowMode, isForwarding, isAdmin, + sendMessage, stopRecordingVoice, resetComposer, clearDraft, showError, forwardMessages, + ]); + + const handleStickerSelect = useCallback((sticker: ApiSticker) => { + sticker = { + ...sticker, + isPreloadedGlobally: true, + }; + + if (shouldSchedule) { + setScheduledMessageArgs({ sticker }); + openCalendar(); + } else { + sendMessage({ sticker }); + requestAnimationFrame(resetComposer); + } + }, [shouldSchedule, openCalendar, sendMessage, resetComposer]); + + const handleGifSelect = useCallback((gif: ApiVideo) => { + if (shouldSchedule) { + setScheduledMessageArgs({ gif }); + openCalendar(); + } else { + sendMessage({ gif }); + requestAnimationFrame(resetComposer); + } + }, [shouldSchedule, openCalendar, sendMessage, resetComposer]); + + const handlePollSend = useCallback((poll: ApiNewPoll) => { + if (shouldSchedule) { + setScheduledMessageArgs({ poll }); + closePollModal(); + openCalendar(); + } else { + sendMessage({ poll }); + closePollModal(); + } + }, [closePollModal, openCalendar, sendMessage, shouldSchedule]); + + const handleSilentSend = useCallback(() => { + if (shouldSchedule) { + setScheduledMessageArgs({ isSilent: true }); + openCalendar(); + } else { + handleSend(true); + } + }, [handleSend, openCalendar, shouldSchedule]); + + const handleMessageSchedule = useCallback((date: Date) => { + const { isSilent, ...restArgs } = scheduledMessageArgs || {}; + + // Scheduled time can not be less than 10 seconds in future + const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000); + + if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) { + handleSend(!!isSilent, scheduledAt); + } else { + sendMessage({ + ...scheduledMessageArgs, + scheduledAt, + }); + requestAnimationFrame(resetComposer); + } + closeCalendar(); + }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage]); + + const handleMessageScheduleUntilOnline = useCallback(() => { + handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000)); + }, [handleMessageSchedule]); + + const handleCloseCalendar = useCallback(() => { + closeCalendar(); + setScheduledMessageArgs(undefined); + }, [closeCalendar]); + + const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => { + if (type === 'stickers') { + setStickerSearchQuery({ query: '' }); + setGifSearchQuery({ query: undefined }); + } else { + setGifSearchQuery({ query: '' }); + setStickerSearchQuery({ query: undefined }); + } + }, [setStickerSearchQuery, setGifSearchQuery]); + + const handleSymbolMenuOpen = useCallback(() => { + const messageInput = document.getElementById(EDITABLE_INPUT_ID)!; + + if (!IS_MOBILE_SCREEN || messageInput !== document.activeElement) { + openSymbolMenu(); + return; + } + + messageInput.blur(); + setTimeout(() => { + openSymbolMenu(); + }, MOBILE_KEYBOARD_HIDE_DELAY_MS); + }, [openSymbolMenu]); + + const handleAllScheduledClick = useCallback(() => { + openChat({ id: chatId, threadId, type: 'scheduled' }); + }, [openChat, chatId, threadId]); + + useEffect(() => { + if (isRightColumnShown && IS_MOBILE_SCREEN) { + closeSymbolMenu(); + } + }, [isRightColumnShown, closeSymbolMenu]); + + useEffect(() => { + if (isSelectModeActive) { + disableHover(); + } else { + setTimeout(() => { + enableHover(); + }, SELECT_MODE_TRANSITION_MS); + } + }, [isSelectModeActive, enableHover, disableHover]); + + const mainButtonHandler = useCallback(() => { + switch (mainButtonState) { + case MainButtonState.Send: + if (shouldSchedule) { + if (activeVoiceRecording) { + pauseRecordingVoice(); + } + openCalendar(); + } else { + handleSend(); + requestAnimationFrame(resetComposer); + } + break; + case MainButtonState.Record: + startRecordingVoice(); + break; + case MainButtonState.Edit: + handleEditComplete(); + break; + default: + break; + } + }, [ + mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete, + activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend, + ]); + + const lang = useLang(); + + const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record + && !allowedAttachmentOptions.canAttachMedia; + + const prevEditedMessage = usePrevious(editingMessage, true); + const renderedEditedMessage = editingMessage || prevEditedMessage; + + const scheduledDefaultDate = new Date(); + scheduledDefaultDate.setSeconds(0); + scheduledDefaultDate.setMilliseconds(0); + + const scheduledMaxDate = new Date(); + scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1); + + let sendButtonAriaLabel = 'Send message'; + switch (mainButtonState) { + case MainButtonState.Edit: + sendButtonAriaLabel = 'Save edited message'; + break; + case MainButtonState.Record: + sendButtonAriaLabel = areVoiceMessagesNotAllowed + ? 'Posting media content is not allowed in this group.' + : 'Record a voice message'; + } + + const className = buildClassName( + 'Composer', + !isSelectModeActive && 'shown', + isHoverDisabled && 'hover-disabled', + ); + + const symbolMenuButtonClassName = buildClassName( + 'mobile-symbol-menu-button', + isSymbolMenuLoaded + ? (isSymbolMenuOpen && 'menu-opened') + : (isSymbolMenuOpen && 'is-loading'), + ); + + return ( +
    + {allowedAttachmentOptions.canAttachMedia && ( + + + + )} + + + + + {renderedEditedMessage && ( + + )} + +
    + + {allowedAttachmentOptions.canAttachEmbedLinks && ( + + )} +
    + {IS_MOBILE_SCREEN ? ( + + ) : ( + + + + )} + + {withScheduledButton && ( + + )} + {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && ( + + + + )} + {!activeVoiceRecording && !editingMessage && ( + + + + )} + {activeVoiceRecording && currentRecordTime && ( + + {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)} + + )} + + + {botKeyboardMessageId && ( + + )} + +
    +
    + {activeVoiceRecording && ( + + )} + + {canShowCustomSendMenu && ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId, threadId, messageListType }): StateProps => { + const chat = selectChat(global, chatId); + const chatUser = chat && selectChatUser(global, chat); + const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined; + const isChatWithSelf = selectIsChatWithSelf(global, chatId); + const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId); + const scheduledIds = selectScheduledIds(global, chatId); + + return { + editingMessage: selectEditingMessage(global, chatId, threadId, messageListType), + connectionState: global.connectionState, + draft: selectDraft(global, chatId, threadId), + chat, + isChatWithBot, + isChatWithSelf, + canScheduleUntilOnline: ( + !isChatWithSelf && !isChatWithBot + && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline)) + ), + isRightColumnShown: selectIsRightColumnShown(global), + isSelectModeActive: selectIsInSelectMode(global), + withScheduledButton: ( + threadId === MAIN_THREAD_ID + && messageListType === 'thread' + && Boolean(scheduledIds && scheduledIds.length) + ), + shouldSchedule: messageListType === 'scheduled', + botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined, + isForwarding: chatId === global.forwardMessages.toChatId, + canSuggestMembers: chat && isChatGroup(chat), + isPollModalOpen: global.isPollModalOpen, + stickersForEmoji: global.stickers.forEmoji.stickers, + groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members, + currentUserId: global.currentUserId, + usersById: global.users.byId, + lastSyncTime: global.lastSyncTime, + contentToBeScheduled: global.messages.contentToBeScheduled, + isPaymentModalOpen: global.payment.isPaymentModalOpen, + isReceiptModalOpen: Boolean(global.payment.receipt), + shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'sendMessage', + 'editMessage', + 'saveDraft', + 'clearDraft', + 'showError', + 'setStickerSearchQuery', + 'setGifSearchQuery', + 'forwardMessages', + 'openPollModal', + 'closePollModal', + 'closePaymentModal', + 'clearReceipt', + 'loadScheduledHistory', + 'openChat', + ]), +)(Composer)); diff --git a/src/components/middle/composer/ComposerEmbeddedMessage.scss b/src/components/middle/composer/ComposerEmbeddedMessage.scss new file mode 100644 index 000000000..d347acf2e --- /dev/null +++ b/src/components/middle/composer/ComposerEmbeddedMessage.scss @@ -0,0 +1,29 @@ +.ComposerEmbeddedMessage { + height: 2.625rem; + transition: height 150ms ease-out, opacity 150ms ease-out; + + &:not(.open) { + height: 0 !important; + } + + body.animation-level-0 { + transition: none !important; + } + + & > div { + display: flex; + align-items: center; + padding-right: 0.625rem; + padding-top: 0.45rem; + } + + & > div > .Button { + flex-shrink: 0; + background: none !important; + width: 2.125rem; + height: 2.125rem; + margin: 0 0.625rem; + padding: 0; + align-self: center; + } +} diff --git a/src/components/middle/composer/ComposerEmbeddedMessage.tsx b/src/components/middle/composer/ComposerEmbeddedMessage.tsx new file mode 100644 index 000000000..5bf85f704 --- /dev/null +++ b/src/components/middle/composer/ComposerEmbeddedMessage.tsx @@ -0,0 +1,175 @@ +import React, { + FC, memo, useCallback, useEffect, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat, ApiMessage, ApiUser } from '../../../api/types'; + +import { + selectChat, + selectChatMessage, + selectSender, + selectForwardedSender, + selectUser, + selectCurrentMessageList, + selectReplyingToId, + selectEditingId, + selectEditingScheduledId, + selectEditingMessage, +} from '../../../modules/selectors'; +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import { pick } from '../../../util/iteratees'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; +import useShowTransition from '../../../hooks/useShowTransition'; +import buildClassName from '../../../util/buildClassName'; +import { isChatPrivate } from '../../../modules/helpers'; + +import Button from '../../ui/Button'; +import EmbeddedMessage from '../../common/EmbeddedMessage'; + +import './ComposerEmbeddedMessage.scss'; + +type StateProps = { + replyingToId?: number; + editingId?: number; + message?: ApiMessage; + sender?: ApiUser | ApiChat; + shouldAnimate?: boolean; + forwardedMessagesCount?: number; +}; + +type DispatchProps = Pick; + +const FORWARD_RENDERING_DELAY = 300; + +const ComposerEmbeddedMessage: FC = ({ + replyingToId, + editingId, + message, + sender, + shouldAnimate, + forwardedMessagesCount, + setReplyingToId, + setEditingId, + focusMessage, + exitForwardMode, +}) => { + const isShown = Boolean( + ((replyingToId || editingId) && message) + || (sender && forwardedMessagesCount), + ); + const canAnimate = useAsyncRendering( + [forwardedMessagesCount], + forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined, + ); + + const { + shouldRender, transitionClassNames, + } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate); + + const clearEmbedded = useCallback(() => { + if (replyingToId) { + setReplyingToId({ messageId: undefined }); + } else if (editingId) { + setEditingId({ messageId: undefined }); + } else if (forwardedMessagesCount) { + exitForwardMode(); + } + }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]); + + useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]); + + const handleMessageClick = useCallback((): void => { + focusMessage({ chatId: message!.chatId, messageId: message!.id }); + }, [focusMessage, message]); + + const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames); + + const customText = forwardedMessagesCount && forwardedMessagesCount > 1 + ? `${forwardedMessagesCount} forwarded messages` + : undefined; + + if (!shouldRender) { + return undefined; + } + + return ( +
    +
    + + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId || !messageListType) { + return {}; + } + + const { + currentUserId, + forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds }, + } = global; + + const replyingToId = selectReplyingToId(global, chatId, threadId); + const editingId = messageListType === 'scheduled' + ? selectEditingScheduledId(global, chatId) + : selectEditingId(global, chatId, threadId); + const shouldAnimate = global.settings.byKey.animationLevel >= 1; + const isForwarding = toChatId === chatId; + + let message; + if (replyingToId) { + message = selectChatMessage(global, chatId, replyingToId); + } else if (editingId) { + message = selectEditingMessage(global, chatId, threadId, messageListType); + } else if (isForwarding && forwardMessageIds!.length === 1) { + message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]); + } + + let sender: ApiChat | ApiUser | undefined; + if (replyingToId && message) { + const { forwardInfo } = message; + const isChatWithSelf = chatId === currentUserId; + + if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) { + sender = selectForwardedSender(global, message); + } + + if (!sender) { + sender = selectSender(global, message); + } + } else if (isForwarding) { + sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!); + } + + return { + replyingToId, + editingId, + message, + sender, + shouldAnimate, + forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setReplyingToId', + 'setEditingId', + 'focusMessage', + 'exitForwardMode', + ]), +)(ComposerEmbeddedMessage)); diff --git a/src/components/middle/composer/CustomSendMenu.async.tsx b/src/components/middle/composer/CustomSendMenu.async.tsx new file mode 100644 index 000000000..edc7d6910 --- /dev/null +++ b/src/components/middle/composer/CustomSendMenu.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './CustomSendMenu'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const CustomSendMenuAsync: FC = (props) => { + const { isOpen } = props; + const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return CustomSend ? : undefined; +}; + +export default CustomSendMenuAsync; diff --git a/src/components/middle/composer/CustomSendMenu.scss b/src/components/middle/composer/CustomSendMenu.scss new file mode 100644 index 000000000..34c67fa9c --- /dev/null +++ b/src/components/middle/composer/CustomSendMenu.scss @@ -0,0 +1,23 @@ +.CustomSendMenu { + position: relative; + bottom: 3.5rem; + + .is-pointer-env & { + > .backdrop { + position: absolute; + top: -1rem; + left: auto; + right: 0; + width: 3.5rem; + } + } + + + .media-disabled > button { + white-space: normal; + } + + .bubble { + width: 16rem; + } +} diff --git a/src/components/middle/composer/CustomSendMenu.tsx b/src/components/middle/composer/CustomSendMenu.tsx new file mode 100644 index 000000000..d479a044b --- /dev/null +++ b/src/components/middle/composer/CustomSendMenu.tsx @@ -0,0 +1,46 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; + +import { IS_TOUCH_ENV } from '../../../util/environment'; +import useMouseInside from '../../../hooks/useMouseInside'; +import useLang from '../../../hooks/useLang'; + +import Menu from '../../ui/Menu'; +import MenuItem from '../../ui/MenuItem'; + +import './CustomSendMenu.scss'; + +export type OwnProps = { + isOpen: boolean; + onSilentSend?: NoneToVoidFunction; + onScheduleSend?: NoneToVoidFunction; + onClose: NoneToVoidFunction; + onCloseAnimationEnd?: NoneToVoidFunction; +}; + +const CustomSendMenu: FC = ({ + isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd, +}) => { + const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose); + + const lang = useLang(); + + return ( + + {onSilentSend && {lang('SendWithoutSound')}} + {onScheduleSend && {lang('ScheduleMessage')}} + + ); +}; + +export default memo(CustomSendMenu); diff --git a/src/components/middle/composer/DropArea.async.tsx b/src/components/middle/composer/DropArea.async.tsx new file mode 100644 index 000000000..a53d25ef4 --- /dev/null +++ b/src/components/middle/composer/DropArea.async.tsx @@ -0,0 +1,16 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './DropArea'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const DropAreaAsync: FC = (props) => { + const { isOpen } = props; + const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return DropArea ? : undefined; +}; + +export default DropAreaAsync; +export { DropAreaState } from './DropArea'; diff --git a/src/components/middle/composer/DropArea.scss b/src/components/middle/composer/DropArea.scss new file mode 100644 index 000000000..9e72add54 --- /dev/null +++ b/src/components/middle/composer/DropArea.scss @@ -0,0 +1,16 @@ +.DropArea { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 100vh; + z-index: var(--z-drop-area); + padding: 80px 20px 20px; + + display: flex; + flex-direction: column; + + #Main.right-column-open & { + max-width: calc(100% - var(--right-column-width)); + } +} diff --git a/src/components/middle/composer/DropArea.tsx b/src/components/middle/composer/DropArea.tsx new file mode 100644 index 000000000..0bec68415 --- /dev/null +++ b/src/components/middle/composer/DropArea.tsx @@ -0,0 +1,94 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, +} from '../../../lib/teact/teact'; + +import useShowTransition from '../../../hooks/useShowTransition'; +import buildClassName from '../../../util/buildClassName'; + +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import usePrevious from '../../../hooks/usePrevious'; + +import DropTarget from './DropTarget'; + +import './DropArea.scss'; + +export type OwnProps = { + isOpen: boolean; + withQuick?: boolean; + onHide: NoneToVoidFunction; + onFileSelect: (files: File[], isQuick: boolean) => void; +}; + +export enum DropAreaState { + None = 'none', + Document = 'document', + QuickFile = 'quick_file', +} + +const DROP_LEAVE_TIMEOUT_MS = 150; + +const DropArea: FC = ({ + isOpen, withQuick, onHide, onFileSelect, +}) => { + // eslint-disable-next-line no-null/no-null + const hideTimeoutRef = useRef(null); + const prevWithQuick = usePrevious(withQuick); + const { shouldRender, transitionClassNames } = useShowTransition(isOpen); + + useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]); + + const handleFilesDrop = useCallback((e: React.DragEvent) => { + const { dataTransfer: dt } = e; + + if (dt.files && dt.files.length > 0) { + onHide(); + onFileSelect(Array.from(dt.files), false); + } + }, [onFileSelect, onHide]); + + const handleQuickFilesDrop = useCallback((e: React.DragEvent) => { + const { dataTransfer: dt } = e; + + if (dt.files && dt.files.length > 0) { + onHide(); + onFileSelect(Array.from(dt.files), true); + } + }, [onFileSelect, onHide]); + + const handleDragLeave = useCallback((e: React.DragEvent) => { + e.stopPropagation(); + + const { target: fromTarget, relatedTarget: toTarget } = e; + + // Esc button pressed during drag event + if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) { + hideTimeoutRef.current = window.setTimeout(() => { + onHide(); + }, DROP_LEAVE_TIMEOUT_MS); + } + }, [onHide]); + + const handleDragOver = () => { + if (hideTimeoutRef.current) { + window.clearTimeout(hideTimeoutRef.current); + } + }; + + if (!shouldRender) { + return undefined; + } + + const className = buildClassName( + 'DropArea', + transitionClassNames, + ); + + return ( +
    + + {(withQuick || prevWithQuick) && } +
    + ); +}; + +export default memo(DropArea); diff --git a/src/components/middle/composer/DropTarget.scss b/src/components/middle/composer/DropTarget.scss new file mode 100644 index 000000000..4700513be --- /dev/null +++ b/src/components/middle/composer/DropTarget.scss @@ -0,0 +1,81 @@ +.DropTarget { + border-radius: var(--border-radius-default); + background: #fff; + padding: 1.25rem; + flex: 1 1 auto; + width: 100%; + max-width: 43.75rem; + margin-left: auto; + margin-right: auto; + margin-bottom: .3125rem; + display: flex; + color: #A4ACB3; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + + @media (max-height: 350px) { + padding: .75rem; + } + + &.hovered .target-content { + color: #63A2E3; + background-image: var(--drag-target-border-hovered); + } + + & + & { + margin-top: .3125rem; + } + + &:last-child { + margin-bottom: 0; + } + + .target-content { + pointer-events: none; + background-image: var(--drag-target-border); + border-radius: .5rem; + flex: 1 1 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + transition: .2s color, .2s background; + } + + .icon { + font-size: 6.25rem; + line-height: 4.6875rem; + margin-bottom: 2.25rem; + + @media (max-height: 520px) { + font-size: 4.25rem; + line-height: 3.5rem; + margin-bottom: 1rem; + } + + @media (max-height: 450px) { + font-size: 2rem; + line-height: 1rem; + margin-bottom: .5rem; + margin-top: .25rem; + } + } + + .title { + font-size: 1.3125rem; + font-weight: 500; + letter-spacing: -.18px; + + @media (max-height: 450px) { + font-size: 1rem; + } + } + + .description { + font-size: 1rem; + letter-spacing: .3px; + + @media (max-height: 450px) { + font-size: .875rem; + } + } +} diff --git a/src/components/middle/composer/DropTarget.tsx b/src/components/middle/composer/DropTarget.tsx new file mode 100644 index 000000000..bd8fac340 --- /dev/null +++ b/src/components/middle/composer/DropTarget.tsx @@ -0,0 +1,48 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; + +import useFlag from '../../../hooks/useFlag'; +import buildClassName from '../../../util/buildClassName'; + +import './DropTarget.scss'; + +export type OwnProps = { + isQuick?: boolean; + onFileSelect: (e: React.DragEvent) => void; +}; + +const DropTarget: FC = ({ isQuick, onFileSelect }) => { + const [isHovered, markHovered, unmarkHovered] = useFlag(); + + const handleDragEnter = () => { markHovered(); }; + const handleDragLeave = (e: React.DragEvent) => { + const { relatedTarget: toTarget } = e; + + if (toTarget) { + e.stopPropagation(); + } + + unmarkHovered(); + }; + + const className = buildClassName( + 'DropTarget', + isHovered && 'hovered', + ); + + return ( +
    +
    +
    +
    Drop files here to send them
    +
    {isQuick ? 'in a quick way' : 'without compression'}
    +
    +
    + ); +}; + +export default memo(DropTarget); diff --git a/src/components/middle/composer/EmojiButton.scss b/src/components/middle/composer/EmojiButton.scss new file mode 100644 index 000000000..b3f4e6d10 --- /dev/null +++ b/src/components/middle/composer/EmojiButton.scss @@ -0,0 +1,27 @@ +.EmojiButton { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.5rem; + height: 2.5rem; + margin: 0.125rem; + border-radius: var(--border-radius-messages-small); + cursor: pointer; + font-size: 1.75rem; + line-height: 2.5rem; + background-color: transparent; + transition: background-color .15s ease; + + .mac-os-fix & { + line-height: inherit; + } + + &:hover { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + } + + & > img { + width: 2rem; + height: 2rem; + } +} diff --git a/src/components/middle/composer/EmojiButton.tsx b/src/components/middle/composer/EmojiButton.tsx new file mode 100644 index 000000000..687fb296d --- /dev/null +++ b/src/components/middle/composer/EmojiButton.tsx @@ -0,0 +1,28 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; + +import { IS_EMOJI_SUPPORTED } from '../../../util/environment'; + +import './EmojiButton.scss'; + +type OwnProps = { + emoji: Emoji; + onClick: (emoji: string, name: string) => void; +}; + +const EmojiButton: FC = ({ emoji, onClick }) => { + const handleClick = useCallback(() => { + onClick(emoji.native, emoji.id); + }, [emoji, onClick]); + + return ( +
    + {IS_EMOJI_SUPPORTED ? emoji.native : } +
    + ); +}; + +export default memo(EmojiButton); diff --git a/src/components/middle/composer/EmojiCategory.tsx b/src/components/middle/composer/EmojiCategory.tsx new file mode 100644 index 000000000..6eeb7e0d7 --- /dev/null +++ b/src/components/middle/composer/EmojiCategory.tsx @@ -0,0 +1,75 @@ +import React, { FC, memo, useRef } from '../../../lib/teact/teact'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import buildClassName from '../../../util/buildClassName'; +import windowSize from '../../../util/windowSize'; +import { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useLang from '../../../hooks/useLang'; + +import EmojiButton from './EmojiButton'; + +const EMOJIS_PER_ROW_ON_DESKTOP = 9; +const EMOJI_MARGIN = 4; +const MOBILE_CONTAINER_PADDING = 8; +const EMOJI_SIZE = 40; + +type OwnProps = { + category: EmojiCategory; + index: number; + allEmojis: AllEmojis; + observeIntersection: ObserveFn; + shouldRender: boolean; + onEmojiSelect: (emoji: string, name: string) => void; +}; + +const EmojiCategory: FC = ({ + category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + useOnIntersect(ref, observeIntersection); + + const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow'); + + const lang = useLang(); + + const emojisPerRow = IS_MOBILE_SCREEN + ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN)) + : EMOJIS_PER_ROW_ON_DESKTOP; + const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN); + + return ( +
    +

    {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}

    +
    + {shouldRender && category.emojis.map((name) => { + const emoji = allEmojis[name]; + // Some emojis have multiple skins and are represented as an Object with emojis for all skins. + // For now, we select only the first emoji with 'neutral' skin. + const displayedEmoji = 'id' in emoji ? emoji : emoji[1]; + + return ( + + ); + })} +
    +
    + ); +}; + +export default memo(EmojiCategory); diff --git a/src/components/middle/composer/EmojiPicker.scss b/src/components/middle/composer/EmojiPicker.scss new file mode 100644 index 000000000..42a5c9581 --- /dev/null +++ b/src/components/middle/composer/EmojiPicker.scss @@ -0,0 +1,55 @@ +.EmojiPicker { + height: 100%; + + &-main { + height: calc(100% - 3rem); + overflow-y: auto; + padding: 0.5rem; + + @media (max-width: 600px) { + padding: 0.5rem 0.25rem; + } + } + + &-header { + height: 3rem; + border-bottom: 1px solid var(--color-borders); + display: flex; + align-items: center; + justify-content: space-around; + box-shadow: 0 0 2px rgba(114, 114, 114, 0.25); + + @media (max-width: 600px) { + overflow-x: auto; + overflow-y: hidden; + display: block; + white-space: nowrap; + padding: 0.4375rem 0; + + scrollbar-width: none; + scrollbar-color: rgba(0, 0, 0, 0); + + &::-webkit-scrollbar { + height: 0; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0); + } + + .symbol-set-button { + display: inline-flex; + vertical-align: middle; + } + + // Spacer to counter last button margin not being accounted in scroll width + &::after { + content: ""; + display: block; + flex-shrink: 0; + width: 0.1px; + height: 1rem; + } + } + } +} diff --git a/src/components/middle/composer/EmojiPicker.tsx b/src/components/middle/composer/EmojiPicker.tsx new file mode 100644 index 000000000..ceb177e72 --- /dev/null +++ b/src/components/middle/composer/EmojiPicker.tsx @@ -0,0 +1,232 @@ +import React, { + FC, useState, useEffect, memo, useRef, useMemo, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalState, GlobalActions } from '../../../global/types'; + +import { MENU_TRANSITION_DURATION } from '../../../config'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import { + EmojiModule, + EmojiRawData, + EmojiData, + uncompressEmoji, +} from '../../../util/emoji'; +import fastSmoothScroll from '../../../util/fastSmoothScroll'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; +import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; +import useHorizontalScroll from '../../../hooks/useHorizontalScroll'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; +import Loading from '../../ui/Loading'; +import EmojiCategory from './EmojiCategory'; + +import './EmojiPicker.scss'; + +type OwnProps = { + className?: string; + onEmojiSelect: (emoji: string) => void; +}; + +type StateProps = Pick; +type DispatchProps = Pick; +type EmojiCategoryData = { id: string; name: string; emojis: string[] }; + +const ICONS_BY_CATEGORY: Record = { + recent: 'icon-recent', + people: 'icon-smile', + nature: 'icon-animals', + foods: 'icon-eats', + activity: 'icon-sport', + places: 'icon-car', + objects: 'icon-lamp', + symbols: 'icon-language', + flags: 'icon-flag', +}; + +const OPEN_ANIMATION_DELAY = 200; +// Only a few categories are above this height. +const SMOOTH_SCROLL_DISTANCE = 800; +const FOCUS_MARGIN = 50; +const HEADER_BUTTON_WIDTH = 42; // px. Includes margins +const INTERSECTION_THROTTLE = 200; + +const categoryIntersections: boolean[] = []; + +let emojiDataPromise: Promise; +let emojiRawData: EmojiRawData; +let emojiData: EmojiData; + +const EmojiPicker: FC = ({ + className, onEmojiSelect, recentEmojis, addRecentEmoji, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const headerRef = useRef(null); + + const [categories, setCategories] = useState(); + const [emojis, setEmojis] = useState(); + const [activeCategoryIndex, setActiveCategoryIndex] = useState(0); + + const { observe: observeIntersection } = useIntersectionObserver({ + rootRef: containerRef, + throttleMs: INTERSECTION_THROTTLE, + }, (entries) => { + entries.forEach((entry) => { + const { id } = entry.target as HTMLDivElement; + if (!id || !id.startsWith('emoji-category-')) { + return; + } + + const index = Number(id.replace('emoji-category-', '')); + categoryIntersections[index] = entry.isIntersecting; + }); + + const intersectingWithIndexes = categoryIntersections + .map((isIntersecting, index) => ({ index, isIntersecting })) + .filter(({ isIntersecting }) => isIntersecting); + + if (!intersectingWithIndexes.length) { + return; + } + + setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index); + }); + + useHorizontalScroll(headerRef, !IS_MOBILE_SCREEN); + + // Scroll header when active set updates + useEffect(() => { + if (!categories) { + return; + } + + const header = headerRef.current; + if (!header) { + return; + } + + const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2; + + fastSmoothScrollHorizontal(header, newLeft); + }, [categories, activeCategoryIndex]); + + const lang = useLang(); + + const allCategories = useMemo(() => { + if (!categories) { + return MEMO_EMPTY_ARRAY; + } + const themeCategories = [...categories]; + if (recentEmojis && recentEmojis.length) { + themeCategories.unshift({ + id: 'recent', + name: lang('RecentStickers'), + emojis: recentEmojis, + }); + } + + return themeCategories; + }, [categories, lang, recentEmojis]); + + // Initialize data on first render. + useEffect(() => { + setTimeout(() => { + const exec = () => { + setCategories(emojiData.categories); + + setEmojis(emojiData.emojis as AllEmojis); + }; + + if (emojiData) { + exec(); + } else { + ensureEmojiData() + .then(exec); + } + }, OPEN_ANIMATION_DELAY); + }, []); + + const selectCategory = useCallback((index: number) => { + setActiveCategoryIndex(index); + const categoryEl = document.getElementById(`emoji-category-${index}`)!; + fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE); + }, []); + + const handleEmojiSelect = useCallback((emoji: string, name: string) => { + onEmojiSelect(emoji); + addRecentEmoji({ emoji: name }); + }, [addRecentEmoji, onEmojiSelect]); + + const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION); + + function renderCategoryButton(category: EmojiCategoryData, index: number) { + const icon = ICONS_BY_CATEGORY[category.id]; + + return icon && ( + + ); + } + + const containerClassName = buildClassName('EmojiPicker', className); + + if (!emojis || !canRenderContents) { + return ( +
    + +
    + ); + } + + return ( +
    +
    + {allCategories.map(renderCategoryButton)} +
    +
    + {allCategories.map((category, i) => ( + = i - 1 && activeCategoryIndex <= i + 1} + onEmojiSelect={handleEmojiSelect} + /> + ))} +
    +
    + ); +}; + +async function ensureEmojiData() { + if (!emojiDataPromise) { + emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise; + emojiRawData = (await emojiDataPromise).default; + + emojiData = uncompressEmoji(emojiRawData); + } + + return emojiDataPromise; +} + +export default memo(withGlobal( + (global): StateProps => pick(global, ['recentEmojis']), + (setGlobal, actions): DispatchProps => pick(actions, ['addRecentEmoji']), +)(EmojiPicker)); diff --git a/src/components/middle/composer/EmojiTooltip.async.tsx b/src/components/middle/composer/EmojiTooltip.async.tsx new file mode 100644 index 000000000..9a0f67d29 --- /dev/null +++ b/src/components/middle/composer/EmojiTooltip.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './EmojiTooltip'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const EmojiTooltipAsync: FC = (props) => { + const { isOpen } = props; + const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return EmojiTooltip ? : undefined; +}; + +export default EmojiTooltipAsync; diff --git a/src/components/middle/composer/EmojiTooltip.scss b/src/components/middle/composer/EmojiTooltip.scss new file mode 100644 index 000000000..32ead605e --- /dev/null +++ b/src/components/middle/composer/EmojiTooltip.scss @@ -0,0 +1,37 @@ +.EmojiTooltip { + position: absolute; + bottom: calc(100% + .5rem); + left: 0; + width: 100%; + background: white; + border-radius: var(--border-radius-messages); + padding: 0.5rem 0; + max-height: 15rem; + overflow-x: hidden; + overflow-y: auto; + + display: grid; + grid-template-columns: repeat(auto-fit, minmax(5rem, 1fr)); + grid-auto-rows: auto; + place-items: center; + + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + + opacity: 0; + transform: translateY(1.5rem); + transform-origin: bottom; + transition: opacity var(--layer-transition), transform var(--layer-transition); + + &:not(.shown) { + display: none; + } + + &.open { + opacity: 1; + transform: translateY(0); + } + + .Loading { + margin: 1rem 0; + } +} diff --git a/src/components/middle/composer/EmojiTooltip.tsx b/src/components/middle/composer/EmojiTooltip.tsx new file mode 100644 index 000000000..ce37716ec --- /dev/null +++ b/src/components/middle/composer/EmojiTooltip.tsx @@ -0,0 +1,99 @@ +import React, { + FC, memo, useEffect, useRef, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { STICKER_SIZE_PICKER } from '../../../config'; +import { IS_TOUCH_ENV } from '../../../util/environment'; +import buildClassName from '../../../util/buildClassName'; +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import { pick } from '../../../util/iteratees'; +import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; +import useShowTransition from '../../../hooks/useShowTransition'; +import usePrevious from '../../../hooks/usePrevious'; + +import Loading from '../../ui/Loading'; +import StickerButton from '../../common/StickerButton'; + +import './EmojiTooltip.scss'; + +export type OwnProps = { + isOpen: boolean; + onStickerSelect: (sticker: ApiSticker) => void; +}; + +type StateProps = { + stickers?: ApiSticker[]; +}; + +type DispatchProps = Pick; + +const INTERSECTION_THROTTLE = 200; + +const EmojiTooltip: FC = ({ + isOpen, + onStickerSelect, + stickers, + clearStickersForEmoji, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false); + const prevStickers = usePrevious(stickers, true); + const displayedStickers = stickers || prevStickers; + + const { + observe: observeIntersection, + } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE }); + + useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]); + + const handleMouseEnter = () => { + document.body.classList.add('no-select'); + }; + + const handleMouseLeave = () => { + document.body.classList.remove('no-select'); + }; + + const className = buildClassName( + 'EmojiTooltip custom-scroll', + transitionClassNames, + ); + + return ( +
    + {shouldRender && displayedStickers ? ( + displayedStickers.map((sticker) => ( + + )) + ) : shouldRender ? ( + + ) : undefined} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { stickers } = global.stickers.forEmoji; + + return { stickers }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']), +)(EmojiTooltip)); diff --git a/src/components/middle/composer/GifPicker.scss b/src/components/middle/composer/GifPicker.scss new file mode 100644 index 000000000..f8fc172ed --- /dev/null +++ b/src/components/middle/composer/GifPicker.scss @@ -0,0 +1,15 @@ +.GifPicker { + display: grid; + grid-template-columns: repeat(6, 1fr); + grid-auto-rows: 6.25rem; + grid-gap: 0.25rem; + grid-auto-flow: dense; + height: 100%; + overflow-y: auto; + padding: 0.25rem; + + .Loading, .picker-disabled { + grid-column: 1 / -1; + height: var(--menu-height); + } +} diff --git a/src/components/middle/composer/GifPicker.tsx b/src/components/middle/composer/GifPicker.tsx new file mode 100644 index 000000000..c74ac1bf2 --- /dev/null +++ b/src/components/middle/composer/GifPicker.tsx @@ -0,0 +1,88 @@ +import React, { + FC, useEffect, memo, useRef, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiVideo } from '../../../api/types'; + +import { SLIDE_TRANSITION_DURATION } from '../../../config'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; + +import Loading from '../../ui/Loading'; +import GifButton from '../../common/GifButton'; + +import './GifPicker.scss'; + +type OwnProps = { + className: string; + loadAndPlay: boolean; + canSendGifs: boolean; + onGifSelect: (gif: ApiVideo) => void; +}; + +type StateProps = { + savedGifs?: ApiVideo[]; +}; + +type DispatchProps = Pick; + +const INTERSECTION_DEBOUNCE = 300; + +const GifPicker: FC = ({ + className, + loadAndPlay, + canSendGifs, + savedGifs, + onGifSelect, + loadSavedGifs, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const { + observe: observeIntersection, + } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE }); + + useEffect(() => { + if (loadAndPlay) { + loadSavedGifs(); + } + }, [loadAndPlay, loadSavedGifs]); + + const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION); + + return ( +
    + {!canSendGifs ? ( +
    Sending GIFs is not allowed in this chat.
    + ) : canRenderContents && savedGifs && savedGifs.length ? ( + savedGifs.map((gif) => ( + + )) + ) : canRenderContents && savedGifs ? ( +
    No saved GIFs.
    + ) : ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + return { + savedGifs: global.gifs.saved.gifs, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']), +)(GifPicker)); diff --git a/src/components/middle/composer/MentionMenu.async.tsx b/src/components/middle/composer/MentionMenu.async.tsx new file mode 100644 index 000000000..d8449fa7c --- /dev/null +++ b/src/components/middle/composer/MentionMenu.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './MentionMenu'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const MentionMenuAsync: FC = (props) => { + const { isOpen } = props; + const MentionMenu = useModuleLoader(Bundles.Extra, 'MentionMenu', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return MentionMenu ? : undefined; +}; + +export default MentionMenuAsync; diff --git a/src/components/middle/composer/MentionMenu.scss b/src/components/middle/composer/MentionMenu.scss new file mode 100644 index 000000000..8e0299f5b --- /dev/null +++ b/src/components/middle/composer/MentionMenu.scss @@ -0,0 +1,79 @@ +.MentionMenu { + position: absolute; + bottom: calc(100% + .75rem); + left: 0; + width: calc(100% - 4rem); + max-width: 20rem; + background: white; + border-radius: var(--border-radius-messages); + padding: 0.5rem 0; + max-height: 15rem; + overflow-x: hidden; + overflow-y: auto; + + box-shadow: 3px 3px 5px rgba(114, 114, 114, 0.25); + z-index: -1; + + opacity: 0; + transform: translateY(1.5rem); + transform-origin: bottom; + transition: opacity var(--layer-transition), transform var(--layer-transition); + + @media (max-width: 600px) { + width: calc(100% - 3rem); + } + + &:not(.shown) { + display: none; + } + + &.open { + opacity: 1; + transform: translateY(0); + } + + .Loading { + margin: 1rem 0; + } + + .ListItem.chat-item-clickable { + margin: 0; + + .ListItem-button { + border-radius: 0; + } + + .info { + display: flex; + } + + .title { + margin-right: 10px; + max-width: 70%; + } + + .handle { + font-size: 1rem; + } + } + + .ChatInfo { + .title h3 { + line-height: 1.25; + } + + .Avatar { + margin-right: 0.7em; + } + + .handle { + &::before { + content: '@'; + } + } + + .user-status { + display: none; + } + } +} diff --git a/src/components/middle/composer/MentionMenu.tsx b/src/components/middle/composer/MentionMenu.tsx new file mode 100644 index 000000000..1ce330a7b --- /dev/null +++ b/src/components/middle/composer/MentionMenu.tsx @@ -0,0 +1,163 @@ +import React, { + FC, useCallback, useEffect, useState, useRef, memo, +} from '../../../lib/teact/teact'; +import usePrevious from '../../../hooks/usePrevious'; + +import { ApiChatMember, ApiUser } from '../../../api/types'; + +import useShowTransition from '../../../hooks/useShowTransition'; +import buildClassName from '../../../util/buildClassName'; +import captureKeyboardListeners from '../../../util/captureKeyboardListeners'; +import findInViewport from '../../../util/findInViewport'; +import isFullyVisible from '../../../util/isFullyVisible'; +import fastSmoothScroll from '../../../util/fastSmoothScroll'; +import cycleRestrict from '../../../util/cycleRestrict'; + +import ListItem from '../../ui/ListItem'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; + +import './MentionMenu.scss'; + +const VIEWPORT_MARGIN = 8; +const SCROLL_MARGIN = 10; + +function setItemVisible(index: number, containerRef: Record) { + const container = containerRef.current!; + if (!container || index < 0) { + return; + } + const { visibleIndexes, allElements } = findInViewport( + container, + '.chat-item-clickable', + VIEWPORT_MARGIN, + true, + true, + ); + if (!allElements.length || !allElements[index]) { + return; + } + const first = visibleIndexes[0]; + if (!visibleIndexes.includes(index) + || (index === first && !isFullyVisible(container, allElements[first]))) { + const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end'; + fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN); + } +} + +export type OwnProps = { + isOpen: boolean; + filter: string; + onClose: () => void; + onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void; + filteredChatMembers?: ApiChatMember[]; + usersById?: Record; +}; + +const MentionMenu: FC = ({ + isOpen, + filter, + onClose, + onInsertUserName, + usersById, + filteredChatMembers, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false); + + const getSelectedIndex = useCallback((newIndex: number) => { + if (!filteredChatMembers) { + return -1; + } + const membersCount = filteredChatMembers!.length; + return cycleRestrict(membersCount, newIndex); + }, [filteredChatMembers]); + + const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1); + + const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => { + e.preventDefault(); + setSelectedMentionIndex((index) => (getSelectedIndex(index + value))); + }, [setSelectedMentionIndex, getSelectedIndex]); + + const handleUserSelect = useCallback((userId: number, forceFocus = false) => { + const user = usersById && usersById[userId]; + if (!user) { + return; + } + + onInsertUserName(user, forceFocus); + }, [usersById, onInsertUserName]); + + const handleSelectMention = useCallback((e: KeyboardEvent) => { + if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) { + const member = filteredChatMembers[selectedMentionIndex]; + if (member) { + e.preventDefault(); + handleUserSelect(member.userId, true); + } + } + }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]); + + useEffect(() => (isOpen ? captureKeyboardListeners({ + onEsc: onClose, + onUp: (e: KeyboardEvent) => handleArrowKey(-1, e), + onDown: (e: KeyboardEvent) => handleArrowKey(1, e), + onEnter: handleSelectMention, + onTab: handleSelectMention, + }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]); + + useEffect(() => { + if (filteredChatMembers && !filteredChatMembers.length) { + onClose(); + } + }, [filteredChatMembers, onClose]); + + useEffect(() => { + setSelectedMentionIndex(0); + }, [filter]); + + useEffect(() => { + setItemVisible(selectedMentionIndex, containerRef); + }, [selectedMentionIndex]); + + const prevChatMembers = usePrevious( + filteredChatMembers && filteredChatMembers.length + ? filteredChatMembers + : undefined, + shouldRender, + ); + const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length + ? prevChatMembers + : filteredChatMembers; + + if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) { + return undefined; + } + + const className = buildClassName( + 'MentionMenu custom-scroll', + transitionClassNames, + ); + + return ( +
    + {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => ( + handleUserSelect(userId)} + focus={selectedMentionIndex === index} + > + + + ))} +
    + ); +}; + +export default memo(MentionMenu); diff --git a/src/components/middle/composer/MessageInput.tsx b/src/components/middle/composer/MessageInput.tsx new file mode 100644 index 000000000..b7c60bb64 --- /dev/null +++ b/src/components/middle/composer/MessageInput.tsx @@ -0,0 +1,348 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useEffect, useRef, memo, useState, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { IAnchorPosition, ISettings } from '../../../types'; + +import { EDITABLE_INPUT_ID } from '../../../config'; +import { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors'; +import { debounce } from '../../../util/schedulers'; +import focusEditableElement from '../../../util/focusEditableElement'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import { + IS_ANDROID, IS_IOS, IS_MOBILE_SCREEN, IS_TOUCH_ENV, +} from '../../../util/environment'; +import captureKeyboardListeners from '../../../util/captureKeyboardListeners'; +import useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps'; +import useFlag from '../../../hooks/useFlag'; +import parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString'; +import { isSelectionInsideInput } from './helpers/selection'; + +import TextFormatter from './TextFormatter'; + +const CONTEXT_MENU_CLOSE_DELAY_MS = 100; +// Focus slows down animation, also it breaks transition layout in Chrome +const FOCUS_DELAY_MS = 350; + +type OwnProps = { + id: string; + editableInputId?: string; + html: string; + placeholder: string; + shouldSetFocus: boolean; + shouldSupressFocus?: boolean; + onUpdate: (html: string) => void; + onSupressedFocus?: () => void; + onSend: () => void; +}; + +type StateProps = { + currentChatId?: number; + replyingToId?: number; + noTabCapture?: boolean; + messageSendKeyCombo?: ISettings['messageSendKeyCombo']; +}; + +type DispatchProps = Pick; + +const DISABLE_MASK_SHADOW_THRESHOLD = 100; +const MAX_INPUT_HEIGHT = IS_MOBILE_SCREEN ? 256 : 416; +const TAB_INDEX_PRIORITY_TIMEOUT = 2000; +const TEXT_FORMATTER_SAFE_AREA_PX = 90; +// For some reason Safari inserts `
    ` after user removes text from input +const SAFARI_BR = '
    '; + +const MessageInput: FC = ({ + id, + editableInputId, + html, + placeholder, + shouldSetFocus, + shouldSupressFocus, + onUpdate, + onSupressedFocus, + onSend, + currentChatId, + replyingToId, + noTabCapture, + messageSendKeyCombo, + editLastMessage, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const cloneRef = useRef(null); + + const isContextMenuOpenRef = useRef(false); + const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag(); + const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState(); + const [selectedRange, setSelectedRange] = useState(); + + useLayoutEffectWithPrevDeps(([prevHtml]) => { + if (html !== inputRef.current!.innerHTML) { + inputRef.current!.innerHTML = html; + } + + if (html !== cloneRef.current!.innerHTML) { + cloneRef.current!.innerHTML = html; + } + + if (prevHtml !== undefined && prevHtml !== html) { + updateInputHeight(); + } + }, [html]); + + const focusInput = useCallback(() => { + // Avoid focusing during animation + if (inputRef.current!.closest('.from, .to')) { + setTimeout(focusInput, FOCUS_DELAY_MS); + return; + } + + focusEditableElement(inputRef.current!); + }, []); + + function checkSelection() { + // Disable the formatter on iOS devices for now. + if (IS_IOS) { + return; + } + + const selection = window.getSelection(); + if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) { + closeTextFormatter(); + return; + } + + const selectionRange = selection.getRangeAt(0); + const selectedText = selectionRange.toString().trim(); + if ( + !isSelectionInsideInput(selectionRange) + || !selectedText + || parseEmojiOnlyString(selectedText) + || !selectionRange.START_TO_END + ) { + closeTextFormatter(); + return; + } + + const selectionRect = selectionRange.getBoundingClientRect(); + const inputRect = inputRef.current!.getBoundingClientRect(); + + let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left; + + if (x < TEXT_FORMATTER_SAFE_AREA_PX) { + x = TEXT_FORMATTER_SAFE_AREA_PX; + } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) { + x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX; + } + + setTextFormatterAnchorPosition({ + x, + y: selectionRect.top - inputRect.top, + }); + + setSelectedRange(selectionRange); + openTextFormatter(); + } + + function handleMouseDown(event: React.MouseEvent) { + function handleMouseUp() { + checkSelection(); + + event.target.removeEventListener('mouseup', handleMouseUp); + } + + if (event.button !== 2) { + event.target.addEventListener('mouseup', handleMouseUp); + return; + } + + if (isContextMenuOpenRef.current === true) { + return; + } + + isContextMenuOpenRef.current = true; + + function closeContextMenuMouseListener() { + setTimeout(() => { + isContextMenuOpenRef.current = false; + }, CONTEXT_MENU_CLOSE_DELAY_MS); + + window.removeEventListener('mouseup', closeContextMenuMouseListener); + } + + function closeContextMenuKeyListener(e: KeyboardEvent) { + if (e.key !== 'Esc' && e.key !== 'Escape') { + return; + } + + setTimeout(() => { + isContextMenuOpenRef.current = false; + }, CONTEXT_MENU_CLOSE_DELAY_MS); + + window.removeEventListener('keydown', closeContextMenuKeyListener); + } + + document.addEventListener('mousedown', closeContextMenuMouseListener); + document.addEventListener('keydown', closeContextMenuKeyListener); + } + + function handleKeyDown(e: React.KeyboardEvent) { + function handleKeyUp() { + checkSelection(); + + e.target.removeEventListener('keyup', handleKeyUp); + } + + if (e.key === 'Enter' && !e.shiftKey) { + if ( + !(IS_IOS || IS_ANDROID) + && ( + (messageSendKeyCombo === 'enter' && !e.shiftKey) + || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey)) + ) + ) { + e.preventDefault(); + + closeTextFormatter(); + onSend(); + } + } else if (e.key === 'ArrowUp' && !html.length) { + e.preventDefault(); + editLastMessage(); + } else { + e.target.addEventListener('keyup', handleKeyUp); + } + } + + function handleTouchSelection() { + if (!IS_ANDROID) { + return; + } + + checkSelection(); + } + + function handleChange(e: ChangeEvent) { + const { innerHTML, textContent } = e.currentTarget; + + onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML); + + // Reset focus on the input to remove any active styling when input is cleared + if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) { + const selection = window.getSelection()!; + if (selection) { + inputRef.current!.blur(); + selection.removeAllRanges(); + focusEditableElement(inputRef.current!, true); + } + } + } + + function stopEvent(e: React.MouseEvent) { + if (!IS_ANDROID) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + } + + function updateInputHeight() { + const input = inputRef.current!; + const clone = cloneRef.current!; + input.style.height = `${Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT)}px`; + input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT); + document.body.classList.toggle('hide-mask-shadow', clone.scrollHeight > DISABLE_MASK_SHADOW_THRESHOLD); + } + + useEffect(() => { + if (IS_TOUCH_ENV) { + return; + } + + focusInput(); + }, [currentChatId, focusInput, replyingToId, shouldSetFocus]); + + useEffect(() => { + if (noTabCapture) { + return undefined; + } + + const captureFirstTab = debounce((e: KeyboardEvent) => { + if (e.key === 'Tab') { + e.preventDefault(); + requestAnimationFrame(focusInput); + } + }, TAB_INDEX_PRIORITY_TIMEOUT, true, false); + + return captureKeyboardListeners({ onTab: captureFirstTab }); + }, [focusInput, noTabCapture]); + + useEffect(() => { + const input = inputRef.current!; + + function supressFocus() { + input.blur(); + } + + if (shouldSupressFocus) { + input.addEventListener('focus', supressFocus); + } + + return () => { + input.removeEventListener('focus', supressFocus); + }; + }, [shouldSupressFocus]); + + const className = buildClassName( + 'form-control custom-scroll', + html.length > 0 && 'touched', + shouldSupressFocus && 'focus-disabled', + ); + + return ( +
    +
    +
    + {placeholder} + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {}; + const { messageSendKeyCombo } = global.settings.byKey; + + return { + currentChatId, + messageSendKeyCombo, + replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined, + noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage']), +)(MessageInput)); diff --git a/src/components/middle/composer/PollModal.async.tsx b/src/components/middle/composer/PollModal.async.tsx new file mode 100644 index 000000000..fc1224c00 --- /dev/null +++ b/src/components/middle/composer/PollModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './PollModal'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const PollModalAsync: FC = (props) => { + const { isOpen } = props; + const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return PollModal ? : undefined; +}; + +export default PollModalAsync; diff --git a/src/components/middle/composer/PollModal.scss b/src/components/middle/composer/PollModal.scss new file mode 100644 index 000000000..cc2d9f1d7 --- /dev/null +++ b/src/components/middle/composer/PollModal.scss @@ -0,0 +1,80 @@ +.PollModal { + .modal-dialog { + max-width: 26.25rem; + max-height: calc(100vh - 5rem); + } + + .modal-content { + padding: .5rem 1.25rem 1.875rem; + min-height: 4.875rem; + } + + .modal-header-condensed { + margin-bottom: 1rem; + } + + .options-header { + color: var(--color-text-secondary); + font-size: 1rem; + font-weight: 500; + margin: 1.5rem 0.25rem; + } + + .options-list { + margin: 1rem -0.75rem -0.5rem; + padding: 0 0.75rem; + border-top: 1px solid var(--color-chat-hover); + max-height: 20rem; + overflow: auto; + + &.overflown { + padding: 0 0.4rem 0.5rem 0.75rem; + } + + @media (max-width: 600px) { + overflow: hidden; + max-height: none; + + &, &.overflown { + padding: 0 0.75rem; + } + } + } + + .option-wrapper { + position: relative; + + .option-remove-button { + position: absolute; + top: 0.3125rem; + right: 0.3125rem; + } + } + + .quiz-mode { + margin-top: 1.5rem; + + .options-header { + margin-bottom: 0.5rem; + } + + .note { + margin-top: 0.5rem; + } + } + + .note { + font-size: smaller; + color: var(--color-text-secondary) + } + + .error { + font-size: smaller; + color: var(--color-error); + margin: -1rem 0 1rem .25rem; + } + + .input-group:last-child { + margin-bottom: 0.5rem; + } +} diff --git a/src/components/middle/composer/PollModal.tsx b/src/components/middle/composer/PollModal.tsx new file mode 100644 index 000000000..43e7eeda7 --- /dev/null +++ b/src/components/middle/composer/PollModal.tsx @@ -0,0 +1,354 @@ +import { ChangeEvent, RefObject } from 'react'; +import React, { + FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState, +} from '../../../lib/teact/teact'; + +import { ApiNewPoll } from '../../../api/types'; + +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import parseMessageInput from './helpers/parseMessageInput'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; +import Modal from '../../ui/Modal'; +import InputText from '../../ui/InputText'; +import Checkbox from '../../ui/Checkbox'; +import RadioGroup from '../../ui/RadioGroup'; + +import './PollModal.scss'; + +export type OwnProps = { + isOpen: boolean; + onSend: (pollSummary: ApiNewPoll) => void; + onClear: () => void; +}; + +const MAX_LIST_HEIGHT = 320; +const MAX_OPTIONS_COUNT = 10; +const MAX_OPTION_LENGTH = 100; +const MAX_QUESTION_LENGTH = 255; +const MAX_SOLUTION_LENGTH = 200; + +const PollModal: FC = ({ isOpen, onSend, onClear }) => { + // eslint-disable-next-line no-null/no-null + const questionInputRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const optionsListRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const solutionRef = useRef(null); + + const [question, setQuestion] = useState(''); + const [options, setOptions] = useState(['']); + const [isAnonymous, setIsAnonymous] = useState(true); + const [isMultipleAnswers, setIsMultipleAnswers] = useState(false); + const [isQuizMode, setIsQuizMode] = useState(false); + const [solution, setSolution] = useState(); + const [correctOption, setCorrectOption] = useState(); + const [hasErrors, setHasErrors] = useState(false); + + const focusInput = useCallback((ref: RefObject) => { + if (isOpen && ref.current) { + ref.current.focus(); + } + }, [isOpen]); + + useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]); + useEffect(() => { + if (!isOpen) { + setQuestion(''); + setOptions(['']); + setIsAnonymous(true); + setIsMultipleAnswers(false); + setIsQuizMode(false); + setSolution(''); + setCorrectOption(''); + setHasErrors(false); + } + }, [isOpen]); + + useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]); + + useLayoutEffect(() => { + const solutionEl = solutionRef.current; + + if (solutionEl && solution !== solutionEl.innerHTML) { + solutionEl.innerHTML = solution; + } + }, [solution]); + + const addNewOption = useCallback((newOptions: string[] = []) => { + setOptions([...newOptions, '']); + requestAnimationFrame(() => { + const list = optionsListRef.current; + if (!list) { + return; + } + + list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT); + list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' }); + }); + }, []); + + const handleCreate = useCallback(() => { + setHasErrors(false); + if (!isOpen) { + return; + } + + const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH); + const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length); + + if (!questionTrimmed || optionsTrimmed.length < 2) { + setQuestion(questionTrimmed); + if (optionsTrimmed.length) { + if (optionsTrimmed.length < 2) { + addNewOption(optionsTrimmed); + } else { + setOptions(optionsTrimmed); + } + } else { + addNewOption(); + } + setHasErrors(true); + return; + } + + if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) { + setHasErrors(true); + return; + } + + const answers = optionsTrimmed + .map((text, index) => ({ + text: text.trim(), + option: String(index), + ...(String(index) === correctOption && { correct: true }), + })); + + const payload: ApiNewPoll = { + summary: { + question: questionTrimmed, + answers, + ...(!isAnonymous && { isPublic: true }), + ...(isMultipleAnswers && { multipleChoice: true }), + ...(isQuizMode && { quiz: true }), + }, + }; + + if (isQuizMode) { + const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {}; + + payload.quiz = { + correctAnswers: [correctOption], + ...(text && { solution: text }), + ...(entities && { solutionEntities: entities }), + }; + } + + onSend(payload); + }, [ + isOpen, + question, + options, + isQuizMode, + correctOption, + isAnonymous, + isMultipleAnswers, + onSend, + addNewOption, + solution, + ]); + + const updateOption = useCallback((index: number, text: string) => { + const newOptions = [...options]; + newOptions[index] = text; + if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) { + addNewOption(newOptions); + } else { + setOptions(newOptions); + } + }, [options, addNewOption]); + + const removeOption = useCallback((index: number) => { + const newOptions = [...options]; + newOptions.splice(index, 1); + setOptions(newOptions); + requestAnimationFrame(() => { + if (!optionsListRef.current) { + return; + } + + optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT); + }); + }, [options]); + + const handleCorrectOptionChange = useCallback((newValue: string) => { + setCorrectOption(newValue); + }, [setCorrectOption]); + + const handleIsAnonymousChange = useCallback((e: ChangeEvent) => { + setIsAnonymous(e.target.checked); + }, []); + + const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => { + setIsMultipleAnswers(e.target.checked); + }, []); + + const handleQuizModeChange = useCallback((e: ChangeEvent) => { + setIsQuizMode(e.target.checked); + }, []); + + const handleKeyPress = useCallback((e: React.KeyboardEvent) => { + if (e.keyCode === 13) { + handleCreate(); + } + }, [handleCreate]); + + const getQuestionError = useCallback(() => { + if (hasErrors && !question.trim().length) { + return 'Please enter the question'; + } + + return undefined; + }, [hasErrors, question]); + + const getOptionsError = useCallback((index: number) => { + const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length); + if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) { + return 'Please enter at least two options'; + } + return undefined; + }, [hasErrors, options]); + + const lang = useLang(); + + function renderHeader() { + return ( +
    + +
    {lang('NewPoll')}
    + +
    + ); + } + + function renderOptions() { + return options.map((option, index) => ( +
    + updateOption(index, e.currentTarget.value)} + onKeyPress={handleKeyPress} + /> + {index !== options.length - 1 && ( + + )} +
    + )); + } + + function renderRadioOptions() { + return renderOptions() + .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 })); + } + + function renderQuizNoOptionError() { + const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length); + + return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && ( +

    + Please choose the correct answer +

    + ); + } + + return ( + + setQuestion(e.currentTarget.value)} + onKeyPress={handleKeyPress} + /> +
    + +
    +

    Options

    + + {hasErrors && renderQuizNoOptionError()} + {isQuizMode ? ( + + ) : ( + renderOptions() + )} + +
    + +
    + +
    + + + + {isQuizMode && ( + <> +

    Solution

    +
    setSolution(e.currentTarget.innerHTML)} + /> +
    + Users will see this comment after choosing a wrong answer, good for educational purposes. +
    + + )} +
    + + ); +}; + +export default memo(PollModal); diff --git a/src/components/middle/composer/StickerPicker.scss b/src/components/middle/composer/StickerPicker.scss new file mode 100644 index 000000000..fc5b964a6 --- /dev/null +++ b/src/components/middle/composer/StickerPicker.scss @@ -0,0 +1,94 @@ +.StickerPicker { + height: 100%; + + &-main { + position: relative; + height: calc(100% - 3rem); + overflow-y: auto; + padding: 0.5rem; + + @media (max-width: 600px) { + padding: 0.5rem 0.25rem; + } + } + + &-header { + height: 3rem; + border-bottom: 1px solid var(--color-borders); + padding: 0.125rem 0; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + box-shadow: 0 0 2px rgba(114, 114, 114, 0.25); + + scrollbar-width: none; + scrollbar-color: rgba(0, 0, 0, 0); + + &::-webkit-scrollbar { + height: 0; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0); + } + + // Spacer to counter last button margin not being accounted in scroll width + &::after { + content: ""; + display: block; + flex-shrink: 0; + width: 0.1px; + height: 1rem; + } + + + .sticker-set-button { + display: inline-flex; + vertical-align: middle; + + &.StickerButton { + background-size: 2rem; + + img, .AnimatedSticker { + top: 0.375rem; + left: 0.375rem; + width: 2rem; + height: 2rem; + } + } + + .sticker-set-cover { + width: 2rem; + height: 2rem; + position: relative; + display: flex; + align-items: center; + justify-content: center; + + img, .AnimatedSticker { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + } + } + } + } + + .symbol-set-container { + width: 25rem; + line-height: 0; + + @media (max-width: 600px) { + width: 100%; + } + } + + .sticker-set-button { + width: 2.75rem !important; + height: 2.75rem; + margin: 0 0.25rem; + border-radius: var(--border-radius-messages-small); + } +} diff --git a/src/components/middle/composer/StickerPicker.tsx b/src/components/middle/composer/StickerPicker.tsx new file mode 100644 index 000000000..8cc784e93 --- /dev/null +++ b/src/components/middle/composer/StickerPicker.tsx @@ -0,0 +1,303 @@ +import React, { + FC, useState, useEffect, memo, useRef, useMemo, useCallback, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiStickerSet, ApiSticker } from '../../../api/types'; +import { StickerSetOrRecent } from '../../../types'; + +import { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import fastSmoothScroll from '../../../util/fastSmoothScroll'; +import buildClassName from '../../../util/buildClassName'; +import { pick } from '../../../util/iteratees'; +import fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal'; +import useAsyncRendering from '../../right/hooks/useAsyncRendering'; +import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; +import useHorizontalScroll from '../../../hooks/useHorizontalScroll'; +import useLang from '../../../hooks/useLang'; + +import Loading from '../../ui/Loading'; +import Button from '../../ui/Button'; +import StickerButton from '../../common/StickerButton'; +import StickerSet from './StickerSet'; +import StickerSetCover from './StickerSetCover'; +import StickerSetCoverAnimated from './StickerSetCoverAnimated'; + +import './StickerPicker.scss'; + +type OwnProps = { + className: string; + loadAndPlay: boolean; + canSendStickers: boolean; + onStickerSelect: (sticker: ApiSticker) => void; +}; + +type StateProps = { + recentStickers: ApiSticker[]; + favoriteStickers: ApiSticker[]; + stickerSetsById: Record; + addedSetIds?: string[]; + shouldPlay?: boolean; +}; + +type DispatchProps = Pick; + +const SMOOTH_SCROLL_DISTANCE = 500; +const HEADER_BUTTON_WIDTH = 52; // px (including margin) +const STICKER_INTERSECTION_THROTTLE = 200; + +const stickerSetIntersections: boolean[] = []; + +const StickerPicker: FC = ({ + className, + loadAndPlay, + canSendStickers, + recentStickers, + favoriteStickers, + addedSetIds, + stickerSetsById, + shouldPlay, + onStickerSelect, + loadStickerSets, + loadRecentStickers, + loadFavoriteStickers, + loadAddedStickers, + addRecentSticker, + unfaveSticker, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const headerRef = useRef(null); + const [activeSetIndex, setActiveSetIndex] = useState(0); + + const { observe: observeIntersection } = useIntersectionObserver({ + rootRef: containerRef, + throttleMs: STICKER_INTERSECTION_THROTTLE, + }, (entries) => { + entries.forEach((entry) => { + const { id } = entry.target as HTMLDivElement; + if (!id || !id.startsWith('sticker-set-')) { + return; + } + + const index = Number(id.replace('sticker-set-', '')); + stickerSetIntersections[index] = entry.isIntersecting; + }); + + const intersectingWithIndexes = stickerSetIntersections + .map((isIntersecting, index) => ({ index, isIntersecting })) + .filter(({ isIntersecting }) => isIntersecting); + + if (!intersectingWithIndexes.length) { + return; + } + + setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index); + }); + const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef }); + + const lang = useLang(); + + const areAddedLoaded = Boolean(addedSetIds); + + const allSets = useMemo(() => { + if (!addedSetIds) { + return MEMO_EMPTY_ARRAY; + } + + return [ + { + id: 'recent', + title: lang('RecentStickers'), + stickers: recentStickers, + count: recentStickers.length, + }, + { + id: 'favorite', + title: lang('FavoriteStickers'), + stickers: favoriteStickers, + count: favoriteStickers.length, + }, + ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean), + ]; + }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]); + + const noPopulatedSets = useMemo(() => ( + areAddedLoaded + && allSets.filter((set) => set.stickers && set.stickers.length).length === 0 + ), [allSets, areAddedLoaded]); + + useEffect(() => { + if (loadAndPlay) { + loadStickerSets(); + loadRecentStickers(); + loadFavoriteStickers(); + } + }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]); + + useEffect(() => { + if (addedSetIds && addedSetIds.length) { + loadAddedStickers(); + } + }, [addedSetIds, loadAddedStickers]); + + useHorizontalScroll(headerRef); + + // Scroll container and header when active set changes + useEffect(() => { + if (!areAddedLoaded) { + return; + } + + const header = headerRef.current; + if (!header) { + return; + } + + const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2); + + fastSmoothScrollHorizontal(header, newLeft); + }, [areAddedLoaded, activeSetIndex]); + + const selectStickerSet = useCallback((index: number) => { + setActiveSetIndex(index); + const stickerSetEl = document.getElementById(`sticker-set-${index}`)!; + fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE); + }, []); + + const handleStickerSelect = useCallback((sticker: ApiSticker) => { + onStickerSelect(sticker); + addRecentSticker({ sticker }); + }, [addRecentSticker, onStickerSelect]); + + const handleStickerUnfave = useCallback((sticker: ApiSticker) => { + unfaveSticker({ sticker }); + }, [unfaveSticker]); + + const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION); + + function renderCover(stickerSet: StickerSetOrRecent, index: number) { + const firstSticker = stickerSet.stickers && stickerSet.stickers[0]; + const buttonClassName = buildClassName( + 'symbol-set-button sticker-set-button', + index === activeSetIndex && 'activated', + ); + + if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) { + return ( + + ); + } else { + return ( + + ); + } + } + + const fullClassName = buildClassName('StickerPicker', className); + + if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) { + return ( +
    + {!canSendStickers ? ( +
    Sending stickers is not allowed in this chat.
    + ) : noPopulatedSets ? ( +
    You have no saved Stickers.
    + ) : ( + + )} +
    + ); + } + + return ( +
    +
    + {allSets.map(renderCover)} +
    +
    + {allSets.map((stickerSet, i) => ( + = i - 1 && activeSetIndex <= i + 1} + onStickerSelect={handleStickerSelect} + onStickerUnfave={handleStickerUnfave} + /> + ))} +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + setsById, + added, + recent, + favorite, + } = global.stickers; + + return { + recentStickers: recent.stickers, + favoriteStickers: favorite.stickers, + stickerSetsById: setsById, + addedSetIds: added.setIds, + shouldPlay: global.settings.byKey.shouldLoopStickers, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadStickerSets', + 'loadRecentStickers', + 'loadFavoriteStickers', + 'loadAddedStickers', + 'addRecentSticker', + 'unfaveSticker', + ]), +)(StickerPicker)); diff --git a/src/components/middle/composer/StickerSet.tsx b/src/components/middle/composer/StickerSet.tsx new file mode 100644 index 000000000..e47afabc2 --- /dev/null +++ b/src/components/middle/composer/StickerSet.tsx @@ -0,0 +1,79 @@ +import React, { FC, memo, useRef } from '../../../lib/teact/teact'; + +import { ApiSticker } from '../../../api/types'; +import { StickerSetOrRecent } from '../../../types'; +import { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver'; + +import { STICKER_SIZE_PICKER } from '../../../config'; +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import windowSize from '../../../util/windowSize'; +import StickerButton from '../../common/StickerButton'; +import useShowTransition from '../../../hooks/useShowTransition'; +import buildClassName from '../../../util/buildClassName'; + +type OwnProps = { + stickerSet: StickerSetOrRecent; + loadAndPlay: boolean; + index: number; + observeIntersection: ObserveFn; + shouldRender: boolean; + onStickerSelect: (sticker: ApiSticker) => void; + onStickerUnfave: (sticker: ApiSticker) => void; +}; + +const STICKERS_PER_ROW_ON_DESKTOP = 5; +const STICKER_MARGIN = IS_MOBILE_SCREEN ? 8 : 16; +const MOBILE_CONTAINER_PADDING = 8; + +const StickerSet: FC = ({ + stickerSet, + loadAndPlay, + index, + observeIntersection, + shouldRender, + onStickerSelect, + onStickerUnfave, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + useOnIntersect(ref, observeIntersection); + + const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow'); + + const stickersPerRow = IS_MOBILE_SCREEN + ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN)) + : STICKERS_PER_ROW_ON_DESKTOP; + const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN); + + return ( +
    +

    {stickerSet.title}

    +
    + {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => ( + + ))} +
    +
    + ); +}; + +export default memo(StickerSet); diff --git a/src/components/middle/composer/StickerSetCover.tsx b/src/components/middle/composer/StickerSetCover.tsx new file mode 100644 index 000000000..85187fa87 --- /dev/null +++ b/src/components/middle/composer/StickerSetCover.tsx @@ -0,0 +1,34 @@ +import React, { FC, memo, useRef } from '../../../lib/teact/teact'; + +import { ApiStickerSet } from '../../../api/types'; + +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useMedia from '../../../hooks/useMedia'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import { getFirstLetters } from '../../../util/textFormat'; + +type OwnProps = { + stickerSet: ApiStickerSet; + observeIntersection: ObserveFn; +}; + +const StickerSetCover: FC = ({ stickerSet, observeIntersection }) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting); + const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow'); + + return ( +
    + {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)} + {shouldRenderFullMedia && ( + + )} +
    + ); +}; + +export default memo(StickerSetCover); diff --git a/src/components/middle/composer/StickerSetCoverAnimated.tsx b/src/components/middle/composer/StickerSetCoverAnimated.tsx new file mode 100644 index 000000000..f794d4813 --- /dev/null +++ b/src/components/middle/composer/StickerSetCoverAnimated.tsx @@ -0,0 +1,48 @@ +import React, { FC, memo, useRef } from '../../../lib/teact/teact'; + +import { ApiMediaFormat, ApiStickerSet } from '../../../api/types'; + +import { STICKER_SIZE_PICKER_HEADER } from '../../../config'; +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useMedia from '../../../hooks/useMedia'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import { getFirstLetters } from '../../../util/textFormat'; + +import AnimatedSticker from '../../common/AnimatedSticker'; + +type OwnProps = { + size?: number; + stickerSet: ApiStickerSet; + observeIntersection: ObserveFn; +}; + +const StickerSetCoverAnimated: FC = ({ + size = STICKER_SIZE_PICKER_HEADER, + stickerSet, + observeIntersection, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const mediaHash = `stickerSet${stickerSet.id}`; + const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie); + const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow'); + + return ( +
    + {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)} + {shouldRenderFullMedia && lottieData && ( + + )} +
    + ); +}; + +export default memo(StickerSetCoverAnimated); diff --git a/src/components/middle/composer/SymbolMenu.async.tsx b/src/components/middle/composer/SymbolMenu.async.tsx new file mode 100644 index 000000000..fd24b8113 --- /dev/null +++ b/src/components/middle/composer/SymbolMenu.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './SymbolMenu'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const SymbolMenuAsync: FC = (props) => { + const { isOpen } = props; + const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return SymbolMenu ? : undefined; +}; + +export default SymbolMenuAsync; diff --git a/src/components/middle/composer/SymbolMenu.scss b/src/components/middle/composer/SymbolMenu.scss new file mode 100644 index 000000000..4d44f309e --- /dev/null +++ b/src/components/middle/composer/SymbolMenu.scss @@ -0,0 +1,148 @@ +@import '../../../styles/mixins'; + +.SymbolMenu { + &.mobile-menu { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background: var(--color-background); + transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0); + z-index: 1; + + transition: transform var(--layer-transition); + + &.open { + transform: translate3d(0, 0 ,0); + body.is-media-viewer-open & { + transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0); + } + } + } + + &-main { + width: var(--symbol-menu-width); + height: var(--symbol-menu-height); + max-height: calc(100vh - var(--symbol-menu-footer-height)); + } + + &-footer { + height: var(--symbol-menu-footer-height); + border-top: 1px solid var(--color-borders); + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0 2px rgba(114, 114, 114, 0.25); + position: relative; + + .Button { + flex-shrink: 0; + width: 2.125rem !important; + height: 2.125rem; + margin: 0 .25rem; + padding: 0; + + &.activated { + pointer-events: none; + } + + &.symbol-tab-button { + margin: 0 0.75rem; + } + + &.symbol-search-button{ + position: absolute; + left: 0.25rem; + } + + &.symbol-delete-button { + position: absolute; + right: 0.25rem; + } + } + } + + .Transition.slide { + height: 100%; + + .Loading { + height: var(--symbol-menu-height); + } + } + + .is-pointer-env & { + > .backdrop { + position: absolute; + top: -1rem; + left: 0; + right: auto; + width: 3.5rem; + height: 4.5rem; + } + } + + .bubble { + padding: 0; + width: var(--symbol-menu-width); + overflow: hidden; + } + + .picker-disabled { + height: var(--symbol-menu-height); + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-secondary); + } + + .symbol-close-button { + display: none; + position: absolute; + right: .25rem; + top: .25rem; + } + + @media (orientation: landscape) { + .symbol-close-button { + display: block; + } + } +} + +.symbol-set { + margin-bottom: 1rem; + + &-name { + font-size: 1rem; + line-height: 1.6875rem; + font-weight: 500; + margin: 0; + padding-left: 0.5rem; + color: rgba(var(--color-text-secondary-rgb), 0.75); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + &-button { + flex-shrink: 0; + width: 2.125rem !important; + height: 2.125rem; + margin: 0 0.25rem; + padding: 0; + } + + @include while-transition() { + overflow: hidden; + } + + .symbol-set-container { + &:not(.shown) { + display: block; + } + + &.closing { + transition: none; + } + } +} diff --git a/src/components/middle/composer/SymbolMenu.tsx b/src/components/middle/composer/SymbolMenu.tsx new file mode 100644 index 000000000..ee1aeccdd --- /dev/null +++ b/src/components/middle/composer/SymbolMenu.tsx @@ -0,0 +1,195 @@ +import React, { + FC, memo, useState, useCallback, useEffect, useLayoutEffect, +} from '../../../lib/teact/teact'; + +import { ApiSticker, ApiVideo } from '../../../api/types'; + +import { IAllowedAttachmentOptions } from '../../../modules/helpers'; +import { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../../../util/environment'; +import { fastRaf } from '../../../util/schedulers'; +import buildClassName from '../../../util/buildClassName'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useMouseInside from '../../../hooks/useMouseInside'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; +import Menu from '../../ui/Menu'; +import Transition from '../../ui/Transition'; +import EmojiPicker from './EmojiPicker'; +import StickerPicker from './StickerPicker'; +import GifPicker from './GifPicker'; +import SymbolMenuFooter, { SymbolMenuTabs, SYMBOL_MENU_TAB_TITLES } from './SymbolMenuFooter'; +import Portal from '../../ui/Portal'; + +import './SymbolMenu.scss'; + +const ANIMATION_DURATION = 350; + +export type OwnProps = { + isOpen: boolean; + allowedAttachmentOptions: IAllowedAttachmentOptions; + onLoad: () => void; + onClose: () => void; + onEmojiSelect: (emoji: string) => void; + onStickerSelect: (sticker: ApiSticker) => void; + onGifSelect: (gif: ApiVideo) => void; + onRemoveSymbol: () => void; + onSearchOpen: (type: 'stickers' | 'gifs') => void; +}; + +let isActivated = false; + +const SymbolMenu: FC = ({ + isOpen, allowedAttachmentOptions, + onLoad, onClose, + onEmojiSelect, onStickerSelect, onGifSelect, + onRemoveSymbol, onSearchOpen, +}) => { + const [activeTab, setActiveTab] = useState(0); + + const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose); + const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false); + + if (!isActivated && isOpen) { + isActivated = true; + } + + useEffect(() => { + onLoad(); + }, [onLoad]); + + useLayoutEffect(() => { + if (!IS_MOBILE_SCREEN) { + return undefined; + } + + if (isOpen) { + document.body.classList.add('enable-symbol-menu-transforms'); + document.body.classList.add('is-symbol-menu-open'); + } + + return () => { + if (isOpen) { + fastRaf(() => { + document.body.classList.remove('is-symbol-menu-open'); + setTimeout(() => { + document.body.classList.remove('enable-symbol-menu-transforms'); + }, ANIMATION_DURATION); + }); + } + }; + }, [isOpen]); + + const handleSearch = useCallback((type: 'stickers' | 'gifs') => { + onClose(); + onSearchOpen(type); + }, [onClose, onSearchOpen]); + + const lang = useLang(); + + const { canSendStickers, canSendGifs } = allowedAttachmentOptions; + + function renderContent(isActive: boolean, isFrom: boolean) { + switch (activeTab) { + case SymbolMenuTabs.Emoji: + return ( + + ); + case SymbolMenuTabs.Stickers: + return ( + + ); + case SymbolMenuTabs.GIFs: + return ( + + ); + } + + return undefined; + } + + function stopPropagation(event: any) { + event.stopPropagation(); + } + + const content = ( + <> +
    + {isActivated && ( + + {renderContent} + + )} +
    + {IS_MOBILE_SCREEN && ( + + )} + + + ); + + if (IS_MOBILE_SCREEN) { + if (!shouldRender) { + return undefined; + } + + const className = buildClassName( + 'SymbolMenu mobile-menu', + transitionClassNames, + ); + + return ( + +
    + {content} +
    +
    + ); + } + + return ( + + {content} + + ); +}; + +export default memo(SymbolMenu); diff --git a/src/components/middle/composer/SymbolMenuFooter.tsx b/src/components/middle/composer/SymbolMenuFooter.tsx new file mode 100644 index 000000000..b60b180f9 --- /dev/null +++ b/src/components/middle/composer/SymbolMenuFooter.tsx @@ -0,0 +1,90 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; + +import Button from '../../ui/Button'; + +type OwnProps = { + activeTab: SymbolMenuTabs; + onSwitchTab: (tab: SymbolMenuTabs) => void; + onRemoveSymbol: () => void; + onSearchOpen: (type: 'stickers' | 'gifs') => void; +}; + +export enum SymbolMenuTabs { + 'Emoji', + 'Stickers', + 'GIFs', +} + +// Getting enum string values for display in Tabs. +// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings +export const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs) + .filter((value): value is string => typeof value === 'string'); + +const SYMBOL_MENU_TAB_ICONS = { + [SymbolMenuTabs.Emoji]: 'icon-smile', + [SymbolMenuTabs.Stickers]: 'icon-stickers', + [SymbolMenuTabs.GIFs]: 'icon-gifs', +}; + +const SymbolMenuFooter: FC = ({ + activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen, +}) => { + function renderTabButton(tab: SymbolMenuTabs) { + return ( + + ); + } + + const handleSearchOpen = useCallback(() => { + onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs'); + }, [activeTab, onSearchOpen]); + + function stopPropagation(event: any) { + event.stopPropagation(); + } + + return ( +
    + {activeTab !== SymbolMenuTabs.Emoji && ( + + )} + + {renderTabButton(SymbolMenuTabs.Emoji)} + {renderTabButton(SymbolMenuTabs.Stickers)} + {renderTabButton(SymbolMenuTabs.GIFs)} + + {activeTab === SymbolMenuTabs.Emoji && ( + + )} +
    + ); +}; + +export default memo(SymbolMenuFooter); diff --git a/src/components/middle/composer/TextFormatter.async.tsx b/src/components/middle/composer/TextFormatter.async.tsx new file mode 100644 index 000000000..0ec8cf379 --- /dev/null +++ b/src/components/middle/composer/TextFormatter.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './TextFormatter'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const TextFormatterAsync: FC = (props) => { + const { isOpen } = props; + const TextFormatter = useModuleLoader(Bundles.Extra, 'TextFormatter', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return TextFormatter ? : undefined; +}; + +export default TextFormatterAsync; diff --git a/src/components/middle/composer/TextFormatter.scss b/src/components/middle/composer/TextFormatter.scss new file mode 100644 index 000000000..a293f0bfa --- /dev/null +++ b/src/components/middle/composer/TextFormatter.scss @@ -0,0 +1,123 @@ +.TextFormatter { + transform: translate(-50%, -3.25rem); + + &, &-link-control { + position: absolute; + background: white; + border-radius: var(--border-radius-messages); + padding: 0.5rem 0.375rem; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + } + + &-link-control { + left: 0; + top: 0; + opacity: 0; + pointer-events: none; + transition: opacity .3s ease; + + @media (max-width: 600px) { + max-width: calc(100vw - var(--text-formatter-left) + 3rem); + } + + input { + border: none !important; + outline: none !important; + width: 100%; + } + } + + &-buttons, &-link-url-confirm { + display: flex; + flex-wrap: nowrap; + align-items: center; + } + + &-divider { + width: 1px; + height: 1.75rem; + margin: 0 0.25rem; + background-color: var(--color-borders); + } + + &-link-url-input-wrapper { + width: 20rem; + position: relative; + + @media (max-width: 600px) { + max-width: 90vw; + } + + &::before, &::after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + width: 1rem; + z-index: 2; + opacity: 0; + transition: opacity .2s ease; + } + + &::before { + left: 0; + background: linear-gradient(to right, #fff .25rem, transparent 1rem) + } + + &::after { + right: 0; + background: linear-gradient(to left, #fff .25rem, transparent 1rem) + } + + &.mask-left { + &::before { + opacity: 1; + } + } + + &.mask-right { + &::after { + opacity: 1; + } + } + } + + &-link-url-confirm { + flex-shrink: 0; + opacity: 0; + transition: opacity .3s ease; + + &.shown { + opacity: 1; + } + } + + &.link-control-shown { + .TextFormatter-link-control { + opacity: 1; + pointer-events: all; + } + } + + .Button { + width: 2rem; + height: 2rem; + padding: 0.25rem; + font-size: 1.5rem; + margin: 0 0.125rem; + border-radius: var(--border-radius-messages-small); + flex-shrink: 0; + cursor: pointer; + + &.active { + background-color: var(--color-primary) !important; + color: white; + } + + &.disabled { + opacity: .5; + pointer-events: none; + } + } +} diff --git a/src/components/middle/composer/TextFormatter.tsx b/src/components/middle/composer/TextFormatter.tsx new file mode 100644 index 000000000..a67c99fb1 --- /dev/null +++ b/src/components/middle/composer/TextFormatter.tsx @@ -0,0 +1,449 @@ +import React, { + FC, memo, useCallback, useEffect, useRef, useState, +} from '../../../lib/teact/teact'; + +import { IAnchorPosition } from '../../../types'; + +import { EDITABLE_INPUT_ID } from '../../../config'; +import buildClassName from '../../../util/buildClassName'; +import captureEscKeyListener from '../../../util/captureEscKeyListener'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useVirtualBackdrop from '../../../hooks/useVirtualBackdrop'; +import useFlag from '../../../hooks/useFlag'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; + +import './TextFormatter.scss'; + +export type OwnProps = { + isOpen: boolean; + anchorPosition?: IAnchorPosition; + selectedRange?: Range; + onClose: () => void; +}; + +interface ISelectedTextFormats { + bold?: boolean; + italic?: boolean; + underline?: boolean; + strikethrough?: boolean; + monospace?: boolean; +} + +const TEXT_FORMAT_BY_TAG_NAME: Record = { + B: 'bold', + STRONG: 'bold', + I: 'italic', + EM: 'italic', + U: 'underline', + DEL: 'strikethrough', + CODE: 'monospace', +}; + +const TextFormatter: FC = ({ + isOpen, + anchorPosition, + selectedRange, + onClose, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const linkUrlInputRef = useRef(null); + const { shouldRender, transitionClassNames } = useShowTransition(isOpen); + const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag(); + const [linkUrl, setLinkUrl] = useState(''); + const [isEditingLink, setIsEditingLink] = useState(false); + const [inputClassName, setInputClassName] = useState(); + const [selectedTextFormats, setSelectedTextFormats] = useState({}); + + useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]); + useVirtualBackdrop( + isOpen, + containerRef, + onClose, + ); + + useEffect(() => { + if (isLinkControlOpen) { + linkUrlInputRef.current!.focus(); + } else { + setLinkUrl(''); + setIsEditingLink(false); + } + }, [isLinkControlOpen]); + + useEffect(() => { + if (!shouldRender) { + closeLinkControl(); + setSelectedTextFormats({}); + setInputClassName(undefined); + } + }, [closeLinkControl, shouldRender]); + + useEffect(() => { + if (!isOpen || !selectedRange) { + return; + } + + const selectedFormats: ISelectedTextFormats = {}; + let { parentElement } = selectedRange.commonAncestorContainer; + while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) { + const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName]; + if (textFormat) { + selectedFormats[textFormat] = true; + } + + parentElement = parentElement.parentElement; + } + + setSelectedTextFormats(selectedFormats); + }, [isOpen, selectedRange, openLinkControl]); + + function restoreSelection() { + if (!selectedRange) { + return; + } + + const selection = window.getSelection(); + if (selection) { + selection.removeAllRanges(); + selection.addRange(selectedRange); + } + } + + const getSelectedText = useCallback(() => { + if (!selectedRange) { + return undefined; + } + + return selectedRange.toString(); + }, [selectedRange]); + + const getSelectedElement = useCallback(() => { + if (!selectedRange) { + return undefined; + } + + return selectedRange.commonAncestorContainer.parentElement; + }, [selectedRange]); + + function updateInputStyles() { + const input = linkUrlInputRef.current; + if (!input) { + return; + } + + const { offsetWidth, scrollWidth, scrollLeft } = input; + if (scrollWidth <= offsetWidth) { + setInputClassName(undefined); + return; + } + + let className = ''; + if (scrollLeft < scrollWidth - offsetWidth) { + className = 'mask-right'; + } + if (scrollLeft > 0) { + className += ' mask-left'; + } + + setInputClassName(className); + } + + function handleLinkUrlChange(e: React.ChangeEvent) { + setLinkUrl(e.target.value); + updateInputStyles(); + } + + function getFormatButtonClassName(key: keyof ISelectedTextFormats) { + if (selectedTextFormats[key]) { + return 'active'; + } + + if (key === 'monospace' || key === 'strikethrough') { + if (Object.keys(selectedTextFormats).some( + (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats], + )) { + return 'disabled'; + } + } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) { + return 'disabled'; + } + + return undefined; + } + + const handleBoldText = useCallback(() => { + setSelectedTextFormats((selectedFormats) => { + // Somehow re-applying 'bold' command to already bold text doesn't work + document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold'); + Object.keys(selectedFormats).forEach((key) => { + if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) { + document.execCommand(key); + } + }); + + return { + ...selectedFormats, + bold: !selectedFormats.bold, + }; + }); + }, []); + + const handleItalicText = useCallback(() => { + document.execCommand('italic'); + setSelectedTextFormats((selectedFormats) => ({ + ...selectedFormats, + italic: !selectedFormats.italic, + })); + }, []); + + const handleUnderlineText = useCallback(() => { + document.execCommand('underline'); + setSelectedTextFormats((selectedFormats) => ({ + ...selectedFormats, + underline: !selectedFormats.underline, + })); + }, []); + + const handleStrikethroughText = useCallback(() => { + if (selectedTextFormats.strikethrough) { + const element = getSelectedElement(); + if ( + !selectedRange + || !element + || element.tagName !== 'DEL' + || !element.textContent + ) { + return; + } + + element.replaceWith(element.textContent); + setSelectedTextFormats((selectedFormats) => ({ + ...selectedFormats, + strikethrough: false, + })); + + return; + } + + const text = getSelectedText(); + document.execCommand('insertHTML', false, `${text}`); + onClose(); + }, [ + getSelectedElement, getSelectedText, onClose, + selectedRange, selectedTextFormats.strikethrough, + ]); + + const handleMonospaceText = useCallback(() => { + if (selectedTextFormats.monospace) { + const element = getSelectedElement(); + if ( + !selectedRange + || !element + || element.tagName !== 'CODE' + || !element.textContent + ) { + return; + } + + element.replaceWith(element.textContent); + setSelectedTextFormats((selectedFormats) => ({ + ...selectedFormats, + monospace: false, + })); + return; + } + + const text = getSelectedText(); + document.execCommand('insertHTML', false, `${text}`); + onClose(); + }, [ + getSelectedElement, getSelectedText, onClose, + selectedRange, selectedTextFormats.monospace, + ]); + + function handleLinkUrlConfirm() { + const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`; + + if (isEditingLink) { + const element = getSelectedElement(); + if (!element || element.tagName !== 'A') { + return; + } + + (element as HTMLAnchorElement).href = formattedLinkUrl; + + onClose(); + return; + } + + const text = getSelectedText(); + restoreSelection(); + document.execCommand('insertHTML', false, `${text}`); + onClose(); + } + + const handleKeyDown = useCallback((e: KeyboardEvent) => { + const HANDLERS_BY_KEY_CODE: Record = { + KeyK: openLinkControl, + KeyB: handleBoldText, + KeyU: handleUnderlineText, + KeyI: handleItalicText, + KeyM: handleMonospaceText, + KeyS: handleStrikethroughText, + }; + + const handler = HANDLERS_BY_KEY_CODE[e.code]; + + if ( + e.altKey + || !(e.ctrlKey || e.metaKey) + || !handler + ) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + handler(); + }, [ + handleBoldText, handleItalicText, handleUnderlineText, + handleMonospaceText, handleStrikethroughText, + openLinkControl, + ]); + + useEffect(() => { + if (isOpen) { + document.addEventListener('keydown', handleKeyDown); + } + + return () => document.removeEventListener('keydown', handleKeyDown); + }, [isOpen, handleKeyDown]); + + const lang = useLang(); + + function handleContainerKeyDown(e: React.KeyboardEvent) { + if (e.key === 'Enter' && isLinkControlOpen) { + handleLinkUrlConfirm(); + e.preventDefault(); + } + } + + if (!shouldRender) { + return undefined; + } + + const className = buildClassName( + 'TextFormatter', + transitionClassNames, + isLinkControlOpen && 'link-control-shown', + ); + + const linkUrlConfirmClassName = buildClassName( + 'TextFormatter-link-url-confirm', + !!linkUrl.length && 'shown', + ); + + const style = anchorPosition + ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;` + : ''; + + return ( +
    +
    + + + + + +
    + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    + ); +}; + +export default memo(TextFormatter); diff --git a/src/components/middle/composer/WebPagePreview.scss b/src/components/middle/composer/WebPagePreview.scss new file mode 100644 index 000000000..b4c186b9c --- /dev/null +++ b/src/components/middle/composer/WebPagePreview.scss @@ -0,0 +1,41 @@ +.WebPagePreview { + display: flex; + align-items: center; + margin-bottom: -.75rem; + padding-right: 0.625rem; + padding-top: 0.45rem; + + // TODO: Remove this when support for disabling webpage preview is added + padding-left: 3.375rem; + + --accent-color: var(--color-primary); + + .ComposerEmbeddedMessage + & { + margin-top: 0.75rem; + } + + & > .Button { + flex-shrink: 0; + background: none !important; + width: 2.125rem; + height: 2.125rem; + margin: 0 0.625rem; + padding: 0; + align-self: center; + } + + .WebPage { + flex-grow: 1; + margin: 0.1875rem 0 0.1875rem 0.125rem; + + &::before { + top: .125rem; + bottom: .0625rem; + } + + .site-title { + margin-top: .125rem; + margin-bottom: 0.1875rem; + } + } +} diff --git a/src/components/middle/composer/WebPagePreview.tsx b/src/components/middle/composer/WebPagePreview.tsx new file mode 100644 index 000000000..32a7c805a --- /dev/null +++ b/src/components/middle/composer/WebPagePreview.tsx @@ -0,0 +1,84 @@ +import React, { + FC, memo, useEffect, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions, GlobalState } from '../../../global/types'; +import { ApiMessage, ApiMessageEntityTypes } from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import parseMessageInput from './helpers/parseMessageInput'; +import useOnChange from '../../../hooks/useOnChange'; + +import WebPage from '../message/WebPage'; + +import './WebPagePreview.scss'; + +type OwnProps = { + chatId: number; + messageText: string; +}; + +type StateProps = Pick; +type DispatchProps = Pick; + +const RE_LINK = /https?:\/\/(www.)?([a-zA-Z0-9.-]{2,256})([a-zA-Z/.-]{1,256})([?|#][=&#a-zA-Z0-9]{2,128})?/; + +const WebPagePreview: FC = ({ + chatId, + messageText, + webPagePreview, + loadWebPagePreview, + clearWebPagePreview, +}) => { + const link = useMemo(() => { + const { text, entities } = parseMessageInput(messageText); + + const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl); + if (linkEntity) { + return linkEntity.url; + } + + const textMatch = text.match(RE_LINK); + if (textMatch) { + return textMatch[0]; + } + + return undefined; + }, [messageText]); + + useEffect(() => { + if (link) { + loadWebPagePreview({ text: link }); + } else { + clearWebPagePreview(); + } + }, [clearWebPagePreview, link, loadWebPagePreview]); + + useOnChange(() => { + clearWebPagePreview(); + }, [chatId]); + + if (!webPagePreview || !messageText.length) { + return undefined; + } + + // TODO Refactor so `WebPage` can be used without message + const { photo, ...webPageWithoutPhoto } = webPagePreview; + const messageStub = { + content: { + webPage: webPageWithoutPhoto, + }, + } as ApiMessage; + + return ( +
    + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => pick(global, ['webPagePreview']), + (setGlobal, actions): DispatchProps => pick(actions, ['loadWebPagePreview', 'clearWebPagePreview']), +)(WebPagePreview)); diff --git a/src/components/middle/composer/helpers/buildAttachment.ts b/src/components/middle/composer/helpers/buildAttachment.ts new file mode 100644 index 000000000..a04268111 --- /dev/null +++ b/src/components/middle/composer/helpers/buildAttachment.ts @@ -0,0 +1,79 @@ +import { ApiAttachment } from '../../../../api/types'; +import { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files'; + +const MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB +const MAX_QUICK_IMG_SIZE = 1280; // px + +export default async function buildAttachment( + filename: string, blob: Blob, isQuick: boolean, options?: Partial, +): Promise { + const blobUrl = URL.createObjectURL(blob); + const { type: mimeType, size } = blob; + let quick; + let previewBlobUrl; + + if (mimeType.startsWith('image/')) { + if (isQuick) { + const img = await preloadImage(blobUrl); + const { width, height } = img; + + if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') { + const newBlob = await squeezeImage(img); + if (newBlob) { + URL.revokeObjectURL(blobUrl); + return buildAttachment(filename, newBlob, true, options); + } else { + return buildAttachment(filename, blob, false, options); + } + } + + quick = { width, height }; + } else { + previewBlobUrl = blobUrl; + } + } else if (mimeType.startsWith('video/')) { + // Videos < 10 MB are always sent in quick mode (in other clients). + // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented. + if (size < MAX_QUICK_VIDEO_SIZE) { + const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl); + quick = { width, height, duration }; + } + + previewBlobUrl = await createPosterForVideo(blobUrl); + } + + return { + blobUrl, + filename, + mimeType, + size, + quick, + previewBlobUrl, + ...options, + }; +} + +function squeezeImage(img: HTMLImageElement): Promise { + return new Promise((resolve) => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d')!; + + let { width, height } = img; + + if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) { + if (width >= height) { + height *= MAX_QUICK_IMG_SIZE / width; + width = MAX_QUICK_IMG_SIZE; + } else { + width *= MAX_QUICK_IMG_SIZE / height; + height = MAX_QUICK_IMG_SIZE; + } + } + + canvas.width = width; + canvas.height = height; + + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height); + canvas.toBlob(resolve, 'image/jpeg', 100); + }); +} diff --git a/src/components/middle/composer/helpers/getMessageTextAsHtml.ts b/src/components/middle/composer/helpers/getMessageTextAsHtml.ts new file mode 100644 index 000000000..337b8688f --- /dev/null +++ b/src/components/middle/composer/helpers/getMessageTextAsHtml.ts @@ -0,0 +1,23 @@ +import { ApiFormattedText } from '../../../../api/types'; +import { renderTextWithEntities } from '../../../common/helpers/renderMessageText'; + +export default function getMessageTextAsHtml(formattedText?: ApiFormattedText) { + const { text, entities } = formattedText || {}; + if (!text) { + return ''; + } + + const result = renderTextWithEntities( + text, + entities, + undefined, + undefined, + true, + ); + + if (Array.isArray(result)) { + return result.join(''); + } + + return result; +} diff --git a/src/components/middle/composer/helpers/parseMessageInput.ts b/src/components/middle/composer/helpers/parseMessageInput.ts new file mode 100644 index 000000000..9fd8ded0e --- /dev/null +++ b/src/components/middle/composer/helpers/parseMessageInput.ts @@ -0,0 +1,161 @@ +import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types'; +import { IS_EMOJI_SUPPORTED } from '../../../../util/environment'; + +const ENTITY_CLASS_BY_NODE_NAME: Record = { + B: ApiMessageEntityTypes.Bold, + STRONG: ApiMessageEntityTypes.Bold, + I: ApiMessageEntityTypes.Italic, + EM: ApiMessageEntityTypes.Italic, + U: ApiMessageEntityTypes.Underline, + S: ApiMessageEntityTypes.Strike, + STRIKE: ApiMessageEntityTypes.Strike, + DEL: ApiMessageEntityTypes.Strike, + CODE: ApiMessageEntityTypes.Code, + PRE: ApiMessageEntityTypes.Pre, + BLOCKQUOTE: ApiMessageEntityTypes.Blockquote, +}; + +const MAX_TAG_DEEPNESS = 3; +const MAX_MESSAGE_LENGTH = 4096; + +export default function parseMessageInput(html: string): ApiFormattedText { + const fragment = document.createElement('div'); + fragment.innerHTML = parseMarkdown(html); + const text = fragment.innerText.trim().replace(/\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH); + let textIndex = 0; + let recursionDeepness = 0; + const entities: ApiMessageEntity[] = []; + + function addEntity(node: ChildNode) { + const { index, entity } = getEntityDataFromNode(node, text, textIndex); + + if (entity) { + textIndex = index; + entities.push(entity); + } else if (node.textContent) { + textIndex += node.textContent.length; + } + + if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) { + recursionDeepness += 1; + Array.from(node.childNodes).forEach(addEntity); + } + } + + Array.from(fragment.childNodes).forEach((node) => { + recursionDeepness = 1; + addEntity(node); + }); + + return { + text, + entities: entities.length ? entities : undefined, + }; +} + +function parseMarkdown(html: string) { + let parsedHtml = html.slice(0); + + if (!IS_EMOJI_SUPPORTED) { + // Emojis + parsedHtml = parsedHtml.replace(/]+alt="([^"]+)"[^>]*>/gm, '$1'); + } + // Strip redundant tags + parsedHtml = parsedHtml.replace(/<\/?span([^>]*)?>/g, ''); + + // Strip redundant nbsp's + parsedHtml = parsedHtml.replace(/ /g, ' '); + + // Replace
    with newline + parsedHtml = parsedHtml.replace(/]*)?>/g, '\n'); + + // Strip redundant
    tags + parsedHtml = parsedHtml.replace(/<\/div>(\s*)
    /g, '\n'); + parsedHtml = parsedHtml.replace(/
    /g, '\n'); + parsedHtml = parsedHtml.replace(/<\/div>/g, ''); + + // Pre + parsedHtml = parsedHtml.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm, '
    $1
    '); + parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
    $1
    '); + + // Code + parsedHtml = parsedHtml.replace(/[`]{1}([^`\n]+)[`]{1}/g, '$1'); + + // Other simple markdown + parsedHtml = parsedHtml.replace(/[*]{2}([^*\n]+)[*]{2}/g, '$1'); + parsedHtml = parsedHtml.replace(/[*]{1}([^*\n]+)[*]{1}/g, '$1'); + parsedHtml = parsedHtml.replace(/[~]{2}([^~\n]+)[~]{2}/g, '$1'); + + return parsedHtml; +} + +function getEntityDataFromNode( + node: ChildNode, + rawText: string, + textIndex: number, +): { index: number; entity?: ApiMessageEntity } { + const type = getEntityTypeFromNode(node); + if (!type || !node.textContent) { + return { + index: textIndex, + entity: undefined, + }; + } + + const rawIndex = rawText.indexOf(node.textContent, textIndex); + // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`). + // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead. + const index = rawIndex >= 0 ? rawIndex : textIndex; + const offset = rawText.substring(0, index).length; + const { length } = rawText.substring(index, index + node.textContent.length); + + let url: string | undefined; + let userId: number | undefined; + if (type === ApiMessageEntityTypes.TextUrl) { + url = (node as HTMLAnchorElement).href; + } + if (type === ApiMessageEntityTypes.MentionName) { + userId = Number((node as HTMLAnchorElement).dataset.userId); + } + + return { + index, + entity: { + type, + offset, + length, + ...(url && { url }), + ...(userId && { userId }), + }, + }; +} + +function getEntityTypeFromNode(node: ChildNode) { + if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) { + return ENTITY_CLASS_BY_NODE_NAME[node.nodeName]; + } + + if (node.nodeName === 'A') { + const anchor = node as HTMLAnchorElement; + if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) { + return ApiMessageEntityTypes.MentionName; + } + if (anchor.href.startsWith('mailto:')) { + return ApiMessageEntityTypes.Email; + } + if (anchor.href.startsWith('tel:')) { + return ApiMessageEntityTypes.Phone; + } + if (anchor.href !== anchor.textContent) { + return ApiMessageEntityTypes.TextUrl; + } + + return ApiMessageEntityTypes.Url; + } + + if (node.nodeName === 'SPAN') { + return (node as HTMLElement).dataset.entityType; + } + + return undefined; +} diff --git a/src/components/middle/composer/helpers/searchUserName.ts b/src/components/middle/composer/helpers/searchUserName.ts new file mode 100644 index 000000000..c6e68d804 --- /dev/null +++ b/src/components/middle/composer/helpers/searchUserName.ts @@ -0,0 +1,15 @@ +import { ApiUser } from '../../../../api/types'; +import { getUserFullName } from '../../../../modules/helpers'; +import searchWords from '../../../../util/searchWords'; + +// TODO: Support cyrillic translit search +export default function searchUserName(filter: string, user: ApiUser) { + const usernameLowered = user.username.toLowerCase(); + const fullName = getUserFullName(user); + const fullNameLowered = fullName && fullName.toLowerCase(); + const filterLowered = filter.toLowerCase(); + + return usernameLowered.startsWith(filterLowered) || ( + fullNameLowered && searchWords(fullNameLowered, filterLowered) + ); +} diff --git a/src/components/middle/composer/helpers/selection.ts b/src/components/middle/composer/helpers/selection.ts new file mode 100644 index 000000000..6eca80f64 --- /dev/null +++ b/src/components/middle/composer/helpers/selection.ts @@ -0,0 +1,15 @@ +import { EDITABLE_INPUT_ID } from '../../../../config'; + +const MAX_NESTING_PARENTS = 5; + +export function isSelectionInsideInput(selectionRange: Range) { + const { commonAncestorContainer } = selectionRange; + let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement; + let iterations = 1; + while (parentNode && parentNode.id !== EDITABLE_INPUT_ID && iterations < MAX_NESTING_PARENTS) { + parentNode = parentNode.parentElement; + iterations++; + } + + return Boolean(parentNode && parentNode.id === EDITABLE_INPUT_ID); +} diff --git a/src/components/middle/composer/hooks/useClipboardPaste.ts b/src/components/middle/composer/hooks/useClipboardPaste.ts new file mode 100644 index 000000000..d910bc3c5 --- /dev/null +++ b/src/components/middle/composer/hooks/useClipboardPaste.ts @@ -0,0 +1,56 @@ +import { StateHookSetter, useEffect } from '../../../../lib/teact/teact'; +import { ApiAttachment, ApiMessage } from '../../../../api/types'; + +import buildAttachment from '../helpers/buildAttachment'; +import { EDITABLE_INPUT_ID } from '../../../../config'; + +const CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif']; +const MAX_MESSAGE_LENGTH = 4096; + +export default ( + insertTextAndUpdateCursor: (text: string) => void, + setAttachments: StateHookSetter, + editedMessage: ApiMessage | undefined, +) => { + useEffect(() => { + async function handlePaste(e: ClipboardEvent) { + if (!e.clipboardData) { + return; + } + + const input = document.getElementById(EDITABLE_INPUT_ID); + if (input !== document.activeElement) { + return; + } + + const { items } = e.clipboardData; + const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type)); + const file = media && media.getAsFile(); + const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH); + + if (!file && !pastedText) { + return; + } + + e.preventDefault(); + + if (file && !editedMessage) { + const attachment = await buildAttachment(file.name, file, true); + setAttachments((attachments) => [ + ...attachments, + attachment, + ]); + } + + if (pastedText) { + insertTextAndUpdateCursor(pastedText); + } + } + + document.addEventListener('paste', handlePaste, false); + + return () => { + document.removeEventListener('paste', handlePaste, false); + }; + }, [insertTextAndUpdateCursor, editedMessage, setAttachments]); +}; diff --git a/src/components/middle/composer/hooks/useDraft.ts b/src/components/middle/composer/hooks/useDraft.ts new file mode 100644 index 000000000..3387beca4 --- /dev/null +++ b/src/components/middle/composer/hooks/useDraft.ts @@ -0,0 +1,107 @@ +import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact'; + +import { ApiFormattedText, ApiMessage } from '../../../../api/types'; +import { GlobalActions } from '../../../../global/types'; + +import { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config'; +import usePrevious from '../../../../hooks/usePrevious'; +import { debounce } from '../../../../util/schedulers'; +import focusEditableElement from '../../../../util/focusEditableElement'; +import parseMessageInput from '../helpers/parseMessageInput'; +import getMessageTextAsHtml from '../helpers/getMessageTextAsHtml'; + +// Used to avoid running debounced callbacks when chat changes. +let currentChatId: number | undefined; +let currentThreadId: number | undefined; + +export default ( + draft: ApiFormattedText | undefined, + chatId: number, + threadId: number, + html: string, + htmlRef: { current: string }, + setHtml: (html: string) => void, + editedMessage: ApiMessage | undefined, + saveDraft: GlobalActions['saveDraft'], + clearDraft: GlobalActions['clearDraft'], +) => { + const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => { + if (htmlRef.current.length && !editedMessage) { + saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) }); + } else { + clearDraft({ chatId: draftChatId, threadId: draftThreadId }); + } + }, [clearDraft, editedMessage, htmlRef, saveDraft]); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]); + + const prevChatId = usePrevious(chatId); + const prevThreadId = usePrevious(threadId); + + // Save draft on chat change + useEffect(() => { + currentChatId = chatId; + currentThreadId = threadId; + + return () => { + currentChatId = undefined; + currentThreadId = undefined; + + updateDraft(chatId, threadId); + }; + }, [chatId, threadId, updateDraft]); + + // Restore draft on chat change + useEffect(() => { + if (chatId === prevChatId && threadId === prevThreadId) { + return; + } + + if (!draft) { + return; + } + + setHtml(getMessageTextAsHtml(draft)); + + requestAnimationFrame(() => { + const messageInput = document.getElementById(EDITABLE_INPUT_ID)!; + focusEditableElement(messageInput, true); + }); + }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]); + + // Update draft when input changes + const prevHtml = usePrevious(html); + useEffect(() => { + if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) { + return; + } + + if (html.length) { + runDebouncedForSaveDraft(() => { + if (currentChatId !== chatId || currentThreadId !== threadId) { + return; + } + + updateDraft(chatId, threadId); + }); + } else { + updateDraft(chatId, threadId); + } + }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]); + + // Subscribe and handle `window.blur` + useEffect(() => { + function handleBlur() { + if (chatId && threadId) { + updateDraft(chatId, threadId); + } + } + + window.addEventListener('blur', handleBlur); + + return () => { + window.removeEventListener('blur', handleBlur); + }; + }, [chatId, threadId, updateDraft]); +}; diff --git a/src/components/middle/composer/hooks/useEditing.ts b/src/components/middle/composer/hooks/useEditing.ts new file mode 100644 index 000000000..fb5a73385 --- /dev/null +++ b/src/components/middle/composer/hooks/useEditing.ts @@ -0,0 +1,58 @@ +import { useCallback, useEffect } from '../../../../lib/teact/teact'; + +import { ApiMessage } from '../../../../api/types'; +import { GlobalActions } from '../../../../global/types'; + +import { EDITABLE_INPUT_ID } from '../../../../config'; +import parseMessageInput from '../helpers/parseMessageInput'; +import getMessageTextAsHtml from '../helpers/getMessageTextAsHtml'; +import focusEditableElement from '../../../../util/focusEditableElement'; +import { hasMessageMedia } from '../../../../modules/helpers'; + +export default ( + htmlRef: { current: string }, + setHtml: (html: string) => void, + editedMessage: ApiMessage | undefined, + resetComposer: () => void, + openDeleteModal: () => void, + editMessage: GlobalActions['editMessage'], +) => { + // TODO useOnChange + // Handle editing message + useEffect(() => { + if (!editedMessage) { + setHtml(''); + return; + } + + setHtml(getMessageTextAsHtml(editedMessage.content.text)); + + requestAnimationFrame(() => { + const messageInput = document.getElementById(EDITABLE_INPUT_ID)!; + focusEditableElement(messageInput, true); + }); + }, [editedMessage, setHtml]); + + const handleEditComplete = useCallback(() => { + const { text, entities } = parseMessageInput(htmlRef.current!); + + if (!editedMessage) { + return; + } + + if (!text && !hasMessageMedia(editedMessage)) { + openDeleteModal(); + return; + } + + editMessage({ + messageId: editedMessage.id, + text, + entities, + }); + + resetComposer(); + }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]); + + return handleEditComplete; +}; diff --git a/src/components/middle/composer/hooks/useEmojiTooltip.ts b/src/components/middle/composer/hooks/useEmojiTooltip.ts new file mode 100644 index 000000000..b55e29bd6 --- /dev/null +++ b/src/components/middle/composer/hooks/useEmojiTooltip.ts @@ -0,0 +1,36 @@ +import { useEffect } from '../../../../lib/teact/teact'; +import { getDispatch } from '../../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../../api/types'; + +import { IS_EMOJI_SUPPORTED } from '../../../../util/environment'; + +import parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString'; + +export default function useEmojiTooltip( + isAllowed: boolean, + html: string, + stickers?: ApiSticker[], +) { + const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch(); + const isSingleEmoji = ( + (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1) + || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g))) + ); + const hasStickers = Boolean(stickers) && isSingleEmoji; + + useEffect(() => { + if (isAllowed && isSingleEmoji) { + loadStickersForEmoji({ emoji: html }); + } else if (hasStickers || !isSingleEmoji) { + clearStickersForEmoji(); + } + // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ). + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed]); + + return { + isEmojiTooltipOpen: hasStickers, + closeEmojiTooltip: clearStickersForEmoji, + }; +} diff --git a/src/components/middle/composer/hooks/useMentionMenu.ts b/src/components/middle/composer/hooks/useMentionMenu.ts new file mode 100644 index 000000000..ad7c0a542 --- /dev/null +++ b/src/components/middle/composer/hooks/useMentionMenu.ts @@ -0,0 +1,117 @@ +import { useCallback, useEffect, useState } from '../../../../lib/teact/teact'; + +import { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types'; +import { EDITABLE_INPUT_ID } from '../../../../config'; +import { getUserFirstName } from '../../../../modules/helpers'; +import searchUserName from '../helpers/searchUserName'; +import { IS_MOBILE_SCREEN } from '../../../../util/environment'; +import focusEditableElement from '../../../../util/focusEditableElement'; +import useFlag from '../../../../hooks/useFlag'; + +const RE_NOT_USERNAME_SEARCH = /[^@_\d\wа-яё]+/i; + +export default function useMentionMenu( + canSuggestMembers: boolean | undefined, + html: string, + onUpdateHtml: (html: string) => void, + inputId: string = EDITABLE_INPUT_ID, + groupChatMembers?: ApiChatMember[], + currentUserId?: number, + usersById?: Record, +) { + const [isOpen, markIsOpen, unmarkIsOpen] = useFlag(); + const [currentFilter, setCurrentFilter] = useState(''); + const [filteredMembers, setFilteredMembers] = useState([]); + + const getFilteredMembers = useCallback((filter) => { + if (!groupChatMembers || !usersById) { + return undefined; + } + + return groupChatMembers.filter(({ userId }) => { + const user = usersById[userId]; + if (userId === currentUserId || !user) { + return false; + } + + return !filter || searchUserName(filter, user); + }); + }, [groupChatMembers, currentUserId, usersById]); + + useEffect(() => { + if (!canSuggestMembers || !html.length) { + unmarkIsOpen(); + return; + } + + const usernameFilter = getUsernameFilter(html); + + if (usernameFilter) { + const filter = usernameFilter ? usernameFilter.substr(1) : ''; + const membersToMention = getFilteredMembers(filter); + if (membersToMention && membersToMention.length) { + markIsOpen(); + setCurrentFilter(filter); + setFilteredMembers(membersToMention); + } else { + unmarkIsOpen(); + } + } else { + unmarkIsOpen(); + } + }, [canSuggestMembers, html, getFilteredMembers, markIsOpen, unmarkIsOpen]); + + const insertMention = useCallback((user: ApiUser, forceFocus = false) => { + if (!user.username && !getUserFirstName(user)) { + return; + } + + const insertedHtml = user.username + ? `@${user.username}` + : `${getUserFirstName(user)}`; + + const atIndex = html.lastIndexOf('@'); + if (atIndex !== -1) { + onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `); + const messageInput = document.getElementById(inputId)!; + if (!IS_MOBILE_SCREEN) { + requestAnimationFrame(() => { + focusEditableElement(messageInput, forceFocus); + }); + } + } + + unmarkIsOpen(); + }, [html, inputId, onUpdateHtml, unmarkIsOpen]); + + return { + isMentionMenuOpen: isOpen, + mentionFilter: currentFilter, + closeMentionMenu: unmarkIsOpen, + insertMention, + mentionFilteredMembers: filteredMembers, + }; +} + +function getUsernameFilter(html: string) { + const tempEl = document.createElement('div'); + tempEl.innerHTML = html; + const text = tempEl.innerText; + + const lastSymbol = text[text.length - 1]; + const lastWord = text.split(RE_NOT_USERNAME_SEARCH).pop(); + + if ( + !text.length || RE_NOT_USERNAME_SEARCH.test(lastSymbol) + || !lastWord || !lastWord.startsWith('@') + ) { + return undefined; + } + + return lastWord; +} diff --git a/src/components/middle/composer/hooks/useVoiceRecording.ts b/src/components/middle/composer/hooks/useVoiceRecording.ts new file mode 100644 index 000000000..ce7804f39 --- /dev/null +++ b/src/components/middle/composer/hooks/useVoiceRecording.ts @@ -0,0 +1,96 @@ +import { + useCallback, useEffect, useRef, useState, +} from '../../../../lib/teact/teact'; + +import { IS_IOS } from '../../../../util/environment'; +import * as voiceRecording from '../../../../util/voiceRecording'; +import captureEscKeyListener from '../../../../util/captureEscKeyListener'; + +type ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined; + +export default () => { + // eslint-disable-next-line no-null/no-null + const recordButtonRef = useRef(null); + const [activeVoiceRecording, setActiveVoiceRecording] = useState(); + const startRecordTimeRef = useRef(); + const [currentRecordTime, setCurrentRecordTime] = useState(); + + useEffect(() => { + // Preloading worker fixes silent first record on iOS + if (IS_IOS) { + void voiceRecording.init(); + } + }, []); + + const startRecordingVoice = useCallback(async () => { + try { + const { stop, pause } = await voiceRecording.start((tickVolume: number) => { + if (recordButtonRef.current) { + if (startRecordTimeRef.current && Date.now() % 4 === 0) { + recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`; + } + setCurrentRecordTime(Date.now()); + } + }); + startRecordTimeRef.current = Date.now(); + setCurrentRecordTime(Date.now()); + + setActiveVoiceRecording({ stop, pause }); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + } + }, []); + + const pauseRecordingVoice = useCallback(() => { + if (!activeVoiceRecording) { + return undefined; + } + + if (recordButtonRef.current) { + recordButtonRef.current.style.boxShadow = 'none'; + } + + try { + return activeVoiceRecording!.pause(); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + return undefined; + } + }, [activeVoiceRecording]); + + const stopRecordingVoice = useCallback(() => { + if (!activeVoiceRecording) { + return undefined; + } + + setActiveVoiceRecording(undefined); + startRecordTimeRef.current = undefined; + setCurrentRecordTime(undefined); + if (recordButtonRef.current) { + recordButtonRef.current.style.boxShadow = 'none'; + } + try { + return activeVoiceRecording!.stop(); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + return undefined; + } + }, [activeVoiceRecording]); + + useEffect(() => { + return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined; + }, [activeVoiceRecording, stopRecordingVoice]); + + return { + startRecordingVoice, + pauseRecordingVoice, + stopRecordingVoice, + activeVoiceRecording, + currentRecordTime, + recordButtonRef, + startRecordTimeRef, + }; +}; diff --git a/src/components/middle/helpers/calculateMiddleFooterTransforms.ts b/src/components/middle/helpers/calculateMiddleFooterTransforms.ts new file mode 100644 index 000000000..de618f423 --- /dev/null +++ b/src/components/middle/helpers/calculateMiddleFooterTransforms.ts @@ -0,0 +1,83 @@ +import { + MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN, + MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, + MOBILE_SCREEN_MAX_WIDTH, +} from '../../../config'; + +const REM = 16; // px +const MAX_TOOLBAR_WIDTH = 32 * REM; +const MAX_MESSAGES_LIST_WIDTH = 45.5 * REM; +const SIDE_COLUMN_MAX_WIDTH = 26.5 * REM; +const MIN_LEFT_COLUMN_WIDTH = 18 * REM; + +export default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) { + const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH + ? REM + : 2 * REM; + const messageListWidth = getMessageListWidth(windowWidth); + const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH + ? 3.375 * REM + : 4 * REM; + + const composerWidth = canPost + ? messageListWidth - sidePadding - sendButtonWidth + : messageListWidth - sidePadding; + const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH + ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH) + : messageListWidth - sidePadding; + + const composerHiddenScale = toolbarWidth / composerWidth; + const toolbarHiddenScale = composerWidth / toolbarWidth; + + const composerTranslateX = canPost + ? (sendButtonWidth / 2) * toolbarHiddenScale + : 0; + + const toolbarTranslateX = canPost + ? (sendButtonWidth / 2) * -1 * composerHiddenScale + : 0; + + return { + composerHiddenScale, + toolbarHiddenScale, + composerTranslateX, + toolbarTranslateX, + }; +} + +function getMessageListWidth(windowWidth: number) { + if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) { + const leftColumnWidth = Math.min( + Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH), + SIDE_COLUMN_MAX_WIDTH, + ); + + const rightColumnWidth = Math.min( + windowWidth * 0.25, + SIDE_COLUMN_MAX_WIDTH, + ); + + return Math.min( + windowWidth - leftColumnWidth - rightColumnWidth, + MAX_MESSAGES_LIST_WIDTH, + ); + } + + if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) { + const leftColumnWidth = Math.min( + Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH), + SIDE_COLUMN_MAX_WIDTH, + ); + + return Math.min( + windowWidth - leftColumnWidth, + MAX_MESSAGES_LIST_WIDTH, + ); + } + + if (windowWidth > MAX_MESSAGES_LIST_WIDTH) { + return MAX_MESSAGES_LIST_WIDTH; + } + + return windowWidth; +} diff --git a/src/components/middle/helpers/getCurrencySign.ts b/src/components/middle/helpers/getCurrencySign.ts new file mode 100644 index 000000000..d55a1cd19 --- /dev/null +++ b/src/components/middle/helpers/getCurrencySign.ts @@ -0,0 +1,17 @@ +const CURRENCIES: Record = { + USD: '$', + EUR: '€', + GBP: '£', + JPY: '¥', + RUB: '₽', + UAH: '₴', + INR: '₹', + AED: 'د.إ', +}; + +export function getCurrencySign(currency: string | undefined): string { + if (!currency) { + return ''; + } + return CURRENCIES[currency] || ''; +} diff --git a/src/components/middle/helpers/groupMessages.ts b/src/components/middle/helpers/groupMessages.ts new file mode 100644 index 000000000..092203144 --- /dev/null +++ b/src/components/middle/helpers/groupMessages.ts @@ -0,0 +1,93 @@ +import { ApiMessage } from '../../../api/types'; +import { IAlbum } from '../../../types'; + +import { getDayStart } from '../../../util/dateFormat'; +import { isActionMessage } from '../../../modules/helpers'; + +type SenderGroup = (ApiMessage | IAlbum)[]; + +export type MessageDateGroup = { + originalDate: number; + datetime: number; + senderGroups: SenderGroup[]; +}; + +export function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum { + return 'albumId' in messageOrAlbum; +} + +export function groupMessages(messages: ApiMessage[], firstUnreadId?: number) { + let currentSenderGroup: SenderGroup = []; + let currentDateGroup = { + originalDate: messages[0].date, + datetime: Number(getDayStart(messages[0].date * 1000)), + senderGroups: [currentSenderGroup], + }; + let currentAlbum: IAlbum | undefined; + + const dateGroups: MessageDateGroup[] = [currentDateGroup]; + + messages.forEach((message, index) => { + if (message.isInAlbum) { + if (!currentAlbum) { + currentAlbum = { + albumId: message.groupedId!, + messages: [message], + mainMessage: message, + }; + } else { + currentAlbum.messages.push(message); + if (message.content.text) { + currentAlbum.mainMessage = message; + } + } + } else { + currentSenderGroup.push(message); + } + + const nextMessage = messages[index + 1]; + + if ( + currentAlbum + && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId) + ) { + currentSenderGroup.push(currentAlbum); + currentAlbum = undefined; + } + if (nextMessage) { + const nextMessageDatetime = Number(getDayStart(nextMessage.date * 1000)); + if (currentDateGroup.datetime !== nextMessageDatetime) { + currentDateGroup = { + originalDate: nextMessage.date, + datetime: nextMessageDatetime, + senderGroups: [], + }; + dateGroups.push(currentDateGroup); + + currentSenderGroup = []; + currentDateGroup.senderGroups.push(currentSenderGroup); + } else if ( + nextMessage.id === firstUnreadId + || message.senderId !== nextMessage.senderId + || message.isOutgoing !== nextMessage.isOutgoing + || isActionMessage(message) + || isActionMessage(nextMessage) + || ( + message.forwardInfo && nextMessage.forwardInfo + && ( + message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId + || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId + || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName + ) + ) + || message.inlineButtons + || nextMessage.inlineButtons + ) { + currentSenderGroup = []; + currentDateGroup.senderGroups.push(currentSenderGroup); + } + } + }); + + return dateGroups; +} diff --git a/src/components/middle/helpers/inputFormatters.ts b/src/components/middle/helpers/inputFormatters.ts new file mode 100644 index 000000000..4feb11fbf --- /dev/null +++ b/src/components/middle/helpers/inputFormatters.ts @@ -0,0 +1,17 @@ +export function formatCardExpiry(input: string) { + input = input.replace(/[^\d]/g, '').slice(0, 4); + const parts = input.match(/.{1,2}/g); + if (parts && parts[0] && Number(parts[0]) > 12) { + parts[0] = '12'; + } + if (parts && parts[0] && parts[0].length === 2 && !parts[1]) { + parts[1] = ''; + } + return parts ? parts.join('/') : ''; +} + +export function formatCardNumber(input: string) { + input = input.replace(/[^\d]/g, ''); + const parts = input.match(/.{1,4}/g); + return parts ? parts.join(' ') : ''; +} diff --git a/src/components/middle/hooks/useStickyDates.ts b/src/components/middle/hooks/useStickyDates.ts new file mode 100644 index 000000000..ad1d49065 --- /dev/null +++ b/src/components/middle/hooks/useStickyDates.ts @@ -0,0 +1,59 @@ +import { useCallback } from '../../../lib/teact/teact'; + +import { fastRaf } from '../../../util/schedulers'; +import useDebounce from '../../../hooks/useDebounce'; +import useFlag from '../../../hooks/useFlag'; + +const DEBOUNCE = 1000; +const STICKY_TOP = 10; +const STICKY_TOP_WITH_TOOLS = 60; + +export default function useStickyDates() { + // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens + // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though. + const [isScrolled, markIsScrolled] = useFlag(false); + + const runDebounced = useDebounce(DEBOUNCE, false); + + const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => { + markIsScrolled(); + + if (!document.body.classList.contains('is-scrolling-messages')) { + fastRaf(() => { + document.body.classList.add('is-scrolling-messages'); + }); + } + + runDebounced(() => { + fastRaf(() => { + const currentStuck = document.querySelector('.stuck'); + if (currentStuck) { + currentStuck.classList.remove('stuck'); + } + + const stuckDateEl = findStuckDate(container, hasTools); + if (stuckDateEl) { + stuckDateEl.classList.add('stuck'); + } + + document.body.classList.remove('is-scrolling-messages'); + }); + }); + }, [markIsScrolled, runDebounced]); + + return { + isScrolled, + updateStickyDates, + }; +} + +function findStuckDate(container: HTMLElement, hasTools?: boolean) { + const allElements = container.querySelectorAll('.sticky-date'); + const containerTop = container.scrollTop; + + return Array.from(allElements).find((el) => { + const { offsetTop, offsetHeight } = el; + const top = offsetTop - containerTop; + return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP); + }); +} diff --git a/src/components/middle/message/Album.scss b/src/components/middle/message/Album.scss new file mode 100644 index 000000000..8782e625a --- /dev/null +++ b/src/components/middle/message/Album.scss @@ -0,0 +1,32 @@ +.Album { + position: relative; + overflow: hidden; + + .message-content.media.text & { + margin: -0.3125rem -0.5rem 0.3125rem; + } + + .forwarded-message & { + margin-bottom: .125rem; + + .message-content.media.text & { + margin: 0 0 0.3125rem; + --border-bottom-left-radius: inherit; + --border-bottom-right-radius: inherit; + } + } + + &, + .message-content.media.text & { + > .album-item-select-wrapper .media-inner { + margin: 0 !important; + } + } + + > .album-item-select-wrapper .media-inner { + &, & img, & video { + border-radius: 0 !important; + object-fit: cover; + } + } +} diff --git a/src/components/middle/message/Album.tsx b/src/components/middle/message/Album.tsx new file mode 100644 index 000000000..a0f764831 --- /dev/null +++ b/src/components/middle/message/Album.tsx @@ -0,0 +1,126 @@ +import React, { FC, useCallback } from '../../../lib/teact/teact'; + +import { GlobalActions, GlobalState } from '../../../global/types'; +import { ApiMessage } from '../../../api/types'; +import { IAlbum } from '../../../types'; +import { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout'; + +import { getMessageContent } from '../../../modules/helpers'; +import { withGlobal } from '../../../lib/teact/teactn'; +import { pick } from '../../../util/iteratees'; +import withSelectControl from './hocs/withSelectControl'; +import { ObserveFn } from '../../../hooks/useIntersectionObserver'; + +import Photo from './Photo'; +import Video from './Video'; + +import './Album.scss'; + +const PhotoWithSelect = withSelectControl(Photo); +const VideoWithSelect = withSelectControl(Video); + +type OwnProps = { + album: IAlbum; + observeIntersection: ObserveFn; + shouldAutoLoad?: boolean; + shouldAutoPlay?: boolean; + hasCustomAppendix?: boolean; + lastSyncTime?: number; + isOwn: boolean; + albumLayout: IAlbumLayout; + onMediaClick: (messageId: number) => void; +}; + +type StateProps = { + uploadsById: GlobalState['fileUploads']['byMessageLocalId']; +}; + +type DispatchProps = Pick; + +const Album: FC = ({ + album, + observeIntersection, + shouldAutoLoad, + shouldAutoPlay, + hasCustomAppendix, + lastSyncTime, + isOwn, + albumLayout, + onMediaClick, + uploadsById, + cancelSendingMessage, +}) => { + const mediaCount = album.messages.length; + + const handleCancelUpload = useCallback((message: ApiMessage) => { + cancelSendingMessage({ chatId: message.chatId, messageId: message.id }); + }, [cancelSendingMessage]); + + function renderAlbumMessage(message: ApiMessage, index: number) { + const { photo, video } = getMessageContent(message); + const fileUpload = uploadsById[message.previousLocalId || message.id]; + const uploadProgress = fileUpload ? fileUpload.progress : undefined; + const { dimensions, sides } = albumLayout.layout[index]; + + if (photo) { + const shouldAffectAppendix = hasCustomAppendix && ( + // eslint-disable-next-line no-bitwise + isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom) + ); + + return ( + + ); + } else if (video) { + return ( + + ); + } + + return undefined; + } + + const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle; + + return ( +
    + {album.messages.map(renderAlbumMessage)} +
    + ); +}; + +export default withGlobal( + (global): StateProps => { + return { + uploadsById: global.fileUploads.byMessageLocalId, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'cancelSendingMessage', + ]), +)(Album); diff --git a/src/components/middle/message/CommentButton.scss b/src/components/middle/message/CommentButton.scss new file mode 100644 index 000000000..521c9228e --- /dev/null +++ b/src/components/middle/message/CommentButton.scss @@ -0,0 +1,201 @@ +.CommentButton { + --background-color: #fff; + --hover-color: #f4f4f4; + + display: flex; + width: 100%; + align-items: center; + padding: .5625rem .25rem .5625rem .625rem; + background: var(--background-color); + border-bottom-right-radius: var(--border-bottom-right-radius); + border-bottom-left-radius: var(--border-bottom-left-radius); + font-size: .9375rem; + font-weight: 500; + line-height: 2rem; + color: var(--accent-color); + white-space: nowrap; + cursor: pointer; + transition: background-color .15s, color .15s; + + body.animation-level-0 & { + transition: none !important; + } + + .Message .has-appendix &::before { + content: ''; + display: block; + position: absolute; + bottom: -.1875rem; + left: -.5625rem; + width: .5625rem; + height: 1.25rem; + background-position: bottom left; + background-image: url("data:image/svg+xml,%3Csvg width='9' height='20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cfilter x='-50%25' y='-14.7%25' width='200%25' height='141.2%25' filterUnits='objectBoundingBox' id='a'%3E%3CfeOffset dy='1' in='SourceAlpha' result='shadowOffsetOuter1'/%3E%3CfeGaussianBlur stdDeviation='1' in='shadowOffsetOuter1' result='shadowBlurOuter1'/%3E%3CfeColorMatrix values='0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0' in='shadowBlurOuter1'/%3E%3C/filter%3E%3Cpath d='M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z' id='b'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cuse fill='%23000' filter='url(%23a)' xlink:href='%23b'/%3E%3Cuse fill='%23f4f4f4' xlink:href='%23b'/%3E%3C/g%3E%3C/svg%3E"); + opacity: 0; + transition: opacity .15s; + + body.animation-level-0 & { + transition: none !important; + } + } + + .custom-shape & { + position: absolute; + right: -3rem; + width: 2.25rem; + bottom: 3rem; + height: 3.375rem; + border-radius: 1.375rem; + padding: 0.375rem .3125rem .25rem; + align-items: flex-start; + color: white; + background-color: rgba(0, 0, 0, .2); + + opacity: 0; + transition: opacity .2s ease; + + @media (pointer: coarse) { + opacity: 1 !important; + } + + &:hover { + background-color: rgba(0, 0, 0, .28); + } + + .Message:hover & { + opacity: 1; + } + + &::after { + content: attr(data-cnt); + position: absolute; + bottom: -.0625rem; + left: 0; + width: 100%; + text-align: center; + font-size: 12px; + display: block; + } + + &[data-cnt="0"] { + height: 2.25rem; + &::after { + display: none; + } + } + + .icon-comments-sticker { + display: block; + font-size: 1.5rem; + margin: 0 auto; + } + + .recent-repliers, + .icon-comments, + .label, + .icon-next { + display: none; + } + } + + &:hover { + background: var(--hover-color); + + .Message .has-appendix &::before { + opacity: 1; + } + + .Avatar { + border-color: var(--hover-color) !important; + } + } + + .is-forwarded &, + .audio &, + .voice &, + .poll &, + .text & { + border-top: 1px solid var(--color-borders); + } + + .message-content.has-solid-background & { + margin: .375rem -.5rem -.375rem; + } + + .message-content.voice & { + margin-bottom: -.5rem; + } + + .message-content.audio & { + margin-bottom: -.8125rem; + } + + .message-content.audio &, + .message-content.voice &, + .message-content.poll &, + .message-content.has-solid-background.text &, + .message-content.has-solid-background.is-forwarded & { + margin-right: 0; + width: calc(100% + 1rem); + } + + .icon-comments-sticker { + display: none; + } + + .icon-comments { + font-size: 1.5625rem; + line-height: 2rem; + margin-right: .875rem; + } + + .icon-next { + margin-left: auto; + font-size: 1.5rem; + } + + .recent-repliers { + display: inline-flex; + align-items: center; + margin-right: .5rem; + margin-left: -.125rem; + + .Avatar { + transition: border .15s; + border: 2px solid #fff; + margin-right: 0; + z-index: 3; + + + .Avatar { + z-index: 2; + + + .Avatar { + z-index: 1; + } + } + + &:not(:first-child) { + margin-left: -.75rem; + } + } + } + + &.has-unread .label { + position: relative; + + &::after { + content: ''; + display: inline-block; + width: .5rem; + height: .5rem; + border-radius: 50%; + background: var(--accent-color); + margin-left: .75rem; + } + } + + &.disabled { + cursor: default; + pointer-events: none; + } +} diff --git a/src/components/middle/message/CommentButton.tsx b/src/components/middle/message/CommentButton.tsx new file mode 100644 index 000000000..e64d195d0 --- /dev/null +++ b/src/components/middle/message/CommentButton.tsx @@ -0,0 +1,114 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { + ApiChat, ApiMessage, ApiThreadInfo, ApiUser, +} from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { pick } from '../../../util/iteratees'; +import { isChatPrivate } from '../../../modules/helpers'; +import { formatInteger, formatIntegerCompact } from '../../../util/textFormat'; +import buildClassName from '../../../util/buildClassName'; +import { selectThreadInfo } from '../../../modules/selectors'; + +import Avatar from '../../common/Avatar'; + +import './CommentButton.scss'; + +type OwnProps = { + message: ApiMessage; + disabled?: boolean; +}; + +type StateProps = { + threadInfo: ApiThreadInfo; + usersById?: Record; + chatsById?: Record; +}; + +type DispatchProps = Pick; + +const CommentButton: FC = ({ + disabled, threadInfo, usersById, chatsById, openChat, +}) => { + const { + threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds, + } = threadInfo; + + const handleClick = useCallback(() => { + openChat({ id: chatId, threadId }); + }, [openChat, chatId, threadId]); + + if (messagesCount === undefined) { + return undefined; + } + + const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => { + return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId]; + }).filter(Boolean); + + function renderRecentRepliers() { + return ( + recentRepliers && recentRepliers.length > 0 && ( +
    + {recentRepliers.map((user) => ( + + ))} +
    + ) + ); + } + + const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId); + + return ( +
    + + {(!recentRepliers || recentRepliers.length === 0) && } + {renderRecentRepliers()} +
    {renderLabel(messagesCount)}
    + +
    + ); +}; + +function renderLabel(messagesCount: number) { + if (messagesCount === 0) { + return 'Leave a Comment'; + } + + if (messagesCount === 1) { + return '1 Comment'; + } + + return `${formatInteger(messagesCount)} Comments`; +} + +export default memo(withGlobal( + (global, { message }) => { + const { threadId, chatId } = message.threadInfo!; + + const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!; + const { byId: usersById } = global.users; + const { byId: chatsById } = global.chats; + + return { + threadInfo, + usersById, + chatsById, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openChat', + ]), +)(CommentButton)); diff --git a/src/components/middle/message/Contact.scss b/src/components/middle/message/Contact.scss new file mode 100644 index 000000000..be7357bc0 --- /dev/null +++ b/src/components/middle/message/Contact.scss @@ -0,0 +1,34 @@ +.Contact { + display: flex; + align-items: center; + padding: 0.25rem; + + &.interactive { + cursor: pointer; + } + + .Avatar { + margin-right: 0.8rem; + } + + .contact-info { + padding: 0.5rem; + padding-left: 0; + white-space: nowrap; + overflow: hidden; + + .contact-name { + font-size: 1rem; + line-height: 1rem; + margin-bottom: 0.25rem; + font-weight: 500; + } + + .contact-phone { + line-height: 1rem; + color: var(--secondary-color); + } + } +} + + diff --git a/src/components/middle/message/Contact.tsx b/src/components/middle/message/Contact.tsx new file mode 100644 index 000000000..47bc14fcd --- /dev/null +++ b/src/components/middle/message/Contact.tsx @@ -0,0 +1,63 @@ +import React, { FC, useCallback } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiUser, ApiContact } from '../../../api/types'; + +import { selectUser } from '../../../modules/selectors'; +import { formatPhoneNumberWithCode } from '../../../util/phoneNumber'; + +import Avatar from '../../common/Avatar'; + +import './Contact.scss'; +import { pick } from '../../../util/iteratees'; +import buildClassName from '../../../util/buildClassName'; + +type OwnProps = { + contact: ApiContact; +}; + +type StateProps = { + user?: ApiUser; +}; + +type DispatchProps = Pick; + +const Contact: FC = ({ + contact, user, openUserInfo, +}) => { + const { + firstName, + lastName, + phoneNumber, + userId, + } = contact; + + const handleClick = useCallback(() => { + openUserInfo({ id: userId }); + }, [openUserInfo, userId]); + + return ( +
    + +
    +
    {firstName} {lastName}
    +
    {formatPhoneNumberWithCode(phoneNumber)}
    +
    +
    + ); +}; + +export default withGlobal( + (global, { contact }): StateProps => { + return { + user: selectUser(global, contact.userId), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openUserInfo', + ]), +)(Contact); diff --git a/src/components/middle/message/ContextMenuContainer.async.tsx b/src/components/middle/message/ContextMenuContainer.async.tsx new file mode 100644 index 000000000..37b35c77b --- /dev/null +++ b/src/components/middle/message/ContextMenuContainer.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { OwnProps } from './ContextMenuContainer'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const ContextMenuContainerAsync: FC = (props) => { + const { isOpen } = props; + const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ContextMenuContainer ? : undefined; +}; + +export default ContextMenuContainerAsync; diff --git a/src/components/middle/message/ContextMenuContainer.tsx b/src/components/middle/message/ContextMenuContainer.tsx new file mode 100644 index 000000000..1ab90c170 --- /dev/null +++ b/src/components/middle/message/ContextMenuContainer.tsx @@ -0,0 +1,320 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions, MessageListType } from '../../../global/types'; +import { ApiMessage } from '../../../api/types'; +import { IAlbum, IAnchorPosition } from '../../../types'; +import { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors'; +import { disableScrolling, enableScrolling } from '../../../util/scrollLock'; +import { pick } from '../../../util/iteratees'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useFlag from '../../../hooks/useFlag'; + +import DeleteMessageModal from '../../common/DeleteMessageModal'; +import PinMessageModal from '../../common/PinMessageModal'; +import MessageContextMenu from './MessageContextMenu'; +import CalendarModal from '../../common/CalendarModal'; +import { getDayStartAt } from '../../../util/dateFormat'; + +export type OwnProps = { + isOpen: boolean; + message: ApiMessage; + album?: IAlbum; + anchor: IAnchorPosition; + messageListType: MessageListType; + onClose: () => void; + onCloseAnimationEnd: () => void; +}; + +type StateProps = { + noOptions?: boolean; + canSendNow?: boolean; + canReschedule?: boolean; + canReply?: boolean; + canPin?: boolean; + canUnpin?: boolean; + canDelete?: boolean; + canEdit?: boolean; + canForward?: boolean; + canFaveSticker?: boolean; + canUnfaveSticker?: boolean; + canCopy?: boolean; + canCopyLink?: boolean; + canSelect?: boolean; +}; + +type DispatchProps = Pick; + +const ContextMenuContainer: FC = ({ + isOpen, + messageListType, + message, + album, + anchor, + onClose, + onCloseAnimationEnd, + noOptions, + canSendNow, + canReschedule, + canReply, + canPin, + canUnpin, + canDelete, + canEdit, + canForward, + canFaveSticker, + canUnfaveSticker, + canCopy, + canCopyLink, + canSelect, + setReplyingToId, + setEditingId, + pinMessage, + openForwardMenu, + faveSticker, + unfaveSticker, + toggleMessageSelection, + sendScheduledMessages, + rescheduleMessage, + loadMessageLink, +}) => { + const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false); + const [isMenuOpen, setIsMenuOpen] = useState(true); + const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); + const [isPinModalOpen, setIsPinModalOpen] = useState(false); + const [isCalendarOpen, openCalendar, closeCalendar] = useFlag(); + + const handleDelete = useCallback(() => { + setIsMenuOpen(false); + setIsDeleteModalOpen(true); + }, []); + + const closeMenu = useCallback(() => { + setIsMenuOpen(false); + onClose(); + }, [onClose]); + + const closeDeleteModal = useCallback(() => { + setIsDeleteModalOpen(false); + onClose(); + }, [onClose]); + + const closePinModal = useCallback(() => { + setIsPinModalOpen(false); + onClose(); + }, [onClose]); + + const handleCloseCalendar = useCallback(() => { + closeCalendar(); + onClose(); + }, [closeCalendar, onClose]); + + const handleReply = useCallback(() => { + setReplyingToId({ messageId: message.id }); + closeMenu(); + }, [setReplyingToId, message.id, closeMenu]); + + const handleEdit = useCallback(() => { + setEditingId({ messageId: message.id }); + closeMenu(); + }, [setEditingId, message.id, closeMenu]); + + const handlePin = useCallback(() => { + setIsMenuOpen(false); + setIsPinModalOpen(true); + }, []); + + const handleUnpin = useCallback(() => { + pinMessage({ messageId: message.id, isUnpin: true }); + closeMenu(); + }, [pinMessage, message.id, closeMenu]); + + const handleForward = useCallback(() => { + closeMenu(); + if (album && album.messages) { + const messageIds = album.messages.map(({ id }) => id); + openForwardMenu({ fromChatId: message.chatId, messageIds }); + } else { + openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] }); + } + }, [openForwardMenu, message, closeMenu, album]); + + const handleFaveSticker = useCallback(() => { + closeMenu(); + faveSticker({ sticker: message.content.sticker }); + }, [closeMenu, message.content.sticker, faveSticker]); + + const handleUnfaveSticker = useCallback(() => { + closeMenu(); + unfaveSticker({ sticker: message.content.sticker }); + }, [closeMenu, message.content.sticker, unfaveSticker]); + + const handleSelectMessage = useCallback(() => { + const params = album && album.messages + ? { + messageId: message.id, + childMessageIds: album.messages.map(({ id }) => id), + withShift: false, + } + : { messageId: message.id, withShift: false }; + + toggleMessageSelection(params); + closeMenu(); + }, [closeMenu, message.id, toggleMessageSelection, album]); + + const handleScheduledMessageSend = useCallback(() => { + sendScheduledMessages({ chatId: message.chatId, id: message.id }); + closeMenu(); + }, [closeMenu, message.chatId, message.id, sendScheduledMessages]); + + const handleOpenCalendar = useCallback(() => { + setIsMenuOpen(false); + openCalendar(); + }, [openCalendar]); + + const handleRescheduleMessage = useCallback((date: Date) => { + rescheduleMessage({ + chatId: message.chatId, + messageId: message.id, + scheduledAt: Math.round(date.getTime() / 1000), + }); + }, [message.chatId, message.id, rescheduleMessage]); + + const handleCopyLink = useCallback(() => { + loadMessageLink({ + messageId: message.id, + chatId: message.chatId, + }); + closeMenu(); + }, [closeMenu, loadMessageLink, message.chatId, message.id]); + + useEffect(() => { + disableScrolling(); + + return enableScrolling; + }, []); + + if (noOptions) { + closeMenu(); + + return undefined; + } + + const scheduledMaxDate = new Date(); + scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1); + + return ( +
    + + + + +
    + ); +}; + +export default memo(withGlobal( + (global, { message, messageListType }): StateProps => { + const { threadId } = selectCurrentMessageList(global) || {}; + const { + noOptions, + canReply, + canPin, + canUnpin, + canDelete, + canEdit, + canForward, + canFaveSticker, + canUnfaveSticker, + canCopy, + canCopyLink, + canSelect, + } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {}; + const isPinned = messageListType === 'pinned'; + const isScheduled = messageListType === 'scheduled'; + + return { + noOptions, + canSendNow: isScheduled, + canReschedule: isScheduled, + canReply: !isPinned && !isScheduled && canReply, + canPin: !isScheduled && canPin, + canUnpin: !isScheduled && canUnpin, + canDelete, + canEdit: !isPinned && canEdit, + canForward: !isScheduled && canForward, + canFaveSticker: !isScheduled && canFaveSticker, + canUnfaveSticker: !isScheduled && canUnfaveSticker, + canCopy, + canCopyLink: !isScheduled && canCopyLink, + canSelect, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setReplyingToId', + 'setEditingId', + 'pinMessage', + 'openForwardMenu', + 'faveSticker', + 'unfaveSticker', + 'toggleMessageSelection', + 'sendScheduledMessages', + 'rescheduleMessage', + 'loadMessageLink', + ]), +)(ContextMenuContainer)); diff --git a/src/components/middle/message/InlineButtons.scss b/src/components/middle/message/InlineButtons.scss new file mode 100644 index 000000000..6c2ebc29b --- /dev/null +++ b/src/components/middle/message/InlineButtons.scss @@ -0,0 +1,47 @@ +.InlineButtons { + display: flex; + flex-direction: column; + + .row { + display: flex; + flex-direction: row; + } + + .Button { + flex: 1; + width: auto; + margin: 0.125rem; + background: rgba(90, 110, 70, 0.6); + border-radius: var(--border-radius-messages-small); + font-weight: 500; + text-transform: none; + + &:hover { + background: rgba(90, 110, 70, 0.4) !important; + } + + &:first-of-type { + margin-left: 0; + } + + &:last-of-type { + margin-right: 0; + } + } + + .row:first-of-type .Button { + margin-top: 0.25rem !important; + } + + .row:last-of-type .Button { + margin-bottom: 0; + + &:first-of-type { + border-bottom-left-radius: var(--border-radius-messages); + } + + &:last-of-type { + border-bottom-right-radius: var(--border-radius-messages); + } + } +} diff --git a/src/components/middle/message/InlineButtons.tsx b/src/components/middle/message/InlineButtons.tsx new file mode 100644 index 000000000..9466ed72f --- /dev/null +++ b/src/components/middle/message/InlineButtons.tsx @@ -0,0 +1,35 @@ +import React, { FC } from '../../../lib/teact/teact'; + +import { ApiKeyboardButton, ApiMessage } from '../../../api/types'; + +import Button from '../../ui/Button'; + +import './InlineButtons.scss'; + +type OwnProps = { + message: ApiMessage; + onClick: ({ button }: { button: ApiKeyboardButton }) => void; +}; + +const InlineButtons: FC = ({ message, onClick }) => { + return ( +
    + {message.inlineButtons!.map((row) => ( +
    + {row.map((button) => ( + + ))} +
    + ))} +
    + ); +}; + +export default InlineButtons; diff --git a/src/components/middle/message/Invoice.scss b/src/components/middle/message/Invoice.scss new file mode 100644 index 000000000..c13171265 --- /dev/null +++ b/src/components/middle/message/Invoice.scss @@ -0,0 +1,33 @@ +.Invoice { + .title { + color: var(--accent-color); + font-weight: 500; + } + + .description { + position: relative; + + &.has-image { + .invoice-image { + max-width: 100%; + height: 20rem; + + @media (max-width: 600px) { + height: 10rem; + } + } + + .description-text { + position: absolute; + top: 0; + padding: .25rem .5rem; + margin: .25rem; + background-color: rgba(90, 110, 70, 0.6); + border-radius: var(--border-radius-messages-small); + color: var(--color-white); + font-weight: 500; + } + } + + } +} diff --git a/src/components/middle/message/Invoice.tsx b/src/components/middle/message/Invoice.tsx new file mode 100644 index 000000000..a50fe7ab8 --- /dev/null +++ b/src/components/middle/message/Invoice.tsx @@ -0,0 +1,52 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; + +import { getMessageInvoice } from '../../../modules/helpers'; +import renderText from '../../common/helpers/renderText'; + +import './Invoice.scss'; + +type OwnProps = { + message: ApiMessage; +}; + +const Invoice: FC = ({ + message, +}) => { + const invoice = getMessageInvoice(message); + + const { + title, + text, + description, + photoUrl, + } = invoice!; + + return ( +
    + {title && ( +

    {renderText(title)}

    + )} + {text && ( +

    {renderText(text, ['emoji', 'br'])}

    + )} +
    + {photoUrl && ( + + )} + {description && ( +

    {renderText(description, ['emoji', 'br'])}

    + )} +
    +
    + ); +}; + +export default memo(Invoice); diff --git a/src/components/middle/message/MentionLink.tsx b/src/components/middle/message/MentionLink.tsx new file mode 100644 index 000000000..76cd96676 --- /dev/null +++ b/src/components/middle/message/MentionLink.tsx @@ -0,0 +1,51 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat, ApiUser } from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import { selectUser } from '../../../modules/selectors'; + +type OwnProps = { + userId?: number; + username?: string; + children: any; +}; + +type StateProps = { + userOrChat?: ApiUser | ApiChat; +}; + +type DispatchProps = Pick; + +const MentionLink: FC = ({ + username, + userOrChat, + children, + openChat, + openChatByUsername, +}) => { + const handleClick = () => { + if (userOrChat) { + openChat({ id: userOrChat.id }); + } else if (username) { + openChatByUsername({ username: username.substring(1) }); + } + }; + + return ( + + {children} + + ); +}; + +export default withGlobal( + (global, { userId }): StateProps => { + return { + userOrChat: userId ? selectUser(global, userId) : undefined, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']), +)(MentionLink); diff --git a/src/components/middle/message/Message.scss b/src/components/middle/message/Message.scss new file mode 100644 index 000000000..2b6ea8cb6 --- /dev/null +++ b/src/components/middle/message/Message.scss @@ -0,0 +1,537 @@ +// General styles +.Message { + display: flex; + align-items: flex-end; + margin-bottom: 0.375rem; + position: relative; + + --background-color: white; + --hover-color: rgba(var(--color-text-secondary-rgb), 0.08); + --active-color: rgba(var(--color-text-secondary-rgb), 0.16); + --max-width: 29rem; + --accent-color: var(--color-primary); + --accent-shade-color: var(--color-primary-shade); + --secondary-color: var(--color-text-secondary); + --meta-safe-area-base: 2.25rem; + --meta-safe-author-width: 0px; + --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width)); + --deleting-translate-x: -50%; + --select-message-scale: 0.9; + --select-background-color: white; + + > .Avatar, + > .message-content-wrapper { + opacity: 1; + transform: scale(1) translateX(0); + transition: transform var(--select-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + + > .Avatar { + position: absolute; + bottom: 0; + left: 0; + + @media (max-width: 600px) { + width: 2.5rem; + height: 2.5rem; + } + } + + &.last-in-group { + margin-bottom: 0.625rem; + } + + &.last-in-list { + margin-bottom: 0.375rem; + } + + &.is-in-selection-mode { + .Album { + border: 1px var(--select-background-color) solid; + background-color: var(--select-background-color); + } + } + + &.has-inline-buttons { + .message-content { + border-bottom-right-radius: var(--border-radius-messages-small); + } + } + + &:not(.own) { + padding-left: 2.5rem; + + .no-avatars &, &.is-thread-top { + padding-left: 0; + } + + @media (max-width: 600px) { + padding-left: 2.875rem; + + .no-avatars &, &.is-thread-top { + padding-left: 0.25rem; + } + } + } + + &.own { + flex-direction: row-reverse; + --background-color: var(--color-background-own); + --hover-color: rgba(var(--color-text-green-rgb), 0.12); + --active-color: rgba(var(--color-text-green-rgb), 0.24); + --max-width: 30rem; + --accent-color: var(--color-text-green); + --accent-shade-color: var(--color-green); + --secondary-color: var(--color-text-green); + --color-code: var(--color-code-own); + --color-code-bg: var(--color-code-own-bg); + --meta-safe-area-base: 3.5rem; + --deleting-translate-x: 50%; + + @media (max-width: 600px) { + padding-right: 0.25rem; + } + } + + &.is-deleting { + > .Avatar, + > .message-content-wrapper { + transition: opacity .2s ease, transform .2s ease-in; + opacity: 0; + transform: scale(0.3) translateX(var(--deleting-translate-x)); + transform-origin: bottom; + } + } + + &.has-views { + --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 4rem); + } + + &.was-edited { + --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 2.5rem); + + &.has-views { + --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + 7.5rem); + } + } + + .select-mode-active & { + cursor: pointer; + user-select: none; + + &:not(.own) { + > .Avatar, + > .message-content-wrapper { + transform: translateX(2.5rem); + } + } + + &:not(.is-album)::after { + content: ""; + position: absolute; + top: -0.25rem; + bottom: -0.25rem; + left: -4rem; + right: -4rem; + z-index: var(--z-message-select-area); + } + + &.is-album, + &.is-in-document-group { + .message-select-control { + pointer-events: unset; + } + } + + .message-select-control { + opacity: 1; + } + } + + &.is-selected { + .message-select-control { + background: var(--color-green); + + &.group-select { + background: transparent; + + &.is-selected { + background: var(--color-green); + } + } + } + } + + .File.file-is-selected { + .message-select-control { + background: var(--color-green); + } + } + + .Audio .message-select-control { + left: 1.063rem; + bottom: 0.813rem; + } + + .File { + position: relative; + + .message-select-control { + position: absolute; + top: 2rem; + left: 2rem; + z-index: 2; + } + } + + .album-item-select-wrapper { + .Message.own & { + background: var(--color-background-own); + } + + .message-select-control { + position: absolute; + top: 0.438rem; + right: 0.438rem; + left: unset; + } + + .media-inner { + border: 0 var(--select-background-color) solid; + transition: border-width var(--select-transition); + } + + img, video { + transition: transform var(--select-transition); + } + + &.is-selected { + .message-select-control { + background: var(--color-green); + } + + img, video { + transform: scale(var(--select-message-scale)); + } + } + + } + + &.is-selected, &.is-forwarding { + .message-select-control { + background: var(--color-green); + } + + .Menu .bubble { + transition: none !important; + } + } + + &.is-in-document-group { + &:not(.first-in-document-group) { + &::before { + top: 0 !important; + } + + .message-content { + box-shadow: none; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + } + + .forwarded-message::before { + top: -1.5rem; + } + } + + &:not(.last-in-document-group) { + margin-bottom: 0; + + &::before { + bottom: 0 !important; + } + + .message-content { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; + } + } + + &.is-in-selection-mode { + + .Audio:not(.audio-is-selected), + .File:not(.file-is-selected) { + .message-select-control:not(.group-select) { + background: white; + + &::after { + content: ''; + width: 1.25rem; + height: 1.25rem; + border-radius: 0.688rem; + background: white; + border: 0.125rem rgba(0, 0, 0, 0.2) solid; + position: absolute; + } + } + } + + &.own { + .message-content { + .Audio:not(.audio-is-selected), + .File:not(.file-is-selected) { + .message-select-control:not(.group-select) { + background: var(--background-color); + border-color: var(--background-color); + &::after { + background: var(--background-color); + border-color: rgba(var(--color-text-green-rgb), 0.5); + } + } + } + } + } + + } + &.focused, + &.has-menu-open, + &.is-forwarding, + &.is-selected { + .message-content { + background: var(--color-background-selected); + } + + &.own { + .message-content { + --background-color: var(--color-background-own-selected); + background: var(--color-background-own-selected); + } + } + } + + .message-content-wrapper { + width: 17.1875rem; + } + + .message-content { + transition: background-color var(--select-transition); + } + } + + .album-item-select-wrapper { + position: absolute; + + .message-select-control { + position: absolute; + z-index: 2; + } + } + + .message-select-control { + position: absolute; + left: 0; + bottom: 0.25rem; + width: 1.5rem; + height: 1.5rem; + border: 2px solid white; + border-radius: 50%; + z-index: var(--z-message-select-control); + + display: flex; + align-items: center; + justify-content: center; + + color: white; + font-size: 1rem; + + opacity: 0; + pointer-events: none; + transition: opacity var(--select-transition); + + .icon-select { + position: absolute; + left: -3px; + top: -3px; + font-size: 1.625rem; + } + } + + .Avatar { + margin-right: 0.3rem; + } + + &.is-in-document-group { + + .message-content.document { + padding: .25rem .5rem !important; + } + + &.last-in-document-group { + .message-content.document { + padding-bottom: .5rem !important + } + } + + &.first-in-document-group { + .message-content.document { + padding-top: .5rem !important + } + } + } +} + +// Border-radius styles +.message-content, +.Album, +.media-inner, +.message-content.media .media-inner img, +.message-content.media .media-inner video, +.message-content.custom-shape .media-inner img { + border-top-left-radius: var(--border-top-left-radius); + border-top-right-radius: var(--border-top-right-radius); + border-bottom-left-radius: var(--border-bottom-left-radius); + border-bottom-right-radius: var(--border-bottom-right-radius); +} + +.media-inner { + overflow: hidden; + + &.small-image img { + border-radius: 0 !important; + } +} + +.Message { + --border-top-left-radius: var(--border-radius-messages); + --border-top-right-radius: var(--border-radius-messages); + --border-bottom-left-radius: var(--border-radius-messages); + --border-bottom-right-radius: var(--border-radius-messages); + + &:not(.own) { + &.first-in-group:not(.last-in-group) { + --border-bottom-left-radius: var(--border-radius-messages-small); + } + + &:not(.first-in-group):not(.last-in-group) { + --border-top-left-radius: var(--border-radius-messages-small); + --border-bottom-left-radius: var(--border-radius-messages-small); + } + + &.last-in-group:not(.first-in-group) { + --border-top-left-radius: var(--border-radius-messages-small); + } + + &.last-in-group { + --border-bottom-left-radius: var(--border-radius-messages-small); + + .message-content.has-appendix { + --border-bottom-left-radius: 0; + } + } + } + + &.own { + &.first-in-group:not(.last-in-group) { + --border-bottom-right-radius: var(--border-radius-messages-small); + } + + &:not(.first-in-group):not(.last-in-group) { + --border-top-right-radius: var(--border-radius-messages-small); + --border-bottom-right-radius: var(--border-radius-messages-small); + } + + &.last-in-group:not(.first-in-group) { + --border-top-right-radius: var(--border-radius-messages-small); + } + + &.last-in-group { + --border-bottom-right-radius: var(--border-radius-messages-small); + + .message-content.has-appendix { + --border-bottom-right-radius: 0; + } + } + } + + .message-content { + &.has-replies:not(.custom-shape), + &.text { + .media-inner, + .Album { + --border-bottom-left-radius: 0; + --border-bottom-right-radius: 0; + } + } + + &.is-reply .EmbeddedMessage { + & + .Album, + & + .Audio, + & + .File { + margin-top: .375rem; + } + } + + &:not(.custom-shape).is-reply .media-inner, + &:not(.custom-shape).is-reply .Album, + &:not(.custom-shape).force-sender-name .Album, + &:not(.is-forwarded) .message-title ~ .media-inner { + --border-top-left-radius: 0; + --border-top-right-radius: 0; + } + + &.is-forwarded .content-inner .message-title { + margin-bottom: 0.25rem; + } + } + + .message-action-button { + position: absolute; + bottom: 0; + color: white; + background-color: rgba(0, 0, 0, .2); + + opacity: 0; + transition: opacity .2s ease; + + @media (pointer: coarse) { + opacity: 1 !important; + } + + &:hover, + &:active, + &:focus { + background-color: rgba(0, 0, 0, .28) !important; + } + } + + &:hover, + &[data-is-document-group-hover] { + .message-action-button { + opacity: 1; + } + } + + &.own .message-action-button { + left: -3rem; + } + + &:not(.own) .message-action-button { + right: -3rem; + } + + .bottom-marker { + height: 1px; + width: 1px; + visibility: hidden; + } +} + +.Message .custom-shape .message-action-button { + bottom: .25rem; +} + +@import 'message-content'; diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx new file mode 100644 index 000000000..eef0f0919 --- /dev/null +++ b/src/components/middle/message/Message.tsx @@ -0,0 +1,876 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { + FC, + memo, + useCallback, + useMemo, + useRef, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions, MessageListType } from '../../../global/types'; +import { + ApiMessage, + ApiMessageOutgoingStatus, + ApiUser, + ApiChat, + ApiSticker, + MAIN_THREAD_ID, +} from '../../../api/types'; +import { FocusDirection, IAlbum, MediaViewerOrigin } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import { + selectChat, + selectChatMessage, + selectUploadProgress, + selectIsChatWithSelf, + selectOutgoingStatus, + selectUser, + selectIsMessageFocused, + selectCurrentTextSearch, + selectAnimatedEmoji, + selectIsInSelectMode, + selectIsMessageSelected, + selectIsDocumentGroupSelected, + selectSender, + selectForwardedSender, + selectThreadTopMessageId, + selectShouldAutoLoadMedia, + selectShouldAutoPlayMedia, selectShouldLoopStickers, +} from '../../../modules/selectors'; +import { + getMessageContent, + isOwnMessage, + isReplyMessage, + isAnonymousOwnMessage, + isChatPrivate, + getMessageCustomShape, + isChatChannel, + getMessageSingleEmoji, getSenderTitle, getUserColorKey, +} from '../../../modules/helpers'; +import buildClassName from '../../../util/buildClassName'; +import useEnsureMessage from '../../../hooks/useEnsureMessage'; +import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers'; +import { renderMessageText } from '../../common/helpers/renderMessageText'; +import { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions'; +import { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName'; +import { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions'; +import { calculateAlbumLayout } from './helpers/calculateAlbumLayout'; +import renderText from '../../common/helpers/renderText'; +import calculateAuthorWidth from './helpers/calculateAuthorWidth'; +import { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver'; +import useFocusMessage from './hooks/useFocusMessage'; +import useWindowSize from '../../../hooks/useWindowSize'; +import useLang from '../../../hooks/useLang'; + +import Button from '../../ui/Button'; +import Avatar from '../../common/Avatar'; +import EmbeddedMessage from '../../common/EmbeddedMessage'; +import Document from '../../common/Document'; +import Audio from '../../common/Audio'; +import MessageMeta from './MessageMeta'; +import ContextMenuContainer from './ContextMenuContainer.async'; +import Sticker from './Sticker'; +import AnimatedEmoji from '../../common/AnimatedEmoji'; +import Photo from './Photo'; +import Video from './Video'; +import Contact from './Contact'; +import Poll from './Poll'; +import WebPage from './WebPage'; +import Invoice from './Invoice'; +import Album from './Album'; +import RoundVideo from './RoundVideo'; +import InlineButtons from './InlineButtons'; +import CommentsButton from './CommentButton'; + +import './Message.scss'; + +type MessagePositionProperties = { + isFirstInGroup: boolean; + isLastInGroup: boolean; + isFirstInDocumentGroup: boolean; + isLastInDocumentGroup: boolean; + isLastInList: boolean; +}; + +type OwnProps = { + message: ApiMessage; + observeIntersectionForBottom: ObserveFn; + observeIntersectionForMedia: ObserveFn; + observeIntersectionForAnimatedStickers: ObserveFn; + album?: IAlbum; + withAvatar?: boolean; + withSenderName?: boolean; + threadId: number; + messageListType: MessageListType; + noComments: boolean; +} & MessagePositionProperties; + +type StateProps = { + forceSenderName?: boolean; + sender?: ApiUser | ApiChat; + originSender?: ApiUser | ApiChat; + botSender?: ApiUser; + isThreadTop?: boolean; + shouldHideReply?: boolean; + replyMessage?: ApiMessage; + replyMessageSender?: ApiUser | ApiChat; + outgoingStatus?: ApiMessageOutgoingStatus; + uploadProgress?: number; + isFocused?: boolean; + focusDirection?: FocusDirection; + noFocusHighlight?: boolean; + isForwarding?: boolean; + isChatWithSelf?: boolean; + isChannel?: boolean; + lastSyncTime?: number; + highlight?: string; + isSingleEmoji?: boolean; + animatedEmoji?: ApiSticker; + isInSelectMode?: boolean; + isSelected?: boolean; + isGroupSelected?: boolean; + threadId?: number; + isPinnedList?: boolean; + shouldAutoLoadMedia?: boolean; + shouldAutoPlayMedia?: boolean; + shouldLoopStickers?: boolean; +}; + +type DispatchProps = Pick; + +const NBSP = '\u00A0'; +const GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover'; + +const Message: FC = ({ + message, + observeIntersectionForBottom, + observeIntersectionForMedia, + observeIntersectionForAnimatedStickers, + album, + withAvatar, + withSenderName, + noComments, + isFirstInGroup, + isLastInGroup, + isFirstInDocumentGroup, + isLastInDocumentGroup, + isLastInList, + forceSenderName, + sender, + originSender, + botSender, + isThreadTop, + shouldHideReply, + replyMessage, + replyMessageSender, + outgoingStatus, + uploadProgress, + isFocused, + focusDirection, + noFocusHighlight, + isForwarding, + isChatWithSelf, + isChannel, + lastSyncTime, + highlight, + animatedEmoji, + isInSelectMode, + isSelected, + isGroupSelected, + threadId, + messageListType, + isPinnedList, + shouldAutoLoadMedia, + shouldAutoPlayMedia, + shouldLoopStickers, + focusMessage, + openMediaViewer, + openAudioPlayer, + openUserInfo, + openChat, + cancelSendingMessage, + markMessagesRead, + sendPollVote, + toggleMessageSelection, + setReplyingToId, + openForwardMenu, + clickInlineButton, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + // eslint-disable-next-line no-null/no-null + const bottomMarkerRef = useRef(null); + + useOnIntersect(bottomMarkerRef, observeIntersectionForBottom); + + const { width: windowWidth } = useWindowSize(); + + const { + isContextMenuOpen, contextMenuPosition, + handleBeforeContextMenu, handleContextMenu, + handleContextMenuClose, handleContextMenuHide, + } = useContextMenuHandlers(ref); + + const { chatId, id: messageId, threadInfo } = message; + + const isOwn = isOwnMessage(message); + const isScheduled = messageListType === 'scheduled' || message.isScheduled; + const hasReply = isReplyMessage(message) && !shouldHideReply; + const hasThread = Boolean(threadInfo) && messageListType === 'thread'; + const { forwardInfo, viaBotId } = message; + const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost; + const isInDocumentGroup = !!message.groupedId && !message.isInAlbum; + const isAlbum = Boolean(album) && album!.messages.length > 1; + const { + text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice, + } = getMessageContent(message); + const customShape = getMessageCustomShape(message); + const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape)); + const isContextMenuShown = contextMenuPosition !== undefined; + const containerClassName = buildClassName( + 'Message message-list-item', + isFirstInGroup && 'first-in-group', + isLastInGroup && 'last-in-group', + isFirstInDocumentGroup && 'first-in-document-group', + isLastInDocumentGroup && 'last-in-document-group', + isLastInList && 'last-in-list', + isOwn && 'own', + Boolean(message.views) && 'has-views', + message.isEdited && 'was-edited', + hasReply && 'has-reply', + isContextMenuShown && 'has-menu-open', + isFocused && !noFocusHighlight && 'focused', + isForwarding && 'is-forwarding', + message.isDeleting && 'is-deleting', + isInDocumentGroup && 'is-in-document-group', + isAlbum && 'is-album', + message.hasUnreadMention && 'has-unread-mention', + isSelected && 'is-selected', + isInSelectMode && 'is-in-selection-mode', + isThreadTop && 'is-thread-top', + Boolean(message.inlineButtons) && 'has-inline-buttons', + ); + const contentClassName = buildContentClassName(message, { + hasReply, + customShape, + isLastInGroup, + asForwarded, + hasThread, + forceSenderName, + hasComments: message.threadInfo && message.threadInfo.messagesCount > 0, + }); + const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender; + const senderPeer = forwardInfo ? originSender : sender; + const signature = ( + (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined + ); + + useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id); + useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight); + + const handleGroupDocumentMessagesSelect = useCallback((e: ReactMouseEvent) => { + e.stopPropagation(); + + toggleMessageSelection({ + messageId, + groupedId: message.groupedId, + }); + }, [messageId, message.groupedId, toggleMessageSelection]); + + const handleMessageSelect = useCallback((e?: ReactMouseEvent) => { + const params = isAlbum && album && album.messages + ? { + messageId, + childMessageIds: album.messages.map(({ id }) => id), + withShift: e && e.shiftKey, + } + : { messageId, withShift: e && e.shiftKey }; + toggleMessageSelection(params); + }, [toggleMessageSelection, messageId, isAlbum, album]); + + const handleContainerDoubleClick = useCallback(() => { + setReplyingToId({ messageId }); + }, [setReplyingToId, messageId]); + + const handleContentDoubleClick = useCallback((e: ReactMouseEvent) => { + e.stopPropagation(); + }, []); + + const handleAvatarClick = useCallback(() => { + if (!avatarPeer) { + return; + } + + if (isChatPrivate(avatarPeer.id)) { + openUserInfo({ id: avatarPeer.id }); + } else { + openChat({ id: avatarPeer.id }); + } + }, [avatarPeer, openUserInfo, openChat]); + + const handleSenderClick = useCallback(() => { + if (!senderPeer) { + return; + } + + if (isChatPrivate(senderPeer.id)) { + openUserInfo({ id: senderPeer.id }); + } else { + openChat({ id: senderPeer.id }); + } + }, [senderPeer, openUserInfo, openChat]); + + const handleViaBotClick = useCallback(() => { + if (!botSender) { + return; + } + + openUserInfo({ id: botSender.id }); + }, [botSender, openUserInfo]); + + const handleReplyClick = useCallback((): void => { + focusMessage({ chatId, threadId, messageId: message.replyToMessageId }); + }, [focusMessage, chatId, threadId, message.replyToMessageId]); + + const handleMediaClick = useCallback((): void => { + openMediaViewer({ + chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline, + }); + }, [chatId, threadId, messageId, openMediaViewer, isScheduled]); + + const handleAudioPlay = useCallback((): void => { + openAudioPlayer({ chatId, messageId }); + }, [chatId, messageId, openAudioPlayer]); + + const handleAlbumMediaClick = useCallback((albumMessageId: number): void => { + openMediaViewer({ + chatId, + threadId, + messageId: albumMessageId, + origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album, + }); + }, [chatId, threadId, openMediaViewer, isScheduled]); + + const handleReadMedia = useCallback((): void => { + markMessagesRead({ messageIds: [messageId] }); + }, [messageId, markMessagesRead]); + + const handleCancelUpload = useCallback(() => { + cancelSendingMessage({ chatId, messageId }); + }, [cancelSendingMessage, chatId, messageId]); + + const handleVoteSend = useCallback((options: string[]) => { + sendPollVote({ chatId, messageId, options }); + }, [chatId, messageId, sendPollVote]); + + const handleGroupForward = useCallback(() => { + openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId }); + }, [openForwardMenu, chatId, message.groupedId]); + + const handleForward = useCallback(() => { + if (album && album.messages) { + const messageIds = album.messages.map(({ id }) => id); + openForwardMenu({ fromChatId: chatId, messageIds }); + } else { + openForwardMenu({ fromChatId: chatId, messageIds: [messageId] }); + } + }, [album, openForwardMenu, chatId, messageId]); + + const handleFocus = useCallback(() => { + focusMessage({ + chatId, threadId: MAIN_THREAD_ID, messageId, + }); + }, [focusMessage, chatId, messageId]); + + const handleFocusForwarded = useCallback(() => { + if (isInDocumentGroup) { + focusMessage({ + chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId, + }); + return; + } + focusMessage({ + chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId, + }); + }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]); + + const lang = useLang(); + + let style = ''; + let calculatedWidth; + const albumLayout = useMemo(() => { + return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), album!, windowWidth) : undefined; + }, [isAlbum, windowWidth, isOwn, asForwarded, album]); + + const extraPadding = asForwarded ? 28 : 0; + if (!isAlbum && (photo || video)) { + let width: number | undefined; + if (photo) { + width = calculateMediaDimensions(message).width; + } else if (video) { + if (video.isRound) { + width = ROUND_VIDEO_DIMENSIONS; + } else { + width = calculateMediaDimensions(message).width; + } + } + + if (width) { + calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), width); + } + } else if (albumLayout) { + calculatedWidth = Math.max(getMinMediaWidth(Boolean(text)), albumLayout.containerStyle.width); + } + + if (calculatedWidth) { + style = `width: ${calculatedWidth + extraPadding}px`; + } + + function renderAvatar() { + const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id); + const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined; + const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined; + const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined; + + return ( + + ); + } + + function renderContent() { + const className = buildClassName( + 'content-inner', + asForwarded && !customShape && 'forwarded-message', + hasReply && 'reply-message', + ); + const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread; + + return ( +
    + {renderSenderName()} + {hasReply && ( + + )} + {sticker && ( + + )} + {animatedEmoji && ( + + )} + {isAlbum && ( + + )} + {!isAlbum && photo && ( + + )} + {!isAlbum && video && video.isRound && ( + + )} + {!isAlbum && video && !video.isRound && ( +
    + ); + } + + function renderSenderName() { + const shouldRender = !customShape && ( + (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName + ) && (!isInDocumentGroup || isFirstInDocumentGroup); + + if (!shouldRender) { + return undefined; + } + + let senderTitle; + let senderColor; + if (senderPeer) { + senderTitle = getSenderTitle(senderPeer); + + if (!asForwarded) { + senderColor = `color-${getUserColorKey(senderPeer)}`; + } + } else if (forwardInfo && forwardInfo.hiddenUserName) { + senderTitle = forwardInfo.hiddenUserName; + } + + return ( +
    + {senderTitle ? ( + + {renderText(senderTitle)} + + ) : !botSender ? ( + NBSP + ) : undefined} + {botSender && ( + <> + {lang('ViaBot')} + + {renderText(`@${botSender.username}`)} + + + )} + {forwardInfo && forwardInfo.isLinkedChannelPost ? ( + {lang('DiscussChannel')} + ) : message.adminTitle && !isChannel ? ( + {message.adminTitle} + ) : undefined} +
    + ); + } + + const metaSafeAuthorWidth = useMemo(() => { + return signature ? calculateAuthorWidth(signature) : undefined; + }, [signature]); + + const canShowActionButton = ( + !(isContextMenuShown || isInSelectMode || isForwarding) + && (!isInDocumentGroup || isLastInDocumentGroup) + ); + const canForward = canShowActionButton && isChannel && !isScheduled; + const canFocus = canShowActionButton && ( + (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId) + || isPinnedList + ); + const showCommentsButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup) + && messageListType === 'thread' && !noComments; + + return ( +
    +
    + {!isInDocumentGroup && ( +
    + {isSelected && } +
    + )} + {isLastInDocumentGroup && ( +
    + {isGroupSelected && ( + + )} +
    + )} + {withAvatar && renderAvatar()} +
    +
    + {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && ( +
    {lang('ForwardedMessage')}
    + )} + {renderContent()} + {(!isInDocumentGroup || isLastInDocumentGroup) && ( + + )} + {canForward ? ( + + ) : canFocus ? ( + + ) : undefined} + {showCommentsButton && } +
    + {message.inlineButtons && ( + + )} +
    + {contextMenuPosition && ( + + )} +
    + ); +}; + +function handleDocumentGroupMouseEnter(e: React.MouseEvent) { + const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget); + if (lastGroupElement) { + lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, ''); + } +} + +function handleDocumentGroupMouseLeave(e: React.MouseEvent) { + const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget); + if (lastGroupElement) { + lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE); + } +} + +function getLastElementInDocumentGroup(element: Element) { + let current: Element | null = element; + + do { + current = current.nextElementSibling; + } while (current && !current.classList.contains('last-in-document-group')); + + return current; +} + +export default memo(withGlobal( + (global, ownProps): StateProps => { + const { focusedMessage, forwardMessages, lastSyncTime } = global; + const { + message, album, withSenderName, withAvatar, threadId, messageListType, + } = ownProps; + const { + id, chatId, viaBotId, replyToMessageId, isOutgoing, + } = message; + + const chat = selectChat(global, chatId); + const isChatWithSelf = selectIsChatWithSelf(global, chatId); + const isChannel = chat && isChatChannel(chat); + + const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message); + const canShowSender = withSenderName || withAvatar || forceSenderName; + const sender = canShowSender ? selectSender(global, message) : undefined; + const originSender = selectForwardedSender(global, message); + const botSender = viaBotId ? selectUser(global, viaBotId) : undefined; + + const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined; + const isThreadTop = message.id === threadTopMessageId; + + const shouldHideReply = replyToMessageId === threadTopMessageId; + const replyMessage = replyToMessageId && !shouldHideReply + ? selectChatMessage(global, chatId, replyToMessageId) + : undefined; + const replyMessageSender = replyMessage && selectSender(global, replyMessage); + + const uploadProgress = selectUploadProgress(global, message); + const isFocused = messageListType === 'thread' && ( + album + ? album.messages.some((m) => selectIsMessageFocused(global, m)) + : selectIsMessageFocused(global, message) + ); + + const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {}; + + const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id); + + const { query: highlight } = selectCurrentTextSearch(global) || {}; + + const singleEmoji = getMessageSingleEmoji(message); + let isSelected: boolean; + + if (album && album.messages) { + isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId)); + } else { + isSelected = selectIsMessageSelected(global, id); + } + + return { + forceSenderName, + sender, + originSender, + botSender, + shouldHideReply, + isThreadTop, + replyMessage, + replyMessageSender, + ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }), + ...(typeof uploadProgress === 'number' && { uploadProgress }), + isFocused, + ...(isFocused && { focusDirection, noFocusHighlight }), + isForwarding, + isChatWithSelf, + isChannel, + lastSyncTime, + highlight, + isSingleEmoji: Boolean(singleEmoji), + animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined, + isInSelectMode: selectIsInSelectMode(global), + isSelected, + isGroupSelected: ( + !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId) + ), + threadId, + isPinnedList: messageListType === 'pinned', + shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined, + shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message), + shouldLoopStickers: selectShouldLoopStickers(global), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'focusMessage', + 'openMediaViewer', + 'openAudioPlayer', + 'cancelSendingMessage', + 'openUserInfo', + 'openChat', + 'markMessagesRead', + 'sendPollVote', + 'toggleMessageSelection', + 'setReplyingToId', + 'openForwardMenu', + 'clickInlineButton', + ]), +)(Message)); diff --git a/src/components/middle/message/MessageContextMenu.scss b/src/components/middle/message/MessageContextMenu.scss new file mode 100644 index 000000000..9f4c5d16d --- /dev/null +++ b/src/components/middle/message/MessageContextMenu.scss @@ -0,0 +1,9 @@ +.MessageContextMenu { + position: absolute; + font-size: 1rem; + + .backdrop { + position: absolute; + touch-action: none; + } +} diff --git a/src/components/middle/message/MessageContextMenu.tsx b/src/components/middle/message/MessageContextMenu.tsx new file mode 100644 index 000000000..461d10c69 --- /dev/null +++ b/src/components/middle/message/MessageContextMenu.tsx @@ -0,0 +1,145 @@ +import React, { FC, useCallback, useEffect } from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; +import { IAnchorPosition } from '../../../types'; + +import { getMessageCopyOptions } from './helpers/copyOptions'; +import useContextMenuPosition from '../../../hooks/useContextMenuPosition'; +import { dispatchHeavyAnimationEvent } from '../../../hooks/useHeavyAnimationCheck'; +import useLang from '../../../hooks/useLang'; + +import Menu from '../../ui/Menu'; +import MenuItem from '../../ui/MenuItem'; + +import './MessageContextMenu.scss'; + +type OwnProps = { + isOpen: boolean; + anchor: IAnchorPosition; + message: ApiMessage; + canSendNow?: boolean; + canReschedule?: boolean; + canReply?: boolean; + canPin?: boolean; + canUnpin?: boolean; + canDelete?: boolean; + canEdit?: boolean; + canForward?: boolean; + canFaveSticker?: boolean; + canUnfaveSticker?: boolean; + canCopy?: boolean; + canCopyLink?: boolean; + canSelect?: boolean; + onReply: () => void; + onEdit: () => void; + onPin: () => void; + onUnpin: () => void; + onForward: () => void; + onDelete: () => void; + onFaveSticker: () => void; + onUnfaveSticker: () => void; + onSelect: () => void; + onSend: () => void; + onReschedule: () => void; + onClose: () => void; + onCloseAnimationEnd?: () => void; + onCopyLink?: () => void; +}; + +const ANIMATION_DURATION = 200; +const SCROLLBAR_WIDTH = 10; + +const MessageContextMenu: FC = ({ + isOpen, + message, + anchor, + canSendNow, + canReschedule, + canReply, + canEdit, + canPin, + canUnpin, + canDelete, + canForward, + canFaveSticker, + canUnfaveSticker, + canCopy, + canCopyLink, + canSelect, + onReply, + onEdit, + onPin, + onUnpin, + onForward, + onDelete, + onFaveSticker, + onUnfaveSticker, + onSelect, + onSend, + onReschedule, + onClose, + onCloseAnimationEnd, + onCopyLink, +}) => { + useEffect(() => { + dispatchHeavyAnimationEvent(ANIMATION_DURATION); + }, [isOpen]); + + const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined); + + const getTriggerElement = useCallback(() => { + return document.querySelector(`.active > .MessageList div[data-message-id="${message.id}"]`); + }, [message.id]); + + const getRootElement = useCallback( + () => document.querySelector('.active > .MessageList'), + [], + ); + + const getMenuElement = useCallback( + () => document.querySelector('.MessageContextMenu .bubble'), + [], + ); + + const { positionX, positionY, style } = useContextMenuPosition( + anchor, + getTriggerElement, + getRootElement, + getMenuElement, + SCROLLBAR_WIDTH, + (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight, + ); + + const lang = useLang(); + + return ( + + {canSendNow && {lang('MessageScheduleSend')}} + {canReschedule && {lang('MessageScheduleEditTime')}} + {canReply && {lang('Reply')}} + {canEdit && {lang('Edit')}} + {canFaveSticker && {lang('AddToFavorites')}} + {canUnfaveSticker && ( + {lang('Stickers.RemoveFromFavorites')} + )} + {canCopy && copyOptions.map((options) => ( + {lang(options.label)} + ))} + {canPin && {lang('DialogPin')}} + {canUnpin && {lang('DialogUnpin')}} + {canForward && {lang('Forward')}} + {canSelect && {lang('Common.Select')}} + {canDelete && {lang('Delete')}} + + ); +}; + +export default MessageContextMenu; diff --git a/src/components/middle/message/MessageMeta.scss b/src/components/middle/message/MessageMeta.scss new file mode 100644 index 000000000..626f78b81 --- /dev/null +++ b/src/components/middle/message/MessageMeta.scss @@ -0,0 +1,110 @@ +.MessageMeta { + position: absolute; + height: 1.25rem; + bottom: 0; + right: 0; + display: flex; + align-items: center; + background: rgba(#999999, 0.6); + border-radius: .65rem; + padding: 0 .25rem; + color: white; + cursor: pointer; + max-width: 100%; + + .message-time, + .message-signature, + .message-views { + font-size: .75rem; + white-space: nowrap; + } + + .message-time { + margin-right: .1875rem; + } + + .message-views { + margin-left: .1875rem; + } + + .message-signature { + overflow: hidden; + text-overflow: ellipsis; + margin-right: 0.375rem; + } + + .icon-channelviews { + margin-left: 0.125rem; + margin-right: 0.375rem; + font-size: 1.125rem; + position: relative; + top: -0.0625rem; + } + + .has-solid-background & { + color: rgba(var(--color-text-meta-rgb), 0.75); + background: none; + } + + .media:not(.text) &, + .Message .custom-shape & { + background: rgba(0,0,0, 0.2); + color: white !important; + opacity: 1; + bottom: .25rem; + right: .25rem; + left: auto; + height: 1.125rem; + padding: 0 .3125rem 0 .375rem; + + .MessageOutgoingStatus i { + background: transparent; + } + } + + .is-forwarded.media:not(.text) & { + bottom: 0.9rem; + right: 0.8rem; + } + + .emoji-only & { + right: 0; + } + + .Message.own .has-solid-background & { + color: var(--color-text-green); + } + + .MessageOutgoingStatus { + margin-left: -.1875rem; + font-size: 1.1875rem; + } + + .message-content.has-replies:not(.custom-shape) & { + bottom: 3.375rem; + } + + .message-content.has-replies.text:not(.custom-shape) & { + bottom: 3.4375rem; + } +} + +.Message:not(.own) { + .custom-shape .reply-message + .MessageMeta { + right: auto; + left: 13.2rem; + bottom: 0.25rem; + } + + .emoji-only-1 .reply-message + .MessageMeta { + left: 2.5rem; + } + + .emoji-only-2 .reply-message + .MessageMeta { + left: 5.5rem; + } + + .emoji-only-3 .reply-message + .MessageMeta { + left: 6.5rem; + } +} diff --git a/src/components/middle/message/MessageMeta.tsx b/src/components/middle/message/MessageMeta.tsx new file mode 100644 index 000000000..757f874c2 --- /dev/null +++ b/src/components/middle/message/MessageMeta.tsx @@ -0,0 +1,50 @@ +import React, { FC } from '../../../lib/teact/teact'; + +import { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types'; + +import { formatTime } from '../../../util/dateFormat'; +import { formatIntegerCompact } from '../../../util/textFormat'; + +import MessageOutgoingStatus from '../../common/MessageOutgoingStatus'; +import renderText from '../../common/helpers/renderText'; +import useLang from '../../../hooks/useLang'; + +import './MessageMeta.scss'; + +type OwnProps = { + message: ApiMessage; + outgoingStatus?: ApiMessageOutgoingStatus; + signature?: string; + onClick: () => void; +}; + +const MessageMeta: FC = ({ + message, outgoingStatus, signature, onClick, +}) => { + const lang = useLang(); + + return ( + + {Boolean(message.views) && ( + <> + + {formatIntegerCompact(message.views!)} + + + + )} + {signature && ( + {renderText(signature)} + )} + + {message.isEdited && `${lang('EditedMessage')} `} + {formatTime(message.date * 1000)} + + {outgoingStatus && ( + + )} + + ); +}; + +export default MessageMeta; diff --git a/src/components/middle/message/Photo.tsx b/src/components/middle/message/Photo.tsx new file mode 100644 index 000000000..e3fcfc627 --- /dev/null +++ b/src/components/middle/message/Photo.tsx @@ -0,0 +1,176 @@ +import React, { + FC, useCallback, useLayoutEffect, useRef, useState, +} from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; +import { IMediaDimensions } from './helpers/calculateAlbumLayout'; + +import { + getMessagePhoto, + getMessageWebPagePhoto, + getMessageMediaHash, + getMediaTransferState, + isOwnMessage, +} from '../../../modules/helpers'; +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import useShowTransition from '../../../hooks/useShowTransition'; +import usePrevious from '../../../hooks/usePrevious'; +import useBlurredMediaThumb from './hooks/useBlurredMediaThumb'; +import buildClassName from '../../../util/buildClassName'; +import getCustomAppendixBg from './helpers/getCustomAppendixBg'; +import { calculateMediaDimensions } from './helpers/mediaDimensions'; + +import ProgressSpinner from '../../ui/ProgressSpinner'; + +export type OwnProps = { + id?: string; + message: ApiMessage; + observeIntersection?: ObserveFn; + shouldAutoLoad?: boolean; + isInSelectMode?: boolean; + isSelected?: boolean; + uploadProgress?: number; + size?: 'inline' | 'pictogram'; + shouldAffectAppendix?: boolean; + dimensions?: IMediaDimensions & { isSmall?: boolean }; + onClick?: (id: number) => void; + onCancelUpload?: (message: ApiMessage) => void; +}; + +const CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix'; + +const Photo: FC = ({ + id, + message, + observeIntersection, + shouldAutoLoad, + isInSelectMode, + isSelected, + uploadProgress, + size = 'inline', + dimensions, + shouldAffectAppendix, + onClick, + onCancelUpload, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!; + const localBlobUrl = photo.blobUrl; + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad); + const shouldDownload = isDownloadAllowed && isIntersecting; + const { + mediaData, downloadProgress, + } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload); + const fullMediaData = localBlobUrl || mediaData; + const thumbDataUri = useBlurredMediaThumb(message, fullMediaData); + + const { + isUploading, isTransferring, transferProgress, + } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData); + const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false; + const { + shouldRender: shouldRenderSpinner, + transitionClassNames: spinnerClassNames, + } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow'); + const { + shouldRenderThumb, shouldRenderFullMedia, transitionClassNames, + } = useTransitionForMedia(fullMediaData, 'slow'); + + const handleClick = useCallback(() => { + if (isUploading) { + if (onCancelUpload) { + onCancelUpload(message); + } + } else if (!fullMediaData) { + setIsDownloadAllowed((isAllowed) => !isAllowed); + } else if (onClick) { + onClick(message.id); + } + }, [fullMediaData, isUploading, message, onCancelUpload, onClick]); + + const isOwn = isOwnMessage(message); + useLayoutEffect(() => { + if (!shouldAffectAppendix) { + return; + } + + const contentEl = ref.current!.closest('.message-content')!; + + if (fullMediaData) { + getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => { + contentEl.style.setProperty('--appendix-bg', appendixBg); + contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, ''); + }); + } else { + contentEl.classList.add('has-appendix-thumb'); + } + }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]); + + const { width, height, isSmall } = dimensions || calculateMediaDimensions(message); + + const className = buildClassName( + 'media-inner', + !isUploading && 'interactive', + isSmall && 'small-image', + width === height && 'square-image', + ); + + const thumbClassName = buildClassName( + 'thumbnail', + !thumbDataUri && 'empty', + ); + + const style = dimensions + ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;` + : ''; + + return ( +
    + {shouldRenderThumb && ( + + )} + {shouldRenderFullMedia && ( + + )} + {shouldRenderSpinner && ( +
    + +
    + )} + {!fullMediaData && !isDownloadAllowed && ( + + )} + {isTransferring && ( + {Math.round(transferProgress * 100)}% + )} +
    + ); +}; + +export default Photo; diff --git a/src/components/middle/message/Poll.scss b/src/components/middle/message/Poll.scss new file mode 100644 index 000000000..785bfa356 --- /dev/null +++ b/src/components/middle/message/Poll.scss @@ -0,0 +1,175 @@ +.Poll { + min-width: 15rem; + + @media (max-width: 600px) { + min-width: 50vw; + } + + .poll-question { + font-weight: 500; + line-height: 1.25rem; + margin: 0.125rem 0; + word-break: break-word; + } + + .poll-type, + .poll-voters-count { + color: var(--secondary-color); + font-size: 0.875rem; + } + + .poll-type { + margin-bottom: 0.5rem; + display: flex; + align-items: center; + min-height: 1.375rem; + } + + .poll-voters-count { + margin: .4375rem 0 .3125rem; + text-align: center; + } + + .poll-answers { + padding-top: 0.25rem; + padding-bottom: 1rem; + } + + .Checkbox, + .Radio { + padding-left: 2.25rem; + + &:last-child { + margin-bottom: .75rem; + } + + &.disabled { + opacity: 1 !important; + cursor: not-allowed; + } + + .Checkbox-main, + .Radio-main { + &::before { + left: 0.125rem; + background-color: var(--background-color); + + .Message.own & { + border-color: var(--accent-color); + } + } + + &::after { + left: 0.4375rem; + background-color: var(--accent-color); + } + } + + input:checked ~ .Radio-main, + input:checked ~ .Checkbox-main { + &::before { + border-color: var(--accent-color); + } + } + + .Spinner { + left: 0.125rem; + } + } + + .Checkbox { + .Checkbox-main { + &::after { + left: 0.125rem; + background-color: var(--color-primary); + + .Message.own & { + background-color: var(--accent-color); + } + } + } + } + + .Spinner > div { + // gray spinner + background-image: var(--spinner-gray-data); + + .Message.own & { + // green spinner + background-image: var(--spinner-green-data); + } + } + + .poll-recent-voters { + display: inline-flex; + align-items: center; + vertical-align: text-bottom; + margin-left: .875rem; + margin-right: .5rem; + margin-top: -2px; + + .Avatar { + border: 1px solid #fff; + margin-right: 0; + box-sizing: content-box; + + &:not(:first-child) { + margin-left: -3px; + } + } + } + + .poll-countdown { + margin-left: auto; + font-size: .75rem; + transition: color .2s; + + &.hurry-up { + color: var(--color-error); + + .poll-countdown-progress { + stroke: var(--color-error); + } + } + + svg { + vertical-align: -3px; + } + } + + .poll-countdown-progress { + stroke: var(--color-primary); + fill: transparent; + stroke-width: 2; + stroke-linecap: round; + transition: stroke-dashoffset 2s, stroke .2s; + } + + .poll-quiz-help { + margin: -.625rem 0 -.625rem auto; + .Message:not(.own) & { + color: var(--color-primary); + } + } + + .poll-results, + .poll-answers { + padding-top: 0.25rem; + padding-bottom: 0.5rem; + } + + .Button { + text-transform: none; + font-size: 1rem; + + .Message.own & { + color: var(--accent-color); + --color-primary-shade-rgb: var(--color-text-green-rgb); + } + } + + > .Button { + margin-top: -.125rem; + margin-bottom: -.0625rem; + } +} diff --git a/src/components/middle/message/Poll.tsx b/src/components/middle/message/Poll.tsx new file mode 100644 index 000000000..5a0e34eb1 --- /dev/null +++ b/src/components/middle/message/Poll.tsx @@ -0,0 +1,371 @@ +import React, { + FC, + useCallback, + useEffect, + useState, + memo, + useMemo, + useRef, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { + ApiMessage, ApiPoll, ApiUser, ApiPollAnswer, +} from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import renderText from '../../common/helpers/renderText'; +import { renderTextWithEntities } from '../../common/helpers/renderMessageText'; +import { formatMediaDuration } from '../../../util/dateFormat'; +import useLang from '../../../hooks/useLang'; + +import CheckboxGroup from '../../ui/CheckboxGroup'; +import RadioGroup from '../../ui/RadioGroup'; +import Avatar from '../../common/Avatar'; +import Button from '../../ui/Button'; +import Notification from '../../ui/Notification'; +import PollOption from './PollOption'; + +import './Poll.scss'; + +type OwnProps = { + message: ApiMessage; + poll: ApiPoll; + onSendVote: (options: string[]) => void; +}; + +type StateProps = { + recentVoterIds?: number[]; + usersById: Record; +}; + +type DispatchProps = Pick; + +const SOLUTION_DURATION = 5000; +const NBSP = '\u00A0'; + +const Poll: FC = ({ + message, + poll, + recentVoterIds, + usersById, + loadMessage, + onSendVote, + openPollResults, +}) => { + const { id: messageId, chatId } = message; + const { summary, results } = poll; + const [isSubmitting, setIsSubmitting] = useState(false); + const [chosenOptions, setChosenOptions] = useState([]); + const [isSolutionShown, setIsSolutionShown] = useState(false); + const [wasSubmitted, setWasSubmitted] = useState(false); + const [closePeriod, setClosePeriod] = useState( + !summary.closed && summary.closeDate && summary.closeDate > 0 + ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000), summary.closePeriod!) + : 0, + ); + // eslint-disable-next-line no-null/no-null + const countdownRef = useRef(null); + const { results: voteResults, totalVoters } = results; + const hasVoted = voteResults && voteResults.some((r) => r.isChosen); + const canVote = !summary.closed && !hasVoted; + const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0; + const isMultiple = canVote && summary.multipleChoice; + const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters; + const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => { + if (r.isCorrect) { + answers.push(r.option); + } + + return answers; + }, []) : []; + const answers = summary.answers.map((a) => ({ + label: a.text, + value: a.option, + hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0), + })); + + useEffect(() => { + if ( + isSubmitting + && poll.results.results + && poll.results.results.some((result) => result.isChosen) + ) { + setIsSubmitting(false); + } + }, [isSubmitting, poll.results.results]); + + useEffect(() => { + if (closePeriod > 0) { + setTimeout(() => setClosePeriod(closePeriod - 1), 1000); + } + + const countdownEl = countdownRef.current; + + if (countdownEl) { + const circumference = 6 * 2 * Math.PI; + const svgEl = countdownEl.lastElementChild; + const timerEl = countdownEl.firstElementChild; + if (closePeriod <= 5) { + countdownEl.classList.add('hurry-up'); + } + + if (!svgEl || !timerEl) { + countdownEl.innerHTML = ` + ${formatMediaDuration(closePeriod)} + + + `; + } else { + const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference; + timerEl.textContent = formatMediaDuration(closePeriod); + (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`); + } + } + }, [closePeriod, summary.closePeriod]); + + useEffect(() => { + if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) { + loadMessage({ chatId, messageId }); + } + }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]); + + // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired. + useEffect(() => { + let timer: number | undefined; + + if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) { + timer = window.setTimeout(() => { + loadMessage({ chatId, messageId }); + }, summary.closePeriod * 1000); + } + + return () => { + if (timer) { + window.clearTimeout(timer); + } + }; + }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]); + + const recentVoters = useMemo(() => { + return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => { + const user = usersById[id]; + if (user) { + result.push(user); + } + + return result; + }, []) : []; + }, [usersById, recentVoterIds]); + + const handleRadioChange = useCallback( + (option: string) => { + setChosenOptions([option]); + setIsSubmitting(true); + setWasSubmitted(true); + onSendVote([option]); + }, [onSendVote], + ); + + const handleCheckboxChange = useCallback( + (options: string[]) => { + setChosenOptions(options); + }, [], + ); + + const handleVoteClick = useCallback( + () => { + setIsSubmitting(true); + setWasSubmitted(true); + onSendVote(chosenOptions); + }, [onSendVote, chosenOptions], + ); + + const handleViewResultsClick = useCallback( + () => { + openPollResults({ chatId, messageId }); + }, [chatId, messageId, openPollResults], + ); + + const handleSolutionShow = useCallback(() => { + setIsSolutionShown(true); + }, []); + + const handleSolutionHide = useCallback(() => { + setIsSolutionShown(false); + setWasSubmitted(false); + }, []); + + // Show the solution to quiz if the answer was incorrect + useEffect(() => { + if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) { + const correctResult = results.results.find((r) => r.isChosen && r.isCorrect); + if (!correctResult) { + setIsSolutionShown(true); + } + } + }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]); + + const lang = useLang(); + + function renderResultOption(answer: ApiPollAnswer) { + return ( + + ); + } + + function renderRecentVoters() { + return ( + recentVoters.length > 0 && ( +
    + {recentVoters.map((user) => ( + + ))} +
    + ) + ); + } + + function renderSolution() { + return ( + isSolutionShown && poll.results.solution && ( + + ) + ); + } + + return ( +
    + {renderSolution()} +
    {renderText(summary.question)}
    +
    + {getPollTypeString(summary)} + {renderRecentVoters()} + {closePeriod > 0 && canVote &&
    } + {summary.quiz && poll.results.solution && !canVote && ( + + )} +
    + {canVote && ( +
    + {isMultiple + ? ( + + ) + : ( + + )} +
    + )} + {!canVote && ( +
    + {summary.answers.map(renderResultOption)} +
    + )} + {!canViewResult && !isMultiple && ( +
    {getReadableVotersCount(summary.quiz, results.totalVoters)}
    + )} + {isMultiple && ( + + )} + {canViewResult && ( + + )} +
    + ); +}; + +function getPollTypeString(summary: ApiPoll['summary']) { + // When we just created the poll, some properties don't exist. + if (typeof summary.isPublic === 'undefined') { + return NBSP; + } + + if (summary.quiz) { + return summary.isPublic ? 'Quiz' : 'Anonymous Quiz'; + } + + if (summary.closed) { + return 'Final results'; + } + + return summary.isPublic ? 'Poll' : 'Anonymous Poll'; +} + +function getReadableVotersCount(isQuiz: true | undefined, count?: number) { + if (!count) { + return isQuiz ? 'No answers yet' : 'No voters yet'; + } + + return isQuiz ? `${count} answered` : `${count} voted`; +} + +export default memo(withGlobal( + (global, { poll }) => { + const { recentVoterIds } = poll.results; + const { byId: usersById } = global.users; + if (!recentVoterIds || recentVoterIds.length === 0) { + return {}; + } + + return { + recentVoterIds, + usersById, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']), +)(Poll)); diff --git a/src/components/middle/message/PollOption.scss b/src/components/middle/message/PollOption.scss new file mode 100644 index 000000000..9cb991b46 --- /dev/null +++ b/src/components/middle/message/PollOption.scss @@ -0,0 +1,115 @@ +.PollOption { + display: flex; + flex-flow: row nowrap; + margin-bottom: 0.75rem; + + &:last-child { + margin-bottom: 0; + } + + .poll-option-text { + word-break: break-word; + } + + .poll-option-share { + position: relative; + margin-top: .125rem; + width: 1.75rem; + margin-right: .5rem; + flex-shrink: 0; + font-weight: 500; + font-size: .875rem; + text-align: right; + + &.limit-width { + display: inline-flex; + justify-content: center; + font-size: .75rem; + } + } + + .poll-option-chosen { + position: absolute; + right: 0; + bottom: -5px; + width: 1rem; + height: 1rem; + background: var(--accent-color); + color: #fff; + border-radius: .5rem; + font-size: .75rem; + text-align: center; + + &.wrong { + background: var(--color-error); + } + + .is-forwarded & > i { + margin-left: 1px; + } + + &.animate { + opacity: 0; + animation-name: PollOptionIconAnimate; + animation-delay: .09s; + animation-duration: .3s; + animation-fill-mode: forwards; + } + } + + .poll-option-right { + flex-grow: 1; + } + + .poll-option-answer { + position: relative; + } + + .poll-option-line { + position: relative; + width: 0; + height: 0.25rem; + min-width: 0.5rem; + border-radius: 0.125rem; + margin-top: 0.5rem; + background: var(--accent-color); + + transform-origin: 0 0; + transition: transform .3s; + transition-delay: .09s; + + } + + .poll-line { + width: 30px; + height: 35px; + position: absolute; + left: -27px; + bottom: -5px; + transition: stroke-dashoffset .3s, stroke-dasharray .3s; + stroke-dashoffset: 0; + stroke-dasharray: 0, 200% + } + + .poll-line path { + stroke-width: 4px; + stroke-linecap: round; + stroke: var(--accent-color); + fill:none + } + + .wrong { + .poll-option-line { + background: var(--color-error); + } + + .poll-line path { + stroke: var(--color-error); + } + } +} + +@keyframes PollOptionIconAnimate { + 0% { opacity: 0 } + 100% { opacity: 1 } +} diff --git a/src/components/middle/message/PollOption.tsx b/src/components/middle/message/PollOption.tsx new file mode 100644 index 000000000..2177e2079 --- /dev/null +++ b/src/components/middle/message/PollOption.tsx @@ -0,0 +1,105 @@ +import React, { + FC, useState, useEffect, useRef, +} from '../../../lib/teact/teact'; + +import { ApiPollAnswer, ApiPollResult } from '../../../api/types'; + +import buildClassName from '../../../util/buildClassName'; +import renderText from '../../common/helpers/renderText'; + +import './PollOption.scss'; + +type OwnProps = { + answer: ApiPollAnswer; + voteResults?: ApiPollResult[]; + totalVoters?: number; + maxVotersCount?: number; + correctResults: string[]; + shouldAnimate: boolean; +}; + +const PollOption: FC = ({ + answer, + voteResults, + totalVoters, + maxVotersCount, + correctResults, + shouldAnimate, +}) => { + const result = voteResults && voteResults.find((r) => r.option === answer.option); + const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1; + const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen); + const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0; + const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent); + // eslint-disable-next-line no-null/no-null + const lineRef = useRef(null); + const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0; + const isAnimationDoesNotStart = finalPercent < answerPercent; + + useEffect(() => { + if (shouldAnimate) { + setFinalPercent(answerPercent); + } + }, [shouldAnimate, answerPercent]); + + useEffect(() => { + const lineEl = lineRef.current; + + if (lineEl && shouldAnimate) { + const svgEl = lineEl.firstElementChild; + + const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44'; + if (!svgEl) { + lineEl.innerHTML = ` + + + `; + } else { + svgEl.setAttribute('style', style); + } + } + }, [isAnimationDoesNotStart, shouldAnimate]); + + if (!voteResults || !result) { + return undefined; + } + + const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`; + + return ( +
    +
    + {answerPercent}% + {showIcon && ( + + + + )} +
    +
    +
    + {renderText(answer.text)} +
    +
    +
    +
    +
    +
    +
    + ); +}; + +function getPercentage(value: number, total: number) { + return total > 0 ? ((value / total) * 100).toFixed() : 0; +} + +export default PollOption; diff --git a/src/components/middle/message/RoundVideo.scss b/src/components/middle/message/RoundVideo.scss new file mode 100644 index 000000000..20cb9cb84 --- /dev/null +++ b/src/components/middle/message/RoundVideo.scss @@ -0,0 +1,38 @@ +.RoundVideo { + position: relative; + width: 200px; + height: 200px; + cursor: pointer; + + .thumbnail-wrapper { + width: 200px; + height: 200px; + border-radius: 50%; + overflow: hidden; + } + + .video-wrapper { + position: absolute; + left: 0; + top: 0; + border-radius: 50%; + overflow: hidden; + } + + .progress { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + } + + .progress-circle { + stroke: white; + fill: transparent; + stroke-width: 4; + stroke-opacity: .35; + stroke-linecap: round; + } +} diff --git a/src/components/middle/message/RoundVideo.tsx b/src/components/middle/message/RoundVideo.tsx new file mode 100644 index 000000000..3106526e3 --- /dev/null +++ b/src/components/middle/message/RoundVideo.tsx @@ -0,0 +1,216 @@ +import React, { + FC, + useCallback, + useEffect, + useRef, + useState, +} from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; + +import { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions'; +import { formatMediaDuration } from '../../../util/dateFormat'; +import { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers'; +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import usePrevious from '../../../hooks/usePrevious'; +import useBuffering from '../../../hooks/useBuffering'; +import buildClassName from '../../../util/buildClassName'; +import useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo'; +import useVideoCleanup from '../../../hooks/useVideoCleanup'; +import useBlurredMediaThumb from './hooks/useBlurredMediaThumb'; +import safePlay from '../../../util/safePlay'; + +import ProgressSpinner from '../../ui/ProgressSpinner'; + +import './RoundVideo.scss'; + +type OwnProps = { + message: ApiMessage; + observeIntersection: ObserveFn; + shouldAutoLoad?: boolean; + shouldAutoPlay?: boolean; + lastSyncTime?: number; +}; + +const RoundVideo: FC = ({ + message, + observeIntersection, + shouldAutoLoad, + shouldAutoPlay, + lastSyncTime, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + // eslint-disable-next-line no-null/no-null + const playingProgressRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const playerRef = useRef(null); + + const video = message.content.video!; + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay); + const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime); + const { mediaData, downloadProgress } = useMediaWithDownloadProgress( + getMessageMediaHash(message, 'inline'), + !shouldDownload, + getMessageMediaFormat(message, 'inline'), + lastSyncTime, + ); + const thumbDataUri = useBlurredMediaThumb(message, mediaData); + + const { isBuffered, bufferingHandlers } = useBuffering(); + const isTransferring = isDownloadAllowed && !isBuffered; + const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false; + const { + shouldRender: shouldSpinnerRender, + transitionClassNames: spinnerClassNames, + } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled); + const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow'); + + const [isActivated, setIsActivated] = useState(false); + const [progress, setProgress] = useState(0); + + useEffect(() => { + if (!isActivated) { + return; + } + + const circumference = 94 * 2 * Math.PI; + const strokeDashOffset = circumference - progress * circumference; + + const playerEl = playerRef.current!; + const playingProgressEl = playingProgressRef.current!; + const svgEl = playingProgressEl.firstElementChild; + + if (!svgEl) { + playingProgressEl.innerHTML = ` + + `; + } else { + (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString()); + } + + setProgress(playerEl.currentTime / playerEl.duration); + }, [isActivated, progress]); + + const shouldPlay = Boolean(mediaData && isIntersecting); + + useEffect(() => { + if (!playerRef.current) { + return; + } + + if (shouldPlay) { + safePlay(playerRef.current); + } else { + playerRef.current.pause(); + } + }, [shouldPlay]); + + useHeavyAnimationCheckForVideo(playerRef, shouldPlay); + + useVideoCleanup(playerRef, [mediaData]); + + const handleClick = useCallback(() => { + if (!mediaData) { + setIsDownloadAllowed((isAllowed) => !isAllowed); + + return; + } + + const playerEl = playerRef.current!; + if (isActivated) { + if (playerEl.paused) { + safePlay(playerEl); + } else { + playerEl.pause(); + } + } else { + playerEl.currentTime = 0; + setIsActivated(true); + } + }, [isActivated, mediaData]); + + const handleTimeUpdate = useCallback((e: React.UIEvent) => { + const playerEl = e.currentTarget; + + setProgress(playerEl.currentTime / playerEl.duration); + }, []); + + const handleEnded = useCallback(() => { + setIsActivated(false); + setProgress(0); + safePlay(playerRef.current!); + + requestAnimationFrame(() => { + playingProgressRef.current!.innerHTML = ''; + }); + }, []); + + const videoClassName = buildClassName('full-media', transitionClassNames); + + return ( +
    + {shouldRenderThumb && ( +
    + +
    + )} + {mediaData && ( +
    + {/* eslint-disable-next-line jsx-a11y/media-has-caption */} + +
    + )} +
    + {shouldSpinnerRender && ( +
    + +
    + )} + {!mediaData && !isDownloadAllowed && ( + + )} +
    + {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)} + {(!isActivated || playerRef.current!.paused) && } +
    +
    + ); +}; + +export default RoundVideo; diff --git a/src/components/middle/message/Sticker.scss b/src/components/middle/message/Sticker.scss new file mode 100644 index 000000000..26aa19999 --- /dev/null +++ b/src/components/middle/message/Sticker.scss @@ -0,0 +1,9 @@ +.Sticker { + &:not(.inactive) { + cursor: pointer; + } + + &.inactive { + pointer-events: none; + } +} diff --git a/src/components/middle/message/Sticker.tsx b/src/components/middle/message/Sticker.tsx new file mode 100644 index 000000000..5173939dc --- /dev/null +++ b/src/components/middle/message/Sticker.tsx @@ -0,0 +1,108 @@ +import React, { FC, useRef } from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; + +import { MEMOJI_STICKER_ID } from '../../../config'; +import { getStickerDimensions } from '../../common/helpers/mediaDimensions'; +import { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers'; +import useMedia from '../../../hooks/useMedia'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import buildClassName from '../../../util/buildClassName'; +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useFlag from '../../../hooks/useFlag'; +import useWebpThumbnail from '../../../hooks/useWebpThumbnail'; + +import AnimatedSticker from '../../common/AnimatedSticker'; +import StickerSetModal from '../../common/StickerSetModal.async'; + +import './Sticker.scss'; + +type OwnProps = { + message: ApiMessage; + observeIntersection: ObserveFn; + observeIntersectionForPlaying: ObserveFn; + shouldLoop?: boolean; + lastSyncTime?: number; +}; + +const Sticker: FC = ({ + message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const [isModalOpen, openModal, closeModal] = useFlag(); + + const sticker = message.content.sticker!; + const { isAnimated, stickerSetId } = sticker; + const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID; + + const shouldLoad = useIsIntersecting(ref, observeIntersection); + const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying); + + const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!; + const thumbDataUri = useWebpThumbnail(message); + const mediaData = useMedia( + mediaHash, + !shouldLoad, + getMessageMediaFormat(message, 'inline', true), + lastSyncTime, + ); + + const isMediaLoaded = Boolean(mediaData); + const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded); + const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded; + const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow'); + + const { width, height } = getStickerDimensions(sticker); + const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty'); + + const stickerClassName = buildClassName( + 'Sticker media-inner', + isMemojiSticker && 'inactive', + ); + + return ( +
    + {!isMediaReady && ( + + )} + {!isAnimated && shouldRenderFullMedia && ( + + )} + {isAnimated && isMediaLoaded && ( + + )} + +
    + ); +}; + +export default Sticker; diff --git a/src/components/middle/message/Video.tsx b/src/components/middle/message/Video.tsx new file mode 100644 index 000000000..526e91bfc --- /dev/null +++ b/src/components/middle/message/Video.tsx @@ -0,0 +1,215 @@ +import React, { + FC, useCallback, useRef, useState, +} from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; +import { IMediaDimensions } from './helpers/calculateAlbumLayout'; + +import { formatMediaDuration } from '../../../util/dateFormat'; +import buildClassName from '../../../util/buildClassName'; +import { calculateVideoDimensions } from '../../common/helpers/mediaDimensions'; +import { + canMessagePlayVideoInline, + getMediaTransferState, + getMessageMediaFormat, + getMessageMediaHash, + isForwardedMessage, + isOwnMessage, +} from '../../../modules/helpers'; +import { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver'; +import useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress'; +import useMedia from '../../../hooks/useMedia'; +import useShowTransition from '../../../hooks/useShowTransition'; +import useTransitionForMedia from '../../../hooks/useTransitionForMedia'; +import usePrevious from '../../../hooks/usePrevious'; +import useBuffering from '../../../hooks/useBuffering'; +import useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo'; +import useBlurredMediaThumb from './hooks/useBlurredMediaThumb'; +import useVideoCleanup from '../../../hooks/useVideoCleanup'; + +import ProgressSpinner from '../../ui/ProgressSpinner'; + +export type OwnProps = { + id?: string; + message: ApiMessage; + observeIntersection: ObserveFn; + shouldAutoLoad?: boolean; + shouldAutoPlay?: boolean; + uploadProgress?: number; + dimensions?: IMediaDimensions; + lastSyncTime?: number; + onClick?: (id: number) => void; + onCancelUpload?: (message: ApiMessage) => void; +}; + +const Video: FC = ({ + id, + message, + observeIntersection, + shouldAutoLoad, + shouldAutoPlay, + uploadProgress, + lastSyncTime, + dimensions, + onClick, + onCancelUpload, +}) => { + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + // eslint-disable-next-line no-null/no-null + const videoRef = useRef(null); + + const video = message.content.video!; + const localBlobUrl = video.blobUrl; + const canPlayInline = Boolean(localBlobUrl) || canMessagePlayVideoInline(video); + + const isIntersecting = useIsIntersecting(ref, observeIntersection); + + const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad); + const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime); + const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay); + + const previewBlobUrl = useMedia( + getMessageMediaHash(message, 'pictogram'), + !(isIntersecting && lastSyncTime), + getMessageMediaFormat(message, 'pictogram'), + lastSyncTime, + ); + const thumbDataUri = useBlurredMediaThumb(message, previewBlobUrl); + const { mediaData, downloadProgress } = useMediaWithDownloadProgress( + getMessageMediaHash(message, 'inline'), + !shouldDownload, + getMessageMediaFormat(message, 'inline'), + lastSyncTime, + ); + + const previewMediaData = previewBlobUrl || thumbDataUri; + const fullMediaData = localBlobUrl || mediaData; + const isInline = Boolean(canPlayInline && isIntersecting && fullMediaData); + + const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad); + const { isUploading, isTransferring, transferProgress } = getMediaTransferState( + message, + uploadProgress || downloadProgress, + shouldDownload && (canPlayInline && !isBuffered), + ); + const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false; + const { + shouldRender: shouldRenderSpinner, + transitionClassNames: spinnerClassNames, + } = useShowTransition(isTransferring, undefined, wasDownloadDisabled); + const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow'); + + const [playProgress, setPlayProgress] = useState(0); + const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => { + setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1)); + }, []); + + const isOwn = isOwnMessage(message); + const isForwarded = isForwardedMessage(message); + const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded); + + useHeavyAnimationCheckForVideo(videoRef, isInline); + + useVideoCleanup(videoRef, [isInline]); + + const handleClick = useCallback(() => { + if (isUploading) { + if (onCancelUpload) { + onCancelUpload(message); + } + } else if (canPlayInline && !fullMediaData) { + setIsDownloadAllowed((isAllowed) => !isAllowed); + } else if (canPlayInline && fullMediaData && !isPlayAllowed) { + setIsPlayAllowed(true); + videoRef.current!.play(); + } else if (onClick) { + onClick(message.id); + } + }, [isUploading, canPlayInline, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]); + + const className = buildClassName('media-inner dark', !isUploading && 'interactive'); + const thumbClassName = buildClassName('thumbnail', !previewMediaData && 'empty'); + const videoClassName = buildClassName('full-media', transitionClassNames); + const videoStyle = previewMediaData ? `background-image: url(${previewMediaData}); background-size: cover` : ''; + + const style = dimensions + ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;` + : ''; + + const shouldRenderInlineVideo = isInline; + const shouldRenderHqPreview = !canPlayInline && mediaData; + const shouldRenderPlayButton = !canPlayInline || (isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner); + const shouldRenderDownloadButton = canPlayInline && !isDownloadAllowed; + + return ( +
    + {(shouldRenderThumb || !isInline) && ( + + )} + {shouldRenderInlineVideo && ( + + )} + {shouldRenderHqPreview && ( + + )} + {shouldRenderPlayButton && ( + + )} + {shouldRenderSpinner && ( +
    + +
    + )} + {shouldRenderDownloadButton && ( + + )} + {isTransferring && !canPlayInline ? ( + {Math.round(transferProgress * 100)}% + ) : isTransferring && canPlayInline ? ( + ... + ) : ( +
    + {video.isGif ? 'GIF' : formatMediaDuration(video.duration - playProgress)} +
    + )} +
    + ); +}; + +export default Video; diff --git a/src/components/middle/message/WebPage.scss b/src/components/middle/message/WebPage.scss new file mode 100644 index 000000000..0d22b40b6 --- /dev/null +++ b/src/components/middle/message/WebPage.scss @@ -0,0 +1,93 @@ +.WebPage { + margin-top: 0.25rem; + margin-bottom: 0.125rem; + padding-left: .625rem; + font-size: 0.875rem; + line-height: 1.125rem; + max-width: 29rem; + position: relative; + + &::before { + content: ''; + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 2px; + background: var(--accent-color); + border-radius: 2px; + } + + .media-inner { + margin: 0 !important; + margin-bottom: 0.375rem !important; + + &, & img, &.small-image img { + border-radius: var(--border-radius-messages-small) !important; + } + + &.square-image { + width: 5rem; + height: 5rem; + min-height: 0; + margin-bottom: 0 !important; + + img { + width: 100%; + height: 100%; + } + } + } + + &.with-square-photo { + display: flex; + margin-bottom: 1rem; + + .WebPage-text { + order: 1; + padding-right: 1rem; + } + + .media-inner { + order: 2; + flex-shrink: 0; + } + } + + &:not(.with-square-photo) { + .site-name, + .site-title, + .site-description { + &:last-child::after { + content: ''; + display: inline-block; + width: var(--meta-safe-area-size); + height: 0.5rem; + } + } + } + + .site-name, + .site-description, + .site-title { + word-break: break-word; + } + + .site-name { + color: var(--accent-color); + font-weight: 500; + } + + .site-title { + font-weight: 500; + margin-bottom: 0.125rem; + } + + .site-description { + line-height: 1rem; + margin-bottom: 0; + } +} + + diff --git a/src/components/middle/message/WebPage.tsx b/src/components/middle/message/WebPage.tsx new file mode 100644 index 000000000..6e100a98f --- /dev/null +++ b/src/components/middle/message/WebPage.tsx @@ -0,0 +1,101 @@ +import React, { FC, memo, useCallback } from '../../../lib/teact/teact'; + +import { ApiMessage } from '../../../api/types'; + +import { getMessageWebPage } from '../../../modules/helpers'; +import { calculateMediaDimensions } from './helpers/mediaDimensions'; +import renderText from '../../common/helpers/renderText'; +import trimText from '../../../util/trimText'; +import { ObserveFn } from '../../../hooks/useIntersectionObserver'; + +import SafeLink from '../../common/SafeLink'; +import Photo from './Photo'; + +import './WebPage.scss'; + +const MAX_TEXT_LENGTH = 170; // symbols + +type OwnProps = { + message: ApiMessage; + observeIntersection?: ObserveFn; + shouldAutoLoad?: boolean; + inPreview?: boolean; + onMediaClick?: () => void; + onCancelMediaTransfer?: () => void; +}; + +const WebPage: FC = ({ + message, + observeIntersection, + shouldAutoLoad, + inPreview, + onMediaClick, + onCancelMediaTransfer, +}) => { + const webPage = getMessageWebPage(message); + + let isSquarePhoto = false; + if (webPage && webPage.photo) { + const { width, height } = calculateMediaDimensions(message); + isSquarePhoto = width === height; + } + + const handleMediaClick = useCallback(() => { + if (webPage && (isSquarePhoto || webPage.hasDocument)) { + window.open(webPage.url); + } else if (onMediaClick) { + onMediaClick(); + } + }, [webPage, isSquarePhoto, onMediaClick]); + + if (!webPage) { + return undefined; + } + + const { + siteName, + url, + displayUrl, + title, + description, + photo, + } = webPage; + + const truncatedDescription = trimText(description, MAX_TEXT_LENGTH); + + const className = [ + 'WebPage', + photo + ? (isSquarePhoto && 'with-square-photo') + : (!inPreview && 'without-photo'), + ].filter(Boolean).join(' '); + + return ( +
    + {photo && ( + + )} +
    + + {title && ( +

    {renderText(title)}

    + )} + {truncatedDescription && ( +

    {renderText(truncatedDescription, ['emoji', 'br'])}

    + )} +
    +
    + ); +}; + +export default memo(WebPage); diff --git a/src/components/middle/message/_message-content.scss b/src/components/middle/message/_message-content.scss new file mode 100644 index 000000000..7d6315f83 --- /dev/null +++ b/src/components/middle/message/_message-content.scss @@ -0,0 +1,563 @@ +.message-content { + position: relative; + max-width: var(--max-width); + + @media (max-width: 600px) { + max-width: 69vw; + } + + .text-content { + margin: 0; + word-break: break-word; + line-height: 1.3125; + } + + &:not(.custom-shape) { + font-size: var(--message-text-size, 1rem); + } + + .matching-text-highlight { + background: #CAE3F7; + border-radius: 0.25rem; + padding: 0 0.125rem; + } + + .message-title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.875rem; + font-weight: 500; + line-height: 1.25rem; + color: var(--accent-color); + display: flex; + + & > .interactive { + overflow: hidden; + text-overflow: ellipsis; + } + + &.interactive, & > .interactive { + cursor: pointer; + + &:hover { + opacity: 0.85; + } + } + + & > .color-1 { + color: var(--color-user-1); + } + + & > .color-2 { + color: var(--color-user-2); + } + + & > .color-4 { + color: var(--color-user-4); + } + + & > .color-5 { + color: var(--color-user-5); + } + + & > .color-6 { + color: var(--color-user-6); + } + + & > .color-7 { + color: var(--color-user-7); + } + + & > .color-8 { + color: var(--color-user-8); + } + + & + .File { + margin-top: .25rem; + } + + .via { + padding: 0 0.2rem; + font-weight: 400; + } + + .admin-title { + flex: 1; + margin-left: 1rem; + text-align: right; + font-weight: 400; + font-size: 0.75rem; + margin-top: -0.1rem; + color: rgba(var(--color-text-meta-rgb), 0.75); + + .Message.own & { + color: var(--accent-color); + } + } + } + + &.has-shadow { + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + } + + &.has-solid-background, .is-album & { + background: var(--background-color); + } + + &.has-solid-background { + padding: .3125rem .5rem .375rem; + + .text-content:last-child::after { + content: ''; + display: inline-block; + width: var(--meta-safe-area-size); + height: 1rem; + } + } + + &.has-appendix { + .Message.own & { + &::before { + right: -.5625rem; + background-position: bottom right; + background-image: url('data:image/svg+xml,%3Csvg width="9" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cdefs%3E%3Cfilter x="-50%25" y="-14.7%25" width="200%25" height="141.2%25" filterUnits="objectBoundingBox" id="a"%3E%3CfeOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/%3E%3CfeGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"/%3E%3CfeColorMatrix values="0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0" in="shadowBlurOuter1"/%3E%3C/filter%3E%3Cpath d="M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z" id="b"/%3E%3C/defs%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cuse fill="%23000" filter="url(%23a)" xlink:href="%23b"/%3E%3Cuse fill="%23EEFFDE" xlink:href="%23b"/%3E%3C/g%3E%3C/svg%3E'); + } + } + + .Message:not(.own) & { + &::before { + left: -.5625rem; + background-position: bottom left; + background-image: url('data:image/svg+xml,%3Csvg width="9" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cdefs%3E%3Cfilter x="-50%25" y="-14.7%25" width="200%25" height="141.2%25" filterUnits="objectBoundingBox" id="a"%3E%3CfeOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/%3E%3CfeGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"/%3E%3CfeColorMatrix values="0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0" in="shadowBlurOuter1"/%3E%3C/filter%3E%3Cpath d="M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z" id="b"/%3E%3C/defs%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cuse fill="%23000" filter="url(%23a)" xlink:href="%23b"/%3E%3Cuse fill="%23FFF" xlink:href="%23b"/%3E%3C/g%3E%3C/svg%3E'); + } + } + + &:not(.has-solid-background) { + .Message.is-in-selection-mode.is-album:not(.own) & { + &::before { + bottom: -.125rem !important; + left: -.5rem; + z-index: 2; + } + } + + .Message.is-in-selection-mode.is-album.own & { + &::before { + bottom: -.125rem !important; + right: -.5rem; + z-index: 2; + } + } + } + + &::before { + content: ''; + display: block; + position: absolute; + bottom: -.1875rem; + width: .5625rem; + height: 1.25rem; + } + } + + &.has-appendix-thumb { + .Message.own & { + &::after { + right: -.5625rem; + background-position: bottom right; + background-image: url('data:image/svg+xml,%3Csvg width="9" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cdefs%3E%3Cfilter x="-50%25" y="-14.7%25" width="200%25" height="141.2%25" filterUnits="objectBoundingBox" id="a"%3E%3CfeOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/%3E%3CfeGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"/%3E%3CfeColorMatrix values="0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0" in="shadowBlurOuter1"/%3E%3C/filter%3E%3Cpath d="M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z" id="b"/%3E%3C/defs%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cuse fill="%23000" filter="url(%23a)" xlink:href="%23b"/%3E%3Cuse fill="%23CCCCCC" xlink:href="%23b"/%3E%3C/g%3E%3C/svg%3E'); + } + } + + .Message:not(.own) & { + &::after { + left: -.5625rem; + background-position: bottom left; + background-image: url('data:image/svg+xml,%3Csvg width="9" height="20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cdefs%3E%3Cfilter x="-50%25" y="-14.7%25" width="200%25" height="141.2%25" filterUnits="objectBoundingBox" id="a"%3E%3CfeOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/%3E%3CfeGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"/%3E%3CfeColorMatrix values="0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0" in="shadowBlurOuter1"/%3E%3C/filter%3E%3Cpath d="M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z" id="b"/%3E%3C/defs%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cuse fill="%23000" filter="url(%23a)" xlink:href="%23b"/%3E%3Cuse fill="%23CCCCCC" xlink:href="%23b"/%3E%3C/g%3E%3C/svg%3E'); + } + } + + &::after { + content: ''; + display: block; + position: absolute; + bottom: -.1875rem; + width: .5625rem; + height: 1.25rem; + opacity: 1; + transition: opacity 500ms ease; + } + } + + &[data-has-custom-appendix] { + &::before { + background-image: var(--appendix-bg) !important; + } + + &::after { + opacity: 0; + } + } + + &.document { + padding: .5rem !important; + + .File + .text-content { + margin-top: .313rem; + } + } + + &.voice, + &.audio { + .message-title, + .Embedded { + margin-top: -.1875rem; + margin-bottom: .1875rem; + } + } + + &.voice { + padding: .5rem !important; + + .Voice + .text-content { + margin-top: .5rem; + } + } + + &.audio { + min-width: 17.1875rem; + padding: .5rem .5rem .8125rem !important; + + .Audio + .text-content { + margin-top: .25rem; + margin-bottom: -0.4375rem; + } + } + + &:not(.custom-shape) .emoji { + display: inline-block; + width: 1.25rem; + background-size: 1.25rem; + color: transparent; + margin-right: 1px; + vertical-align: text-bottom; + + &::selection { + background-color: var(--color-selection-highlight-emoji); + color: transparent; + } + } + + &:not(.custom-shape) .text-content .emoji { + width: calc(1.25 * var(--message-text-size, 1rem)); + background-size: calc(1.25 * var(--message-text-size, 1rem)); + } +} + +.message-content.media { + .media-inner { + display: flex; + justify-content: center; + align-items: center; + + &.interactive { + cursor: pointer; + + &.dark video { + background-color: #232323; + } + } + } + + &.round.is-reply { + width: auto !important; + } + + &.force-sender-name .media-inner, + &.force-sender-name .Album, + &.text .media-inner, + &.is-via-bot .media-inner, + &.is-reply .media-inner, + &.is-reply .Album { + margin-left: -0.5rem; + margin-right: -0.5rem; + } + + &.text .media-inner { + margin-top: -0.3125rem; + } + + &.is-reply .media-inner, + &.force-sender-name .Album, + &.is-reply .Album, + .message-title ~ .media-inner { + margin-top: 0.375rem; + margin-bottom: -0.375rem; + } + + // Moved below .is-reply to overwrite its styles + &.text .media-inner, + &.text .Album { + margin-bottom: 0.375rem; + } + + .media-loading { + display: flex; + align-items: center; + justify-content: center; + + &:not(.open) { + opacity: 0.5; + transform: scale(0); + transition: opacity .3s ease, transform .3s ease; + } + } + + .icon-large-play, .icon-download { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + opacity: 0.7; + transition: opacity 150ms; + + &:hover { + opacity: 1; + } + + &:before { + display: flex; + align-items: center; + justify-content: center; + width: 3.375rem; + height: 3.375rem; + border-radius: 50%; + background: rgba(black, 0.25); + } + } + + .icon-download { + font-size: 1.5rem; + } + + .icon-large-play { + font-size: 2.5rem; + } + + .message-media-duration, + .message-upload-progress { + background: rgba(0, 0, 0, .25); + color: #fff; + font-size: 0.75rem; + position: absolute; + left: .1875rem; + top: .1875rem; + z-index: 1; + padding: 0 .375rem; + border-radius: .75rem; + line-height: 1.125rem; + } + + .message-media-duration .icon-muted-chat { + vertical-align: -.1875rem; + margin-left: .375rem; + font-size: 1.0625rem; + } +} + +.message-content.custom-shape { + line-height: 1.2; + font-size: 10rem; + + &.is-reply { + max-width: 100%; + } + + .reply-message { + display: flex; + align-items: flex-start; + flex-direction: row-reverse; + + > p { + margin-bottom: 0; + } + + .EmbeddedMessage { + margin-left: 0.5rem; + border-radius: var(--border-radius-messages); + + @media (max-width: 600px) { + max-width: calc(90vw - 13rem); + } + } + } + + .text-content { + margin-bottom: 1rem; + } + + .media-inner { + line-height: 1; + font-size: 1rem; + flex-shrink: 0; + + .full-media { + top: 0; + left: 0; + bottom: 0; + right: 0; + } + } + + .emoji { + display: inline-block; + color: transparent; + + &::selection { + background-color: var(--color-selection-highlight-emoji); + color: transparent; + } + } + + &.emoji-only { + .text-content { + margin-bottom: 0; + } + } + + &.emoji-only-1 { + min-width: 8rem; + font-size: 4.5rem; + + .content-inner { + height: 7rem; + } + + .text-content { + line-height: 1.5; + text-align: center; + } + + .Message.was-edited & { + min-width: 10rem; + } + + .emoji { + width: 5rem; + height: 5rem; + } + } + + &.emoji-only-2 { + font-size: 4rem; + margin-top: .5rem; + min-width: 10rem; + + &.has-comments { + margin-top: 1.25rem; + } + + .Message.was-edited & { + min-width: 12rem; + } + + .emoji { + width: 4rem; + height: 4rem; + } + } + + &.emoji-only-3 { + font-size: 3rem; + margin-top: 1.75rem; + min-width: 12rem; + + &.has-comments { + margin-top: 2.5rem; + } + + .Message.was-edited & { + min-width: 14rem; + } + + .emoji { + width: 3rem; + height: 3rem; + } + } + + .Message:not(.own) & { + --hover-color: var(--color-reply-hover); + --active-color: var(--color-reply-active); + } + + .Message.own & { + --hover-color: var(--color-reply-own-hover); + --active-color: var(--color-reply-own-active); + + .reply-message { + flex-direction: row; + + .EmbeddedMessage { + margin-right: 0.5rem; + } + } + } +} + +.forwarded-message { + .message-content:not(.custom-shape) & { + position: relative; + margin-top: 0.25rem; + padding-left: 0.625rem; + + &::before { + content: ''; + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0.05rem; + width: 2px; + background: var(--accent-color); + border-radius: 2px; + } + } + + --border-top-left-radius: var(--border-radius-messages-small); + --border-top-right-radius: var(--border-radius-messages-small); + --border-bottom-left-radius: var(--border-radius-messages-small); + --border-bottom-right-radius: var(--border-radius-messages-small); + + > .media-inner { + margin: 0 !important; + margin-bottom: 0.25rem !important; + } +} + +.long-word-break-all { + word-break: break-all; +} + +.text-entity-link { + color: var(--color-links) !important; + text-decoration: none; + word-break: none; + cursor: pointer; + + &:hover, &:active, &:visited { + color: var(--color-links-hover) !important; + text-decoration: underline; + } +} + +.text-entity-code, .text-entity-pre { + color: var(--color-code); + background: var(--color-code-bg); + white-space: pre-wrap; + margin: 0; + padding: 1px 2px; + border-radius: 4px; +} diff --git a/src/components/middle/message/helpers/buildContentClassName.ts b/src/components/middle/message/helpers/buildContentClassName.ts new file mode 100644 index 000000000..da614be76 --- /dev/null +++ b/src/components/middle/message/helpers/buildContentClassName.ts @@ -0,0 +1,106 @@ +import { ApiMessage } from '../../../../api/types'; + +import { getMessageContent } from '../../../../modules/helpers'; + +export function isEmojiOnlyMessage(customShape?: boolean | number) { + return typeof customShape === 'number'; +} + +export function buildContentClassName( + message: ApiMessage, + { + hasReply, + customShape, + isLastInGroup, + asForwarded, + hasThread, + forceSenderName, + hasComments, + }: { + hasReply?: boolean; + customShape?: boolean | number; + isLastInGroup?: boolean; + asForwarded?: boolean; + hasThread?: boolean; + forceSenderName?: boolean; + hasComments?: boolean; + } = {}, +) { + const { + text, photo, video, audio, voice, document, poll, webPage, contact, + } = getMessageContent(message); + + const classNames = ['message-content']; + const isMediaWithNoText = (photo || video) && !text; + const isViaBot = Boolean(message.viaBotId); + + if (isEmojiOnlyMessage(customShape)) { + classNames.push(`emoji-only emoji-only-${customShape}`); + } else if (text) { + classNames.push('text'); + } + + if (customShape) { + classNames.push('custom-shape'); + if (video && video.isRound) { + classNames.push('round'); + } + + if (hasComments) { + classNames.push('has-comments'); + } + } + if (photo || video) { + classNames.push('media'); + } else if (audio) { + classNames.push('audio'); + } else if (voice) { + classNames.push('voice'); + } else if (document) { + classNames.push('document'); + } else if (contact) { + classNames.push('contact'); + } else if (poll) { + classNames.push('poll'); + } else if (webPage) { + classNames.push('web-page'); + + if (webPage.photo) { + classNames.push('media'); + } + } + + if (asForwarded && !customShape) { + classNames.push('is-forwarded'); + } + + if (hasReply) { + classNames.push('is-reply'); + } + + if (hasThread) { + classNames.push('has-replies'); + } + + if (isViaBot) { + classNames.push('is-via-bot'); + } + + if (forceSenderName) { + classNames.push('force-sender-name'); + } + + if (!customShape) { + classNames.push('has-shadow'); + + if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) { + classNames.push('has-solid-background'); + } + + if (isLastInGroup && (photo || !isMediaWithNoText)) { + classNames.push('has-appendix'); + } + } + + return classNames.join(' '); +} diff --git a/src/components/middle/message/helpers/calculateAlbumLayout.ts b/src/components/middle/message/helpers/calculateAlbumLayout.ts new file mode 100644 index 000000000..5b85667ca --- /dev/null +++ b/src/components/middle/message/helpers/calculateAlbumLayout.ts @@ -0,0 +1,606 @@ +/* eslint-disable no-bitwise */ +// Based on +// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp +// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83 + +import { IAlbum } from '../../../../types'; +import { ApiMessage } from '../../../../api/types'; +import { IDimensions } from '../../../../modules/helpers'; + +import { MOBILE_SCREEN_MAX_WIDTH } from '../../../../config'; +import { REM } from '../../../common/helpers/mediaDimensions'; +import { calculateMediaDimensions } from './mediaDimensions'; + +const MAX_WIDTH_MOBILE_VW = 69; +const MAX_WIDTH_DESK_OWN_REM = 30; +const MAX_WIDTH_DESK_REM = 29; +export const AlbumRectPart = { + None: 0, + Top: 1, + Right: 2, + Bottom: 4, + Left: 8, +}; + +type IAttempt = { + lineCounts: number[]; + heights: number[]; +}; +export type IMediaDimensions = { + width: number; + height: number; + x: number; + y: number; +}; +type IMediaLayout = { + dimensions: IMediaDimensions; + sides: number; +}; +type ILayoutParams = { + ratios: number[]; + proportions: string; + averageRatio: number; + maxWidth: number; + minWidth: number; + maxHeight: number; + spacing: number; +}; +export type IAlbumLayout = { + layout: IMediaLayout[]; + containerStyle: IDimensions; +}; + +function getMaxWidth(isOwn: boolean, isForwarded: boolean, windowWidth: number) { + if (windowWidth <= MOBILE_SCREEN_MAX_WIDTH) { + return (windowWidth / 100) * MAX_WIDTH_MOBILE_VW - (isForwarded ? 1.625 : 0) * REM; + } + + const maxWidth = isOwn ? MAX_WIDTH_DESK_OWN_REM : MAX_WIDTH_DESK_REM; + + return (maxWidth - (isForwarded ? 1.625 : 0)) * REM; +} + +function getRatios(messages: ApiMessage[]) { + return messages.map( + (message) => { + const dimensions = calculateMediaDimensions(message) as IDimensions; + + return dimensions.width / dimensions.height; + }, + ); +} + +function getProportions(ratios: number[]) { + return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join(''); +} + +function getAverageRatio(ratios: number[]) { + return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length; +} + +function accumulate(list: number[], initValue: number) { + return list.reduce((accumulator, item) => accumulator + item, initValue); +} + +function clamp(num: number, low: number, high: number) { + return num < low ? low : (num > high ? high : num); +} + +function cropRatios(ratios: number[], averageRatio: number) { + return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1))); +} + +function calculateContainerSize(layout: IMediaLayout[]) { + const styles: IDimensions = { width: 0, height: 0 }; + layout.forEach(({ + dimensions, + sides, + }) => { + if (sides & AlbumRectPart.Right) { + styles.width = dimensions.width + dimensions.x; + } + if (sides & AlbumRectPart.Bottom) { + styles.height = dimensions.height + dimensions.y; + } + }); + + return styles; +} + +export function calculateAlbumLayout( + isOwn: boolean, + isForwarded: boolean, + album: IAlbum, + windowWidth: number, +): IAlbumLayout { + const spacing = 2; + const ratios = getRatios(album.messages); + const proportions = getProportions(ratios); + const averageRatio = getAverageRatio(ratios); + const albumCount = ratios.length; + const forceCalc = ratios.some((ratio) => ratio > 2); + const maxWidth = getMaxWidth(isOwn, isForwarded, windowWidth); + const maxHeight = maxWidth; + + let layout; + + const params = { + ratios, + proportions, + averageRatio, + maxWidth, + minWidth: 100, + maxHeight, + spacing, + }; + + if (albumCount >= 5 || forceCalc) { + layout = layoutWithComplexLayouter(params); + } else if (albumCount === 2) { + layout = layoutTwo(params); + } else if (albumCount === 3) { + layout = layoutThree(params); + } else { + layout = layoutFour(params); + } + + return { + layout, + containerStyle: calculateContainerSize(layout), + }; +} + +function layoutWithComplexLayouter({ + ratios: originalRatios, + averageRatio, + maxWidth, + minWidth, + spacing, + maxHeight = (4 * maxWidth) / 3, +}: ILayoutParams) { + const ratios = cropRatios(originalRatios, averageRatio); + const count = originalRatios.length; + const result = new Array(count); + const attempts: IAttempt[] = []; + + const multiHeight = (offset: number, attemptCount: number) => { + const attemptRatios = ratios.slice(offset, offset + attemptCount); + const sum = accumulate(attemptRatios, 0); + + return (maxWidth - (attemptCount - 1) * spacing) / sum; + }; + + const pushAttempt = (lineCounts: number[]) => { + const heights: number[] = []; + let offset = 0; + lineCounts.forEach((currentCount) => { + heights.push(multiHeight(offset, currentCount)); + offset += currentCount; + }); + + attempts.push({ + lineCounts, + heights, + }); + }; + + for (let first = 1; first !== count; ++first) { + const second = count - first; + if (first <= 3 && second <= 3) { + pushAttempt([first, second]); + } + } + + for (let first = 1; first !== count - 1; ++first) { + for (let second = 1; second !== count - first; ++second) { + const third = count - first - second; + if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) { + pushAttempt([first, second, third]); + } + } + } + + for (let first = 1; first !== count - 1; ++first) { + for (let second = 1; second !== count - first; ++second) { + for (let third = 1; third !== count - first - second; ++third) { + const fourth = count - first - second - third; + if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) { + pushAttempt([first, second, third, fourth]); + } + } + } + } + + let optimalAttempt: IAttempt | undefined; + let optimalDiff = 0; + for (let i = 0; i < attempts.length; i++) { + const { + heights, + lineCounts, + } = attempts[i]; + const lineCount = lineCounts.length; + const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1); + const minLineHeight = Math.min(...heights); + const bad1 = minLineHeight < minWidth ? 1.5 : 1; + const bad2 = (() => { + for (let line = 1; line !== lineCount; ++line) { + if (lineCounts[line - 1] > lineCounts[line]) { + return 1.5; + } + } + + return 1; + })(); + const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2; + + if (!optimalAttempt || diff < optimalDiff) { + optimalAttempt = attempts[i]; + optimalDiff = diff; + } + } + + const optimalCounts = optimalAttempt!.lineCounts; + const optimalHeights = optimalAttempt!.heights; + const rowCount = optimalCounts.length; + let index = 0; + let y = 0; + for (let row = 0; row !== rowCount; ++row) { + const colCount = optimalCounts[row]; + const lineHeight = optimalHeights[row]; + const height = Math.round(lineHeight); + let x = 0; + + for (let col = 0; col !== colCount; ++col) { + const sides = AlbumRectPart.None + | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None) + | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None) + | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None) + | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None); + const ratio = ratios[index]; + const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight); + result[index] = { + dimensions: { + x, + y, + width, + height, + }, + sides, + }; + x += width + spacing; + ++index; + } + y += height + spacing; + } + + return result; +} + + +function layoutTwo(params: ILayoutParams) { + const { + ratios, + proportions, + averageRatio, + } = params; + return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2 + ? layoutTwoTopBottom(params) + : proportions === 'ww' || proportions === 'qq' + ? layoutTwoLeftRightEqual(params) + : layoutTwoLeftRight(params); +} + +function layoutTwoTopBottom(params: ILayoutParams) { + const { + ratios, + maxWidth, + spacing, + maxHeight, + } = params; + const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2))); + + return [{ + dimensions: { + x: 0, + y: 0, + width: maxWidth, + height, + }, + sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, + }, { + dimensions: { + x: 0, + y: height + spacing, + width: maxWidth, + height, + }, + sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right, + }]; +} + +function layoutTwoLeftRightEqual(params: ILayoutParams) { + const { + ratios, + maxWidth, + spacing, + maxHeight, + } = params; + const width = (maxWidth - spacing) / 2; + const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight))); + return [{ + dimensions: { + x: 0, + y: 0, + width, + height, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, + }, { + dimensions: { + x: width + spacing, + y: 0, + width, + height, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom, + }]; +} + +function layoutTwoLeftRight(params: ILayoutParams) { + const { + ratios, + minWidth, + maxWidth, + spacing, + maxHeight, + } = params; + const minimalWidth = Math.round(1.5 * minWidth); + const secondWidth = Math.min( + Math.round( + Math.max( + 0.4 * (maxWidth - spacing), + (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]), + ), + ), + maxWidth - spacing - minimalWidth, + ); + const firstWidth = maxWidth - secondWidth - spacing; + const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1]))); + + return [{ + dimensions: { + x: 0, + y: 0, + width: firstWidth, + height, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, + }, { + dimensions: { + x: firstWidth + spacing, + y: 0, + width: secondWidth, + height, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom, + }]; +} + +function layoutThree(params: ILayoutParams) { + const { proportions } = params; + + return proportions[0] === 'n' + ? layoutThreeLeftAndOther(params) + : layoutThreeTopAndOther(params); +} + +function layoutThreeLeftAndOther(params: ILayoutParams) { + const { + maxHeight, + spacing, + ratios, + maxWidth, + minWidth, + } = params; + const firstHeight = maxHeight; + const thirdHeight = Math.round( + Math.min( + (maxHeight - spacing) / 2, + (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]), + ), + ); + const secondHeight = firstHeight - thirdHeight - spacing; + const rightWidth = Math.max( + minWidth, + Math.round( + Math.min( + (maxWidth - spacing) / 2, + Math.min( + thirdHeight * ratios[2], + secondHeight * ratios[1], + ), + ), + ), + ); + const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth); + + return [{ + dimensions: { + x: 0, + y: 0, + width: leftWidth, + height: firstHeight, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, + }, { + dimensions: { + x: leftWidth + spacing, + y: 0, + width: rightWidth, + height: secondHeight, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Right, + }, { + dimensions: { + x: leftWidth + spacing, + y: secondHeight + spacing, + width: rightWidth, + height: thirdHeight, + }, + sides: AlbumRectPart.Bottom | AlbumRectPart.Right, + }]; +} + +function layoutThreeTopAndOther(params: ILayoutParams) { + const { + maxWidth, + ratios, + maxHeight, + spacing, + } = params; + const firstWidth = maxWidth; + const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing))); + const secondWidth = (maxWidth - spacing) / 2; + const secondHeight = Math.min( + maxHeight - firstHeight - spacing, + Math.round(Math.min( + secondWidth / ratios[1], + secondWidth / ratios[2], + )), + ); + const thirdWidth = firstWidth - secondWidth - spacing; + + return [{ + dimensions: { + x: 0, + y: 0, + width: firstWidth, + height: firstHeight, + }, + sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, + }, { + dimensions: { + x: 0, + y: firstHeight + spacing, + width: secondWidth, + height: secondHeight, + }, + sides: AlbumRectPart.Bottom | AlbumRectPart.Left, + }, { + dimensions: { + x: secondWidth + spacing, + y: firstHeight + spacing, + width: thirdWidth, + height: secondHeight, + }, + sides: AlbumRectPart.Bottom | AlbumRectPart.Right, + }]; +} + +function layoutFour(params: ILayoutParams) { + const { proportions } = params; + + return proportions[0] === 'w' + ? layoutFourTopAndOther(params) + : layoutFourLeftAndOther(params); +} + +function layoutFourTopAndOther({ + maxWidth, + ratios, + spacing, + maxHeight, + minWidth, +}: ILayoutParams) { + const w = maxWidth; + const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing))); + const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3])); + const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1]))); + const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3])); + const w1 = w - w0 - w2 - 2 * spacing; + const h1 = Math.min(maxHeight - h0 - spacing, h); + + return [{ + dimensions: { + x: 0, + y: 0, + width: w, + height: h0, + }, + sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right, + }, { + dimensions: { + x: 0, + y: h0 + spacing, + width: w0, + height: h1, + }, + sides: AlbumRectPart.Bottom | AlbumRectPart.Left, + }, { + dimensions: { + x: w0 + spacing, + y: h0 + spacing, + width: w1, + height: h1, + }, + sides: AlbumRectPart.Bottom, + }, { + dimensions: { + x: w0 + spacing + w1 + spacing, + y: h0 + spacing, + width: w2, + height: h1, + }, + sides: AlbumRectPart.Right | AlbumRectPart.Bottom, + }]; +} + +function layoutFourLeftAndOther({ + maxHeight, + ratios, + maxWidth, + spacing, + minWidth, +}: ILayoutParams) { + const h = maxHeight; + const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing))); + const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3])); + const h0 = Math.round(w / ratios[1]); + const h1 = Math.round(w / ratios[2]); + const h2 = h - h0 - h1 - 2 * spacing; + const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w)); + + return [{ + dimensions: { + x: 0, + y: 0, + width: w0, + height: h, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom, + }, { + dimensions: { + x: w0 + spacing, + y: 0, + width: w1, + height: h0, + }, + sides: AlbumRectPart.Top | AlbumRectPart.Right, + }, { + dimensions: { + x: w0 + spacing, + y: h0 + spacing, + width: w1, + height: h1, + }, + sides: AlbumRectPart.Right, + }, { + dimensions: { + x: w0 + spacing, + y: h0 + h1 + 2 * spacing, + width: w1, + height: h2, + }, + sides: AlbumRectPart.Bottom | AlbumRectPart.Right, + }]; +} diff --git a/src/components/middle/message/helpers/calculateAuthorWidth.ts b/src/components/middle/message/helpers/calculateAuthorWidth.ts new file mode 100644 index 000000000..8283782c3 --- /dev/null +++ b/src/components/middle/message/helpers/calculateAuthorWidth.ts @@ -0,0 +1,17 @@ +let element: HTMLSpanElement | undefined; + +export default function calculateAuthorWidth(text: string) { + if (!element) { + element = document.createElement('span'); + element.style.font = '400 12px Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif'; + element.style.whiteSpace = 'nowrap'; + element.style.position = 'absolute'; + element.style.left = '-999px'; + element.style.opacity = '.01'; + document.body.appendChild(element); + } + + element.innerHTML = text; + + return element.offsetWidth; +} diff --git a/src/components/middle/message/helpers/copyOptions.ts b/src/components/middle/message/helpers/copyOptions.ts new file mode 100644 index 000000000..cf0e52212 --- /dev/null +++ b/src/components/middle/message/helpers/copyOptions.ts @@ -0,0 +1,84 @@ +import { ApiMediaFormat, ApiMessage } from '../../../../api/types'; + +import * as mediaLoader from '../../../../util/mediaLoader'; +import { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers'; +import { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard'; + +type ICopyOptions = { + label: string; + handler: () => void; +}[]; + +export function getMessageCopyOptions( + message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void, +): ICopyOptions { + const options: ICopyOptions = []; + const text = getMessageText(message); + const photo = getMessagePhoto(message); + const mediaHash = getMessageMediaHash(message, 'inline')!; + const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED; + const selection = window.getSelection(); + + if (canImageBeCopied) { + options.push({ + label: 'Copy Media', + handler: () => { + mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard); + + if (afterEffect) { + afterEffect(); + } + }, + }); + } + + if (text) { + // Detect if the user has selection in the current message + const hasSelection = Boolean(( + selection + && selection.anchorNode + && selection.anchorNode.parentNode + && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner') + && selection.toString().replace(/(?:\r\n|\r|\n)/g, '') !== '' + )); + + options.push({ + label: getCopyLabel(hasSelection, canImageBeCopied), + handler: () => { + const clipboardText = hasSelection && selection ? selection.toString() : text; + copyTextToClipboard(clipboardText); + + if (afterEffect) { + afterEffect(); + } + }, + }); + } + + if (onCopyLink) { + options.push({ + label: 'CopyMessageLink', + handler: () => { + onCopyLink(); + + if (afterEffect) { + afterEffect(); + } + }, + }); + } + + return options; +} + +function getCopyLabel(hasSelection: boolean, canImageBeCopied: boolean): string { + if (hasSelection) { + return 'Copy Selected Text'; + } + + if (canImageBeCopied) { + return 'Copy Text'; + } + + return 'Copy'; +} diff --git a/src/components/middle/message/helpers/getCustomAppendixBg.ts b/src/components/middle/message/helpers/getCustomAppendixBg.ts new file mode 100644 index 000000000..66b18a992 --- /dev/null +++ b/src/components/middle/message/helpers/getCustomAppendixBg.ts @@ -0,0 +1,47 @@ +// eslint-disable-next-line max-len +const SAMPLE_OWN = ''; +// eslint-disable-next-line max-len +const SAMPLE_NOT_OWN = ''; +// eslint-disable-next-line max-len +const SAMPLE_OWN_SELECTED = ''; +// eslint-disable-next-line max-len +const SAMPLE_NOT_OWN_SELECTED = ''; + +const SELECTED_APPENDIX_BACKGROUND = 'rgba(255,255,255,1)'; + +export default async (src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) => { + const color = isSelected ? SELECTED_APPENDIX_BACKGROUND : await getAppendixColorFromImage(src, isOwn); + let svg; + if (inSelectMode) { + svg = (isOwn ? SAMPLE_OWN_SELECTED : SAMPLE_NOT_OWN_SELECTED); + } else { + svg = (isOwn ? SAMPLE_OWN : SAMPLE_NOT_OWN); + } + svg = svg.replace('{FILL}', color); + return `url('data:image/svg+xml,${encodeURIComponent(svg)}')`; +}; + +async function getAppendixColorFromImage(src: string, isOwn: boolean) { + const img = new Image(); + img.src = src; + + if (!img.width) { + await new Promise((resolve) => { + img.onload = resolve; + }); + } + + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d')!; + + canvas.width = img.width; + canvas.height = img.height; + + ctx.drawImage(img, 0, 0, img.width, img.height); + + const x = isOwn ? img.width - 1 : 0; + const y = img.height - 1; + + const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data); + return `rgba(${pixel.join(',')})`; +} diff --git a/src/components/middle/message/helpers/mediaDimensions.ts b/src/components/middle/message/helpers/mediaDimensions.ts new file mode 100644 index 000000000..7b9dcc8f5 --- /dev/null +++ b/src/components/middle/message/helpers/mediaDimensions.ts @@ -0,0 +1,51 @@ +import { ApiMessage } from '../../../../api/types'; +import { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions'; +import { + getMessageText, + getMessagePhoto, + getMessageWebPagePhoto, + isForwardedMessage, + isOwnMessage, + getMessageVideo, +} from '../../../../modules/helpers'; + +const MIN_MEDIA_WIDTH = 100; +const MIN_MEDIA_WIDTH_WITH_TEXT = 175; +const MIN_MEDIA_HEIGHT = 90; +const SMALL_IMAGE_THRESHOLD = 12; + +export function getMinMediaWidth(hasText?: boolean) { + return hasText ? MIN_MEDIA_WIDTH_WITH_TEXT : MIN_MEDIA_WIDTH; +} + +export function calculateMediaDimensions(message: ApiMessage) { + const isOwn = isOwnMessage(message); + const isForwarded = isForwardedMessage(message); + const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message); + const video = getMessageVideo(message); + + const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message)); + const { width, height } = photo + ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto) + : calculateVideoDimensions(video!, isOwn, isForwarded); + + const hasText = Boolean(getMessageText(message)); + const minMediaWidth = getMinMediaWidth(hasText); + + let stretchFactor = 1; + if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) { + stretchFactor = minMediaWidth / width; + } + if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) { + stretchFactor = MIN_MEDIA_HEIGHT / height; + } + + const finalWidth = Math.round(width * stretchFactor); + const finalHeight = Math.round(height * stretchFactor); + + return { + width: finalWidth, + height: finalHeight, + isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT, + }; +} diff --git a/src/components/middle/message/hocs/withSelectControl.tsx b/src/components/middle/message/hocs/withSelectControl.tsx new file mode 100644 index 000000000..d5ba88bc3 --- /dev/null +++ b/src/components/middle/message/hocs/withSelectControl.tsx @@ -0,0 +1,97 @@ +import { MouseEvent as ReactMouseEvent } from 'react'; +import React, { + FC, + useCallback, + useMemo, + memo, +} from '../../../../lib/teact/teact'; +import { withGlobal } from '../../../../lib/teact/teactn'; + +import { OwnProps as PhotoProps } from '../Photo'; +import { OwnProps as VideoProps } from '../Video'; + +import buildClassName from '../../../../util/buildClassName'; +import { GlobalActions } from '../../../../global/types'; +import { + selectIsInSelectMode, + selectIsMessageSelected, +} from '../../../../modules/selectors'; + +import { pick } from '../../../../util/iteratees'; + +type OwnProps = PhotoProps & VideoProps; + +type StateProps = { + isInSelectMode?: boolean; + isSelected?: boolean; +}; + +type DispatchProps = Pick; + +export default function withSelectControl(WrapedComponent: FC) { + const Component: FC = (props) => { + const { + isInSelectMode, + isSelected, + message, + toggleMessageSelection, + dimensions, + } = props; + + const handleMessageSelect = useCallback((e: ReactMouseEvent) => { + e.stopPropagation(); + toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey }); + }, [toggleMessageSelection, message]); + + const newProps = useMemo(() => { + return { + ...props, + isInSelectMode, + isSelected, + dimensions: { + ...props.dimensions, + x: 0, + y: 0, + }, + onClick: isInSelectMode ? undefined : props.onClick, + }; + }, [props, isInSelectMode, isSelected]); + + return ( +
    + {isInSelectMode && ( +
    + {isSelected && ( + + )} +
    + )} + {/* eslint-disable-next-line react/jsx-props-no-spreading */} + +
    + ); + }; + + return memo(withGlobal( + (global, ownProps) => { + const { message } = ownProps; + return { + isInSelectMode: selectIsInSelectMode(global), + isSelected: selectIsMessageSelected(global, message.id), + }; + }, + (setGlobal, actions) => pick(actions, [ + 'toggleMessageSelection', + ]), + )(Component)); +} diff --git a/src/components/middle/message/hooks/useBlurredMediaThumb.ts b/src/components/middle/message/hooks/useBlurredMediaThumb.ts new file mode 100644 index 000000000..103ad0efe --- /dev/null +++ b/src/components/middle/message/hooks/useBlurredMediaThumb.ts @@ -0,0 +1,14 @@ +import { ApiMessage } from '../../../../api/types'; + +import { LAYERS_TRANSITION_DURATION } from '../../../../config'; +import { IS_MOBILE_SCREEN } from '../../../../util/environment'; +import { getMessageMediaThumbDataUri } from '../../../../modules/helpers'; +import useBlur from '../../../../hooks/useBlur'; + +export default function useBlurredMediaThumb(message: ApiMessage, fullMediaData?: string) { + return useBlur( + getMessageMediaThumbDataUri(message), + Boolean(fullMediaData), + IS_MOBILE_SCREEN ? LAYERS_TRANSITION_DURATION : undefined, + ); +} diff --git a/src/components/middle/message/hooks/useFocusMessage.ts b/src/components/middle/message/hooks/useFocusMessage.ts new file mode 100644 index 000000000..bc98b8f90 --- /dev/null +++ b/src/components/middle/message/hooks/useFocusMessage.ts @@ -0,0 +1,33 @@ +import { useLayoutEffect } from '../../../../lib/teact/teact'; +import fastSmoothScroll from '../../../../util/fastSmoothScroll'; +import { FocusDirection } from '../../../../types'; + +// This is the max scroll offset within existing viewport. +const FOCUS_MAX_OFFSET = 1500; +// This is used when the viewport was replaced. +const RELOCATED_FOCUS_OFFSET = 1000; +const FOCUS_MARGIN = 20; + +export default function useFocusMessage( + elementRef: { current: HTMLDivElement | null }, + chatId: number, + isFocused?: boolean, + focusDirection?: FocusDirection, + noFocusHighlight?: boolean, +) { + useLayoutEffect(() => { + if (isFocused && elementRef.current) { + const messagesContainer = elementRef.current.closest('.MessageList')!; + + fastSmoothScroll( + messagesContainer, + elementRef.current, + // `noFocusHighlight` always called from “scroll-to-bottom” buttons + noFocusHighlight ? 'end' : 'center', + FOCUS_MARGIN, + focusDirection === undefined ? FOCUS_MAX_OFFSET : RELOCATED_FOCUS_OFFSET, + focusDirection, + ); + } + }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]); +} diff --git a/src/components/payment/CardInput.scss b/src/components/payment/CardInput.scss new file mode 100644 index 000000000..893892db2 --- /dev/null +++ b/src/components/payment/CardInput.scss @@ -0,0 +1,18 @@ +.CardInput { + position: relative; + + .input-group.has-left-addon .form-control{ + padding-left: 4rem; + } + + .left-addon { + position: absolute; + top: .8rem; + left: 1rem; + z-index: 8; + + img { + max-width: 2rem; + } + } +} diff --git a/src/components/payment/CardInput.tsx b/src/components/payment/CardInput.tsx new file mode 100644 index 000000000..ab24b43a9 --- /dev/null +++ b/src/components/payment/CardInput.tsx @@ -0,0 +1,79 @@ +import React, { + FC, memo, useCallback, useState, useRef, useEffect, +} from '../../lib/teact/teact'; + +import useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation'; +import { formatCardNumber } from '../middle/helpers/inputFormatters'; +import { detectCardType, CardType } from '../common/helpers/detectCardType'; + +import InputText from '../ui/InputText'; + +import './CardInput.scss'; + +// @ts-ignore +import mastercardIconPath from '../../assets/mastercard.svg'; +// @ts-ignore +import visaIconPath from '../../assets/visa.svg'; + +const CARD_NUMBER_MAX_LENGTH = 23; + +export type OwnProps = { + value: string; + error?: string; + onChange: (value: string) => void; +}; + +const CardInput : FC = ({ value, error, onChange }) => { + // eslint-disable-next-line no-null/no-null + const cardNumberRef = useRef(null); + + useFocusAfterAnimation(cardNumberRef); + + const [cardType, setCardType] = useState(CardType.Default); + useEffect(() => { + const newCardType = detectCardType(value); + setCardType(newCardType); + // eslint-disable-next-line + }, []); + + const handleChange = useCallback((e) => { + const newValue = formatCardNumber(e.target.value); + const newCardType = detectCardType(e.target.value); + setCardType(newCardType); + onChange(newValue); + if (cardNumberRef.current) { + cardNumberRef.current.value = newValue; + } + }, [onChange, cardNumberRef]); + + const cardIcon = getCardIcon(cardType); + + return ( +
    + {cardIcon} + +
    + ); +}; + +export default memo(CardInput); + +function getCardIcon(cardType: CardType) { + switch (cardType) { + case CardType.Mastercard: + return ; + case CardType.Visa: + return ; + default: + return undefined; + } +} diff --git a/src/components/payment/Checkout.scss b/src/components/payment/Checkout.scss new file mode 100644 index 000000000..f02b21e61 --- /dev/null +++ b/src/components/payment/Checkout.scss @@ -0,0 +1,93 @@ +.Checkout { + padding: 0.5rem 0; + + .description { + display: flex; + flex-direction: row; + margin: 0 1rem; + + img { + height: 6rem; + margin: .5rem; + } + + .text { + h5 { + margin-top: .5rem; + font-size: 1.125rem; + } + + p { + font-size: 0.8rem; + line-height: 1rem; + color: var(--color-text-secondary); + } + } + } + + .price-info { + margin: 1rem; + + .price-info-item { + margin: 1rem .5rem; + display: flex; + flex-direction: row; + align-content: space-between; + color: var(--color-text-secondary); + font-weight: 500; + + &-main{ + color: var(--color-text); + } + + .title { + display: flex; + flex: 1 auto; + } + } + } + + .invoice-info { + border-top: 1px var(--color-borders) solid; + padding: 1rem; + + .checkout-info-item { + display: flex; + padding: .75rem .5rem 1rem; + text-align: left; + + i { + font-size: 1.5rem; + color: var(--color-text-secondary); + margin-right: 2rem; + width: 1.5rem; + } + + i.stripe-provider { + background: url('../../assets/stripe-logo.png') no-repeat center; + background-size: 2rem; + border-radius: 1rem; + height: 1.5rem; + } + + .info { + .title { + font-size: 1rem; + line-height: 1.4375rem; + margin-bottom: 0; + font-weight: 400; + word-break: break-word; + color: var(--color-text); + text-transform: capitalize; + } + + .data { + margin-bottom: 0; + font-size: 0.875rem; + color: var(--color-text-secondary); + } + } + } + } + +} \ No newline at end of file diff --git a/src/components/payment/Checkout.tsx b/src/components/payment/Checkout.tsx new file mode 100644 index 000000000..978b31a22 --- /dev/null +++ b/src/components/payment/Checkout.tsx @@ -0,0 +1,111 @@ +import React, { + FC, memo, +} from '../../lib/teact/teact'; + +import { Price } from '../../types'; + +import './Checkout.scss'; + +export type OwnProps = { + invoiceContent?: { + title?: string; + description?: string; + text?: string; + photoUrl?: string; + }; + checkoutInfo?: { + paymentMethod?: string; + paymentProvider?: string; + shippingAddress?: string; + name?: string; + phone?: string; + shippingMethod?: string; + }; + prices?: Price[]; + totalPrice?: number; + shippingPrices?: Price[]; + currency?: string; +}; + +const Checkout: FC = ({ + invoiceContent, + prices, + shippingPrices, + checkoutInfo, + currency, + totalPrice, +}) => { + // eslint-disable-next-line no-null/no-null + const { photoUrl, title, text } = (invoiceContent || {}); + const { + paymentMethod, + paymentProvider, + shippingAddress, + name, + phone, + shippingMethod, + } = (checkoutInfo || {}); + return ( +
    +
    + { photoUrl && ( + + )} +
    +
    { title }
    +

    { text }

    +
    +
    +
    + { prices && prices.map((item) => ( + renderPaymentItem(item.label, item.amount, currency, false) + )) } + { shippingPrices && shippingPrices.map((item) => ( + renderPaymentItem(item.label, item.amount, currency, false) + )) } + { totalPrice !== undefined && ( + renderPaymentItem('Total', totalPrice, currency, true) + ) } +
    +
    + {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')} + {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')} + {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')} + {name && renderCheckoutItem('icon-user', name, 'Name')} + {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')} + {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')} +
    +
    + ); +}; + +function renderPaymentItem(title: string, value: number, currency?: string, main = false) { + return ( +
    +
    + { title } +
    +
    + { `${currency || ''} ${(value / 100).toFixed(2)}` } +
    +
    + ); +} + +function renderCheckoutItem(icon: string, title: string, data: string) { + return ( +
    + +
    +
    + { title } +
    +

    + { data } +

    +
    +
    + ); +} + +export default memo(Checkout); diff --git a/src/components/payment/ExpiryInput.tsx b/src/components/payment/ExpiryInput.tsx new file mode 100644 index 000000000..f7d3e6498 --- /dev/null +++ b/src/components/payment/ExpiryInput.tsx @@ -0,0 +1,48 @@ +import React, { + FC, memo, useCallback, useRef, +} from '../../lib/teact/teact'; + +import { formatCardExpiry } from '../middle/helpers/inputFormatters'; + +import InputText from '../ui/InputText'; + +const MAX_FIELD_LENGTH = 5; + +export type OwnProps = { + value: string; + error?: string; + onChange: (value: string) => void; +}; + +const ExpiryInput : FC = ({ value, error, onChange }) => { + // eslint-disable-next-line no-null/no-null + const expiryInputRef = useRef(null); + + const handleKeyDown = useCallback((e) => { + if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') { + const newValue = value.slice(0, value.length - 1); + if (expiryInputRef.current) { + expiryInputRef.current.value = newValue; + } + } + }, [value]); + + const handleChange = useCallback((e) => { + onChange(formatCardExpiry(e.target.value)); + }, [onChange]); + + return ( + + ); +}; + +export default memo(ExpiryInput); diff --git a/src/components/payment/PaymentInfo.scss b/src/components/payment/PaymentInfo.scss new file mode 100644 index 000000000..09150c7f4 --- /dev/null +++ b/src/components/payment/PaymentInfo.scss @@ -0,0 +1,20 @@ +.PaymentInfo { + padding: 0.5rem 1rem; + + h5 { + font-size: 0.9rem; + color: var(--color-text-secondary); + margin: 1rem 0 1.1rem; + } + + .inline-inputs { + display: flex; + justify-content: space-between; + + .input-group { + flex: 1 10rem; + max-width: 45%; + display: flex; + } + } +} diff --git a/src/components/payment/PaymentInfo.tsx b/src/components/payment/PaymentInfo.tsx new file mode 100644 index 000000000..5c32920d5 --- /dev/null +++ b/src/components/payment/PaymentInfo.tsx @@ -0,0 +1,156 @@ +import React, { + FC, useCallback, memo, useRef, useEffect, +} from '../../lib/teact/teact'; + +import { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer'; +import useLang from '../../hooks/useLang'; +import { countryList } from '../../util/phoneNumber'; + +import InputText from '../ui/InputText'; +import Checkbox from '../ui/Checkbox'; +import Select from '../ui/Select'; +import ExpiryInput from './ExpiryInput'; +import CardInput from './CardInput'; + +import './PaymentInfo.scss'; + +export type OwnProps = { + state: FormState; + canSaveCredentials: boolean; + needCardholderName?: boolean; + needCountry?: boolean; + needZip?: boolean; + dispatch: FormEditDispatch; +}; + +const PaymentInfo: FC = ({ + state, + canSaveCredentials, + needCardholderName, + needCountry, + needZip, + dispatch, +}) => { + // eslint-disable-next-line no-null/no-null + const selectCountryRef = useRef(null); + + useEffect(() => { + if (selectCountryRef.current + && selectCountryRef.current.value !== state.billingCountry) { + selectCountryRef.current.value = state.billingCountry; + } + }, [state.billingCountry]); + + const handleCardNumberChange = useCallback((value) => { + dispatch({ type: 'changeCardNumber', payload: value }); + }, [dispatch]); + + const handleCardholderChange = useCallback((e) => { + dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() }); + }, [dispatch]); + + const handleExpiryChange = useCallback((value) => { + dispatch({ type: 'changeExpiryDate', payload: value }); + }, [dispatch]); + + const handleCvvChange = useCallback((e) => { + dispatch({ type: 'changeCvvCode', payload: e.target.value }); + }, [dispatch]); + + const handleCountryChange = useCallback((e) => { + dispatch({ type: 'changeBillingCountry', payload: e.target.value }); + }, [dispatch]); + + const handleBillingPostCodeChange = useCallback((e) => { + dispatch({ type: 'changeBillingZip', payload: e.target.value }); + }, [dispatch]); + + const handleChangeSaveCredentials = useCallback((e) => { + dispatch({ type: 'changeSaveCredentials', payload: e.target.value }); + }, [dispatch]); + + const lang = useLang(); + + const { formErrors = {} } = state; + + return ( +
    +
    +
    {lang('PaymentCardTitle')}
    + + { needCardholderName && ( + + )} +
    + + +
    + { needCountry || needZip ? ( +
    {lang('PaymentBillingAddress')}
    + ) : undefined } + { needCountry && ( + + ) } + { needZip && ( + + )} + { canSaveCredentials && ( + + ) } + +
    + ); +}; + +export default memo(PaymentInfo); diff --git a/src/components/payment/PaymentModal.async.tsx b/src/components/payment/PaymentModal.async.tsx new file mode 100644 index 000000000..1e8ab47df --- /dev/null +++ b/src/components/payment/PaymentModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './PaymentModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const PaymentModalAsync: FC = (props) => { + const { isOpen } = props; + const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return PaymentModal ? : undefined; +}; + +export default PaymentModalAsync; diff --git a/src/components/payment/PaymentModal.scss b/src/components/payment/PaymentModal.scss new file mode 100644 index 000000000..29ba22ce2 --- /dev/null +++ b/src/components/payment/PaymentModal.scss @@ -0,0 +1,86 @@ +.PaymentModal { + .modal-backdrop { + pointer-events: none; + } + + .header { + position: relative; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + width: 100%; + padding: .25rem 1rem; + display: flex; + align-items: center; + flex-direction: row; + background: white; + border-bottom: 1px var(--color-borders) solid; + + h3 { + margin-bottom: 0; + margin-left: 1.5rem; + } + } + + .Transition { + height: 25rem; + } + + .empty-content { + height: 25rem; + max-height: 90%; + display: flex; + align-items: center; + justify-content: center; + } + + .receipt-content { + height: 25rem; + overflow-y: auto; + } + + .content { + overflow: auto; + width: 100%; + height: 100%; + position: relative; + } + + .footer { + position: relative; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + width: 100%; + padding: .75rem 1rem; + background: white; + border-top: 1px var(--color-borders) solid; + + button { + text-transform: none; + font-weight: 500; + } + } + + .modal-dialog { + width: 25rem; + } + + .modal-content { + padding:0; + overflow: hidden; + } +} + +@media screen + and (max-device-width: 640px) + and (max-height: 640px) + and (orientation: landscape) { + .PaymentModal { + .modal-dialog { + max-height: 100%; + } + + .Transition { + height: 10rem; + } + } +} diff --git a/src/components/payment/PaymentModal.tsx b/src/components/payment/PaymentModal.tsx new file mode 100644 index 000000000..1250daa36 --- /dev/null +++ b/src/components/payment/PaymentModal.tsx @@ -0,0 +1,515 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions, GlobalState } from '../../global/types'; +import { PaymentStep, ShippingOption, Price } from '../../types'; +import { ApiError } from '../../api/types'; + +import { pick } from '../../util/iteratees'; +import { getCurrencySign } from '../middle/helpers/getCurrencySign'; +import { detectCardTypeText } from '../common/helpers/detectCardType'; +import { getShippingError } from '../../modules/helpers/payments'; +import usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer'; +import useLang from '../../hooks/useLang'; + +import ShippingInfo from './ShippingInfo'; +import Shipping from './Shipping'; +import Checkout from './Checkout'; +import PaymentInfo from './PaymentInfo'; +import Button from '../ui/Button'; +import Modal from '../ui/Modal'; +import Transition from '../ui/Transition'; +import Spinner from '../ui/Spinner'; + +import './PaymentModal.scss'; + +const DEFAULT_PROVIDER = 'stripe'; + +export type OwnProps = { + isOpen: boolean; + onClose: () => void; +}; + +type StateProps = { + nameRequested?: boolean; + shippingAddressRequested?: boolean; + phoneRequested?: boolean; + emailRequested?: boolean; + flexible?: boolean; + phoneToProvider?: boolean; + emailToProvider?: boolean; + currency?: string; + prices?: Price[]; + isProviderError: boolean; + needCardholderName?: boolean; + needCountry?: boolean; + needZip?: boolean; + globalErrors?: ApiError[]; +}; + +type GlobalStateProps = Pick; + +type DispatchProps = Pick; + +const Invoice: FC = ({ + isOpen, + onClose, + step, + shippingOptions, + savedInfo, + canSaveCredentials, + nameRequested, + shippingAddressRequested, + phoneRequested, + emailRequested, + phoneToProvider, + emailToProvider, + currency, + passwordMissing, + isProviderError, + invoiceContent, + nativeProvider, + prices, + needCardholderName, + needCountry, + needZip, + error, + globalErrors, + validateRequestedInfo, + sendPaymentForm, + setPaymentStep, + sendCredentialsInfo, + clearPaymentError, +}) => { + const [paymentState, paymentDispatch] = usePaymentReducer(); + const currencySign = getCurrencySign(currency); + const [isLoading, setIsLoading] = useState(false); + const lang = useLang(); + + useEffect(() => { + if (step || error || globalErrors) { + setIsLoading(false); + } + }, [step, error, globalErrors]); + + useEffect(() => { + if (error && error.field) { + paymentDispatch({ + type: 'setFormErrors', + payload: { + [error.field]: error.fieldError, + }, + }); + return; + } + if (globalErrors && globalErrors.length) { + const errors = getShippingError(globalErrors); + paymentDispatch({ + type: 'setFormErrors', + payload: { + ...errors, + }, + }); + } + }, [error, globalErrors, paymentDispatch]); + + useEffect(() => { + if (savedInfo) { + const { + name: fullName, phone, email, shippingAddress, + } = savedInfo; + paymentDispatch({ + type: 'updateUserInfo', + payload: { + fullName, + phone: phone && phone.charAt(0) !== '+' + ? `+${phone}` + : phone, + email, + ...(shippingAddress || {}), + }, + }); + } + }, [savedInfo, paymentDispatch]); + + const handleErrorModalClose = useCallback(() => { + clearPaymentError(); + }, [clearPaymentError]); + + const totalPrice = useMemo(() => { + if (step !== PaymentStep.Checkout) { + return 0; + } + + return getTotalPrice(prices, shippingOptions, paymentState.shipping); + }, [step, paymentState.shipping, prices, shippingOptions]); + + const checkoutInfo = useMemo(() => { + if (step !== PaymentStep.Checkout) { + return undefined; + } + return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || ''); + }, [step, paymentState, shippingOptions, nativeProvider]); + + function renderError() { + if (!error) { + return undefined; + } + return ( + +

    {error.description || 'Error'}

    + {error.description || 'Error'} + +
    + ); + } + + function renderModalContent(cuurentStep: PaymentStep) { + switch (cuurentStep) { + case PaymentStep.ShippingInfo: + return ( + + ); + case PaymentStep.Shipping: + return ( + + ); + case PaymentStep.PaymentInfo: + return ( + + ); + case PaymentStep.Checkout: + return ( + + ); + default: + return undefined; + } + } + + const validateRequest = useCallback(() => { + const { saveInfo } = paymentState; + const requestInfo = getRequestInfo(paymentState); + validateRequestedInfo({ requestInfo, saveInfo }); + }, [validateRequestedInfo, paymentState]); + + const sendCredentials = useCallback(() => { + const credentials = getCredentials(paymentState); + sendCredentialsInfo({ + credentials, + }); + }, [sendCredentialsInfo, paymentState]); + + const sendForm = useCallback(() => { + sendPaymentForm({ + shippingOptionId: paymentState.shipping, + saveCredentials: paymentState.saveCredentials, + }); + }, [sendPaymentForm, paymentState]); + + const setStep = useCallback((nextStep) => { + setPaymentStep({ step: nextStep }); + }, [setPaymentStep]); + + const handleButtonClick = useCallback(() => { + setIsLoading(true); + switch (step) { + case PaymentStep.ShippingInfo: + return validateRequest(); + case PaymentStep.Shipping: + return setStep(PaymentStep.PaymentInfo); + case PaymentStep.PaymentInfo: + return sendCredentials(); + case PaymentStep.Checkout: + return sendForm(); + default: + return () => {}; + } + }, [step, validateRequest, setStep, sendCredentials, sendForm]); + + const modalHeader = useMemo(() => { + switch (step) { + case PaymentStep.ShippingInfo: + return lang('PaymentShippingInfo'); + case PaymentStep.Shipping: + return lang('PaymentShippingMethod'); + case PaymentStep.PaymentInfo: + return lang('PaymentCardInfo'); + case PaymentStep.Checkout: + return lang('PaymentCheckout'); + default: + return ''; + } + }, [step, lang]); + + const buttonText = useMemo(() => { + switch (step) { + case PaymentStep.Checkout: + return `Pay ${currencySign}${(totalPrice / 100).toFixed(2)}`; + default: + return 'Next Step'; + } + }, [step, totalPrice, currencySign]); + + if (isProviderError) { + return ( + + Sorry, Telegram T doesn't support payments with this provider yet. + Please use one of our mobile apps to do this. + + + ); + } + + return ( + +
    + +

    { modalHeader }

    +
    + {step !== undefined ? ( + + {() => ( +
    + {renderModalContent(step)} +
    + )} +
    + ) : ( +
    + +
    + )} +
    + +
    + {error && !error.field && renderError()} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps & GlobalStateProps => { + const { + step, + shippingOptions, + savedInfo, + canSaveCredentials, + invoice, + invoiceContent, + nativeProvider, + nativeParams, + passwordMissing, + error, + } = global.payment; + + const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER)); + const { needCardholderName, needCountry, needZip } = (nativeParams || {}); + const { + nameRequested, + phoneRequested, + emailRequested, + shippingAddressRequested, + flexible, + phoneToProvider, + emailToProvider, + currency, + prices, + } = (invoice || {}); + + return { + step, + shippingOptions, + savedInfo, + canSaveCredentials, + nativeProvider, + passwordMissing, + nameRequested, + shippingAddressRequested, + phoneRequested, + emailRequested, + flexible, + phoneToProvider, + emailToProvider, + currency, + prices, + isProviderError, + invoiceContent, + needCardholderName, + needCountry, + needZip, + error, + globalErrors: global.errors, + }; + }, + (setGlobal, actions): DispatchProps => { + return pick(actions, [ + 'validateRequestedInfo', + 'sendPaymentForm', + 'setPaymentStep', + 'sendCredentialsInfo', + 'clearPaymentError', + ]); + }, +)(Invoice)); + +function findShippingOption(shippingOptions: ShippingOption[], optionId: string) { + return shippingOptions.find(({ id }) => id === optionId); +} + +function getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) { + const option = findShippingOption(shippingOptions, shippingOption); + return option ? option.prices : undefined; +} + +function getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) { + const shippingPrices = shippingOptions + ? getShippingPrices(shippingOptions, shippingOption) + : []; + let total = 0; + const totalPrices = prices.concat(shippingPrices || []); + total = totalPrices.reduce((acc, cur) => { + return acc + cur.amount; + }, total); + return total; +} + +function getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) { + const cardTypeText = detectCardTypeText(state.cardNumber); + const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`; + const shippingAddress = state.streetLine1 + ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}` + : undefined; + const { phone, fullName: name } = state; + const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined; + const shippingMethod = shippingOption ? shippingOption.title : undefined; + return { + paymentMethod, + paymentProvider, + shippingAddress, + name, + phone, + shippingMethod, + }; +} + +function getRequestInfo(paymentState: FormState) { + const { + streetLine1, + streetLine2, + city, + state, + countryIso2, + postCode, + fullName: name, + phone, + email, + } = paymentState; + + const shippingAddress = { + streetLine1, + streetLine2, + city, + state, + countryIso2, + postCode, + }; + + return { + name, + phone, + email, + shippingAddress, + }; +} + +function getCredentials(paymentState: FormState) { + const { + cardNumber, cardholder, expiry, cvv, billingCountry, billingZip, + } = paymentState; + const [expiryMonth, expiryYear] = expiry.split('/'); + const data = { + cardNumber, + cardholder, + expiryMonth, + expiryYear, + cvv, + country: billingCountry, + zip: billingZip, + }; + + return { + data, + }; +} diff --git a/src/components/payment/ReceiptModal.async.tsx b/src/components/payment/ReceiptModal.async.tsx new file mode 100644 index 000000000..1d23ee87d --- /dev/null +++ b/src/components/payment/ReceiptModal.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './ReceiptModal'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; + +const ReceiptModalAsync: FC = (props) => { + const { isOpen } = props; + const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ReceiptModal ? : undefined; +}; + +export default ReceiptModalAsync; diff --git a/src/components/payment/ReceiptModal.tsx b/src/components/payment/ReceiptModal.tsx new file mode 100644 index 000000000..44f79afe9 --- /dev/null +++ b/src/components/payment/ReceiptModal.tsx @@ -0,0 +1,152 @@ +import React, { + FC, memo, useMemo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { Price } from '../../types'; +import { ApiShippingAddress } from '../../api/types/payments'; + +import useLang from '../../hooks/useLang'; +import { getCurrencySign } from '../middle/helpers/getCurrencySign'; + +import Checkout from './Checkout'; +import Modal from '../ui/Modal'; +import Button from '../ui/Button'; + +import './PaymentModal.scss'; + +export type OwnProps = { + isOpen: boolean; + onClose: () => void; +}; + +type StateProps = { + prices?: Price[]; + shippingPrices: any; + totalAmount?: number; + currency?: string; + info?: { + shippingAddress?: ApiShippingAddress; + phone?: string; + name?: string; + }; + photoUrl?: string; + text?: string; + title?: string; + credentialsTitle?: string; + shippingMethod?: string; +}; + +const ReceiptModal: FC = ({ + isOpen, + onClose, + prices, + shippingPrices, + totalAmount, + currency, + info, + photoUrl, + text, + title, + credentialsTitle, + shippingMethod, +}) => { + const lang = useLang(); + const currencySign = getCurrencySign(currency); + const checkoutInfo = useMemo(() => { + return getCheckoutInfo(credentialsTitle, info, shippingMethod); + }, [info, shippingMethod, credentialsTitle]); + return ( + +
    +
    + +

    {lang('PaymentReceipt')}

    +
    +
    + +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { receipt } = global.payment; + const { + currency, + prices: mapedPrices, + info, + totalAmount, + credentialsTitle, + shippingPrices, + shippingMethod, + photoUrl, + text, + title, + } = (receipt || {}); + + return { + currency, + prices: mapedPrices, + info, + totalAmount, + credentialsTitle, + shippingPrices, + shippingMethod, + photoUrl, + text, + title, + }; + }, +)(ReceiptModal)); + +function getCheckoutInfo(paymentMethod?: string, + info?: + { phone?: string; + name?: string; + shippingAddress?: ApiShippingAddress; + }, + shippingMethod?: string) { + if (!info) { + return { paymentMethod }; + } + const { shippingAddress } = info; + const fullAddress = shippingAddress && shippingAddress.streetLine1 + ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}` + : undefined; + const { phone, name } = info; + return { + paymentMethod, + paymentProvider: 'Stripe', + shippingAddress: fullAddress, + name, + phone, + shippingMethod, + }; +} diff --git a/src/components/payment/Shipping.scss b/src/components/payment/Shipping.scss new file mode 100644 index 000000000..896b7a031 --- /dev/null +++ b/src/components/payment/Shipping.scss @@ -0,0 +1,15 @@ +.Shipping { + padding: 0.5rem 1rem; + + form { + p { + color: var(--color-text-secondary); + font-weight: 500; + margin: .5rem 0 2rem; + } + + .Radio { + margin-bottom: 2rem; + } + } +} \ No newline at end of file diff --git a/src/components/payment/Shipping.tsx b/src/components/payment/Shipping.tsx new file mode 100644 index 000000000..e1477f8a7 --- /dev/null +++ b/src/components/payment/Shipping.tsx @@ -0,0 +1,58 @@ +import React, { + FC, useCallback, memo, useMemo, useEffect, +} from '../../lib/teact/teact'; + +import { ShippingOption } from '../../types/index'; + +import { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer'; + +import RadioGroup from '../ui/RadioGroup'; + +import './Shipping.scss'; + +export type OwnProps = { + state: FormState; + shippingOptions: ShippingOption[]; + currency: string; + dispatch: FormEditDispatch; +}; + +const Shipping: FC = ({ + state, + shippingOptions, + currency, + dispatch, +}) => { + useEffect(() => { + if (!shippingOptions || state.shipping) { + return; + } + dispatch({ type: 'changeShipping', payload: shippingOptions[0].id }); + }, [shippingOptions, state.shipping, dispatch]); + + const handleShippingSelect = useCallback((value) => { + dispatch({ type: 'changeShipping', payload: value }); + }, [dispatch]); + + const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({ + label, + subLabel: `${currency} ${String(amount / 100)}`, + value, + }))), [shippingOptions, currency]); + + return ( +
    +
    +

    Select shipping method

    + + +
    + ); +}; + +export default memo(Shipping); diff --git a/src/components/payment/ShippingInfo.scss b/src/components/payment/ShippingInfo.scss new file mode 100644 index 000000000..c8420cae0 --- /dev/null +++ b/src/components/payment/ShippingInfo.scss @@ -0,0 +1,9 @@ +.ShippingInfo { + padding: 0.5rem 1rem; + + h5 { + font-size: 0.9rem; + color: var(--color-text-secondary); + margin: 1rem 0 1.1rem; + } +} \ No newline at end of file diff --git a/src/components/payment/ShippingInfo.tsx b/src/components/payment/ShippingInfo.tsx new file mode 100644 index 000000000..cebe0531b --- /dev/null +++ b/src/components/payment/ShippingInfo.tsx @@ -0,0 +1,203 @@ +import React, { + FC, useRef, useCallback, useEffect, memo, +} from '../../lib/teact/teact'; + +import { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer'; +import useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation'; +import useLang from '../../hooks/useLang'; +import { countryList } from '../../util/phoneNumber'; + +import InputText from '../ui/InputText'; +import Select from '../ui/Select'; +import Checkbox from '../ui/Checkbox'; + +import './ShippingInfo.scss'; + +export type OwnProps = { + state: FormState; + needEmail: boolean; + needPhone: boolean; + needName: boolean; + needAddress: boolean; + dispatch: FormEditDispatch; +}; + +const ShippingInfo: FC = ({ + state, + needEmail, + needPhone, + needName, + needAddress, + dispatch, +}) => { + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const phoneRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const selectCountryRef = useRef(null); + + useEffect(() => { + if (selectCountryRef.current + && selectCountryRef.current.value !== state.countryIso2) { + selectCountryRef.current.value = state.countryIso2; + } + }, [state.countryIso2]); + + const lang = useLang(); + + useFocusAfterAnimation(inputRef); + + const handleAddress1Change = useCallback((e) => { + dispatch({ type: 'changeAddress1', payload: e.target.value }); + }, [dispatch]); + + const handleAddress2Change = useCallback((e) => { + dispatch({ type: 'changeAddress2', payload: e.target.value }); + }, [dispatch]); + + const handleCityChange = useCallback((e) => { + dispatch({ type: 'changeCity', payload: e.target.value }); + }, [dispatch]); + + const handleStateChange = useCallback((e) => { + dispatch({ type: 'changeState', payload: e.target.value }); + }, [dispatch]); + + const handleCountryChange = useCallback((e) => { + dispatch({ type: 'changeCountry', payload: e.target.value }); + }, [dispatch]); + + const handlePostCodeChange = useCallback((e) => { + dispatch({ type: 'changePostCode', payload: e.target.value }); + }, [dispatch]); + + const handleFullNameChange = useCallback((e) => { + dispatch({ type: 'changeFullName', payload: e.target.value }); + }, [dispatch]); + + const handleEmailChange = useCallback((e) => { + dispatch({ type: 'changeEmail', payload: e.target.value }); + }, [dispatch]); + + const handlePhoneChange = useCallback((e) => { + let { value } = e.target; + value = `+${value.replace(/\D/g, '')}`; + if (phoneRef.current) { + phoneRef.current.value = value; + } + dispatch({ type: 'changePhone', payload: value }); + }, [dispatch]); + + const handleSaveInfoChange = useCallback((e) => { + dispatch({ type: 'changeSaveInfo', payload: e.target.value }); + }, [dispatch]); + + const { formErrors } = state; + return ( +
    +
    + {needAddress ? ( +
    +
    {lang('PaymentShippingAddress')}
    + + + + + + + +
    + ) : undefined} + { needName || needEmail || needPhone ? ( +
    {lang('PaymentShippingReceiver')}
    + ) : undefined } + { needName && ( + + ) } + { needEmail && ( + + ) } + { needPhone && ( + + ) } + + +
    + ); +}; + +export default memo(ShippingInfo); diff --git a/src/components/right/ChatExtra.tsx b/src/components/right/ChatExtra.tsx new file mode 100644 index 000000000..c30a26cb7 --- /dev/null +++ b/src/components/right/ChatExtra.tsx @@ -0,0 +1,62 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiChat } from '../../api/types'; + +import { selectChat } from '../../modules/selectors'; +import { getChatDescription, getChatLink } from '../../modules/helpers'; +import renderText from '../common/helpers/renderText'; +import useLang from '../../hooks/useLang'; + +import SafeLink from '../common/SafeLink'; + +type OwnProps = { + chatId: number; +}; + +type StateProps = { + chat?: ApiChat; +}; + +const ChatExtra: FC = ({ chat }) => { + const lang = useLang(); + + if (!chat || chat.isRestricted) { + return undefined; + } + + const description = getChatDescription(chat); + const link = getChatLink(chat); + const url = link.indexOf('http') === 0 ? link : `http://${link}`; + + return ( +
    + {description && !!description.length && ( +
    + +
    +

    {renderText(description, ['br', 'links'])}

    +

    {lang('Info')}

    +
    +
    + )} + {!!link.length && ( +
    + +
    + +

    {lang('SetUrlPlaceholder')}

    +
    +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + + return { chat }; + }, +)(ChatExtra)); diff --git a/src/components/right/GifSearch.async.tsx b/src/components/right/GifSearch.async.tsx new file mode 100644 index 000000000..ce001e685 --- /dev/null +++ b/src/components/right/GifSearch.async.tsx @@ -0,0 +1,14 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const GifSearchAsync: FC = () => { + const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return GifSearch ? : ; +}; + +export default GifSearchAsync; diff --git a/src/components/right/GifSearch.scss b/src/components/right/GifSearch.scss new file mode 100644 index 000000000..955396831 --- /dev/null +++ b/src/components/right/GifSearch.scss @@ -0,0 +1,23 @@ +.GifSearch { + height: 100%; + padding: 0.25rem; + + .gif-container { + height: 100%; + overflow: auto; + + &.grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + grid-auto-rows: 6.25rem; + grid-gap: 0.25rem; + grid-auto-flow: dense; + } + } + + .helper-text { + color: var(--color-text-meta); + margin-top: 2rem; + text-align: center; + } +} diff --git a/src/components/right/GifSearch.tsx b/src/components/right/GifSearch.tsx new file mode 100644 index 000000000..e047419c4 --- /dev/null +++ b/src/components/right/GifSearch.tsx @@ -0,0 +1,133 @@ +import React, { + FC, memo, useRef, useCallback, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ApiChat, ApiVideo } from '../../api/types'; + +import { IS_TOUCH_ENV } from '../../util/environment'; +import { + selectCurrentGifSearch, + selectChat, + selectIsChatWithBot, + selectCurrentMessageList, +} from '../../modules/selectors'; +import { getAllowedAttachmentOptions } from '../../modules/helpers'; +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; +import { useIntersectionObserver } from '../../hooks/useIntersectionObserver'; +import useLang from '../../hooks/useLang'; + +import InfiniteScroll from '../ui/InfiniteScroll'; +import GifButton from '../common/GifButton'; +import Loading from '../ui/Loading'; + +import './GifSearch.scss'; + +type StateProps = { + query?: string; + results?: ApiVideo[]; + chat?: ApiChat; + isChatWithBot?: boolean; +}; + +type DispatchProps = Pick; + +const PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24 +const INTERSECTION_DEBOUNCE = 300; + +const GifSearch: FC = ({ + query, + results, + chat, + isChatWithBot, + searchMoreGifs, + sendMessage, + setGifSearchQuery, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const { + observe: observeIntersection, + } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE }); + + const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot); + + const handleGifClick = useCallback((gif: ApiVideo) => { + if (canSendGifs) { + sendMessage({ gif }); + } + + if (IS_TOUCH_ENV) { + setGifSearchQuery({ query: undefined }); + } + }, [canSendGifs, sendMessage, setGifSearchQuery]); + + const lang = useLang(); + + function renderContent() { + if (query === undefined) { + return undefined; + } + + if (!results) { + return ( + + ); + } + + if (!results.length) { + return ( +

    {lang('NoGIFsFound')}

    + ); + } + + return results.map((gif) => ( + + )); + } + + const hasResults = Boolean(query !== undefined && results && results.length); + + return ( +
    + + {renderContent()} + + +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const currentSearch = selectCurrentGifSearch(global); + const { query, results } = currentSearch || {}; + const { chatId } = selectCurrentMessageList(global) || {}; + const chat = chatId ? selectChat(global, chatId) : undefined; + const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined; + + return { + query, + results, + chat, + isChatWithBot, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']), +)(GifSearch)); diff --git a/src/components/right/PollAnswerResults.scss b/src/components/right/PollAnswerResults.scss new file mode 100644 index 000000000..958e7acc6 --- /dev/null +++ b/src/components/right/PollAnswerResults.scss @@ -0,0 +1,56 @@ +.PollAnswerResults { + border-bottom: 1px solid var(--color-borders); + padding: 0 .5rem .625rem; + display: flex; + flex-direction: column-reverse; + + .answer-head { + display: flex; + align-items: center; + font-size: .9375rem; + line-height: 1.3125rem; + font-weight: 500; + color: var(--color-text-secondary); + padding: 1rem .75rem .5rem 1rem; + position: sticky; + top: 0; + background: #fff; + + @media (max-width: 600px) { + padding: .5rem .25rem .5rem .5rem; + } + } + + .answer-percent { + margin-left: auto; + } + + .poll-voters { + padding: 0 .75rem; + position: relative; + min-height: 3rem; + + @media (max-width: 600px) { + padding: 0 .25rem; + } + + .Spinner { + --spinner-size: 1.25rem; + } + } + + .chat-item-clickable .ChatInfo .Avatar.size-tiny { + margin-right: 1.75rem; + } + + .ShowMoreButton { + margin: .25rem 0 0 -0.5rem; + width: calc(100% + 1rem); + } + + .icon-down { + vertical-align: middle; + margin-right: 2rem; + font-size: 1.5rem; + } +} diff --git a/src/components/right/PollAnswerResults.tsx b/src/components/right/PollAnswerResults.tsx new file mode 100644 index 000000000..29fef2e7d --- /dev/null +++ b/src/components/right/PollAnswerResults.tsx @@ -0,0 +1,140 @@ +import React, { + FC, useCallback, useState, memo, useEffect, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { + ApiChat, + ApiMessage, + ApiPollAnswer, + ApiPollResult, +} from '../../api/types'; +import { GlobalActions } from '../../global/types'; +import { pick } from '../../util/iteratees'; +import usePrevious from '../../hooks/usePrevious'; + +import ShowMoreButton from '../ui/ShowMoreButton'; +import Loading from '../ui/Loading'; +import ListItem from '../ui/ListItem'; +import PrivateChatInfo from '../common/PrivateChatInfo'; + +import './PollAnswerResults.scss'; + +type OwnProps = { + chat: ApiChat; + message: ApiMessage; + answer: ApiPollAnswer; + answerVote: ApiPollResult; + totalVoters: number; +}; + +type StateProps = { + voters?: number[]; + offset: string; +}; + +type DispatchProps = Pick; + +const INITIAL_LIMIT = 4; +const VIEW_MORE_LIMIT = 50; + +const PollAnswerResults: FC = ({ + chat, + message, + answer, + answerVote, + totalVoters, + voters, + offset, + loadPollOptionResults, + openChat, + closePollResults, +}) => { + const prevVotersCount = usePrevious(answerVote.votersCount); + const [isLoading, setIsLoading] = useState(true); + const areVotersLoaded = Boolean(voters); + const { option, text } = answer; + + useEffect(() => { + // For update when new votes arrive or when the user takes back his vote + if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) { + loadPollOptionResults({ + chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true, + }); + } + // eslint-disable-next-line + }, [answerVote.votersCount, areVotersLoaded]); + + const handleViewMoreClick = useCallback(() => { + setIsLoading(true); + loadPollOptionResults({ + chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT, + }); + }, [chat, loadPollOptionResults, message.id, offset, option]); + + useEffect(() => { + setIsLoading(false); + }, [voters]); + + const handleMemberClick = useCallback((id: number) => { + openChat({ id }); + closePollResults(); + }, [closePollResults, openChat]); + + function renderViewMoreButton() { + const leftVotersCount = answerVote.votersCount - voters!.length; + + return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && ( + + ); + } + + return ( +
    +
    + {voters + ? voters.map((id) => ( + handleMemberClick(id)} + > + + + )) + : } + {voters && renderViewMoreButton()} +
    +
    + {text} + {getPercentage(answerVote.votersCount, totalVoters)}% +
    +
    + ); +}; + +function getPercentage(value: number, total: number) { + return total > 0 ? ((value / total) * 100).toFixed() : 0; +} + +export default memo(withGlobal( + (global, { answer }: OwnProps): StateProps => { + const { voters, offsets } = global.pollResults; + + return { + voters: voters && voters[answer.option], + offset: (offsets && offsets[answer.option]) || '', + }; + }, + (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']), +)(PollAnswerResults)); diff --git a/src/components/right/PollResults.async.tsx b/src/components/right/PollResults.async.tsx new file mode 100644 index 000000000..3191763ab --- /dev/null +++ b/src/components/right/PollResults.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const PollResultsAsync: FC = () => { + const PollResults = useModuleLoader(Bundles.Extra, 'PollResults'); + + return PollResults ? : ; +}; + +export default PollResultsAsync; diff --git a/src/components/right/PollResults.scss b/src/components/right/PollResults.scss new file mode 100644 index 000000000..28ee7b29d --- /dev/null +++ b/src/components/right/PollResults.scss @@ -0,0 +1,32 @@ +.PollResults { + height: 100%; + position: relative; + display: flex; + flex-direction: column; + pointer-events: auto; + + > .Loading { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: rgba(white, 0.75); + } + + .poll-question { + padding: .75rem 1.5rem; + flex-shrink: 0; + font-size: 1.25rem; + + @media (max-width: 600px) { + padding: 0 1rem; + } + } + + .poll-results-list { + border-top: 1px solid var(--color-borders); + flex-grow: 1; + overflow: auto; + } +} diff --git a/src/components/right/PollResults.tsx b/src/components/right/PollResults.tsx new file mode 100644 index 000000000..b747b4f62 --- /dev/null +++ b/src/components/right/PollResults.tsx @@ -0,0 +1,76 @@ +import React, { FC, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiMessage, ApiChat } from '../../api/types'; +import { selectChat, selectChatMessage } from '../../modules/selectors'; +import { buildCollectionByKey } from '../../util/iteratees'; +import { getMessagePoll } from '../../modules/helpers'; + +import PollAnswerResults from './PollAnswerResults'; +import Loading from '../ui/Loading'; + +import './PollResults.scss'; + +type StateProps = { + chat?: ApiChat; + message?: ApiMessage; + lastSyncTime?: number; +}; + +const PollResults: FC = ({ + chat, + message, + lastSyncTime, +}) => { + if (!message || !chat) { + return ; + } + + const { summary, results } = getMessagePoll(message)!; + if (!results.results) { + return undefined; + } + + const resultsByOption = buildCollectionByKey(results.results, 'option'); + + return ( +
    +

    {summary.question}

    +
    + {lastSyncTime && summary.answers.map((answer) => ( + + ))} + {!lastSyncTime && } +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + pollResults: { chatId, messageId }, + lastSyncTime, + } = global; + + if (!chatId || !messageId) { + return {}; + } + + const chat = selectChat(global, chatId); + const message = selectChatMessage(global, chatId, messageId); + + return { + chat, + message, + lastSyncTime, + }; + }, +)(PollResults)); diff --git a/src/components/right/Profile.scss b/src/components/right/Profile.scss new file mode 100644 index 000000000..b44ac9b42 --- /dev/null +++ b/src/components/right/Profile.scss @@ -0,0 +1,133 @@ +.Profile { + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + + > .profile-info > .ChatInfo { + grid-area: chat_info; + + .status.online { + color: var(--color-primary); + } + } + + > .profile-info >.ChatExtra { + padding: 0 1.5rem; + + .item { + display: flex; + padding: .75rem 0 1rem; + text-align: left; + + i { + font-size: 1.5rem; + color: var(--color-text-secondary); + margin-right: 2rem; + } + + .title { + font-size: 1rem; + line-height: 1.4375rem; + margin-bottom: 0; + font-weight: 400; + word-break: break-word; + } + + a.title { + color: var(--color-text); + } + + .subtitle { + margin-bottom: 0; + font-size: 0.875rem; + color: var(--color-text-secondary); + } + } + } +} + +.shared-media { + display: flex; + flex-direction: column-reverse; + + .TabList { + background: #fff; + top: -1px; + .Tab { + padding: .6875rem .25rem; + i { + padding-right: 1.5rem; + margin-left: -.75rem; + } + } + } + + .Transition { + flex: 1; + } + + .content { + &.empty-list { + height: 100%; + padding-top: 5rem; + display: flex; + align-items: flex-start; + justify-content: center; + + .Spinner { + --spinner-size: 2.75rem; + } + } + + &.media-list { + display: grid; + padding: .5rem; + grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 1fr; + grid-gap: .25rem; + } + + &.documents-list { + padding: 1.25rem; + + & .File + .File { + margin-top: 1.25rem; + } + } + + &.links-list { + padding: 1.25rem; + + .ProgressSpinner, + .message-upload-progress { + display: none; + } + } + + &.audio-list { + padding: 1.25rem; + + & .Audio { + .media-loading { + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + } + + & + .Audio { + margin-top: 1.6875rem; + } + } + } + + &.members-list { + padding: 0.5rem 1rem; + + @media (max-width: 600px) { + padding: .5rem 0; + } + } + } +} diff --git a/src/components/right/Profile.tsx b/src/components/right/Profile.tsx new file mode 100644 index 000000000..63cb0b1b2 --- /dev/null +++ b/src/components/right/Profile.tsx @@ -0,0 +1,412 @@ +import React, { + FC, useCallback, useEffect, useMemo, useRef, useState, memo, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { + ApiMessage, + ApiChatMember, + ApiUser, + MAIN_THREAD_ID, +} from '../../api/types'; +import { GlobalActions } from '../../global/types'; +import { + MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType, +} from '../../types'; + +import { SHARED_MEDIA_SLICE, SLIDE_TRANSITION_DURATION } from '../../config'; +import { IS_TOUCH_ENV } from '../../util/environment'; +import { + isChatAdmin, isChatChannel, isChatGroup, isChatPrivate, +} from '../../modules/helpers'; +import { + selectChatMessages, + selectChat, + selectCurrentMediaSearch, + selectIsRightColumnShown, +} from '../../modules/selectors'; +import { pick } from '../../util/iteratees'; +import { captureEvents, SwipeDirection } from '../../util/captureEvents'; +import useCacheBuster from '../../hooks/useCacheBuster'; +import useProfileViewportIds from './hooks/useProfileViewportIds'; +import useProfileState from './hooks/useProfileState'; +import useTransitionFixes from './hooks/useTransitionFixes'; +import useAsyncRendering from './hooks/useAsyncRendering'; + +import Transition from '../ui/Transition'; +import InfiniteScroll from '../ui/InfiniteScroll'; +import TabList from '../ui/TabList'; +import Spinner from '../ui/Spinner'; +import ListItem from '../ui/ListItem'; +import PrivateChatInfo from '../common/PrivateChatInfo'; +import GroupChatInfo from '../common/GroupChatInfo'; +import Document from '../common/Document'; +import Audio from '../common/Audio'; +import UserExtra from './UserExtra'; +import GroupExtra from './ChatExtra'; +import Media from '../common/Media'; +import WebLink from '../common/WebLink'; +import NothingFound from '../common/NothingFound'; + +import './Profile.scss'; + +type OwnProps = { + chatId: number; + userId?: number; + profileState: ProfileState; + onProfileStateChange: (state: ProfileState) => void; +}; + +type StateProps = { + isChannel?: boolean; + resolvedUserId?: number; + chatMessages?: Record; + foundIds?: number[]; + mediaSearchType?: SharedMediaType; + hasMembersTab?: boolean; + areMembersHidden?: boolean; + members?: ApiChatMember[]; + usersById?: Record; + isRightColumnShown: boolean; + isRestricted?: boolean; + lastSyncTime?: number; +}; + +type DispatchProps = Pick; + +const TABS = [ + { type: 'media', title: 'SharedMediaTab2' }, + { type: 'documents', title: 'SharedFilesTab2' }, + { type: 'links', title: 'SharedLinksTab2' }, + { type: 'audio', title: 'SharedMusicTab2' }, +]; + +const HIDDEN_RENDER_DELAY = 1000; + +const Profile: FC = ({ + chatId, + profileState, + onProfileStateChange, + isChannel, + resolvedUserId, + chatMessages, + foundIds, + mediaSearchType, + hasMembersTab, + areMembersHidden, + members, + usersById, + isRightColumnShown, + isRestricted, + lastSyncTime, + setLocalMediaSearchType, + searchMediaMessagesLocal, + openMediaViewer, + openAudioPlayer, + openUserInfo, + focusMessage, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const transitionRef = useRef(null); + + const [activeTab, setActiveTab] = useState(0); + + const tabs = useMemo(() => ([ + ...(hasMembersTab ? [{ + type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers', + }] : []), + ...TABS, + ]), [hasMembersTab, isChannel]); + const tabType = tabs[activeTab].type as ProfileTabType; + + const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds( + isRightColumnShown, searchMediaMessagesLocal, tabType, mediaSearchType, members, + usersById, chatMessages, foundIds, chatId, lastSyncTime, + ); + const activeKey = tabs.findIndex(({ type }) => type === resultType); + + const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange); + + const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef); + + const [cacheBuster, resetCacheBuster] = useCacheBuster(); + + const handleTransitionStop = useCallback(() => { + releaseTransitionFix(); + resetCacheBuster(); + }, [releaseTransitionFix, resetCacheBuster]); + + // Update search type when switching tabs + useEffect(() => { + setLocalMediaSearchType({ mediaType: tabType }); + }, [setLocalMediaSearchType, tabType]); + + const profileId = resolvedUserId || chatId; + + const handleSelectMedia = useCallback((messageId: number) => { + openMediaViewer({ + chatId: profileId, + threadId: MAIN_THREAD_ID, + messageId, + origin: MediaViewerOrigin.SharedMedia, + }); + }, [profileId, openMediaViewer]); + + const handlePlayAudio = useCallback((messageId: number) => { + openAudioPlayer({ chatId: profileId, messageId }); + }, [profileId, openAudioPlayer]); + + const handleMemberClick = useCallback((id: number) => { + openUserInfo({ id }); + }, [openUserInfo]); + + const handleMessageFocus = useCallback((messageId: number) => { + focusMessage({ chatId: profileId, messageId }); + }, [profileId, focusMessage]); + + useEffect(() => { + if (!transitionRef.current || !IS_TOUCH_ENV) { + return undefined; + } + + return captureEvents(transitionRef.current, { + onSwipe: ((e, direction) => { + if (direction === SwipeDirection.Left) { + setActiveTab(Math.min(activeTab + 1, tabs.length - 1)); + } else if (direction === SwipeDirection.Right) { + setActiveTab(Math.max(0, activeTab - 1)); + } + }), + }); + }, [activeTab, tabs.length]); + + let renderingDelay; + const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media'); + // @optimization Used to unparallelize rendering of message list and profile media + if (isFirstTab) { + renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0; + // @optimization Used to delay first render of secondary tabs while animating + } else if (!viewportIds) { + renderingDelay = SLIDE_TRANSITION_DURATION; + } + const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay); + + function renderSharedMedia() { + if (!viewportIds || !canRenderContents || !chatMessages) { + // This is just a single-frame delay so we do not show spinner + const noSpinner = isFirstTab && viewportIds && !canRenderContents; + + return ( +
    + {!noSpinner && } +
    + ); + } + + if (!viewportIds.length) { + let text: string; + + switch (resultType) { + case 'members': + text = areMembersHidden ? 'You have no access to group members list.' : 'No members found'; + break; + case 'documents': + text = 'No documents found.'; + break; + case 'links': + text = 'No links found.'; + break; + case 'audio': + text = 'No audio found.'; + break; + default: + text = 'No media found.'; + } + + return ( +
    + +
    + ); + } + + return ( +
    + {resultType === 'media' ? ( + viewportIds!.map((id) => chatMessages[id] && ( + + )) + ) : resultType === 'documents' ? ( + viewportIds!.map((id) => chatMessages[id] && ( + + )) + ) : resultType === 'links' ? ( + viewportIds!.map((id) => chatMessages[id] && ( + + )) + ) : resultType === 'audio' ? ( + viewportIds!.map((id) => chatMessages[id] && ( +
    + ); + } + + return ( + + {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)} + {!isRestricted && ( +
    + + {renderSharedMedia} + + +
    + )} +
    + ); +}; + +function renderProfileInfo(chatId: number, resolvedUserId?: number) { + return ( +
    + {resolvedUserId ? ( + <> + + + + ) : ( + <> + + + + )} +
    + ); +} + +function buildInfiniteScrollItemSelector(resultType: string) { + return [ + // Used on first render + `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`, + // Used after transition + `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`, + ].join(', '); +} + +export default memo(withGlobal( + (global, { chatId, userId }): StateProps => { + const chat = selectChat(global, chatId); + + const chatMessages = selectChatMessages(global, userId || chatId); + const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {}; + const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {}; + + const { byId: usersById } = global.users; + + const isGroup = chat && isChatGroup(chat); + const isChannel = chat && isChatChannel(chat); + const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!)); + const members = chat && chat.fullInfo && chat.fullInfo.members; + const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers; + + let resolvedUserId; + if (userId) { + resolvedUserId = userId; + } else if (isChatPrivate(chatId)) { + resolvedUserId = chatId; + } + + return { + isChannel, + resolvedUserId, + chatMessages, + foundIds, + mediaSearchType, + hasMembersTab, + areMembersHidden, + ...(hasMembersTab && members && { + members, + usersById, + }), + isRightColumnShown: selectIsRightColumnShown(global), + isRestricted: chat && chat.isRestricted, + lastSyncTime: global.lastSyncTime, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setLocalMediaSearchType', + 'searchMediaMessagesLocal', + 'openMediaViewer', + 'openAudioPlayer', + 'openUserInfo', + 'focusMessage', + ]), +)(Profile)); diff --git a/src/components/right/RightColumn.scss b/src/components/right/RightColumn.scss new file mode 100644 index 000000000..b8fd8bdee --- /dev/null +++ b/src/components/right/RightColumn.scss @@ -0,0 +1,139 @@ +#RightColumn { + position: absolute; + top: 0; + right: 0; + width: var(--right-column-width); + height: 100%; + transform: translate3d(var(--right-column-width), 0, 0); + background: var(--color-background); + border-left: 1px solid var(--color-borders); + z-index: var(--z-right-column); + + transition: transform var(--layer-transition); + + body.animation-level-0 & { + transition: none; + } + + // @optimization + &:not(:hover) { + .Picker .chat-item-clickable:nth-child(n + 18) { + display: none !important; + } + } + + @media (max-width: 1275px) { + box-shadow: 0 .25rem .5rem .1rem rgba(114, 114, 114, 0.25); + } + + @media (max-width: 600px) { + width: 100vw; + transform: translate3d(110vw, 0, 0); + } + + > .Transition { + height: calc(100% - var(--header-height)); + overflow: hidden; + } + + .Management .section > .ChatInfo, + .profile-info > .ChatInfo { + padding: 0 1.5rem; + margin: 1rem 0; + text-align: center; + + .Avatar { + margin: 0 auto .5rem; + + &.no-photo { + cursor: default !important; + } + } + + .title { + display: flex; + justify-content: center; + align-items: center; + + h3 { + font-weight: 500; + font-size: 1.25rem; + line-height: 2rem; + white-space: pre-wrap; + word-break: break-word; + } + + .VerifiedIcon { + margin-left: 0.25rem; + margin-top: 0.1rem; + } + + .emoji { + width: 1.5rem; + height: 1.5rem; + background-size: 1.5rem; + } + } + + .status { + font-size: 0.875rem; + color: #868e96; + } + } +} + +#RightColumn-wrapper { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: var(--z-right-column); + overflow: hidden; + visibility: hidden; + pointer-events: none; + + @media (max-width: 1275px) { + position: fixed; + } + + &.is-hidden { + display: none; + } + + .overlay-backdrop { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: black; + opacity: 0; + + @media (max-width: 600px) { + transition: opacity var(--layer-transition); + + body.animation-level-0 & { + transition: none; + } + } + } + + #Main.right-column-open &, body.animating-right-column & { + visibility: visible; + } + + #Main.right-column-open & { + @media (max-width: 600px) { + .overlay-backdrop { + opacity: var(--layer-blackout-opacity); + } + } + + #RightColumn { + pointer-events: auto; + transform: translate3d(0, 0, 0); + } + } +} diff --git a/src/components/right/RightColumn.tsx b/src/components/right/RightColumn.tsx new file mode 100644 index 000000000..87cf6709c --- /dev/null +++ b/src/components/right/RightColumn.tsx @@ -0,0 +1,296 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ManagementScreens, ProfileState, RightColumnContent } from '../../types'; + +import { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; +import { pick } from '../../util/iteratees'; +import { + selectAreActiveChatsLoaded, + selectCurrentMessageList, + selectRightColumnContentKey, +} from '../../modules/selectors'; +import useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps'; +import useWindowSize from '../../hooks/useWindowSize'; +import useCurrentOrPrev from '../../hooks/useCurrentOrPrev'; + +import RightHeader from './RightHeader'; +import Profile from './Profile'; +import Transition from '../ui/Transition'; +import RightSearch from './RightSearch.async'; +import Management from './management/Management.async'; +import Statistics from './Statistics.async'; +import StickerSearch from './StickerSearch.async'; +import GifSearch from './GifSearch.async'; +import PollResults from './PollResults.async'; + +import './RightColumn.scss'; + +type StateProps = { + contentKey?: RightColumnContent; + chatId?: number; + threadId?: number; + currentProfileUserId?: number; + isChatSelected: boolean; +}; + +type DispatchProps = Pick; + +const COLUMN_CLOSE_DELAY_MS = 300; +const MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2; +const MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2; + +function blurSearchInput() { + const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement; + if (searchInput) { + searchInput.blur(); + } +} + +const RightColumn: FC = ({ + contentKey, + chatId, + threadId, + currentProfileUserId, + isChatSelected, + toggleChatInfo, + toggleManagement, + toggleStatistics, + openUserInfo, + closeLocalTextSearch, + setStickerSearchQuery, + setGifSearchQuery, + closePollResults, +}) => { + const { width: windowWidth } = useWindowSize(); + const [profileState, setProfileState] = useState(ProfileState.Profile); + const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial); + const [selectedChatMemberId, setSelectedChatMemberId] = useState(); + const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState(); + const isScrolledDown = profileState !== ProfileState.Profile; + + const isOpen = contentKey !== undefined; + const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo; + const isSearch = contentKey === RightColumnContent.Search; + const isManagement = contentKey === RightColumnContent.Management; + const isStatistics = contentKey === RightColumnContent.Statistics; + const isStickerSearch = contentKey === RightColumnContent.StickerSearch; + const isGifSearch = contentKey === RightColumnContent.GifSearch; + const isPollResults = contentKey === RightColumnContent.PollResults; + const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN; + + const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen); + + const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1; + + const close = useCallback(() => { + switch (contentKey) { + case RightColumnContent.ChatInfo: + if (isScrolledDown) { + setProfileState(ProfileState.Profile); + break; + } + toggleChatInfo(); + break; + case RightColumnContent.UserInfo: + if (isScrolledDown) { + setProfileState(ProfileState.Profile); + break; + } + openUserInfo({ id: undefined }); + break; + case RightColumnContent.Management: { + switch (managementScreen) { + case ManagementScreens.Initial: + toggleManagement(); + break; + case ManagementScreens.ChatPrivacyType: + case ManagementScreens.Discussion: + case ManagementScreens.GroupPermissions: + case ManagementScreens.GroupType: + case ManagementScreens.ChatAdministrators: + case ManagementScreens.ChannelSubscribers: + case ManagementScreens.GroupMembers: + setManagementScreen(ManagementScreens.Initial); + break; + case ManagementScreens.GroupUserPermissionsCreate: + case ManagementScreens.GroupRemovedUsers: + case ManagementScreens.GroupUserPermissions: + setManagementScreen(ManagementScreens.GroupPermissions); + setSelectedChatMemberId(undefined); + setIsPromotedByCurrentUser(undefined); + break; + case ManagementScreens.ChatAdminRights: + case ManagementScreens.GroupRecentActions: + setManagementScreen(ManagementScreens.ChatAdministrators); + break; + } + + break; + } + case RightColumnContent.Statistics: + toggleStatistics(); + break; + case RightColumnContent.Search: { + blurSearchInput(); + closeLocalTextSearch(); + break; + } + case RightColumnContent.StickerSearch: + case RightColumnContent.GifSearch: { + blurSearchInput(); + setStickerSearchQuery({ query: undefined }); + setGifSearchQuery({ query: undefined }); + break; + } + case RightColumnContent.PollResults: + closePollResults(); + break; + } + }, [ + contentKey, isScrolledDown, toggleChatInfo, openUserInfo, toggleStatistics, closePollResults, + managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery, + ]); + + const handleSelectChatMember = useCallback((memberId, isPromoted) => { + setSelectedChatMemberId(memberId); + setIsPromotedByCurrentUser(isPromoted); + }, []); + + useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]); + + useEffect(() => { + setTimeout(() => { + setShouldSkipTransition(!isOpen); + }, COLUMN_CLOSE_DELAY_MS); + }, [isOpen]); + + // Close Right Column when it transforms into overlayed state on screen resize + useEffect(() => { + if (isOpen && isOverlaying) { + close(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOverlaying]); + + // We need to clear profile state and management screen state, when changing chats + useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => { + if ( + (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo) + || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo) + || (prevChatId !== chatId) + ) { + setProfileState(ProfileState.Profile); + setManagementScreen(ManagementScreens.Initial); + } + }, [contentKey, chatId]); + + // eslint-disable-next-line consistent-return + function renderContent() { + if (renderingContentKey === -1) { + return undefined; + } + + switch (renderingContentKey) { + case RightColumnContent.ChatInfo: + case RightColumnContent.UserInfo: + return ( + + ); + case RightColumnContent.Search: + return ; + case RightColumnContent.Management: + return ( + + ); + case RightColumnContent.Statistics: + return ; + case RightColumnContent.StickerSearch: + return ; + case RightColumnContent.GifSearch: + return ; + case RightColumnContent.PollResults: + return ; + } + } + + return ( +
    + {isOverlaying && ( +
    + )} +
    + + + {renderContent} + +
    +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + const areActiveChatsLoaded = selectAreActiveChatsLoaded(global); + + return { + contentKey: selectRightColumnContentKey(global), + chatId, + threadId, + currentProfileUserId: global.users.selectedId, + isChatSelected: Boolean(chatId && areActiveChatsLoaded), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openUserInfo', + 'toggleChatInfo', + 'toggleManagement', + 'toggleStatistics', + 'closeLocalTextSearch', + 'setStickerSearchQuery', + 'setGifSearchQuery', + 'closePollResults', + ]), +)(RightColumn)); diff --git a/src/components/right/RightHeader.scss b/src/components/right/RightHeader.scss new file mode 100644 index 000000000..0c1f104a7 --- /dev/null +++ b/src/components/right/RightHeader.scss @@ -0,0 +1,49 @@ +.RightHeader { + display: flex; + align-items: center; + height: var(--header-height); + padding: 0.5rem .8125rem; + pointer-events: auto; + + @media (max-width: 600px) { + padding: 0.5rem; + } + + .close-button { + flex-shrink: 0; + } + + > .Transition { + flex: 1; + height: 100%; + + > div { + display: flex; + align-items: center; + } + } + + h3 { + margin-bottom: 0; + font-size: 1.25rem; + font-weight: 500; + margin-left: 1.375rem; + } + + .tools { + display: flex; + margin-left: auto; + } + + .SearchInput { + margin-left: 1rem; + + @media (min-width: 600px) { + margin-right: 1rem; + } + } + + .DropdownMenu { + margin-left: auto; + } +} diff --git a/src/components/right/RightHeader.tsx b/src/components/right/RightHeader.tsx new file mode 100644 index 000000000..a41590e0e --- /dev/null +++ b/src/components/right/RightHeader.tsx @@ -0,0 +1,386 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; +import { ManagementScreens, ProfileState } from '../../types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { debounce } from '../../util/schedulers'; +import { pick } from '../../util/iteratees'; +import buildClassName from '../../util/buildClassName'; +import { + selectChat, + selectCurrentGifSearch, + selectCurrentStickerSearch, + selectCurrentTextSearch, + selectIsChatWithSelf, +} from '../../modules/selectors'; +import { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers'; +import useFlag from '../../hooks/useFlag'; +import useLang from '../../hooks/useLang'; + +import CalendarModal from '../common/CalendarModal.async'; +import SearchInput from '../ui/SearchInput'; +import Button from '../ui/Button'; +import Transition from '../ui/Transition'; +import DropdownMenu from '../ui/DropdownMenu'; +import MenuItem from '../ui/MenuItem'; +import './RightHeader.scss'; + +type OwnProps = { + chatId?: number; + isColumnOpen?: boolean; + isProfile?: boolean; + isSearch?: boolean; + isManagement?: boolean; + isStatistics?: boolean; + isStickerSearch?: boolean; + isGifSearch?: boolean; + isPollResults?: boolean; + profileState?: ProfileState; + managementScreen?: ManagementScreens; + onClose: () => void; +}; + +type StateProps = { + canManage?: boolean; + isChannel?: boolean; + messageSearchQuery?: string; + stickerSearchQuery?: string; + gifSearchQuery?: string; +}; + +type DispatchProps = Pick; + +const COLUMN_CLOSE_DELAY_MS = 300; +const runDebouncedForSearch = debounce((cb) => cb(), 200, false); + +enum HeaderContent { + Profile, + MemberList, + SharedMedia, + Search, + Statistics, + Management, + ManageInitial, + ManageChannelSubscribers, + ManageChatAdministrators, + ManageChatPrivacyType, + ManageDiscussion, + ManageGroupPermissions, + ManageGroupRemovedUsers, + ManageGroupUserPermissionsCreate, + ManageGroupUserPermissions, + ManageGroupRecentActions, + ManageGroupAdminRights, + ManageGroupMembers, + StickerSearch, + GifSearch, + PollResults, +} + +const RightHeader: FC = ({ + isColumnOpen, + isProfile, + isSearch, + isManagement, + isStatistics, + isStickerSearch, + isGifSearch, + isPollResults, + profileState, + managementScreen, + canManage, + isChannel, + onClose, + messageSearchQuery, + stickerSearchQuery, + gifSearchQuery, + setLocalTextSearchQuery, + setStickerSearchQuery, + setGifSearchQuery, + searchTextMessagesLocal, + toggleManagement, + toggleStatistics, + searchMessagesByDate, +}) => { + // eslint-disable-next-line no-null/no-null + const backButtonRef = useRef(null); + + const [isCalendarOpen, openCalendar, closeCalendar] = useFlag(); + + const handleMessageSearchQueryChange = useCallback((query: string) => { + setLocalTextSearchQuery({ query }); + + if (query.length) { + runDebouncedForSearch(searchTextMessagesLocal); + } + }, [searchTextMessagesLocal, setLocalTextSearchQuery]); + + const handleJumpToDate = useCallback((date: Date) => { + searchMessagesByDate({ timestamp: date.valueOf() / 1000 }); + closeCalendar(); + }, [closeCalendar, searchMessagesByDate]); + + const handleStickerSearchQueryChange = useCallback((query: string) => { + setStickerSearchQuery({ query }); + }, [setStickerSearchQuery]); + + const handleGifSearchQueryChange = useCallback((query: string) => { + setGifSearchQuery({ query }); + }, [setGifSearchQuery]); + + const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen); + + useEffect(() => { + setTimeout(() => { + setShouldSkipTransition(!isColumnOpen); + }, COLUMN_CLOSE_DELAY_MS); + }, [isColumnOpen]); + + const lang = useLang(); + const contentKey = isProfile ? ( + profileState === ProfileState.Profile ? ( + HeaderContent.Profile + ) : profileState === ProfileState.SharedMedia ? ( + HeaderContent.SharedMedia + ) : profileState === ProfileState.MemberList ? ( + HeaderContent.MemberList + ) : -1 // Never reached + ) : isSearch ? ( + HeaderContent.Search + ) : isPollResults ? ( + HeaderContent.PollResults + ) : isStickerSearch ? ( + HeaderContent.StickerSearch + ) : isGifSearch ? ( + HeaderContent.GifSearch + ) : isManagement ? ( + managementScreen === ManagementScreens.Initial ? ( + HeaderContent.ManageInitial + ) : managementScreen === ManagementScreens.ChatPrivacyType ? ( + HeaderContent.ManageChatPrivacyType + ) : managementScreen === ManagementScreens.Discussion ? ( + HeaderContent.ManageDiscussion + ) : managementScreen === ManagementScreens.ChannelSubscribers ? ( + HeaderContent.ManageChannelSubscribers + ) : managementScreen === ManagementScreens.GroupPermissions ? ( + HeaderContent.ManageGroupPermissions + ) : managementScreen === ManagementScreens.ChatAdministrators ? ( + HeaderContent.ManageChatAdministrators + ) : managementScreen === ManagementScreens.GroupRemovedUsers ? ( + HeaderContent.ManageGroupRemovedUsers + ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? ( + HeaderContent.ManageGroupUserPermissionsCreate + ) : managementScreen === ManagementScreens.GroupUserPermissions ? ( + HeaderContent.ManageGroupUserPermissions + ) : managementScreen === ManagementScreens.GroupRecentActions ? ( + HeaderContent.ManageGroupRecentActions + ) : managementScreen === ManagementScreens.ChatAdminRights ? ( + HeaderContent.ManageGroupAdminRights + ) : managementScreen === ManagementScreens.GroupMembers ? ( + HeaderContent.ManageGroupMembers + ) : -1 // Never reached + ) : isStatistics ? ( + HeaderContent.Statistics + ) : -1; // Never reached + + const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => { + return ({ onTrigger, isOpen }) => ( + + ); + }, [lang]); + + function renderHeaderContent() { + switch (contentKey) { + case HeaderContent.PollResults: + return

    {lang('PollResults')}

    ; + case HeaderContent.Search: + return ( + <> + + + + ); + case HeaderContent.ManageInitial: + return

    {lang('Edit')}

    ; + case HeaderContent.ManageChatPrivacyType: + return

    {lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

    ; + case HeaderContent.ManageDiscussion: + return

    {lang('Discussion')}

    ; + case HeaderContent.ManageChatAdministrators: + return

    {lang('ChannelAdministrators')}

    ; + case HeaderContent.ManageGroupRecentActions: + return

    {lang('Group.Info.AdminLog')}

    ; + case HeaderContent.ManageGroupAdminRights: + return

    {lang('EditAdminRights')}

    ; + case HeaderContent.ManageGroupPermissions: + return

    {lang('ChannelPermissions')}

    ; + case HeaderContent.ManageGroupRemovedUsers: + return

    {lang('ChannelBlockedUsers')}

    ; + case HeaderContent.ManageGroupUserPermissionsCreate: + return

    {lang('ChannelAddException')}

    ; + case HeaderContent.ManageGroupUserPermissions: + return

    {lang('UserRestrictions')}

    ; + case HeaderContent.StickerSearch: + return ( + + ); + case HeaderContent.GifSearch: + return ( + + ); + case HeaderContent.Statistics: + return

    {lang('Statistics')}

    ; + case HeaderContent.SharedMedia: + return

    {lang('SharedMedia')}

    ; + case HeaderContent.ManageChannelSubscribers: + return

    {lang('ChannelSubscribers')}

    ; + case HeaderContent.MemberList: + case HeaderContent.ManageGroupMembers: + return

    {lang('GroupMembers')}

    ; + default: + return ( + <> +

    {lang('Info')}

    +
    + {canManage && ( + + )} + + {lang('Statistics')} + +
    + + ); + } + } + + const isBackButton = ( + IS_MOBILE_SCREEN + || contentKey === HeaderContent.SharedMedia + || contentKey === HeaderContent.MemberList + || isManagement + ); + + const buttonClassName = buildClassName( + 'animated-close-icon', + shouldSkipTransition && 'no-transition', + ); + + // Add class in the next AF to synchronize with animation with Transition components + useEffect(() => { + backButtonRef.current!.classList.toggle('state-back', isBackButton); + }, [isBackButton]); + + return ( +
    + + + {renderHeaderContent} + + {!IS_MOBILE_SCREEN && ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId, isProfile, isManagement }): StateProps => { + const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {}; + const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {}; + const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {}; + const chat = chatId ? selectChat(global, chatId) : undefined; + const isChannel = chat && isChatChannel(chat); + + const canManage = Boolean( + !isManagement + && isProfile + && chat + && !selectIsChatWithSelf(global, chat.id) + // chat.isCreator is for Basic Groups + && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)), + ); + + return { + canManage, + isChannel, + messageSearchQuery, + stickerSearchQuery, + gifSearchQuery, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'setLocalTextSearchQuery', + 'setStickerSearchQuery', + 'setGifSearchQuery', + 'searchTextMessagesLocal', + 'toggleManagement', + 'toggleStatistics', + 'searchMessagesByDate', + ]), +)(RightHeader)); diff --git a/src/components/right/RightSearch.async.tsx b/src/components/right/RightSearch.async.tsx new file mode 100644 index 000000000..aefe9a689 --- /dev/null +++ b/src/components/right/RightSearch.async.tsx @@ -0,0 +1,15 @@ +import React, { FC } from '../../lib/teact/teact'; +import { OwnProps } from './RightSearch'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const RightSearchAsync: FC = (props) => { + const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return RightSearch ? : ; +}; + +export default RightSearchAsync; diff --git a/src/components/right/RightSearch.scss b/src/components/right/RightSearch.scss new file mode 100644 index 000000000..176bcee60 --- /dev/null +++ b/src/components/right/RightSearch.scss @@ -0,0 +1,12 @@ +.RightSearch { + height: 100%; + padding: 0 0.5rem; + overflow-y: auto; + + .helper-text { + padding: 1rem; + margin-bottom: 0.125rem; + font-weight: 500; + color: var(--color-text-secondary); + } +} diff --git a/src/components/right/RightSearch.tsx b/src/components/right/RightSearch.tsx new file mode 100644 index 000000000..bcc47f8da --- /dev/null +++ b/src/components/right/RightSearch.tsx @@ -0,0 +1,161 @@ +import React, { FC, useMemo, memo } from '../../lib/teact/teact'; +import { getGlobal, withGlobal } from '../../lib/teact/teactn'; + +import { ApiMessage, ApiUser, ApiChat } from '../../api/types'; +import { GlobalActions } from '../../global/types'; + +import { + selectUser, + selectChatMessages, + selectChat, + selectCurrentTextSearch, +} from '../../modules/selectors'; +import { + getMessageSummaryText, + getChatTitle, + getUserFullName, + isChatChannel, +} from '../../modules/helpers'; +import renderText from '../common/helpers/renderText'; +import { orderBy, pick } from '../../util/iteratees'; +import { MEMO_EMPTY_ARRAY } from '../../util/memo'; + +import InfiniteScroll from '../ui/InfiniteScroll'; +import ListItem from '../ui/ListItem'; +import LastMessageMeta from '../common/LastMessageMeta'; +import Avatar from '../common/Avatar'; + +import './RightSearch.scss'; + +export type OwnProps = { + chatId: number; + threadId: number; +}; + +type StateProps = { + chat?: ApiChat; + messagesById?: Record; + query?: string; + totalCount?: number; + foundIds?: number[]; +}; + +type DispatchProps = Pick; + +interface Result { + message: ApiMessage; + senderUser?: ApiUser; + senderChat?: ApiChat; + onClick: NoneToVoidFunction; +} + +const RightSearch: FC = ({ + chatId, + threadId, + chat, + messagesById, + query, + totalCount, + foundIds, + searchTextMessagesLocal, + focusMessage, +}) => { + const foundResults = useMemo(() => { + if (!query || !foundIds || !foundIds.length || !messagesById) { + return MEMO_EMPTY_ARRAY; + } + + const results = foundIds.map((id) => { + const message = messagesById[id]; + if (!message) { + return undefined; + } + + const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined; + + let senderChat; + if (chat && isChatChannel(chat)) { + senderChat = chat; + } else if (message.forwardInfo) { + const { isChannelPost, fromChatId } = message.forwardInfo; + senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined; + } else { + senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined; + } + + return { + message, + senderUser, + senderChat, + onClick: () => focusMessage({ chatId, threadId, messageId: id }), + }; + }).filter(Boolean) as Result[]; + + return orderBy(results, ({ message }) => message.date, 'desc'); + }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]); + + const renderSearchResult = ({ + message, senderUser, senderChat, onClick, + }: Result) => { + const title = senderChat ? getChatTitle(senderChat) : getUserFullName(senderUser); + const text = getMessageSummaryText(message); + + return ( + + +
    +
    +

    {title && renderText(title)}

    + +
    +
    + {renderText(text, ['emoji', 'highlight'], { highlight: query })} +
    +
    +
    + ); + }; + + return ( + +

    + {!query ? ( + 'Search messages' + ) : totalCount === 1 ? ( + '1 message found' + ) : ( + `${(foundResults.length && (totalCount || foundResults.length)) || 'No'} messages found` + )} +

    + {foundResults.map(renderSearchResult)} +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const messagesById = chat && selectChatMessages(global, chat.id); + if (!chat || !messagesById) { + return {}; + } + + const { query, results } = selectCurrentTextSearch(global) || {}; + const { totalCount, foundIds } = results || {}; + + return { + chat, + messagesById, + query, + totalCount, + foundIds, + }; + }, + (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']), +)(RightSearch)); diff --git a/src/components/right/Statistics.async.tsx b/src/components/right/Statistics.async.tsx new file mode 100644 index 000000000..6fa4d15ab --- /dev/null +++ b/src/components/right/Statistics.async.tsx @@ -0,0 +1,13 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const StatisticsAsync: FC = () => { + const Statistics = useModuleLoader(Bundles.Extra, 'Statistics'); + + return Statistics ? : ; +}; + +export default StatisticsAsync; diff --git a/src/components/right/Statistics.scss b/src/components/right/Statistics.scss new file mode 100644 index 000000000..ef17da01c --- /dev/null +++ b/src/components/right/Statistics.scss @@ -0,0 +1,87 @@ +.Statistics { + height: 100%; + overflow-x: hidden; + overflow-y: hidden; + + &.ready { + overflow-y: scroll !important; + } + + .chat-container { + margin-bottom: 1rem; + border-bottom: 1px solid var(--color-borders); + + opacity: 1; + transition: opacity .3s ease; + + &.hidden { + opacity: 0; + } + } + + .lovely-chart--container { + font: inherit !important; + font-size: 13px !important; + } + + .lovely-chart--header { + margin: 0 1rem; + } + + .lovely-chart--header, + .lovely-chart--tooltip-title, + .lovely-chart--tooltip-dataset-value, + .lovely-chart--percentage-title { + font-weight: 500 !important; + } + + .lovely-chart--container-type-pie { + &.lovely-chart--state-zoomed-in > canvas { + animation-name: pie-slim-in !important; + } + + &:not(.lovely-chart--state-zoomed-in) > canvas { + animation-name: pie-slim-out !important; + } + } +} + +@keyframes pie-slim-in { + 0% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 25% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 75% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(0); + } +} + +@keyframes pie-slim-out { + 0% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(360deg); + } + + 50% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(0); + } + + 75% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(0); + } +} diff --git a/src/components/right/Statistics.tsx b/src/components/right/Statistics.tsx new file mode 100644 index 000000000..1e7ffe052 --- /dev/null +++ b/src/components/right/Statistics.tsx @@ -0,0 +1,93 @@ +import React, { + FC, memo, useState, useEffect, useRef, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import Loading from '../ui/Loading'; + +import './Statistics.scss'; + +type ILovelyChart = { create: Function }; +let lovelyChartPromise: Promise; +let LovelyChart: ILovelyChart; + +async function ensureLovelyChart() { + if (!lovelyChartPromise) { + lovelyChartPromise = import('../../lib/lovely-chart/LovelyChart') as Promise; + LovelyChart = await lovelyChartPromise; + } + + return lovelyChartPromise; +} + +const Statistics: FC = () => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + const [isReady, setIsReady] = useState(false); + const [loadedChartsCount, setLoadedChartsCount] = useState(0); + + useEffect(() => { + (async () => { + await ensureLovelyChart(); + + if (!isReady) { + setIsReady(true); + return; + } + + const growth = await fetchJson('./chartDummyData/growth.json'); + LovelyChart.create(containerRef.current!.children[0], growth); + setLoadedChartsCount(1); + + const notifications = await fetchJson('./chartDummyData/notifications.json'); + notifications.onZoom = (timestamp: number) => fetchDayData('chartDummyData/notifications_zoom', timestamp); + LovelyChart.create(containerRef.current!.children[1], notifications); + setLoadedChartsCount(2); + + const interactions = await fetchJson('./chartDummyData/interactions.json'); + LovelyChart.create(containerRef.current!.children[2], interactions); + setLoadedChartsCount(3); + + const views = await fetchJson('./chartDummyData/views.json'); + views.onZoom = (timestamp: number) => fetchDayData('chartDummyData/views_zoom', timestamp); + LovelyChart.create(containerRef.current!.children[3], views); + setLoadedChartsCount(4); + + const languages = await fetchJson('./chartDummyData/languages.json'); + LovelyChart.create(containerRef.current!.children[4], languages); + setLoadedChartsCount(5); + })(); + }, [isReady]); + + return ( +
    + {!isReady ? ( + + ) : ( + <> +
    +
    +
    +
    +
    + + )} +
    + ); +}; + +function fetchJson(path: string) { + return fetch(path).then((response) => response.json()); +} + +function fetchDayData(dataSource: string, timestamp: number) { + const date = new Date(timestamp); + const month = date.getMonth() + 1; + const day = date.getDate(); + const path = `${date.getFullYear()}-${month < 10 ? '0' : ''}${month}/${day < 10 ? '0' : ''}${day}`; + + return fetchJson(`${dataSource}/${path}.json`); +} + +export default memo(Statistics); diff --git a/src/components/right/StickerSearch.async.tsx b/src/components/right/StickerSearch.async.tsx new file mode 100644 index 000000000..e3dda97f7 --- /dev/null +++ b/src/components/right/StickerSearch.async.tsx @@ -0,0 +1,14 @@ +import React, { FC } from '../../lib/teact/teact'; +import { Bundles } from '../../util/moduleLoader'; + +import useModuleLoader from '../../hooks/useModuleLoader'; +import Loading from '../ui/Loading'; + +const StickerSearchAsync: FC = () => { + const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return StickerSearch ? : ; +}; + +export default StickerSearchAsync; diff --git a/src/components/right/StickerSearch.scss b/src/components/right/StickerSearch.scss new file mode 100644 index 000000000..a2249f369 --- /dev/null +++ b/src/components/right/StickerSearch.scss @@ -0,0 +1,64 @@ +.StickerSearch { + height: 100%; + padding: 0 0.5rem; + overflow-y: auto; + + .helper-text { + padding: 1rem; + margin-bottom: 0.125rem; + font-weight: 500; + color: var(--color-text-secondary); + } + + .sticker-set { + margin-bottom: 1rem; + + &-header { + display: flex; + justify-content: space-between; + padding: 0.5rem; + + .title-wrapper { + overflow: hidden; + } + + .title { + font-size: 1rem; + line-height: 1.6875rem; + margin: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + .count { + color: var(--color-text-secondary); + margin: 0; + } + + .Button { + flex-shrink: 0; + margin-left: 1rem; + + &.is-added { + background: var(--color-chat-hover); + color: var(--color-text-secondary); + + &:hover, &:active { + background: var(--color-chat-active) !important; + } + } + } + } + + &-main { + display: flex; + flex-wrap: nowrap; + overflow: hidden; + } + } + + .StickerButton { + margin: 0.125rem; + } +} diff --git a/src/components/right/StickerSearch.tsx b/src/components/right/StickerSearch.tsx new file mode 100644 index 000000000..cdcd1e2d7 --- /dev/null +++ b/src/components/right/StickerSearch.tsx @@ -0,0 +1,109 @@ +import React, { + FC, memo, useEffect, useRef, useState, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { GlobalActions } from '../../global/types'; + +import { pick } from '../../util/iteratees'; +import { throttle } from '../../util/schedulers'; +import { selectCurrentStickerSearch } from '../../modules/selectors'; +import { useIntersectionObserver } from '../../hooks/useIntersectionObserver'; + +import Loading from '../ui/Loading'; +import StickerSetResult from './StickerSetResult'; + +import './StickerSearch.scss'; + +type StateProps = { + query?: string; + featuredIds?: string[]; + resultIds?: string[]; +}; + +type DispatchProps = Pick; + +const INTERSECTION_THROTTLE = 200; + +const runThrottled = throttle((cb) => cb(), 60000, true); + +const StickerSearch: FC = ({ + query, + featuredIds, + resultIds, + loadFeaturedStickers, +}) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const [isModalOpen, setIsModalOpen] = useState(false); + + const { + observe: observeIntersection, + } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE }); + + // Due to the parent Transition, this component never gets unmounted, + // that's why we use throttled API call on every update. + useEffect(() => { + runThrottled(() => { + loadFeaturedStickers(); + }); + }); + + function renderContent() { + if (query === undefined) { + return undefined; + } + + if (!query && featuredIds) { + return featuredIds.map((id) => ( + + )); + } + + if (resultIds) { + if (!resultIds.length) { + return

    Nothing found.

    ; + } + + return resultIds.map((id) => ( + + )); + } + + return ; + } + + return ( +
    + {renderContent()} +
    + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const currentSearch = selectCurrentStickerSearch(global); + const { query, resultIds } = currentSearch || {}; + const { featured } = global.stickers; + + return { + query, + featuredIds: featured.setIds, + resultIds, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']), +)(StickerSearch)); diff --git a/src/components/right/StickerSetResult.tsx b/src/components/right/StickerSetResult.tsx new file mode 100644 index 000000000..24a1f2fa3 --- /dev/null +++ b/src/components/right/StickerSetResult.tsx @@ -0,0 +1,126 @@ +import React, { + FC, useEffect, memo, useMemo, useCallback, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiStickerSet } from '../../api/types'; +import { GlobalActions } from '../../global/types'; +import { ObserveFn } from '../../hooks/useIntersectionObserver'; + +import { STICKER_SIZE_SEARCH } from '../../config'; +import { pick } from '../../util/iteratees'; +import { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors'; +import useFlag from '../../hooks/useFlag'; +import useOnChange from '../../hooks/useOnChange'; + +import Button from '../ui/Button'; +import StickerButton from '../common/StickerButton'; +import StickerSetModal from '../common/StickerSetModal.async'; +import Spinner from '../ui/Spinner'; + +type OwnProps = { + stickerSetId: string; + observeIntersection: ObserveFn; + isSomeModalOpen: boolean; + onModalToggle: (isOpen: boolean) => void; +}; + +type StateProps = { + set?: ApiStickerSet; + shouldPlay?: boolean; +}; + +type DispatchProps = Pick; + +const STICKERS_TO_DISPLAY = 5; + +const StickerSetResult: FC = ({ + stickerSetId, observeIntersection, set, shouldPlay, loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle, +}) => { + const isAdded = set && Boolean(set.installedDate); + const areStickersLoaded = Boolean(set && set.stickers); + + const [isModalOpen, openModal, closeModal] = useFlag(); + + useOnChange(() => { + onModalToggle(isModalOpen); + }, [isModalOpen, onModalToggle]); + + const displayedStickers = useMemo(() => { + if (!set) { + return []; + } + + const coverStickerIds = (set.covers || []).map(({ id }) => id); + const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : []; + + return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY); + }, [set]); + + useEffect(() => { + // Featured stickers are initialized with one sticker in collection (cover of SickerSet) + if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) { + loadStickers({ stickerSetId }); + } + }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]); + + const handleAddClick = useCallback(() => { + toggleStickerSet({ stickerSetId }); + }, [toggleStickerSet, stickerSetId]); + + if (!set) { + return undefined; + } + + const canRenderStickers = displayedStickers.length > 0; + + return ( +
    +
    +
    +

    {set.title}

    +

    {set.count} stickers

    +
    + +
    +
    + {!canRenderStickers && } + {canRenderStickers && displayedStickers.map((sticker) => ( + + ))} +
    + {canRenderStickers && ( + + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { stickerSetId }): StateProps => { + return { + set: selectStickerSet(global, stickerSetId), + shouldPlay: selectShouldLoopStickers(global), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']), +)(StickerSetResult)); diff --git a/src/components/right/UserExtra.tsx b/src/components/right/UserExtra.tsx new file mode 100644 index 000000000..67b231585 --- /dev/null +++ b/src/components/right/UserExtra.tsx @@ -0,0 +1,91 @@ +import React, { FC, useEffect, memo } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ApiUser } from '../../api/types'; +import { GlobalActions, GlobalState } from '../../global/types'; + +import { selectUser } from '../../modules/selectors'; +import { formatPhoneNumberWithCode } from '../../util/phoneNumber'; +import renderText from '../common/helpers/renderText'; +import { pick } from '../../util/iteratees'; +import useLang from '../../hooks/useLang'; + +type OwnProps = { + userId: number; + forceShowSelf?: boolean; +}; + +type StateProps = { + user?: ApiUser; +} & Pick; + +type DispatchProps = Pick; + +const UserExtra: FC = ({ + lastSyncTime, user, forceShowSelf, loadFullUser, +}) => { + const { + id: userId, + fullInfo, + username, + phoneNumber, + isSelf, + } = user || {}; + + useEffect(() => { + if (lastSyncTime) { + loadFullUser({ userId }); + } + }, [loadFullUser, userId, lastSyncTime]); + + const lang = useLang(); + + if (!user || (isSelf && !forceShowSelf)) { + return undefined; + } + + const bio = fullInfo && fullInfo.bio; + const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber); + + return ( +
    + {bio && !!bio.length && ( +
    + +
    +

    {renderText(bio, ['br', 'links'])}

    +

    {lang('UserBio')}

    +
    +
    + )} + {username && !!username.length && ( +
    + +
    +

    {renderText(username)}

    +

    {lang('Username')}

    +
    +
    + )} + {formattedNumber && !!formattedNumber.length && ( +
    + +
    +

    {formattedNumber}

    +

    {lang('Phone')}

    +
    +
    + )} +
    + ); +}; + +export default memo(withGlobal( + (global, { userId }): StateProps => { + const { lastSyncTime } = global; + const user = selectUser(global, userId); + + return { lastSyncTime, user }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser']), +)(UserExtra)); diff --git a/src/components/right/hooks/useAsyncRendering.ts b/src/components/right/hooks/useAsyncRendering.ts new file mode 100644 index 000000000..7001bc71a --- /dev/null +++ b/src/components/right/hooks/useAsyncRendering.ts @@ -0,0 +1,44 @@ +import { useEffect, useRef } from '../../../lib/teact/teact'; + +import useOnChange from '../../../hooks/useOnChange'; +import useForceUpdate from '../../../hooks/useForceUpdate'; + +export default function useAsyncRendering(dependencies: T, delay?: number) { + const isDisabled = delay === undefined; + const shouldRenderRef = useRef(isDisabled); + const timeoutRef = useRef(); + const forceUpdate = useForceUpdate(); + + useOnChange(() => { + if (isDisabled) { + return; + } + + shouldRenderRef.current = false; + + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + } + }, dependencies); + + useEffect(() => { + if (isDisabled || shouldRenderRef.current) { + return; + } + + const exec = () => { + shouldRenderRef.current = true; + forceUpdate(); + }; + + if (delay! > 0) { + timeoutRef.current = window.setTimeout(exec, delay); + } else { + exec(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, dependencies); + + return shouldRenderRef.current; +} diff --git a/src/components/right/hooks/useProfileState.ts b/src/components/right/hooks/useProfileState.ts new file mode 100644 index 000000000..ab6bfd347 --- /dev/null +++ b/src/components/right/hooks/useProfileState.ts @@ -0,0 +1,110 @@ +import { useCallback, useEffect } from '../../../lib/teact/teact'; + +import { ProfileState } from '../../../types'; + +import fastSmoothScroll from '../../../util/fastSmoothScroll'; +import { throttle } from '../../../util/schedulers'; +import useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps'; + +const TRANSITION_DURATION = 300; +const PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350; + +const runThrottledForScroll = throttle((cb) => cb(), 250, false); + +let isScrollingProgrammatically = false; + +export default function useProfileState( + containerRef: { current: HTMLDivElement | null }, + tabType: string, + profileState: ProfileState, + onProfileStateChange: (state: ProfileState) => void, +) { + // Scroll to tabs if needed + useEffectWithPrevDeps(([prevTabType]) => { + if (prevTabType && prevTabType !== tabType) { + const container = containerRef.current!; + const tabsEl = container.querySelector('.TabList')!; + if (container.scrollTop < tabsEl.offsetTop) { + onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia); + isScrollingProgrammatically = true; + fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION); + setTimeout(() => { + isScrollingProgrammatically = false; + }, PROGRAMMATIC_SCROLL_TIMEOUT_MS); + } + } + }, [tabType, onProfileStateChange]); + + // Scroll to top + useEffectWithPrevDeps(([prevProfileState]) => { + if (profileState !== ProfileState.Profile || profileState === prevProfileState) { + return; + } + + const container = containerRef.current; + if (!container) { + return; + } + + const tabListEl = container.querySelector('.TabList'); + if (!tabListEl || tabListEl.offsetTop > container.scrollTop) { + return; + } + + isScrollingProgrammatically = true; + fastSmoothScroll( + container, + container.firstElementChild as HTMLElement, + 'start', + undefined, + container.offsetHeight * 2, + ); + + setTimeout(() => { + isScrollingProgrammatically = false; + }, PROGRAMMATIC_SCROLL_TIMEOUT_MS); + + onProfileStateChange(profileState); + }, [profileState]); + + const determineProfileState = useCallback(() => { + const container = containerRef.current; + if (!container) { + return; + } + + const tabListEl = container.querySelector('.TabList'); + if (!tabListEl) { + return; + } + + let state: ProfileState = ProfileState.Profile; + if (container.scrollTop >= tabListEl.offsetTop) { + state = tabType === 'members' + ? ProfileState.MemberList + : ProfileState.SharedMedia; + } + + onProfileStateChange(state); + }, [containerRef, onProfileStateChange, tabType]); + + // Determine profile state when switching tabs + useEffect(() => { + if (isScrollingProgrammatically) { + return; + } + + determineProfileState(); + }, [determineProfileState, tabType]); + + // Determine profile state when scrolling + const handleScroll = useCallback(() => { + if (isScrollingProgrammatically) { + return; + } + + runThrottledForScroll(determineProfileState); + }, [determineProfileState]); + + return { handleScroll }; +} diff --git a/src/components/right/hooks/useProfileViewportIds.ts b/src/components/right/hooks/useProfileViewportIds.ts new file mode 100644 index 000000000..4b66a20a4 --- /dev/null +++ b/src/components/right/hooks/useProfileViewportIds.ts @@ -0,0 +1,113 @@ +import { useMemo, useRef } from '../../../lib/teact/teact'; + +import { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types'; +import { ProfileTabType, SharedMediaType } from '../../../types'; + +import { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config'; +import { getMessageContentIds, getSortedUserIds } from '../../../modules/helpers'; +import useOnChange from '../../../hooks/useOnChange'; +import useInfiniteScroll from '../../../hooks/useInfiniteScroll'; + +export default function useProfileViewportIds( + isRightColumnShown: boolean, + searchMessages: AnyToVoidFunction, + tabType: ProfileTabType, + mediaSearchType?: SharedMediaType, + groupChatMembers?: ApiChatMember[], + usersById?: Record, + chatMessages?: Record, + foundIds?: number[], + chatId?: number, + lastSyncTime?: number, +) { + const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType; + + const memberIds = useMemo(() => { + if (!groupChatMembers || !usersById) { + return undefined; + } + + return getSortedUserIds(groupChatMembers.map(({ userId }) => userId), usersById); + }, [groupChatMembers, usersById]); + + const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia( + 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds, + ); + + const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia( + 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds, + ); + + const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia( + 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds, + ); + + const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia( + 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds, + ); + + let viewportIds: number[] | undefined; + let getMore: AnyToVoidFunction | undefined; + let noProfileInfo = false; + + switch (resultType) { + case 'members': + viewportIds = memberIds; + getMore = undefined; + break; + case 'media': + viewportIds = mediaViewportIds; + getMore = getMoreMedia; + noProfileInfo = noProfileInfoForMedia; + break; + case 'documents': + viewportIds = documentViewportIds; + getMore = getMoreDocuments; + noProfileInfo = noProfileInfoForDocuments; + break; + case 'links': + viewportIds = linkViewportIds; + getMore = getMoreLinks; + noProfileInfo = noProfileInfoForLinks; + break; + case 'audio': + viewportIds = audioViewportIds; + getMore = getMoreAudio; + noProfileInfo = noProfileInfoForAudio; + break; + } + + return [resultType, viewportIds, getMore, noProfileInfo] as const; +} + +function useInfiniteScrollForSharedMedia( + forSharedMediaType: SharedMediaType, + currentResultType?: ProfileTabType, + handleLoadMore?: AnyToVoidFunction, + lastSyncTime?: number, + chatMessages?: Record, + foundIds?: number[], +) { + const messageIdsRef = useRef(); + + useOnChange(() => { + if (currentResultType === forSharedMediaType && chatMessages && foundIds) { + messageIdsRef.current = getMessageContentIds( + chatMessages, + foundIds, + forSharedMediaType, + ).reverse(); + } + }, [chatMessages, foundIds, currentResultType, forSharedMediaType]); + + const [viewportIds, getMore] = useInfiniteScroll( + lastSyncTime ? handleLoadMore : undefined, + messageIdsRef.current, + undefined, + forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE, + ); + + const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0]; + + return [viewportIds, getMore, !isOnTop] as const; +} diff --git a/src/components/right/hooks/useTransitionFixes.ts b/src/components/right/hooks/useTransitionFixes.ts new file mode 100644 index 000000000..94d5ba3b5 --- /dev/null +++ b/src/components/right/hooks/useTransitionFixes.ts @@ -0,0 +1,43 @@ +import { useCallback, useEffect } from '../../../lib/teact/teact'; + +export default function useTransitionFixes( + containerRef: { current: HTMLDivElement | null }, +) { + // Set `min-height` for shared media container to prevent jumping when switching tabs + useEffect(() => { + function setMinHeight() { + const container = containerRef.current!; + const transitionEl = container.querySelector('.Transition'); + const tabsEl = container.querySelector('.TabList'); + if (transitionEl && tabsEl) { + transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`; + } + } + + setMinHeight(); + + window.addEventListener('resize', setMinHeight, false); + + return () => { + window.removeEventListener('resize', setMinHeight, false); + }; + }, [containerRef]); + + // Workaround for scrollable content flickering during animation. + const applyTransitionFix = useCallback(() => { + const container = containerRef.current!; + if (container.style.overflowY !== 'hidden') { + const scrollBarWidth = container.offsetWidth - container.clientWidth; + container.style.overflowY = 'hidden'; + container.style.marginRight = `${scrollBarWidth}px`; + } + }, [containerRef]); + + const releaseTransitionFix = useCallback(() => { + const container = containerRef.current!; + container.style.overflowY = 'scroll'; + container.style.marginRight = '0'; + }, [containerRef]); + + return { applyTransitionFix, releaseTransitionFix }; +} diff --git a/src/components/right/management/ManageChannel.tsx b/src/components/right/management/ManageChannel.tsx new file mode 100644 index 000000000..a916e2747 --- /dev/null +++ b/src/components/right/management/ManageChannel.tsx @@ -0,0 +1,251 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ManagementScreens, ManagementProgress } from '../../../types'; +import { ApiChat, ApiMediaFormat } from '../../../api/types'; + +import { pick } from '../../../util/iteratees'; +import { getChatAvatarHash } from '../../../modules/helpers'; +import useMedia from '../../../hooks/useMedia'; +import useLang from '../../../hooks/useLang'; +import { selectChat } from '../../../modules/selectors'; + +import AvatarEditable from '../../ui/AvatarEditable'; +import InputText from '../../ui/InputText'; +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import Spinner from '../../ui/Spinner'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import ConfirmDialog from '../../ui/ConfirmDialog'; +import useFlag from '../../../hooks/useFlag'; + +import './Management.scss'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; +}; + +type StateProps = { + chat: ApiChat; + progress?: ManagementProgress; + isSignaturesShown: boolean; +}; + +type DispatchProps = Pick; + +const CHANNEL_TITLE_EMPTY = 'Channel title can\'t be empty'; + +const ManageChannel: FC = ({ + chatId, + chat, + progress, + isSignaturesShown, + onScreenSelect, + updateChat, + toggleSignatures, + closeManagement, + leaveChannel, + deleteChannel, + openChat, +}) => { + const currentTitle = chat ? (chat.title || '') : ''; + const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : ''; + const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId; + + const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag(); + const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false); + const [title, setTitle] = useState(currentTitle); + const [about, setAbout] = useState(currentAbout); + const [photo, setPhoto] = useState(); + const [error, setError] = useState(); + const imageHash = chat && getChatAvatarHash(chat); + const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl); + const lang = useLang(); + + useEffect(() => { + if (progress === ManagementProgress.Complete) { + setIsProfileFieldsTouched(false); + setError(undefined); + } + }, [progress]); + + const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0; + + const handleClickEditType = useCallback(() => { + onScreenSelect(ManagementScreens.ChatPrivacyType); + }, [onScreenSelect]); + + const handleClickDiscussion = useCallback(() => { + onScreenSelect(ManagementScreens.Discussion); + }, [onScreenSelect]); + + const handleClickAdministrators = useCallback(() => { + onScreenSelect(ManagementScreens.ChatAdministrators); + }, [onScreenSelect]); + + const handleSetPhoto = useCallback((file: File) => { + setPhoto(file); + setIsProfileFieldsTouched(true); + }, []); + + const handleTitleChange = useCallback((e: ChangeEvent) => { + setTitle(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleAboutChange = useCallback((e: ChangeEvent) => { + setAbout(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleUpdateChannel = useCallback(() => { + const trimmedTitle = title.trim(); + const trimmedAbout = about.trim(); + + if (!trimmedTitle.length) { + setError(CHANNEL_TITLE_EMPTY); + return; + } + + updateChat({ + chatId, + title: trimmedTitle, + about: trimmedAbout, + photo, + }); + }, [about, chatId, photo, title, updateChat]); + + const handleToggleSignatures = useCallback(() => { + toggleSignatures({ chatId, isEnabled: !isSignaturesShown }); + }, [chatId, isSignaturesShown, toggleSignatures]); + + const handleClickSubscribers = useCallback(() => { + onScreenSelect(ManagementScreens.ChannelSubscribers); + }, [onScreenSelect]); + + + const handleDeleteChannel = useCallback(() => { + if (chat.isCreator) { + deleteChannel({ chatId: chat.id }); + } else { + leaveChannel({ chatId: chat.id }); + } + + closeDeleteDialog(); + closeManagement(); + openChat({ id: undefined }); + }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]); + + if (chat.isRestricted) { + return undefined; + } + + const isLoading = progress === ManagementProgress.InProgress; + + return ( +
    +
    +
    + + + + {chat.isCreator && ( + +
    + {lang('ChannelType')} + {chat.username ? lang('TypePublic') : lang('TypePrivate')} +
    +
    + )} + +
    + {lang('Discussion')} + {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')} +
    +
    + +
    + {lang('ChannelAdministrators')} + {adminsCount} +
    +
    +
    + +
    +
    +
    + +
    + {lang('ChannelSubscribers')} + {lang('Subscribers', chat.membersCount!, 'i')} +
    +
    +
    +
    + + {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')} + +
    +
    + + {isLoading ? ( + + ) : ( + + )} + + +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId)!; + const { progress } = global.management; + const isSignaturesShown = Boolean(chat && chat.isSignaturesShown); + + return { chat, progress, isSignaturesShown }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat', + ]), +)(ManageChannel)); diff --git a/src/components/right/management/ManageChatAdministrators.tsx b/src/components/right/management/ManageChatAdministrators.tsx new file mode 100644 index 000000000..ee57b2ded --- /dev/null +++ b/src/components/right/management/ManageChatAdministrators.tsx @@ -0,0 +1,130 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ManagementScreens } from '../../../types'; +import { ApiChat, ApiChatMember, ApiUser } from '../../../api/types'; +import { getUserFullName, isChatChannel } from '../../../modules/helpers'; + +import { selectChat } from '../../../modules/selectors'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; + onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void; +}; + +type StateProps = { + chat: ApiChat; + currentUserId?: number; + isChannel: boolean; + usersById: Record; +}; + +const ManageChatAdministrators: FC = ({ + chat, + isChannel, + currentUserId, + usersById, + onScreenSelect, + onChatMemberSelect, +}) => { + const lang = useLang(); + + function handleRecentActionsClick() { + onScreenSelect(ManagementScreens.GroupRecentActions); + } + + const adminMembers = useMemo(() => { + if (!chat.fullInfo || !chat.fullInfo.adminMembers) { + return []; + } + + return chat.fullInfo.adminMembers.sort((a, b) => { + if (a.isOwner) { + return -1; + } else if (b.isOwner) { + return 1; + } + + return 0; + }); + }, [chat]); + + const handleAdminMemberClick = useCallback((member: ApiChatMember) => { + onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId); + onScreenSelect(ManagementScreens.ChatAdminRights); + }, [currentUserId, onChatMemberSelect, onScreenSelect]); + + const getMemberStatus = useCallback((member: ApiChatMember) => { + if (member.isOwner) { + return lang('ChannelCreator'); + } + + const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined; + + if (promotedByUser) { + return lang('EditAdminPromotedBy', getUserFullName(promotedByUser)); + } + + return lang('ChannelAdmin'); + }, [lang, usersById]); + + return ( +
    +
    +
    + +
    + {lang('EventLog')} + {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')} +
    +
    +
    + +
    +

    + {isChannel + ? 'You can add administrators to help you manage your channel.' + : 'You can add administrators to help you manage your group.'} +

    + + {adminMembers.map((member) => ( + handleAdminMemberClick(member)} + > + + + ))} +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId)!; + const { byId: usersById } = global.users; + + return { + chat, + currentUserId: global.currentUserId, + isChannel: isChatChannel(chat), + usersById, + }; + }, + // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']), +)(ManageChatAdministrators)); diff --git a/src/components/right/management/ManageChatPrivacyType.tsx b/src/components/right/management/ManageChatPrivacyType.tsx new file mode 100644 index 000000000..34fdcb9c1 --- /dev/null +++ b/src/components/right/management/ManageChatPrivacyType.tsx @@ -0,0 +1,175 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat } from '../../../api/types'; +import { ManagementProgress } from '../../../types'; + +import { selectChat, selectManagement } from '../../../modules/selectors'; +import { pick } from '../../../util/iteratees'; +import { isChatChannel } from '../../../modules/helpers'; +import useFlag from '../../../hooks/useFlag'; +import useLang from '../../../hooks/useLang'; + +import SafeLink from '../../common/SafeLink'; +import ListItem from '../../ui/ListItem'; +import RadioGroup from '../../ui/RadioGroup'; +import Loading from '../../ui/Loading'; +import Spinner from '../../ui/Spinner'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import UsernameInput from '../../common/UsernameInput'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +type PrivacyType = 'private' | 'public'; + +type OwnProps = { + chatId: number; +}; + +type StateProps = { + chat: ApiChat; + isChannel: boolean; + progress?: ManagementProgress; + isUsernameAvailable?: boolean; +}; + +type DispatchProps = Pick; + +const ManageChatPrivacyType: FC = ({ + chat, + isChannel, + progress, + isUsernameAvailable, + checkPublicLink, + updatePublicLink, + updatePrivateLink, +}) => { + const isPublic = Boolean(chat.username); + const privateLink = chat.fullInfo && chat.fullInfo.inviteLink; + + const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private'); + const [username, setUsername] = useState(); + const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag(); + + const canUpdate = ( + (privacyType === 'public' && username && isUsernameAvailable) + || (privacyType === 'private' && isPublic) + ); + + useEffect(() => { + if (privacyType && !privateLink) { + updatePrivateLink(); + } + }, [privacyType, privateLink, updatePrivateLink]); + + const handleOptionChange = useCallback((value: string) => { + setPrivacyType(value as PrivacyType); + }, []); + + const handleSave = useCallback(() => { + updatePublicLink({ username: privacyType === 'public' ? username : '' }); + }, [privacyType, updatePublicLink, username]); + + const handleRevokePrivateLink = useCallback(() => { + closeRevokeConfirmDialog(); + updatePrivateLink(); + }, [closeRevokeConfirmDialog, updatePrivateLink]); + + const lang = useLang(); + const langPrefix1 = isChannel ? 'Channel' : 'Mega'; + const langPrefix2 = isChannel ? 'Channel' : 'Group'; + + const options = [ + { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) }, + { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) }, + ]; + + const isLoading = progress === ManagementProgress.InProgress; + + return ( +
    +
    +
    +

    {lang(`${langPrefix2}Type`)}

    + +
    + {privacyType === 'private' ? ( +
    + {privateLink ? ( + <> + +

    {lang(`${langPrefix1}PrivateLinkHelp`)}

    + + + {lang('RevokeLink')} + + + + ) : ( + + )} +
    + ) : ( +
    + +

    + {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)} +

    +
    + )} +
    + + {isLoading ? ( + + ) : ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId)!; + const { isUsernameAvailable } = selectManagement(global, chatId)!; + + return { + chat, + isChannel: isChatChannel(chat), + progress: global.management.progress, + isUsernameAvailable, + }; + }, + (setGlobal, actions) => pick(actions, [ + 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink', + ]), +)(ManageChatPrivacyType)); diff --git a/src/components/right/management/ManageDiscussion.tsx b/src/components/right/management/ManageDiscussion.tsx new file mode 100644 index 000000000..053a820e2 --- /dev/null +++ b/src/components/right/management/ManageDiscussion.tsx @@ -0,0 +1,272 @@ +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat } from '../../../api/types'; +import { ManagementScreens } from '../../../types'; + +import { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config'; +import { selectChat } from '../../../modules/selectors'; +import { pick } from '../../../util/iteratees'; +import getAnimationData from '../../common/helpers/animatedAssets'; +import useLang from '../../../hooks/useLang'; + +import ListItem from '../../ui/ListItem'; +import NothingFound from '../../common/NothingFound'; +import GroupChatInfo from '../../common/GroupChatInfo'; +import AnimatedSticker from '../../common/AnimatedSticker'; +import ConfirmDialog from '../../ui/ConfirmDialog'; +import useFlag from '../../../hooks/useFlag'; +import renderText from '../../common/helpers/renderText'; +import Avatar from '../../common/Avatar'; +import { isChatChannel } from '../../../modules/helpers'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; +}; + +type StateProps = { + chat?: ApiChat; + chatsByIds: Record; + linkedChat?: ApiChat; + forDiscussionIds?: number[]; + isChannel?: boolean; +}; + +type DispatchProps = Pick; + +const ManageDiscussion: FC = ({ + chat, + chatId, + chatsByIds, + linkedChat, + forDiscussionIds, + isChannel, + onScreenSelect, + loadGroupsForDiscussion, + linkDiscussionGroup, + unlinkDiscussionGroup, +}) => { + const [linkedGroupId, setLinkedGroupId] = useState(); + const [animationData, setAnimationData] = useState>(); + const [isAnimationLoaded, setIsAnimationLoaded] = useState(false); + const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []); + const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag(); + const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag(); + const lang = useLang(); + const linkedChatId = linkedChat && linkedChat.id; + + useEffect(() => { + loadGroupsForDiscussion(); + }, [loadGroupsForDiscussion]); + + useEffect(() => { + if (!animationData) { + getAnimationData('DiscussionGroups').then(setAnimationData); + } + }, [animationData]); + + const handleUnlinkGroupSessions = useCallback(() => { + closeConfirmUnlinkGroupDialog(); + unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId }); + if (!isChannel) { + onScreenSelect(ManagementScreens.Initial); + } + }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]); + + const handleLinkGroupSessions = useCallback(() => { + closeConfirmLinkGroupDialog(); + linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId }); + }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]); + + const onDiscussionClick = (groupId: number) => { + setLinkedGroupId(groupId); + openConfirmLinkGroupDialog(); + }; + + function renderUnlinkGroupHeader() { + return ( +
    + +
    + {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')} +
    +
    + ); + } + function renderLinkGroupHeader() { + const linkedGroup = chatsByIds[linkedGroupId]; + + if (!linkedGroup) { + return undefined; + } + + return ( +
    + +
    + {lang('Channel.DiscussionGroup.LinkGroup')} +
    +
    + ); + } + + function renderLinkGroupConfirmText() { + const linkedGroup = chatsByIds[linkedGroupId]; + + if (!linkedGroup) { + return undefined; + } + + if (linkedGroup.hasPrivateLink) { + return renderText( + `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`, + ['br', 'simple_markdown'], + ); + // return renderText( + // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title), + // ['br', 'simple_markdown'], + // ); + } + + return renderText( + // eslint-disable-next-line max-len + `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\n\nAnyone from the channel will be able to see messages in this group.`, + ['br', 'simple_markdown'], + ); + // return renderText( + // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title), + // ['br', 'simple_markdown'], + // ); + } + + function renderLinkedGroup() { + return ( +
    + + + + + {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')} + + +
    + ); + } + + function renderDiscussionGroups() { + return ( +
    +

    {lang('DiscussionChannelHelp')}

    + +
    + + {lang('DiscussionCreateGroup')} + + {forDiscussionIds ? ( + forDiscussionIds.map((id, i) => ( + { onDiscussionClick(id); }} + > + + + )) + ) : ( + + )} +
    +

    {lang('DiscussionChannelHelp2')}

    + +
    + ); + } + + return ( +
    +
    +
    +
    + {animationData && ( + + )} +
    + {linkedChat && renderLinkedGroup()} + {!linkedChat && renderDiscussionGroups()} +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const { forDiscussionIds, byId: chatsByIds } = global.chats; + const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId + ? selectChat(global, chat.fullInfo.linkedChatId) + : undefined; + + return { + chat, + chatsByIds, + forDiscussionIds, + linkedChat, + isChannel: chat && isChatChannel(chat), + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup', + ]), +)(ManageDiscussion)); diff --git a/src/components/right/management/ManageGroup.tsx b/src/components/right/management/ManageGroup.tsx new file mode 100644 index 000000000..60e0bffd5 --- /dev/null +++ b/src/components/right/management/ManageGroup.tsx @@ -0,0 +1,322 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ManagementScreens, ManagementProgress } from '../../../types'; +import { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { getChatAvatarHash, isChatBasicGroup } from '../../../modules/helpers'; +import useMedia from '../../../hooks/useMedia'; +import useLang from '../../../hooks/useLang'; +import useFlag from '../../../hooks/useFlag'; +import { selectChat } from '../../../modules/selectors'; +import { formatInteger } from '../../../util/textFormat'; +import { pick } from '../../../util/iteratees'; +import renderText from '../../common/helpers/renderText'; + +import AvatarEditable from '../../ui/AvatarEditable'; +import InputText from '../../ui/InputText'; +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import Spinner from '../../ui/Spinner'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +import './Management.scss'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; +}; + +type StateProps = { + chat: ApiChat; + progress?: ManagementProgress; + isBasicGroup: boolean; + hasLinkedChannel: boolean; +}; + +type DispatchProps = Pick; + +const GROUP_TITLE_EMPTY = 'Group title can\'t be empty'; + +// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen, +// so we need to define the amount manually +const TOTAL_PERMISSIONS_COUNT = 8; + +const ManageGroup: FC = ({ + chatId, + chat, + progress, + isBasicGroup, + hasLinkedChannel, + onScreenSelect, + togglePreHistoryHidden, + updateChat, + deleteHistory, + leaveChannel, + deleteChannel, + closeManagement, + openChat, +}) => { + const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag(); + const currentTitle = chat.title; + const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : ''; + + const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false); + const [title, setTitle] = useState(currentTitle); + const [about, setAbout] = useState(currentAbout); + const [photo, setPhoto] = useState(); + const [error, setError] = useState(); + const imageHash = getChatAvatarHash(chat); + const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl); + const lang = useLang(); + + useEffect(() => { + if (progress === ManagementProgress.Complete) { + setIsProfileFieldsTouched(false); + setError(undefined); + } + }, [progress]); + + const handleClickEditType = useCallback(() => { + onScreenSelect(ManagementScreens.ChatPrivacyType); + }, [onScreenSelect]); + + const handleClickDiscussion = useCallback(() => { + onScreenSelect(ManagementScreens.Discussion); + }, [onScreenSelect]); + + const handleClickPermissions = useCallback(() => { + onScreenSelect(ManagementScreens.GroupPermissions); + }, [onScreenSelect]); + + const handleClickAdministrators = useCallback(() => { + onScreenSelect(ManagementScreens.ChatAdministrators); + }, [onScreenSelect]); + + const handleSetPhoto = useCallback((file: File) => { + setPhoto(file); + setIsProfileFieldsTouched(true); + }, []); + + const handleTitleChange = useCallback((e: ChangeEvent) => { + setTitle(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleAboutChange = useCallback((e: ChangeEvent) => { + setAbout(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleUpdateGroup = useCallback(() => { + const trimmedTitle = title.trim(); + const trimmedAbout = about.trim(); + + if (!trimmedTitle.length) { + setError(GROUP_TITLE_EMPTY); + return; + } + + updateChat({ + chatId, + title: trimmedTitle, + about: trimmedAbout, + photo, + }); + }, [about, chatId, photo, title, updateChat]); + + const handleClickMembers = useCallback(() => { + onScreenSelect(ManagementScreens.GroupMembers); + }, [onScreenSelect]); + + const handleTogglePreHistory = useCallback(() => { + if (!chat.fullInfo) { + return; + } + + const { isPreHistoryHidden } = chat.fullInfo; + + togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden }); + }, [chat, togglePreHistoryHidden]); + + const enabledPermissionsCount = useMemo(() => { + if (!chat.defaultBannedRights) { + return 0; + } + + let totalCount = [ + 'sendMessages', + 'sendMedia', + 'embedLinks', + 'sendPolls', + 'changeInfo', + 'inviteUsers', + 'pinMessages', + ].filter( + (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights], + ).length; + + const { sendStickers, sendGifs } = chat.defaultBannedRights; + + // These two rights are controlled with a single checkbox + if (!sendStickers && !sendGifs) { + totalCount += 1; + } + + return totalCount; + }, [chat]); + + const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0; + + const handleDeleteGroup = useCallback(() => { + if (isBasicGroup) { + deleteHistory({ chatId: chat.id, maxId: chat.lastMessage!.id, shouldDeleteForAll: false }); + } else if (!chat.isCreator) { + leaveChannel({ chatId: chat.id }); + } else { + deleteChannel({ chatId: chat.id }); + } + closeDeleteDialog(); + closeManagement(); + openChat({ id: undefined }); + }, [ + isBasicGroup, chat.isCreator, chat.id, chat.lastMessage, + closeDeleteDialog, closeManagement, deleteHistory, leaveChannel, deleteChannel, openChat, + ]); + + if (chat.isRestricted) { + return undefined; + } + + const isLoading = progress === ManagementProgress.InProgress; + + return ( +
    +
    +
    + + + + {chat.isCreator && ( + +
    + {lang('GroupType')} + {chat.username ? lang('TypePublic') : lang('TypePrivate')} +
    +
    + )} + {hasLinkedChannel && ( + +
    + {lang('LinkedChannel')} + {lang('DiscussionUnlink')} +
    +
    + )} + +
    + {lang('ChannelPermissions')} + {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT} +
    +
    + +
    + {lang('ChannelAdministrators')} + {formatInteger(adminsCount)} +
    +
    +
    +
    + +
    + {lang('GroupMembers')} + {formatInteger(chat.membersCount!)} +
    +
    + + {chat.fullInfo && ( +
    + +
    + )} +
    +
    + + {lang('DeleteMega')} + +
    +
    + + {isLoading ? ( + + ) : ( + + )} + + +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId)!; + const { progress } = global.management; + const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId); + + return { + chat, + progress, + isBasicGroup: isChatBasicGroup(chat), + hasLinkedChannel, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'togglePreHistoryHidden', 'updateChat', 'closeManagement', + 'deleteHistory', 'leaveChannel', 'deleteChannel', 'openChat', + ]), +)(ManageGroup)); diff --git a/src/components/right/management/ManageGroupAdminRights.tsx b/src/components/right/management/ManageGroupAdminRights.tsx new file mode 100644 index 000000000..030927aa2 --- /dev/null +++ b/src/components/right/management/ManageGroupAdminRights.tsx @@ -0,0 +1,347 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types'; +import { ManagementScreens } from '../../../types'; +import { GlobalActions } from '../../../global/types'; + +import { pick } from '../../../util/iteratees'; +import { selectChat } from '../../../modules/selectors'; +import { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers'; +import useLang from '../../../hooks/useLang'; +import useFlag from '../../../hooks/useFlag'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import ConfirmDialog from '../../ui/ConfirmDialog'; +import InputText from '../../ui/InputText'; + +type OwnProps = { + chatId: number; + selectedChatMemberId?: number; + isPromotedByCurrentUser?: boolean; + onScreenSelect: (screen: ManagementScreens) => void; +}; + +type StateProps = { + chat: ApiChat; + usersById: Record; + currentUserId?: number; + isChannel: boolean; + isFormFullyDisabled: boolean; +}; + +type DispatchProps = Pick; + +const CUSTOM_TITLE_MAX_LENGTH = 16; + +const ManageGroupAdminRights: FC = ({ + selectedChatMemberId, + onScreenSelect, + chat, + usersById, + currentUserId, + isChannel, + isFormFullyDisabled, + updateChatAdmin, +}) => { + const [permissions, setPermissions] = useState({}); + const [isTouched, setIsTouched] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag(); + const [customTitle, setCustomTitle] = useState(''); + const lang = useLang(); + + const selectedChatMember = useMemo(() => { + if (!chat.fullInfo || !chat.fullInfo.adminMembers) { + return undefined; + } + + return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId); + }, [chat, selectedChatMemberId]); + + useEffect(() => { + if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) { + onScreenSelect(ManagementScreens.ChatAdministrators); + } + }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]); + + useEffect(() => { + setPermissions((selectedChatMember && selectedChatMember.adminRights) || {}); + setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH)); + setIsTouched(false); + setIsLoading(false); + }, [selectedChatMember]); + + const handlePermissionChange = useCallback((e: React.ChangeEvent) => { + const { name } = e.target; + + function getUpdatedPermissionValue(value: true | undefined) { + return value ? undefined : true; + } + + setPermissions((p) => ({ + ...p, + [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]), + })); + setIsTouched(true); + }, []); + + const handleSavePermissions = useCallback(() => { + if (!selectedChatMemberId) { + return; + } + + setIsLoading(true); + updateChatAdmin({ + chatId: chat.id, + userId: selectedChatMemberId, + adminRights: permissions, + customTitle, + }); + }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]); + + const handleDismissAdmin = useCallback(() => { + if (!selectedChatMemberId) { + return; + } + + updateChatAdmin({ + chatId: chat.id, + userId: selectedChatMemberId, + adminRights: {}, + }); + closeDismissConfirmationDialog(); + }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]); + + const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => { + if (isChatBasicGroup(chat)) { + return false; + } + + if (isFormFullyDisabled || !chat.adminRights) { + return true; + } + + return !chat.adminRights![key]; + }, [chat, isFormFullyDisabled]); + + const memberStatus = useMemo(() => { + if (!selectedChatMember) { + return undefined; + } + + if (selectedChatMember.isOwner) { + return lang('ChannelCreator'); + } + + const promotedByUser = selectedChatMember.promotedByUserId + ? usersById[selectedChatMember.promotedByUserId] + : undefined; + + if (promotedByUser) { + return lang('EditAdminPromotedBy', getUserFullName(promotedByUser)); + } + + return lang('ChannelAdmin'); + }, [selectedChatMember, usersById, lang]); + + const handleCustomTitleChange = useCallback((e) => { + const { value } = e.target; + setCustomTitle(value); + setIsTouched(true); + }, []); + + if (!selectedChatMember) { + return undefined; + } + + return ( +
    +
    +
    + + + + +

    {lang('EditAdminWhatCanDo')}

    + +
    + +
    + {isChannel && ( +
    + +
    + )} + {isChannel && ( +
    + +
    + )} +
    + +
    + {!isChannel && ( +
    + +
    + )} +
    + +
    + {!isChannel && ( +
    + +
    + )} +
    + +
    + {!isChannel && ( +
    + +
    + )} + + {isFormFullyDisabled && ( +

    + {lang('Channel.EditAdmin.CannotEdit')} +

    + )} + + {!isChannel && ( + + )} + + {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && ( + + {lang('EditAdminRemoveAdmin')} + + )} +
    +
    + + + {isLoading ? ( + + ) : ( + + )} + + + +
    + ); +}; + + +export default memo(withGlobal( + (global, { chatId, isPromotedByCurrentUser }): StateProps => { + const chat = selectChat(global, chatId)!; + const { byId: usersById } = global.users; + const { currentUserId } = global; + const isChannel = isChatChannel(chat); + const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser); + + return { + chat, + usersById, + currentUserId, + isChannel, + isFormFullyDisabled, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']), +)(ManageGroupAdminRights)); diff --git a/src/components/right/management/ManageGroupMembers.tsx b/src/components/right/management/ManageGroupMembers.tsx new file mode 100644 index 000000000..c2392efd9 --- /dev/null +++ b/src/components/right/management/ManageGroupMembers.tsx @@ -0,0 +1,90 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChatMember, ApiUser } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; +import { selectChat } from '../../../modules/selectors'; +import { getSortedUserIds, isChatChannel } from '../../../modules/helpers'; +import { pick } from '../../../util/iteratees'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import NothingFound from '../../common/NothingFound'; +import ListItem from '../../ui/ListItem'; + +type OwnProps = { + chatId: number; +}; + +type StateProps = { + usersById: Record; + members?: ApiChatMember[]; + isChannel?: boolean; +}; + +type DispatchProps = Pick; + +const ManageGroupMembers: FC = ({ + members, + usersById, + isChannel, + openUserInfo, +}) => { + const memberIds = useMemo(() => { + if (!members || !usersById) { + return undefined; + } + + return getSortedUserIds(members.map(({ userId }) => userId), usersById); + }, [members, usersById]); + + const handleMemberClick = useCallback((id: number) => { + openUserInfo({ id }); + }, [openUserInfo]); + + return ( +
    +
    +
    + {memberIds ? ( + memberIds.map((id, i) => ( + handleMemberClick(id)} + > + + + )) + ) : ( + + )} +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const { byId: usersById } = global.users; + const members = chat && chat.fullInfo && chat.fullInfo.members; + const isChannel = chat && isChatChannel(chat); + + return { + members, + usersById, + isChannel, + }; + }, + (setGlobal, actions): DispatchProps => pick(actions, [ + 'openUserInfo', + ]), +)(ManageGroupMembers)); diff --git a/src/components/right/management/ManageGroupPermissions.tsx b/src/components/right/management/ManageGroupPermissions.tsx new file mode 100644 index 000000000..6cd8ff100 --- /dev/null +++ b/src/components/right/management/ManageGroupPermissions.tsx @@ -0,0 +1,301 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ManagementScreens } from '../../../types'; +import { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import useLang from '../../../hooks/useLang'; +import { selectChat } from '../../../modules/selectors'; +import { pick } from '../../../util/iteratees'; + +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; + onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void; +}; + +type StateProps = { + chat?: ApiChat; + currentUserId?: number; +}; + +type DispatchProps = Pick; + +const FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250; + +function getLangKeyForBannedRightKey(key: string) { + switch (key) { + case 'sendMessages': + return 'UserRestrictionsNoSend'; + case 'sendMedia': + return 'UserRestrictionsNoSendMedia'; + case 'sendStickers': + return 'UserRestrictionsNoSendStickers'; + case 'embedLinks': + return 'UserRestrictionsNoEmbedLinks'; + case 'sendPolls': + return 'UserRestrictionsNoSendPolls'; + case 'changeInfo': + return 'UserRestrictionsNoChangeInfo'; + case 'inviteUsers': + return 'UserRestrictionsInviteUsers'; + case 'pinMessages': + return 'UserRestrictionsPinMessages'; + default: + return undefined; + } +} + +const ManageGroupPermissions: FC = ({ + onScreenSelect, + onChatMemberSelect, + chat, + currentUserId, + updateChatDefaultBannedRights, +}) => { + const [permissions, setPermissions] = useState({}); + const [havePermissionChanged, setHavePermissionChanged] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const lang = useLang(); + + const handleRemovedUsersClick = useCallback(() => { + onScreenSelect(ManagementScreens.GroupRemovedUsers); + }, [onScreenSelect]); + + const handleAddExceptionClick = useCallback(() => { + onScreenSelect(ManagementScreens.GroupUserPermissionsCreate); + }, [onScreenSelect]); + + const handleExceptionMemberClick = useCallback((member: ApiChatMember) => { + onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId); + onScreenSelect(ManagementScreens.GroupUserPermissions); + }, [currentUserId, onChatMemberSelect, onScreenSelect]); + + useEffect(() => { + setPermissions((chat && chat.defaultBannedRights) || {}); + setHavePermissionChanged(false); + setTimeout(() => { + setIsLoading(false); + }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS); + }, [chat]); + + const handlePermissionChange = useCallback((e: React.ChangeEvent) => { + const { name } = e.target; + + function getUpdatedPermissionValue(value: true | undefined) { + return value ? undefined : true; + } + + setPermissions((p) => ({ + ...p, + [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]), + ...(name === 'sendStickers' && { + sendGifs: getUpdatedPermissionValue(p[name]), + }), + })); + setHavePermissionChanged(true); + }, []); + + const handleSavePermissions = useCallback(() => { + if (!chat) { + return; + } + + setIsLoading(true); + updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions }); + }, [chat, permissions, updateChatDefaultBannedRights]); + + const removedUsersCount = useMemo(() => { + if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) { + return 0; + } + + return chat.fullInfo.kickedMembers.length; + }, [chat]); + + const exceptionMembers = useMemo(() => { + if (!chat || !chat.fullInfo || !chat.fullInfo.members) { + return []; + } + + return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights); + }, [chat]); + + const getMemberExceptions = useCallback((member: ApiChatMember) => { + const { bannedRights } = member; + if (!bannedRights || !chat) { + return undefined; + } + + const { defaultBannedRights } = chat; + + return Object.keys(bannedRights).reduce((result, key) => { + if ( + !bannedRights[key as keyof ApiChatBannedRights] + || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights]) + || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames' + ) { + return result; + } + + const langKey = getLangKeyForBannedRightKey(key); + + if (!langKey) { + return result; + } + + const translatedString = lang(langKey); + + return `${result}${!result.length ? translatedString : `, ${translatedString}`}`; + }, ''); + }, [chat, lang]); + + return ( +
    +
    +
    +

    {lang('ChannelPermissionsHeader')}

    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + {lang('ChannelBlockedUsers')} + {removedUsersCount} +
    +
    +
    + +
    +

    {lang('PrivacyExceptions')}

    + + + {lang('ChannelAddException')} + + + {exceptionMembers.map((member) => ( + handleExceptionMemberClick(member)} + > + + + ))} +
    +
    + + + {isLoading ? ( + + ) : ( + + )} + +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + + return { chat, currentUserId: global.currentUserId }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']), +)(ManageGroupPermissions)); diff --git a/src/components/right/management/ManageGroupRecentActions.tsx b/src/components/right/management/ManageGroupRecentActions.tsx new file mode 100644 index 000000000..c2fc7bb4a --- /dev/null +++ b/src/components/right/management/ManageGroupRecentActions.tsx @@ -0,0 +1,152 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiChatMember } from '../../../api/types'; +import useLang from '../../../hooks/useLang'; +import { selectChat } from '../../../modules/selectors'; + +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; + +type OwnProps = { + chatId: number; +}; + +type StateProps = { + chat?: ApiChat; +}; + +const ManageGroupRecentActions: FC = ({ chat }) => { + const lang = useLang(); + + const adminMembers = useMemo(() => { + if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) { + return []; + } + + return chat.fullInfo.adminMembers.sort((a, b) => { + if (a.isOwner) { + return -1; + } else if (b.isOwner) { + return 1; + } + + return 0; + }); + }, [chat]); + + const getMemberStatus = useCallback((member: ApiChatMember) => { + if (member.isOwner) { + return lang('ChannelCreator'); + } + + return lang('ChannelAdmin'); + }, [lang]); + + return ( +
    +
    +
    +

    Actions

    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +

    Admins

    + +
    + +
    + + {adminMembers.map((member) => ( + + + + + ))} +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + + return { chat }; + }, +)(ManageGroupRecentActions)); diff --git a/src/components/right/management/ManageGroupRemovedUsers.tsx b/src/components/right/management/ManageGroupRemovedUsers.tsx new file mode 100644 index 000000000..2e1573016 --- /dev/null +++ b/src/components/right/management/ManageGroupRemovedUsers.tsx @@ -0,0 +1,106 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiChatMember, ApiUser } from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { selectChat } from '../../../modules/selectors'; +import { getUserFullName } from '../../../modules/helpers'; +import { pick } from '../../../util/iteratees'; +import useLang from '../../../hooks/useLang'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import ListItem from '../../ui/ListItem'; + +type OwnProps = { + chatId: number; +}; + +type StateProps = { + chat?: ApiChat; + usersById: Record; +}; + +type DispatchProps = Pick; + +const ManageGroupRemovedUsers: FC = ({ + chat, + usersById, + updateChatMemberBannedRights, +}) => { + const lang = useLang(); + + const removedMembers = useMemo(() => { + if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) { + return []; + } + + return chat.fullInfo.kickedMembers; + }, [chat]); + + const getRemovedBy = useCallback((member: ApiChatMember) => { + if (!member.kickedByUserId) { + return undefined; + } + + const kickedByUser = usersById[member.kickedByUserId]; + if (!kickedByUser) { + return undefined; + } + + return lang('UserRemovedBy', getUserFullName(kickedByUser)); + }, [lang, usersById]); + + const getContextActions = useCallback((member: ApiChatMember) => { + if (!chat) { + return undefined; + } + + return [{ + title: lang('Unblock'), + icon: 'delete', + destructive: true, + handler: () => updateChatMemberBannedRights({ + chatId: chat.id, + userId: member.userId, + bannedRights: {}, + }), + }]; + }, [lang, chat, updateChatMemberBannedRights]); + + return ( +
    +
    +
    +

    {lang('NoBlockedGroup2')}

    + + {removedMembers.map((member) => ( + + + + ))} +
    +
    +
    + ); +}; + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const { byId: usersById } = global.users; + + return { chat, usersById }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']), +)(ManageGroupRemovedUsers)); diff --git a/src/components/right/management/ManageGroupUserPermissions.tsx b/src/components/right/management/ManageGroupUserPermissions.tsx new file mode 100644 index 000000000..4abe039c0 --- /dev/null +++ b/src/components/right/management/ManageGroupUserPermissions.tsx @@ -0,0 +1,264 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChat, ApiChatBannedRights } from '../../../api/types'; +import { ManagementScreens } from '../../../types'; +import { GlobalActions } from '../../../global/types'; + +import { pick } from '../../../util/iteratees'; +import { selectChat } from '../../../modules/selectors'; +import useLang from '../../../hooks/useLang'; +import useFlag from '../../../hooks/useFlag'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +type OwnProps = { + chatId: number; + selectedChatMemberId?: number; + isPromotedByCurrentUser?: boolean; + onScreenSelect: (screen: ManagementScreens) => void; +}; + +type StateProps = { + chat?: ApiChat; + isFormFullyDisabled?: boolean; +}; + +type DispatchProps = Pick; + +const ManageGroupUserPermissions: FC = ({ + chat, + selectedChatMemberId, + onScreenSelect, + updateChatMemberBannedRights, + isFormFullyDisabled, +}) => { + const [permissions, setPermissions] = useState({}); + const [havePermissionChanged, setHavePermissionChanged] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag(); + const lang = useLang(); + + const selectedChatMember = useMemo(() => { + if (!chat || !chat.fullInfo || !chat.fullInfo.members) { + return undefined; + } + + return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId); + }, [chat, selectedChatMemberId]); + + useEffect(() => { + if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) { + onScreenSelect(ManagementScreens.GroupPermissions); + } + }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]); + + useEffect(() => { + setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {}); + setHavePermissionChanged(false); + setIsLoading(false); + }, [chat, selectedChatMember]); + + const handlePermissionChange = useCallback((e: React.ChangeEvent) => { + const { name } = e.target; + + function getUpdatedPermissionValue(value: true | undefined) { + return value ? undefined : true; + } + + setPermissions((p) => ({ + ...p, + [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]), + ...(name === 'sendStickers' && { + sendGifs: getUpdatedPermissionValue(p[name]), + }), + })); + setHavePermissionChanged(true); + }, []); + + const handleSavePermissions = useCallback(() => { + if (!chat || !selectedChatMemberId) { + return; + } + + setIsLoading(true); + updateChatMemberBannedRights({ + chatId: chat.id, + userId: selectedChatMemberId, + bannedRights: permissions, + }); + }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]); + + const handleBanFromGroup = useCallback(() => { + if (!chat || !selectedChatMemberId) { + return; + } + + updateChatMemberBannedRights({ + chatId: chat.id, + userId: selectedChatMemberId, + bannedRights: { + viewMessages: true, + }, + }); + }, [chat, selectedChatMemberId, updateChatMemberBannedRights]); + + const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => { + if (isFormFullyDisabled) { + return true; + } + + if (!chat || !chat.defaultBannedRights) { + return false; + } + + return chat.defaultBannedRights[key]; + }, [chat, isFormFullyDisabled]); + + if (!selectedChatMember) { + return undefined; + } + + return ( +
    +
    +
    + + + + +

    {lang('UserRestrictionsCanDo')}

    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + {!isFormFullyDisabled && ( +
    + + {lang('UserRestrictionsBlock')} + +
    + )} +
    + + + {isLoading ? ( + + ) : ( + + )} + + + +
    + ); +}; + + +export default memo(withGlobal( + (global, { chatId, isPromotedByCurrentUser }): StateProps => { + const chat = selectChat(global, chatId)!; + const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser); + + return { chat, isFormFullyDisabled }; + }, + (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']), +)(ManageGroupUserPermissions)); diff --git a/src/components/right/management/ManageGroupUserPermissionsCreate.tsx b/src/components/right/management/ManageGroupUserPermissionsCreate.tsx new file mode 100644 index 000000000..5aa47ec51 --- /dev/null +++ b/src/components/right/management/ManageGroupUserPermissionsCreate.tsx @@ -0,0 +1,90 @@ +import React, { + FC, memo, useCallback, useMemo, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ApiChatMember, ApiUser } from '../../../api/types'; +import { ManagementScreens } from '../../../types'; + +import { selectChat } from '../../../modules/selectors'; +import { getSortedUserIds, isChatChannel } from '../../../modules/helpers'; + +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import ListItem from '../../ui/ListItem'; +import NothingFound from '../../common/NothingFound'; + +type OwnProps = { + chatId: number; + onScreenSelect: (screen: ManagementScreens) => void; + onChatMemberSelect: (memberId: number) => void; +}; + +type StateProps = { + usersById: Record; + members?: ApiChatMember[]; + isChannel?: boolean; +}; + +const ManageGroupUserPermissionsCreate: FC = ({ + usersById, + members, + isChannel, + onScreenSelect, + onChatMemberSelect, +}) => { + const memberIds = useMemo(() => { + if (!members || !usersById) { + return undefined; + } + + return getSortedUserIds(members.filter((member) => !member.isOwner).map(({ userId }) => userId), usersById); + }, [members, usersById]); + + const handleExceptionMemberClick = useCallback((memberId: number) => { + onChatMemberSelect(memberId); + onScreenSelect(ManagementScreens.GroupUserPermissions); + }, [onChatMemberSelect, onScreenSelect]); + + return ( +
    +
    +
    + {memberIds ? ( + memberIds.map((id, i) => ( + handleExceptionMemberClick(id)} + > + + + )) + ) : ( + + )} +
    +
    +
    + ); +}; + + +export default memo(withGlobal( + (global, { chatId }): StateProps => { + const chat = selectChat(global, chatId); + const { byId: usersById } = global.users; + const members = chat && chat.fullInfo && chat.fullInfo.members; + const isChannel = chat && isChatChannel(chat); + + return { + members, + usersById, + isChannel, + }; + }, +)(ManageGroupUserPermissionsCreate)); diff --git a/src/components/right/management/ManageUser.tsx b/src/components/right/management/ManageUser.tsx new file mode 100644 index 000000000..629340791 --- /dev/null +++ b/src/components/right/management/ManageUser.tsx @@ -0,0 +1,215 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, memo, useCallback, useEffect, useState, +} from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { ApiChat, ApiUser } from '../../../api/types'; +import { ManagementProgress } from '../../../types'; + +import { pick } from '../../../util/iteratees'; +import { selectChat, selectUser } from '../../../modules/selectors'; +import useFlag from '../../../hooks/useFlag'; +import useLang from '../../../hooks/useLang'; + +import InputText from '../../ui/InputText'; +import ListItem from '../../ui/ListItem'; +import Checkbox from '../../ui/Checkbox'; +import FloatingActionButton from '../../ui/FloatingActionButton'; +import Spinner from '../../ui/Spinner'; +import PrivateChatInfo from '../../common/PrivateChatInfo'; +import ConfirmDialog from '../../ui/ConfirmDialog'; + +import './Management.scss'; + +type OwnProps = { + userId: number; +}; + +type StateProps = { + user?: ApiUser; + chat: ApiChat; + progress?: ManagementProgress; +}; + +type DispatchProps = Pick; + +const ERROR_FIRST_NAME_MISSING = 'Please provide first name'; + +const ManageUser: FC = ({ + userId, + user, + chat, + progress, + updateContact, + deleteUser, + deleteHistory, + closeManagement, + openChat, +}) => { + const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag(); + const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false); + const [error, setError] = useState(); + const lang = useLang(); + + const currentFirstName = user ? (user.firstName || '') : ''; + const currentLastName = user ? (user.lastName || '') : ''; + const currentIsMuted = chat ? chat.isMuted : undefined; + + const [firstName, setFirstName] = useState(currentFirstName); + const [lastName, setLastName] = useState(currentLastName); + const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!currentIsMuted); + + useEffect(() => { + setIsNotificationsEnabled(!currentIsMuted); + }, [currentIsMuted]); + + useEffect(() => { + setIsProfileFieldsTouched(false); + closeDeleteDialog(); + }, [closeDeleteDialog, userId]); + + useEffect(() => { + setFirstName(currentFirstName); + setLastName(currentLastName); + }, [currentFirstName, currentLastName, user]); + + useEffect(() => { + if (progress === ManagementProgress.Complete) { + setIsProfileFieldsTouched(false); + setError(undefined); + closeDeleteDialog(); + } + }, [closeDeleteDialog, progress]); + + const handleFirstNameChange = useCallback((e: ChangeEvent) => { + setFirstName(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleLastNameChange = useCallback((e: ChangeEvent) => { + setLastName(e.target.value); + setIsProfileFieldsTouched(true); + }, []); + + const handleNotificationChange = useCallback((e: ChangeEvent) => { + setIsNotificationsEnabled(e.target.checked); + setIsProfileFieldsTouched(true); + }, []); + + const handleProfileSave = useCallback(() => { + const trimmedFirstName = firstName.trim(); + const trimmedLastName = lastName.trim(); + + if (!trimmedFirstName.length) { + setError(ERROR_FIRST_NAME_MISSING); + } + + updateContact({ + userId, + isMuted: !isNotificationsEnabled, + firstName: trimmedFirstName, + lastName: trimmedLastName, + }); + }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]); + + const handleDeleteContact = useCallback(() => { + if (chat.lastMessage) { + deleteHistory({ + chatId: chat.id, + maxId: chat.lastMessage!.id, + shouldDeleteForAll: false, + }); + } + deleteUser({ userId }); + closeDeleteDialog(); + closeManagement(); + openChat({ id: undefined }); + }, [chat.id, chat.lastMessage, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]); + + if (!user) { + return undefined; + } + + const isLoading = progress === ManagementProgress.InProgress; + + return ( +
    +
    +
    + + + +
    + +
    +
    +
    + + {lang('DeleteContact')} + +
    +
    + + {isLoading ? ( + + ) : ( + + )} + + +
    + ); +}; + +export default memo(withGlobal( + (global, { userId }): StateProps => { + const user = selectUser(global, userId); + const chat = selectChat(global, userId)!; + const { progress } = global.management; + + return { user, chat, progress }; + }, + (global, actions): DispatchProps => pick(actions, [ + 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory', + ]), +)(ManageUser)); diff --git a/src/components/right/management/Management.async.tsx b/src/components/right/management/Management.async.tsx new file mode 100644 index 000000000..5f70951e3 --- /dev/null +++ b/src/components/right/management/Management.async.tsx @@ -0,0 +1,17 @@ +import React, { FC } from '../../../lib/teact/teact'; +import { Bundles } from '../../../util/moduleLoader'; + +import { OwnProps } from './Management'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +import Loading from '../../ui/Loading'; + +const ManagementAsync: FC = (props) => { + const Management = useModuleLoader(Bundles.Extra, 'Management'); + + // eslint-disable-next-line react/jsx-props-no-spreading + return Management ? : ; +}; + +export default ManagementAsync; diff --git a/src/components/right/management/Management.scss b/src/components/right/management/Management.scss new file mode 100644 index 000000000..236d8fb19 --- /dev/null +++ b/src/components/right/management/Management.scss @@ -0,0 +1,140 @@ +.Management { + position: relative; + height: 100%; + + & > .custom-scroll { + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + } + + .section { + padding: 1rem 1.5rem; + border-top: 1px solid var(--color-borders); + + &.wide { + padding: 1.5rem; + } + + &:first-of-type { + border-top: none; + padding-top: 1rem; + } + + &.no-border { + border-top: none; + } + + > .ChatInfo { + margin: 0 0 2rem !important; + + .title h3 { + margin-bottom: 0; + } + } + + .section-icon { + width: 8.75rem; + height: 8.75rem; + margin: 0 auto 2rem; + position: relative; + + .AnimatedSticker { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + + &.hidden { + display: none + } + } + } + + .ListItem { + margin: 0 -.75rem; + + &:last-child { + margin-bottom: 0; + } + + .multiline-item .subtitle { + line-height: 1.25rem; + } + + &:not(.picker-list-item) .Checkbox { + margin-top: 2rem; + margin-bottom: 2rem; + } + + &.narrow { + .Checkbox { + margin-top: 1rem; + margin-bottom: 1rem; + } + } + + &.exceptions-member { + .ChatInfo .status { + white-space: pre-wrap; + } + } + } + + .section-heading { + font-weight: 500; + font-size: .9375rem; + color: var(--color-text-secondary); + } + + .section-help { + color: var(--color-text-secondary); + line-height: 1.375rem; + } + + .section-info { + color: var(--color-text-secondary); + font-size: .875rem; + } + } + + textarea.form-control { + height: auto; + } + + .group-link { + color: var(--color-text); + } + + .radio-group { + margin-top: 2rem; + + .Radio { + padding-left: 3.5rem; + margin-bottom: 2rem; + + &:last-child { + margin-bottom: .625rem; + } + } + + .Radio-main { + &::before { + left: 0.125rem; + top: .25rem; + transform: none; + } + + &::after { + left: 0.4375rem; + top: .5625rem; + transform: none; + } + } + } +} + +.ManageGroupMembers { + padding: 0.5rem 1rem; +} diff --git a/src/components/right/management/Management.tsx b/src/components/right/management/Management.tsx new file mode 100644 index 000000000..ad1531429 --- /dev/null +++ b/src/components/right/management/Management.tsx @@ -0,0 +1,148 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; +import { withGlobal } from '../../../lib/teact/teactn'; + +import { ManagementScreens, ManagementType } from '../../../types'; + +import { selectCurrentManagementType } from '../../../modules/selectors'; + +import ManageUser from './ManageUser'; +import ManageGroup from './ManageGroup'; +import ManageGroupPermissions from './ManageGroupPermissions'; +import ManageGroupRemovedUsers from './ManageGroupRemovedUsers'; +import ManageChannel from './ManageChannel'; +import ManageChatPrivacyType from './ManageChatPrivacyType'; +import ManageDiscussion from './ManageDiscussion'; +import ManageGroupUserPermissions from './ManageGroupUserPermissions'; +import ManageChatAdministrators from './ManageChatAdministrators'; +import ManageGroupRecentActions from './ManageGroupRecentActions'; +import ManageGroupAdminRights from './ManageGroupAdminRights'; +import ManageGroupMembers from './ManageGroupMembers'; +import ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate'; + +export type OwnProps = { + chatId: number; + currentScreen: ManagementScreens; + selectedChatMemberId?: number; + isPromotedByCurrentUser?: boolean; + onScreenSelect: (screen: ManagementScreens) => void; + onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void; +}; + +type StateProps = { + managementType?: ManagementType; +}; + +const Management: FC = ({ + chatId, + currentScreen, + selectedChatMemberId, + isPromotedByCurrentUser, + onScreenSelect, + onChatMemberSelect, + managementType, +}) => { + switch (currentScreen) { + case ManagementScreens.Initial: { + switch (managementType) { + case 'user': + return ; + case 'group': + return ; + case 'channel': + return ; + } + + break; + } + + case ManagementScreens.ChatPrivacyType: + return ( + + ); + + case ManagementScreens.Discussion: + return ( + + ); + + case ManagementScreens.GroupPermissions: + return ( + + ); + + case ManagementScreens.GroupRemovedUsers: + return ( + + ); + + case ManagementScreens.GroupUserPermissionsCreate: + return ( + + ); + + case ManagementScreens.GroupUserPermissions: + return ( + + ); + + case ManagementScreens.ChatAdministrators: + return ( + + ); + + case ManagementScreens.GroupRecentActions: + return ( + + ); + + case ManagementScreens.ChatAdminRights: + return ( + + ); + + case ManagementScreens.ChannelSubscribers: + case ManagementScreens.GroupMembers: + return ( + + ); + } + + return undefined; // Never reached +}; + +export default memo(withGlobal( + (global): StateProps => { + const managementType = selectCurrentManagementType(global); + + return { + managementType, + }; + }, +)(Management)); diff --git a/src/components/test/ErrorTest.tsx b/src/components/test/ErrorTest.tsx new file mode 100644 index 000000000..bbd7c3ad3 --- /dev/null +++ b/src/components/test/ErrorTest.tsx @@ -0,0 +1,44 @@ +import { FC } from '../../lib/teact/teact'; +import React, { withGlobal } from '../../lib/teact/teactn'; + +type OwnProps = { + parentRand: number; +}; + +type StateProps = { + globalRand: number; +}; + +const ErrorTest: FC = ({ parentRand, globalRand }) => { + // eslint-disable-next-line no-console + console.log('rendering `ErrorTest`'); + + if (!parentRand || parentRand > 0.8) { + throw new Error('test error render'); + } + + return ( +
    +

    + THIS IS `ErrorTest` Component +

    +
    +
    parent: {parentRand}
    +
    global: {globalRand}
    +
    +
    + ); +}; + +let firstRender = true; +export default withGlobal((): StateProps => { + const globalRand = Math.random(); + + if (firstRender || globalRand > 0.8) { + firstRender = false; + + throw new Error('test error `mapStateToProps`'); + } + + return { globalRand }; +})(ErrorTest); diff --git a/src/components/test/SubTest.tsx b/src/components/test/SubTest.tsx new file mode 100644 index 000000000..857353da3 --- /dev/null +++ b/src/components/test/SubTest.tsx @@ -0,0 +1,35 @@ +import { FC, useState } from '../../lib/teact/teact'; +import React from '../../lib/teact/teactn'; +import { ApiUpdateAuthorizationStateType } from '../../api/types'; + +type OwnProps = { + authState?: ApiUpdateAuthorizationStateType; + parentRand: number; +}; + +const SubTest: FC = ({ authState, parentRand }) => { + // eslint-disable-next-line no-console + console.log('rendering `SubTest`', authState, parentRand); + + const [value, setValue] = useState(0); + + return ( +
    +

    + THIS IS `SubTest` Component +

    +
    + authState: {authState}! +
    +
    + parentRand: {parentRand}! +
    +
    + state value: {value}! + setValue(value + 1)} value=" + " /> +
    +
    + ); +}; + +export default SubTest; diff --git a/src/components/test/Test.tsx b/src/components/test/Test.tsx new file mode 100644 index 000000000..8ef1ecfd5 --- /dev/null +++ b/src/components/test/Test.tsx @@ -0,0 +1,45 @@ +import React, { FC, useState } from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; +import { GlobalState } from '../../global/types'; + +import SubTest from './SubTest'; +import ErrorTest from './ErrorTest'; + +type StateProps = Pick & { + globalRand: number; +}; + +let lastTimeout: number | undefined; + +const Test: FC = ({ authState, globalRand }) => { + // eslint-disable-next-line no-console + console.log('rendering `Test`', authState, globalRand); + + const [ownRand, setOwnRand] = useState(0); + + if (lastTimeout) { + clearTimeout(lastTimeout); + lastTimeout = undefined; + } + + lastTimeout = window.setTimeout(() => { + setOwnRand(Math.random()); + }, 3000); + + return ( +
    +

    Test page

    + + +
    + ); +}; + +export default withGlobal( + (global): StateProps => { + return { + authState: global.authState, + globalRand: Math.random(), + }; + }, +)(Test); diff --git a/src/components/test/TestNoRedundancy.tsx b/src/components/test/TestNoRedundancy.tsx new file mode 100644 index 000000000..c1b2de233 --- /dev/null +++ b/src/components/test/TestNoRedundancy.tsx @@ -0,0 +1,93 @@ +import React, { FC } from '../../lib/teact/teact'; +import { getGlobal, setGlobal, withGlobal } from '../../lib/teact/teactn'; +import { GlobalState } from '../../global/types'; + +document.ondblclick = () => { + const value = Math.random(); + setGlobal({ + ...getGlobal(), + // @ts-ignore + bValue: value, + aValue: value, + }); +}; + +type AStateProps = Pick & { + aValue: number; +}; + +type BStateProps = Pick & { + bValue: number; + derivedAValue: number; +}; + +type BOwnProps = Pick & { + aValue: number; +}; + +const TestA: FC = ({ aValue }) => { + // eslint-disable-next-line no-console + console.log('!!! A MOUNT ', { aValue }); + + return ( +
    +

    A

    +
    + aValue = {aValue} +
    + +
    + ); +}; + +const TestB: FC = ({ bValue, aValue, derivedAValue }) => { + // eslint-disable-next-line no-console + console.log('!!! B MOUNT ', { bValue, aValue, derivedAValue }); + + return ( +
    +

    B

    +
    + bValue = {bValue} +
    +
    + aValue = {aValue} +
    +
    + derivedAValue = {derivedAValue} +
    + {bValue > 0.5 ? ( + Hello + ) : ( + World + )} +
    + ); +}; + + +const TestBContainer = withGlobal( + (global, { aValue }): BStateProps => { + // eslint-disable-next-line no-console + console.log('!!! B MAP', { aValue }); + + return { + // @ts-ignore + bValue: global.bValue, + derivedAValue: (aValue || 0) + 1, + }; + }, +)(TestB); + +export default withGlobal( + (global): AStateProps => { + // @ts-ignore + // eslint-disable-next-line no-console + console.log('!!! A MAP', { aValue: global.aValue }); + + return { + // @ts-ignore + aValue: global.aValue, + }; + }, +)(TestA); diff --git a/src/components/test/TestOrdered.tsx b/src/components/test/TestOrdered.tsx new file mode 100644 index 000000000..9000efbb8 --- /dev/null +++ b/src/components/test/TestOrdered.tsx @@ -0,0 +1,108 @@ +import { ChangeEvent } from 'react'; +import React, { FC, useRef, useState } from '../../lib/teact/teact'; + +const TestOrdered: FC<{}> = () => { + const [items, setItems] = useState>({ a: 1, b: 5, c: 10 }); + const [value, setValue] = useState(); + const [isDesc, setIsDesc] = useState(false); + + const insertData = (newValue: number) => { + const key = `key${Math.random()}`; + setItems((currentItems) => ( + { ...currentItems, [key]: newValue } + )); + setValue(undefined); + }; + + const updateData = (key: string, newValue: number) => { + setItems({ ...items, [key]: newValue }); + }; + + const deleteData = (key: string) => { + const newItems = { ...items }; + delete newItems[key]; + setItems(newItems); + }; + + const addSmalls = () => { + [-5, -10, -20].forEach(insertData); + }; + + const addBigs = () => { + [105, 110, 120].forEach(insertData); + }; + + const handleInputChange = (e: ChangeEvent) => { + setValue(Number(e.target.value)); + }; + + const handleDescChange = (e: ChangeEvent) => { + setIsDesc(e.target.checked); + }; + + const sortedItems = Object + .entries(items) + .sort(([, value1], [, value2]) => (isDesc ? value2 - value1 : value1 - value2)); + + return ( +
    +
    +

    + +

    +

    + + insertData(value || 0)} value="Insert Ordered" /> +

    +

    + + +

    +
    +
      + {sortedItems.map(([key, itemValue]) => ( + updateData(key, Number(newValue))} + onDelete={() => deleteData(key)} + /> + ))} +
    +
    + ); +}; + +function MyComponent({ + value, + onChange, + onDelete, +}: { + value: number; + onChange: (newValue: string) => void; + onDelete: NoneToVoidFunction; +}) { + const id = useRef(String(Math.random()).slice(-3)); + + const handleChange = (e: ChangeEvent) => { + onChange(e.target.value); + }; + + return ( + // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions +
  • + + + {id.current} +
  • + ); +} + +export default TestOrdered; diff --git a/src/components/test/TestPortal.tsx b/src/components/test/TestPortal.tsx new file mode 100644 index 000000000..d2b7076d3 --- /dev/null +++ b/src/components/test/TestPortal.tsx @@ -0,0 +1,42 @@ +import React, { FC, useState } from '../../lib/teact/teact'; + +import Portal from '../ui/Portal'; + +const StateChecker = () => { + const [value, setValue] = useState(0); + + return ( +
    + state value: {value}! + setValue(value + 1)} value=" + " /> +
    + ); +}; + +const TestPortal: FC = () => { + const [value, setValue] = useState(0); + const position = 100 + Math.round(Math.random() * 300); + + return ( +
    +

    Test normal

    +
    + state value: {value}! + setValue(value + 1)} value=" + " /> +
    + +
    +

    + Test portal +

    + +
    +
    +
    + ); +}; + +export default TestPortal; diff --git a/src/components/test/testTick.tsx b/src/components/test/testTick.tsx new file mode 100644 index 000000000..b8797c53f --- /dev/null +++ b/src/components/test/testTick.tsx @@ -0,0 +1,14 @@ +import React from '../../lib/teact/teact'; +import TeactDOM from '../../lib/teact/teact-dom'; + +function tick() { + const element = ( +
    +

    Hello, world!

    +

    It is {new Date().toLocaleTimeString()}.

    +
    + ); + TeactDOM.render(element, document.getElementById('root')); +} + +setInterval(tick, 1000); diff --git a/src/components/ui/AvatarEditable.scss b/src/components/ui/AvatarEditable.scss new file mode 100644 index 000000000..a7b5a1d07 --- /dev/null +++ b/src/components/ui/AvatarEditable.scss @@ -0,0 +1,76 @@ +@import '../../styles/mixins'; + +.AvatarEditable { + label { + margin-left: auto; + margin-right: auto; + width: 7.5rem; + height: 7.5rem; + margin-bottom: 2rem; + display: flex !important; + align-items: center; + justify-content: center; + background-color: var(--color-primary); + border-radius: 50%; + color: white; + font-size: 3rem; + cursor: pointer; + position: relative; + overflow: hidden; + outline: none !important; + + input { + display: none; + } + + img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + i { + transform: scale(1); + transition: transform .15s linear; + z-index: var(--z-register-add-avatar); + } + + // @optimization The weirdest workaround for screen animation lag + @include while-transition() { + input, i, &::after { + display: none !important; + } + + img { + position: static !important; + } + } + + &:hover { + i { + transform: scale(1.2); + } + } + + &.filled { + background-color: white; + + &::after { + content: ''; + display: block; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(black, 0.4); + } + } + + &.disabled { + pointer-events: none; + } + } +} diff --git a/src/components/ui/AvatarEditable.tsx b/src/components/ui/AvatarEditable.tsx new file mode 100644 index 000000000..47ef8e228 --- /dev/null +++ b/src/components/ui/AvatarEditable.tsx @@ -0,0 +1,83 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useState, useEffect, memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import CropModal from './CropModal'; + +import './AvatarEditable.scss'; + +interface OwnProps { + title?: string; + disabled?: boolean; + currentAvatarBlobUrl?: string; + onChange: (file: File) => void; +} + +const AvatarEditable: FC = ({ + title = 'Change your profile picture', + disabled, + currentAvatarBlobUrl, + onChange, +}) => { + const [selectedFile, setSelectedFile] = useState(); + const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl); + + useEffect(() => { + setCroppedBlobUrl(currentAvatarBlobUrl); + }, [currentAvatarBlobUrl]); + + function handleSelectFile(event: ChangeEvent) { + const target = event.target as HTMLInputElement; + + if (!target || !target.files || !target.files[0]) { + return; + } + + setSelectedFile(target.files[0]); + target.value = ''; + } + + function handleAvatarCrop(croppedImg: File) { + setSelectedFile(undefined); + onChange(croppedImg); + + if (croppedBlobUrl) { + URL.revokeObjectURL(croppedBlobUrl); + } + setCroppedBlobUrl(URL.createObjectURL(croppedImg)); + } + + function handleModalClose() { + setSelectedFile(undefined); + } + + const labelClassName = buildClassName( + croppedBlobUrl && 'filled', + disabled && 'disabled', + ); + + return ( +
    + + +
    + ); +}; + +export default memo(AvatarEditable); diff --git a/src/components/ui/Button.scss b/src/components/ui/Button.scss new file mode 100644 index 000000000..84490cd3b --- /dev/null +++ b/src/components/ui/Button.scss @@ -0,0 +1,304 @@ +@mixin active-styles() { + &:not(.disabled):not(:disabled) { + &:hover, &:active, &.active, &:focus { + @content; + } + } +} + +@mixin no-ripple-styles() { + body.animation-level-0 & { + &:not(.disabled):not(:disabled) { + &:active { + @content; + } + } + } +} + +.Button { + outline: none !important; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 3.5rem; + border: 0; + border-radius: var(--border-radius-default); + background: transparent; + padding: 0.625rem; + color: white; + line-height: 1.2; + cursor: pointer; + text-transform: uppercase; + flex-shrink: 0; + position: relative; + overflow: hidden; + transition: background-color .15s, color .15s; + text-decoration: none !important; + + // @optimization + &:active, &.clicked, body.animation-level-0 & { + transition: none !important; + } + + &.disabled { + opacity: 0.5 !important; + cursor: default; + pointer-events: none; + } + + &.round { + width: 3.5rem; + border-radius: 50%; + + i { + font-size: 1.5rem; + } + } + + &.primary { + background: var(--color-primary); + color: var(--color-white); + --ripple-color: rgba(0, 0, 0, .08); + + @include active-styles() { + background: var(--color-primary-shade); + } + + @include no-ripple-styles() { + background: var(--color-primary-shade-darker); + } + } + + &.secondary { + background: var(--color-background); + color: rgba(var(--color-text-secondary-rgb), 0.75); + --ripple-color: rgba(0, 0, 0, .08); + + @include active-styles() { + background: var(--color-primary); + color: white; + } + + @include no-ripple-styles() { + background: var(--color-primary-shade); + } + } + + &.gray { + background: var(--color-background); + color: var(--color-text-secondary); + --ripple-color: rgba(0, 0, 0, .08); + + @include active-styles() { + color: var(--color-primary); + } + + @include no-ripple-styles() { + background: var(--color-chat-hover); + } + } + + &.danger { + background: var(--color-background); + color: var(--color-error); + --ripple-color: rgba(var(--color-error-rgb), .16); + + @include active-styles() { + background: var(--color-error); + color: var(--color-white); + } + + @include no-ripple-styles() { + background: var(--color-error-shade); + } + } + + &.text { + background: none; + + &.primary { + color: var(--color-primary); + background: none; + + @include active-styles() { + background: rgba(var(--color-primary-shade-rgb), .08); + } + + @include no-ripple-styles() { + background: rgba(var(--color-primary-shade-rgb), .16); + } + } + + &.secondary { + background: none; + color: var(--color-text-secondary); + } + + &.danger { + @include active-styles() { + background: rgba(var(--color-error-rgb), .08); + color: var(--color-error); + } + + @include no-ripple-styles() { + background: rgba(var(--color-error-rgb), .16); + } + } + } + + &.faded { + opacity: 0.75; + + @include active-styles() { + opacity: 1; + } + + &.activated { + opacity: 1; + } + } + + &.translucent { + background-color: transparent; + color: var(--color-text-secondary); + + --ripple-color: rgba(var(--color-text-secondary-rgb), 0.08); + + @include active-styles() { + background-color: rgba(var(--color-text-secondary-rgb), 0.08); + } + + @include no-ripple-styles() { + background-color: rgba(var(--color-text-secondary-rgb), 0.16); + } + + &.activated { + color: var(--color-primary); + } + } + + &.translucent-white { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + --ripple-color: rgba(255, 255, 255, 0.08); + + @include active-styles() { + background-color: rgba(255, 255, 255, 0.08); + color: white; + } + + @include no-ripple-styles() { + background-color: rgba(255, 255, 255, 0.16); + } + } + + &.dark { + background-color: rgba(0, 0, 0, 0.75); + color: white; + --ripple-color: rgba(255, 255, 255, 0.08); + + @include active-styles() { + background-color: rgba(0, 0, 0, 0.85); + color: white; + } + + @include no-ripple-styles() { + background-color: rgba(0, 0, 0, 0.95); + } + } + + &.smaller { + height: 2.75rem; + padding: 0.3125rem; + + &.round { + width: 2.75rem; + } + + &.pill { + height: 2.5rem; + border-radius: 1.25rem; + padding: 0.3125rem 1rem; + } + + &.with-icon { + padding-left: 0.75rem; + padding-right: 1.25rem; + + i { + font-size: 1.5rem; + margin-right: 0.5rem; + } + } + + @media (max-width: 600px) { + height: 2.5rem; + + &.round { + width: 2.5rem; + } + } + } + + &.tiny { + height: 2.25rem; + padding: .4375rem; + border-radius: var(--border-radius-default-small); + font-size: .875rem; + font-weight: 500; + + &.round { + width: 2.25rem; + height: 2.25rem; + border-radius: 50%; + } + + i { + font-size: 1.25rem; + } + + &.pill { + height: 2rem; + border-radius: 1rem; + padding: 0.3125rem 1rem; + font-size: 1rem; + } + } + + &.fluid { + padding-left: 1.75rem; + padding-right: 1.75rem; + width: auto; + + &.tiny { + padding-left: 1.375rem; + padding-right: 1.375rem; + } + } + + &.pill { + border-radius: 1.75rem; + padding-left: 1.75rem; + padding-right: 1.75rem; + text-transform: none; + } + + &.loading { + position: relative; + pointer-events: none; + + .Spinner { + position: absolute; + right: 0.875rem; + top: 0.875rem; + + --spinner-size: 1.8rem; + } + } + + .emoji { + vertical-align: -3px; + } +} diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 000000000..0eb7e184a --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,159 @@ +import { MouseEvent as ReactMouseEvent, RefObject } from 'react'; + +import React, { + FC, useRef, useCallback, useState, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import Spinner from './Spinner'; +import RippleEffect from './RippleEffect'; + +import './Button.scss'; + +export type OwnProps = { + ref?: RefObject; + type?: 'button' | 'submit' | 'reset'; + children: any; + size?: 'default' | 'smaller' | 'tiny'; + color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark'; + className?: string; + round?: boolean; + pill?: boolean; + fluid?: boolean; + isText?: boolean; + isLoading?: boolean; + ariaLabel?: string; + href?: string; + download?: string; + disabled?: boolean; + ripple?: boolean; + faded?: boolean; + tabIndex?: number; + onClick?: (e: ReactMouseEvent) => void; + onContextMenu?: (e: ReactMouseEvent) => void; + onMouseDown?: (e: ReactMouseEvent) => void; + onMouseEnter?: NoneToVoidFunction; + onMouseLeave?: NoneToVoidFunction; + onFocus?: NoneToVoidFunction; +}; + +// Longest animation duration; +const CLICKED_TIMEOUT = 400; + +const Button: FC = ({ + ref, + type = 'button', + onClick, + onContextMenu, + onMouseDown, + onMouseEnter, + onMouseLeave, + onFocus, + children, + size = 'default', + color = 'primary', + className, + round, + pill, + fluid, + isText, + isLoading, + ariaLabel, + href, + download, + disabled, + ripple, + faded, + tabIndex, +}) => { + // eslint-disable-next-line no-null/no-null + let elementRef = useRef(null); + if (ref) { + elementRef = ref; + } + + const [isClicked, setIsClicked] = useState(false); + + const fullClassName = buildClassName( + 'Button', + className, + size, + color, + round && 'round', + pill && 'pill', + fluid && 'fluid', + disabled && 'disabled', + isText && 'text', + isLoading && 'loading', + ripple && 'has-ripple', + faded && 'faded', + isClicked && 'clicked', + ); + + const handleClick = useCallback((e: ReactMouseEvent) => { + if (!disabled && onClick) { + onClick(e); + } + + setIsClicked(true); + setTimeout(() => { + setIsClicked(false); + }, CLICKED_TIMEOUT); + }, [disabled, onClick]); + + const handleMouseDown = useCallback((e: ReactMouseEvent) => { + e.preventDefault(); + if (!disabled && onMouseDown) { + onMouseDown(e); + } + }, [onMouseDown, disabled]); + + if (href) { + return ( + } + className={fullClassName} + href={href} + title={ariaLabel} + download={download} + tabIndex={tabIndex} + > + {children} + {!disabled && ripple && ( + + )} + + ); + } + + return ( + // eslint-disable-next-line react/button-has-type + + ); +}; + +export default Button; diff --git a/src/components/ui/Checkbox.scss b/src/components/ui/Checkbox.scss new file mode 100644 index 000000000..9a88bf122 --- /dev/null +++ b/src/components/ui/Checkbox.scss @@ -0,0 +1,115 @@ +.Checkbox { + display: block; + position: relative; + padding-left: 4.5rem; + text-align: left; + margin-bottom: 1.5rem; + line-height: 1.5rem; + cursor: pointer; + + &.disabled { + pointer-events: none; + opacity: 0.5; + } + + &.round { + .Checkbox-main { + &::before { + border-radius: 50%; + } + + &::after { + background: var(--color-primary) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiLz48L3N2Zz4=) no-repeat 50% 50%; + background-size: 12px; + border-radius: 50%; + } + } + } + + &.loading { + .Checkbox-main::before, + .Checkbox-main::after { + opacity: 0 !important; + } + + .Spinner { + position: absolute; + left: 0.375rem; + top: 0.125rem; + opacity: 0; + animation: fade-in .2s ease forwards; + --spinner-size: 1.25rem; + } + } + + &.blocking { + input:not(:checked) ~ .Checkbox-main { + &::before { + border-color: var(--color-error); + } + + &::after { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBvbHlnb24gcG9pbnRzPSIwIDAgMjQgMCAyNCAyNCAwIDI0Ii8+CiAgICA8cGF0aCBmaWxsPSIjZTUzOTM1IiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0xOCwzIEMxOS42NTY4NTQyLDMgMjEsNC4zNDMxNDU3NSAyMSw2IEwyMSwxOCBDMjEsMTkuNjU2ODU0MiAxOS42NTY4NTQyLDIxIDE4LDIxIEw2LDIxIEM0LjM0MzE0NTc1LDIxIDMsMTkuNjU2ODU0MiAzLDE4IEwzLDYgQzMsNC4zNDMxNDU3NSA0LjM0MzE0NTc1LDMgNiwzIEwxOCwzIFogTTE2LDExIEw4LDExIEM3LjQ0NzcxNTI1LDExIDcsMTEuNDQ3NzE1MyA3LDEyIEM3LDEyLjU1MjI4NDcgNy40NDc3MTUyNSwxMyA4LDEzIEwxNiwxMyBDMTYuNTUyMjg0NywxMyAxNywxMi41NTIyODQ3IDE3LDEyIEMxNywxMS40NDc3MTUzIDE2LjU1MjI4NDcsMTEgMTYsMTEgWiIvPgogIDwvZz4KPC9zdmc+Cg==); + opacity: 1; + + // Compensate for svg having incorrect size + background-size: 1.375rem; + background-position: -0.125rem -0.125rem; + } + } + } + + input { + position: absolute; + z-index: var(--z-below); + opacity: 0; + } + + .Checkbox-main { + &::before, &::after { + content: ''; + display: block; + position: absolute; + left: 1.1875rem; + top: 0.1875rem; + width: 1.125rem; + height: 1.125rem; + } + + &::before { + border: 2px solid var(--color-borders); + border-radius: .25rem; + background-color: white; + transition: border-color .1s ease; + } + + &::after { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTE2LjcgMEMxOC41IDAgMjAgMS41IDIwIDMuM3YxMy4zYzAgMS44LTEuNSAzLjMtMy4zIDMuM0gzLjNDMS41IDIwIDAgMTguNSAwIDE2LjdWMy4zQzAgMS41IDEuNSAwIDMuMyAwaDEzLjR6bS0uOCA0LjhsLTguMSA4LjEtMy43LTMuN2MtLjQtLjQtMS4xLS40LTEuNiAwLS40LjQtLjQgMS4xIDAgMS42TDcgMTUuMmMuNC40IDEuMS40IDEuNiAwbDguOS04LjljLjQtLjQuNC0xLjEgMC0xLjYtLjUtLjQtMS4yLS40LTEuNi4xeiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==); + background-size: contain; + background-repeat: no-repeat; + opacity: 0; + transition: opacity .1s ease; + } + + .label { + display: block; + } + + .subLabel { + display: block; + font-size: 0.875rem; + line-height: 1rem; + color: var(--color-text-secondary); + } + } + + input:checked ~ .Checkbox-main { + &::before { + border-color: var(--color-primary); + } + + &::after { + opacity: 1; + } + } +} diff --git a/src/components/ui/Checkbox.tsx b/src/components/ui/Checkbox.tsx new file mode 100644 index 000000000..9c4228e51 --- /dev/null +++ b/src/components/ui/Checkbox.tsx @@ -0,0 +1,78 @@ +import { ChangeEvent } from 'react'; +import React, { FC, memo, useCallback } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import Spinner from './Spinner'; + +import './Checkbox.scss'; + +type OwnProps = { + id?: string; + name?: string; + value?: string; + label: string; + subLabel?: string; + checked: boolean; + disabled?: boolean; + round?: boolean; + blocking?: boolean; + isLoading?: boolean; + withCheckedCallback?: boolean; + onChange?: (e: ChangeEvent) => void; + onCheck?: (isChecked: boolean) => void; +}; + +const Checkbox: FC = ({ + id, + name, + value, + label, + subLabel, + checked, + disabled, + round, + blocking, + isLoading, + onChange, + onCheck, +}) => { + const handleChange = useCallback((event: ChangeEvent) => { + if (onChange) { + onChange(event); + } + + if (onCheck) { + onCheck(event.currentTarget.checked); + } + }, [onChange, onCheck]); + + const className = buildClassName( + 'Checkbox', + disabled && 'disabled', + round && 'round', + isLoading && 'loading', + blocking && 'blocking', + ); + + return ( + + ); +}; + +export default memo(Checkbox); diff --git a/src/components/ui/CheckboxGroup.tsx b/src/components/ui/CheckboxGroup.tsx new file mode 100644 index 000000000..f571c48a2 --- /dev/null +++ b/src/components/ui/CheckboxGroup.tsx @@ -0,0 +1,66 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useCallback, memo, useState, +} from '../../lib/teact/teact'; + +import Checkbox from './Checkbox'; + +type IRadioOption = { + label: string; + subLabel?: string; + value: string; +}; + +type OwnProps = { + id?: string; + options: IRadioOption[]; + selected?: string[]; + disabled?: boolean; + round?: boolean; + loadingOptions?: string[]; + onChange: (value: string[]) => void; +}; + +const CheckboxGroup: FC = ({ + id, + options, + selected = [], + disabled, + round, + loadingOptions, + onChange, +}) => { + const [values, setValues] = useState([]); + + const handleChange = useCallback((event: ChangeEvent) => { + const { value, checked } = event.currentTarget; + let newValues: string[]; + if (checked) { + newValues = [...values, value]; + } else { + newValues = values.filter((v) => v !== value); + } + + setValues(newValues); + onChange(newValues); + }, [onChange, values]); + + return ( +
    + {options.map((option) => ( + + ))} +
    + ); +}; + +export default memo(CheckboxGroup); diff --git a/src/components/ui/ConfirmDialog.tsx b/src/components/ui/ConfirmDialog.tsx new file mode 100644 index 000000000..024b81308 --- /dev/null +++ b/src/components/ui/ConfirmDialog.tsx @@ -0,0 +1,64 @@ +import React, { FC, memo } from '../../lib/teact/teact'; + +import useLang from '../../hooks/useLang'; +import { TextPart } from '../common/helpers/renderMessageText'; + +import Modal from './Modal'; +import Button from './Button'; + +type OwnProps = { + isOpen: boolean; + onClose: () => void; + onCloseAnimationEnd?: () => void; + header?: FC; + textParts?: TextPart[]; + text?: string; + confirmLabel?: string; + confirmHandler: () => void; + confirmIsDestructive?: boolean; + isButtonsInOneRow?: boolean; +}; + +const ConfirmDialog: FC = ({ + isOpen, + onClose, + onCloseAnimationEnd, + header, + text, + textParts, + confirmLabel = 'Confirm', + confirmHandler, + confirmIsDestructive, + isButtonsInOneRow, +}) => { + const lang = useLang(); + + return ( + + {text && text.split('\\n').map((textPart) => ( +

    {textPart}

    + ))} + {textParts} +
    + + +
    +
    + ); +}; + +export default memo(ConfirmDialog); diff --git a/src/components/ui/CropModal.scss b/src/components/ui/CropModal.scss new file mode 100644 index 000000000..03689c537 --- /dev/null +++ b/src/components/ui/CropModal.scss @@ -0,0 +1,84 @@ +@mixin thumb-styles() { + background: var(--color-primary); + cursor: pointer; + transform: scale(1); + transition: transform .25s ease-in-out; + + &:hover { + transform: scale(1.2); + } +} + +.CropModal { + .modal-dialog { + width: calc(100% - 2rem); + max-width: 35rem; + height: calc(100% - 1rem); + max-height: 35rem; + position: relative; + } + + .modal-content, #avatar-crop { + overflow: hidden; + } + + .confirm-button { + position: absolute; + bottom: 1rem; + right: 1rem; + box-shadow: 0 1px 2px rgba(114, 114, 114, 0.25); + } + + #avatar-crop { + max-width: 25rem; + margin: 0 auto; + position: relative; + + &::before { + content: ''; + display: block; + padding-top: 100%; + } + + .cr-boundary { + position: absolute; + top: 0; + left: 0; + border-radius: var(--border-radius-messages-small); + } + + .cr-viewport { + border: none; + box-shadow: 0 0 2000px 2000px rgba(white, 0.5); + } + + .cr-slider { + // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors. + // Browsers will drop the entire selector if it doesn't understand a part of it. + + &::-webkit-slider-runnable-track { + background: var(--color-borders); + } + + &::-moz-range-track { + background: var(--color-borders); + } + + &::-ms-track { + background: var(--color-borders); + } + + &::-webkit-slider-thumb { + @include thumb-styles(); + } + + &::-moz-range-thumb { + @include thumb-styles(); + } + + &::-ms-thumb { + @include thumb-styles(); + } + } + } +} diff --git a/src/components/ui/CropModal.tsx b/src/components/ui/CropModal.tsx new file mode 100644 index 000000000..239b736a2 --- /dev/null +++ b/src/components/ui/CropModal.tsx @@ -0,0 +1,132 @@ +import React, { + FC, useEffect, useState, memo, +} from '../../lib/teact/teact'; + +import { DEBUG } from '../../config'; +import { blobToFile, blobToDataUri } from '../../util/files'; +import useLang from '../../hooks/useLang'; + +import Button from './Button'; +import Modal from './Modal'; +import Loading from './Loading'; + +import './CropModal.scss'; + +// Change to 'base64' to get base64-encoded string +const cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = { + type: 'blob', + quality: 0.8, + format: 'jpeg', + circle: false, +}; + +type ICroppie = typeof import('croppie'); +let Croppie: ICroppie; +let croppiePromise: Promise<{ default: ICroppie }>; + +async function ensureCroppie() { + if (!croppiePromise) { + croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>; + Croppie = (await croppiePromise).default; + } + + return croppiePromise; +} + +let cropper: Croppie; + +async function initCropper(imgFile: File) { + try { + const cropContainer = document.getElementById('avatar-crop'); + if (!cropContainer) { + return; + } + + const { offsetWidth, offsetHeight } = cropContainer; + + cropper = new Croppie(cropContainer, { + enableZoom: true, + boundary: { + width: offsetWidth, + height: offsetHeight, + }, + viewport: { + width: offsetWidth - 16, + height: offsetHeight - 16, + type: 'circle', + }, + }); + + const dataUri = await blobToDataUri(imgFile); + await cropper.bind({ url: dataUri }); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(err); + } + } +} + +type OwnProps = { + file?: File; + onChange: (file: File) => void; + onClose: () => void; +}; + +const CropModal: FC = ({ file, onChange, onClose }: OwnProps) => { + const [isCroppieReady, setIsCroppieReady] = useState(false); + + useEffect(() => { + if (!file) { + return; + } + + if (!isCroppieReady) { + ensureCroppie().then(() => setIsCroppieReady(true)); + + return; + } + + initCropper(file); + }, [file, isCroppieReady]); + + const lang = useLang(); + + async function handleCropClick() { + if (!cropper) { + return; + } + + const result: Blob | string = await cropper.result(cropperResultOptions); + const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg'); + + onChange(croppedImg); + } + + return ( + + {isCroppieReady ? ( +
    + ) : ( + + )} + + + ); +}; + +export default memo(CropModal); diff --git a/src/components/ui/DropdownMenu.scss b/src/components/ui/DropdownMenu.scss new file mode 100644 index 000000000..6d8c278fa --- /dev/null +++ b/src/components/ui/DropdownMenu.scss @@ -0,0 +1,3 @@ +.DropdownMenu { + position: relative; +} diff --git a/src/components/ui/DropdownMenu.tsx b/src/components/ui/DropdownMenu.tsx new file mode 100644 index 000000000..b92e4c6b1 --- /dev/null +++ b/src/components/ui/DropdownMenu.tsx @@ -0,0 +1,76 @@ +import React, { FC, useState, useRef } from '../../lib/teact/teact'; + +import Menu from './Menu'; + +import './DropdownMenu.scss'; + +type OwnProps = { + className?: string; + trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>; + positionX?: 'left' | 'right'; + positionY?: 'top' | 'bottom'; + children: any; +}; + +const DropdownMenu: FC = (props) => { + const { + trigger, + className, + children, + positionX = 'left', + positionY = 'top', + } = props; + // eslint-disable-next-line no-null/no-null + const menuRef = useRef(null); + // eslint-disable-next-line no-null/no-null + const dropdownRef = useRef(null); + const [isOpen, setIsOpen] = useState(false); + + const toggleIsOpen = () => { + setIsOpen(!isOpen); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + const menu = menuRef.current; + + if (!isOpen || e.keyCode !== 40 || !menu) { + return; + } + + const focusedElement = document.activeElement; + const elementChildren = Array.from(menu.children); + + if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) { + (elementChildren[0] as HTMLElement).focus(); + } + }; + + const handleClose = () => { + setIsOpen(false); + }; + + return ( +
    + {trigger({ onTrigger: toggleIsOpen, isOpen })} + + + {children} + +
    + ); +}; + +export default DropdownMenu; diff --git a/src/components/ui/FloatingActionButton.scss b/src/components/ui/FloatingActionButton.scss new file mode 100644 index 000000000..8551daba9 --- /dev/null +++ b/src/components/ui/FloatingActionButton.scss @@ -0,0 +1,15 @@ +.FloatingActionButton { + position: absolute; + right: 1rem; + bottom: 1rem; + transform: translateY(5rem); + transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1); + + body.animation-level-0 & { + transition: none !important; + } + + &.revealed { + transform: translateY(0); + } +} diff --git a/src/components/ui/FloatingActionButton.tsx b/src/components/ui/FloatingActionButton.tsx new file mode 100644 index 000000000..225ea1811 --- /dev/null +++ b/src/components/ui/FloatingActionButton.tsx @@ -0,0 +1,49 @@ +import React, { FC } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import Button, { OwnProps as ButtonProps } from './Button'; + +import './FloatingActionButton.scss'; + +type OwnProps = { + isShown: boolean; + className?: string; + color?: ButtonProps['color']; + ariaLabel?: ButtonProps['ariaLabel']; + disabled?: boolean; + onClick: () => void; + children: any; +}; + +const FloatingActionButton: FC = ({ + isShown, + className, + color = 'primary', + ariaLabel, + disabled, + onClick, + children, +}) => { + const buttonClassName = buildClassName( + 'FloatingActionButton', + isShown && 'revealed', + className, + ); + + return ( + + ); +}; + +export default FloatingActionButton; diff --git a/src/components/ui/InfiniteScroll.tsx b/src/components/ui/InfiniteScroll.tsx new file mode 100644 index 000000000..d1cf6d006 --- /dev/null +++ b/src/components/ui/InfiniteScroll.tsx @@ -0,0 +1,207 @@ +import { RefObject, UIEvent } from 'react'; +import { LoadMoreDirection } from '../../types'; + +import React, { + FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef, +} from '../../lib/teact/teact'; + +import { debounce } from '../../util/schedulers'; +import resetScroll from '../../util/resetScroll'; + +type OwnProps = { + ref?: RefObject; + className?: string; + onLoadMore?: ({ direction }: { direction: LoadMoreDirection }) => void; + onScroll?: (e: UIEvent) => void; + items?: any[]; + itemSelector?: string; + preloadBackwards?: number; + sensitiveArea?: number; + isDisabled?: boolean; + noFastList?: boolean; + cacheBuster?: any; + children: any; +}; + +const DEFAULT_LIST_SELECTOR = '.ListItem'; +const DEFAULT_PRELOAD_BACKWARDS = 20; +const DEFAULT_SENSITIVE_AREA = 800; + +const InfiniteScroll: FC = ({ + ref, + className, + onLoadMore, + onScroll, + items, + itemSelector = DEFAULT_LIST_SELECTOR, + preloadBackwards = DEFAULT_PRELOAD_BACKWARDS, + sensitiveArea = DEFAULT_SENSITIVE_AREA, + // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists) + isDisabled = false, + noFastList, + // Used to re-query `listItemElements` if rendering is delayed by transition + cacheBuster, + children, +}: OwnProps) => { + // eslint-disable-next-line no-null/no-null + let containerRef = useRef(null); + if (ref) { + containerRef = ref; + } + + const stateRef = useRef<{ + listItemElements: NodeListOf; + isScrollTopJustUpdated: boolean; + currentAnchor: HTMLDivElement | undefined; + currentAnchorTop: number; + }>({} as any); + + const [loadMoreBackwards, loadMoreForwards] = useMemo(() => { + if (!onLoadMore) { + return []; + } + + return [ + debounce(() => onLoadMore({ direction: LoadMoreDirection.Backwards }), 1000, true, false), + debounce(() => onLoadMore({ direction: LoadMoreDirection.Forwards }), 1000, true, false), + ]; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [onLoadMore, items]); + + // Initial preload + useEffect(() => { + if (!loadMoreBackwards) { + return; + } + + if (!items || items.length < preloadBackwards) { + loadMoreBackwards(); + } else { + const { scrollHeight, clientHeight } = containerRef.current!; + if (clientHeight && scrollHeight <= clientHeight) { + loadMoreBackwards(); + } + } + }, [items, loadMoreBackwards, preloadBackwards]); + + // Restore `scrollTop` after adding items + useLayoutEffect(() => { + const container = containerRef.current!; + const state = stateRef.current; + + state.listItemElements = container.querySelectorAll(itemSelector); + + if (isDisabled) { + return; + } + + let newScrollTop; + + if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) { + const { scrollTop } = container; + const newAnchorTop = state.currentAnchor.getBoundingClientRect().top; + newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop); + } else { + const nextAnchor = state.listItemElements[0]; + if (nextAnchor && nextAnchor.offsetParent) { + state.currentAnchor = nextAnchor; + state.currentAnchorTop = nextAnchor.getBoundingClientRect().top; + } + } + + resetScroll(container, newScrollTop); + + state.isScrollTopJustUpdated = true; + }, [isDisabled, itemSelector, items, cacheBuster]); + + const handleScroll = useCallback((e: UIEvent) => { + if (loadMoreForwards && loadMoreBackwards) { + const { + listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop, + } = stateRef.current; + + if (isScrollTopJustUpdated) { + stateRef.current.isScrollTopJustUpdated = false; + return; + } + + const listLength = listItemElements.length; + const container = containerRef.current!; + const { scrollTop, scrollHeight, offsetHeight } = container; + const top = listLength ? listItemElements[0].offsetTop : 0; + const isNearTop = scrollTop <= top + sensitiveArea; + const bottom = listLength + ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight + : scrollHeight; + const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea; + let isUpdated = false; + + if (isNearTop) { + const nextAnchor = listItemElements[0]; + if (nextAnchor) { + const nextAnchorTop = nextAnchor.getBoundingClientRect().top; + const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor + ? currentAnchor.getBoundingClientRect().top + : nextAnchorTop; + const isMovingUp = ( + currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop + ); + + if (isMovingUp) { + stateRef.current.currentAnchor = nextAnchor; + stateRef.current.currentAnchorTop = nextAnchorTop; + isUpdated = true; + resetScroll(container); + loadMoreForwards(); + } + } + } + + if (isNearBottom) { + const nextAnchor = listItemElements[listLength - 1]; + if (nextAnchor) { + const nextAnchorTop = nextAnchor.getBoundingClientRect().top; + const newAnchorTop = currentAnchor && currentAnchor !== nextAnchor + ? currentAnchor.getBoundingClientRect().top + : nextAnchorTop; + const isMovingDown = ( + currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop + ); + + if (isMovingDown) { + stateRef.current.currentAnchor = nextAnchor; + stateRef.current.currentAnchorTop = nextAnchorTop; + isUpdated = true; + resetScroll(container); + loadMoreBackwards(); + } + } + } + + if (!isUpdated) { + if (currentAnchor) { + stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top; + } else { + const nextAnchor = listItemElements[0]; + + if (nextAnchor) { + stateRef.current.currentAnchor = nextAnchor; + stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top; + } + } + } + } + + if (onScroll) { + onScroll(e); + } + }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]); + + return ( +
    + {children} +
    + ); +}; + +export default InfiniteScroll; diff --git a/src/components/ui/InputText.tsx b/src/components/ui/InputText.tsx new file mode 100644 index 000000000..ba1939890 --- /dev/null +++ b/src/components/ui/InputText.tsx @@ -0,0 +1,85 @@ +import { ChangeEvent, FormEvent, RefObject } from 'react'; +import React, { FC, memo } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +type OwnProps = { + ref?: RefObject; + id?: string; + className?: string; + value?: string; + label?: string; + error?: string; + success?: string; + disabled?: boolean; + readOnly?: boolean; + placeholder?: string; + autoComplete?: string; + maxLength?: number; + inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; + onChange?: (e: ChangeEvent) => void; + onInput?: (e: FormEvent) => void; + onKeyPress?: (e: React.KeyboardEvent) => void; + onKeyDown?: (e: React.KeyboardEvent) => void; + onBlur?: (e: React.FocusEvent) => void; +}; + +const InputText: FC = ({ + ref, + id, + className, + value, + label, + error, + success, + disabled, + readOnly, + placeholder, + autoComplete, + inputMode, + maxLength, + onChange, + onInput, + onKeyPress, + onKeyDown, + onBlur, +}) => { + const labelText = error || success || label; + const fullClassName = buildClassName( + 'input-group', + value && 'touched', + error ? 'error' : success && 'success', + disabled && 'disabled', + readOnly && 'disabled', + labelText && 'with-label', + className, + ); + + return ( +
    + + {labelText && ( + + )} +
    + ); +}; + +export default memo(InputText); diff --git a/src/components/ui/Link.scss b/src/components/ui/Link.scss new file mode 100644 index 000000000..38b75ff37 --- /dev/null +++ b/src/components/ui/Link.scss @@ -0,0 +1,7 @@ +.Link { + color: inherit; + + &:hover { + color: inherit; + } +} diff --git a/src/components/ui/Link.tsx b/src/components/ui/Link.tsx new file mode 100644 index 000000000..1e582ccb5 --- /dev/null +++ b/src/components/ui/Link.tsx @@ -0,0 +1,30 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './Link.scss'; + +type OwnProps = { + children: any; + className?: string; + onClick?: (e: React.MouseEvent) => void; +}; + +const Link: FC = ({ children, className, onClick }) => { + const handleClick = useCallback((e: React.MouseEvent) => { + e.preventDefault(); + onClick!(e); + }, [onClick]); + + return ( + + {children} + + ); +}; + +export default Link; diff --git a/src/components/ui/ListItem.scss b/src/components/ui/ListItem.scss new file mode 100644 index 000000000..a10f0054a --- /dev/null +++ b/src/components/ui/ListItem.scss @@ -0,0 +1,270 @@ +.ListItem { + position: relative; + + .ListItem-button { + width: 100%; + background-color: var(--background-color); + ackground: none; + border: none !important; + box-shadow: none !important; + outline: none !important; + display: flex; + padding: 1rem; + position: relative; + overflow: hidden; + line-height: 1.5rem; + white-space: nowrap; + color: var(--color-text); + border-radius: var(--border-radius-default); + --ripple-color: rgba(0, 0, 0, .08); + + > i { + font-size: 1.5rem; + margin-right: 2rem; + color: var(--color-text-secondary); + } + } + + &.disabled { + pointer-events: none; + + .ListItem-button { + opacity: 0.5; + } + } + + &:not(.disabled) { + .ListItem-button { + cursor: pointer; + + body:not(.is-ios) &:hover, &:focus { + --background-color: var(--color-chat-hover); + } + } + } + + @media (min-width: 600px) { + &:not(.has-ripple), + body.animation-level-0 & { + .ListItem-button:active { + --background-color: var(--color-chat-active) !important; + } + } + } + + &.has-menu-open .ListItem-button { + --background-color: var(--color-chat-hover); + } + + &.narrow { + margin-bottom: 0.75rem; + + .ListItem-button { + padding: 0.5rem 1rem; + } + } + + &.inactive { + pointer-events: none; + } + + &.focus { + --background-color: var(--color-chat-hover); + } + + &.destructive { + .ListItem-button { + color: var(--color-error); + + i { + color: inherit; + } + } + } + + &-context-menu { + position: absolute; + + .bubble { + width: auto; + + .MenuItem button { + padding-left: 1rem !important; + padding-right: 2rem !important; + } + } + } + + &.chat-item-clickable { + margin: 0 -0.5rem; + + .ListItem-button { + padding: .5625rem .6975rem .5625rem .5625rem; + } + + &:not(.force-rounded-corners) { + @media (max-width: 600px) { + margin: 0; + + .ListItem-button { + border-radius: 0; + } + } + } + + .Avatar { + flex-shrink: 0; + margin-right: 0.5rem; + } + + .info { + flex-grow: 1; + overflow: hidden; + } + + .title, .subtitle { + overflow: hidden; + display: flex; + justify-content: flex-start; + align-items: center; + } + + h3, .last-message, .status, .typing-status { + font-size: 1rem; + line-height: 1.6875rem; + margin: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: left; + } + + .title { + h3 { + font-weight: 500; + } + + .VerifiedIcon { + width: 1.25rem; + height: 1.25rem; + margin-left: 0.25rem; + } + + .emoji { + vertical-align: text-bottom; + background-position: 0 0; + flex-shrink: 0; + } + } + + .contact-phone, + .contact-username { + font-size: 0.875rem; + line-height: 1.25rem; + color: var(--color-text-secondary); + } + + .ChatInfo { + display: flex; + align-items: center; + flex-grow: 1; + overflow: hidden; + + .status, .typing-status { + font-size: 0.875rem; + line-height: 1.25rem; + color: var(--color-text-secondary); + + &.online { + color: var(--color-primary); + } + } + } + } + + &.search-result-message { + .title { + padding-right: .15rem; + } + + h3 { + max-width: 80%; + } + + h3, .subtitle { + font-size: 1rem; + line-height: 1.5rem; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: left; + } + + .LastMessageMeta { + margin-left: auto; + margin-right: 0; + } + + .subtitle { + color: var(--color-text-secondary); + margin-right: 2rem; + + .matching-text-highlight { + color: var(--color-text); + background: #CAE3F7; + border-radius: 0.25rem; + padding: 0 0.125rem; + } + } + } + + &.picker-list-item { + margin: 0; + + .ListItem-button { + padding-left: 0; + display: flex; + align-items: center; + } + + .Avatar { + width: 3rem; + height: 3rem; + } + + .Checkbox { + flex-shrink: 0; + height: 1.5rem; + margin: 0; + padding-left: 4rem; + } + } + + .multiline-item { + white-space: initial; + + .title, .subtitle { + display: block; + text-align: left; + } + + .title { + line-height: 1.25rem; + } + + .subtitle { + font-size: 0.875rem; + line-height: 1.5rem; + color: var(--color-text-secondary); + + & + .subtitle { + margin-top: -0.25rem; + } + + &.black { + color: var(--color-text); + } + } + } + +} diff --git a/src/components/ui/ListItem.tsx b/src/components/ui/ListItem.tsx new file mode 100644 index 000000000..ef1317bce --- /dev/null +++ b/src/components/ui/ListItem.tsx @@ -0,0 +1,174 @@ +import { RefObject } from 'react'; +import React, { FC, useRef, useCallback } from '../../lib/teact/teact'; + +import { IS_TOUCH_ENV } from '../../util/environment'; +import buildClassName from '../../util/buildClassName'; +import useContextMenuHandlers from '../../hooks/useContextMenuHandlers'; +import useContextMenuPosition from '../../hooks/useContextMenuPosition'; + +import RippleEffect from './RippleEffect'; +import Menu from './Menu'; +import MenuItem from './MenuItem'; + +import './ListItem.scss'; + +type OnClickHandler = (e: React.MouseEvent) => void; + +type MenuItemContextAction = { + title: string; + icon: string; + destructive?: boolean; + handler?: () => void; +}; + +type OwnProps = { + ref?: RefObject; + icon?: string; + className?: string; + style?: string; + children: any; + disabled?: boolean; + ripple?: boolean; + narrow?: boolean; + inactive?: boolean; + focus?: boolean; + destructive?: boolean; + contextActions?: MenuItemContextAction[]; + onClick?: OnClickHandler; +}; + +const ListItem: FC = (props) => { + const { + ref, + icon, + className, + style, + children, + disabled, + ripple, + narrow, + inactive, + contextActions, + focus, + destructive, + onClick, + } = props; + + // eslint-disable-next-line no-null/no-null + let containerRef = useRef(null); + if (ref) { + containerRef = ref; + } + + const { + isContextMenuOpen, contextMenuPosition, + handleBeforeContextMenu, handleContextMenu, + handleContextMenuClose, handleContextMenuHide, + } = useContextMenuHandlers(containerRef, !contextActions); + + const getTriggerElement = useCallback(() => containerRef.current, []); + + const getRootElement = useCallback( + () => containerRef.current!.closest('.custom-scroll'), + [], + ); + + const getMenuElement = useCallback( + () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'), + [], + ); + + const { positionX, positionY, style: menuStyle } = useContextMenuPosition( + contextMenuPosition, + getTriggerElement, + getRootElement, + getMenuElement, + ); + + const handleClick = useCallback((e: React.MouseEvent) => { + if (disabled || !onClick) { + return; + } + onClick(e); + }, [disabled, onClick]); + + const handleMouseDown = useCallback((e: React.MouseEvent) => { + if (inactive || IS_TOUCH_ENV) { + return; + } + if (contextActions && (e.button === 2 || !onClick)) { + handleBeforeContextMenu(e); + } + if (e.button === 0) { + if (!onClick) { + handleContextMenu(e); + } else { + handleClick(e); + } + } + }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]); + + const fullClassName = buildClassName( + 'ListItem no-selection', + className, + ripple && 'has-ripple', + narrow && 'narrow', + disabled && 'disabled', + inactive && 'inactive', + contextMenuPosition && 'has-menu-open', + focus && 'focus', + destructive && 'destructive', + ); + + return ( +
    +
    + {icon && ( + + )} + {children} + {!disabled && !inactive && ripple && ( + + )} +
    + {contextActions && contextMenuPosition !== undefined && ( + + {contextActions.map((action) => ( + + {action.title} + + ))} + + )} +
    + ); +}; + +export default ListItem; diff --git a/src/components/ui/Loading.scss b/src/components/ui/Loading.scss new file mode 100644 index 000000000..9e551fec3 --- /dev/null +++ b/src/components/ui/Loading.scss @@ -0,0 +1,10 @@ +.Loading { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + + .Spinner { + --spinner-size: 2.75rem; + } +} diff --git a/src/components/ui/Loading.tsx b/src/components/ui/Loading.tsx new file mode 100644 index 000000000..84b500e87 --- /dev/null +++ b/src/components/ui/Loading.tsx @@ -0,0 +1,19 @@ +import React, { FC, memo } from '../../lib/teact/teact'; + +import Spinner from './Spinner'; + +import './Loading.scss'; + +type OwnProps = { + color?: 'blue' | 'white' | 'black'; +}; + +const Loading: FC = ({ color = 'blue' }) => { + return ( +
    + +
    + ); +}; + +export default memo(Loading); diff --git a/src/components/ui/Menu.scss b/src/components/ui/Menu.scss new file mode 100644 index 000000000..a0e7308d2 --- /dev/null +++ b/src/components/ui/Menu.scss @@ -0,0 +1,67 @@ +.Menu { + &.fluid .bubble { + min-width: 13.5rem; + width: auto; + } + + .backdrop { + position: fixed; + left: -100vw; + right: -100vw; + top: -100vh; + bottom: -100vh; + z-index: var(--z-menu-backdrop); + } + + .bubble { + display: block; + list-style: none; + padding: 0.5rem 0; + margin: 0; + position: absolute; + background-color: white; + box-shadow: 0 .25rem .5rem .1rem rgba(114, 114, 114, 0.25); + border-radius: var(--border-radius-default); + min-width: 13.5rem; + z-index: var(--z-menu-bubble); + + transform: scale(0.2); + transition: opacity .2s cubic-bezier(0.2, 0, 0.2, 1), transform .2s cubic-bezier(0.2, 0, 0.2, 1) !important; + + &.open { + transform: scale(1); + } + + &.closing { + transition: opacity .2s ease-in, transform .2s ease-in !important; + } + + body.animation-level-0 & { + transform: none !important; + transition: opacity .15s !important; + } + + body.has-open-dialog & { + transition: none !important; + } + + --offset-y: calc(100% + 0.5rem); + --offset-x: 0; + + &.top { + top: var(--offset-y); + } + + &.bottom { + bottom: var(--offset-y); + } + + &.left { + left: var(--offset-x); + } + + &.right { + right: var(--offset-x); + } + } +} diff --git a/src/components/ui/Menu.tsx b/src/components/ui/Menu.tsx new file mode 100644 index 000000000..0e6145fbf --- /dev/null +++ b/src/components/ui/Menu.tsx @@ -0,0 +1,101 @@ +import { RefObject } from 'react'; +import React, { FC, useEffect, useRef } from '../../lib/teact/teact'; + +import useShowTransition from '../../hooks/useShowTransition'; +import useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation'; +import useVirtualBackdrop from '../../hooks/useVirtualBackdrop'; +import useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; +import buildClassName from '../../util/buildClassName'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; + +import './Menu.scss'; + +type OwnProps = { + ref?: RefObject; + containerRef?: RefObject; + isOpen: boolean; + className?: string; + style?: string; + positionX?: 'left' | 'right'; + positionY?: 'top' | 'bottom'; + autoClose?: boolean; + noCloseOnBackdrop?: boolean; + onKeyDown?: (e: React.KeyboardEvent) => void; + onCloseAnimationEnd?: () => void; + onClose?: () => void; + onMouseEnter?: (e: React.MouseEvent) => void; + onMouseLeave?: (e: React.MouseEvent) => void; + children: any; +}; + +const ANIMATION_DURATION = 200; + +const Menu: FC = ({ + ref, + containerRef, + isOpen, + className, + style, + children, + positionX = 'left', + positionY = 'top', + autoClose = false, + noCloseOnBackdrop = false, + onCloseAnimationEnd, + onClose, + onMouseEnter, + onMouseLeave, +}) => { + // eslint-disable-next-line no-null/no-null + let menuRef = useRef(null); + if (ref) { + menuRef = ref; + } + const backdropContainerRef = containerRef || menuRef; + + const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd); + + useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]); + + useEffectWithPrevDeps(([prevIsOpen]) => { + if (prevIsOpen !== undefined) { + dispatchHeavyAnimationEvent(ANIMATION_DURATION); + } + }, [isOpen]); + + const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined); + + useVirtualBackdrop( + isOpen, + backdropContainerRef, + noCloseOnBackdrop ? undefined : onClose, + ); + + return ( +
    + {isOpen && ( + // This only prevents click events triggering on underlying elements +
    + )} +
    + {children} +
    +
    + ); +}; + +export default Menu; diff --git a/src/components/ui/MenuItem.scss b/src/components/ui/MenuItem.scss new file mode 100644 index 000000000..37a22df63 --- /dev/null +++ b/src/components/ui/MenuItem.scss @@ -0,0 +1,44 @@ +.MenuItem { + width: 100%; + background: none; + border: none !important; + box-shadow: none !important; + outline: none !important; + display: flex; + padding: 1rem; + position: relative; + overflow: hidden; + line-height: 1.5rem; + white-space: nowrap; + color: var(--color-text); + --ripple-color: rgba(0, 0, 0, .08); + cursor: pointer; + + &:hover, &:focus { + background-color: var(--color-chat-hover); + } + + i { + font-size: 1.5rem; + margin-right: 2rem; + color: var(--color-text-secondary); + } + + &.disabled { + opacity: 0.5 !important; + cursor: default !important; + } + + &.destructive { + color: var(--color-error); + + i { + color: inherit; + } + } + + &:not(.has-ripple):not(.disabled):active { + background-color: var(--color-chat-active); + transition: none !important; + } +} diff --git a/src/components/ui/MenuItem.tsx b/src/components/ui/MenuItem.tsx new file mode 100644 index 000000000..02b55f1a6 --- /dev/null +++ b/src/components/ui/MenuItem.tsx @@ -0,0 +1,106 @@ +import React, { FC, useCallback } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './MenuItem.scss'; + +type OnClickHandler = (e: React.SyntheticEvent) => void; + +type OwnProps = { + icon?: string; + className?: string; + children: any; + onClick?: OnClickHandler; + href?: string; + download?: string; + disabled?: boolean; + destructive?: boolean; + ariaLabel?: string; +}; + +const MenuItem: FC = (props) => { + const { + icon, + className, + children, + onClick, + href, + download, + disabled, + destructive, + ariaLabel, + } = props; + + const handleClick = useCallback((e: React.MouseEvent) => { + if (disabled || !onClick) { + e.stopPropagation(); + e.preventDefault(); + + return; + } + + onClick(e); + }, [disabled, onClick]); + + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.keyCode !== 13 && e.keyCode !== 32) { + return; + } + + if (disabled || !onClick) { + e.stopPropagation(); + e.preventDefault(); + + return; + } + + onClick(e); + }, [disabled, onClick]); + + const fullClassName = buildClassName( + 'MenuItem', + className, + disabled && 'disabled', + destructive && 'destructive', + ); + + const content = ( + <> + {icon && ( + + )} + {children} + + ); + + if (href) { + return ( + + {content} + + ); + } + + return ( +
    + {content} +
    + ); +}; + +export default MenuItem; diff --git a/src/components/ui/Modal.scss b/src/components/ui/Modal.scss new file mode 100644 index 000000000..fde311faf --- /dev/null +++ b/src/components/ui/Modal.scss @@ -0,0 +1,139 @@ +.Modal { + position: relative; + z-index: var(--z-modal); + + &.delete, &.error, &.confirm, &.pin, &.unpin-all { + .modal-dialog { + max-width: 23rem; + } + } + + &.narrow { + .modal-dialog { + max-width: 20rem; + } + } + + .modal-container { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + } + + .modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background-color: rgba(0, 0, 0, .25); + } + + &.transparent-backdrop .modal-backdrop { + background-color: transparent; + } + + .modal-dialog { + position: relative; + display: inline-flex; + flex-direction: column; + width: 100%; + max-width: 35rem; + min-width: 17.5rem; + margin: 2rem auto; + background-color: white; + box-shadow: 0 .25rem .5rem .1rem rgba(114, 114, 114, 0.25); + border-radius: var(--border-radius-default); + transform: translate3d(0, -1rem, 0); + + transition: transform .2s ease, opacity .2s ease; + + body.animation-level-0 & { + transition: none; + transform: none !important; + } + + @media (max-width: 450px) { + max-width: calc(100vw - 3rem) !important; + } + } + + &.open .modal-dialog { + transform: translate3d(0, 0, 0); + } + + &.closing .modal-dialog { + transform: translate3d(0, 1rem, 0); + } + + .modal-header { + padding: 1rem 1rem 0; + display: flex; + align-items: center; + flex-shrink: 0; + } + + .modal-title { + font-size: 1.25rem; + font-weight: 500; + flex: 1 1 auto; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + + &:not(:only-child) { + margin: 0 1.3125rem; + } + } + + .modal-header-condensed { + @extend .modal-header; + padding: .5rem 1.25rem 0 .9375rem !important; + + .modal-action-button { + font-size: 0.875rem; + height: 2.25rem; + width: auto; + line-height: 1.625rem; + margin-left: auto; + padding-left: 1.25rem; + padding-right: 1.25rem; + min-width: 5rem; + } + } + + .modal-content { + width: 100%; + flex-grow: 1; + padding: 1rem; + overflow-y: auto; + + b, + strong { + word-break: break-word; + } + } + + .dialog-buttons { + display: flex; + align-items: flex-end; + + .confirm-dialog-button + .confirm-dialog-button { + margin-left: 1rem; + } + } + + .confirm-dialog-button { + width: auto; + height: auto; + margin-left: auto; + text-align: right; + font-weight: 500; + } +} diff --git a/src/components/ui/Modal.tsx b/src/components/ui/Modal.tsx new file mode 100644 index 000000000..aadf052f6 --- /dev/null +++ b/src/components/ui/Modal.tsx @@ -0,0 +1,127 @@ +import React, { FC, useEffect, useRef } from '../../lib/teact/teact'; + +import captureKeyboardListeners from '../../util/captureKeyboardListeners'; +import trapFocus from '../../util/trapFocus'; +import buildClassName from '../../util/buildClassName'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; +import useShowTransition from '../../hooks/useShowTransition'; +import useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps'; +import useLang from '../../hooks/useLang'; + +import Button from './Button'; +import Portal from './Portal'; + +import './Modal.scss'; + +const ANIMATION_DURATION = 200; + +type OwnProps = { + title?: string; + className?: string; + isOpen?: boolean; + header?: FC; + hasCloseButton?: boolean; + noBackdrop?: boolean; + children: any; + onClose: () => void; + onCloseAnimationEnd?: () => void; + onEnter?: () => void; +}; + +const Modal: FC = (props) => { + const { + title, + className, + isOpen, + header, + hasCloseButton, + noBackdrop, + children, + onClose, + onCloseAnimationEnd, + onEnter, + } = props; + const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd); + // eslint-disable-next-line no-null/no-null + const modalRef = useRef(null); + + useEffect(() => (isOpen + ? captureKeyboardListeners({ onEsc: onClose, onEnter }) + : undefined), [isOpen, onClose, onEnter]); + useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]); + + useEffectWithPrevDeps(([prevIsOpen]) => { + document.body.classList.toggle('has-open-dialog', isOpen); + + if (isOpen || (!isOpen && prevIsOpen !== undefined)) { + dispatchHeavyAnimationEvent(ANIMATION_DURATION); + } + + return () => { + document.body.classList.remove('has-open-dialog'); + }; + }, [isOpen]); + + const lang = useLang(); + + if (!shouldRender) { + return undefined; + } + + function renderHeader() { + if (header) { + return header; + } + + if (!title) { + return undefined; + } + + return ( +
    + {hasCloseButton && ( + + )} +
    {title}
    +
    + ); + } + + const fullClassName = buildClassName( + 'Modal', + className, + transitionClassNames, + noBackdrop && 'transparent-backdrop', + ); + + return ( + +
    +
    +
    +
    + {renderHeader()} +
    + {children} +
    +
    +
    +
    + + ); +}; + +export default Modal; diff --git a/src/components/ui/Notification.scss b/src/components/ui/Notification.scss new file mode 100644 index 000000000..53edb37a6 --- /dev/null +++ b/src/components/ui/Notification.scss @@ -0,0 +1,45 @@ +.Notification-container { + position: relative; + width: 24rem; + max-width: 100vw; + margin: .25rem auto; + z-index: var(--z-notification); + + @media (min-width: 1276px) { + transition: transform var(--layer-transition); + + body.is-right-column-shown & { + transform: translate3d(calc(var(--right-column-width) / -2), 0, 0); + } + } + + &:first-of-type { + margin-top: 4.25rem; + + .has-header-tools & { + margin-top: 7.375rem; + } + } +} + +.Notification { + background: rgba(32, 32, 32, .8) url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+") no-repeat .9375rem 50%; + background-size: 1.5rem; + border-radius: var(--border-radius-default); + padding: .9375rem .9375rem .9375rem 3.375rem; + color: #fff; + margin: 0 .5rem; + + .text-entity-link, + .text-entity-link:hover, + .text-entity-link:active { + color: #fff !important; + text-decoration: underline; + } + + .content { + line-height: 1.25; + word-break: break-word; + font-size: .9375rem; + } +} diff --git a/src/components/ui/Notification.tsx b/src/components/ui/Notification.tsx new file mode 100644 index 000000000..9c56c3e36 --- /dev/null +++ b/src/components/ui/Notification.tsx @@ -0,0 +1,81 @@ +import React, { + FC, + memo, + useCallback, + useEffect, + useRef, + useState, +} from '../../lib/teact/teact'; + +import { ANIMATION_END_DELAY } from '../../config'; +import useShowTransition from '../../hooks/useShowTransition'; +import { TextPart } from '../common/helpers/renderMessageText'; +import buildClassName from '../../util/buildClassName'; +import captureEscKeyListener from '../../util/captureEscKeyListener'; + +import Portal from './Portal'; + +import './Notification.scss'; + +type OwnProps = { + message: TextPart[]; + duration?: number; + onDismiss: () => void; +}; + +const DEFAULT_DURATION = 3000; +const ANIMATION_DURATION = 150; + +const Notification: FC = ({ message, duration = DEFAULT_DURATION, onDismiss }) => { + const [isOpen, setIsOpen] = useState(true); + // eslint-disable-next-line no-null/no-null + const timerRef = useRef(null); + + const { transitionClassNames } = useShowTransition(isOpen); + + const closeAndDismiss = useCallback(() => { + setIsOpen(false); + setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY); + }, [onDismiss]); + + useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]); + + useEffect(() => { + timerRef.current = window.setTimeout(closeAndDismiss, duration); + + return () => { + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + }; + }, [duration, closeAndDismiss]); + + const handleMouseEnter = useCallback(() => { + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + }, []); + + const handleMouseLeave = useCallback(() => { + timerRef.current = window.setTimeout(closeAndDismiss, duration); + }, [duration, closeAndDismiss]); + + return ( + +
    +
    + {message} +
    +
    +
    + ); +}; + +export default memo(Notification); diff --git a/src/components/ui/Portal.ts b/src/components/ui/Portal.ts new file mode 100644 index 000000000..2c73428e1 --- /dev/null +++ b/src/components/ui/Portal.ts @@ -0,0 +1,35 @@ +import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact'; +import TeactDOM from '../../lib/teact/teact-dom'; + +type OwnProps = { + containerId?: string; + className?: string; + children: any; +}; + +const Portal: FC = ({ containerId, className, children }) => { + const elementRef = useRef(document.createElement('div')); + + useLayoutEffect(() => { + const container = document.querySelector(containerId || '#portals'); + if (!container) { + return undefined; + } + + const element = elementRef.current; + if (className) { + element.classList.add(className); + } + + container.appendChild(element); + + return () => { + TeactDOM.render(undefined, element); + container.removeChild(element); + }; + }, [className, containerId]); + + return TeactDOM.render(children, elementRef.current); +}; + +export default Portal; diff --git a/src/components/ui/ProgressSpinner.scss b/src/components/ui/ProgressSpinner.scss new file mode 100644 index 000000000..233df04c8 --- /dev/null +++ b/src/components/ui/ProgressSpinner.scss @@ -0,0 +1,81 @@ +.ProgressSpinner { + position: relative; + z-index: 1; + width: 3.375rem; + height: 3.375rem; + background: rgba(0, 0, 0, .25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%; + border-radius: 50%; + cursor: pointer; + + &.no-cross { + background: transparent !important; + pointer-events: none; + } + + &.square { + background-image: none; + + &::after { + content: ''; + position: absolute; + width: .8125rem; + height: .8125rem; + border-radius: .125rem; + background-color: #fff; + left: 50%; + top: 50%; + transform: translate3d(-50%, -50%, 0); + } + } + + &.size-s, &.size-m { + width: auto; + height: auto; + background: transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%; + + &.square { + background-image: none; + width: .75rem; + height: .75rem; + } + } + + &.size-xl { + width: 3.25rem; + height: 3.25rem; + + svg { + width: 3rem; + height: 3rem; + margin: .125rem; + } + + circle { + stroke-width: 3px; + } + } + + &.transparent { + background-color: transparent !important; + } + + svg { + display: block; + transform: rotate(-90deg); + transform-origin: 50% 50%; + animation: 4s linear 0s infinite ProgressSpinnerAnimation; + } + + circle { + transition: stroke-dashoffset .5s; + } +} + +@keyframes ProgressSpinnerAnimation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/src/components/ui/ProgressSpinner.tsx b/src/components/ui/ProgressSpinner.tsx new file mode 100644 index 000000000..b75d77e8b --- /dev/null +++ b/src/components/ui/ProgressSpinner.tsx @@ -0,0 +1,85 @@ +import React, { + FC, useEffect, useRef, memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './ProgressSpinner.scss'; + +const RADIUSES = { + s: 22, m: 25, l: 28, xl: 20, +}; +const STROKE_WIDTH = 2; +const MIN_PROGRESS = 0.05; +const MAX_PROGRESS = 1; + +const ProgressSpinner: FC<{ + progress?: number; + size?: 's' | 'm' | 'l' | 'xl'; + square?: boolean; + transparent?: boolean; + noCross?: boolean; + onClick?: (e: React.MouseEvent) => void; +}> = ({ + progress = 0, + size = 'l', + square, + transparent, + noCross, + onClick, +}) => { + const radius = RADIUSES[size]; + const circleRadius = radius - STROKE_WIDTH * 2; + const borderRadius = radius - 1; + const circumference = circleRadius * 2 * Math.PI; + // eslint-disable-next-line no-null/no-null + const container = useRef(null); + + useEffect(() => { + if (!container.current) { + return; + } + + const svg = container.current.firstElementChild; + const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference; + + if (!svg) { + container.current.innerHTML = ` + + `; + } else { + (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString()); + } + }, [container, circumference, borderRadius, circleRadius, progress]); + + const className = buildClassName( + `ProgressSpinner size-${size}`, + transparent && 'transparent', + square && 'square', + noCross && 'no-cross', + ); + + return ( +
    + ); +}; + +export default memo(ProgressSpinner); diff --git a/src/components/ui/Radio.scss b/src/components/ui/Radio.scss new file mode 100644 index 000000000..4f0e11622 --- /dev/null +++ b/src/components/ui/Radio.scss @@ -0,0 +1,108 @@ +.Radio { + display: block; + position: relative; + padding-left: 4.5rem; + text-align: left; + margin-bottom: 1.5rem; + line-height: 1.5rem; + cursor: pointer; + + &.disabled { + pointer-events: none; + opacity: 0.5; + } + + &.hidden-widget { + cursor: default; + .Radio-main { + &::before, &::after { + visibility: hidden; + } + } + } + + > input { + position: absolute; + z-index: var(--z-below); + opacity: 0; + } + + .Radio-main { + &::before, &::after { + content: ''; + display: block; + position: absolute; + left: 1.0625rem; + top: 50%; + width: 1.25rem; + height: 1.25rem; + transform: translateY(-50%); + } + + &::before { + border: 2px solid var(--color-borders); + border-radius: 50%; + background-color: white; + opacity: 1; + transition: border-color .1s ease, opacity .1s ease; + } + + &::after { + left: 1.375rem; + width: 0.625rem; + height: 0.625rem; + border-radius: 50%; + background: var(--color-primary); + opacity: 0; + transition: opacity .1s ease; + } + + .label { + display: block; + word-break: break-word; + } + + .subLabel { + display: block; + font-size: 0.875rem; + line-height: 1rem; + color: var(--color-text-secondary); + } + } + + input:checked ~ .Radio-main { + &::before { + border-color: var(--color-primary); + } + + &::after { + opacity: 1; + } + } + + &.loading { + .Radio-main::before, + .Radio-main::after { + opacity: 0 !important; + } + + .Spinner { + position: absolute; + left: 1.0625rem; + top: 50%; + transform: translateY(-50%); + opacity: 0; + animation: fade-in .2s ease forwards; + --spinner-size: 1.25rem; + } + } +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/src/components/ui/Radio.tsx b/src/components/ui/Radio.tsx new file mode 100644 index 000000000..508776108 --- /dev/null +++ b/src/components/ui/Radio.tsx @@ -0,0 +1,61 @@ +import { ChangeEvent } from 'react'; +import React, { FC, memo } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; +import Spinner from './Spinner'; + +import './Radio.scss'; + +type OwnProps = { + id?: string; + name: string; + label: string; + subLabel?: string; + value: string; + checked: boolean; + disabled?: boolean; + hidden?: boolean; + isLoading?: boolean; + onChange: (e: ChangeEvent) => void; +}; + +const Radio: FC = ({ + id, + label, + subLabel, + value, + name, + checked, + disabled, + hidden, + isLoading, + onChange, +}) => { + const className = buildClassName( + 'Radio', + disabled && 'disabled', + hidden && 'hidden-widget', + isLoading && 'loading', + ); + + return ( + + ); +}; + +export default memo(Radio); diff --git a/src/components/ui/RadioGroup.tsx b/src/components/ui/RadioGroup.tsx new file mode 100644 index 000000000..0f0302012 --- /dev/null +++ b/src/components/ui/RadioGroup.tsx @@ -0,0 +1,55 @@ +import { ChangeEvent } from 'react'; +import React, { FC, useCallback, memo } from '../../lib/teact/teact'; +import Radio from './Radio'; + +type IRadioOption = { + label: string; + subLabel?: string; + value: string; + hidden?: boolean; +}; + +type OwnProps = { + id?: string; + name: string; + options: IRadioOption[]; + selected?: string; + disabled?: boolean; + loadingOption?: string; + onChange: (value: string) => void; +}; + +const RadioGroup: FC = ({ + id, + name, + options, + selected, + disabled, + loadingOption, + onChange, +}) => { + const handleChange = useCallback((event: ChangeEvent) => { + const { value } = event.currentTarget; + onChange(value); + }, [onChange]); + + return ( +
    + {options.map((option) => ( +
    + ); +}; + +export default memo(RadioGroup); diff --git a/src/components/ui/RangeSlider.scss b/src/components/ui/RangeSlider.scss new file mode 100644 index 000000000..f90b563b4 --- /dev/null +++ b/src/components/ui/RangeSlider.scss @@ -0,0 +1,141 @@ +@mixin thumb-styles() { + background: var(--slider-color); + border: none; + height: 0.75rem; + width: 0.75rem; + border-radius: 50%; + cursor: pointer; + transform: scale(1); + transition: transform .25s ease-in-out; + + &:hover { + transform: scale(1.2); + } +} + +.RangeSlider { + --slider-color: var(--color-primary); + + margin-bottom: 1rem; + + &.disabled { + pointer-events: none; + --slider-color: var(--color-text-secondary); + } + + .slider-top-row { + display: flex; + justify-content: space-between; + margin-bottom: 0.625rem; + + .value { + flex-shrink: 0; + margin-left: 1rem; + color: var(--color-text-secondary); + } + } + + .slider-main { + position: relative; + z-index: 1; + + &::before { + content: ''; + position: absolute; + width: 100%; + left: 0; + top: 0.3125rem; + height: 0.125rem; + background-color: var(--color-borders); + border-radius: 0.125rem; + opacity: 0.5; + z-index: -1; + } + } + + .slider-fill-track { + position: absolute; + width: 100%; + left: 0; + top: 0.3125rem; + height: 0.125rem; + background-color: var(--slider-color); + border-radius: 0.125rem; + pointer-events: none; + } + + // Reset range input browser styles + input[type="range"] { + -webkit-appearance: none; + display: block; + width: 100%; + height: 0.75rem; + margin-bottom: 0.5rem; + background: transparent; + + &:focus { + outline: none; + } + + &::-ms-track { + width: 100%; + cursor: pointer; + + background: transparent; + border-color: transparent; + color: transparent; + } + + &::-webkit-slider-thumb { + -webkit-appearance: none; + } + } + + // Apply custom styles + input[type="range"] { + // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors. + // Browsers will drop the entire selector if it doesn't understand a part of it. + &::-webkit-slider-thumb { + @include thumb-styles(); + } + + &::-moz-range-thumb { + @include thumb-styles(); + } + + &::-ms-thumb { + @include thumb-styles(); + } + } + + .slider-options { + display: grid; + grid-template-rows: auto; + grid-auto-columns: 1fr; + grid-auto-flow: column; + } + + .slider-option { + font-size: 0.825rem; + text-align: center; + cursor: pointer; + color: var(--color-text-secondary); + transition: color .2s ease; + + &:hover, &.active { + color: var(--color-text); + } + + &.active { + font-weight: 500; + } + + &:first-child { + text-align: left; + } + + &:last-child { + text-align: right; + } + } +} diff --git a/src/components/ui/RangeSlider.tsx b/src/components/ui/RangeSlider.tsx new file mode 100644 index 000000000..ccd8fea0a --- /dev/null +++ b/src/components/ui/RangeSlider.tsx @@ -0,0 +1,97 @@ +import { ChangeEvent } from 'react'; +import React, { + FC, useCallback, useMemo, memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './RangeSlider.scss'; + +type OwnProps = { + options?: string[]; + range?: { min: number; max: number; step?: number }; + label?: string; + value: number; + disabled?: boolean; + onChange: (value: number) => void; +}; + +const RangeSlider: FC = ({ + options, + range, + label, + value, + disabled, + onChange, +}) => { + const handleChange = useCallback((event: ChangeEvent) => { + onChange(Number(event.currentTarget.value)); + }, [onChange]); + + const className = buildClassName( + 'RangeSlider', + disabled && 'disabled', + ); + + const trackWidth = useMemo(() => { + if (options) { + return (value / (options.length - 1)) * 100; + } else if (range) { + const possibleValuesLength = (range.max - range.min) / (range.step || 1); + return ((value - range.min) / possibleValuesLength) * 100; + } + return 0; + }, [value, options, range]); + + const [min, max, step] = useMemo(() => { + if (options) { + return [0, options.length - 1, 1]; + } else if (range) { + return [range.min, range.max, range.step || 1]; + } + + return [0, 0, 0]; + }, [range, options]); + + return ( +
    + {label && ( +
    + {label} + {range && ( + {value} + )} +
    + )} +
    +
    + + {options && ( +
    + {options.map((option, index) => ( +
    onChange(index)} + > + {option} +
    + ))} +
    + )} +
    +
    + ); +}; + +export default memo(RangeSlider); diff --git a/src/components/ui/ResponsiveHoverButton.tsx b/src/components/ui/ResponsiveHoverButton.tsx new file mode 100644 index 000000000..319706ec9 --- /dev/null +++ b/src/components/ui/ResponsiveHoverButton.tsx @@ -0,0 +1,60 @@ +import React, { + FC, useRef, useCallback, memo, +} from '../../lib/teact/teact'; + +import { IS_TOUCH_ENV } from '../../util/environment'; + +import Button, { OwnProps as ButtonProps } from './Button'; + +type OwnProps = { + onActivate: NoneToVoidFunction; +} & Omit; + +const BUTTON_ACTIVATE_DELAY = 200; +let openTimeout: number | undefined; +let isFirstTimeActivation = true; + +const ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => { + const isMouseInside = useRef(false); + + const handleMouseEnter = useCallback(() => { + isMouseInside.current = true; + + // This is used to counter additional delay caused by asynchronous module loading + if (isFirstTimeActivation) { + isFirstTimeActivation = false; + onActivate(); + return; + } + + if (openTimeout) { + clearTimeout(openTimeout); + openTimeout = undefined; + } + openTimeout = window.setTimeout(() => { + if (isMouseInside.current) { + onActivate(); + } + }, BUTTON_ACTIVATE_DELAY); + }, [onActivate]); + + const handleMouseLeave = useCallback(() => { + isMouseInside.current = false; + }, []); + + return ( + + )} +
    + ); +}; + +export default memo(SearchInput); diff --git a/src/components/ui/Select.tsx b/src/components/ui/Select.tsx new file mode 100644 index 000000000..9097a0f65 --- /dev/null +++ b/src/components/ui/Select.tsx @@ -0,0 +1,60 @@ +import { ChangeEvent, RefObject } from 'react'; +import React, { FC, memo } from '../../lib/teact/teact'; + + +import buildClassName from '../../util/buildClassName'; + +type OwnProps = { + id?: string; + value?: string; + label?: string; + error?: string; + ref?: RefObject; + hasArrow?: boolean; + placeholder?: string; + onChange?: (e: ChangeEvent) => void; + children: any; +}; + +const Select: FC = (props) => { + const { + id, + value, + label, + hasArrow, + error, + ref, + placeholder, + onChange, + children, + } = props; + const labelText = error || label; + const fullClassName = buildClassName( + 'input-group', + value && 'touched', + error && 'error', + labelText && 'with-label', + hasArrow && 'with-arrow', + 'input-group', + ); + + return ( +
    + + {labelText && id && ( + + )} +
    + ); +}; + +export default memo(Select); diff --git a/src/components/ui/ShowMoreButton.scss b/src/components/ui/ShowMoreButton.scss new file mode 100644 index 000000000..5564639c0 --- /dev/null +++ b/src/components/ui/ShowMoreButton.scss @@ -0,0 +1,19 @@ +.ShowMoreButton { + color: var(--text-color) !important; + display: flex; + align-items: center; + text-align: left; + text-transform: none; + padding-left: .75rem !important; + opacity: 1 !important; + + i { + font-size: 1.5rem; + margin-right: 2rem; + color: var(--color-text-secondary); + } + + .Spinner { + top: 0.4375rem; + } +} diff --git a/src/components/ui/ShowMoreButton.tsx b/src/components/ui/ShowMoreButton.tsx new file mode 100644 index 000000000..bdd7039fe --- /dev/null +++ b/src/components/ui/ShowMoreButton.tsx @@ -0,0 +1,37 @@ +import React, { FC } from '../../lib/teact/teact'; + +import Button from './Button'; + +import './ShowMoreButton.scss'; + +type OwnProps = { + count: number; + itemName: string; + itemPluralName?: string; + isLoading?: boolean; + onClick: () => void; +}; + +const ShowMoreButton: FC = ({ + count, + itemName, + itemPluralName, + isLoading, + onClick, +}) => { + return ( + + ); +}; + +export default ShowMoreButton; diff --git a/src/components/ui/ShowTransition.tsx b/src/components/ui/ShowTransition.tsx new file mode 100644 index 000000000..0b81e8da7 --- /dev/null +++ b/src/components/ui/ShowTransition.tsx @@ -0,0 +1,41 @@ +import React, { FC, useRef } from '../../lib/teact/teact'; + +import useShowTransition from '../../hooks/useShowTransition'; +import usePrevious from '../../hooks/usePrevious'; +import buildClassName from '../../util/buildClassName'; + +type ChildrenFn = () => any; + +type OwnProps = { + isOpen: boolean; + isCustom?: boolean; + id?: string; + className?: string; + onClick?: (e: React.MouseEvent) => void; + children: ChildrenFn; +}; + +const ShowTransition: FC = ({ + isOpen, isCustom, id, className, onClick, children, +}) => { + const { shouldRender, transitionClassNames } = useShowTransition( + isOpen, undefined, undefined, isCustom ? false : undefined, + ); + const prevIsOpen = usePrevious(isOpen); + const prevChildren = usePrevious(children); + const fromChildrenRef = useRef(); + + if (prevIsOpen && !isOpen) { + fromChildrenRef.current = prevChildren; + } + + return ( + shouldRender && ( +
    + {isOpen ? children() : fromChildrenRef.current!()} +
    + ) + ); +}; + +export default ShowTransition; diff --git a/src/components/ui/SimpleInfiniteScroll.tsx b/src/components/ui/SimpleInfiniteScroll.tsx new file mode 100644 index 000000000..458bded74 --- /dev/null +++ b/src/components/ui/SimpleInfiniteScroll.tsx @@ -0,0 +1,81 @@ +import { RefObject, UIEvent } from 'react'; +import { LoadMoreDirection } from '../../types'; + +import React, { + FC, useCallback, useEffect, useMemo, useRef, +} from '../../lib/teact/teact'; + +import { debounce } from '../../util/schedulers'; + +type OwnProps = { + ref?: RefObject; + className?: string; + onLoadMore: ({ direction }: { direction: LoadMoreDirection }) => void; + onScroll?: (e: UIEvent) => void; + items: any[]; + sensitiveArea?: number; + preloadBackwards?: number; + children: any; +}; + +const DEFAULT_SENSITIVE_AREA = 1200; +const DEFAULT_PRELOAD_BACKWARDS = 20; + +const SimpleInfiniteScroll: FC = ({ + ref, + className, + onLoadMore, + onScroll, + items, + sensitiveArea = DEFAULT_SENSITIVE_AREA, + preloadBackwards = DEFAULT_PRELOAD_BACKWARDS, + children, +}: OwnProps) => { + // eslint-disable-next-line no-null/no-null + let containerRef = useRef(null); + if (ref) { + containerRef = ref; + } + + // eslint-disable-next-line no-null/no-null + const anchorTopRef = useRef(null); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const onLoadMoreDebounced = useMemo(() => debounce(onLoadMore, 1000, true, false), [onLoadMore, items]); + + useEffect(() => { + if (!items || items.length < preloadBackwards) { + onLoadMoreDebounced({ direction: LoadMoreDirection.Backwards }); + } + }, [items, onLoadMoreDebounced, preloadBackwards]); + + const handleScroll = useCallback((e: UIEvent) => { + if (onScroll) { + onScroll(e); + } + const container = e.target as HTMLElement; + const anchor = container.firstElementChild; + if (!anchor) { + return; + } + + const { scrollTop, scrollHeight, offsetHeight } = container; + const newAnchorTop = anchor.getBoundingClientRect().top; + const isNearBottom = scrollHeight - (scrollTop + offsetHeight) <= sensitiveArea; + const isMovingDown = typeof anchorTopRef.current === 'number' && newAnchorTop < anchorTopRef.current; + + if (isNearBottom && isMovingDown) { + onLoadMoreDebounced({ direction: LoadMoreDirection.Backwards }); + } + + anchorTopRef.current = newAnchorTop; + }, [onLoadMoreDebounced, onScroll, sensitiveArea]); + + return ( +
    + {children} +
    + ); +}; + +export default SimpleInfiniteScroll; diff --git a/src/components/ui/Spinner.scss b/src/components/ui/Spinner.scss new file mode 100644 index 000000000..3530b5452 --- /dev/null +++ b/src/components/ui/Spinner.scss @@ -0,0 +1,86 @@ +.Spinner { + --spinner-size: 2rem; + + position: relative; + display: flex; + align-items: center; + justify-content: center; + + width: var(--spinner-size); + height: var(--spinner-size); + + > div { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + + background-repeat: no-repeat; + background-size: 100%; + + animation-name: spin; + animation-duration: 1s; + animation-iteration-count: infinite; + animation-timing-function: linear; + } + + &.with-background { + &::before { + content: ''; + position: absolute; + left: -0.125rem; + top: -0.125rem; + bottom: -0.125rem; + right: -0.125rem; + border-radius: 50%; + background: rgba(0,0,0,0.25); + } + } + + &.white { + > div { + background-image: var(--spinner-white-data); + } + + &.with-background { + > div { + background-image: var(--spinner-white-thin-data); + } + } + } + + &.blue { + > div { + background-image: var(--spinner-blue-data); + } + } + + &.black { + > div { + background-image: var(--spinner-black-data); + } + } + + &.green { + > div { + background-image: var(--spinner-green-data); + } + } + + &.gray { + > div { + background-image: var(--spinner-gray-data); + } + } +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + diff --git a/src/components/ui/Spinner.tsx b/src/components/ui/Spinner.tsx new file mode 100644 index 000000000..08f264e5a --- /dev/null +++ b/src/components/ui/Spinner.tsx @@ -0,0 +1,21 @@ +import React, { FC } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './Spinner.scss'; + +const Spinner: FC<{ + color?: 'blue' | 'white' | 'black' | 'green' | 'gray'; + withBackground?: boolean; +}> = ({ + color = 'blue', + withBackground, +}) => { + return ( +
    +
    +
    + ); +}; + +export default Spinner; diff --git a/src/components/ui/Tab.scss b/src/components/ui/Tab.scss new file mode 100644 index 000000000..1d33077b6 --- /dev/null +++ b/src/components/ui/Tab.scss @@ -0,0 +1,83 @@ +.Tab { + flex: 1 1 auto; + appearance: none; + background: none; + width: auto; + margin: 0; + border: none; + padding: .625rem .25rem; + font-weight: 500; + color: var(--color-text-secondary); + cursor: pointer; + border-top-left-radius: var(--border-radius-messages-small); + border-top-right-radius: var(--border-radius-messages-small); + + &, + &:active, + &:focus { + outline: none; + } + + &.active { + pointer-events: none; + cursor: default; + color: var(--color-primary); + + i { + opacity: 1; + } + } + + &:not(.active):hover { + background: rgba(var(--color-text-secondary-rgb), 0.08); + } + + > span { + position: relative; + display: inline-flex; + align-items: center; + } + + .badge { + min-width: 1.25rem; + height: 1.25rem; + margin-left: 0.5rem; + background: var(--color-gray); + border-radius: 0.75rem; + padding: 0 .3125rem; + color: white; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; + text-align: center; + flex-shrink: 0; + + &.active { + background: var(--color-primary); + } + } + + i { + position: absolute; + bottom: calc(-.625rem - 1px); + left: 0; + opacity: 0; + background-color: var(--color-primary); + height: .1875rem; + width: 100%; + border-radius: .1875rem .1875rem 0 0; + pointer-events: none; + padding-right: .5rem; + margin-left: -.25rem; + box-sizing: content-box; + transform-origin: left; + + &.animate { + transition: transform var(--slide-transition); + + body.animation-level-0 & { + transition: none !important; + } + } + } +} diff --git a/src/components/ui/Tab.tsx b/src/components/ui/Tab.tsx new file mode 100644 index 000000000..ad8bfb616 --- /dev/null +++ b/src/components/ui/Tab.tsx @@ -0,0 +1,80 @@ +import React, { + FC, useLayoutEffect, useRef, memo, +} from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import './Tab.scss'; + +type OwnProps = { + className?: string; + title: string; + active?: boolean; + badgeCount?: number; + isBadgeActive?: boolean; + previousActiveTab?: number; + onClick: (arg: number) => void; + clickArg: number; +}; + +const Tab: FC = ({ + className, + title, + active, + badgeCount, + isBadgeActive, + previousActiveTab, + onClick, + clickArg, +}) => { + // eslint-disable-next-line no-null/no-null + const tabRef = useRef(null); + + useLayoutEffect(() => { + if (!active || previousActiveTab === undefined) { + return; + } + + const tab = tabRef.current!; + const indicator = tab.querySelector('i')!; + const currentIndicator = tab.parentElement!.children[previousActiveTab].querySelector('i')!; + + currentIndicator.classList.remove('animate'); + indicator.classList.remove('animate'); + + // We move and resize our indicator so it repeats the position and size of the previous one. + const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft; + const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth; + indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`; + + // 3 AFs needed here to synchronize animations with Transition component + requestAnimationFrame(() => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + // Now we remove the transform to let it animate to its own position and size. + indicator.classList.add('animate'); + indicator.style.transform = 'none'; + }); + }); + }); + }, [active, previousActiveTab]); + + return ( + + ); +}; + +export default memo(Tab); diff --git a/src/components/ui/TabList.scss b/src/components/ui/TabList.scss new file mode 100644 index 000000000..313c565c6 --- /dev/null +++ b/src/components/ui/TabList.scss @@ -0,0 +1,25 @@ +.TabList { + position: sticky; + top: 0; + flex-shrink: 0; + display: flex; + justify-content: space-between; + align-items: flex-end; + font-size: 0.875rem; + flex-wrap: nowrap; + box-shadow: 0 2px 2px rgba(114, 114, 114, 0.17); + background-color: white; + overflow-x: auto; + overflow-y: hidden; + + scrollbar-width: none; + scrollbar-color: rgba(0, 0, 0, 0); + + &::-webkit-scrollbar { + height: 0; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0); + } +} diff --git a/src/components/ui/TabList.tsx b/src/components/ui/TabList.tsx new file mode 100644 index 000000000..5256c58e1 --- /dev/null +++ b/src/components/ui/TabList.tsx @@ -0,0 +1,75 @@ +import React, { + FC, memo, useRef, useEffect, +} from '../../lib/teact/teact'; + +import fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal'; +import usePrevious from '../../hooks/usePrevious'; +import useHorizontalScroll from '../../hooks/useHorizontalScroll'; +import useLang from '../../hooks/useLang'; + +import Tab from './Tab'; + +import './TabList.scss'; + +export type TabWithProperties = { + title: string; + badgeCount?: number; + isBadgeActive?: boolean; +}; + +type OwnProps = { + tabs: readonly TabWithProperties[]; + activeTab: number; + onSwitchTab: (index: number) => void; +}; + +const TAB_SCROLL_THRESHOLD_PX = 16; + +const TabList: FC = ({ tabs, activeTab, onSwitchTab }) => { + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + const previousActiveTab = usePrevious(activeTab); + + useHorizontalScroll(containerRef); + + // Scroll container to place active tab in the center + useEffect(() => { + const container = containerRef.current!; + if (container.scrollWidth <= container.offsetWidth) { + return; + } + + const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null; + if (activeTabElement) { + const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2); + + // Prevent scrolling by only a couple of pixels, which doesn't look smooth + if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) { + return; + } + + fastSmoothScrollHorizontal(container, newLeft); + } + }, [activeTab]); + + const lang = useLang(); + + return ( +
    + {tabs.map((tab, i) => ( + + ))} +
    + ); +}; + +export default memo(TabList); diff --git a/src/components/ui/Transition.scss b/src/components/ui/Transition.scss new file mode 100644 index 000000000..33af30b12 --- /dev/null +++ b/src/components/ui/Transition.scss @@ -0,0 +1,657 @@ +.Transition { + position: relative; + + > * { + width: 100%; + height: 100%; + animation-fill-mode: forwards !important; + + &.from, &.to { + position: absolute; + top: 0; + left: 0; + } + + &:not(.active):not(.from):not(.to) { + display: none !important; // Best performance when animating container + //transform: scale(0); // Shortest initial delay + } + } + + /* + * scroll-slide + */ + + &.scroll-slide { + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + flex-wrap: nowrap; + + > * { + position: static; + flex-shrink: 0; + + &:not(.active):not(.from):not(.to) { + display: block !important; + transform: scale(0); + + &.through { + display: none !important; + } + } + } + } + + /* + * slide + */ + + &.slide { + > .to { + transform: translateX(100%); + } + + &.animating { + > .from { + animation: slide-out var(--slide-transition); + } + + > .to { + animation: slide-in var(--slide-transition); + } + } + } + + &.slide.backwards { + > .to { + transform: translateX(-100%); + } + + &.animating { + > .from { + animation: slide-in-backwards var(--slide-transition); + } + + > .to { + animation: slide-out-backwards var(--slide-transition); + } + } + } + + /* + * mv-slide + */ + + &.mv-slide { + > * > div { + animation-fill-mode: forwards !important; + } + + > .to > div { + transform: translateX(100vw); + } + + &.animating { + > .from > div { + animation: mv-slide-out .4s ease; + } + + > .to > div { + animation: mv-slide-in .4s ease; + } + } + } + + &.mv-slide.backwards { + > .to > div { + transform: translateX(-100vw); + } + + &.animating { + > .from > div { + animation: mv-slide-in-backwards .4s ease; + } + + > .to > div { + animation: mv-slide-out-backwards .4s ease; + } + } + } + + /* + * slide-fade + */ + &.slide-fade { + > .from { + transform-origin: left; + transform: translateX(0); + opacity: 1; + } + + > .to { + transform-origin: left; + transform: translateX(1.5rem); + opacity: 0; + } + + &.animating { + > .from { + animation: fade-out-opacity var(--slide-transition), slide-fade-out-move var(--slide-transition); + } + + > .to { + animation: fade-in-opacity var(--slide-transition), slide-fade-in-move var(--slide-transition); + } + } + } + + &.slide-fade.backwards { + > .from { + transform: translateX(0); + opacity: 1; + } + + > .to { + transform: translateX(-1.5rem); + opacity: 0; + } + + &.animating { + > .from { + animation: fade-in-backwards-opacity var(--slide-transition), slide-fade-in-backwards-move var(--slide-transition); + } + + > .to { + animation: fade-out-backwards-opacity var(--slide-transition), slide-fade-out-backwards-move var(--slide-transition); + } + } + } + + /* + * zoom-fade + */ + &.zoom-fade { + > .from { + transform-origin: center; + transform: scale(1); + opacity: 1; + } + + > .to { + transform-origin: center; + opacity: 0; + // We can omit `transform: scale(1.1);` here because `opacity` is 0. + // We need to for proper position calculation in `InfiniteScroll`. + } + + &.animating { + > .from { + animation: fade-out-opacity .15s ease; + } + + > .to { + animation: fade-in-opacity .15s ease, zoom-fade-in-move .15s ease; + } + } + } + + &.zoom-fade.backwards { + > .from { + transform: scale(1); + } + + > .to { + transform: scale(0.95); + } + + &.animating { + > .from { + animation: fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease; + } + + > .to { + animation: fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease; + } + } + } + + /* + * fade + */ + &.fade { + > .from { + opacity: 1; + } + + > .to { + opacity: 0; + } + + &.animating { + > .from { + animation: fade-out-opacity .15s ease; + } + + > .to { + animation: fade-in-opacity .15s ease; + } + } + } + + /* + * slide-layers + */ + + &.slide-layers { + --background-color: var(--color-white); + background: black; + + > div { + background: var(--background-color); + } + + > .to { + transform: translateX(100%); + } + + &.animating { + > .from { + animation: slide-layers-out var(--layer-transition); + } + + > .to { + animation: slide-in var(--layer-transition); + } + } + } + + &.slide-layers.backwards { + > .to { + transform: translateX(-20%); + opacity: 0.75; + } + + &.animating { + > .from { + animation: slide-in-backwards var(--layer-transition); + } + + > .to { + animation: slide-layers-out-backwards var(--layer-transition); + } + } + } + + /* + * push-slide + */ + + &.push-slide { + > div { + background: white; + } + + > .from { + transform-origin: center; + transform: scale(1); + opacity: 1; + + .custom-scroll { + scrollbar-color: transparent !important; + + &::-webkit-scrollbar-thumb { + background-color: transparent !important; + } + } + } + + > .to { + transform: translateX(100%); + } + + &.animating { + > .from { + animation: push-out .3s ease-in-out; + } + + > .to { + animation: slide-in-200 .3s ease-in-out; + } + } + } + + &.push-slide.backwards { + > .to { + transform: scale(0.7); + } + + &.animating { + > .from { + animation: slide-in-200-backwards .3s ease-in-out; + } + + > .to { + animation: push-out-backwards .3s ease-in-out; + } + } + } + + /* + * slide-fade + */ + &.reveal { + > .to { + clip-path: inset(0 100% 0 0); + } + + &.animating { + > .to { + animation: reveal-in 350ms ease-in; + } + } + } + + &.reveal.backwards { + > .from { + clip-path: inset(0 0 0 0); + } + + > .to { + clip-path: none; + } + + &.animating { + > .from { + animation: reveal-in-backwards 350ms ease-out; + } + + > .to { + animation: none; + } + } + } +} + +/* + * common + */ +@keyframes fade-in-opacity { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fade-out-opacity { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes fade-in-backwards-opacity { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes fade-out-backwards-opacity { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/* + * slide + */ +@keyframes slide-in { + 0% { + transform: translateX(100%); + } + 100% { + transform: translateX(0); + } +} + +@keyframes slide-out { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-100%); + } +} + +@keyframes slide-in-backwards { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(100%); + } +} + +@keyframes slide-out-backwards { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(0); + } +} + +/* + * mv-slide + */ +@keyframes mv-slide-in { + 0% { + transform: translateX(100vw); + } + 100% { + transform: translateX(0); + } +} + +@keyframes mv-slide-out { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-100vw); + } +} + +@keyframes mv-slide-in-backwards { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(100vw); + } +} + +@keyframes mv-slide-out-backwards { + 0% { + transform: translateX(-100vw); + } + 100% { + transform: translateX(0); + } +} + +/* + * slide-fade + */ +@keyframes slide-fade-in-move { + 0% { + transform: translateX(1.5rem); + } + 100% { + transform: translateX(0); + } +} + +@keyframes slide-fade-out-move { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-1.5rem); + } +} + +@keyframes slide-fade-in-backwards-move { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(1.5rem); + } +} + +@keyframes slide-fade-out-backwards-move { + 0% { + transform: translateX(-1.5rem); + } + 100% { + transform: translateX(0); + } +} + +/* + * zoom-fade + */ +@keyframes zoom-fade-in-move { + 0% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } +} + +@keyframes zoom-fade-in-backwards-move { + 0% { + transform: scale(1); + } + 100% { + transform: scale(1.1); + } +} + +@keyframes zoom-fade-out-backwards-move { + 0% { + transform: scale(0.95); + } + 100% { + transform: scale(1); + } +} + +/* + * slide-layers + */ +@keyframes slide-layers-out { + 0% { + transform: translateX(0); + opacity: 1; + } + 100% { + transform: translateX(-20%); + opacity: calc(1 - var(--layer-blackout-opacity)); + } +} + +@keyframes slide-layers-out-backwards { + 0% { + transform: translateX(-20%); + opacity: calc(1 - var(--layer-blackout-opacity)); + } + 100% { + transform: translateX(0); + opacity: 1; + } +} + +/* + * push-slide + */ + +@keyframes push-out { + 0% { + transform: scale(1); + opacity: 1; + } + 100% { + transform: scale(0.7); + opacity: 0; + } +} + +@keyframes push-out-backwards { + 0% { + transform: scale(0.7); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +/* + * slide + */ +@keyframes slide-in-200 { + 0% { + transform: translateX(200%); + } + 100% { + transform: translateX(0); + } +} + +@keyframes slide-in-200-backwards { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(200%); + } +} + +/* + * slide + */ +@keyframes reveal-in { + 0% { + clip-path: inset(0 100% 0 0); + } + 100% { + clip-path: inset(0 0 0 0); + } +} + +/* + * slide + */ +@keyframes reveal-in-backwards { + 0% { + clip-path: inset(0 0 0 0); + } + 100% { + clip-path: inset(0 100% 0 0); + } +} diff --git a/src/components/ui/Transition.tsx b/src/components/ui/Transition.tsx new file mode 100644 index 000000000..257eb6901 --- /dev/null +++ b/src/components/ui/Transition.tsx @@ -0,0 +1,259 @@ +import { RefObject } from 'react'; +import React, { + FC, useLayoutEffect, useRef, +} from '../../lib/teact/teact'; +import { withGlobal } from '../../lib/teact/teactn'; + +import { ANIMATION_END_DELAY } from '../../config'; +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import useForceUpdate from '../../hooks/useForceUpdate'; +import usePrevious from '../../hooks/usePrevious'; +import buildClassName from '../../util/buildClassName'; +import { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck'; + +import './Transition.scss'; + +type ChildrenFn = (isActive: boolean, isFrom: boolean) => any; +type OwnProps = { + ref?: RefObject; + activeKey: number; + name: ( + 'none' | 'slide' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'scroll-slide' | 'fade' | 'slide-layers' + | 'push-slide' | 'reveal' + ); + direction?: 'auto' | 'inverse' | 1 | -1; + renderCount?: number; + shouldRestoreHeight?: boolean; + shouldCleanup?: boolean; + id?: string; + className?: string; + onStart?: () => void; + onStop?: () => void; + children: ChildrenFn; +}; + +type StateProps = { + animationLevel: number; +}; + +const ANIMATION_DURATION = { + slide: 450, + 'mv-slide': 400, + 'slide-fade': 400, + 'zoom-fade': 150, + 'scroll-slide': 500, + fade: 150, + 'slide-layers': IS_MOBILE_SCREEN ? 450 : 300, + 'push-slide': 300, + reveal: 350, +}; + +const CLEANED_UP = Symbol('CLEANED_UP'); + +const Transition: FC = ({ + ref, + activeKey, + name, + direction = 'auto', + renderCount, + shouldRestoreHeight, + shouldCleanup, + id, + className, + onStart, + onStop, + children, + animationLevel, +}) => { + // eslint-disable-next-line no-null/no-null + let containerRef = useRef(null); + if (ref) { + containerRef = ref; + } + + const rendersRef = useRef>({}); + const prevActiveKey = usePrevious(activeKey); + const activateTimeoutRef = useRef(); + const forceUpdate = useForceUpdate(); + + const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey; + + if (!renderCount && activeKeyChanged) { + rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] }; + } + + rendersRef.current[activeKey] = children; + + useLayoutEffect(() => { + function cleanup() { + if (!shouldCleanup) { + return; + } + + rendersRef.current = { [prevActiveKey]: CLEANED_UP }; + forceUpdate(); + } + + const container = containerRef.current!; + + const childElements = container.children; + if (childElements.length === 1 && !activeKeyChanged) { + childElements[0].classList.add('active'); + + return; + } + + const childNodes = Array.from(container.childNodes); + + if (!activeKeyChanged || !childNodes.length) { + return; + } + + if (activateTimeoutRef.current) { + clearTimeout(activateTimeoutRef.current); + activateTimeoutRef.current = undefined; + } + + const isBackwards = ( + direction === -1 + || (direction === 'auto' && prevActiveKey > activeKey) + || (direction === 'inverse' && prevActiveKey < activeKey) + ); + + container.classList.remove('animating'); + container.classList.toggle('backwards', isBackwards); + + const keys = Object.keys(rendersRef.current).map(Number); + const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey); + const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey); + + if (name === 'none' || animationLevel === 0) { + childNodes.forEach((node, i) => { + if (node instanceof HTMLElement) { + node.classList.remove('from', 'through', 'to'); + node.classList.toggle('active', i === activeIndex); + } + }); + + cleanup(); + + return; + } + + childNodes.forEach((node, i) => { + if (node instanceof HTMLElement) { + node.classList.remove('active'); + node.classList.toggle('from', i === prevActiveIndex); + node.classList.toggle('through', ( + (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex) + )); + node.classList.toggle('to', i === activeIndex); + } + }); + + if (name === 'scroll-slide') { + const width = container.offsetWidth; + container.scrollBy({ + left: activeIndex > prevActiveIndex ? width : -width, + behavior: 'smooth', + }); + } + + if (animationLevel > 0) { + dispatchHeavyAnimationEvent(ANIMATION_DURATION[name] + ANIMATION_END_DELAY); + } + + requestAnimationFrame(() => { + container.classList.add('animating'); + + activateTimeoutRef.current = window.setTimeout(() => { + requestAnimationFrame(() => { + container.classList.remove('animating', 'backwards'); + + childNodes.forEach((node, i) => { + if (node instanceof HTMLElement) { + node.classList.remove('from', 'through', 'to'); + node.classList.toggle('active', i === activeIndex); + } + }); + + if (name === 'scroll-slide') { + container.scrollLeft = activeKey * container.offsetWidth; + } + + if (shouldRestoreHeight) { + const activeElement = container.querySelector('.active'); + + if (activeElement) { + activeElement.style.height = 'auto'; + container.style.height = `${activeElement.clientHeight}px`; + } + } + + cleanup(); + + if (onStop) { + onStop(); + } + }); + }, ANIMATION_DURATION[name] + ANIMATION_END_DELAY); + + if (onStart) { + onStart(); + } + }); + }, [ + activeKey, + prevActiveKey, + activeKeyChanged, + direction, + name, + onStart, + onStop, + renderCount, + shouldRestoreHeight, + shouldCleanup, + animationLevel, + forceUpdate, + ]); + + useLayoutEffect(() => { + if (shouldRestoreHeight) { + const container = containerRef.current!; + const activeElement = container.querySelector('.active') + || container.querySelector('.from'); + + if (activeElement) { + activeElement.style.height = 'auto'; + container.style.height = `${activeElement.clientHeight}px`; + } + } + }, [shouldRestoreHeight, children]); + + const renders = rendersRef.current; + const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number); + const contents = collection.map((key) => { + const render = renders[key]; + + return ( + typeof render === 'function' ?
    {render(key === activeKey, key === prevActiveKey)}
    : undefined + ); + }); + + const fullClassName = buildClassName( + 'Transition', + className, + animationLevel === 0 && name === 'scroll-slide' ? 'slide' : name, + ); + + return ( +
    + {contents} +
    + ); +}; + +export default withGlobal((global) => { + const { animationLevel } = global.settings.byKey; + return { animationLevel }; +})(Transition); diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 000000000..2cd58d771 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,117 @@ +export const DEBUG = ( + process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test' +); +export const DEBUG_MORE = false; + +export const IS_TEST = process.env.APP_ENV === 'test'; +export const IS_PERF = process.env.APP_ENV === 'perf'; + +export const DEBUG_ALERT_MSG = 'Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.'; +export const DEBUG_GRAMJS = false; + +export const GRAMJS_SESSION_ID_KEY = 'GramJs:sessionId'; + +export const GLOBAL_STATE_CACHE_DISABLED = false; +export const GLOBAL_STATE_CACHE_KEY = 'tt-global-state'; +export const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30; + +export const MEDIA_CACHE_DISABLED = false; +export const MEDIA_CACHE_NAME = 'tt-media'; +export const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars'; +export const MEDIA_PROGRESSIVE_CACHE_DISABLED = false; +export const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive'; +export const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB +export const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg'; +export const LANG_CACHE_NAME = 'tt-lang-packs'; +export const ASSET_CACHE_NAME = 'tt-assets'; + +export const API_UPDATE_THROTTLE = 300; +export const API_THROTTLE_RESET_UPDATES = new Set([ + 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory', +]); + +export const DOWNLOAD_WORKERS = 16; +export const UPLOAD_WORKERS = 16; + +const isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900; + +export const MIN_PASSWORD_LENGTH = 1; + +export const MESSAGE_LIST_SENSITIVE_AREA = 750; +export const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40; +export const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2; + +export const CHAT_HEIGHT_PX = 72; +export const CHAT_LIST_SLICE = isBigScreen ? 30 : 25; +export const CHAT_LIST_LOAD_SLICE = 100; +export const SHARED_MEDIA_SLICE = 42; +export const MESSAGE_SEARCH_SLICE = 42; +export const GLOBAL_SEARCH_SLICE = 20; +export const CHANNEL_MEMBERS_LIMIT = 30; +export const PINNED_MESSAGES_LIMIT = 50; +export const BLOCKED_LIST_LIMIT = 100; + +export const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25; +export const ALL_CHATS_PRELOAD_DISABLED = false; + +export const ANIMATION_LEVEL_MIN = 0; +export const ANIMATION_LEVEL_MED = 1; +export const ANIMATION_LEVEL_MAX = 2; +export const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX; + +export const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16; + +export const DRAFT_DEBOUNCE = 10000; // 10s + +export const EDITABLE_INPUT_ID = 'editable-message-text'; +export const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal'; + +// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed +export const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px +// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo +export const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px + +export const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px +export const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px +export const MOBILE_SCREEN_MAX_WIDTH = 600; // px +export const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px +export const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px + +export const LOCAL_MESSAGE_ID_BASE = 1e9; + +export const ANIMATION_END_DELAY = 100; + +export const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13; +export const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11; +export const STICKER_SIZE_AUTH = 160; +export const STICKER_SIZE_AUTH_MOBILE = 120; +export const STICKER_SIZE_PICKER = 64; +export const STICKER_SIZE_GENERAL_SETTINGS = 48; +export const STICKER_SIZE_PICKER_HEADER = 32; +export const STICKER_SIZE_SEARCH = 64; +export const STICKER_SIZE_MODAL = 64; +export const STICKER_SIZE_TWO_FA = 160; +export const STICKER_SIZE_DISCUSSION_GROUPS = 140; +export const STICKER_SIZE_FOLDER_SETTINGS = 80; +export const MEMOJI_STICKER_ID = 'MEMOJI_STICKER'; + +export const MENU_TRANSITION_DURATION = 200; +export const SLIDE_TRANSITION_DURATION = 450; +export const LAYERS_TRANSITION_DURATION = 450; + +export const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime'; + +// eslint-disable-next-line max-len +export const RE_LINK_TEMPLATE = '((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)'; +export const RE_TME_LINK = /^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?$/gm; + +// MTProto constants +export const SERVICE_NOTIFICATIONS_USER_ID = 777000; +export const ALL_FOLDER_ID = 0; +export const ARCHIVED_FOLDER_ID = 1; +export const DELETED_COMMENTS_CHANNEL_ID = 777; +export const MAX_MEDIA_FILES_FOR_ALBUM = 10; +export const MAX_ACTIVE_PINNED_CHATS = 5; +export const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE; +export const DEFAULT_LANG_PACK = 'android'; +export const LANG_PACKS = ['android', 'ios']; diff --git a/src/global/cache.ts b/src/global/cache.ts new file mode 100644 index 000000000..d0e872437 --- /dev/null +++ b/src/global/cache.ts @@ -0,0 +1,198 @@ +import { + addCallback, addReducer, getGlobal, removeCallback, +} from '../lib/teact/teactn'; + +import { GlobalState } from './types'; +import { MAIN_THREAD_ID } from '../api/types'; + +import { onIdle, throttle } from '../util/schedulers'; +import { + DEBUG, + GLOBAL_STATE_CACHE_DISABLED, + GLOBAL_STATE_CACHE_KEY, + GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT, + GRAMJS_SESSION_ID_KEY, + MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, +} from '../config'; +import { IS_MOBILE_SCREEN } from '../util/environment'; +import { pick } from '../util/iteratees'; +import { INITIAL_STATE } from './initial'; +import { selectCurrentMessageList } from '../modules/selectors'; + +const UPDATE_THROTTLE = 1000; + +const updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false); + +export function initCache() { + if (GLOBAL_STATE_CACHE_DISABLED) { + return; + } + + addReducer('saveSession', () => { + addCallback(updateCacheThrottled); + }); + + addReducer('signOut', () => { + removeCallback(updateCacheThrottled); + localStorage.removeItem(GLOBAL_STATE_CACHE_KEY); + }); +} + +export function loadCache(initialState: GlobalState) { + if (!GLOBAL_STATE_CACHE_DISABLED) { + const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY); + if (hasActiveSession) { + addCallback(updateCacheThrottled); + return readCache(initialState); + } + } + + return undefined; +} + +function readCache(initialState: GlobalState) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.time('global-state-cache-read'); + } + + const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY); + const cached = json ? JSON.parse(json) as GlobalState : undefined; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.timeEnd('global-state-cache-read'); + } + + if (cached) { + // Pre-fill defaults for new settings which may be missing in older cache + cached.settings.byKey = { + ...initialState.settings.byKey, + ...cached.settings.byKey, + }; + } + + return { + ...initialState, + ...cached, + }; +} + +function updateCache() { + onIdle(() => { + const global = getGlobal(); + + if (global.isLoggingOut) { + return; + } + + const reducedGlobal: GlobalState = { + ...INITIAL_STATE, + ...pick(global, [ + 'authState', + 'authPhoneNumber', + 'authRememberMe', + 'authIsSessionRemembered', + 'authNearestCountry', + 'currentUserId', + 'contactList', + 'chatFolders', + 'topPeers', + 'recentEmojis', + ]), + isChatInfoShown: reduceShowChatInfo(global), + users: reduceUsers(global), + chats: reduceChats(global), + messages: reduceMessages(global), + globalSearch: { + recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds, + }, + settings: reduceSettings(global), + }; + + const json = JSON.stringify(reducedGlobal); + localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json); + }); +} + +function reduceShowChatInfo(global: GlobalState): boolean { + return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN + ? global.isChatInfoShown + : false; +} + +function reduceUsers(global: GlobalState): GlobalState['users'] { + const { users: { byId, selectedId } } = global; + + return { + byId, + selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined, + }; +} + +function reduceChats(global: GlobalState): GlobalState['chats'] { + const chatIdsToSave = [ + ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT), + ]; + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + + return { + ...global.chats, + byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave), + listIds: { + active: chatIdsToSave, + }, + isFullyLoaded: {}, + orderedPinnedIds: { + active: global.chats.orderedPinnedIds.active, + }, + }; +} + +function reduceMessages(global: GlobalState): GlobalState['messages'] { + const byChatId: GlobalState['messages']['byChatId'] = {}; + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + + const chatIdsToSave = [ + ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT), + ...(currentChatId ? [currentChatId] : []), + ]; + chatIdsToSave.forEach((chatId) => { + const current = global.messages.byChatId[chatId]; + if (!current) { + return; + } + + const mainThread = current.threadsById[MAIN_THREAD_ID]; + if (!mainThread || !mainThread.viewportIds) { + return; + } + + byChatId[chatId] = { + byId: pick(current.byId, mainThread.viewportIds), + threadsById: { + [MAIN_THREAD_ID]: mainThread, + }, + }; + }); + + const currentMessageList = selectCurrentMessageList(global); + + return { + byChatId, + messageLists: !currentMessageList || IS_MOBILE_SCREEN ? undefined : [{ + ...currentMessageList, + threadId: MAIN_THREAD_ID, + type: 'thread', + }], + }; +} + +function reduceSettings(global: GlobalState): GlobalState['settings'] { + const { byKey } = global.settings; + + return { + byKey, + privacy: {}, + }; +} diff --git a/src/global/index.ts b/src/global/index.ts new file mode 100644 index 000000000..abdceccc1 --- /dev/null +++ b/src/global/index.ts @@ -0,0 +1,12 @@ +import { addReducer } from '../lib/teact/teactn'; + +import { INITIAL_STATE } from './initial'; +import { initCache, loadCache } from './cache'; +import { cloneDeep } from '../util/iteratees'; + +initCache(); + +addReducer('init', () => { + const initial = cloneDeep(INITIAL_STATE); + return loadCache(initial) || initial; +}); diff --git a/src/global/initial.ts b/src/global/initial.ts new file mode 100644 index 000000000..d9f1d358f --- /dev/null +++ b/src/global/initial.ts @@ -0,0 +1,120 @@ +import { GlobalState } from './types'; + +import { ANIMATION_LEVEL_DEFAULT, DEFAULT_MESSAGE_TEXT_SIZE_PX } from '../config'; + +export const INITIAL_STATE: GlobalState = { + isLeftColumnShown: true, + isChatInfoShown: false, + uiReadyState: 0, + + authRememberMe: true, + + blocked: { + ids: [], + totalCount: 0, + }, + + users: { + byId: {}, + }, + + chats: { + listIds: {}, + isFullyLoaded: {}, + orderedPinnedIds: {}, + totalCount: {}, + byId: {}, + }, + + messages: { + byChatId: {}, + }, + + scheduledMessages: { + byChatId: {}, + }, + + chatFolders: { + byId: {}, + }, + + fileUploads: { + byMessageLocalId: {}, + }, + + recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'], + + stickers: { + setsById: {}, + added: {}, + recent: { + stickers: [], + }, + favorite: { + stickers: [], + }, + featured: { + setIds: [], + }, + search: {}, + forEmoji: {}, + }, + + gifs: { + saved: {}, + search: {}, + }, + + globalSearch: {}, + + localTextSearch: { + byChatThreadKey: {}, + }, + + localMediaSearch: { + byChatId: {}, + }, + + management: { + byChatId: {}, + }, + + topPeers: {}, + + mediaViewer: {}, + + audioPlayer: {}, + + forwardMessages: {}, + + pollResults: {}, + + payment: {}, + + notifications: [], + + errors: [], + + activeSessions: [], + + settings: { + byKey: { + messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX, + isBackgroundBlurred: true, + animationLevel: ANIMATION_LEVEL_DEFAULT, + messageSendKeyCombo: 'enter', + shouldAutoDownloadMediaFromContacts: true, + shouldAutoDownloadMediaInPrivateChats: true, + shouldAutoDownloadMediaInGroups: true, + shouldAutoDownloadMediaInChannels: true, + shouldAutoPlayGifs: true, + shouldAutoPlayVideos: true, + shouldSuggestStickers: true, + shouldLoopStickers: true, + language: 'en', + }, + privacy: {}, + }, + + twoFaSettings: {}, +}; diff --git a/src/global/types.ts b/src/global/types.ts new file mode 100644 index 000000000..aa1afe120 --- /dev/null +++ b/src/global/types.ts @@ -0,0 +1,445 @@ +import { + ApiChat, + ApiMessage, + ApiThreadInfo, + ApiUser, + ApiUpdateAuthorizationStateType, + ApiUpdateConnectionStateType, + ApiStickerSet, + ApiSticker, + ApiWebPage, + ApiVideo, + ApiFormattedText, + ApiChatFolder, + ApiWallpaper, + ApiNotification, + ApiError, + ApiGlobalMessageSearchType, + ApiPaymentSavedInfo, + ApiSession, + ApiNewPoll, +} from '../api/types'; +import { + FocusDirection, + ISettings, + MediaViewerOrigin, + ChatCreationProgress, + ProfileEditProgress, + SharedMediaType, + GlobalSearchContent, + ManagementProgress, + PaymentStep, + ShippingOption, + Invoice, + Receipt, + ApiPrivacyKey, + ApiPrivacySettings, +} from '../types'; + +export type MessageListType = 'thread' | 'pinned' | 'scheduled'; + +export interface Thread { + listedIds?: number[]; + outlyingIds?: number[]; + viewportIds?: number[]; + pinnedIds?: number[]; + scheduledIds?: number[]; + scrollOffset?: number; + replyingToId?: number; + editingId?: number; + editingScheduledId?: number; + draft?: ApiFormattedText; + threadInfo?: ApiThreadInfo; + firstMessageId?: number; +} + +export type GlobalState = { + isChatInfoShown: boolean; + isStatisticsShown?: boolean; + isLeftColumnShown: boolean; + isPollModalOpen?: boolean; + uiReadyState: 0 | 1 | 2; + connectionState?: ApiUpdateConnectionStateType; + currentUserId?: number; + lastSyncTime?: number; + + // TODO Move to `auth`. + isLoggingOut?: boolean; + authState?: ApiUpdateAuthorizationStateType; + authPhoneNumber?: string; + authIsLoading?: boolean; + authIsLoadingQrCode?: boolean; + authError?: string; + authRememberMe?: boolean; + authIsSessionRemembered?: boolean; + authNearestCountry?: string; + authIsCodeViaApp?: boolean; + authHint?: string; + authQrCode?: { + token: string; + expires: number; + }; + + contactList?: { + hash: number; + userIds: number[]; + }; + + blocked: { + ids: number[]; + totalCount: number; + }; + + users: { + byId: Record; + // TODO Remove + selectedId?: number; + }; + + chats: { + // TODO Replace with `Partial` to properly handle missing keys + byId: Record; + listIds: { + active?: number[]; + archived?: number[]; + }; + orderedPinnedIds: { + active?: number[]; + archived?: number[]; + }; + totalCount: { + all?: number; + archived?: number; + }; + isFullyLoaded: { + active?: boolean; + archived?: boolean; + }; + forDiscussionIds?: number[]; + }; + + messages: { + byChatId: Record; + threadsById: Record; + }>; + messageLists?: { + chatId: number; + threadId: number; + type: MessageListType; + }[]; + contentToBeScheduled?: { + gif?: ApiVideo; + sticker?: ApiSticker; + poll?: ApiNewPoll; + isSilent?: boolean; + }; + }; + + scheduledMessages: { + byChatId: Record; + hash: number; + }>; + }; + + chatFolders: { + orderedIds?: number[]; + byId: Record; + recommended?: ApiChatFolder[]; + }; + + focusedMessage?: { + chatId?: number; + threadId?: number; + messageId?: number; + direction?: FocusDirection; + noHighlight?: boolean; + }; + + selectedMessages?: { + chatId: number; + messageIds: number[]; + }; + + fileUploads: { + byMessageLocalId: Record; + }; + + recentEmojis: string[]; + + stickers: { + setsById: Record; + added: { + hash?: number; + setIds?: string[]; + }; + recent: { + hash?: number; + stickers: ApiSticker[]; + }; + favorite: { + hash?: number; + stickers: ApiSticker[]; + }; + featured: { + hash?: number; + setIds?: string[]; + }; + search: { + query?: string; + resultIds?: string[]; + }; + forEmoji: { + emoji?: string; + stickers?: ApiSticker[]; + hash?: number; + }; + }; + + animatedEmojis?: ApiStickerSet; + + gifs: { + saved: { + hash?: number; + gifs?: ApiVideo[]; + }; + search: { + query?: string; + offset?: string; + results?: ApiVideo[]; + }; + }; + + globalSearch: { + query?: string; + date?: number; + recentlyFoundChatIds?: number[]; + currentContent?: GlobalSearchContent; + chatId?: number; + fetchingStatus?: { + chats?: boolean; + messages?: boolean; + }; + localResults?: { + chats?: ApiChat[]; + users?: ApiUser[]; + }; + globalResults?: { + chats?: ApiChat[]; + users?: ApiUser[]; + }; + resultsByType?: Partial>; + }; + + localTextSearch: { + byChatThreadKey: Record; + }; + + localMediaSearch: { + byChatId: Record>; + }>; + }; + + management: { + progress?: ManagementProgress; + byChatId: Record; + }; + + mediaViewer: { + chatId?: number; + threadId?: number; + messageId?: number; + avatarOwnerId?: number; + origin?: MediaViewerOrigin; + }; + + audioPlayer: { + chatId?: number; + messageId?: number; + }; + + topPeers: { + hash?: number; + userIds?: number[]; + lastRequestedAt?: number; + }; + + webPagePreview?: ApiWebPage; + + forwardMessages: { + isModalShown?: boolean; + fromChatId?: number; + messageIds?: number[]; + toChatId?: number; + }; + + pollResults: { + chatId?: number; + messageId?: number; + voters?: Record; + offsets?: Record; + }; + + payment: { + messageId?: number; + step?: PaymentStep; + shippingOptions?: ShippingOption[]; + formId?: string; + savedInfo?: ApiPaymentSavedInfo; + canSaveCredentials?: boolean; + invoice?: Invoice; + invoiceContent?: { + title?: string; + text?: string; + description?: string; + photoUrl?: string; + }; + nativeProvider?: string; + providerId?: number; + nativeParams?: { + needCardholderName: boolean; + needCountry: boolean; + needZip: boolean; + publishableKey: string; + }; + stripeCredentials?: { + type: string; + id: string; + }; + passwordMissing?: boolean; + savedCredentials?: { + id: string; + title: string; + }; + receipt?: Receipt; + error?: { + field?: string; + fieldError?: string; + description: string; + }; + isPaymentModalOpen?: boolean; + }; + + chatCreation?: { + progress: ChatCreationProgress; + error?: string; + }; + + profileEdit?: { + progress: ProfileEditProgress; + isUsernameAvailable?: boolean; + }; + + notifications: ApiNotification[]; + errors: ApiError[]; + + // TODO Move to settings + activeSessions: ApiSession[]; + + settings: { + byKey: ISettings; + loadedWallpapers?: ApiWallpaper[]; + privacy: Partial>; + }; + + twoFaSettings: { + hint?: string; + isLoading?: boolean; + error?: string; + waitingEmailCodeLength?: number; + }; +}; + +export type ActionTypes = ( + // system + 'init' | 'initApi' | 'apiUpdate' | 'sync' | 'saveSession' | 'afterSync' | + 'showNotification' | 'dismissNotification' | 'showError' | 'dismissError' | + // ui + 'toggleChatInfo' | 'toggleStatistics' | 'setIsUiReady' | 'addRecentEmoji' | 'addRecentSticker' | 'toggleLeftColumn' | + // auth + 'setAuthPhoneNumber' | 'setAuthCode' | 'setAuthPassword' | 'signUp' | 'returnToAuthPhoneNumber' | 'signOut' | + 'setAuthRememberMe' | 'clearAuthError' | 'uploadProfilePhoto' | 'gotToAuthQrCode' | 'clearCache' | + // chats + 'preloadTopChatMessages' | 'loadChats' | 'loadMoreChats' | 'openChat' | 'openChatWithInfo' | 'openSupportChat' | + 'loadFullChat' | 'loadSuperGroupOnlines' | 'loadTopChats' | 'requestChatUpdate' | 'updateChatMutedState' | + 'joinChannel' | 'leaveChannel' | 'deleteChannel' | 'toggleChatPinned' | 'toggleChatArchived' | 'toggleChatUnread' | + 'loadChatFolders' | 'loadRecommendedChatFolders' | 'editChatFolder' | 'addChatFolder' | 'deleteChatFolder' | + 'updateChat' | 'toggleSignatures' | 'loadGroupsForDiscussion' | 'linkDiscussionGroup' | 'unlinkDiscussionGroup' | + // messages + 'loadViewportMessages' | 'selectMessage' | 'sendMessage' | 'cancelSendingMessage' | 'pinMessage' | 'deleteMessages' | + 'markMessageListRead' | 'markMessagesRead' | 'loadMessage' | 'focusMessage' | 'focusLastMessage' | 'sendPollVote' | + 'editMessage' | 'deleteHistory' | 'enterMessageSelectMode' | 'toggleMessageSelection' | 'exitMessageSelectMode' | + 'openTelegramLink' | 'openChatByUsername' | 'requestThreadInfoUpdate' | 'setScrollOffset' | 'unpinAllMessages' | + 'setReplyingToId' | 'setEditingId' | 'editLastMessage' | 'saveDraft' | 'clearDraft' | 'loadPinnedMessages' | + 'loadMessageLink' | + // scheduled messages + 'loadScheduledHistory' | 'sendScheduledMessages' | 'rescheduleMessage' | 'deleteScheduledMessages' | + // poll result + 'openPollResults' | 'closePollResults' | 'loadPollOptionResults' | + // forwarding messages + 'openForwardMenu' | 'exitForwardMode' | 'setForwardChatId' | 'forwardMessages' | + 'openForwardMenuForSelectedMessages' | + // global search + 'setGlobalSearchQuery' | 'searchMessagesGlobal' | 'addRecentlyFoundChatId' | 'clearRecentlyFoundChats' | + 'setGlobalSearchContent' | 'setGlobalSearchChatId' | 'setGlobalSearchDate' | + // message search + 'openLocalTextSearch' | 'closeLocalTextSearch' | 'setLocalTextSearchQuery' | 'setLocalMediaSearchType' | + 'searchTextMessagesLocal' | 'searchMediaMessagesLocal' | 'searchMessagesByDate' | + // management + 'toggleManagement' | 'closeManagement' | 'checkPublicLink' | 'updatePublicLink' | 'updatePrivateLink' | + // groups + 'togglePreHistoryHidden' | 'updateChatDefaultBannedRights' | 'updateChatMemberBannedRights' | 'updateChatAdmin' | + // users + 'loadFullUser' | 'openUserInfo' | 'loadNearestCountry' | 'loadTopUsers' | 'loadContactList' | 'loadCurrentUser' | + 'updateProfile' | 'checkUsername' | 'updateContact' | 'deleteUser' | 'loadUser' | + // Channel / groups creation + 'createChannel' | 'createGroupChat' | 'resetChatCreation' | + // settings + 'setSettingOption' | 'loadPasswordInfo' | 'clearTwoFaError' | + 'updatePassword' | 'updateRecoveryEmail' | 'clearPassword' | 'provideTwoFaEmailCode' | 'checkPassword' | + 'loadBlockedContacts' | 'blockContact' | 'unblockContact' | + 'loadAuthorizations' | 'terminateAuthorization' | 'terminateAllAuthorizations' | + 'loadNotificationsSettings' | 'updateContactSignUpNotification' | 'updateNotificationSettings' | + 'loadLanguages' | 'loadPrivacySettings' | 'setPrivacyVisibility' | 'setPrivacySettings' | + // Stickers & GIFs + 'loadStickerSets' | 'loadAddedStickers' | 'loadRecentStickers' | 'loadFavoriteStickers' | 'loadFeaturedStickers' | + 'loadStickers' | 'setStickerSearchQuery' | 'loadSavedGifs' | 'setGifSearchQuery' | 'searchMoreGifs' | + 'faveSticker' | 'unfaveSticker' | 'toggleStickerSet' | 'loadAnimatedEmojis' | + 'loadStickersForEmoji' | 'clearStickersForEmoji' | + // bots + 'clickInlineButton' | 'sendBotCommand' | + // misc + 'openMediaViewer' | 'closeMediaViewer' | 'openAudioPlayer' | 'closeAudioPlayer' | 'openPollModal' | 'closePollModal' | + 'loadWebPagePreview' | 'clearWebPagePreview' | 'loadWallpapers' | 'uploadWallpaper' | + // payment + 'openPaymentModal' | 'closePaymentModal' | + 'validateRequestedInfo' | 'setPaymentStep' | 'sendPaymentForm' | 'getPaymentForm' | 'getReceipt' | + 'sendCredentialsInfo' | 'setInvoiceMessageInfo' | 'clearPaymentError' | 'clearReceipt' +); + +export type GlobalActions = Record void>; diff --git a/src/hooks/reducers/useFoldersReducer.ts b/src/hooks/reducers/useFoldersReducer.ts new file mode 100644 index 000000000..c0a9f2950 --- /dev/null +++ b/src/hooks/reducers/useFoldersReducer.ts @@ -0,0 +1,243 @@ +import useReducer, { StateReducer, Dispatch } from '../useReducer'; +import { ApiChatFolder } from '../../api/types'; +import { pick, omit } from '../../util/iteratees'; + +export type FolderChatType = { + icon: string; + title: string; + key: keyof Pick; +}; + +export const INCLUDED_CHAT_TYPES: FolderChatType[] = [ + { icon: 'user', title: 'FilterContacts', key: 'contacts' }, + { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' }, + { icon: 'group', title: 'FilterGroups', key: 'groups' }, + { icon: 'channel', title: 'FilterChannels', key: 'channels' }, + { icon: 'bots', title: 'FilterBots', key: 'bots' }, +]; + +export const EXCLUDED_CHAT_TYPES: FolderChatType[] = [ + { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' }, + { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' }, + { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' }, +]; + +const INCLUDE_FILTER_FIELDS: Array = [ + 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts', +]; +const EXCLUDE_FILTER_FIELDS: Array = [ + 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead', +]; + +export function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) { + let selectedChatIds: number[] = []; + let selectedChatTypes: FolderChatType['key'][] = []; + + if (mode === 'included') { + const { + includedChatIds, + ...includeFilters + } = selectTemp + ? state.includeFilters || {} + : pick( + state.folder, + INCLUDE_FILTER_FIELDS, + ); + + selectedChatIds = includedChatIds || []; + selectedChatTypes = (Object.keys(includeFilters) as Array) + .filter((key) => Boolean(includeFilters[key])); + } else { + const { + excludedChatIds, + ...excludeFilters + } = selectTemp + ? state.excludeFilters || {} + : pick( + state.folder, + EXCLUDE_FILTER_FIELDS, + ); + + selectedChatIds = excludedChatIds || []; + selectedChatTypes = (Object.keys(excludeFilters) as Array) + .filter((key) => Boolean(excludeFilters[key])); + } + + return { + selectedChatIds, + selectedChatTypes, + }; +} + +function getSuggestedFolderName(includeFilters?: FolderIncludeFilters) { + if (includeFilters) { + const { + includedChatIds, + ...filters + } = includeFilters; + + if ( + Object.values(filters).filter(Boolean).length > 1 + || (includedChatIds && includedChatIds.length) + ) { + return ''; + } + + if (filters.bots) { + return 'Bots'; + } else if (filters.groups) { + return 'Groups'; + } else if (filters.channels) { + return 'Channels'; + } else if (filters.contacts) { + return 'Contacts'; + } else if (filters.nonContacts) { + return 'Non-Contacts'; + } + } + + return ''; +} + +type FolderIncludeFilters = Pick; +type FolderExcludeFilters = Pick; + +export type FoldersState = { + mode: 'create' | 'edit'; + isLoading?: boolean; + isTouched?: boolean; + error?: string; + folderId?: number; + chatFilter: string; + folder: Omit; + includeFilters?: FolderIncludeFilters; + excludeFilters?: FolderExcludeFilters; +}; +export type FoldersActions = ( + 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' | + 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters' +); +export type FolderEditDispatch = Dispatch; + +const INITIAL_STATE: FoldersState = { + mode: 'create', + chatFilter: '', + folder: { + title: '', + includedChatIds: [], + excludedChatIds: [], + }, +}; + +const foldersReducer: StateReducer = ( + state, + action, +) => { + switch (action.type) { + case 'setTitle': + return { + ...state, + folder: { + ...state.folder, + title: action.payload, + }, + isTouched: true, + }; + case 'editIncludeFilters': + return { + ...state, + includeFilters: pick( + state.folder, + INCLUDE_FILTER_FIELDS, + ), + }; + case 'editExcludeFilters': + return { + ...state, + excludeFilters: pick( + state.folder, + EXCLUDE_FILTER_FIELDS, + ), + }; + case 'setIncludeFilters': + return { + ...state, + includeFilters: action.payload, + chatFilter: '', + }; + case 'setExcludeFilters': + return { + ...state, + excludeFilters: action.payload, + chatFilter: '', + }; + case 'saveFilters': + if (state.includeFilters) { + return { + ...state, + folder: { + ...omit(state.folder, INCLUDE_FILTER_FIELDS), + title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters), + ...state.includeFilters, + }, + includeFilters: undefined, + chatFilter: '', + isTouched: true, + }; + } else if (state.excludeFilters) { + return { + ...state, + folder: { + ...omit(state.folder, EXCLUDE_FILTER_FIELDS), + ...state.excludeFilters, + }, + excludeFilters: undefined, + chatFilter: '', + isTouched: true, + }; + } else { + return state; + } + case 'editFolder': { + const { id: folderId, description, ...folder } = action.payload; + + return { + mode: 'edit', + folderId, + folder, + chatFilter: '', + }; + } + case 'setChatFilter': { + return { + ...state, + chatFilter: action.payload, + }; + } + case 'setIsLoading': { + return { + ...state, + isLoading: action.payload, + }; + } + case 'setError': { + return { + ...state, + error: action.payload, + }; + } + case 'reset': + return INITIAL_STATE; + default: + return state; + } +}; + +export default () => { + return useReducer(foldersReducer, INITIAL_STATE); +}; diff --git a/src/hooks/reducers/usePaymentReducer.ts b/src/hooks/reducers/usePaymentReducer.ts new file mode 100644 index 000000000..8bcfdc873 --- /dev/null +++ b/src/hooks/reducers/usePaymentReducer.ts @@ -0,0 +1,229 @@ +import useReducer, { StateReducer, Dispatch } from '../useReducer'; +import { countryList } from '../../util/phoneNumber'; + +export type FormState = { + streetLine1: string; + streetLine2: string; + city: string; + state: string; + countryIso2: string; + postCode: string; + fullName: string; + email: string; + phone: string; + shipping: string; + cardNumber: string; + cardholder: string; + expiry: string; + cvv: string; + billingCountry: string; + billingZip: string; + saveInfo: boolean; + saveCredentials: boolean; + formErrors: Record; +}; + +export type FormActions = ( + 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' | + 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' | + 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' | + 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors' +); +export type FormEditDispatch = Dispatch; + +const INITIAL_STATE: FormState = { + streetLine1: '', + streetLine2: '', + city: '', + state: '', + countryIso2: '', + postCode: '', + fullName: '', + email: '', + phone: '', + shipping: '', + cardNumber: '', + cardholder: '', + expiry: '', + cvv: '', + billingCountry: '', + billingZip: '', + saveInfo: true, + saveCredentials: false, + formErrors: {}, +}; + +const reducer: StateReducer = (state, action) => { + switch (action.type) { + case 'changeAddress1': + return { + ...state, + streetLine1: action.payload, + formErrors: { + ...state.formErrors, + streetLine1: undefined, + }, + }; + case 'changeAddress2': + return { + ...state, + streetLine2: action.payload, + formErrors: { + ...state.formErrors, + streetLine2: undefined, + }, + }; + case 'changeCity': + return { + ...state, + city: action.payload, + formErrors: { + ...state.formErrors, + city: undefined, + }, + }; + case 'changeState': + return { + ...state, + state: action.payload, + formErrors: { + ...state.formErrors, + state: undefined, + }, + }; + case 'changeCountry': + return { + ...state, + countryIso2: action.payload, + billingCountry: getBillingCountry(action.payload), + formErrors: { + ...state.formErrors, + countryIso2: undefined, + }, + }; + case 'changePostCode': + return { + ...state, + postCode: action.payload, + formErrors: { + ...state.formErrors, + postCode: undefined, + }, + }; + case 'changeFullName': + return { + ...state, + fullName: action.payload, + formErrors: { + ...state.formErrors, + fullName: undefined, + }, + }; + case 'changeEmail': + return { + ...state, + email: action.payload, + formErrors: { + ...state.formErrors, + email: undefined, + }, + }; + case 'changePhone': + return { + ...state, + phone: action.payload, + formErrors: { + ...state.formErrors, + phone: undefined, + }, + }; + case 'changeShipping': + return { ...state, shipping: action.payload }; + case 'changeCardNumber': + return { + ...state, + cardNumber: action.payload, + formErrors: { + ...state.formErrors, + cardNumber: undefined, + }, + }; + case 'changeCardholder': + return { + ...state, + cardholder: action.payload, + formErrors: { + ...state.formErrors, + cardholder: undefined, + }, + }; + case 'changeExpiryDate': + return { + ...state, + expiry: action.payload, + formErrors: { + ...state.formErrors, + expiry: undefined, + }, + }; + case 'changeCvvCode': + return { + ...state, + cvv: action.payload, + formErrors: { + ...state.formErrors, + cvv: undefined, + }, + }; + case 'changeBillingCountry': + return { + ...state, + billingCountry: action.payload, + formErrors: { + ...state.formErrors, + billingCountry: undefined, + }, + }; + case 'changeBillingZip': + return { + ...state, + billingZip: action.payload, + formErrors: { + ...state.formErrors, + billingZip: undefined, + }, + }; + case 'changeSaveInfo': + return { ...state, saveInfo: action.payload }; + case 'changeSaveCredentials': + return { ...state, saveCredentials: action.payload }; + case 'updateUserInfo': + if (action.payload.countryIso2) { + return { + ...state, + ...action.payload, + billingCountry: getBillingCountry(action.payload.countryIso2), + }; + } + return { ...state, ...action.payload }; + case 'setFormErrors': + return { + ...state, + formErrors: { + ...state.formErrors, + ...action.payload, + }, + }; + default: + return state; + } +}; + +function getBillingCountry(countryCode: string) { + const country = countryList.find(({ id }) => id === countryCode); + return country ? country.name : ''; +} + +export default () => { + return useReducer(reducer, INITIAL_STATE); +}; diff --git a/src/hooks/reducers/useTwoFaReducer.ts b/src/hooks/reducers/useTwoFaReducer.ts new file mode 100644 index 000000000..1a8f4ac56 --- /dev/null +++ b/src/hooks/reducers/useTwoFaReducer.ts @@ -0,0 +1,61 @@ +import useReducer, { StateReducer, Dispatch } from '../useReducer'; + +export type TwoFaActions = ( + 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset' +); +export type TwoFaDispatch = Dispatch; + +export type TwoFaState = { + currentPassword: string; + password: string; + hint: string; + email: string; +}; + +const INITIAL_STATE: TwoFaState = { + currentPassword: '', + password: '', + hint: '', + email: '', +}; + +const twoFaReducer: StateReducer = ( + state, + action, +) => { + switch (action.type) { + case 'setCurrentPassword': + return { + ...state, + currentPassword: action.payload, + }; + + case 'setPassword': + return { + ...state, + password: action.payload, + }; + + case 'setHint': + return { + ...state, + hint: action.payload, + }; + + case 'setEmail': + return { + ...state, + email: action.payload, + }; + + case 'reset': + return INITIAL_STATE; + + default: + return state; + } +}; + +export default () => { + return useReducer(twoFaReducer, INITIAL_STATE); +}; diff --git a/src/hooks/useAudioPlayer.ts b/src/hooks/useAudioPlayer.ts new file mode 100644 index 000000000..0ea896637 --- /dev/null +++ b/src/hooks/useAudioPlayer.ts @@ -0,0 +1,113 @@ +import { + useCallback, useEffect, useRef, useState, +} from '../lib/teact/teact'; + +import { register } from '../util/audioPlayer'; +import useEffectWithPrevDeps from './useEffectWithPrevDeps'; +import { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio'; +import useOnChange from './useOnChange'; + +type Handler = (e: Event) => void; + +export default ( + trackId: string, + originalDuration: number, // Sometimes incorrect for voice messages + src?: string, + handlers?: Record, + onInit?: (element: HTMLAudioElement) => void, + shouldPlay = false, + onForcePlay?: NoneToVoidFunction, + noPlaylist = false, +) => { + // eslint-disable-next-line no-null/no-null + const controllerRef = useRef>(null); + + const [isPlaying, setIsPlaying] = useState(false); + let isPlayingSync = isPlaying; + + const [playProgress, setPlayProgress] = useState(0); + + useOnChange(() => { + controllerRef.current = register(trackId, (eventName, e) => { + switch (eventName) { + case 'onPlay': + setIsPlaying(true); + break; + case 'onPause': + setIsPlaying(false); + break; + case 'onTimeUpdate': { + const { proxy } = controllerRef.current!; + const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration; + setPlayProgress(proxy.currentTime / duration); + break; + } + } + + if (handlers && handlers[eventName]) { + handlers[eventName](e); + } + }, onForcePlay); + + const { proxy } = controllerRef.current!; + + if (!isPlaying && !proxy.paused) { + setIsPlaying(true); + isPlayingSync = true; + } + + if (onInit) { + onInit(proxy); + } + }, [trackId]); + + const { + play, pause, setCurrentTime, proxy, destroy, + } = controllerRef.current!; + const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration; + + // RAF progress + useEffect(() => { + if (duration && !isSafariPatchInProgress(proxy)) { + setPlayProgress(proxy.currentTime / duration); + } + }, [duration, playProgress, proxy]); + + // Cleanup + useEffect(() => () => { + destroy(noPlaylist); + }, [destroy, noPlaylist]); + + // Autoplay once `src` is present + useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => { + if (prevShouldPlay === shouldPlay && src === prevSrc) { + return; + } + + // When paused by another player + if (proxy.src && proxy.paused) { + return; + } + + if (shouldPlay && src && !isPlaying) { + play(src); + } + }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]); + + const playPause = useCallback(() => { + if (isPlaying) { + pause(); + } else if (src) { + play(src); + } + }, [src, pause, play, isPlaying]); + + return { + isPlaying: isPlayingSync, + playProgress, + playPause, + setCurrentTime, + audioProxy: proxy, + duration, + }; +}; diff --git a/src/hooks/useBackgroundMode.ts b/src/hooks/useBackgroundMode.ts new file mode 100644 index 000000000..43eb8ad03 --- /dev/null +++ b/src/hooks/useBackgroundMode.ts @@ -0,0 +1,20 @@ +import { useEffect } from '../lib/teact/teact'; + +export default ( + onBlur: AnyToVoidFunction, + onFocus: AnyToVoidFunction, +) => { + useEffect(() => { + if (!document.hasFocus()) { + onBlur(); + } + + window.addEventListener('blur', onBlur); + window.addEventListener('focus', onFocus); + + return () => { + window.removeEventListener('focus', onFocus); + window.removeEventListener('blur', onBlur); + }; + }, [onBlur, onFocus]); +}; diff --git a/src/hooks/useBlur.ts b/src/hooks/useBlur.ts new file mode 100644 index 000000000..dc5604f0e --- /dev/null +++ b/src/hooks/useBlur.ts @@ -0,0 +1,54 @@ +import { useEffect, useRef } from '../lib/teact/teact'; + +import fastBlur from '../lib/fastBlur'; +import { imgToCanvas } from '../util/files'; +import useForceUpdate from './useForceUpdate'; + +const RADIUS = 2; +const ITERATIONS = 2; +const MAX_CACHE_SIZE = 1000; + +const cache = new Map(); + +export default function useBlur(dataUri?: string, isDisabled = false, delay?: number) { + const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined); + const timeoutRef = useRef(); + const forceUpdate = useForceUpdate(); + + if (timeoutRef.current && isDisabled) { + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + } + + useEffect(() => { + if (!dataUri || blurredRef.current || isDisabled) { + return; + } + + const img = new Image(); + + img.onload = () => { + const canvas = imgToCanvas(img); + fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS); + const blurredDataUri = canvas.toDataURL(); + + blurredRef.current = blurredDataUri; + forceUpdate(); + + if (cache.size >= MAX_CACHE_SIZE) { + cache.clear(); + } + cache.set(dataUri, blurredDataUri); + }; + + if (delay) { + timeoutRef.current = window.setTimeout(() => { + img.src = dataUri; + }, delay); + } else { + img.src = dataUri; + } + }, [dataUri, delay, forceUpdate, isDisabled]); + + return blurredRef.current; +} diff --git a/src/hooks/useBlurSync.ts b/src/hooks/useBlurSync.ts new file mode 100644 index 000000000..b9c7ee571 --- /dev/null +++ b/src/hooks/useBlurSync.ts @@ -0,0 +1,42 @@ +import { useRef } from '../lib/teact/teact'; + +import fastBlur from '../lib/fastBlur'; +import useOnChange from './useOnChange'; +import useBlur from './useBlur'; +import { imgToCanvas } from '../util/files'; + +const RADIUS = 2; +const ITERATIONS = 2; + +export default function useBlurSync(dataUri: string | false | undefined) { + const blurredRef = useRef(); + + let isChanged = false; + + useOnChange(() => { + isChanged = true; + + blurredRef.current = undefined; + + if (!dataUri) { + return; + } + + const img = new Image(); + img.src = dataUri; + if (!img.width) { + return; + } + + const canvas = imgToCanvas(img); + fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS); + + blurredRef.current = canvas.toDataURL(); + }, [dataUri]); + + // Sometimes `Image` do not manage to load synchronously, + // so we fall back the non-blurred variant and prepare the async one at least for the next time + const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current)); + + return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined; +} diff --git a/src/hooks/useBuffering.ts b/src/hooks/useBuffering.ts new file mode 100644 index 000000000..c171480a1 --- /dev/null +++ b/src/hooks/useBuffering.ts @@ -0,0 +1,48 @@ +import React, { useCallback, useMemo, useState } from '../lib/teact/teact'; +import { debounce } from '../util/schedulers'; +import { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio'; + +type BufferingEvent = (e: Event | React.SyntheticEvent) => void; + +const MIN_READY_STATE = 3; +// Avoid flickering when re-mounting previously buffered video +const DEBOUNCE = 200; + +export default (noInitiallyBuffered = false) => { + const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered); + const [bufferedProgress, setBufferedProgress] = useState(0); + + const setIsBufferedDebounced = useMemo(() => { + return debounce(setIsBuffered, DEBOUNCE, false, true); + }, []); + + const handleBuffering = useCallback((e) => { + const media = e.currentTarget as HTMLMediaElement; + + if (!isSafariPatchInProgress(media)) { + if (media.buffered.length) { + setBufferedProgress(media.buffered.end(0) / media.duration); + } + + setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0); + } + }, [setIsBufferedDebounced]); + + const bufferingHandlers = { + onLoadedData: handleBuffering, + onPlaying: handleBuffering, + onLoadStart: handleBuffering, // Needed for Safari to start + onPause: handleBuffering, // Needed for Chrome when seeking + onTimeUpdate: handleBuffering, // Needed for audio buffering progress + onProgress: handleBuffering, // Needed for video buffering progress + }; + + return { + isBuffered, + bufferedProgress, + bufferingHandlers, + checkBuffering(element: HTMLMediaElement) { + setIsBufferedDebounced(element.readyState >= MIN_READY_STATE); + }, + }; +}; diff --git a/src/hooks/useCacheBuster.ts b/src/hooks/useCacheBuster.ts new file mode 100644 index 000000000..28dd64592 --- /dev/null +++ b/src/hooks/useCacheBuster.ts @@ -0,0 +1,11 @@ +import { useCallback, useState } from '../lib/teact/teact'; + +export default () => { + const [cacheBuster, setCacheBuster] = useState(false); + + const updateCacheBuster = useCallback(() => { + setCacheBuster((current) => !current); + }, []); + + return [cacheBuster, updateCacheBuster] as const; +}; diff --git a/src/hooks/useChatContextActions.ts b/src/hooks/useChatContextActions.ts new file mode 100644 index 000000000..67b07d231 --- /dev/null +++ b/src/hooks/useChatContextActions.ts @@ -0,0 +1,69 @@ +import { useMemo } from '../lib/teact/teact'; +import { getDispatch } from '../lib/teact/teactn'; +import { ApiChat, ApiUser } from '../api/types'; +import { isChatArchived, getCanDeleteChat, isChatPrivate } from '../modules/helpers'; + +export default ({ + chat, + privateChatUser, + handleDelete, + folderId, + isPinned, +}: { + chat: ApiChat | undefined; + privateChatUser: ApiUser | undefined; + handleDelete: () => void; + folderId?: number; + isPinned?: boolean; +}) => { + const { + toggleChatPinned, + updateChatMutedState, + toggleChatArchived, + toggleChatUnread, + } = getDispatch(); + + return useMemo(() => { + if (!chat) { + return undefined; + } + + const isChatWithSelf = privateChatUser && privateChatUser.isSelf; + + const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark + ? { title: 'Mark as Read', icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) } + : { title: 'Mark as Unread', icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) }; + + const actionPin = isPinned + ? { title: 'Unpin', icon: 'unpin', handler: () => toggleChatPinned({ id: chat.id, folderId }) } + : { title: 'Pin', icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) }; + + const actionMute = chat.isMuted + ? { title: 'Unmute', icon: 'unmute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }) } + : { title: 'Mute', icon: 'mute', handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }) }; + + const actionArchive = isChatArchived(chat) + ? { title: 'Unarchive', icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) } + : { title: 'Archive', icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) }; + + const actionDelete = { + title: isChatPrivate(chat.id) ? 'Delete' : (getCanDeleteChat(chat) ? 'Delete and Leave' : 'Leave'), + icon: 'delete', + destructive: true, + handler: handleDelete, + }; + + return [ + actionUnreadMark, + actionPin, + ...(!isChatWithSelf ? [ + actionMute, + actionArchive, + ] : []), + actionDelete, + ]; + }, [ + chat, privateChatUser, handleDelete, folderId, isPinned, + toggleChatPinned, updateChatMutedState, toggleChatArchived, toggleChatUnread, + ]); +}; diff --git a/src/hooks/useContextMenuHandlers.ts b/src/hooks/useContextMenuHandlers.ts new file mode 100644 index 000000000..3b8d43286 --- /dev/null +++ b/src/hooks/useContextMenuHandlers.ts @@ -0,0 +1,140 @@ +import { RefObject } from 'react'; +import { useState, useEffect, useCallback } from '../lib/teact/teact'; + +import { IAnchorPosition } from '../types'; +import { IS_TOUCH_ENV, IS_MOBILE_SCREEN } from '../util/environment'; + +const LONG_TAP_DURATION_MS = 250; +const SELECTION_ANIMATION_DURATION_MS = 200; + +let contextMenuCounter = 0; + +function checkIsDisabledForMobile() { + return IS_MOBILE_SCREEN + && window.document.body.classList.contains('enable-symbol-menu-transforms'); +} + +export default ( + elementRef: RefObject, + isMenuDisabled?: boolean, +) => { + const [isContextMenuOpen, setIsContextMenuOpen] = useState(false); + const [contextMenuPosition, setContextMenuPosition] = useState(undefined); + + const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => { + if (!isMenuDisabled && e.button === 2) { + document.body.classList.add('no-selection'); + } + }, [isMenuDisabled]); + + const handleContextMenu = useCallback((e: React.MouseEvent) => { + if (isMenuDisabled) { + return; + } + e.preventDefault(); + document.body.classList.remove('no-selection'); + + if (contextMenuPosition) { + return; + } + document.body.classList.remove('no-selection'); + if (contextMenuCounter === 0) { + document.body.classList.add('has-context-menu'); + } + contextMenuCounter++; + + setIsContextMenuOpen(true); + setContextMenuPosition({ x: e.clientX, y: e.clientY }); + }, [isMenuDisabled, contextMenuPosition]); + + const handleContextMenuClose = useCallback(() => { + setIsContextMenuOpen(false); + }, []); + + const handleContextMenuHide = useCallback(() => { + setContextMenuPosition(undefined); + document.body.classList.remove('no-selection'); + + setTimeout(() => { + contextMenuCounter--; + if (contextMenuCounter === 0) { + document.body.classList.remove('has-context-menu'); + } + }, SELECTION_ANIMATION_DURATION_MS); + }, []); + + // Support context menu on touch-devices + useEffect(() => { + if (isMenuDisabled || !IS_TOUCH_ENV) { + return undefined; + } + + const element = elementRef.current; + if (!element) { + return undefined; + } + + let timer: number | undefined; + + const clearLongPressTimer = () => { + if (timer) { + clearTimeout(timer); + timer = undefined; + } + }; + + const emulateContextMenuEvent = (originalEvent: TouchEvent) => { + clearLongPressTimer(); + + const { clientX, clientY } = originalEvent.touches[0]; + + if (contextMenuPosition) { + return; + } + + // temporarily intercept and clear the next click + element.addEventListener('touchend', function cancelClickOnce(e) { + element.removeEventListener('touchend', cancelClickOnce, true); + e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); + }, true); + + document.body.classList.add('no-selection'); + setIsContextMenuOpen(true); + setContextMenuPosition({ x: clientX, y: clientY }); + }; + + const startLongPressTimer = (e: TouchEvent) => { + if (isMenuDisabled || checkIsDisabledForMobile()) { + return; + } + clearLongPressTimer(); + + timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS); + }; + + // @perf Consider event delegation + element.addEventListener('touchstart', startLongPressTimer, { passive: true }); + element.addEventListener('touchcancel', clearLongPressTimer, true); + element.addEventListener('touchend', clearLongPressTimer, true); + element.addEventListener('touchmove', clearLongPressTimer, { passive: true }); + + return () => { + clearLongPressTimer(); + element.removeEventListener('touchstart', startLongPressTimer); + element.removeEventListener('touchcancel', clearLongPressTimer, true); + element.removeEventListener('touchend', clearLongPressTimer, true); + element.removeEventListener('touchmove', clearLongPressTimer); + }; + }, [contextMenuPosition, isMenuDisabled, elementRef]); + + return { + isContextMenuOpen, + contextMenuPosition, + handleBeforeContextMenu, + handleContextMenu, + handleContextMenuClose, + handleContextMenuHide, + }; +}; diff --git a/src/hooks/useContextMenuPosition.ts b/src/hooks/useContextMenuPosition.ts new file mode 100644 index 000000000..4f0e8dc4f --- /dev/null +++ b/src/hooks/useContextMenuPosition.ts @@ -0,0 +1,66 @@ +import { useState, useEffect } from '../lib/teact/teact'; +import { IAnchorPosition } from '../types'; + +export default ( + anchor: IAnchorPosition | undefined, + getTriggerElement: () => HTMLElement | null, + getRootElement: () => HTMLElement | null, + getMenuElement: () => HTMLElement | null, + extraPaddingX = 0, + extraTopPadding = 0, +) => { + const [positionX, setPositionX] = useState<'right' | 'left'>('right'); + const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom'); + const [style, setStyle] = useState(''); + + useEffect(() => { + const triggerEl = getTriggerElement(); + if (!anchor || !triggerEl) { + return; + } + + let { x, y } = anchor; + const emptyRect = { + width: 0, left: 0, height: 0, top: 0, + }; + + const menuEl = getMenuElement(); + const rootEl = getRootElement(); + + const triggerRect = triggerEl.getBoundingClientRect(); + const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect; + const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect; + + if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) { + setPositionX('left'); + x += 3; + } else if (x - menuRect.width > 0) { + setPositionX('right'); + x -= 3; + } else { + setPositionX('left'); + x = 16; + } + + if (y + menuRect.height < rootRect.height + rootRect.top) { + setPositionY('top'); + } else { + setPositionY('bottom'); + + if (y - menuRect.height < rootRect.top + extraTopPadding) { + y = rootRect.top + extraTopPadding + menuRect.height; + } + } + + setStyle(`left: ${x - triggerRect.left}px; top: ${y - triggerRect.top}px;`); + }, [ + anchor, extraPaddingX, extraTopPadding, + getMenuElement, getRootElement, getTriggerElement, + ]); + + return { + positionX, + positionY, + style, + }; +}; diff --git a/src/hooks/useCurrentOrPrev.ts b/src/hooks/useCurrentOrPrev.ts new file mode 100644 index 000000000..ee12bf2c8 --- /dev/null +++ b/src/hooks/useCurrentOrPrev.ts @@ -0,0 +1,10 @@ +import usePrevious from './usePrevious'; + +export default function useCurrentOrPrev( + current: T, shouldSkipUndefined = false, shouldForceCurrent = false, +): T | undefined { + const prev = usePrevious(current, shouldSkipUndefined); + + // eslint-disable-next-line no-null/no-null + return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev; +} diff --git a/src/hooks/useCustomBackground.ts b/src/hooks/useCustomBackground.ts new file mode 100644 index 000000000..0848821e7 --- /dev/null +++ b/src/hooks/useCustomBackground.ts @@ -0,0 +1,24 @@ +import { CUSTOM_BG_CACHE_NAME } from '../config'; +import * as cacheApi from '../util/cacheApi'; +import { useEffect, useState } from '../lib/teact/teact'; + +export default (settingValue?: string) => { + const [value, setValue] = useState(settingValue); + + useEffect(() => { + if (!settingValue) { + return; + } + + if (settingValue.startsWith('#')) { + setValue(settingValue); + } else { + cacheApi.fetch(CUSTOM_BG_CACHE_NAME, CUSTOM_BG_CACHE_NAME, cacheApi.Type.Blob) + .then((blob) => { + setValue(`url(${URL.createObjectURL(blob)}`); + }); + } + }, [settingValue]); + + return value; +}; diff --git a/src/hooks/useDebounce.ts b/src/hooks/useDebounce.ts new file mode 100644 index 000000000..08cc8ba25 --- /dev/null +++ b/src/hooks/useDebounce.ts @@ -0,0 +1,9 @@ +import { useMemo } from '../lib/teact/teact'; + +import { debounce } from '../util/schedulers'; + +export default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) { + return useMemo(() => { + return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast); + }, [ms, shouldRunFirst, shouldRunLast]); +} diff --git a/src/hooks/useEffectWithPrevDeps.ts b/src/hooks/useEffectWithPrevDeps.ts new file mode 100644 index 000000000..ba88fbb98 --- /dev/null +++ b/src/hooks/useEffectWithPrevDeps.ts @@ -0,0 +1,11 @@ +import { useEffect } from '../lib/teact/teact'; +import usePrevious from './usePrevious'; + +export default (cb: (args: PT) => void, dependencies: T) => { + const prevDeps = usePrevious(dependencies); + return useEffect(() => { + // @ts-ignore (workaround for "could be instantiated with a different subtype" issue) + return cb(prevDeps || []); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, dependencies); +}; diff --git a/src/hooks/useEnsureMessage.ts b/src/hooks/useEnsureMessage.ts new file mode 100644 index 000000000..5d7fb81af --- /dev/null +++ b/src/hooks/useEnsureMessage.ts @@ -0,0 +1,27 @@ +import { useEffect, useMemo } from '../lib/teact/teact'; +import { getDispatch } from '../lib/teact/teactn'; + +import { ApiMessage } from '../api/types'; + +import { throttle } from '../util/schedulers'; + +export default ( + chatId: number, + messageId?: number, + message?: ApiMessage, + replyOriginForId?: number, +) => { + const { loadMessage } = getDispatch(); + const loadMessageThrottled = useMemo(() => { + const throttled = throttle(loadMessage, 500, true); + return () => { + throttled({ chatId, messageId, replyOriginForId }); + }; + }, [loadMessage, chatId, messageId, replyOriginForId]); + + useEffect(() => { + if (messageId && !message) { + loadMessageThrottled(); + } + }); +}; diff --git a/src/hooks/useFlag.ts b/src/hooks/useFlag.ts new file mode 100644 index 000000000..93ee45888 --- /dev/null +++ b/src/hooks/useFlag.ts @@ -0,0 +1,15 @@ +import { useCallback, useState } from '../lib/teact/teact'; + +export default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => { + const [value, setValue] = useState(initial); + + const setTrue = useCallback(() => { + setValue(true); + }, []); + + const setFalse = useCallback(() => { + setValue(false); + }, []); + + return [value, setTrue, setFalse]; +}; diff --git a/src/hooks/useFocusAfterAnimation.tsx b/src/hooks/useFocusAfterAnimation.tsx new file mode 100644 index 000000000..fcc964187 --- /dev/null +++ b/src/hooks/useFocusAfterAnimation.tsx @@ -0,0 +1,25 @@ +import { RefObject } from 'react'; + +import { IS_TOUCH_ENV } from '../util/environment'; +import { fastRaf } from '../util/schedulers'; +import { useEffect } from '../lib/teact/teact'; + +const DEFAULT_DURATION = 400; + +export default function useFocusAfterAnimation( + ref: RefObject, animationDuration = DEFAULT_DURATION, +) { + useEffect(() => { + if (IS_TOUCH_ENV) { + return; + } + + setTimeout(() => { + fastRaf(() => { + if (ref.current) { + ref.current.focus(); + } + }); + }, animationDuration); + }, [ref, animationDuration]); +} diff --git a/src/hooks/useForceUpdate.ts b/src/hooks/useForceUpdate.ts new file mode 100644 index 000000000..753b09cfb --- /dev/null +++ b/src/hooks/useForceUpdate.ts @@ -0,0 +1,9 @@ +import { useCallback, useState } from '../lib/teact/teact'; + +export default () => { + const [, setTrigger] = useState(false); + + return useCallback(() => { + setTrigger((trigger) => !trigger); + }, []); +}; diff --git a/src/hooks/useFullscreen.ts b/src/hooks/useFullscreen.ts new file mode 100644 index 000000000..f437002d8 --- /dev/null +++ b/src/hooks/useFullscreen.ts @@ -0,0 +1,99 @@ +import { useLayoutEffect, useState } from '../lib/teact/teact'; +import { PLATFORM_ENV } from '../util/environment'; + +type RefType = { + current: HTMLElement | null; +}; + +type ReturnType = [boolean, () => void, () => void] | [false]; +type CallbackType = (isPlayed: boolean) => void; + +const prop = getBrowserFullscreenElementProp(); + +export default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType { + const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop])); + + const setFullscreen = () => { + if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) { + return; + } + + if (elRef.current.requestFullscreen) { + elRef.current.requestFullscreen(); + } else if (elRef.current.webkitRequestFullscreen) { + elRef.current.webkitRequestFullscreen(); + } else if (elRef.current.webkitEnterFullscreen) { + elRef.current.webkitEnterFullscreen(); + } else if (elRef.current.mozRequestFullScreen) { + elRef.current.mozRequestFullScreen(); + } + + setIsFullscreen(true); + }; + + const exitFullscreen = () => { + if (!elRef.current) { + return; + } + + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } + + setIsFullscreen(false); + }; + + useLayoutEffect(() => { + const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); }; + const listenerEnter = () => { setIsFullscreen(true); }; + const listenerExit = () => { + setIsFullscreen(false); + setIsPlayed(false); + }; + const video = elRef.current; + + document.addEventListener('fullscreenchange', listener, false); + document.addEventListener('webkitfullscreenchange', listener, false); + document.addEventListener('mozfullscreenchange', listener, false); + + if (video) { + video.addEventListener('webkitbeginfullscreen', listenerEnter, false); + video.addEventListener('webkitendfullscreen', listenerExit, false); + } + + return () => { + document.removeEventListener('fullscreenchange', listener, false); + document.removeEventListener('webkitfullscreenchange', listener, false); + document.removeEventListener('mozfullscreenchange', listener, false); + if (video) { + video.removeEventListener('webkitbeginfullscreen', listenerEnter, false); + video.removeEventListener('webkitendfullscreen', listenerExit, false); + } + }; + // eslint-disable-next-line + }, []); + + if (!prop && PLATFORM_ENV !== 'iOS') { + return [false]; + } + + return [isFullscreen, setFullscreen, exitFullscreen]; +} + +function getBrowserFullscreenElementProp() { + if (typeof document.fullscreenElement !== 'undefined') { + return 'fullscreenElement'; + } else if (typeof document.mozFullScreenElement !== 'undefined') { + return 'mozFullScreenElement'; + } else if (typeof document.webkitFullscreenElement !== 'undefined') { + return 'webkitFullscreenElement'; + } + + return ''; +} diff --git a/src/hooks/useHeavyAnimationCheck.ts b/src/hooks/useHeavyAnimationCheck.ts new file mode 100644 index 000000000..a362c5a6b --- /dev/null +++ b/src/hooks/useHeavyAnimationCheck.ts @@ -0,0 +1,42 @@ +import { useEffect } from '../lib/teact/teact'; + +const ANIMATION_START_EVENT = 'tt-event-heavy-animation-start'; +const ANIMATION_END_EVENT = 'tt-event-heavy-animation-end'; + +let timeout: number | undefined; +let isAnimating = false; + +export const dispatchHeavyAnimationEvent = (duration: number) => { + document.dispatchEvent(new Event(ANIMATION_START_EVENT)); + isAnimating = true; + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + timeout = window.setTimeout(() => { + isAnimating = false; + document.dispatchEvent(new Event(ANIMATION_END_EVENT)); + timeout = undefined; + }, duration); +}; + +export default ( + handleAnimationStart: AnyToVoidFunction, + handleAnimationEnd: AnyToVoidFunction, +) => { + useEffect(() => { + if (isAnimating) { + handleAnimationStart(); + } + + document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart); + document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd); + + return () => { + document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd); + document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart); + }; + }, [handleAnimationEnd, handleAnimationStart]); +}; diff --git a/src/hooks/useHeavyAnimationCheckForVideo.ts b/src/hooks/useHeavyAnimationCheckForVideo.ts new file mode 100644 index 000000000..6ac032364 --- /dev/null +++ b/src/hooks/useHeavyAnimationCheckForVideo.ts @@ -0,0 +1,24 @@ +import { RefObject } from 'react'; +import { useCallback, useRef } from '../lib/teact/teact'; + +import useHeavyAnimationCheck from './useHeavyAnimationCheck'; +import safePlay from '../util/safePlay'; + +export default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) { + const shouldPlayRef = useRef(); + shouldPlayRef.current = shouldPlay; + + const pause = useCallback(() => { + if (playerRef.current) { + playerRef.current.pause(); + } + }, [playerRef]); + + const play = useCallback(() => { + if (playerRef.current && shouldPlayRef.current) { + safePlay(playerRef.current); + } + }, [playerRef]); + + useHeavyAnimationCheck(pause, play); +} diff --git a/src/hooks/useHorizontalScroll.ts b/src/hooks/useHorizontalScroll.ts new file mode 100644 index 000000000..25bde35ac --- /dev/null +++ b/src/hooks/useHorizontalScroll.ts @@ -0,0 +1,24 @@ +import { RefObject } from 'react'; +import { useEffect } from '../lib/teact/teact'; + +export default (containerRef: RefObject, isDisabled?: boolean) => { + useEffect(() => { + const container = containerRef.current; + if (!container) { + return undefined; + } + + function handleScroll(e: WheelEvent) { + // Ignore horizontal scroll and let it work natively (e.g. on touchpad) + if (!e.deltaX) { + container!.scrollLeft += e.deltaY / 4; + } + } + + container.addEventListener('wheel', handleScroll, { passive: true }); + + return () => { + container.removeEventListener('wheel', handleScroll); + }; + }, [containerRef, isDisabled]); +}; diff --git a/src/hooks/useInfiniteScroll.ts b/src/hooks/useInfiniteScroll.ts new file mode 100644 index 000000000..a0b5b3fd2 --- /dev/null +++ b/src/hooks/useInfiniteScroll.ts @@ -0,0 +1,117 @@ +import { useCallback, useEffect, useRef } from '../lib/teact/teact'; +import { LoadMoreDirection } from '../types'; + +import { areSortedArraysEqual } from '../util/iteratees'; +import useForceUpdate from './useForceUpdate'; +import usePrevious from './usePrevious'; + +type GetMore = (args: { direction: LoadMoreDirection }) => void; +type LoadMoreBackwards = (args: { offsetId?: number }) => void; + +const DEFAULT_LIST_SLICE = 30; + +export default ( + loadMoreBackwards?: LoadMoreBackwards, + listIds?: number[], + isDisabled = false, + listSlice = DEFAULT_LIST_SLICE, + forceFullPreload = false, +): [number[]?, GetMore?] => { + const lastParamsRef = useRef<{ + direction?: LoadMoreDirection; + offsetId?: number; + }>(); + + const viewportIdsRef = useRef((() => { + // Only run once to initialize + if (!listIds || lastParamsRef.current) { + return undefined; + } + + const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice); + return newViewportIds; + })()); + + const forceUpdate = useForceUpdate(); + + const prevListIds = usePrevious(listIds); + const prevIsDisabled = usePrevious(isDisabled); + if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) { + const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {}; + const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice); + + if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) { + viewportIdsRef.current = newViewportIds; + } + } + + useEffect(() => { + if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) { + const viewportIds = viewportIdsRef.current!; + loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] }); + } + }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]); + + const getMore: GetMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => { + const viewportIds = viewportIdsRef.current; + + const offsetId = viewportIds + ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0] + : undefined; + + if (!listIds) { + if (loadMoreBackwards) { + loadMoreBackwards({ offsetId }); + } + + return; + } + + lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId }; + + const { + newViewportIds, areSomeLocal, areAllLocal, + } = getViewportSlice(listIds, offsetId, direction, listSlice); + + if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) { + viewportIdsRef.current = newViewportIds; + forceUpdate(); + } + + if (!areAllLocal && loadMoreBackwards) { + loadMoreBackwards({ offsetId }); + } + }, [listIds, listSlice, loadMoreBackwards, forceUpdate]); + + return isDisabled ? [listIds] : [viewportIdsRef.current, getMore]; +}; + +function getViewportSlice( + sourceIds: number[], + offsetId = 0, + direction: LoadMoreDirection, + listSlice: number, +) { + const { length } = sourceIds; + const index = sourceIds.indexOf(offsetId); + const isForwards = direction === LoadMoreDirection.Forwards; + const indexForDirection = isForwards ? index : (index + 1) || length; + const from = Math.max(0, indexForDirection - listSlice); + const to = indexForDirection + listSlice - 1; + const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1); + + let areSomeLocal; + let areAllLocal; + switch (direction) { + case LoadMoreDirection.Forwards: + areSomeLocal = indexForDirection > 0; + areAllLocal = from >= 0; + break; + case LoadMoreDirection.Backwards: + areSomeLocal = indexForDirection < length; + areAllLocal = to <= length - 1; + break; + } + + return { newViewportIds, areSomeLocal, areAllLocal }; +} diff --git a/src/hooks/useIntersectionObserver.ts b/src/hooks/useIntersectionObserver.ts new file mode 100644 index 000000000..42cc5045a --- /dev/null +++ b/src/hooks/useIntersectionObserver.ts @@ -0,0 +1,175 @@ +import { RefObject } from 'react'; +import { + useEffect, useRef, useCallback, useState, +} from '../lib/teact/teact'; + +import { throttle, debounce } from '../util/schedulers'; +import useHeavyAnimationCheck from './useHeavyAnimationCheck'; + +type TargetCallback = (entry: IntersectionObserverEntry) => void; +type RootCallback = (entries: IntersectionObserverEntry[]) => void; +type ObserveCleanup = NoneToVoidFunction; +export type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup; + +interface IntersectionController { + observer: IntersectionObserver; + callbacks: Map; +} + +interface Response { + observe: ObserveFn; + freeze: NoneToVoidFunction; + unfreeze: NoneToVoidFunction; +} + +export function useIntersectionObserver({ + rootRef, + throttleMs, + debounceMs, + shouldSkipFirst, + margin, + threshold, + isDisabled, +}: { + rootRef: RefObject; + throttleMs?: number; + debounceMs?: number; + shouldSkipFirst?: boolean; + margin?: number; + threshold?: number | number[]; + isDisabled?: boolean; +}, rootCallback?: RootCallback): Response { + const controllerRef = useRef(); + const rootCallbackRef = useRef(); + const isFrozenRef = useRef(); + const onUnfreezeRef = useRef(); + + rootCallbackRef.current = rootCallback; + + const freeze = useCallback(() => { + isFrozenRef.current = true; + }, []); + + const unfreeze = useCallback(() => { + isFrozenRef.current = false; + + if (onUnfreezeRef.current) { + onUnfreezeRef.current(); + onUnfreezeRef.current = undefined; + } + }, []); + + useHeavyAnimationCheck(freeze, unfreeze); + + useEffect(() => { + if (isDisabled) { + return undefined; + } + + return () => { + if (controllerRef.current) { + controllerRef.current.observer.disconnect(); + controllerRef.current.callbacks.clear(); + controllerRef.current = undefined; + } + }; + }, [isDisabled]); + + function initController() { + const callbacks = new Map(); + const entriesAccumulator = new Map(); + const observerCallbackSync = () => { + const entries = Array.from(entriesAccumulator.values()); + + entries.forEach((entry: IntersectionObserverEntry) => { + const callback = callbacks.get(entry.target); + if (callback) { + callback!(entry, entries); + } + }); + + if (rootCallbackRef.current) { + rootCallbackRef.current(entries); + } + + entriesAccumulator.clear(); + }; + const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined; + const observerCallback = scheduler + ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst) + : observerCallbackSync; + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + entriesAccumulator.set(entry.target, entry); + }); + + if (isFrozenRef.current) { + onUnfreezeRef.current = () => { + observerCallback(); + }; + } else { + observerCallback(); + } + }, + { + root: rootRef.current, + rootMargin: margin ? `${margin}px` : undefined, + threshold, + }, + ); + + controllerRef.current = { observer, callbacks }; + } + + const observe = useCallback((target, targetCallback) => { + if (!controllerRef.current) { + initController(); + } + + const controller = controllerRef.current!; + controller.observer.observe(target); + + if (targetCallback) { + controller.callbacks.set(target, targetCallback); + } + + return () => { + if (targetCallback) { + controller.callbacks.delete(target); + } + + controller.observer.unobserve(target); + }; + // Arguments should never change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isDisabled]); + + return { observe, freeze, unfreeze }; +} + +export function useOnIntersect( + targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback, +) { + useEffect(() => { + return observe ? observe(targetRef.current!, callback) : undefined; + // Arguments should never change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +} + +export function useIsIntersecting( + targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback, +) { + const [isIntersecting, setIsIntersecting] = useState(!observe); + + useOnIntersect(targetRef, observe, (entry) => { + setIsIntersecting(entry.isIntersecting); + + if (callback) { + callback(entry); + } + }); + + return isIntersecting; +} diff --git a/src/hooks/useKeyboardListNavigation.ts b/src/hooks/useKeyboardListNavigation.ts new file mode 100644 index 000000000..282f12409 --- /dev/null +++ b/src/hooks/useKeyboardListNavigation.ts @@ -0,0 +1,54 @@ +import { RefObject } from 'react'; +import { useState, useCallback, useEffect } from '../lib/teact/teact'; + +export default ( + elementRef: RefObject, + isOpen: boolean, + onSelectWithEnter?: () => void, +) => { + const [focusedIndex, setFocusedIndex] = useState(-1); + + useEffect(() => { + setFocusedIndex(-1); + }, [isOpen]); + + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + const element = elementRef.current; + + if (!element) { + return; + } + + if (e.keyCode === 13 && onSelectWithEnter) { + onSelectWithEnter(); + return; + } + + if (e.keyCode !== 38 && e.keyCode !== 40) { + return; + } + + const focusedElement = document.activeElement; + const elementChildren = Array.from(element.children); + + let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex; + + if (e.keyCode === 38 && newIndex > 0) { + newIndex--; + } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) { + newIndex++; + } else if (elementChildren.length === 1) { + newIndex = 0; + } else { + return; + } + + const item = elementChildren[newIndex] as HTMLElement; + if (item) { + setFocusedIndex(newIndex); + item.focus(); + } + }, [focusedIndex, elementRef, onSelectWithEnter]); + + return handleKeyDown; +}; diff --git a/src/hooks/useLang.ts b/src/hooks/useLang.ts new file mode 100644 index 000000000..387795e9d --- /dev/null +++ b/src/hooks/useLang.ts @@ -0,0 +1,18 @@ +import { useEffect } from '../lib/teact/teact'; + +import { ApiMediaFormat } from '../api/types'; + +import * as langProvider from '../util/langProvider'; +import useForceUpdate from './useForceUpdate'; + +export type LangFn = typeof langProvider.getTranslation; + +export default (): LangFn => { + const forceUpdate = useForceUpdate(); + + useEffect(() => { + return langProvider.addCallback(forceUpdate); + }, [forceUpdate]); + + return langProvider.getTranslation; +}; diff --git a/src/hooks/useLayoutEffectWithPrevDeps.ts b/src/hooks/useLayoutEffectWithPrevDeps.ts new file mode 100644 index 000000000..a61cd0dff --- /dev/null +++ b/src/hooks/useLayoutEffectWithPrevDeps.ts @@ -0,0 +1,11 @@ +import { useLayoutEffect } from '../lib/teact/teact'; +import usePrevious from './usePrevious'; + +export default (cb: (args: PT) => void, dependencies: T) => { + const prevDeps = usePrevious(dependencies); + return useLayoutEffect(() => { + // @ts-ignore (workaround for "could be instantiated with a different subtype" issue) + cb(prevDeps || []); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, dependencies); +}; diff --git a/src/hooks/useMedia.ts b/src/hooks/useMedia.ts new file mode 100644 index 000000000..4fea31008 --- /dev/null +++ b/src/hooks/useMedia.ts @@ -0,0 +1,35 @@ +import { useEffect } from '../lib/teact/teact'; + +import { ApiMediaFormat } from '../api/types'; + +import * as mediaLoader from '../util/mediaLoader'; +import useForceUpdate from './useForceUpdate'; + +export default ( + mediaHash: string | false | undefined, + noLoad = false, + // @ts-ignore (workaround for "could be instantiated with a different subtype" issue) + mediaFormat: T = ApiMediaFormat.BlobUrl, + cacheBuster?: number, + delay?: number | false, +) => { + const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined; + const forceUpdate = useForceUpdate(); + + useEffect(() => { + if (!noLoad && mediaHash && !mediaData) { + const startedAt = Date.now(); + + mediaLoader.fetch(mediaHash, mediaFormat).then(() => { + const spentTime = Date.now() - startedAt; + if (!delay || spentTime >= delay) { + forceUpdate(); + } else { + setTimeout(forceUpdate, delay - spentTime); + } + }); + } + }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]); + + return mediaData; +}; diff --git a/src/hooks/useMediaWithDownloadProgress.ts b/src/hooks/useMediaWithDownloadProgress.ts new file mode 100644 index 000000000..4dafd882b --- /dev/null +++ b/src/hooks/useMediaWithDownloadProgress.ts @@ -0,0 +1,76 @@ +import { + useEffect, useMemo, useRef, useState, +} from '../lib/teact/teact'; + +import { IS_PROGRESSIVE_SUPPORTED } from '../util/environment'; +import { ApiMediaFormat } from '../api/types'; +import { throttle } from '../util/schedulers'; +import * as mediaLoader from '../util/mediaLoader'; +import useForceUpdate from './useForceUpdate'; + +const STREAMING_PROGRESS = 0.75; +const STREAMING_TIMEOUT = 1500; +const PROGRESS_THROTTLE = 500; + +export default ( + mediaHash: string | undefined, + noLoad = false, + // @ts-ignore (workaround for "could be instantiated with a different subtype" issue) + mediaFormat: T = ApiMediaFormat.BlobUrl, + cacheBuster?: number, + delay?: number | false, +) => { + const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined; + const isStreaming = mediaFormat === ApiMediaFormat.Stream || ( + IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive + ); + const forceUpdate = useForceUpdate(); + const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0); + const startedAtRef = useRef(); + + const handleProgress = useMemo(() => { + return throttle((progress: number) => { + if (!delay || (Date.now() - startedAtRef.current! > delay)) { + setDownloadProgress(progress); + } + }, PROGRESS_THROTTLE, true); + }, [delay]); + + useEffect(() => { + if (!noLoad && mediaHash) { + if (!mediaData) { + setDownloadProgress(0); + + if (startedAtRef.current) { + mediaLoader.cancelProgress(handleProgress); + } + + startedAtRef.current = Date.now(); + + mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => { + const spentTime = Date.now() - startedAtRef.current!; + startedAtRef.current = undefined; + + if (!delay || spentTime >= delay) { + forceUpdate(); + } else { + setTimeout(forceUpdate, delay - spentTime); + } + }); + } else if (isStreaming) { + setTimeout(() => { + setDownloadProgress(STREAMING_PROGRESS); + }, STREAMING_TIMEOUT); + } + } + }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]); + + useEffect(() => { + if (noLoad && startedAtRef.current) { + mediaLoader.cancelProgress(handleProgress); + setDownloadProgress(0); + } + }, [handleProgress, noLoad]); + + return { mediaData, downloadProgress }; +}; diff --git a/src/hooks/useModuleLoader.ts b/src/hooks/useModuleLoader.ts new file mode 100644 index 000000000..da6a24410 --- /dev/null +++ b/src/hooks/useModuleLoader.ts @@ -0,0 +1,27 @@ +import { useEffect } from '../lib/teact/teact'; + +import { + BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener, +} from '../util/moduleLoader'; + +import useForceUpdate from './useForceUpdate'; + +export default >( + bundleName: B, moduleName: M, noLoad = false, autoUpdate = false, +) => { + const module = getModuleFromMemory(bundleName, moduleName); + const forceUpdate = useForceUpdate(); + + if (autoUpdate) { + // Use effect and cleanup for listener removal + addLoadListener(forceUpdate); + } + + useEffect(() => { + if (!noLoad && !module) { + loadModule(bundleName, moduleName).then(forceUpdate); + } + }, [bundleName, forceUpdate, module, moduleName, noLoad]); + + return module; +}; diff --git a/src/hooks/useMouseInside.ts b/src/hooks/useMouseInside.ts new file mode 100644 index 000000000..a93ea3966 --- /dev/null +++ b/src/hooks/useMouseInside.ts @@ -0,0 +1,48 @@ +import { useCallback, useEffect, useRef } from '../lib/teact/teact'; + +import { IS_TOUCH_ENV } from '../util/environment'; + +const MENU_CLOSE_TIMEOUT = 250; +let closeTimeout: number | undefined; + +export default function useMouseInside( + isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, +) { + const isMouseInside = useRef(false); + + useEffect(() => { + if (closeTimeout) { + clearTimeout(closeTimeout); + closeTimeout = undefined; + } + + if (isOpen && !IS_TOUCH_ENV) { + closeTimeout = window.setTimeout(() => { + if (!isMouseInside.current) { + onClose(); + } + }, menuCloseTimeout * 2); + } + }, [isOpen, menuCloseTimeout, onClose]); + + const handleMouseEnter = useCallback(() => { + isMouseInside.current = true; + }, []); + + const handleMouseLeave = useCallback(() => { + isMouseInside.current = false; + + if (closeTimeout) { + clearTimeout(closeTimeout); + closeTimeout = undefined; + } + + closeTimeout = window.setTimeout(() => { + if (!isMouseInside.current) { + onClose(); + } + }, menuCloseTimeout); + }, [menuCloseTimeout, onClose]); + + return [handleMouseEnter, handleMouseLeave]; +} diff --git a/src/hooks/useOnChange.ts b/src/hooks/useOnChange.ts new file mode 100644 index 000000000..24c2273cc --- /dev/null +++ b/src/hooks/useOnChange.ts @@ -0,0 +1,9 @@ +import usePrevious from './usePrevious'; + +export default (cb: (args: PT) => void, dependencies: T) => { + const prevDeps = usePrevious(dependencies); + if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) { + // @ts-ignore (workaround for "could be instantiated with a different subtype" issue) + cb(prevDeps || []); + } +}; diff --git a/src/hooks/usePrevForAnimation.ts b/src/hooks/usePrevForAnimation.ts new file mode 100644 index 000000000..ca640c1a5 --- /dev/null +++ b/src/hooks/usePrevForAnimation.ts @@ -0,0 +1,30 @@ +import { useRef } from '../lib/teact/teact'; + +import usePrevious from './usePrevious'; +import useForceUpdate from './useForceUpdate'; +import useOnChange from './useOnChange'; + +export default function usePrevForAnimation(current: any, duration?: number) { + const prev = usePrevious(current, true); + const timeoutRef = useRef(); + const forceUpdate = useForceUpdate(); + // eslint-disable-next-line no-null/no-null + const isCurrentPresent = current !== undefined && current !== null; + + if (isCurrentPresent && timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + } + + useOnChange(() => { + // When `current` becomes empty + if (duration && !isCurrentPresent && prev && !timeoutRef.current) { + timeoutRef.current = window.setTimeout(() => { + timeoutRef.current = undefined; + forceUpdate(); + }, duration); + } + }, [current]); + + return !timeoutRef.current || !duration || isCurrentPresent ? current : prev; +} diff --git a/src/hooks/usePrevious.ts b/src/hooks/usePrevious.ts new file mode 100644 index 000000000..9e7c2139a --- /dev/null +++ b/src/hooks/usePrevious.ts @@ -0,0 +1,16 @@ +import { useRef } from '../lib/teact/teact'; + +function usePrevious(next: T): T | undefined; +function usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined; +function usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined; +function usePrevious(next: T, shouldSkipUndefined?: boolean) { + const ref = useRef(); + const { current } = ref; + if (!shouldSkipUndefined || next !== undefined) { + ref.current = next; + } + + return current; +} + +export default usePrevious; diff --git a/src/hooks/useReducer.ts b/src/hooks/useReducer.ts new file mode 100644 index 000000000..3b08daf4d --- /dev/null +++ b/src/hooks/useReducer.ts @@ -0,0 +1,22 @@ +import { useState, useCallback, useRef } from '../lib/teact/teact'; + +export type ReducerAction = { type: Actions; payload?: any }; +export type StateReducer = (state: State, action: ReducerAction) => State; +export type Dispatch = (action: ReducerAction) => void; + +export default function useReducer( + reducer: StateReducer, + initialState: State, +) { + const reducerRef = useRef(reducer); + const [state, setState] = useState(initialState); + + const dispatch = useCallback((action: ReducerAction) => { + setState((currentState) => reducerRef.current(currentState, action)); + }, []); + + return [ + state, + dispatch, + ] as [State, Dispatch]; +} diff --git a/src/hooks/useShowTransition.ts b/src/hooks/useShowTransition.ts new file mode 100644 index 000000000..81f4dccb6 --- /dev/null +++ b/src/hooks/useShowTransition.ts @@ -0,0 +1,57 @@ +import { useRef, useState } from '../lib/teact/teact'; +import buildClassName from '../util/buildClassName'; + +const CLOSE_DURATION = 350; + +export default ( + isOpen = false, + onCloseTransitionEnd?: () => void, + noOpenTransition = false, + className: string | false = 'fast', + noCloseTransition = false, +) => { + const [isClosed, setIsClosed] = useState(!isOpen); + const closeTimeoutRef = useRef(); + // СSS class should be added in a separate tick to turn on CSS transition. + const [hasAsyncOpenClassName, setHasAsyncOpenClassName] = useState(false); + + if (isOpen) { + setIsClosed(false); + setHasAsyncOpenClassName(true); + + if (closeTimeoutRef.current) { + window.clearTimeout(closeTimeoutRef.current); + closeTimeoutRef.current = undefined; + } + } else { + setHasAsyncOpenClassName(false); + + if (!isClosed && !closeTimeoutRef.current) { + closeTimeoutRef.current = window.setTimeout(() => { + setIsClosed(true); + + if (onCloseTransitionEnd) { + onCloseTransitionEnd(); + } + + closeTimeoutRef.current = undefined; + }, noCloseTransition ? 0 : CLOSE_DURATION); + } + } + + const hasOpenClassName = hasAsyncOpenClassName || (isOpen && noOpenTransition); + const isClosing = Boolean(closeTimeoutRef.current); + const shouldRender = isOpen || isClosing; + const transitionClassNames = buildClassName( + className && 'opacity-transition', + className, + hasOpenClassName && 'open', + shouldRender && 'shown', + isClosing && 'closing', + ); + + return { + shouldRender, + transitionClassNames, + }; +}; diff --git a/src/hooks/useThrottle.ts b/src/hooks/useThrottle.ts new file mode 100644 index 000000000..e8251e07b --- /dev/null +++ b/src/hooks/useThrottle.ts @@ -0,0 +1,9 @@ +import { useMemo } from '../lib/teact/teact'; + +import { throttle } from '../util/schedulers'; + +export default (ms: number) => { + return useMemo(() => { + return throttle((cb) => cb(), ms); + }, [ms]); +}; diff --git a/src/hooks/useThrottledMemo.ts b/src/hooks/useThrottledMemo.ts new file mode 100644 index 000000000..85aaaf76f --- /dev/null +++ b/src/hooks/useThrottledMemo.ts @@ -0,0 +1,25 @@ +import { useRef } from '../lib/teact/teact'; + +import useThrottle from './useThrottle'; +import useOnChange from './useOnChange'; +import useForceUpdate from './useForceUpdate'; + +export default (resolverFn: () => R, ms: number, dependencies: D) => { + const valueRef = useRef(); + const runThrottled = useThrottle(ms); + const forceUpdate = useForceUpdate(); + + useOnChange(() => { + let isSync = true; + runThrottled(() => { + valueRef.current = resolverFn(); + + if (!isSync) { + forceUpdate(); + } + }); + isSync = false; + }, dependencies); + + return valueRef.current; +}; diff --git a/src/hooks/useTransitionForMedia.ts b/src/hooks/useTransitionForMedia.ts new file mode 100644 index 000000000..e9b765ce5 --- /dev/null +++ b/src/hooks/useTransitionForMedia.ts @@ -0,0 +1,37 @@ +import { useEffect, useRef, useState } from '../lib/teact/teact'; + +import useShowTransition from './useShowTransition'; + +const SPEED = { + fast: 200, + slow: 350, +}; + +export default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => { + const isMediaLoaded = Boolean(mediaData); + const willAnimate = !useRef(isMediaLoaded).current && !noAnimate; + const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded); + + const { + shouldRender: shouldRenderFullMedia, + transitionClassNames, + } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed); + + useEffect(() => { + if (shouldRenderFullMedia) { + if (willAnimate) { + setTimeout(() => { + setShouldRenderThumb(false); + }, SPEED[speed]); + } else { + setShouldRenderThumb(false); + } + } + }, [willAnimate, shouldRenderFullMedia, speed]); + + return { + shouldRenderThumb, + shouldRenderFullMedia, + transitionClassNames, + }; +}; diff --git a/src/hooks/useVideoCleanup.ts b/src/hooks/useVideoCleanup.ts new file mode 100644 index 000000000..5dc78ef7e --- /dev/null +++ b/src/hooks/useVideoCleanup.ts @@ -0,0 +1,21 @@ +import { RefObject } from 'react'; +import { useEffect } from '../lib/teact/teact'; +import { fastRaf } from '../util/schedulers'; + +// Fix for memory leak when unmounting video element +export default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) { + useEffect(() => { + const videoEl = videoRef.current; + + return () => { + if (videoEl) { + fastRaf(() => { + videoEl.pause(); + videoEl.src = ''; + videoEl.load(); + }); + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, dependencies); +} diff --git a/src/hooks/useVirtualBackdrop.ts b/src/hooks/useVirtualBackdrop.ts new file mode 100644 index 000000000..dd64d0285 --- /dev/null +++ b/src/hooks/useVirtualBackdrop.ts @@ -0,0 +1,41 @@ +import { RefObject } from 'react'; +import { useEffect } from '../lib/teact/teact'; + +const BACKDROP_CLASSNAME = 'backdrop'; + +// This effect implements closing menus by clicking outside of them +// without adding extra elements to the DOM +export default function useVirtualBackdrop( + isOpen: boolean, + menuRef: RefObject, + onClose?: () => void | undefined, +) { + useEffect(() => { + const handleEvent = (e: Event) => { + const menu = menuRef.current; + const target = e.target as HTMLElement | null; + if (!menu || !target) { + return; + } + + if ( + !menu.contains(e.target as Node | null) + || target.classList.contains(BACKDROP_CLASSNAME) + ) { + e.preventDefault(); + e.stopPropagation(); + if (onClose) { + onClose(); + } + } + }; + + if (isOpen && onClose) { + document.addEventListener('mousedown', handleEvent); + } + + return () => { + document.removeEventListener('mousedown', handleEvent); + }; + }, [isOpen, menuRef, onClose]); +} diff --git a/src/hooks/useWebpThumbnail.ts b/src/hooks/useWebpThumbnail.ts new file mode 100644 index 000000000..da576c7f3 --- /dev/null +++ b/src/hooks/useWebpThumbnail.ts @@ -0,0 +1,33 @@ +import { useLayoutEffect, useState } from '../lib/teact/teact'; + +import { ApiMessage } from '../api/types'; + +import { DEBUG } from '../config'; +import { isWebpSupported } from '../util/environment'; +import { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng'; +import { getMessageMediaThumbDataUri } from '../modules/helpers'; + +export default function useWebpThumbnail(message?: ApiMessage) { + const thumbnail = message && getMessageMediaThumbDataUri(message); + const { sticker } = (message && message.content) || {}; + const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp'); + const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI); + const messageId = message && message.id; + + useLayoutEffect(() => { + if (!shouldDecodeThumbnail) { + return; + } + + webpToPngBase64(`b64-${messageId}`, thumbnail!) + .then(setThumbnailDecoded) + .catch((err) => { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(err); + } + }); + }, [messageId, shouldDecodeThumbnail, thumbnail]); + + return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail; +} diff --git a/src/hooks/useWindowSize.ts b/src/hooks/useWindowSize.ts new file mode 100644 index 000000000..f40a05a77 --- /dev/null +++ b/src/hooks/useWindowSize.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from '../lib/teact/teact'; + +import { IDimensions } from '../modules/helpers'; + +import { throttle } from '../util/schedulers'; +import windowSize from '../util/windowSize'; + +const RESIZE_TIMEOUT_MS = 250; + +export default () => { + const [size, setSize] = useState(windowSize.get()); + + useEffect(() => { + const handleResize = throttle(() => { + setSize(windowSize.get()); + }, RESIZE_TIMEOUT_MS, false); + + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }); + + return size; +}; diff --git a/src/index-perf.html b/src/index-perf.html new file mode 100644 index 000000000..d9bfa072b --- /dev/null +++ b/src/index-perf.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + Telegram + + + +
    + + + + + diff --git a/src/index-perf.tsx b/src/index-perf.tsx new file mode 100644 index 000000000..e520f48e4 --- /dev/null +++ b/src/index-perf.tsx @@ -0,0 +1,38 @@ +import React, { getGlobal, setGlobal } from './lib/teact/teactn'; +import TeactDOM from './lib/teact/teact-dom'; +// import './store'; + +import { Bundles, loadModule } from './util/moduleLoader'; + +import App from './App'; + +import './styles/index.scss'; + +function renderApp() { + return TeactDOM.render( + , + document.getElementById('root'), + ); +} + +function renderNothing() { + TeactDOM.render( +
    , + document.getElementById('root'), + ); +} + +function preloadMainBundle() { + return loadModule(Bundles.Main, 'Main'); +} + +// getDispatch().init(); +// renderApp(); + +(window as any).perf = { + getGlobal, + setGlobal, + renderApp, + renderNothing, + preloadMainBundle, +}; diff --git a/src/index.html b/src/index.html new file mode 100644 index 000000000..80ee4c587 --- /dev/null +++ b/src/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + Telegram + + + +
    +
    + + + diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 000000000..61d15db31 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,40 @@ +import './util/handleError'; +import './util/setupServiceWorker'; + +import React, { getDispatch, getGlobal } from './lib/teact/teactn'; +import TeactDOM from './lib/teact/teact-dom'; + +import './global'; + +import { DEBUG } from './config'; + +import App from './App'; + +import './styles/index.scss'; + +if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> INIT'); +} + +getDispatch().init(); + +if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START INITIAL RENDER'); +} + +TeactDOM.render( + , + document.getElementById('root'), +); + +if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH INITIAL RENDER'); +} + +document.addEventListener('dblclick', () => { + // eslint-disable-next-line no-console + console.log('GLOBAL STATE', getGlobal()); +}); diff --git a/src/lib/croppie.ts b/src/lib/croppie.ts new file mode 100644 index 000000000..b073458f0 --- /dev/null +++ b/src/lib/croppie.ts @@ -0,0 +1,4 @@ +import Croppie from 'croppie'; +import 'croppie/croppie.css'; + +export default Croppie; diff --git a/src/lib/fastBlur.js b/src/lib/fastBlur.js new file mode 100644 index 000000000..38d5aaa30 --- /dev/null +++ b/src/lib/fastBlur.js @@ -0,0 +1,168 @@ +/* eslint-disable no-nested-ternary */ +/* eslint-disable no-bitwise */ +/* eslint-disable no-multi-assign */ +/* eslint-disable no-cond-assign */ +/* eslint-disable no-param-reassign */ +/* eslint-disable prefer-const */ +/* eslint-disable eqeqeq */ + +/* +Superfast Blur - a fast Box Blur For Canvas + +Version: 0.5 +Author: Mario Klingemann +Contact: mario@quasimondo.com +Website: http://www.quasimondo.com/BoxBlurForCanvas +Twitter: @quasimondo + +In case you find this class useful - especially in commercial projects - +I am not totally unhappy for a small donation to my PayPal account +mario@quasimondo.de + +Or support me on flattr: +https://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript + +Copyright (c) 2011 Mario Klingemann + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +*/ + +// eslint-disable-next-line max-len +const mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1]; +// eslint-disable-next-line max-len +const shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18]; + +export default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) { + if (Number.isNaN(radius) || radius < 1) return; + + radius |= 0; + + if (Number.isNaN(iterations)) iterations = 1; + iterations |= 0; + if (iterations > 3) iterations = 3; + if (iterations < 1) iterations = 1; + + const imageData = context.getImageData(top_x, top_y, width, height); + + const pixels = imageData.data; + + let rsum; + let gsum; + let bsum; + let x; + let y; + let i; + let p; + let p1; + let p2; + let yp; + let yi; + let yw; + let wm = width - 1; + let hm = height - 1; + let rad1 = radius + 1; + + let r = []; + let g = []; + let b = []; + + let mul_sum = mul_table[radius]; + let shg_sum = shg_table[radius]; + + let vmin = []; + let vmax = []; + + while (iterations-- > 0) { + yw = yi = 0; + + for (y = 0; y < height; y++) { + rsum = pixels[yw] * rad1; + gsum = pixels[yw + 1] * rad1; + bsum = pixels[yw + 2] * rad1; + + for (i = 1; i <= radius; i++) { + p = yw + (((i > wm ? wm : i)) << 2); + rsum += pixels[p++]; + gsum += pixels[p++]; + bsum += pixels[p++]; + } + + for (x = 0; x < width; x++) { + r[yi] = rsum; + g[yi] = gsum; + b[yi] = bsum; + + if (y == 0) { + vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2; + vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0); + } + + p1 = yw + vmin[x]; + p2 = yw + vmax[x]; + + rsum += pixels[p1++] - pixels[p2++]; + gsum += pixels[p1++] - pixels[p2++]; + bsum += pixels[p1++] - pixels[p2++]; + + yi++; + } + yw += (width << 2); + } + + for (x = 0; x < width; x++) { + yp = x; + rsum = r[yp] * rad1; + gsum = g[yp] * rad1; + bsum = b[yp] * rad1; + + for (i = 1; i <= radius; i++) { + yp += (i > hm ? 0 : width); + rsum += r[yp]; + gsum += g[yp]; + bsum += b[yp]; + } + + yi = x << 2; + for (y = 0; y < height; y++) { + pixels[yi] = (rsum * mul_sum) >>> shg_sum; + pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum; + pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum; + + if (x == 0) { + vmin[y] = ((p = y + rad1) < hm ? p : hm) * width; + vmax[y] = ((p = y - radius) > 0 ? p * width : 0); + } + + p1 = x + vmin[y]; + p2 = x + vmax[y]; + + rsum += r[p1] - r[p2]; + gsum += g[p1] - g[p2]; + bsum += b[p1] - b[p2]; + + yi += width << 2; + } + } + } + + context.putImageData(imageData, top_x, top_y); +} diff --git a/src/lib/gramjs/.editorconfig b/src/lib/gramjs/.editorconfig new file mode 100644 index 000000000..c7f8c3c8c --- /dev/null +++ b/src/lib/gramjs/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 +indent_style = space +indent_size = 4 diff --git a/src/lib/gramjs/Helpers.js b/src/lib/gramjs/Helpers.js new file mode 100644 index 000000000..8e4d87fed --- /dev/null +++ b/src/lib/gramjs/Helpers.js @@ -0,0 +1,348 @@ +const crypto = require('./crypto/crypto') +const BigInt = require('big-integer') + +/** + * converts a buffer to big int + * @param buffer + * @param little + * @param signed + * @returns {bigInt.BigInteger} + */ +function readBigIntFromBuffer(buffer, little = true, signed = false) { + let randBuffer = Buffer.from(buffer) + const bytesNumber = randBuffer.length + if (little) { + randBuffer = randBuffer.reverse() + } + let bigInt = BigInt(randBuffer.toString('hex'), 16) + if (signed && Math.floor(bigInt.toString('2').length / 8) >= bytesNumber) { + bigInt = bigInt.subtract(BigInt(2) + .pow(BigInt(bytesNumber * 8))) + } + return bigInt +} + +/** + * Special case signed little ints + * @param big + * @param number + * @returns {Buffer} + */ +function toSignedLittleBuffer(big, number = 8) { + const bigNumber = BigInt(big) + const byteArray = [] + for (let i = 0; i < number; i++) { + byteArray[i] = bigNumber.shiftRight(8 * i).and(255) + } + return Buffer.from(byteArray) +} + + +/** + * converts a big int to a buffer + * @param bigInt {BigInteger} + * @param bytesNumber + * @param little + * @param signed + * @returns {Buffer} + */ +function readBufferFromBigInt(bigInt, bytesNumber, little = true, signed = false) { + bigInt = BigInt(bigInt) + const bitLength = bigInt.bitLength() + + const bytes = Math.ceil(bitLength / 8) + if (bytesNumber < bytes) { + throw new Error('OverflowError: int too big to convert') + } + if (!signed && bigInt.lesser(BigInt(0))) { + throw new Error('Cannot convert to unsigned') + } + let below = false + if (bigInt.lesser(BigInt(0))) { + below = true + bigInt = bigInt.abs() + } + + const hex = bigInt.toString('16') + .padStart(bytesNumber * 2, '0') + let l = Buffer.from(hex, 'hex') + if (little) { + l = l.reverse() + } + + if (signed && below) { + if (little) { + let reminder = false + if (l[0] !== 0) { + l[0] -= 1 + } + for (let i = 0; i < l.length; i++) { + if (l[i] === 0) { + reminder = true + continue + } + if (reminder) { + l[i] -= 1 + reminder = false + } + l[i] = 255 - l[i] + } + } else { + l[l.length - 1] = 256 - l[l.length - 1] + for (let i = 0; i < l.length - 1; i++) { + l[i] = 255 - l[i] + } + } + } + return l +} + +/** + * Generates a random long integer (8 bytes), which is optionally signed + * @returns {BigInteger} + */ +function generateRandomLong(signed = true) { + return readBigIntFromBuffer(generateRandomBytes(8), true, signed) +} + +/** + * .... really javascript + * @param n {number} + * @param m {number} + * @returns {number} + */ +function mod(n, m) { + return ((n % m) + m) % m +} + +/** + * returns a positive bigInt + * @param n {BigInt} + * @param m {BigInt} + * @returns {BigInt} + */ +function bigIntMod(n, m) { + return ((n.remainder(m)).add(m)).remainder(m) +} + +/** + * Generates a random bytes array + * @param count + * @returns {Buffer} + */ +function generateRandomBytes(count) { + return Buffer.from(crypto.randomBytes(count)) +} + +/** + * Calculate the key based on Telegram guidelines, specifying whether it's the client or not + * @param sharedKey + * @param msgKey + * @param client + * @returns {{iv: Buffer, key: Buffer}} + */ +/*CONTEST +this is mtproto 1 (mostly used for secret chats) +async function calcKey(sharedKey, msgKey, client) { + const x = client === true ? 0 : 8 + const [sha1a, sha1b, sha1c, sha1d] = await Promise.all([ + sha1(Buffer.concat([msgKey, sharedKey.slice(x, x + 32)])), + sha1(Buffer.concat([sharedKey.slice(x + 32, x + 48), msgKey, sharedKey.slice(x + 48, x + 64)])), + sha1(Buffer.concat([sharedKey.slice(x + 64, x + 96), msgKey])), + sha1(Buffer.concat([msgKey, sharedKey.slice(x + 96, x + 128)])) + ]) + const key = Buffer.concat([sha1a.slice(0, 8), sha1b.slice(8, 20), sha1c.slice(4, 16)]) + const iv = Buffer.concat([sha1a.slice(8, 20), sha1b.slice(0, 8), sha1c.slice(16, 20), sha1d.slice(0, 8)]) + return { + key, + iv + } +} + + */ + +/** + * Generates the key data corresponding to the given nonces + * @param serverNonce + * @param newNonce + * @returns {{key: Buffer, iv: Buffer}} + */ +async function generateKeyDataFromNonce(serverNonce, newNonce) { + serverNonce = toSignedLittleBuffer(serverNonce, 16) + newNonce = toSignedLittleBuffer(newNonce, 32) + const [hash1, hash2, hash3] = await Promise.all([ + sha1(Buffer.concat([newNonce, serverNonce])), + sha1(Buffer.concat([serverNonce, newNonce])), + sha1(Buffer.concat([newNonce, newNonce])) + ]) + const keyBuffer = Buffer.concat([hash1, hash2.slice(0, 12)]) + const ivBuffer = Buffer.concat([hash2.slice(12, 20), hash3, newNonce.slice(0, 4)]) + return { + key: keyBuffer, + iv: ivBuffer + } +} + +function convertToLittle(buf) { + const correct = Buffer.alloc(buf.length * 4); + + for (let i = 0; i < buf.length; i++) { + correct.writeUInt32BE(buf[i], i * 4) + } + return correct; +} + +/** + * Calculates the SHA1 digest for the given data + * @param data + * @returns {Promise} + */ +function sha1(data) { + const shaSum = crypto.createHash('sha1') + shaSum.update(data) + return shaSum.digest() +} + + +/** + * Calculates the SHA256 digest for the given data + * @param data + * @returns {Promise} + */ +function sha256(data) { + const shaSum = crypto.createHash('sha256') + shaSum.update(data) + return shaSum.digest() +} + +/** + * Fast mod pow for RSA calculation. a^b % n + * @param a + * @param b + * @param n + * @returns {bigInt.BigInteger} + */ +function modExp(a, b, n) { + a = a.remainder(n) + let result = BigInt.one + let x = a + while (b.greater(BigInt.zero)) { + const leastSignificantBit = b.remainder(BigInt(2)) + b = b.divide(BigInt(2)) + if (leastSignificantBit.eq(BigInt.one)) { + result = result.multiply(x) + result = result.remainder(n) + } + x = x.multiply(x) + x = x.remainder(n) + } + return result +} + + +/** + * Gets the arbitrary-length byte array corresponding to the given integer + * @param integer {number,BigInteger} + * @param signed {boolean} + * @returns {Buffer} + */ +function getByteArray(integer, signed = false) { + const bits = integer.toString(2).length + const byteLength = Math.floor((bits + 8 - 1) / 8) + return readBufferFromBigInt(BigInt(integer), byteLength, false, signed) +} + +/** + * returns a random int from min (inclusive) and max (inclusive) + * @param min + * @param max + * @returns {number} + */ +function getRandomInt(min, max) { + min = Math.ceil(min) + max = Math.floor(max) + return Math.floor(Math.random() * (max - min + 1)) + min +} + +/** + * Sleeps a specified amount of time + * @param ms time in milliseconds + * @returns {Promise} + */ +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) + +/** + * Checks if the obj is an array + * @param obj + * @returns {boolean} + */ +/* +CONTEST +we do'nt support array requests anyway +function isArrayLike(obj) { + if (!obj) return false + const l = obj.length + if (typeof l != 'number' || l < 0) return false + if (Math.floor(l) !== l) return false + // fast check + if (l > 0 && !(l - 1 in obj)) return false + // more complete check (optional) + for (let i = 0; i < l; ++i) { + if (!(i in obj)) return false + } + return true +} +*/ +// Taken from https://stackoverflow.com/questions/18638900/javascript-crc32/18639999#18639999 +function makeCRCTable() { + let c + const crcTable = [] + for (let n = 0; n < 256; n++) { + c = n + for (let k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)) + } + crcTable[n] = c + } + return crcTable +} + +let crcTable = null + +function crc32(buf) { + if (!crcTable) { + crcTable = makeCRCTable() + } + if (!Buffer.isBuffer(buf)) { + buf = Buffer.from(buf) + } + let crc = -1 + + for (let index = 0; index < buf.length; index++) { + const byte = buf[index] + crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8) + } + return (crc ^ (-1)) >>> 0 +} + +module.exports = { + readBigIntFromBuffer, + readBufferFromBigInt, + generateRandomLong, + mod, + crc32, + generateRandomBytes, + //calcKey, + generateKeyDataFromNonce, + sha1, + sha256, + bigIntMod, + modExp, + getRandomInt, + sleep, + getByteArray, + //isArrayLike, + toSignedLittleBuffer, + convertToLittle + +} diff --git a/src/lib/gramjs/Password.js b/src/lib/gramjs/Password.js new file mode 100644 index 000000000..50b951dfb --- /dev/null +++ b/src/lib/gramjs/Password.js @@ -0,0 +1,275 @@ +const BigInt = require('big-integer') +const Factorizator = require('./crypto/Factorizator') +const { constructors } = require('./tl') +const { readBigIntFromBuffer, readBufferFromBigInt, sha256, bigIntMod, modExp, + generateRandomBytes } = require('./Helpers') +const crypto = require('./crypto/crypto') +const SIZE_FOR_HASH = 256 + +/** + * + * + * @param prime{BigInteger} + * @param g{BigInteger} + */ +/* +We don't support changing passwords yet +function checkPrimeAndGoodCheck(prime, g) { + console.error('Unsupported function `checkPrimeAndGoodCheck` call. Arguments:', prime, g) + + const goodPrimeBitsCount = 2048 + if (prime < 0 || prime.bitLength() !== goodPrimeBitsCount) { + throw new Error(`bad prime count ${prime.bitLength()},expected ${goodPrimeBitsCount}`) + } + // TODO this is kinda slow + if (Factorizator.factorize(prime)[0] !== 1) { + throw new Error('give "prime" is not prime') + } + if (g.eq(BigInt(2))) { + if ((prime.remainder(BigInt(8))).neq(BigInt(7))) { + throw new Error(`bad g ${g}, mod8 ${prime % 8}`) + } + } else if (g.eq(BigInt(3))) { + if ((prime.remainder(BigInt(3))).neq(BigInt(2))) { + throw new Error(`bad g ${g}, mod3 ${prime % 3}`) + } + // eslint-disable-next-line no-empty + } else if (g.eq(BigInt(4))) { + + } else if (g.eq(BigInt(5))) { + if (!([ BigInt(1), BigInt(4) ].includes(prime.remainder(BigInt(5))))) { + throw new Error(`bad g ${g}, mod8 ${prime % 5}`) + } + } else if (g.eq(BigInt(6))) { + if (!([ BigInt(19), BigInt(23) ].includes(prime.remainder(BigInt(24))))) { + throw new Error(`bad g ${g}, mod8 ${prime % 24}`) + } + } else if (g.eq(BigInt(7))) { + if (!([ BigInt(3), BigInt(5), BigInt(6) ].includes(prime.remainder(BigInt(7))))) { + throw new Error(`bad g ${g}, mod8 ${prime % 7}`) + } + } else { + throw new Error(`bad g ${g}`) + } + const primeSub1Div2 = (prime.subtract(BigInt(1))).divide(BigInt(2)) + if (Factorizator.factorize(primeSub1Div2)[0] !== 1) { + throw new Error('(prime - 1) // 2 is not prime') + } +} +*/ +/** + * + * @param primeBytes{Buffer} + * @param g{number} + */ +function checkPrimeAndGood(primeBytes, g) { + const goodPrime = Buffer.from([ + 0xC7, 0x1C, 0xAE, 0xB9, 0xC6, 0xB1, 0xC9, 0x04, 0x8E, 0x6C, 0x52, 0x2F, 0x70, 0xF1, 0x3F, 0x73, + 0x98, 0x0D, 0x40, 0x23, 0x8E, 0x3E, 0x21, 0xC1, 0x49, 0x34, 0xD0, 0x37, 0x56, 0x3D, 0x93, 0x0F, + 0x48, 0x19, 0x8A, 0x0A, 0xA7, 0xC1, 0x40, 0x58, 0x22, 0x94, 0x93, 0xD2, 0x25, 0x30, 0xF4, 0xDB, + 0xFA, 0x33, 0x6F, 0x6E, 0x0A, 0xC9, 0x25, 0x13, 0x95, 0x43, 0xAE, 0xD4, 0x4C, 0xCE, 0x7C, 0x37, + 0x20, 0xFD, 0x51, 0xF6, 0x94, 0x58, 0x70, 0x5A, 0xC6, 0x8C, 0xD4, 0xFE, 0x6B, 0x6B, 0x13, 0xAB, + 0xDC, 0x97, 0x46, 0x51, 0x29, 0x69, 0x32, 0x84, 0x54, 0xF1, 0x8F, 0xAF, 0x8C, 0x59, 0x5F, 0x64, + 0x24, 0x77, 0xFE, 0x96, 0xBB, 0x2A, 0x94, 0x1D, 0x5B, 0xCD, 0x1D, 0x4A, 0xC8, 0xCC, 0x49, 0x88, + 0x07, 0x08, 0xFA, 0x9B, 0x37, 0x8E, 0x3C, 0x4F, 0x3A, 0x90, 0x60, 0xBE, 0xE6, 0x7C, 0xF9, 0xA4, + 0xA4, 0xA6, 0x95, 0x81, 0x10, 0x51, 0x90, 0x7E, 0x16, 0x27, 0x53, 0xB5, 0x6B, 0x0F, 0x6B, 0x41, + 0x0D, 0xBA, 0x74, 0xD8, 0xA8, 0x4B, 0x2A, 0x14, 0xB3, 0x14, 0x4E, 0x0E, 0xF1, 0x28, 0x47, 0x54, + 0xFD, 0x17, 0xED, 0x95, 0x0D, 0x59, 0x65, 0xB4, 0xB9, 0xDD, 0x46, 0x58, 0x2D, 0xB1, 0x17, 0x8D, + 0x16, 0x9C, 0x6B, 0xC4, 0x65, 0xB0, 0xD6, 0xFF, 0x9C, 0xA3, 0x92, 0x8F, 0xEF, 0x5B, 0x9A, 0xE4, + 0xE4, 0x18, 0xFC, 0x15, 0xE8, 0x3E, 0xBE, 0xA0, 0xF8, 0x7F, 0xA9, 0xFF, 0x5E, 0xED, 0x70, 0x05, + 0x0D, 0xED, 0x28, 0x49, 0xF4, 0x7B, 0xF9, 0x59, 0xD9, 0x56, 0x85, 0x0C, 0xE9, 0x29, 0x85, 0x1F, + 0x0D, 0x81, 0x15, 0xF6, 0x35, 0xB1, 0x05, 0xEE, 0x2E, 0x4E, 0x15, 0xD0, 0x4B, 0x24, 0x54, 0xBF, + 0x6F, 0x4F, 0xAD, 0xF0, 0x34, 0xB1, 0x04, 0x03, 0x11, 0x9C, 0xD8, 0xE3, 0xB9, 0x2F, 0xCC, 0x5B, + ]) + if (goodPrime.equals(primeBytes)) { + if ([ 3, 4, 5, 7 ].includes(g)) { + return // It's good + } + } + throw new Error("Changing passwords unsupported") + //checkPrimeAndGoodCheck(readBigIntFromBuffer(primeBytes, false), g) +} + +/** + * + * @param number{BigInteger} + * @param p{BigInteger} + * @returns {boolean} + */ +function isGoodLarge(number, p) { + return (number.greater(BigInt(0)) && (p.subtract(number).greater(BigInt(0)))) +} + +/** + * + * @param number {Buffer} + * @returns {Buffer} + */ +function numBytesForHash(number) { + return Buffer.concat([ Buffer.alloc(SIZE_FOR_HASH - number.length), number ]) +} + +/** + * + * @param g {Buffer} + * @returns {Buffer} + */ +function bigNumForHash(g) { + return readBufferFromBigInt(g, SIZE_FOR_HASH, false) +} + +/** + * + * @param modexp {BigInteger} + * @param prime {BigInteger} + * @returns {Boolean} + */ +function isGoodModExpFirst(modexp, prime) { + const diff = prime.subtract(modexp) + + const minDiffBitsCount = 2048 - 64 + const maxModExpSize = 256 + + return !(diff.lesser(BigInt(0)) || diff.bitLength() < minDiffBitsCount || + modexp.bitLength() < minDiffBitsCount || + Math.floor((modexp.bitLength() + 7) / 8) > maxModExpSize) +} + +function xor(a, b) { + const length = Math.min(a.length, b.length) + + for (let i = 0; i < length; i++) { + a[i] = a[i] ^ b[i] + } + + return a +} + +/** + * + * @param password{Buffer} + * @param salt{Buffer} + * @param iterations{number} + * @returns {*} + */ + +function pbkdf2sha512(password, salt, iterations) { + return crypto.pbkdf2(password, salt, iterations, 64, 'sha512') +} + +/** + * + * @param algo {constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow} + * @param password + * @returns {Buffer|*} + */ +async function computeHash(algo, password) { + const hash1 = await sha256(Buffer.concat([ algo.salt1, Buffer.from(password, 'utf-8'), algo.salt1 ])) + const hash2 = await sha256(Buffer.concat([ algo.salt2, hash1, algo.salt2 ])) + const hash3 = await pbkdf2sha512(hash2, algo.salt1, 100000) + return sha256(Buffer.concat([ algo.salt2, hash3, algo.salt2 ])) +} + +/** + * + * @param algo {constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow} + * @param password + */ +async function computeDigest(algo, password) { + try { + checkPrimeAndGood(algo.p, algo.g) + } catch (e) { + throw new Error('bad p/g in password') + } + + const value = modExp(BigInt(algo.g), + readBigIntFromBuffer(await computeHash(algo, password), false), + readBigIntFromBuffer(algo.p, false)) + return bigNumForHash(value) +} + +/** + * + * @param request {constructors.account.Password} + * @param password {string} + */ +async function computeCheck(request, password) { + const algo = request.currentAlgo + if (!(algo instanceof constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow)) { + throw new Error(`Unsupported password algorithm ${algo.className}`) + } + + const pwHash = await computeHash(algo, password) + const p = readBigIntFromBuffer(algo.p, false) + const g = algo.g + const B = readBigIntFromBuffer(request.srp_B, false) + try { + checkPrimeAndGood(algo.p, g) + } catch (e) { + throw new Error('bad /g in password') + } + if (!isGoodLarge(B, p)) { + throw new Error('bad b in check') + } + const x = readBigIntFromBuffer(pwHash, false) + const pForHash = numBytesForHash(algo.p) + const gForHash = bigNumForHash(g) + const bForHash = numBytesForHash(request.srp_B) + const gX = modExp(BigInt(g), x, p) + const k = readBigIntFromBuffer(await sha256(Buffer.concat([ pForHash, gForHash ])), false) + const kgX = bigIntMod(k.multiply(gX),p) + const generateAndCheckRandom =async () => { + const randomSize = 256 + // eslint-disable-next-line no-constant-condition + while (true) { + const random = generateRandomBytes(randomSize) + const a = readBigIntFromBuffer(random, false) + const A = modExp(BigInt(g), a, p) + if (isGoodModExpFirst(A, p)) { + const aForHash = bigNumForHash(A) + const u = readBigIntFromBuffer(await sha256(Buffer.concat([ aForHash, bForHash ])), false) + if (u.greater(BigInt(0))) { + return [ a, aForHash, u ] + } + } + } + } + const [ a, aForHash, u ] =await generateAndCheckRandom() + const gB = bigIntMod(B.subtract(kgX),p) + if (!isGoodModExpFirst(gB, p)) { + throw new Error('bad gB') + } + + const ux = u.multiply(x) + const aUx = a.add(ux) + const S = modExp(gB, aUx, p) + const [K, pSha ,gSha, salt1Sha, salt2Sha] = await Promise.all([ + sha256(bigNumForHash(S)), + sha256(pForHash), + sha256(gForHash), + sha256(algo.salt1), + sha256(algo.salt2) + ]) + const M1 = await sha256(Buffer.concat([ + xor(pSha,gSha), + salt1Sha, + salt2Sha, + aForHash, + bForHash, + K, + ])) + + + return new constructors.InputCheckPasswordSRP({ + srpId: request.srpId, + A: Buffer.from(aForHash), + M1: M1, + + }) +} + +module.exports = { + computeCheck, + computeDigest, +} + diff --git a/src/lib/gramjs/Utils.js b/src/lib/gramjs/Utils.js new file mode 100644 index 000000000..b42fb1be8 --- /dev/null +++ b/src/lib/gramjs/Utils.js @@ -0,0 +1,687 @@ +const { constructors } = require('./tl') + +const USERNAME_RE = new RegExp('@|(?:https?:\\/\\/)?(?:www\\.)?' + + '(?:telegram\\.(?:me|dog)|t\\.me)\\/(@|joinchat\\/)?') + +const JPEG_HEADER = Buffer.from('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00', 'hex') +const JPEG_FOOTER = Buffer.from('ffd9', 'hex') + +const TG_JOIN_RE = new RegExp('tg:\\/\\/(join)\\?invite=') + +const VALID_USERNAME_RE = new RegExp('^([a-z]((?!__)[\\w\\d]){3,30}[a-z\\d]|gif|vid|' + + 'pic|bing|wiki|imdb|bold|vote|like|coub)$') + +function _raiseCastFail(entity, target) { + throw new Error(`Cannot cast ${entity.className} to any kind of ${target}`) +} + +/** + Gets the input peer for the given "entity" (user, chat or channel). + + A ``TypeError`` is raised if the given entity isn't a supported type + or if ``check_hash is True`` but the entity's ``accessHash is None`` + *or* the entity contains ``min`` information. In this case, the hash + cannot be used for general purposes, and thus is not returned to avoid + any issues which can derive from invalid access hashes. + + Note that ``check_hash`` **is ignored** if an input peer is already + passed since in that case we assume the user knows what they're doing. + This is key to getting entities by explicitly passing ``hash = 0``. + + * @param entity + * @param allowSelf + * @param checkHash + */ +function getInputPeer(entity, allowSelf = true, checkHash = true) { + if (entity.SUBCLASS_OF_ID === undefined) { + // e.g. custom.Dialog (can't cyclic import). + + if (allowSelf && 'inputEntity' in entity) { + return entity.inputEntity + } else if ('entity' in entity) { + return getInputPeer(entity.entity) + } else { + _raiseCastFail(entity, 'InputPeer') + } + } + if (entity.SUBCLASS_OF_ID === 0xc91c90b6) { // crc32(b'InputPeer') + return entity + } + + if (entity instanceof constructors.User) { + if (entity.isSelf && allowSelf) { + return new constructors.InputPeerSelf() + } else if (entity.accessHash !== undefined || !checkHash) { + return new constructors.InputPeerUser({ + userId: entity.id, + accessHash: entity.accessHash, + }) + } else { + throw new Error('User without accessHash or min info cannot be input') + } + } + if (entity instanceof constructors.Chat || entity instanceof constructors.ChatEmpty || + entity instanceof constructors.ChatForbidden) { + return new constructors.InputPeerChat({ chatId: entity.id }) + } + if (entity instanceof constructors.Channel) { + if (entity.accessHash !== undefined || !checkHash) { + return new constructors.InputPeerChannel({ + channelId: entity.id, + accessHash: entity.accessHash + }) + } else { + throw new TypeError('Channel without accessHash or min info cannot be input') + } + } + if (entity instanceof constructors.ChannelForbidden) { + // "channelForbidden are never min", and since their hash is + // also not optional, we assume that this truly is the case. + return new constructors.InputPeerChannel({ + channelId: entity.id, + accessHash: entity.accessHash + }) + } + + if (entity instanceof constructors.InputUser) { + return new constructors.InputPeerUser({ + userId: entity.userId, + accessHash: entity.accessHash + }) + } + if (entity instanceof constructors.InputChannel) { + return new constructors.InputPeerChannel({ + channelId: entity.channelId, + accessHash: entity.accessHash + }) + } + if (entity instanceof constructors.UserEmpty) { + return new constructors.InputPeerEmpty() + } + if (entity instanceof constructors.UserFull) { + return getInputPeer(entity.user) + } + + if (entity instanceof constructors.ChatFull) { + return new constructors.InputPeerChat({ chatId: entity.id }) + } + + if (entity instanceof constructors.PeerChat) { + return new constructors.InputPeerChat(entity.chatId) + } + + _raiseCastFail(entity, 'InputPeer') +} + +/** + Similar to :meth:`get_input_peer`, but for :tl:`InputChannel`'s alone. + + .. important:: + + This method does not validate for invalid general-purpose access + hashes, unlike `get_input_peer`. Consider using instead: + ``get_input_channel(get_input_peer(channel))``. + + * @param entity + * @returns {InputChannel|*} + */ +/*CONTEST +function getInputChannel(entity) { + if (entity.SUBCLASS_OF_ID === undefined) { + _raiseCastFail(entity, 'InputChannel') + } + + + if (entity.SUBCLASS_OF_ID === 0x40f202fd) { // crc32(b'InputChannel') + return entity + } + if (entity instanceof constructors.Channel || entity instanceof constructors.ChannelForbidden) { + return new constructors.InputChannel({ + channelId: entity.id, + accessHash: entity.accessHash || 0 + }) + } + + if (entity instanceof constructors.InputPeerChannel) { + return new constructors.InputChannel({ + channelId: entity.channelId, + accessHash: entity.accessHash + }) + } + _raiseCastFail(entity, 'InputChannel') +} +*/ +/** + Similar to :meth:`get_input_peer`, but for :tl:`InputUser`'s alone. + + .. important:: + + This method does not validate for invalid general-purpose access + hashes, unlike `get_input_peer`. Consider using instead: + ``get_input_channel(get_input_peer(channel))``. + + * @param entity + */ +/*CONTEST +function getInputUser(entity) { + if (entity.SUBCLASS_OF_ID === undefined) { + _raiseCastFail(entity, 'InputUser') + } + if (entity.SUBCLASS_OF_ID === 0xe669bf46) { // crc32(b'InputUser') + return entity + } + + if (entity instanceof constructors.User) { + if (entity.isSelf) { + return new constructors.InputPeerSelf() + } else { + return new constructors.InputUser({ + userId: entity.id, + accessHash: entity.accessHash || 0, + }) + } + } + if (entity instanceof constructors.InputPeerSelf) { + return new constructors.InputPeerSelf() + } + if (entity instanceof constructors.UserEmpty || entity instanceof constructors.InputPeerEmpty) { + return new constructors.InputUserEmpty() + } + + if (entity instanceof constructors.UserFull) { + return getInputUser(entity.user) + } + + if (entity instanceof constructors.InputPeerUser) { + return new constructors.InputUser({ + userId: entity.userId, + accessHash: entity.accessHash + }) + } + + _raiseCastFail(entity, 'InputUser') +} +*/ +/** + Similar to :meth:`get_input_peer`, but for dialogs + * @param dialog + */ +/*CONTEST +function getInputDialog(dialog) { + try { + if (dialog.SUBCLASS_OF_ID === 0xa21c9795) { // crc32(b'InputDialogPeer') + return dialog + } + if (dialog.SUBCLASS_OF_ID === 0xc91c90b6) { // crc32(b'InputPeer') + return new constructors.InputDialogPeer({ peer: dialog }) + } + } catch (e) { + _raiseCastFail(dialog, 'InputDialogPeer') + } + + try { + return new constructors.InputDialogPeer(getInputPeer(dialog)) + // eslint-disable-next-line no-empty + } catch (e) { + + } + _raiseCastFail(dialog, 'InputDialogPeer') +} +*/ +/*CONTEST + +function getInputMessage(message) { + try { + if (typeof message == 'number') { // This case is really common too + return new constructors.InputMessageID({ + id: message, + }) + } else if (message.SUBCLASS_OF_ID === 0x54b6bcc5) { // crc32(b'InputMessage') + return message + } else if (message.SUBCLASS_OF_ID === 0x790009e3) { // crc32(b'Message') + return new constructors.InputMessageID(message.id) + } + // eslint-disable-next-line no-empty + } catch (e) { + } + + _raiseCastFail(message, 'InputMessage') +} +*/ + +/** + * Adds the JPG header and footer to a stripped image. + * Ported from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225 + + * @param stripped{Buffer} + * @returns {Buffer} + */ +function strippedPhotoToJpg(stripped) { + // Note: Changes here should update _stripped_real_length + if (stripped.length < 3 || stripped[0] !== 1) { + return stripped + } + const header = Buffer.from(JPEG_HEADER) + header[164] = stripped[1] + header[166] = stripped[2] + return Buffer.concat([header, stripped.slice(3), JPEG_FOOTER]) +} + +/*CONTEST +function getInputLocation(location) { + try { + if (!location.SUBCLASS_OF_ID) { + throw new Error() + } + if (location.SUBCLASS_OF_ID === 0x1523d462) { + return { + dcId: null, + inputLocation: location + } + } + } catch (e) { + _raiseCastFail(location, 'InputFileLocation') + } + if (location instanceof constructors.Message) { + location = location.media + } + + if (location instanceof constructors.MessageMediaDocument) { + location = location.document + } else if (location instanceof constructors.MessageMediaPhoto) { + location = location.photo + } + + if (location instanceof constructors.Document) { + return { + dcId: location.dcId, + inputLocation: new constructors.InputDocumentFileLocation({ + id: location.id, + accessHash: location.accessHash, + fileReference: location.fileReference, + thumbSize: '', // Presumably to download one of its thumbnails + }), + } + } else if (location instanceof constructors.Photo) { + return { + dcId: location.dcId, + inputLocation: new constructors.InputPhotoFileLocation({ + id: location.id, + accessHash: location.accessHash, + fileReference: location.fileReference, + thumbSize: location.sizes[location.sizes.length - 1].type, + }), + } + } + + if (location instanceof constructors.FileLocationToBeDeprecated) { + throw new Error('Unavailable location cannot be used as input') + } + _raiseCastFail(location, 'InputFileLocation') +} +*/ + +/** + * Gets the appropriated part size when uploading or downloading files, + * given an initial file size. + * @param fileSize + * @returns {Number} + */ +function getAppropriatedPartSize(fileSize) { + if (fileSize <= 104857600) { // 100MB + return 128 + } + if (fileSize <= 786432000) { // 750MB + return 256 + } + if (fileSize <= 1572864000) { // 1500MB + return 512 + } + + throw new Error('File size too large') +} + +/*CONTEST +function getPeer(peer) { + try { + if (typeof peer === 'number') { + const res = resolveId(peer) + + if (res[1] === constructors.PeerChannel) { + return new res[1]({ channelId: res[0] }) + } else if (res[1] === constructors.PeerChat) { + return new res[1]({ chatId: res[0] }) + } else { + return new res[1]({ userId: res[0] }) + } + } + if (peer.SUBCLASS_OF_ID === undefined) { + throw new Error() + } + if (peer.SUBCLASS_OF_ID === 0x2d45687) { + return peer + } else if (peer instanceof constructors.contacts.ResolvedPeer || + peer instanceof constructors.InputNotifyPeer || peer instanceof constructors.TopPeer || + peer instanceof constructors.Dialog || peer instanceof constructors.DialogPeer) { + return peer.peer + } else if (peer instanceof constructors.ChannelFull) { + return new constructors.PeerChannel({ channelId: peer.id }) + } + if (peer.SUBCLASS_OF_ID === 0x7d7c6f86 || peer.SUBCLASS_OF_ID === 0xd9c7fc18) { + // ChatParticipant, ChannelParticipant + return new constructors.PeerUser({ userId: peer.userId }) + } + peer = getInputPeer(peer, false, false) + + if (peer instanceof constructors.InputPeerUser) { + return new constructors.PeerUser({ userId: peer.userId }) + } else if (peer instanceof constructors.InputPeerChat) { + return new constructors.PeerChat({ chatId: peer.chatId }) + } else if (peer instanceof constructors.InputPeerChannel) { + return new constructors.PeerChannel({ channelId: peer.channelId }) + } + // eslint-disable-next-line no-empty + } catch (e) { + console.log(e) + } + _raiseCastFail(peer, 'peer') +} +*/ + +/** + Convert the given peer into its marked ID by default. + + This "mark" comes from the "bot api" format, and with it the peer type + can be identified back. User ID is left unmodified, chat ID is negated, + and channel ID is prefixed with -100: + + * ``userId`` + * ``-chatId`` + * ``-100channel_id`` + + The original ID and the peer type class can be returned with + a call to :meth:`resolve_id(marked_id)`. + * @param peer + * @param addMark + */ +/*CONTEST +function getPeerId(peer, addMark = true) { + // First we assert it's a Peer TLObject, or early return for integers + if (typeof peer == 'number') { + return addMark ? peer : resolveId(peer)[0] + } + + // Tell the user to use their client to resolve InputPeerSelf if we got one + if (peer instanceof constructors.InputPeerSelf) { + _raiseCastFail(peer, 'int (you might want to use client.get_peer_id)') + } + + try { + peer = getPeer(peer) + } catch (e) { + _raiseCastFail(peer, 'int') + } + if (peer instanceof constructors.PeerUser) { + return peer.userId + } else if (peer instanceof constructors.PeerChat) { + // Check in case the user mixed things up to avoid blowing up + if (!(0 < peer.chatId <= 0x7fffffff)) { + peer.chatId = resolveId(peer.chatId)[0] + } + + return addMark ? -(peer.chatId) : peer.chatId + } else { // if (peer instanceof constructors.PeerChannel) + // Check in case the user mixed things up to avoid blowing up + if (!(0 < peer.channelId <= 0x7fffffff)) { + peer.channelId = resolveId(peer.channelId)[0] + } + if (!addMark) { + return peer.channelId + } + // Concat -100 through math tricks, .to_supergroup() on + // Madeline IDs will be strictly positive -> log works. + try { + return -(peer.channelId + Math.pow(10, Math.floor(Math.log10(peer.channelId) + 3))) + } catch (e) { + throw new Error('Cannot get marked ID of a channel unless its ID is strictly positive') + } + } +} +*/ +/** + * Given a marked ID, returns the original ID and its :tl:`Peer` type. + * @param markedId + */ +/*CONTEST +function resolveId(markedId) { + if (markedId >= 0) { + return [markedId, constructors.PeerUser] + } + + // There have been report of chat IDs being 10000xyz, which means their + // marked version is -10000xyz, which in turn looks like a channel but + // it becomes 00xyz (= xyz). Hence, we must assert that there are only + // two zeroes. + const m = markedId.toString() + .match(/-100([^0]\d*)/) + if (m) { + return [parseInt(m[1]), constructors.PeerChannel] + } + return [-markedId, constructors.PeerChat] +} +*/ + +/** + * returns an entity pair + * @param entityId + * @param entities + * @param cache + * @param getInputPeer + * @returns {{inputEntity: *, entity: *}} + * @private + */ +/*CONTEST + +function _getEntityPair(entityId, entities, cache, getInputPeer = getInputPeer) { + const entity = entities.get(entityId) + let inputEntity = cache[entityId] + if (inputEntity === undefined) { + try { + inputEntity = getInputPeer(inputEntity) + } catch (e) { + inputEntity = null + } + } + return { + entity, + inputEntity + } +} +*/ + +function getMessageId(message) { + if (message === null || message === undefined) { + return null + } + if (typeof message == 'number') { + return message + } + if (message.SUBCLASS_OF_ID === 0x790009e3) { // crc32(b'Message') + return message.id + } + throw new Error(`Invalid message type: ${message.constructor.name}`) +} + + +/** + * Parses the given phone, or returns `None` if it's invalid. + * @param phone + */ +function parsePhone(phone) { + return phone.toString().replace(/[+()\s-]/gm, '') +} + +/** + Parses the given username or channel access hash, given + a string, username or URL. Returns a tuple consisting of + both the stripped, lowercase username and whether it is + a joinchat/ hash (in which case is not lowercase'd). + + Returns ``(None, False)`` if the ``username`` or link is not valid. + + * @param username {string} + */ +/*CONTEST + +function parseUsername(username) { + username = username.trim() + const m = username.match(USERNAME_RE) || username.match(TG_JOIN_RE) + if (m) { + username = username.replace(m[0], '') + if (m[1]) { + return { + username: username, + isInvite: true + } + } else { + username = rtrim(username, '/') + } + } + if (username.match(VALID_USERNAME_RE)) { + return { + username: username.toLowerCase(), + isInvite: false + } + } else { + return { + username: null, + isInvite: false + } + } +} + +function rtrim(s, mask) { + while (~mask.indexOf(s[s.length - 1])) { + s = s.slice(0, -1) + } + return s +} + + */ + +/** + * Gets the display name for the given :tl:`User`, + :tl:`Chat` or :tl:`Channel`. Returns an empty string otherwise + * @param entity + */ +function getDisplayName(entity) { + if (entity instanceof constructors.User) { + if (entity.lastName && entity.firstName) { + return `${entity.firstName} ${entity.lastName}` + } else if (entity.firstName) { + return entity.firstName + } else if (entity.lastName) { + return entity.lastName + } else { + return '' + } + } else if (entity instanceof constructors.Chat || entity instanceof constructors.Channel) { + return entity.title + } + return '' +} + +/** + * check if a given item is an array like or not + * @param item + * @returns {boolean} + */ +/*CONTEST +Duplicate ? +function isListLike(item) { + return ( + Array.isArray(item) || + (!!item && + typeof item === 'object' && + typeof (item.length) === 'number' && + (item.length === 0 || + (item.length > 0 && + (item.length - 1) in item) + ) + ) + ) +} +*/ +function getDC(dcId, cdn = false) { + switch (dcId) { + case 1: + return { + id: 1, + ipAddress: 'pluto.web.telegram.org', + port: 443 + } + case 2: + return { + id: 2, + ipAddress: 'venus.web.telegram.org', + port: 443 + } + case 3: + return { + id: 3, + ipAddress: 'aurora.web.telegram.org', + port: 443 + } + case 4: + return { + id: 4, + ipAddress: 'vesta.web.telegram.org', + port: 443 + } + case 5: + return { + id: 5, + ipAddress: 'flora.web.telegram.org', + port: 443 + } + default: + throw new Error(`Cannot find the DC with the ID of ${dcId}`) + } + // TODO chose based on current connection method + /* + if (!this._config) { + this._config = await this.invoke(new requests.help.GetConfig()) + } + if (cdn && !this._cdnConfig) { + this._cdnConfig = await this.invoke(new requests.help.GetCdnConfig()) + for (const pk of this._cdnConfig.publicKeys) { + addKey(pk.publicKey) + } + } + for (const DC of this._config.dcOptions) { + if (DC.id === dcId && Boolean(DC.ipv6) === this._useIPV6 && Boolean(DC.cdn) === cdn) { + return DC + } + }*/ +} + +module.exports = { + getMessageId, + //_getEntityPair, + //getInputMessage, + //getInputDialog, + //getInputUser, + //getInputChannel, + getInputPeer, + //parsePhone, + //parseUsername, + //getPeer, + //getPeerId, + getDisplayName, + //resolveId, + //isListLike, + getAppropriatedPartSize, + //getInputLocation, + strippedPhotoToJpg, + getDC +} diff --git a/src/lib/gramjs/Version.js b/src/lib/gramjs/Version.js new file mode 100644 index 000000000..ada7db7c9 --- /dev/null +++ b/src/lib/gramjs/Version.js @@ -0,0 +1 @@ +module.exports = '0.0.2' diff --git a/src/lib/gramjs/client/2fa.ts b/src/lib/gramjs/client/2fa.ts new file mode 100644 index 000000000..4f667bda9 --- /dev/null +++ b/src/lib/gramjs/client/2fa.ts @@ -0,0 +1,121 @@ +import TelegramClient from './TelegramClient'; +import { default as Api } from '../tl/api'; +import { generateRandomBytes } from '../Helpers'; +import { computeCheck, computeDigest } from '../Password'; +import errors from '../errors'; + +export interface TwoFaParams { + isCheckPassword?: boolean; + currentPassword?: string; + newPassword?: string; + hint?: string; + email?: string; + emailCodeCallback?: (length: number) => Promise; + onEmailCodeError?: (err: Error) => void; +} + +/** + * Changes the 2FA settings of the logged in user. + Note that this method may be *incredibly* slow depending on the + prime numbers that must be used during the process to make sure + that everything is safe. + + Has no effect if both current and new password are omitted. + + * @param client: The telegram client instance + * @param isCheckPassword: Must be ``true`` if you want to check the current password + * @param currentPassword: The current password, to authorize changing to ``new_password``. + Must be set if changing existing 2FA settings. + Must **not** be set if 2FA is currently disabled. + Passing this by itself will remove 2FA (if correct). + * @param newPassword: The password to set as 2FA. + If 2FA was already enabled, ``currentPassword`` **must** be set. + Leaving this blank or `undefined` will remove the password. + * @param hint: Hint to be displayed by Telegram when it asks for 2FA. + Must be set when changing or creating a new password. + Has no effect if ``newPassword`` is not set. + * @param email: Recovery and verification email. If present, you must also + set `emailCodeCallback`, else it raises an Error. + * @param emailCodeCallback: If an email is provided, a callback that returns the code sent + to it must also be set. This callback may be asynchronous. + It should return a string with the code. The length of the + code will be passed to the callback as an input parameter. + + If the callback returns an invalid code, it will raise an rpc error with the message + ``CODE_INVALID`` + + * @returns Promise + * @throws this method can throw: + "PASSWORD_HASH_INVALID" if you entered a wrong password (or set it to undefined). + "EMAIL_INVALID" if the entered email is wrong + "EMAIL_HASH_EXPIRED" if the user took too long to verify their email + */ +export async function updateTwoFaSettings( + client: TelegramClient, + { + isCheckPassword, + currentPassword, + newPassword, + hint = '', + email, + emailCodeCallback, + onEmailCodeError, + }: TwoFaParams, +) { + if (!newPassword && !currentPassword) { + throw new Error('Neither `currentPassword` nor `newPassword` is present'); + } + + if (email && !(emailCodeCallback && onEmailCodeError)) { + throw new Error('`email` present without `emailCodeCallback` and `onEmailCodeError`'); + } + + const pwd = await client.invoke(new Api.account.GetPassword()); + + if (!(pwd.newAlgo instanceof Api.PasswordKdfAlgoUnknown)) { + pwd.newAlgo.salt1 = Buffer.concat([pwd.newAlgo.salt1, generateRandomBytes(32)]); + } + if (!pwd.hasPassword && currentPassword) { + currentPassword = undefined; + } + + const password = currentPassword ? await computeCheck(pwd, currentPassword!) : new Api.InputCheckPasswordEmpty(); + + if (isCheckPassword) { + await client.invoke(new Api.auth.CheckPassword({ password })); + return; + } + + try { + await client.invoke(new Api.account.UpdatePasswordSettings({ + password: password, + newSettings: new Api.account.PasswordInputSettings({ + newAlgo: pwd.newAlgo, + newPasswordHash: newPassword ? await computeDigest(pwd.newAlgo, newPassword) : Buffer.alloc(0), + hint, + email, + // not explained what it does and it seems to always be set to empty in tdesktop + newSecureSettings: undefined, + }), + })); + } catch (e) { + if (e instanceof errors.EmailUnconfirmedError) { + while (1) { + try { + const code = await emailCodeCallback!(e.codeLength); + + if (!code) { + throw new Error('Code is empty'); + } + + await client.invoke(new Api.account.ConfirmPasswordEmail({ code })); + break; + } catch (err) { + onEmailCodeError!(err); + } + } + } else { + throw e; + } + } +} diff --git a/src/lib/gramjs/client/TelegramClient.d.ts b/src/lib/gramjs/client/TelegramClient.d.ts new file mode 100644 index 000000000..ef9726852 --- /dev/null +++ b/src/lib/gramjs/client/TelegramClient.d.ts @@ -0,0 +1,25 @@ +import { Api } from '..'; + +import { BotAuthParams, UserAuthParams } from './auth'; +import { uploadFile, UploadFileParams } from './uploadFile'; +import { downloadFile, DownloadFileParams } from './downloadFile'; +import { updateTwoFaSettings, TwoFaParams } from './2fa'; + +declare class TelegramClient { + constructor(...args: any) + + async start(authParams: UserAuthParams | BotAuthParams); + + async invoke(request: R): Promise; + + async uploadFile(uploadParams: UploadFileParams): ReturnType; + + async downloadFile(uploadParams: DownloadFileParams): ReturnType; + + async updateTwoFaSettings(Params: TwoFaParams): ReturnType; + + // Untyped methods. + [prop: string]: any; +} + +export default TelegramClient; diff --git a/src/lib/gramjs/client/TelegramClient.js b/src/lib/gramjs/client/TelegramClient.js new file mode 100644 index 000000000..6fa0d8bf8 --- /dev/null +++ b/src/lib/gramjs/client/TelegramClient.js @@ -0,0 +1,960 @@ +const Logger = require('../extensions/Logger') +const { sleep } = require('../Helpers') +const errors = require('../errors') +const MemorySession = require('../sessions/Memory') +const Helpers = require('../Helpers') +const { BinaryWriter } = require('../extensions') +const utils = require('../Utils') +const Session = require('../sessions/Abstract') +const os = require('os') +const { LAYER } = require('../tl/AllTLObjects') +const { constructors, requests } = require('../tl') +const MTProtoSender = require('../network/MTProtoSender') +const { UpdateConnectionState } = require("../network") +const { ConnectionTCPObfuscated } = require('../network/connection/TCPObfuscated') +const { authFlow, checkAuthorization } = require('./auth') +const { downloadFile } = require('./downloadFile') +const { uploadFile } = require('./uploadFile') +const { updateTwoFaSettings } = require('./2fa') + +const DEFAULT_DC_ID = 2 +const DEFAULT_IPV4_IP = 'venus.web.telegram.org' +const DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]' + +// All types +const sizeTypes = ['w', 'y', 'd', 'x', 'c', 'm', 'b', 'a', 's'] + + +class TelegramClient { + static DEFAULT_OPTIONS = { + connection: ConnectionTCPObfuscated, + useIPV6: false, + proxy: null, + timeout: 10, + requestRetries: 5, + connectionRetries: Infinity, + retryDelay: 1000, + autoReconnect: true, + sequentialUpdates: false, + floodSleepLimit: 60, + deviceModel: null, + systemVersion: null, + appVersion: null, + langCode: 'en', + systemLangCode: 'en', + baseLogger: 'gramjs', + useWSS: false, + additionalDcsDisabled: false, + } + + /** + * + * @param session {StringSession|LocalStorageSession} + * @param apiId + * @param apiHash + * @param opts + */ + constructor(session, apiId, apiHash, opts = TelegramClient.DEFAULT_OPTIONS) { + if (apiId === undefined || apiHash === undefined) { + throw Error('Your API ID or Hash are invalid. Please read "Requirements" on README.md') + } + const args = { ...TelegramClient.DEFAULT_OPTIONS, ...opts } + this.apiId = apiId + this.apiHash = apiHash + this._useIPV6 = args.useIPV6 + // this._entityCache = new Set() + if (typeof args.baseLogger == 'string') { + this._log = new Logger() + } else { + this._log = args.baseLogger + } + // Determine what session we will use + if (typeof session === 'string' || !session) { + try { + throw new Error('not implemented') + } catch (e) { + session = new MemorySession() + } + } else if (!(session instanceof Session)) { + throw new Error('The given session must be str or a session instance') + } + + this.floodSleepLimit = args.floodSleepLimit + this._eventBuilders = [] + + this._phoneCodeHash = {} + this.session = session + // this._entityCache = EntityCache(); + this.apiId = parseInt(apiId) + this.apiHash = apiHash + + this._requestRetries = args.requestRetries + this._connectionRetries = args.connectionRetries + this._retryDelay = args.retryDelay || 0 + if (args.proxy) { + this._log.warn('proxies are not supported') + } + this._proxy = args.proxy + this._timeout = args.timeout + this._autoReconnect = args.autoReconnect + + this._connection = args.connection + // TODO add proxy support + + this._floodWaitedRequests = {} + + this._initWith = (x) => { + return new requests.InvokeWithLayer({ + layer: LAYER, + query: new requests.InitConnection({ + apiId: this.apiId, + deviceModel: args.deviceModel || os.type() + .toString() || 'Unknown', + systemVersion: args.systemVersion || os.release() + .toString() || '1.0', + appVersion: args.appVersion || '1.0', + langCode: args.langCode, + langPack: '', // this should be left empty. + systemLangCode: args.systemLangCode, + query: x, + proxy: null, // no proxies yet. + }), + }) + } + + this._args = args + // These will be set later + this._config = null + this.phoneCodeHashes = [] + this._borrowedSenderPromises = {} + this._additionalDcsDisabled = args.additionalDcsDisabled; + } + + + // region Connecting + + /** + * Connects to the Telegram servers, executing authentication if required. + * Note that authenticating to the Telegram servers is not the same as authenticating + * the app, which requires to send a code first. + * @returns {Promise} + */ + async connect() { + await this._initSession() + + this._sender = new MTProtoSender(this.session.getAuthKey(), { + logger: this._log, + dcId: this.session.dcId, + retries: this._connectionRetries, + delay: this._retryDelay, + autoReconnect: this._autoReconnect, + connectTimeout: this._timeout, + authKeyCallback: this._authKeyCallback.bind(this), + updateCallback: this._handleUpdate.bind(this), + isMainSender: true, + }) + + const connection = new this._connection( + this.session.serverAddress, this.session.port, this.session.dcId, this._log + ) + + await this._sender.connect(connection) + + this.session.setAuthKey(this._sender.authKey) + await this._sender.send(this._initWith( + new requests.help.GetConfig({}), + )) + + this._updateLoop() + } + + async _initSession() { + await this.session.load() + + if (!this.session.serverAddress || (this.session.serverAddress.includes(':') !== this._useIPV6)) { + this.session.setDC(DEFAULT_DC_ID, this._useIPV6 ? DEFAULT_IPV6_IP : DEFAULT_IPV4_IP, this._args.useWSS ? 443 : 80) + } + } + + async _updateLoop() { + while (this.isConnected()) { + await Helpers.sleep(3 * 1000) + + try { + await attempts(() => { + return timeout(this._sender.send(new requests.Ping({ + pingId: Helpers.getRandomInt(Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) + })), 1500) + }, 3, 100) + } catch (err) { + await this.disconnect() + this.connect() + + return + } + + // We need to send some content-related request at least hourly + // for Telegram to keep delivering updates, otherwise they will + // just stop even if we're connected. Do so every 30 minutes. + + // TODO Call getDifference instead since it's more relevant + if (new Date().getTime() - this._lastRequest > 30 * 60 * 1000) { + try { + await this.invoke(new requests.updates.GetState()) + } catch (e) { + + } + } + } + } + + /** + * Disconnects from the Telegram server + * @returns {Promise} + */ + async disconnect() { + if (this._sender) { + await this._sender.disconnect() + } + + await Promise.all( + Object.values(this._borrowedSenderPromises).map((promise) => { + return promise.then((sender) => { + if (sender) { + return sender.disconnect() + } + }) + }) + ) + + this._borrowedSenderPromises = {} + } + + /** + * Disconnects all senders and removes all handlers + * @returns {Promise} + */ + async destroy() { + await this.disconnect() + this.session.delete() + this._eventBuilders = [] + } + + async _switchDC(newDc) { + this._log.info(`Reconnecting to new data center ${newDc}`) + const DC = utils.getDC(newDc) + this.session.setDC(newDc, DC.ipAddress, DC.port) + // authKey's are associated with a server, which has now changed + // so it's not valid anymore. Set to None to force recreating it. + await this._sender.authKey.setKey(null) + this.session.setAuthKey(null) + await this.disconnect() + return this.connect() + } + + async _authKeyCallback(authKey, dcId) { + this.session.setAuthKey(authKey, dcId) + } + + // endregion + // export region + + _cleanupBorrowedSender(dcId) { + delete this._borrowedSenderPromises[dcId] + } + + async _borrowExportedSender(dcId) { + if (this._additionalDcsDisabled) { + return undefined + } + + let senderPromise = this._borrowedSenderPromises[dcId] + if (!senderPromise) { + senderPromise = this._createExportedSender(dcId) + this._borrowedSenderPromises[dcId] = senderPromise + + senderPromise.then((sender) => { + if (!sender) { + delete this._borrowedSenderPromises[dcId] + } + }); + } + return senderPromise + } + + async _createExportedSender(dcId) { + const dc = utils.getDC(dcId) + const sender = new MTProtoSender(this.session.getAuthKey(dcId), + { + logger: this._log, + dcId: dcId, + retries: this._connectionRetries, + delay: this._retryDelay, + autoReconnect: this._autoReconnect, + connectTimeout: this._timeout, + authKeyCallback: this._authKeyCallback.bind(this), + isMainSender: dcId === this.session.dcId, + onConnectionBreak: this._cleanupBorrowedSender.bind(this), + }) + for (let i = 0; i < 5; i++) { + try { + await sender.connect(new this._connection( + dc.ipAddress, + dc.port, + dcId, + this._log, + )) + if (this.session.dcId !== dcId) { + this._log.info(`Exporting authorization for data center ${dc.ipAddress}`) + const auth = await this.invoke(new requests.auth.ExportAuthorization({ dcId: dcId })) + const req = this._initWith(new requests.auth.ImportAuthorization({ + id: auth.id, + bytes: auth.bytes, + }, + )) + await sender.send(req) + } + sender.dcId = dcId + return sender + } catch (e) { + await sender.disconnect() + } + } + return null + } + + // end region + + // download region + + /** + * Complete flow to download a file. + * @param inputLocation {constructors.InputFileLocation} + * @param [args[partSizeKb] {number}] + * @param [args[fileSize] {number}] + * @param [args[progressCallback] {Function}] + * @param [args[start] {number}] + * @param [args[end] {number}] + * @param [args[dcId] {number}] + * @param [args[workers] {number}] + * @returns {Promise} + */ + async downloadFile(inputLocation, args = {}) { + return downloadFile(this, inputLocation, args) + } + + async downloadMedia(messageOrMedia, args) { + let date + let media + if (messageOrMedia instanceof constructors.Message) { + date = messageOrMedia.date + media = messageOrMedia.media + } else { + date = new Date().getTime() + media = messageOrMedia + } + if (typeof media == 'string') { + throw new Error('not implemented') + } + + if (media instanceof constructors.MessageMediaWebPage) { + if (media.webpage instanceof constructors.WebPage) { + media = media.webpage.document || media.webpage.photo + } + } + if (media instanceof constructors.MessageMediaPhoto || media instanceof constructors.Photo) { + return this._downloadPhoto(media, args) + } else if (media instanceof constructors.MessageMediaDocument || media instanceof constructors.Document) { + return this._downloadDocument(media, args) + } else if (media instanceof constructors.MessageMediaContact) { + return this._downloadContact(media, args) + } else if (media instanceof constructors.WebDocument || media instanceof constructors.WebDocumentNoProxy) { + return this._downloadWebDocument(media, args) + } + } + + async downloadProfilePhoto(entity, isBig = false) { + // ('User', 'Chat', 'UserFull', 'ChatFull') + const ENTITIES = [0x2da17977, 0xc5af5d94, 0x1f4661b9, 0xd49a2697] + // ('InputPeer', 'InputUser', 'InputChannel') + // const INPUTS = [0xc91c90b6, 0xe669bf46, 0x40f202fd] + // Todo account for input methods + const sizeType = isBig ? 'x' : 'm' + let photo + if (!(ENTITIES.includes(entity.SUBCLASS_OF_ID))) { + photo = entity + } else { + if (!entity.photo) { + // Special case: may be a ChatFull with photo:Photo + if (!entity.chatPhoto) { + return null + } + + return this._downloadPhoto( + entity.chatPhoto, { sizeType }, + ) + } + photo = entity.photo + } + + let dcId + let loc + if (photo instanceof constructors.UserProfilePhoto || photo instanceof constructors.ChatPhoto) { + dcId = photo.dcId + const size = isBig ? photo.photoBig : photo.photoSmall + loc = new constructors.InputPeerPhotoFileLocation({ + peer: utils.getInputPeer(entity), + localId: size.localId, + volumeId: size.volumeId, + big: isBig, + }) + } else { + // It doesn't make any sense to check if `photo` can be used + // as input location, because then this method would be able + // to "download the profile photo of a message", i.e. its + // media which should be done with `download_media` instead. + return null + } + try { + return this.downloadFile(loc, { + dcId: dcId, + }) + } catch (e) { + // TODO this should never raise + throw e; + /*if (e.message === 'LOCATION_INVALID') { + const ie = await this.getInputEntity(entity) + if (ie instanceof constructors.InputPeerChannel) { + const full = await this.invoke(new requests.channels.GetFullChannel({ + channel: ie, + })) + return this._downloadPhoto(full.fullChat.chatPhoto, { sizeType }) + } else { + return null + } + } else { + throw e + }*/ + } + } + + async downloadStickerSetThumb(stickerSet) { + if (!stickerSet.thumb || !stickerSet.thumb.location) { + return undefined + } + + const { location } = stickerSet.thumb + + return this.downloadFile( + new constructors.InputStickerSetThumb({ + stickerset: new constructors.InputStickerSetID({ + id: stickerSet.id, + accessHash: stickerSet.accessHash + }), + localId: location.localId, + volumeId: location.volumeId, + }), + { dcId: stickerSet.thumbDcId } + ) + } + + _pickFileSize(sizes, sizeType) { + if (!sizeType || !sizes || !sizes.length) { + return null + } + const indexOfSize = sizeTypes.indexOf(sizeType) + let size + for (let i = indexOfSize; i < sizeTypes.length; i++) { + size = sizes.find((s) => s.type === sizeTypes[i]) + if (size) { + return size + } + } + return null + } + + + _downloadCachedPhotoSize(size) { + // No need to download anything, simply write the bytes + let data + if (size instanceof constructors.PhotoStrippedSize) { + data = utils.strippedPhotoToJpg(size.bytes) + } else { + data = size.bytes + } + return data + } + + async _downloadPhoto(photo, args) { + if (photo instanceof constructors.MessageMediaPhoto) { + photo = photo.photo + } + if (!(photo instanceof constructors.Photo)) { + return + } + const size = this._pickFileSize(photo.sizes, args.sizeType) + if (!size || (size instanceof constructors.PhotoSizeEmpty)) { + return + } + + if (size instanceof constructors.PhotoCachedSize || size instanceof constructors.PhotoStrippedSize) { + return this._downloadCachedPhotoSize(size) + } + return this.downloadFile( + new constructors.InputPhotoFileLocation({ + id: photo.id, + accessHash: photo.accessHash, + fileReference: photo.fileReference, + thumbSize: size.type, + }), + { + dcId: photo.dcId, + fileSize: size.size, + progressCallback: args.progressCallback, + }, + ) + } + + async _downloadDocument(doc, args) { + if (doc instanceof constructors.MessageMediaDocument) { + doc = doc.document + } + if (!(doc instanceof constructors.Document)) { + return + } + + let size = null + if (args.sizeType) { + size = doc.thumbs ? this._pickFileSize(doc.thumbs, args.sizeType) : null + if (!size && doc.mimeType.startsWith('video/')) { + return + } + + if (size && (size instanceof constructors.PhotoCachedSize || size instanceof constructors.PhotoStrippedSize)) { + return this._downloadCachedPhotoSize(size) + } + } + + return this.downloadFile( + new constructors.InputDocumentFileLocation({ + id: doc.id, + accessHash: doc.accessHash, + fileReference: doc.fileReference, + thumbSize: size ? size.type : '', + }), + { + fileSize: size ? size.size : doc.size, + progressCallback: args.progressCallback, + start: args.start, + end: args.end, + dcId: doc.dcId, + workers: args.workers, + }, + ) + } + + _downloadContact(media, args) { + throw new Error('not implemented') + } + + _downloadWebDocument(media, args) { + throw new Error('not implemented') + } + + // region Invoking Telegram request + /** + * Invokes a MTProtoRequest (sends and receives it) and returns its result + * @param request + * @returns {Promise} + */ + async invoke(request) { + if (request.classType !== 'request') { + throw new Error('You can only invoke MTProtoRequests') + } + // This causes issues for now because not enough utils + // await request.resolve(this, utils) + + + this._lastRequest = new Date().getTime() + let attempt = 0 + for (attempt = 0; attempt < this._requestRetries; attempt++) { + try { + const promise = this._sender.send(request) + const result = await promise + //this.session.processEntities(result) + // this._entityCache.add(result) + return result + } catch (e) { + if (e instanceof errors.ServerError || e.message === 'RPC_CALL_FAIL' || + e.message === 'RPC_MCGET_FAIL') { + this._log.warn(`Telegram is having internal issues ${e.constructor.name}`) + await sleep(2000) + } else if (e instanceof errors.FloodWaitError || e instanceof errors.FloodTestPhoneWaitError) { + if (e.seconds <= this.floodSleepLimit) { + this._log.info(`Sleeping for ${e.seconds}s on flood wait`) + await sleep(e.seconds * 1000) + } else { + throw e + } + } else if (e instanceof errors.PhoneMigrateError || e instanceof errors.NetworkMigrateError || + e instanceof errors.UserMigrateError) { + this._log.info(`Phone migrated to ${e.newDc}`) + const shouldRaise = e instanceof errors.PhoneMigrateError || e instanceof errors.NetworkMigrateError + if (shouldRaise && await checkAuthorization(this)) { + throw e + } + await this._switchDC(e.newDc) + } else { + throw e + } + } + } + throw new Error(`Request was unsuccessful ${attempt} time(s)`) + } + + async getMe() { + try { + return (await this.invoke(new requests.users + .GetUsers({ id: [new constructors.InputUserSelf()] })))[0] + } catch (e) { + } + } + + async start(authParams) { + if (!this.isConnected()) { + await this.connect() + } + + if (await checkAuthorization(this)) { + return + } + + const apiCredentials = { + apiId: this.apiId, + apiHash: this.apiHash + } + + await authFlow(this, apiCredentials, authParams) + } + + uploadFile(fileParams) { + return uploadFile(this, fileParams) + } + + updateTwoFaSettings(params) { + return updateTwoFaSettings(this, params); + } + + // event region + addEventHandler(callback, event) { + this._eventBuilders.push([event, callback]) + } + + _handleUpdate(update) { + //this.session.processEntities(update) + // this._entityCache.add(update) + + if (update instanceof constructors.Updates || update instanceof constructors.UpdatesCombined) { + // TODO deal with entities + const entities = [] + for (const x of [...update.users, ...update.chats]) { + entities.push(x) + } + for (const u of update.updates) { + this._processUpdate(u, update.updates, entities) + } + } else if (update instanceof constructors.UpdateShort) { + this._processUpdate(update.update, null) + } else { + this._processUpdate(update, null) + } + // TODO add caching + // this._stateCache.update(update) + } + + _processUpdate(update, others, entities) { + update._entities = entities || [] + const args = { + update: update, + others: others, + } + this._dispatchUpdate(args) + } + + + // endregion + + // region private methods + + /** + Gets a full entity from the given string, which may be a phone or + a username, and processes all the found entities on the session. + The string may also be a user link, or a channel/chat invite link. + + This method has the side effect of adding the found users to the + session database, so it can be queried later without API calls, + if this option is enabled on the session. + + Returns the found entity, or raises TypeError if not found. + * @param string {string} + * @returns {Promise} + * @private + */ + /*CONTEST + async _getEntityFromString(string) { + const phone = utils.parsePhone(string) + if (phone) { + try { + for (const user of (await this.invoke( + new requests.contacts.GetContacts(0))).users) { + if (user.phone === phone) { + return user + } + } + } catch (e) { + if (e.message === 'BOT_METHOD_INVALID') { + throw new Error('Cannot get entity by phone number as a ' + + 'bot (try using integer IDs, not strings)') + } + throw e + } + } else if (['me', 'this'].includes(string.toLowerCase())) { + return this.getMe() + } else { + const { username, isJoinChat } = utils.parseUsername(string) + if (isJoinChat) { + const invite = await this.invoke(new requests.messages.CheckChatInvite({ + 'hash': username, + })) + if (invite instanceof constructors.ChatInvite) { + throw new Error('Cannot get entity from a channel (or group) ' + + 'that you are not part of. Join the group and retry', + ) + } else if (invite instanceof constructors.ChatInviteAlready) { + return invite.chat + } + } else if (username) { + try { + const result = await this.invoke( + new requests.contacts.ResolveUsername(username)) + const pid = utils.getPeerId(result.peer, false) + if (result.peer instanceof constructors.PeerUser) { + for (const x of result.users) { + if (x.id === pid) { + return x + } + } + } else { + for (const x of result.chats) { + if (x.id === pid) { + return x + } + } + } + } catch (e) { + if (e.message === 'USERNAME_NOT_OCCUPIED') { + throw new Error(`No user has "${username}" as username`) + } + throw e + } + } + } + throw new Error(`Cannot find any entity corresponding to "${string}"`) + } + */ + // endregion + + + // users region + /** + Turns the given entity into its input entity version. + + Most requests use this kind of :tl:`InputPeer`, so this is the most + suitable call to make for those cases. **Generally you should let the + library do its job** and don't worry about getting the input entity + first, but if you're going to use an entity often, consider making the + call: + + Arguments + entity (`str` | `int` | :tl:`Peer` | :tl:`InputPeer`): + If a username or invite link is given, **the library will + use the cache**. This means that it's possible to be using + a username that *changed* or an old invite link (this only + happens if an invite link for a small group chat is used + after it was upgraded to a mega-group). + + If the username or ID from the invite link is not found in + the cache, it will be fetched. The same rules apply to phone + numbers (``'+34 123456789'``) from people in your contact list. + + If an exact name is given, it must be in the cache too. This + is not reliable as different people can share the same name + and which entity is returned is arbitrary, and should be used + only for quick tests. + + If a positive integer ID is given, the entity will be searched + in cached users, chats or channels, without making any call. + + If a negative integer ID is given, the entity will be searched + exactly as either a chat (prefixed with ``-``) or as a channel + (prefixed with ``-100``). + + If a :tl:`Peer` is given, it will be searched exactly in the + cache as either a user, chat or channel. + + If the given object can be turned into an input entity directly, + said operation will be done. + + Unsupported types will raise ``TypeError``. + + If the entity can't be found, ``ValueError`` will be raised. + + Returns + :tl:`InputPeerUser`, :tl:`InputPeerChat` or :tl:`InputPeerChannel` + or :tl:`InputPeerSelf` if the parameter is ``'me'`` or ``'self'``. + + If you need to get the ID of yourself, you should use + `get_me` with ``input_peer=True``) instead. + + Example + .. code-block:: python + + // If you're going to use "username" often in your code + // (make a lot of calls), consider getting its input entity + // once, and then using the "user" everywhere instead. + user = await client.get_input_entity('username') + + // The same applies to IDs, chats or channels. + chat = await client.get_input_entity(-123456789) + + * @param peer + * @returns {Promise<>} + */ + /*CONTEST + async getInputEntity(peer) { + // Short-circuit if the input parameter directly maps to an InputPeer + try { + return utils.getInputPeer(peer) + // eslint-disable-next-line no-empty + } catch (e) { + } + // Next in priority is having a peer (or its ID) cached in-memory + try { + // 0x2d45687 == crc32(b'Peer') + if (typeof peer === 'number' || peer.SUBCLASS_OF_ID === 0x2d45687) { + if (this._entityCache.has(peer)) { + return this._entityCache[peer] + } + } + // eslint-disable-next-line no-empty + } catch (e) { + } + // Then come known strings that take precedence + if (['me', 'this'].includes(peer)) { + return new constructors.InputPeerSelf() + } + // No InputPeer, cached peer, or known string. Fetch from disk cache + try { + return this.session.getInputEntity(peer) + // eslint-disable-next-line no-empty + } catch (e) { + } + // Only network left to try + if (typeof peer === 'string') { + return utils.getInputPeer(await this._getEntityFromString(peer)) + } + // If we're a bot and the user has messaged us privately users.getUsers + // will work with accessHash = 0. Similar for channels.getChannels. + // If we're not a bot but the user is in our contacts, it seems to work + // regardless. These are the only two special-cased requests. + peer = utils.getPeer(peer) + if (peer instanceof constructors.PeerUser) { + const users = await this.invoke(new requests.users.GetUsers({ + id: [new constructors.InputUser({ + userId: peer.userId, + accessHash: 0, + })], + })) + if (users && !(users[0] instanceof constructors.UserEmpty)) { + // If the user passed a valid ID they expect to work for + // channels but would be valid for users, we get UserEmpty. + // Avoid returning the invalid empty input peer for that. + // + // We *could* try to guess if it's a channel first, and if + // it's not, work as a chat and try to validate it through + // another request, but that becomes too much work. + return utils.getInputPeer(users[0]) + } + } else if (peer instanceof constructors.PeerChat) { + return new constructors.InputPeerChat({ + chatId: peer.chatId, + }) + } else if (peer instanceof constructors.PeerChannel) { + try { + const channels = await this.invoke(new requests.channels.GetChannels({ + id: [new constructors.InputChannel({ + channelId: peer.channelId, + accessHash: 0, + })], + })) + + return utils.getInputPeer(channels.chats[0]) + // eslint-disable-next-line no-empty + } catch (e) { + console.log(e) + } + } + throw new Error(`Could not find the input entity for ${peer.id || peer.channelId || peer.chatId || peer.userId}. + Please read https://` + + 'docs.telethon.dev/en/latest/concepts/entities.html to' + + ' find out more details.', + ) + } + */ + async _dispatchUpdate(args = { + update: null, + others: null, + channelId: null, + ptsDate: null, + }) { + for (const [builder, callback] of this._eventBuilders) { + const event = builder.build(args.update) + if (event) { + await callback(event) + } + } + } + + isConnected() { + if (this._sender) { + if (this._sender.isConnected()) { + return true + } + } + return false + } +} + +async function timeout(promise, ms) { + return Promise.race([ + promise, + Helpers.sleep(ms).then(() => Promise.reject(new Error('TIMEOUT'))), + ]) +} + +async function attempts(cb, times, pause) { + for (let i = 0; i < times; i++) { + try { + // We need to `return await` here so it can be caught locally + return await cb() + } catch (err) { + if (i === times - 1) { + throw err + } + + await Helpers.sleep(pause) + } + } +} + +module.exports = TelegramClient diff --git a/src/lib/gramjs/client/auth.ts b/src/lib/gramjs/client/auth.ts new file mode 100644 index 000000000..f2455d6da --- /dev/null +++ b/src/lib/gramjs/client/auth.ts @@ -0,0 +1,324 @@ +import { default as Api } from '../tl/api'; +import TelegramClient from './TelegramClient'; +import utils from '../Utils'; +import { sleep } from '../Helpers'; +import { computeCheck as computePasswordSrpCheck } from '../Password'; + +export interface UserAuthParams { + phoneNumber: string | (() => Promise); + phoneCode: (isCodeViaApp?: boolean) => Promise; + password: (hint?: string) => Promise; + firstAndLastNames: () => Promise<[string, string?]>; + qrCode: (qrCode: { token: Buffer, expires: number }) => Promise; + onError: (err: Error) => void; + forceSMS?: boolean; +} + +export interface BotAuthParams { + botAuthToken: string; +} + +interface ApiCredentials { + apiId: number, + apiHash: string, +} + +const QR_CODE_TIMEOUT = 30000; + +export async function authFlow( + client: TelegramClient, + apiCredentials: ApiCredentials, + authParams: UserAuthParams | BotAuthParams, +) { + const me = 'phoneNumber' in authParams + ? await signInUser(client, apiCredentials, authParams) + : await signInBot(client, apiCredentials, authParams); + + // TODO @logger + client._log.info('Signed in successfully as', utils.getDisplayName(me)); +} + + +export async function checkAuthorization(client: TelegramClient) { + try { + await client.invoke(new Api.updates.GetState()); + return true; + } catch (e) { + return false; + } +} + +async function signInUser( + client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams, +): Promise { + let phoneNumber; + let phoneCodeHash; + let isCodeViaApp = false; + + while (1) { + try { + if (typeof authParams.phoneNumber === 'function') { + try { + phoneNumber = await authParams.phoneNumber(); + } catch (err) { + if (err.message === 'RESTART_AUTH_WITH_QR') { + return signInUserWithQrCode(client, apiCredentials, authParams); + } + + throw err; + } + } else { + phoneNumber = authParams.phoneNumber; + } + const sendCodeResult = await sendCode(client, apiCredentials, phoneNumber, authParams.forceSMS); + phoneCodeHash = sendCodeResult.phoneCodeHash; + isCodeViaApp = sendCodeResult.isCodeViaApp; + + if (typeof phoneCodeHash !== 'string') { + throw new Error('Failed to retrieve phone code hash'); + } + + break; + } catch (err) { + if (typeof authParams.phoneNumber !== 'function') { + throw err; + } + + authParams.onError(err); + } + } + + let phoneCode; + let isRegistrationRequired = false; + let termsOfService; + + while (1) { + try { + try { + phoneCode = await authParams.phoneCode(isCodeViaApp); + } catch (err) { + // This is the support for changing phone number from the phone code screen. + if (err.message === 'RESTART_AUTH') { + return signInUser(client, apiCredentials, authParams); + } + } + + if (!phoneCode) { + throw new Error('Code is empty'); + } + + // May raise PhoneCodeEmptyError, PhoneCodeExpiredError, + // PhoneCodeHashEmptyError or PhoneCodeInvalidError. + const result = await client.invoke(new Api.auth.SignIn({ + phoneNumber, + phoneCodeHash, + phoneCode, + })); + + if (result instanceof Api.auth.AuthorizationSignUpRequired) { + isRegistrationRequired = true; + termsOfService = result.termsOfService; + break; + } + + return result.user; + } catch (err) { + if (err.message === 'SESSION_PASSWORD_NEEDED') { + return signInWithPassword(client, apiCredentials, authParams); + } else { + authParams.onError(err); + } + } + } + + if (isRegistrationRequired) { + while (1) { + try { + const [firstName, lastName] = await authParams.firstAndLastNames(); + if (!firstName) { + throw new Error('First name is required'); + } + + const { user } = await client.invoke(new Api.auth.SignUp({ + phoneNumber, + phoneCodeHash, + firstName, + lastName, + })) as Api.auth.Authorization; + + if (termsOfService) { + // This is a violation of Telegram rules: the user should be presented with and accept TOS. + await client.invoke(new Api.help.AcceptTermsOfService({ id: termsOfService.id })); + } + + return user; + } catch (err) { + authParams.onError(err); + } + } + } + + authParams.onError(new Error('Auth failed')); + return signInUser(client, apiCredentials, authParams); +} + +async function signInUserWithQrCode( + client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams, +): Promise { + let isScanningComplete = false; + + const inputPromise = (async () => { + while (1) { + if (isScanningComplete){ + break; + } + + const result = await client.invoke(new Api.auth.ExportLoginToken({ + apiId: Number(process.env.TELEGRAM_T_API_ID), + apiHash: process.env.TELEGRAM_T_API_HASH, + exceptIds: [], + })); + if (!(result instanceof Api.auth.LoginToken)) { + throw new Error('Unexpected'); + } + + const { token, expires } = result; + + await Promise.race([ + authParams.qrCode({ token, expires }), + sleep(QR_CODE_TIMEOUT), + ]); + } + })(); + + const updatePromise = new Promise((resolve) => { + client.addEventHandler((update: Api.TypeUpdate) => { + if (update instanceof Api.UpdateLoginToken) { + resolve(); + } + }, { build: (update: object) => update }); + }); + + try { + // Either we receive an update that QR is successfully scanned, + // or we receive a rejection caused by user going back to the regular auth form + await Promise.race([updatePromise, inputPromise]); + } catch (err) { + if (err.message === 'RESTART_AUTH') { + return signInUser(client, apiCredentials, authParams); + } + + throw err; + } finally { + isScanningComplete = true; + } + + try { + const result2 = await client.invoke(new Api.auth.ExportLoginToken({ + apiId: Number(process.env.TELEGRAM_T_API_ID), + apiHash: process.env.TELEGRAM_T_API_HASH, + exceptIds: [], + })); + + if (result2 instanceof Api.auth.LoginTokenSuccess && result2.authorization instanceof Api.auth.Authorization) { + return result2.authorization.user; + } else if (result2 instanceof Api.auth.LoginTokenMigrateTo) { + await client._switchDC(result2.dcId); + const migratedResult = await client.invoke(new Api.auth.ImportLoginToken({ + token: result2.token, + })); + + if (migratedResult instanceof Api.auth.LoginTokenSuccess && migratedResult.authorization instanceof Api.auth.Authorization) { + return migratedResult.authorization.user; + } + } + } catch (err) { + if (err.message === 'SESSION_PASSWORD_NEEDED') { + return signInWithPassword(client, apiCredentials, authParams); + } + + throw err; + } + + // This is a workaround for TypeScript (never actually reached) + throw undefined; +} + +async function sendCode( + client: TelegramClient, apiCredentials: ApiCredentials, phoneNumber: string, forceSMS = false, +): Promise<{ + phoneCodeHash: string; + isCodeViaApp: boolean; +}> { + try { + const { apiId, apiHash } = apiCredentials; + const sendResult = await client.invoke(new Api.auth.SendCode({ + phoneNumber, + apiId, + apiHash, + settings: new Api.CodeSettings(), + })); + + // If we already sent a SMS, do not resend the phoneCode (hash may be empty) + if (!forceSMS || (sendResult.type instanceof Api.auth.SentCodeTypeSms)) { + return { + phoneCodeHash: sendResult.phoneCodeHash, + isCodeViaApp: sendResult.type instanceof Api.auth.SentCodeTypeApp, + }; + } + + const resendResult = await client.invoke(new Api.auth.ResendCode({ + phoneNumber, + phoneCodeHash: sendResult.phoneCodeHash, + })); + + return { + phoneCodeHash: resendResult.phoneCodeHash, + isCodeViaApp: resendResult.type instanceof Api.auth.SentCodeTypeApp, + }; + } catch (err) { + if (err.message === 'AUTH_RESTART') { + return sendCode(client, apiCredentials, phoneNumber, forceSMS); + } else { + throw err; + } + } +} + +async function signInWithPassword( + client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams, +): Promise { + while (1) { + try { + const passwordSrpResult = await client.invoke(new Api.account.GetPassword()); + const password = await authParams.password(passwordSrpResult.hint); + if (!password) { + throw new Error('Password is empty'); + } + + const passwordSrpCheck = await computePasswordSrpCheck(passwordSrpResult, password); + const { user } = await client.invoke(new Api.auth.CheckPassword({ + password: passwordSrpCheck, + })) as Api.auth.Authorization; + + return user; + } catch (err) { + authParams.onError(err); + } + } + + return undefined!; // Never reached (TypeScript fix) +} + +async function signInBot(client: TelegramClient, apiCredentials: ApiCredentials, authParams: BotAuthParams) { + const { apiId, apiHash } = apiCredentials; + const { botAuthToken } = authParams; + + const { user } = await client.invoke(new Api.auth.ImportBotAuthorization({ + apiId, + apiHash, + botAuthToken, + })) as Api.auth.Authorization; + + return user; +} diff --git a/src/lib/gramjs/client/downloadFile.ts b/src/lib/gramjs/client/downloadFile.ts new file mode 100644 index 000000000..b63951ada --- /dev/null +++ b/src/lib/gramjs/client/downloadFile.ts @@ -0,0 +1,189 @@ +import { default as Api } from '../tl/api'; +import TelegramClient from './TelegramClient'; +import { getAppropriatedPartSize } from '../Utils'; +import { sleep } from '../Helpers'; + +export interface progressCallback { + ( + progress: number, // Float between 0 and 1. + ...args: any[] + ): void; + + isCanceled?: boolean; + acceptsBuffer?: boolean; +} + +export interface DownloadFileParams { + dcId: number; + fileSize: number; + workers?: number; + partSizeKb?: number; + start?: number; + end?: number; + progressCallback?: progressCallback; +} + +interface Deferred { + promise: Promise; + resolve: (value?: any) => void; +} + +// Chunk sizes for `upload.getFile` must be multiple of the smallest size +const MIN_CHUNK_SIZE = 4096; +const DEFAULT_CHUNK_SIZE = 64; // kb +const ONE_MB = 1024 * 1024; +const REQUEST_TIMEOUT = 15000; + +export async function downloadFile( + client: TelegramClient, + inputLocation: Api.InputFileLocation, + fileParams: DownloadFileParams, +) { + let { partSizeKb, fileSize, workers = 1, end } = fileParams; + const { dcId, progressCallback, start = 0 } = fileParams; + + end = end && end < fileSize ? end : fileSize - 1; + + if (!partSizeKb) { + partSizeKb = fileSize ? getAppropriatedPartSize(fileSize) : DEFAULT_CHUNK_SIZE; + } + + const partSize = partSizeKb * 1024; + const partsCount = end ? Math.ceil((end - start) / partSize) : 1; + + if (partSize % MIN_CHUNK_SIZE !== 0) { + throw new Error(`The part size must be evenly divisible by ${MIN_CHUNK_SIZE}`); + } + + let sender: any; + if (dcId) { + try { + sender = await client._borrowExportedSender(dcId); + } catch (e) { + // This should never raise + client._log.error(e); + if (e.message === 'DC_ID_INVALID') { + // Can't export a sender for the ID we are currently in + sender = client._sender; + } else { + throw e; + } + } + } else { + sender = client._sender; + } + + client._log.info(`Downloading file in chunks of ${partSize} bytes`); + + const foreman = new Foreman(workers); + const promises: Promise[] = []; + let offset = start; + // Used for files with unknown size and for manual cancellations + let hasEnded = false; + + let progress = 0; + if (progressCallback) { + progressCallback(progress); + } + + while (true) { + let limit = partSize; + let isPrecise = false; + + if (Math.floor(offset / ONE_MB) !== Math.floor((offset + limit - 1) / ONE_MB)) { + limit = ONE_MB - offset % ONE_MB; + isPrecise = true; + } + + await foreman.requestWorker(); + + if (hasEnded) { + await foreman.releaseWorker(); + break; + } + + promises.push((async () => { + try { + const result = await Promise.race([ + await sender.send(new Api.upload.GetFile({ + location: inputLocation, + offset, + limit, + precise: isPrecise || undefined, + })), + sleep(REQUEST_TIMEOUT).then(() => Promise.reject(new Error('REQUEST_TIMEOUT'))), + ]); + + if (progressCallback) { + if (progressCallback.isCanceled) { + throw new Error('USER_CANCELED'); + } + + progress += (1 / partsCount); + progressCallback(progress); + } + + if (!end && (result.bytes.length < limit)) { + hasEnded = true; + } + + return result.bytes; + } catch (err) { + hasEnded = true; + throw err; + } finally { + foreman.releaseWorker(); + } + })()); + + offset += limit; + + if (end && (offset > end)) { + break; + } + } + + const results = await Promise.all(promises); + const buffers = results.filter(Boolean); + const totalLength = end ? (end + 1) - start : undefined; + return Buffer.concat(buffers, totalLength); +} + +class Foreman { + private deferred: Deferred | undefined; + private activeWorkers = 0; + + constructor(private maxWorkers: number) { + } + + requestWorker() { + this.activeWorkers++; + + if (this.activeWorkers > this.maxWorkers) { + this.deferred = createDeferred(); + return this.deferred.promise; + } + + return Promise.resolve(); + } + + releaseWorker() { + this.activeWorkers--; + + if (this.deferred && (this.activeWorkers <= this.maxWorkers)) { + this.deferred.resolve(); + } + } +} + +function createDeferred(): Deferred { + let resolve: Deferred['resolve']; + const promise = new Promise((_resolve) => { + resolve = _resolve; + }); + + return { + promise, + resolve: resolve!, + }; +} diff --git a/src/lib/gramjs/client/uploadFile.ts b/src/lib/gramjs/client/uploadFile.ts new file mode 100644 index 000000000..0c33c8096 --- /dev/null +++ b/src/lib/gramjs/client/uploadFile.ts @@ -0,0 +1,127 @@ +import { default as Api } from '../tl/api'; + +import TelegramClient from './TelegramClient'; +import { generateRandomBytes, readBigIntFromBuffer, sleep } from '../Helpers'; +import { getAppropriatedPartSize } from '../Utils'; + +interface OnProgress { + // Float between 0 and 1. + (progress: number): void; + + isCanceled?: boolean; +} + +export interface UploadFileParams { + file: File; + workers: number; + onProgress?: OnProgress; +} + +const KB_TO_BYTES = 1024; +const LARGE_FILE_THRESHOLD = 10 * 1024 * 1024; +const UPLOAD_TIMEOUT = 15 * 1000; + +export async function uploadFile( + client: TelegramClient, + fileParams: UploadFileParams, +): Promise { + const { file, onProgress } = fileParams; + let { workers } = fileParams; + + const { name, size } = file; + const fileId = readBigIntFromBuffer(generateRandomBytes(8), true, true); + const isLarge = size > LARGE_FILE_THRESHOLD; + + const partSize = getAppropriatedPartSize(size) * KB_TO_BYTES; + const partCount = Math.floor((size + partSize - 1) / partSize); + const buffer = Buffer.from(await fileToBuffer(file)); + + // We always upload from the DC we are in. + const sender = await client._borrowExportedSender(client.session.dcId); + + if (!workers || !size) { + workers = 1; + } + if (workers >= partCount) { + workers = partCount; + } + + let progress = 0; + if (onProgress) { + onProgress(progress); + } + + for (let i = 0; i < partCount; i += workers) { + let sendingParts = []; + let end = i + workers; + if (end > partCount) { + end = partCount; + } + + for (let j = i; j < end; j++) { + const bytes = buffer.slice(j * partSize, (j + 1) * partSize); + + sendingParts.push((async () => { + await sender.send( + isLarge + ? new Api.upload.SaveBigFilePart({ + fileId, + filePart: j, + fileTotalParts: partCount, + bytes, + }) + : new Api.upload.SaveFilePart({ + fileId, + filePart: j, + bytes, + }), + ); + + if (onProgress) { + if (onProgress.isCanceled) { + throw new Error('USER_CANCELED'); + } + + progress += (1 / partCount); + onProgress(progress); + } + })()); + + } + try { + await Promise.race([ + await Promise.all(sendingParts), + sleep(UPLOAD_TIMEOUT * workers).then(() => Promise.reject(new Error('TIMEOUT'))), + ]); + } catch (err) { + if (err.message === 'TIMEOUT') { + console.warn('Upload timeout. Retrying...'); + i -= workers; + continue; + } + + throw err; + } + } + + return isLarge + ? new Api.InputFileBig({ + id: fileId, + parts: partCount, + name, + }) + : new Api.InputFile({ + id: fileId, + parts: partCount, + name, + md5Checksum: '', // This is not a "flag", so not sure if we can make it optional. + }); +} + +function generateRandomBigInt() { + return readBigIntFromBuffer(generateRandomBytes(8), false); +} + +function fileToBuffer(file: File) { + return new Response(file).arrayBuffer(); +} diff --git a/src/lib/gramjs/crypto/AuthKey.js b/src/lib/gramjs/crypto/AuthKey.js new file mode 100644 index 000000000..316c77a48 --- /dev/null +++ b/src/lib/gramjs/crypto/AuthKey.js @@ -0,0 +1,74 @@ +const { sha1, toSignedLittleBuffer,readBufferFromBigInt, readBigIntFromBuffer } = require('../Helpers') +const BinaryReader = require('../extensions/BinaryReader') +const { sleep } = require('../Helpers') + +class AuthKey { + + constructor(value, hash) { + if (!hash || !value) { + return + } + this._key = value + this._hash = hash + const reader = new BinaryReader(hash) + this.auxHash = reader.readLong(false) + reader.read(4) + this.keyId = reader.readLong(false) + } + + async setKey(value) { + if (!value) { + this._key = this.auxHash = this.keyId = this._hash = null + return + } + if (value instanceof AuthKey) { + this._key = value._key + this.auxHash = value.auxHash + this.keyId = value.keyId + this._hash = value._hash + return + } + this._key = value + this._hash = await sha1(this._key) + const reader = new BinaryReader(this._hash) + this.auxHash = reader.readLong(false) + reader.read(4) + this.keyId = reader.readLong(false) + } + + async waitForKey() { + while (!this.keyId) { + await sleep(20) + } + } + + getKey() { + return this._key + } + + // TODO : This doesn't really fit here, it's only used in authentication + + /** + * Calculates the new nonce hash based on the current class fields' values + * @param newNonce + * @param number + * @returns {bigint} + */ + async calcNewNonceHash(newNonce, number) { + newNonce = toSignedLittleBuffer(newNonce, 32) + const n = Buffer.alloc(1) + n.writeUInt8(number, 0) + const data = Buffer.concat([newNonce, + Buffer.concat([n, readBufferFromBigInt(this.auxHash, 8, true)])]) + + // Calculates the message key from the given data + const shaData = (await sha1(data)).slice(4, 20) + return readBigIntFromBuffer(shaData, true, true) + } + + equals(other) { + return other instanceof this.constructor && this._key && other.getKey() && other.getKey().equals(this._key) + } +} + +module.exports = AuthKey diff --git a/src/lib/gramjs/crypto/CTR.js b/src/lib/gramjs/crypto/CTR.js new file mode 100644 index 000000000..be84d9f48 --- /dev/null +++ b/src/lib/gramjs/crypto/CTR.js @@ -0,0 +1,17 @@ +const crypto = require('./crypto') + +class CTR { + constructor(key, iv) { + if (!Buffer.isBuffer(key) || !Buffer.isBuffer(iv) || iv.length !== 16) { + throw new Error('Key and iv need to be a buffer') + } + + this.cipher = crypto.createCipheriv('AES-256-CTR', key, iv) + } + + encrypt(data) { + return Buffer.from(this.cipher.update(data)) + } +} + +module.exports = CTR diff --git a/src/lib/gramjs/crypto/Factorizator.js b/src/lib/gramjs/crypto/Factorizator.js new file mode 100644 index 000000000..cca5d75c7 --- /dev/null +++ b/src/lib/gramjs/crypto/Factorizator.js @@ -0,0 +1,79 @@ +const BigInt = require('big-integer') +const { modExp } = require('../Helpers') + +class Factorizator { + /** + * Calculates the greatest common divisor + * @param a {BigInteger} + * @param b {BigInteger} + * @returns {BigInteger} + */ + static gcd(a, b) { + while (b.neq(BigInt.zero)) { + let temp = b + b = a.remainder(b) + a = temp + } + return a + } + + /** + * Factorizes the given number and returns both the divisor and the number divided by the divisor + * @param pq {BigInteger} + * @returns {{p: *, q: *}} + */ + static factorize(pq) { + if (pq.remainder(2).equals(BigInt.zero)) { + return { p: BigInt(2), q: pq.divide(BigInt(2)) } + } + let y = BigInt.randBetween(BigInt(1),pq.minus(1)) + const c = BigInt.randBetween(BigInt(1),pq.minus(1)) + const m = BigInt.randBetween(BigInt(1),pq.minus(1)) + + let g = BigInt.one + let r = BigInt.one + let q = BigInt.one + let x = BigInt.zero + let ys = BigInt.zero + let k + + while (g.eq(BigInt.one)) { + x = y + for (let i = 0; BigInt(i).lesser(r); i++) { + y = (modExp(y, BigInt(2), pq)).add(c).remainder(pq) + } + k = BigInt.zero + + while (k.lesser(r) && g.eq(BigInt.one)) { + + ys = y + let condition = BigInt.min(m, r.minus(k)) + for (let i = 0; BigInt(i).lesser(condition); i++) { + y = (modExp(y, BigInt(2), pq)).add(c).remainder(pq) + q = q.multiply(x.minus(y).abs()).remainder(pq) + } + g = Factorizator.gcd(q, pq) + k = k.add(m) + } + + r = r.multiply(2) + } + + + if (g.eq(pq)) { + while (true) { + ys = (modExp(ys, BigInt(2), pq)).add(c).remainder(pq) + g = Factorizator.gcd(x.minus(ys).abs(), pq) + + if (g.greater(1)) { + break + } + } + } + const p = g + q = pq.divide(g) + return p < q ? { p: p, q: q } : { p: q, q: p } + } +} + +module.exports = Factorizator diff --git a/src/lib/gramjs/crypto/IGE.js b/src/lib/gramjs/crypto/IGE.js new file mode 100644 index 000000000..9e3cde551 --- /dev/null +++ b/src/lib/gramjs/crypto/IGE.js @@ -0,0 +1,37 @@ +const Helpers = require("../Helpers"); + +const {IGE:aes_ige} = require('@cryptography/aes'); + +class IGENEW { + constructor(key, iv) { + this.ige = new aes_ige(key,iv); + } + + /** + * Decrypts the given text in 16-bytes blocks by using the given key and 32-bytes initialization vector + * @param cipherText {Buffer} + * @returns {Buffer} + */ + decryptIge(cipherText) { + return Helpers.convertToLittle(this.ige.decrypt(cipherText)); + } + + /** + * Encrypts the given text in 16-bytes blocks by using the given key and 32-bytes initialization vector + * @param plainText {Buffer} + * @returns {Buffer} + */ + encryptIge(plainText) { + const padding = plainText.length % 16 + if (padding) { + plainText = Buffer.concat([plainText, Helpers.generateRandomBytes(16 - padding)]) + } + + return Helpers.convertToLittle(this.ige.encrypt(plainText)); + + + } + +} + +module.exports = IGENEW diff --git a/src/lib/gramjs/crypto/RSA.js b/src/lib/gramjs/crypto/RSA.js new file mode 100644 index 000000000..8b36de0bb --- /dev/null +++ b/src/lib/gramjs/crypto/RSA.js @@ -0,0 +1,57 @@ +const BigInt = require('big-integer') +const { readBigIntFromBuffer, readBufferFromBigInt, getByteArray, sha1, generateRandomBytes, modExp } = require('../Helpers') + +const PUBLIC_KEYS = [{ + 'fingerprint': [40, 85, 94, 156, 117, 240, 61, 22, 65, 244, 169, 2, 33, 107, 232, 108, 2, 43, 180, 195], + 'n': BigInt('24403446649145068056824081744112065346446136066297307473868293895086332508101251964919587745984311372853053253457835208829824428441874946556659953519213382748319518214765985662663680818277989736779506318868003755216402538945900388706898101286548187286716959100102939636333452457308619454821845196109544157601096359148241435922125602449263164512290854366930013825808102403072317738266383237191313714482187326643144603633877219028262697593882410403273959074350849923041765639673335775605842311578109726403165298875058941765362622936097839775380070572921007586266115476975819175319995527916042178582540628652481530373407'), + 'e': 65537 +}, { + 'fingerprint': [140, 171, 9, 34, 146, 246, 166, 50, 10, 170, 229, 247, 155, 114, 28, 177, 29, 106, 153, 154], + 'n': BigInt('25081407810410225030931722734886059247598515157516470397242545867550116598436968553551465554653745201634977779380884774534457386795922003815072071558370597290368737862981871277312823942822144802509055492512145589734772907225259038113414940384446493111736999668652848440655603157665903721517224934142301456312994547591626081517162758808439979745328030376796953660042629868902013177751703385501412640560275067171555763725421377065095231095517201241069856888933358280729674273422117201596511978645878544308102076746465468955910659145532699238576978901011112475698963666091510778777356966351191806495199073754705289253783'), + 'e': 65537 +}, { + 'fingerprint': [243, 218, 109, 239, 16, 202, 176, 78, 167, 8, 255, 209, 120, 234, 205, 112, 111, 42, 91, 176], + 'n': BigInt('22347337644621997830323797217583448833849627595286505527328214795712874535417149457567295215523199212899872122674023936713124024124676488204889357563104452250187725437815819680799441376434162907889288526863223004380906766451781702435861040049293189979755757428366240570457372226323943522935844086838355728767565415115131238950994049041950699006558441163206523696546297006014416576123345545601004508537089192869558480948139679182328810531942418921113328804749485349441503927570568778905918696883174575510385552845625481490900659718413892216221539684717773483326240872061786759868040623935592404144262688161923519030977'), + 'e': 65537 +}, { + 'fingerprint': [128, 80, 214, 72, 77, 244, 98, 7, 201, 250, 37, 244, 227, 51, 96, 199, 182, 37, 224, 113], + 'n': BigInt('24573455207957565047870011785254215390918912369814947541785386299516827003508659346069416840622922416779652050319196701077275060353178142796963682024347858398319926119639265555410256455471016400261630917813337515247954638555325280392998950756512879748873422896798579889820248358636937659872379948616822902110696986481638776226860777480684653756042166610633513404129518040549077551227082262066602286208338952016035637334787564972991208252928951876463555456715923743181359826124083963758009484867346318483872552977652588089928761806897223231500970500186019991032176060579816348322451864584743414550721639495547636008351'), + 'e': 65537 +}] + +const _serverKeys = {} + +PUBLIC_KEYS.forEach(({ fingerprint, ...keyInfo }) => { + _serverKeys[readBigIntFromBuffer(fingerprint.slice(-8), true, true)] = keyInfo +}) + +/** + * Encrypts the given data known the fingerprint to be used + * in the way Telegram requires us to do so (sha1(data) + data + padding) + + * @param fingerprint the fingerprint of the RSA key. + * @param data the data to be encrypted. + * @returns {Buffer|*|undefined} the cipher text, or None if no key matching this fingerprint is found. + */ +async function encrypt(fingerprint, data) { + const key = _serverKeys[fingerprint] + if (!key) { + return undefined + } + + // len(sha1.digest) is always 20, so we're left with 255 - 20 - x padding + const rand = generateRandomBytes(235 - data.length) + + const toEncrypt = Buffer.concat([await sha1(data), data, rand]) + + // rsa module rsa.encrypt adds 11 bits for padding which we don't want + // rsa module uses rsa.transform.bytes2int(to_encrypt), easier way: + const payload = readBigIntFromBuffer(toEncrypt, false) + const encrypted = modExp(payload, BigInt(key.e), key.n) + // rsa module uses transform.int2bytes(encrypted, keylength), easier: + return readBufferFromBigInt(encrypted, 256, false) +} + +module.exports = { + encrypt, +} diff --git a/src/lib/gramjs/crypto/converters.ts b/src/lib/gramjs/crypto/converters.ts new file mode 100644 index 000000000..fc56e3cee --- /dev/null +++ b/src/lib/gramjs/crypto/converters.ts @@ -0,0 +1,55 @@ +/** + * Uint32Array -> ArrayBuffer (low-endian os) + */ +export function i2abLow(buf: Uint32Array): ArrayBuffer { + const uint8 = new Uint8Array(buf.length * 4); + let i = 0; + + for (let j = 0; j < buf.length; j++) { + const int = buf[j]; + + uint8[i++] = int >>> 24; + uint8[i++] = (int >> 16) & 0xFF; + uint8[i++] = (int >> 8) & 0xFF; + uint8[i++] = int & 0xFF; + } + + return uint8.buffer; +} + +/** + * Uint32Array -> ArrayBuffer (big-endian os) + */ +export function i2abBig(buf: Uint32Array): ArrayBuffer { + return buf.buffer; +} + +/** + * ArrayBuffer -> Uint32Array (low-endian os) + */ +export function ab2iLow(ab: ArrayBuffer | SharedArrayBuffer | Uint8Array): Uint32Array { + const uint8 = new Uint8Array(ab); + const buf = new Uint32Array(uint8.length / 4); + + for (let i = 0; i < uint8.length; i += 4) { + buf[i / 4] = ( + uint8[i] << 24 + ^ uint8[i + 1] << 16 + ^ uint8[i + 2] << 8 + ^ uint8[i + 3] + ); + } + + return buf; +} + +/** + * ArrayBuffer -> Uint32Array (big-endian os) + */ +export function ab2iBig(ab: ArrayBuffer | SharedArrayBuffer | Uint8Array): Uint32Array { + return new Uint32Array(ab); +} + +export const isBigEndian = new Uint8Array(new Uint32Array([0x01020304]))[0] === 0x01; +export const i2ab = isBigEndian ? i2abBig : i2abLow; +export const ab2i = isBigEndian ? ab2iBig : ab2iLow; diff --git a/src/lib/gramjs/crypto/crypto.js b/src/lib/gramjs/crypto/crypto.js new file mode 100644 index 000000000..ebf622acf --- /dev/null +++ b/src/lib/gramjs/crypto/crypto.js @@ -0,0 +1,124 @@ +const AES = require('@cryptography/aes').default; +const { i2ab, ab2i } = require('./converters'); +const { getWords } = require('./words'); + +class Counter { + constructor(initialValue) { + this.setBytes(initialValue) + } + + setBytes(bytes) { + bytes = Buffer.from(bytes) + this._counter = bytes + } + + increment() { + for (let i = 15; i >= 0; i--) { + if (this._counter[i] === 255) { + this._counter[i] = 0 + } else { + this._counter[i]++ + break + } + } + } +} + +class CTR { + constructor(key, counter) { + + if (!(counter instanceof Counter)) { + counter = new Counter(counter) + } + + this._counter = counter + + this._remainingCounter = null + this._remainingCounterIndex = 16 + + this._aes = new AES(getWords(key)) + } + + update(plainText) { + return this.encrypt(plainText) + } + + encrypt(plainText) { + const encrypted = Buffer.from(plainText) + + for (let i = 0; i < encrypted.length; i++) { + if (this._remainingCounterIndex === 16) { + this._remainingCounter = Buffer.from(i2ab(this._aes.encrypt(ab2i(this._counter._counter)))) + this._remainingCounterIndex = 0 + this._counter.increment() + } + encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++] + } + + return encrypted + } +} + +// endregion +function createDecipheriv(algorithm, key, iv) { + if (algorithm.includes('ECB')) { + throw new Error('Not supported'); + } else { + return new CTR(key, iv) + } +} + +function createCipheriv(algorithm, key, iv) { + if (algorithm.includes('ECB')) { + throw new Error('Not supported'); + } else { + return new CTR(key, iv) + } +} + +function randomBytes(count) { + const bytes = new Uint8Array(count) + crypto.getRandomValues(bytes) + return bytes +} + +class Hash { + constructor(algorithm) { + this.algorithm = algorithm + } + + update(data) { + //We shouldn't be needing new Uint8Array but it doesn't + //work without it + this.data = new Uint8Array(data) + } + + async digest() { + if (this.algorithm === 'sha1') { + return Buffer.from(await self.crypto.subtle.digest('SHA-1', this.data)) + } else if (this.algorithm === 'sha256') { + return Buffer.from(await self.crypto.subtle.digest('SHA-256', this.data)) + } + } +} + +async function pbkdf2(password, salt, iterations) { + const passwordKey = await crypto.subtle.importKey('raw', password, + {name: 'PBKDF2'}, false, ['deriveBits']) + return Buffer.from(await crypto.subtle.deriveBits({ + name: 'PBKDF2', + hash: 'SHA-512', salt, iterations + }, passwordKey, 512)); +} + +function createHash(algorithm) { + return new Hash(algorithm) +} + +module.exports = { + createCipheriv, + createDecipheriv, + randomBytes, + createHash, + pbkdf2 +} diff --git a/src/lib/gramjs/crypto/words.ts b/src/lib/gramjs/crypto/words.ts new file mode 100644 index 000000000..c8b6bfce0 --- /dev/null +++ b/src/lib/gramjs/crypto/words.ts @@ -0,0 +1,51 @@ +/* + * Imported from https://github.com/spalt08/cryptography/blob/master/packages/aes/src/utils/words.ts + */ + +export function s2i(str: string, pos: number) { + return ( + str.charCodeAt(pos) << 24 + ^ str.charCodeAt(pos + 1) << 16 + ^ str.charCodeAt(pos + 2) << 8 + ^ str.charCodeAt(pos + 3) + ); +} + +/** + * Helper function for transforming string key to Uint32Array + */ +export function getWords(key: string | Uint8Array | Uint32Array) { + if (key instanceof Uint32Array) { + return key; + } + + if (typeof key === 'string') { + if (key.length % 4 !== 0) for (let i = key.length % 4; i <= 4; i++) key += '\0x00'; + + const buf = new Uint32Array(key.length / 4); + for (let i = 0; i < key.length; i += 4) buf[i / 4] = s2i(key, i); + + return buf; + } + + if (key instanceof Uint8Array) { + const buf = new Uint32Array(key.length / 4); + + for (let i = 0; i < key.length; i += 4) { + buf[i / 4] = ( + key[i] << 24 + ^ key[i + 1] << 16 + ^ key[i + 2] << 8 + ^ key[i + 3] + ); + } + + return buf; + } + + throw new Error('Unable to create 32-bit words'); +} + +export function xor(left: Uint32Array, right: Uint32Array, to = left) { + for (let i = 0; i < left.length; i++) to[i] = left[i] ^ right[i]; +} diff --git a/src/lib/gramjs/errors/Common.js b/src/lib/gramjs/errors/Common.js new file mode 100644 index 000000000..6e3ccac62 --- /dev/null +++ b/src/lib/gramjs/errors/Common.js @@ -0,0 +1,148 @@ +/** + * Errors not related to the Telegram API itself + */ + + +/** + * Occurs when a read operation was cancelled. + */ +class ReadCancelledError extends Error { + constructor() { + super('The read operation was cancelled.') + } +} + +/** + * Occurs when a type is not found, for example, + * when trying to read a TLObject with an invalid constructor code. + */ +class TypeNotFoundError extends Error { + constructor(invalidConstructorId, remaining) { + super(`Could not find a matching Constructor ID for the TLObject that was supposed to be + read with ID ${invalidConstructorId}. Most likely, a TLObject was trying to be read when + it should not be read. Remaining bytes: ${remaining.length}`) + if (typeof alert !== 'undefined') { + alert(`Missing MTProto Entity: Please, make sure to add TL definition for ID ${invalidConstructorId}`) + } + this.invalidConstructorId = invalidConstructorId + this.remaining = remaining + } +} + +/** + * Occurs when using the TCP full mode and the checksum of a received + * packet doesn't match the expected checksum. + */ +class InvalidChecksumError extends Error { + constructor(checksum, validChecksum) { + super(`Invalid checksum (${checksum} when ${validChecksum} was expected). This packet should be skipped.`) + this.checksum = checksum + this.validChecksum = validChecksum + } +} + +/** + * Occurs when the buffer is invalid, and may contain an HTTP error code. + * For instance, 404 means "forgotten/broken authorization key", while + */ +class InvalidBufferError extends Error { + constructor(payload) { + let code = null + if (payload.length === 4) { + code = -payload.readInt32LE(0) + super(`Invalid response buffer (HTTP code ${code})`) + } else { + super(`Invalid response buffer (too short ${payload})`) + } + this.code = code + this.payload = payload + } +} + +/** + * Generic security error, mostly used when generating a new AuthKey. + */ +class SecurityError extends Error { + constructor(...args) { + if (!args.length) { + args = ['A security check failed.'] + } + super(...args) + } +} + +/** + * Occurs when there's a hash mismatch between the decrypted CDN file + * and its expected hash. + */ +class CdnFileTamperedError extends SecurityError { + constructor() { + super('The CDN file has been altered and its download cancelled.') + } +} + +/** + * Occurs when handling a badMessageNotification + */ +class BadMessageError extends Error { + static ErrorMessages = { + 16: + 'msg_id too low (most likely, client time is wrong it would be worthwhile to ' + + 'synchronize it using msg_id notifications and re-send the original message ' + + 'with the “correct” msg_id or wrap it in a container with a new msg_id if the ' + + 'original message had waited too long on the client to be transmitted).', + + 17: + 'msg_id too high (similar to the previous case, the client time has to be ' + + 'synchronized, and the message re-sent with the correct msg_id).', + + 18: + 'Incorrect two lower order msg_id bits (the server expects client message msg_id ' + + 'to be divisible by 4).', + + 19: 'Container msg_id is the same as msg_id of a previously received message ' + '(this must never happen).', + + 20: + 'Message too old, and it cannot be verified whether the server has received a ' + + 'message with this msg_id or not.', + + 32: + 'msg_seqno too low (the server has already received a message with a lower ' + + 'msg_id but with either a higher or an equal and odd seqno).', + + 33: + 'msg_seqno too high (similarly, there is a message with a higher msg_id but with ' + + 'either a lower or an equal and odd seqno).', + + 34: 'An even msg_seqno expected (irrelevant message), but odd received.', + + 35: 'Odd msg_seqno expected (relevant message), but even received.', + + 48: + 'Incorrect server salt (in this case, the bad_server_salt response is received with ' + + 'the correct salt, and the message is to be re-sent with it).', + + 64: 'Invalid container.', + } + + constructor(request,code) { + let errorMessage = BadMessageError.ErrorMessages[code] || + `Unknown error code (this should not happen): ${code}.` + errorMessage+= ` Caused by ${request.className}` + super(errorMessage) + this.message = errorMessage + this.code = code + } +} + +// TODO : Support multi errors. + +module.exports = { + ReadCancelledError, + TypeNotFoundError, + InvalidChecksumError, + InvalidBufferError, + SecurityError, + CdnFileTamperedError, + BadMessageError, +} diff --git a/src/lib/gramjs/errors/RPCBaseErrors.js b/src/lib/gramjs/errors/RPCBaseErrors.js new file mode 100644 index 000000000..aae2ae341 --- /dev/null +++ b/src/lib/gramjs/errors/RPCBaseErrors.js @@ -0,0 +1,123 @@ +/** + * Base class for all Remote Procedure Call errors. + */ +class RPCError extends Error { + constructor(message, request, code = null) { + super( + 'RPCError {0}: {1}{2}' + .replace('{0}', code) + .replace('{1}', message) + .replace('{2}', RPCError._fmtRequest(request)) + ) + this.code = code + this.message = message + } + + static _fmtRequest(request) { + // TODO fix this + if (request) { + return ` (caused by ${request.className})` + } else { + return '' + } + } +} + +/** + * The request must be repeated, but directed to a different data center. + */ +class InvalidDCError extends RPCError { + constructor(request, message, code) { + super(message, request, code) + this.code = code || 303 + this.message = message || 'ERROR_SEE_OTHER' + } +} + +/** + * The query contains errors. In the event that a request was created + * using a form and contains user generated data, the user should be + * notified that the data must be corrected before the query is repeated. + */ +class BadRequestError extends RPCError { + code = 400 + message = 'BAD_REQUEST' +} + +/** + * There was an unauthorized attempt to use functionality available only + * to authorized users. + */ +class UnauthorizedError extends RPCError { + code = 401 + message = 'UNAUTHORIZED' +} + +/** + * Privacy violation. For example, an attempt to write a message to + * someone who has blacklisted the current user. + */ +class ForbiddenError extends RPCError { + code = 403 + message = 'FORBIDDEN' +} + +/** + * An attempt to invoke a non-existent object, such as a method. + */ +class NotFoundError extends RPCError { + code = 404 + message = 'NOT_FOUND' +} + +/** + * Errors related to invalid authorization key, like + * AUTH_KEY_DUPLICATED which can cause the connection to fail. + */ +class AuthKeyError extends RPCError { + code = 406 + message = 'AUTH_KEY' +} + +/** + * The maximum allowed number of attempts to invoke the given method + * with the given input parameters has been exceeded. For example, in an + * attempt to request a large number of text messages (SMS) for the same + * phone number. + */ +class FloodError extends RPCError { + code = 420 + message = 'FLOOD' +} + +/** + * An internal server error occurred while a request was being processed + * for example, there was a disruption while accessing a database or file + * storage + */ +class ServerError extends RPCError { + code = 500 // Also witnessed as -500 + message = 'INTERNAL' +} + +/** + * Clicking the inline buttons of bots that never (or take to long to) + * call ``answerCallbackQuery`` will result in this "special" RPCError. + */ +class TimedOutError extends RPCError { + code = 503 // Only witnessed as -503 + message = 'Timeout' +} + +module.exports = { + RPCError, + InvalidDCError, + BadRequestError, + UnauthorizedError, + ForbiddenError, + NotFoundError, + AuthKeyError, + FloodError, + ServerError, + TimedOutError, +} diff --git a/src/lib/gramjs/errors/RPCErrorList.js b/src/lib/gramjs/errors/RPCErrorList.js new file mode 100644 index 000000000..ff649ea96 --- /dev/null +++ b/src/lib/gramjs/errors/RPCErrorList.js @@ -0,0 +1,97 @@ +const { RPCError, InvalidDCError, FloodError, BadRequestError } = require('./RPCBaseErrors') + + +class UserMigrateError extends InvalidDCError { + constructor(args) { + const newDc = Number(args.capture || 0) + super(`The user whose identity is being used to execute queries is associated with DC ${newDc}` + RPCError._fmtRequest(args.request)) + this.message = `The user whose identity is being used to execute queries is associated with DC ${newDc}` + RPCError._fmtRequest(args.request) + this.newDc = newDc + } +} + + +class PhoneMigrateError extends InvalidDCError { + constructor(args) { + const newDc = Number(args.capture || 0) + super(`The phone number a user is trying to use for authorization is associated with DC ${newDc}` + RPCError._fmtRequest(args.request)) + this.message = `The phone number a user is trying to use for authorization is associated with DC ${newDc}` + RPCError._fmtRequest(args.request) + this.newDc = newDc + } +} + +class SlowModeWaitError extends FloodError { + constructor(args) { + const seconds = Number(args.capture || 0) + super(`A wait of ${seconds} seconds is required before sending another message in this chat` + RPCError._fmtRequest(args.request)) + this.message = `A wait of ${seconds} seconds is required before sending another message in this chat` + RPCError._fmtRequest(args.request) + this.seconds = seconds + } +} + +class FloodWaitError extends FloodError { + constructor(args) { + const seconds = Number(args.capture || 0) + super(`A wait of ${seconds} seconds is required` + RPCError._fmtRequest(args.request)) + this.message = `A wait of ${seconds} seconds is required` + RPCError._fmtRequest(args.request) + this.seconds = seconds + } +} + +class FloodTestPhoneWaitError extends FloodError { + constructor(args) { + const seconds = Number(args.capture || 0) + super(`A wait of ${seconds} seconds is required in the test servers` + RPCError._fmtRequest(args.request)) + this.message = `A wait of ${seconds} seconds is required in the test servers` + RPCError._fmtRequest(args.request) + this.seconds = seconds + } +} + +class FileMigrateError extends InvalidDCError { + constructor(args) { + const newDc = Number(args.capture || 0) + super(`The file to be accessed is currently stored in DC ${newDc}` + RPCError._fmtRequest(args.request)) + this.message = `The file to be accessed is currently stored in DC ${newDc}` + RPCError._fmtRequest(args.request) + this.newDc = newDc + } +} + +class NetworkMigrateError extends InvalidDCError { + constructor(args) { + const newDc = Number(args.capture || 0) + super(`The source IP address is associated with DC ${newDc}` + RPCError._fmtRequest(args.request)) + this.message = `The source IP address is associated with DC ${newDc}` + RPCError._fmtRequest(args.request) + this.newDc = newDc + } +} +class EmailUnconfirmedError extends BadRequestError { + constructor(args) { + const codeLength = Number(args.capture || 0) + super(`Email unconfirmed, the length of the code must be ${codeLength}` + RPCError._fmtRequest(args.request)) + this.message = `Email unconfirmed, the length of the code must be ${codeLength}` + RPCError._fmtRequest(args.request) + this.codeLength = codeLength + } +} + +const rpcErrorRe = [ + [/FILE_MIGRATE_(\d+)/, FileMigrateError], + [/FLOOD_TEST_PHONE_WAIT_(\d+)/, FloodTestPhoneWaitError], + [/FLOOD_WAIT_(\d+)/, FloodWaitError], + [/PHONE_MIGRATE_(\d+)/, PhoneMigrateError], + [/SLOWMODE_WAIT_(\d+)/, SlowModeWaitError], + [/USER_MIGRATE_(\d+)/, UserMigrateError], + [/NETWORK_MIGRATE_(\d+)/, NetworkMigrateError], + [/EMAIL_UNCONFIRMED_(\d+)/, EmailUnconfirmedError], + +] +module.exports = { + rpcErrorRe, + FileMigrateError, + FloodTestPhoneWaitError, + FloodWaitError, + PhoneMigrateError, + SlowModeWaitError, + UserMigrateError, + NetworkMigrateError, + EmailUnconfirmedError +} diff --git a/src/lib/gramjs/errors/index.js b/src/lib/gramjs/errors/index.js new file mode 100644 index 000000000..5459de764 --- /dev/null +++ b/src/lib/gramjs/errors/index.js @@ -0,0 +1,27 @@ +/** + * Converts a Telegram's RPC Error to a Python error. + * @param rpcError the RPCError instance + * @param request the request that caused this error + * @constructor the RPCError as a Python exception that represents this error + */ +const { RPCError } = require("./RPCBaseErrors") +const { rpcErrorRe } = require('./RPCErrorList') + +function RPCMessageToError(rpcError, request) { + for (const [msgRegex, Cls] of rpcErrorRe) { + const m = rpcError.errorMessage.match(msgRegex) + if (m) { + const capture = m.length === 2 ? parseInt(m[1]) : null + return new Cls({ request: request, capture: capture }) + } + } + + return new RPCError(rpcError.errorMessage, request) +} + +module.exports = { + RPCMessageToError, + ...require('./Common'), + ...require('./RPCBaseErrors'), + ...require('./RPCErrorList'), +} diff --git a/src/lib/gramjs/events/NewMessage.js b/src/lib/gramjs/events/NewMessage.js new file mode 100644 index 000000000..224507f88 --- /dev/null +++ b/src/lib/gramjs/events/NewMessage.js @@ -0,0 +1,94 @@ +/*CONTEST +const { EventBuilder, EventCommon } = require('./common') +const { constructors } = require('../tl') + +class NewMessage extends EventBuilder { + constructor(args = { + chats: null, + func: null, + }) { + super(args) + + this.chats = args.chats + this.func = args.func + this._noCheck = true + } + + async _resolve(client) { + await super._resolve(client) + // this.fromUsers = await _intoIdSet(client, this.fromUsers) + } + + build(update, others = null, thisId = null) { + let event + if (update instanceof constructors.UpdateNewMessage || update instanceof constructors.UpdateNewChannelMessage) { + if (!(update.message instanceof constructors.Message)) { + return + } + event = new Event(update.message) + } else if (update instanceof constructors.UpdateShortMessage) { + event = new Event(new constructors.Message({ + out: update.out, + mentioned: update.mentioned, + mediaUnread: update.mediaUnread, + silent: update.silent, + id: update.id, + // Note that to_id/from_id complement each other in private + // messages, depending on whether the message was outgoing. + toId: new constructors.PeerUser(update.out ? update.userId : thisId), + fromId: update.out ? thisId : update.userId, + message: update.message, + date: update.date, + fwdFrom: update.fwdFrom, + viaBotId: update.viaBotId, + replyToMsgId: update.replyToMsgId, + entities: update.entities, + })) + } else if (update instanceof constructors.UpdateShortChatMessage) { + event = new this.Event(new constructors.Message({ + out: update.out, + mentioned: update.mentioned, + mediaUnread: update.mediaUnread, + silent: update.silent, + id: update.id, + toId: new constructors.PeerChat(update.chatId), + fromId: update.fromId, + message: update.message, + date: update.date, + fwdFrom: update.fwdFrom, + viaBotId: update.viaBotId, + replyToMsgId: update.replyToMsgId, + entities: update.entities, + })) + } else { + return + } + + // Make messages sent to ourselves outgoing unless they're forwarded. + // This makes it consistent with official client's appearance. + const ori = event.message + if (ori.toId instanceof constructors.PeerUser) { + if (ori.fromId === ori.toId.userId && !ori.fwdFrom) { + event.message.out = true + } + } + return event + } + + filter(event) { + if (this._noCheck) { + return event + } + return event + } +} + +class Event extends EventCommon { + constructor(message) { + super() + this.message = message + } +} + +module.exports = NewMessage +*/ diff --git a/src/lib/gramjs/events/Raw.js b/src/lib/gramjs/events/Raw.js new file mode 100644 index 000000000..bf9a243ac --- /dev/null +++ b/src/lib/gramjs/events/Raw.js @@ -0,0 +1,21 @@ +const { EventBuilder } = require('./common') + +class Raw extends EventBuilder { + constructor(args = { + types: null, + func: null, + }) { + super() + if (!args.types) { + this.types = true + } else { + this.types = args.types + } + } + + build(update, others = null) { + return update + } +} + +module.exports = Raw diff --git a/src/lib/gramjs/events/common.js b/src/lib/gramjs/events/common.js new file mode 100644 index 000000000..9f18f8236 --- /dev/null +++ b/src/lib/gramjs/events/common.js @@ -0,0 +1,22 @@ +class EventBuilder { + constructor(args = { + chats: null, blacklistChats: null, func: null, + }, + ) { + this.chats = args.chats + this.blacklistChats = Boolean(args.blacklistChats) + this.resolved = false + this.func = args.func + } + + build(update, others = null) { + + } +} + +class EventCommon { + +} + + +module.exports = { EventBuilder, EventCommon } diff --git a/src/lib/gramjs/events/index.js b/src/lib/gramjs/events/index.js new file mode 100644 index 000000000..d0da5d8cf --- /dev/null +++ b/src/lib/gramjs/events/index.js @@ -0,0 +1,8 @@ +const NewMessage = require('./NewMessage') +const Raw = require('./Raw') + +class StopPropagation extends Error { + +} + +module.exports = { NewMessage, StopPropagation, Raw } diff --git a/src/lib/gramjs/extensions/AsyncQueue.js b/src/lib/gramjs/extensions/AsyncQueue.js new file mode 100644 index 000000000..a748be84e --- /dev/null +++ b/src/lib/gramjs/extensions/AsyncQueue.js @@ -0,0 +1,30 @@ +class AsyncQueue { + constructor() { + this._queue = [] + this.canGet = new Promise((resolve) => { + this.resolveGet = resolve + }) + this.canPush = true + } + + async push(value) { + await this.canPush + this._queue.push(value) + this.resolveGet(true) + this.canPush = new Promise((resolve) => { + this.resolvePush = resolve + }) + } + + async pop() { + await this.canGet + const returned = this._queue.pop() + this.resolvePush(true) + this.canGet = new Promise((resolve) => { + this.resolveGet = resolve + }) + return returned + } +} + +module.exports = AsyncQueue diff --git a/src/lib/gramjs/extensions/BinaryReader.js b/src/lib/gramjs/extensions/BinaryReader.js new file mode 100644 index 000000000..6a01a4a95 --- /dev/null +++ b/src/lib/gramjs/extensions/BinaryReader.js @@ -0,0 +1,267 @@ +const { TypeNotFoundError } = require('../errors/Common') +const { coreObjects } = require('../tl/core') +const { tlobjects } = require('../tl/AllTLObjects') +const { readBigIntFromBuffer } = require('../Helpers') + +class BinaryReader { + /** + * Small utility class to read binary data. + * @param data {Buffer} + */ + constructor(data) { + this.stream = data + this._last = null + this.offset = 0 + } + + // region Reading + + // "All numbers are written as little endian." + // https://core.telegram.org/mtproto + /** + * Reads a single byte value. + */ + readByte() { + return this.read(1)[0] + } + + /** + * Reads an integer (4 bytes or 32 bits) value. + * @param signed {Boolean} + */ + readInt(signed = true) { + let res + if (signed) { + res = this.stream.readInt32LE(this.offset) + } else { + res = this.stream.readUInt32LE(this.offset) + } + this.offset += 4 + return res + } + + /** + * Reads a long integer (8 bytes or 64 bits) value. + * @param signed + * @returns {BigInteger} + */ + readLong(signed = true) { + return this.readLargeInt(64, signed) + } + + /** + * Reads a real floating point (4 bytes) value. + * @returns {number} + */ + readFloat() { + return this.read(4).readFloatLE(0) + } + + /** + * Reads a real floating point (8 bytes) value. + * @returns {BigInteger} + */ + readDouble() { + // was this a bug ? it should have been 0) { + padding = 4 - padding + this.read(padding) + } + + return data + } + + /** + * Reads a Telegram-encoded string. + * @returns {string} + */ + tgReadString() { + return this.tgReadBytes().toString('utf-8') + } + + /** + * Reads a Telegram boolean value. + * @returns {boolean} + */ + tgReadBool() { + const value = this.readInt(false) + if (value === 0x997275b5) { + // boolTrue + return true + } else if (value === 0xbc799737) { + // boolFalse + return false + } else { + throw new Error(`Invalid boolean code ${value.toString('16')}`) + } + } + + /** + * Reads and converts Unix time (used by Telegram) + * into a Javascript {Date} object. + * @returns {Date} + */ + tgReadDate() { + const value = this.readInt() + return new Date(value * 1000) + } + + /** + * Reads a Telegram object. + */ + tgReadObject() { + const constructorId = this.readInt(false) + let clazz = tlobjects[constructorId] + if (clazz === undefined) { + /** + * The class was None, but there's still a + * chance of it being a manually parsed value like bool! + */ + const value = constructorId + if (value === 0x997275b5) { + // boolTrue + return true + } else if (value === 0xbc799737) { + // boolFalse + return false + } else if (value === 0x1cb5c415) { + // Vector + const temp = [] + const length = this.readInt() + for (let i = 0; i < length; i++) { + temp.push(this.tgReadObject()) + } + return temp + } + + clazz = coreObjects[constructorId] + + if (clazz === undefined) { + // If there was still no luck, give up + this.seek(-4) // Go back + const pos = this.tellPosition() + const error = new TypeNotFoundError(constructorId, this.read()) + this.setPosition(pos) + throw error + } + } + return clazz.fromReader(this) + } + + /** + * Reads a vector (a list) of Telegram objects. + * @returns {[Buffer]} + */ + tgReadVector() { + if (this.readInt(false) !== 0x1cb5c415) { + throw new Error('Invalid constructor code, vector was expected') + } + const count = this.readInt() + const temp = [] + for (let i = 0; i < count; i++) { + temp.push(this.tgReadObject()) + } + return temp + } + + // endregion + + /** + * Closes the reader. + */ + close() { + this.stream = null + } + + // region Position related + + /** + * Tells the current position on the stream. + * @returns {number} + */ + tellPosition() { + return this.offset + } + + /** + * Sets the current position on the stream. + * @param position + */ + setPosition(position) { + this.offset = position + } + + /** + * Seeks the stream position given an offset from the current position. + * The offset may be negative. + * @param offset + */ + seek(offset) { + this.offset += offset + } + + // endregion +} + +module.exports = BinaryReader diff --git a/src/lib/gramjs/extensions/BinaryWriter.js b/src/lib/gramjs/extensions/BinaryWriter.js new file mode 100644 index 000000000..5db899ead --- /dev/null +++ b/src/lib/gramjs/extensions/BinaryWriter.js @@ -0,0 +1,15 @@ +class BinaryWriter { + constructor(stream) { + this._stream = stream + } + + write(buffer) { + this._stream = Buffer.concat([this._stream, buffer]) + } + + getValue() { + return this._stream + } +} + +module.exports = BinaryWriter diff --git a/src/lib/gramjs/extensions/Logger.js b/src/lib/gramjs/extensions/Logger.js new file mode 100644 index 000000000..5e2c9dc82 --- /dev/null +++ b/src/lib/gramjs/extensions/Logger.js @@ -0,0 +1,105 @@ +let _level = null + +class Logger { + static levels = ['error', 'warn', 'info', 'debug'] + + constructor(level) { + if (!_level) { + _level = level || 'debug' + } + + this.isBrowser = typeof process === 'undefined' || + process.type === 'renderer' || + process.browser === true || + process.__nwjs + if (!this.isBrowser) { + this.colors = { + start: '\x1b[2m', + warn: '\x1b[35m', + info: '\x1b[33m', + debug: '\x1b[36m', + error: '\x1b[31m', + end: '\x1b[0m', + } + } else { + this.colors = { + start: '%c', + warn: 'color : #ff00ff', + info: 'color : #ffff00', + debug: 'color : #00ffff', + error: 'color : #ff0000', + end: '', + } + } + this.messageFormat = '[%t] [%l] - [%m]' + } + + /** + * + * @param level {string} + * @returns {boolean} + */ + canSend(level) { + return (Logger.levels.indexOf(_level) >= Logger.levels.indexOf(level)) + } + + /** + * @param message {string} + */ + warn(message) { + this._log('warn', message, this.colors.warn) + } + + /** + * @param message {string} + */ + info(message) { + this._log('info', message, this.colors.info) + } + + /** + * @param message {string} + */ + debug(message) { + this._log('debug', message, this.colors.debug) + } + + /** + * @param message {string} + */ + error(message) { + this._log('error', message, this.colors.error) + } + + format(message, level) { + return this.messageFormat.replace('%t', new Date().toISOString()) + .replace('%l', level.toUpperCase()) + .replace('%m', message) + } + + static setLevel(level) { + _level = level; + } + + /** + * @param level {string} + * @param message {string} + * @param color {string} + */ + _log(level, message, color) { + if (!_level){ + return + } + if (this.canSend(level)) { + if (!this.isBrowser) { + console.log(color + this.format(message, level) + this.colors.end) + } else { + console.log(this.colors.start + this.format(message, level), color) + } + } else { + + } + } +} + +module.exports = Logger diff --git a/src/lib/gramjs/extensions/MessagePacker.js b/src/lib/gramjs/extensions/MessagePacker.js new file mode 100644 index 000000000..8ef74a685 --- /dev/null +++ b/src/lib/gramjs/extensions/MessagePacker.js @@ -0,0 +1,112 @@ +const MessageContainer = require('../tl/core/MessageContainer') +const TLMessage = require('../tl/core/TLMessage') +const BinaryWriter = require('../extensions/BinaryWriter') + +class MessagePacker { + constructor(state, logger) { + this._state = state + this._queue = [] + this._pendingStates = [] + this._ready = new Promise(((resolve) => { + this.setReady = resolve + })) + this._log = logger + } + + values() { + return this._queue + } + + append(state) { + this._queue.push(state) + this.setReady(true) + + if (state) { + this._pendingStates.push(state) + state.promise + // Using finally causes triggering `unhandledrejection` event + .catch(() => {}) + .finally(() => { + this._pendingStates = this._pendingStates.filter((s) => s !== state) + }) + } + } + + extend(states) { + for (const state of states) { + this._queue.push(state) + } + this.setReady(true) + } + + async get() { + if (!this._queue.length) { + this._ready = new Promise(((resolve) => { + this.setReady = resolve + })) + await this._ready + } + if (!this._queue[this._queue.length - 1]) { + this._queue = [] + return + } + let data + let buffer = new BinaryWriter(Buffer.alloc(0)) + + const batch = [] + let size = 0 + + while (this._queue.length && batch.length <= MessageContainer.MAXIMUM_LENGTH) { + const state = this._queue.shift() + size += state.data.length + TLMessage.SIZE_OVERHEAD + if (size <= MessageContainer.MAXIMUM_SIZE) { + let afterId + if (state.after) { + afterId = state.after.msgId + } + state.msgId = await this._state.writeDataAsMessage( + buffer, state.data, state.request.classType === 'request', + afterId, + ) + this._log.debug(`Assigned msgId = ${state.msgId} to ${state.request.className || state.request.constructor.name}`) + batch.push(state) + continue + } + if (batch.length) { + this._queue.unshift(state) + break + } + this._log.warn(`Message payload for ${state.request.className || state.request.constructor.name} is too long ${state.data.length} and cannot be sent`) + state.reject('Request Payload is too big') + size = 0 + continue + } + if (!batch.length) { + return null + } + if (batch.length > 1) { + const b = Buffer.alloc(8) + b.writeUInt32LE(MessageContainer.CONSTRUCTOR_ID, 0) + b.writeInt32LE(batch.length, 4) + data = Buffer.concat([b, buffer.getValue()]) + buffer = new BinaryWriter(Buffer.alloc(0)) + const containerId = await this._state.writeDataAsMessage( + buffer, data, false, + ) + for (const s of batch) { + s.containerId = containerId + } + } + + data = buffer.getValue() + return { batch, data } + } + + rejectAll() { + this._pendingStates.forEach((requestState) => { + requestState.reject(new Error('Disconnect')) + }) + } +} + +module.exports = MessagePacker diff --git a/src/lib/gramjs/extensions/PromisedWebSockets.js b/src/lib/gramjs/extensions/PromisedWebSockets.js new file mode 100644 index 000000000..c41e7939e --- /dev/null +++ b/src/lib/gramjs/extensions/PromisedWebSockets.js @@ -0,0 +1,130 @@ +const Mutex = require('async-mutex').Mutex +const mutex = new Mutex() + +const WebSocketClient = require('websocket').w3cwebsocket + +const closeError = new Error('WebSocket was closed') + +class PromisedWebSockets { + constructor() { + /*CONTEST + this.isBrowser = typeof process === 'undefined' || + process.type === 'renderer' || + process.browser === true || + process.__nwjs + + */ + this.client = null + this.closed = true + } + + async readExactly(number) { + let readData = Buffer.alloc(0) + while (true) { + const thisTime = await this.read(number) + readData = Buffer.concat([readData, thisTime]) + number = number - thisTime.length + if (!number) { + return readData + } + } + } + + async read(number) { + if (this.closed) { + throw closeError + } + await this.canRead + if (this.closed) { + throw closeError + } + const toReturn = this.stream.slice(0, number) + this.stream = this.stream.slice(number) + if (this.stream.length === 0) { + this.canRead = new Promise((resolve) => { + this.resolveRead = resolve + }) + } + + return toReturn + } + + async readAll() { + if (this.closed || !await this.canRead) { + throw closeError + } + const toReturn = this.stream + this.stream = Buffer.alloc(0) + this.canRead = new Promise((resolve) => { + this.resolveRead = resolve + }) + + return toReturn + } + + getWebSocketLink(ip, port) { + if (port === 443) { + return `wss://${ip}:${port}/apiws` + } else { + return `ws://${ip}:${port}/apiws` + } + } + + async connect(port, ip) { + this.stream = Buffer.alloc(0) + this.canRead = new Promise((resolve) => { + this.resolveRead = resolve + }) + this.closed = false + this.website = this.getWebSocketLink(ip, port) + this.client = new WebSocketClient(this.website, 'binary') + return new Promise((resolve, reject) => { + this.client.onopen = () => { + this.receive() + resolve(this) + } + this.client.onerror = (error) => { + reject(error) + } + this.client.onclose = () => { + this.resolveRead(false) + this.closed = true + } + //CONTEST + // Seems to not be working, at least in a web worker + self.addEventListener('offline', async () => { + await this.close() + this.resolveRead(false) + }) + }) + } + + write(data) { + if (this.closed) { + throw closeError + } + this.client.send(data) + } + + async close() { + await this.client.close() + this.closed = true + } + + async receive() { + this.client.onmessage = async (message) => { + const release = await mutex.acquire() + try { + const data = message.data instanceof ArrayBuffer + ? Buffer.from(message.data) + : Buffer.from(await new Response(message.data).arrayBuffer()) + this.stream = Buffer.concat([this.stream, data]) + this.resolveRead(true) + } finally { + release() + } + } + } +} + +module.exports = PromisedWebSockets diff --git a/src/lib/gramjs/extensions/index.js b/src/lib/gramjs/extensions/index.js new file mode 100644 index 000000000..fde192c5b --- /dev/null +++ b/src/lib/gramjs/extensions/index.js @@ -0,0 +1,14 @@ +const Logger = require('./Logger') +const BinaryWriter = require('./BinaryWriter') +const BinaryReader = require('./BinaryReader') +const PromisedWebSockets = require('./PromisedWebSockets') +const MessagePacker = require('./MessagePacker') +const AsyncQueue = require('./AsyncQueue') +module.exports = { + BinaryWriter, + BinaryReader, + MessagePacker, + AsyncQueue, + Logger, + PromisedWebSockets, +} diff --git a/src/lib/gramjs/index.d.ts b/src/lib/gramjs/index.d.ts new file mode 100644 index 000000000..08a476362 --- /dev/null +++ b/src/lib/gramjs/index.d.ts @@ -0,0 +1,10 @@ +export { default as Api } from './tl/api'; +export { default as TelegramClient } from './client/TelegramClient'; +export { default as connection } from './network'; +export { default as tl } from './tl'; +export { default as version } from './Version'; +export { default as events } from './events'; +export { default as utils } from './Utils'; +export { default as errors } from './errors'; +export { default as sessions } from './sessions'; +export { default as helpers } from './Helpers'; diff --git a/src/lib/gramjs/index.js b/src/lib/gramjs/index.js new file mode 100644 index 000000000..ff532b81d --- /dev/null +++ b/src/lib/gramjs/index.js @@ -0,0 +1,16 @@ +const Api = require('./tl/api') +const TelegramClient = require('./client/TelegramClient') +const connection = require('./network') +const tl = require('./tl') +const version = require('./Version') +const events = require('./events') +const utils = require('./Utils') +const errors = require('./errors') +const sessions = require('./sessions') +const extensions = require('./extensions') +const helpers = require('./Helpers') + +module.exports = { + Api, TelegramClient, sessions, connection, extensions, + tl, version, events, utils, errors, helpers, +} diff --git a/src/lib/gramjs/network/Authenticator.js b/src/lib/gramjs/network/Authenticator.js new file mode 100644 index 000000000..37cb753cc --- /dev/null +++ b/src/lib/gramjs/network/Authenticator.js @@ -0,0 +1,181 @@ +const BigInt = require('big-integer') +const IGE = require('../crypto/IGE') +const AuthKey = require('../crypto/AuthKey') +const Factorizator = require('../crypto/Factorizator') +const RSA = require('../crypto/RSA') +const Helpers = require('../Helpers') +const { constructors, requests } = require('../tl') +const BinaryReader = require('../extensions/BinaryReader') +const { SecurityError } = require("../errors/Common") + +/** + * Executes the authentication process with the Telegram servers. + * @param sender a connected {MTProtoPlainSender}. + * @param log + * @returns {Promise<{authKey: *, timeOffset: *}>} + */ +async function doAuthentication(sender, log) { + // Step 1 sending: PQ Request, endianness doesn't matter since it's random + let bytes = Helpers.generateRandomBytes(16) + + const nonce = Helpers.readBigIntFromBuffer(bytes, false, true) + + const resPQ = await sender.send(new requests.ReqPqMulti({ nonce: nonce })) + log.debug('Starting authKey generation step 1') + + if (!(resPQ instanceof constructors.ResPQ)) { + throw new Error(`Step 1 answer was ${resPQ}`) + } + if (resPQ.nonce.neq(nonce)) { + throw new SecurityError('Step 1 invalid nonce from server') + } + const pq = Helpers.readBigIntFromBuffer(resPQ.pq, false, true) + log.debug('Finished authKey generation step 1') + log.debug('Starting authKey generation step 2') + // Step 2 sending: DH Exchange + let { p, q } = Factorizator.factorize(pq) + + // TODO Bring back after `Factorizator` fix. + p = Helpers.getByteArray(p) + q = Helpers.getByteArray(q) + + bytes = Helpers.generateRandomBytes(32) + const newNonce = Helpers.readBigIntFromBuffer(bytes, true, true) + + const pqInnerData = new constructors.PQInnerData({ + pq: Helpers.getByteArray(pq), // unsigned + p: p, + q: q, + nonce: resPQ.nonce, + serverNonce: resPQ.serverNonce, + newNonce: newNonce, + }) + + // sha_digest + data + random_bytes + let cipherText = null + let targetFingerprint = null + for (const fingerprint of resPQ.serverPublicKeyFingerprints) { + cipherText = await RSA.encrypt(fingerprint.toString(), pqInnerData.getBytes()) + if (cipherText !== null && cipherText !== undefined) { + targetFingerprint = fingerprint + break + } + } + if (cipherText === null || cipherText === undefined) { + throw new SecurityError('Step 2 could not find a valid key for fingerprints') + } + + const serverDhParams = await sender.send( + new requests.ReqDHParams({ + nonce: resPQ.nonce, + serverNonce: resPQ.serverNonce, + p: p, + q: q, + publicKeyFingerprint: targetFingerprint, + encryptedData: cipherText, + }), + ) + if (!(serverDhParams instanceof constructors.ServerDHParamsOk || serverDhParams instanceof constructors.ServerDHParamsFail)) { + throw new Error(`Step 2.1 answer was ${serverDhParams}`) + } + if (serverDhParams.nonce.neq(resPQ.nonce)) { + throw new SecurityError('Step 2 invalid nonce from server') + } + + if (serverDhParams.serverNonce.neq(resPQ.serverNonce)) { + throw new SecurityError('Step 2 invalid server nonce from server') + } + + if (serverDhParams instanceof constructors.ServerDHParamsFail) { + const sh = await Helpers.sha1(Helpers.toSignedLittleBuffer(newNonce, 32).slice(4, 20)) + const nnh = Helpers.readBigIntFromBuffer(sh, true, true) + if (serverDhParams.newNonceHash.neq(nnh)) { + throw new SecurityError('Step 2 invalid DH fail nonce from server') + } + } + if (!(serverDhParams instanceof constructors.ServerDHParamsOk)) { + throw new Error(`Step 2.2 answer was ${serverDhParams}`) + } + log.debug('Finished authKey generation step 2') + log.debug('Starting authKey generation step 3') + + // Step 3 sending: Complete DH Exchange + const { key, iv } = await Helpers.generateKeyDataFromNonce(resPQ.serverNonce, newNonce) + if (serverDhParams.encryptedAnswer.length % 16 !== 0) { + // See PR#453 + throw new SecurityError('Step 3 AES block size mismatch') + } + const ige = new IGE(key,iv) + const plainTextAnswer = ige.decryptIge(serverDhParams.encryptedAnswer) + const reader = new BinaryReader(plainTextAnswer) + reader.read(20) // hash sum + const serverDhInner = reader.tgReadObject() + if (!(serverDhInner instanceof constructors.ServerDHInnerData)) { + throw new Error(`Step 3 answer was ${serverDhInner}`) + } + + if (serverDhInner.nonce.neq(resPQ.nonce)) { + throw new SecurityError('Step 3 Invalid nonce in encrypted answer') + } + if (serverDhInner.serverNonce.neq(resPQ.serverNonce)) { + throw new SecurityError('Step 3 Invalid server nonce in encrypted answer') + } + const dhPrime = Helpers.readBigIntFromBuffer(serverDhInner.dhPrime, false, false) + const ga = Helpers.readBigIntFromBuffer(serverDhInner.gA, false, false) + const timeOffset = serverDhInner.serverTime - Math.floor(new Date().getTime() / 1000) + const b = Helpers.readBigIntFromBuffer(Helpers.generateRandomBytes(256), false, false) + const gb = Helpers.modExp(BigInt(serverDhInner.g), b, dhPrime) + const gab = Helpers.modExp(ga, b, dhPrime) + + // Prepare client DH Inner Data + const clientDhInner = new constructors.ClientDHInnerData({ + nonce: resPQ.nonce, + serverNonce: resPQ.serverNonce, + retryId: 0, // TODO Actual retry ID + gB: Helpers.getByteArray(gb, false), + }).getBytes() + + const clientDdhInnerHashed = Buffer.concat([await Helpers.sha1(clientDhInner), clientDhInner]) + // Encryption + + const clientDhEncrypted = ige.encryptIge(clientDdhInnerHashed) + const dhGen = await sender.send( + new requests.SetClientDHParams({ + nonce: resPQ.nonce, + serverNonce: resPQ.serverNonce, + encryptedData: clientDhEncrypted, + }), + ) + const nonceTypes = [constructors.DhGenOk, constructors.DhGenRetry, constructors.DhGenFail] + if (!(dhGen instanceof nonceTypes[0] || dhGen instanceof nonceTypes[1] || dhGen instanceof nonceTypes[2])) { + throw new Error(`Step 3.1 answer was ${dhGen}`) + } + const { name } = dhGen.constructor + if (dhGen.nonce.neq(resPQ.nonce)) { + throw new SecurityError(`Step 3 invalid ${name} nonce from server`) + } + if (dhGen.serverNonce.neq(resPQ.serverNonce)) { + throw new SecurityError(`Step 3 invalid ${name} server nonce from server`) + } + const authKey = new AuthKey() + await authKey.setKey(Helpers.getByteArray(gab)) + + const nonceNumber = 1 + nonceTypes.indexOf(dhGen.constructor) + + const newNonceHash = await authKey.calcNewNonceHash(newNonce, nonceNumber) + const dhHash = dhGen[`newNonceHash${nonceNumber}`] + + if (dhHash.neq(newNonceHash)) { + throw new SecurityError('Step 3 invalid new nonce hash') + } + + if (!(dhGen instanceof constructors.DhGenOk)) { + throw new Error(`Step 3.2 answer was ${dhGen}`) + } + log.debug('Finished authKey generation step 3') + + return { authKey, timeOffset } +} + + +module.exports = doAuthentication diff --git a/src/lib/gramjs/network/MTProtoPlainSender.js b/src/lib/gramjs/network/MTProtoPlainSender.js new file mode 100644 index 000000000..fe8a9ef5c --- /dev/null +++ b/src/lib/gramjs/network/MTProtoPlainSender.js @@ -0,0 +1,75 @@ +/** + * This module contains the class used to communicate with Telegram's servers + * in plain text, when no authorization key has been created yet. + */ +const Helpers = require('../Helpers') +const MTProtoState = require('./MTProtoState') +const BinaryReader = require('../extensions/BinaryReader') +const { InvalidBufferError } = require('../errors/Common') +const BigInt = require('big-integer') +const { toSignedLittleBuffer } = require("../Helpers") + +/** + * MTProto Mobile Protocol plain sender (https://core.telegram.org/mtproto/description#unencrypted-messages) + */ + +class MTProtoPlainSender { + /** + * Initializes the MTProto plain sender. + * @param connection connection: the Connection to be used. + * @param loggers + */ + constructor(connection, loggers) { + this._state = new MTProtoState(connection, loggers) + this._connection = connection + } + + /** + * Sends and receives the result for the given request. + * @param request + */ + async send(request) { + + let body = request.getBytes() + let msgId = this._state._getNewMsgId() + const m = toSignedLittleBuffer(msgId, 8) + const b = Buffer.alloc(4) + b.writeInt32LE(body.length, 0) + + const res = Buffer.concat([Buffer.concat([Buffer.alloc(8), m, b]), body]) + + await this._connection.send(res) + body = await this._connection.recv() + if (body.length < 8) { + throw new InvalidBufferError(body) + } + const reader = new BinaryReader(body) + const authKeyId = reader.readLong() + if (authKeyId.neq(BigInt(0))) { + throw new Error('Bad authKeyId') + } + msgId = reader.readLong() + if (msgId.eq(BigInt(0))) { + throw new Error('Bad msgId') + } + /** ^ We should make sure that the read ``msg_id`` is greater + * than our own ``msg_id``. However, under some circumstances + * (bad system clock/working behind proxies) this seems to not + * be the case, which would cause endless assertion errors. + */ + + const length = reader.readInt() + if (length <= 0) { + throw new Error('Bad length') + } + /** + * We could read length bytes and use those in a new reader to read + * the next TLObject without including the padding, but since the + * reader isn't used for anything else after this, it's unnecessary. + */ + return reader.tgReadObject() + } + +} + +module.exports = MTProtoPlainSender diff --git a/src/lib/gramjs/network/MTProtoSender.js b/src/lib/gramjs/network/MTProtoSender.js new file mode 100644 index 000000000..3984faeef --- /dev/null +++ b/src/lib/gramjs/network/MTProtoSender.js @@ -0,0 +1,798 @@ +const MtProtoPlainSender = require('./MTProtoPlainSender') +const MTProtoState = require('./MTProtoState') +const Helpers = require('../Helpers') +const AuthKey = require('../crypto/AuthKey') +const doAuthentication = require('./Authenticator') +const RPCResult = require('../tl/core/RPCResult') +const MessageContainer = require('../tl/core/MessageContainer') +const GZIPPacked = require('../tl/core/GZIPPacked') +const RequestState = require('./RequestState') +const { MsgsAck, upload, MsgsStateInfo, Pong } = require('../tl').constructors +const MessagePacker = require('../extensions/MessagePacker') +const BinaryReader = require('../extensions/BinaryReader') +const { UpdateConnectionState } = require("./index"); +const { BadMessageError } = require("../errors/Common") +const { + BadServerSalt, + BadMsgNotification, + MsgDetailedInfo, + MsgNewDetailedInfo, + NewSessionCreated, + FutureSalts, + MsgsStateReq, + MsgResendReq, + MsgsAllInfo, +} = require('../tl').constructors +const { SecurityError } = require('../errors/Common') +const { InvalidBufferError } = require('../errors/Common') +const { LogOut } = require('../tl').requests.auth +const { RPCMessageToError } = require('../errors') +const { TypeNotFoundError } = require('../errors/Common') + + +/** + * MTProto Mobile Protocol sender + * (https://core.telegram.org/mtproto/description) + * This class is responsible for wrapping requests into `TLMessage`'s, + * sending them over the network and receiving them in a safe manner. + * + * Automatic reconnection due to temporary network issues is a concern + * for this class as well, including retry of messages that could not + * be sent successfully. + * + * A new authorization key will be generated on connection if no other + * key exists yet. + */ +class MTProtoSender { + static DEFAULT_OPTIONS = { + logger: null, + retries: Infinity, + delay: 2000, + autoReconnect: true, + connectTimeout: null, + authKeyCallback: null, + updateCallback: null, + autoReconnectCallback: null, + isMainSender: null, + onConnectionBreak: null, + } + + /** + * @param authKey + * @param opts + */ + constructor(authKey, opts) { + const args = { ...MTProtoSender.DEFAULT_OPTIONS, ...opts } + this._connection = null + this._log = args.logger + this._dcId = args.dcId + this._retries = args.retries + this._delay = args.delay + this._autoReconnect = args.autoReconnect + this._connectTimeout = args.connectTimeout + this._authKeyCallback = args.authKeyCallback + this._updateCallback = args.updateCallback + this._autoReconnectCallback = args.autoReconnectCallback + this._isMainSender = args.isMainSender; + this._onConnectionBreak = args.onConnectionBreak; + + /** + * Whether the user has explicitly connected or disconnected. + * + * If a disconnection happens for any other reason and it + * was *not* user action then the pending messages won't + * be cleared but on explicit user disconnection all the + * pending futures should be cancelled. + */ + this._user_connected = false + this._reconnecting = false + this._disconnected = true + + /** + * We need to join the loops upon disconnection + */ + this._send_loop_handle = null + this._recv_loop_handle = null + + /** + * Preserving the references of the AuthKey and state is important + */ + this.authKey = authKey || new AuthKey() + this._state = new MTProtoState(this.authKey, this._log) + + /** + * Outgoing messages are put in a queue and sent in a batch. + * Note that here we're also storing their ``_RequestState``. + */ + this._send_queue = new MessagePacker(this._state, this._log) + + /** + * Sent states are remembered until a response is received. + */ + this._pending_state = {} + + /** + * Responses must be acknowledged, and we can also batch these. + */ + this._pending_ack = new Set() + + /** + * Similar to pending_messages but only for the last acknowledges. + * These can't go in pending_messages because no acknowledge for them + * is received, but we may still need to resend their state on bad salts. + */ + this._last_acks = [] + + /** + * Jump table from response ID to method that handles it + */ + + this._handlers = { + [RPCResult.CONSTRUCTOR_ID]: this._handleRPCResult.bind(this), + [MessageContainer.CONSTRUCTOR_ID]: this._handleContainer.bind(this), + [GZIPPacked.CONSTRUCTOR_ID]: this._handleGzipPacked.bind(this), + [Pong.CONSTRUCTOR_ID]: this._handlePong.bind(this), + [BadServerSalt.CONSTRUCTOR_ID]: this._handleBadServerSalt.bind(this), + [BadMsgNotification.CONSTRUCTOR_ID]: this._handleBadNotification.bind(this), + [MsgDetailedInfo.CONSTRUCTOR_ID]: this._handleDetailedInfo.bind(this), + [MsgNewDetailedInfo.CONSTRUCTOR_ID]: this._handleNewDetailedInfo.bind(this), + [NewSessionCreated.CONSTRUCTOR_ID]: this._handleNewSessionCreated.bind(this), + [MsgsAck.CONSTRUCTOR_ID]: this._handleAck.bind(this), + [FutureSalts.CONSTRUCTOR_ID]: this._handleFutureSalts.bind(this), + [MsgsStateReq.CONSTRUCTOR_ID]: this._handleStateForgotten.bind(this), + [MsgResendReq.CONSTRUCTOR_ID]: this._handleStateForgotten.bind(this), + [MsgsAllInfo.CONSTRUCTOR_ID]: this._handleMsgAll.bind(this), + } + } + + // Public API + + /** + * Connects to the specified given connection using the given auth key. + * @param connection + * @param [force] + * @returns {Promise} + */ + async connect(connection, force) { + if (this._user_connected && !force) { + this._log.info('User is already connected!') + return false + } + this._connection = connection + + for (let attempt = 0; attempt < this._retries; attempt++) { + try { + await this._connect() + if (this._updateCallback) { + this._updateCallback(new UpdateConnectionState(UpdateConnectionState.connected)) + } + break + } catch (err) { + if (this._updateCallback && attempt===0){ + this._updateCallback(new UpdateConnectionState(UpdateConnectionState.disconnected)) + } + this._log.error('WebSocket connection failed attempt: ' + (attempt + 1)) + await Helpers.sleep(this._delay) + } + } + } + + isConnected() { + return this._user_connected + } + + /** + * Cleanly disconnects the instance from the network, cancels + * all pending requests, and closes the send and receive loops. + */ + async disconnect() { + await this._disconnect() + } + + /** + * + This method enqueues the given request to be sent. Its send + state will be saved until a response arrives, and a ``Future`` + that will be resolved when the response arrives will be returned: + + .. code-block:: javascript + + async def method(): + # Sending (enqueued for the send loop) + future = sender.send(request) + # Receiving (waits for the receive loop to read the result) + result = await future + + Designed like this because Telegram may send the response at + any point, and it can send other items while one waits for it. + Once the response for this future arrives, it is set with the + received result, quite similar to how a ``receive()`` call + would otherwise work. + + Since the receiving part is "built in" the future, it's + impossible to await receive a result that was never sent. + * @param request + * @returns {RequestState} + */ + send(request) { + if (!this._user_connected) { + throw new Error('Cannot send requests while disconnected') + } + //CONTEST + const state = new RequestState(request) + this._send_queue.append(state) + return state.promise + /* + if (!Helpers.isArrayLike(request)) { + const state = new RequestState(request) + this._send_queue.append(state) + return state.promise + } else { + throw new Error('not supported') + }*/ + } + + /** + * Performs the actual connection, retrying, generating the + * authorization key if necessary, and starting the send and + * receive loops. + * @returns {Promise} + * @private + */ + async _connect() { + this._log.info('Connecting to {0}...'.replace('{0}', this._connection)) + await this._connection.connect() + this._log.debug('Connection success!') + //process.exit(0) + if (!this.authKey.getKey()) { + const plain = new MtProtoPlainSender(this._connection, this._log) + this._log.debug('New auth_key attempt ...') + const res = await doAuthentication(plain, this._log) + this._log.debug('Generated new auth_key successfully') + await this.authKey.setKey(res.authKey) + + this._state.time_offset = res.timeOffset + + /** + * This is *EXTREMELY* important since we don't control + * external references to the authorization key, we must + * notify whenever we change it. This is crucial when we + * switch to different data centers. + */ + if (this._authKeyCallback) { + await this._authKeyCallback(this.authKey, this._dcId) + } + } else { + this._log.debug('Already have an auth key ...') + } + this._user_connected = true + this._reconnecting = false + + this._log.debug('Starting send loop') + this._send_loop_handle = this._sendLoop() + + this._log.debug('Starting receive loop') + this._recv_loop_handle = this._recvLoop() + + // _disconnected only completes after manual disconnection + // or errors after which the sender cannot continue such + // as failing to reconnect or any unexpected error. + + this._log.info('Connection to %s complete!'.replace('%s', this._connection.toString())) + } + + async _disconnect(error = null) { + this._send_queue.rejectAll() + + if (this._connection === null) { + this._log.info('Not disconnecting (already have no connection)') + return + } + if (this._updateCallback){ + this._updateCallback(new UpdateConnectionState(UpdateConnectionState.disconnected)) + } + this._log.info('Disconnecting from %s...'.replace('%s', this._connection.toString())) + this._user_connected = false + this._log.debug('Closing current connection...') + await this._connection.disconnect() + } + + /** + * This loop is responsible for popping items off the send + * queue, encrypting them, and sending them over the network. + * Besides `connect`, only this method ever sends data. + * @returns {Promise} + * @private + */ + async _sendLoop() { + this._send_queue = new MessagePacker(this._state, this._log) + + while (this._user_connected && !this._reconnecting) { + if (this._pending_ack.size) { + const ack = new RequestState(new MsgsAck({ msgIds: Array(...this._pending_ack) })) + this._send_queue.append(ack) + this._last_acks.push(ack) + this._pending_ack.clear() + } + this._log.debug('Waiting for messages to send...'+this._reconnecting) + // TODO Wait for the connection send queue to be empty? + // This means that while it's not empty we can wait for + // more messages to be added to the send queue. + const res = await this._send_queue.get() + + if (this._reconnecting) { + return + } + + if (!res) { + continue + } + let data = res.data + const batch = res.batch + this._log.debug(`Encrypting ${batch.length} message(s) in ${data.length} bytes for sending`) + + data = await this._state.encryptMessageData(data) + + try { + await this._connection.send(data) + } catch (e) { + this._log.error(e) + this._log.info('Connection closed while sending data') + return + } + for (const state of batch) { + if (!Array.isArray(state)) { + if (state.request.classType === 'request') { + this._pending_state[state.msgId] = state + } + } else { + for (const s of state) { + if (s.request.classType === 'request') { + this._pending_state[s.msgId] = s + } + } + } + } + this._log.debug('Encrypted messages put in a queue to be sent') + } + } + + async _recvLoop() { + let body + let message + + while (this._user_connected && !this._reconnecting) { + // this._log.debug('Receiving items from the network...'); + this._log.debug('Receiving items from the network...') + try { + body = await this._connection.recv() + } catch (e) { + // this._log.info('Connection closed while receiving data'); + this._log.warn('Connection closed while receiving data') + this.reconnect() + return + } + try { + message = await this._state.decryptMessageData(body) + } catch (e) { + if (e instanceof TypeNotFoundError) { + // Received object which we don't know how to deserialize + this._log.info(`Type ${e.invalidConstructorId} not found, remaining data ${e.remaining}`) + continue + } else if (e instanceof SecurityError) { + // A step while decoding had the incorrect data. This message + // should not be considered safe and it should be ignored. + this._log.warn(`Security error while unpacking a received message: ${e}`) + continue + } else if (e instanceof InvalidBufferError) { + this._log.info('Broken authorization key; resetting') + if (this._updateCallback && this._isMainSender){ + this._updateCallback(new UpdateConnectionState(UpdateConnectionState.broken)) + } else if (this._onConnectionBreak && !this._isMainSender){ + // Deletes the current sender from the object + this._onConnectionBreak(this._dcId) + } + + // We don't really need to do this if we're going to sign in again + /*await this.authKey.setKey(null) + + if (this._authKeyCallback) { + await this._authKeyCallback(null) + }*/ + // We can disconnect at sign in + /* await this.disconnect() + */ + return + } else { + this._log.error('Unhandled error while receiving data') + this._log.error(e) + this.reconnect() + return + } + } + try { + await this._processMessage(message) + } catch (e) { + this._log.error('Unhandled error while receiving data') + this._log.error(e) + } + } + } + + // Response Handlers + + /** + * Adds the given message to the list of messages that must be + * acknowledged and dispatches control to different ``_handle_*`` + * method based on its type. + * @param message + * @returns {Promise} + * @private + */ + async _processMessage(message) { + this._pending_ack.add(message.msgId) + // eslint-disable-next-line require-atomic-updates + message.obj = await message.obj + let handler = this._handlers[message.obj.CONSTRUCTOR_ID] + if (!handler) { + handler = this._handleUpdate.bind(this) + } + + await handler(message) + } + + /** + * Pops the states known to match the given ID from pending messages. + * This method should be used when the response isn't specific. + * @param msgId + * @returns {*[]} + * @private + */ + _popStates(msgId) { + let state = this._pending_state[msgId] + if (state) { + delete this._pending_state[msgId] + return [state] + } + + const toPop = [] + + for (state of Object.values(this._pending_state)) { + if (state.containerId && state.containerId.equals(msgId)) { + toPop.push(state.msgId) + } + } + + if (toPop.length) { + const temp = [] + for (const x of toPop) { + temp.push(this._pending_state[x]) + delete this._pending_state[x] + } + return temp + } + + for (const ack of this._last_acks) { + if (ack.msgId === msgId) { + return [ack] + } + } + + return [] + } + + /** + * Handles the result for Remote Procedure Calls: + * rpc_result#f35c6d01 req_msg_id:long result:bytes = RpcResult; + * This is where the future results for sent requests are set. + * @param message + * @returns {Promise} + * @private + */ + _handleRPCResult(message) { + const RPCResult = message.obj + const state = this._pending_state[RPCResult.reqMsgId] + if (state) { + delete this._pending_state[RPCResult.reqMsgId] + } + this._log.debug(`Handling RPC result for message ${RPCResult.reqMsgId}`) + + if (!state) { + // TODO We should not get responses to things we never sent + // However receiving a File() with empty bytes is "common". + // See #658, #759 and #958. They seem to happen in a container + // which contain the real response right after. + try { + const reader = new BinaryReader(RPCResult.body) + if (!(reader.tgReadObject() instanceof upload.File)) { + throw new TypeNotFoundError('Not an upload.File') + } + } catch (e) { + this._log.error(e) + if (e instanceof TypeNotFoundError) { + this._log.info(`Received response without parent request: ${RPCResult.body}`) + return + } else { + throw e + } + } + } + if (RPCResult.error) { + // eslint-disable-next-line new-cap + const error = RPCMessageToError(RPCResult.error, state.request) + this._send_queue.append(new RequestState(new MsgsAck({ msgIds: [state.msgId] }))) + state.reject(error) + } else { + const reader = new BinaryReader(RPCResult.body) + const read = state.request.readResult(reader) + state.resolve(read) + } + } + + /** + * Processes the inner messages of a container with many of them: + * msg_container#73f1f8dc messages:vector<%Message> = MessageContainer; + * @param message + * @returns {Promise} + * @private + */ + async _handleContainer(message) { + this._log.debug('Handling container') + for (const innerMessage of message.obj.messages) { + await this._processMessage(innerMessage) + } + } + + /** + * Unpacks the data from a gzipped object and processes it: + * gzip_packed#3072cfa1 packed_data:bytes = Object; + * @param message + * @returns {Promise} + * @private + */ + async _handleGzipPacked(message) { + this._log.debug('Handling gzipped data') + const reader = new BinaryReader(message.obj.data) + message.obj = reader.tgReadObject() + await this._processMessage(message) + } + + async _handleUpdate(message) { + if (message.obj.SUBCLASS_OF_ID !== 0x8af52aac) { + // crc32(b'Updates') + this._log.warn(`Note: ${message.obj.className} is not an update, not dispatching it`) + return + } + this._log.debug('Handling update ' + message.obj.className) + if (this._updateCallback) { + this._updateCallback(message.obj) + } + } + + /** + * Handles pong results, which don't come inside a ``RPCResult`` + * but are still sent through a request: + * pong#347773c5 msg_id:long ping_id:long = Pong; + * @param message + * @returns {Promise} + * @private + */ + async _handlePong(message) { + const pong = message.obj + this._log.debug(`Handling pong for message ${pong.msgId}`) + const state = this._pending_state[pong.msgId] + delete this._pending_state[pong.msgId] + + // Todo Check result + if (state) { + state.resolve(pong) + } + } + + /** + * Corrects the currently used server salt to use the right value + * before enqueuing the rejected message to be re-sent: + * bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int + * error_code:int new_server_salt:long = BadMsgNotification; + * @param message + * @returns {Promise} + * @private + */ + async _handleBadServerSalt(message) { + const badSalt = message.obj + this._log.debug(`Handling bad salt for message ${badSalt.badMsgId}`) + this._state.salt = badSalt.newServerSalt + const states = this._popStates(badSalt.badMsgId) + this._send_queue.extend(states) + this._log.debug(`${states.length} message(s) will be resent`) + } + + /** + * Adjusts the current state to be correct based on the + * received bad message notification whenever possible: + * bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int + * error_code:int = BadMsgNotification; + * @param message + * @returns {Promise} + * @private + */ + async _handleBadNotification(message) { + const badMsg = message.obj + const states = this._popStates(badMsg.badMsgId) + this._log.debug(`Handling bad msg ${JSON.stringify(badMsg)}`) + if ([16, 17].includes(badMsg.errorCode)) { + // Sent msg_id too low or too high (respectively). + // Use the current msg_id to determine the right time offset. + const to = this._state.updateTimeOffset(message.msgId) + this._log.info(`System clock is wrong, set time offset to ${to}s`) + } else if (badMsg.errorCode === 32) { + // msg_seqno too low, so just pump it up by some "large" amount + // TODO A better fix would be to start with a new fresh session ID + this._state._sequence += 64 + } else if (badMsg.errorCode === 33) { + // msg_seqno too high never seems to happen but just in case + this._state._sequence -= 16 + } else { + + for (const state of states) { + state.reject(new BadMessageError(state.request, badMsg.errorCode)) + } + + return + } + // Messages are to be re-sent once we've corrected the issue + this._send_queue.extend(states) + this._log.debug(`${states.length} messages will be resent due to bad msg`) + } + + /** + * Updates the current status with the received detailed information: + * msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long + * bytes:int status:int = MsgDetailedInfo; + * @param message + * @returns {Promise} + * @private + */ + async _handleDetailedInfo(message) { + // TODO https://goo.gl/VvpCC6 + const msgId = message.obj.answerMsgId + this._log.debug(`Handling detailed info for message ${msgId}`) + this._pending_ack.add(msgId) + } + + /** + * Updates the current status with the received detailed information: + * msg_new_detailed_info#809db6df answer_msg_id:long + * bytes:int status:int = MsgDetailedInfo; + * @param message + * @returns {Promise} + * @private + */ + async _handleNewDetailedInfo(message) { + // TODO https://goo.gl/VvpCC6 + const msgId = message.obj.answerMsgId + this._log.debug(`Handling new detailed info for message ${msgId}`) + this._pending_ack.add(msgId) + } + + /** + * Updates the current status with the received session information: + * new_session_created#9ec20908 first_msg_id:long unique_id:long + * server_salt:long = NewSession; + * @param message + * @returns {Promise} + * @private + */ + async _handleNewSessionCreated(message) { + // TODO https://goo.gl/LMyN7A + this._log.debug('Handling new session created') + this._state.salt = message.obj.serverSalt + } + + /** + * Handles a server acknowledge about our messages. Normally + * these can be ignored except in the case of ``auth.logOut``: + * + * auth.logOut#5717da40 = Bool; + * + * Telegram doesn't seem to send its result so we need to confirm + * it manually. No other request is known to have this behaviour. + + * Since the ID of sent messages consisting of a container is + * never returned (unless on a bad notification), this method + * also removes containers messages when any of their inner + * messages are acknowledged. + + * @param message + * @returns {Promise} + * @private + */ + async _handleAck(message) { + const ack = message.obj + this._log.debug(`Handling acknowledge for ${ack.msgIds}`) + for (const msgId of ack.msgIds) { + const state = this._pending_state[msgId] + if (state && state.request instanceof LogOut) { + delete this._pending_state[msgId] + state.resolve(true) + } + } + } + + /** + * Handles future salt results, which don't come inside a + * ``rpc_result`` but are still sent through a request: + * future_salts#ae500895 req_msg_id:long now:int + * salts:vector = FutureSalts; + * @param message + * @returns {Promise} + * @private + */ + async _handleFutureSalts(message) { + // TODO save these salts and automatically adjust to the + // correct one whenever the salt in use expires. + this._log.debug(`Handling future salts for message ${message.msgId}`) + const state = this._pending_state[message.msgId] + + if (state) { + delete this._pending_state[message] + state.resolve(message.obj) + } + } + + /** + * Handles both :tl:`MsgsStateReq` and :tl:`MsgResendReq` by + * enqueuing a :tl:`MsgsStateInfo` to be sent at a later point. + * @param message + * @returns {Promise} + * @private + */ + async _handleStateForgotten(message) { + this._send_queue.append( + new RequestState(new MsgsStateInfo(message.msgId, String.fromCharCode(1).repeat(message.obj.msgIds))), + ) + } + + /** + * Handles :tl:`MsgsAllInfo` by doing nothing (yet). + * @param message + * @returns {Promise} + * @private + */ + async _handleMsgAll(message) { + } + + async reconnect() { + if (this._user_connected && !this._reconnecting) { + this._reconnecting = true + // TODO Should we set this? + // this._user_connected = false + this._log.info("Started reconnecting") + this._reconnect() + } + } + + async _reconnect() { + this._log.debug('Closing current connection...') + try { + await this.disconnect() + } catch (err) { + this._log.warn(err) + } + + this._send_queue.append(null) + this._state.reset() + + await this.connect(this._connection, true) + + this._reconnecting = false + // uncomment this if you want to resend + //this._send_queue.extend(Object.values(this._pending_state)) + this._pending_state = {} + if (this._autoReconnectCallback) { + await this._autoReconnectCallback() + } + } +} + +module.exports = MTProtoSender diff --git a/src/lib/gramjs/network/MTProtoState.js b/src/lib/gramjs/network/MTProtoState.js new file mode 100644 index 000000000..6ab5df99e --- /dev/null +++ b/src/lib/gramjs/network/MTProtoState.js @@ -0,0 +1,237 @@ +const Helpers = require('../Helpers') +const IGE = require('../crypto/IGE') +const BinaryReader = require('../extensions/BinaryReader') +const GZIPPacked = require('../tl/core/GZIPPacked') +const { TLMessage } = require('../tl/core') +const { SecurityError, InvalidBufferError } = require('../errors/Common') +const { InvokeAfterMsg } = require('../tl').requests +const BigInt = require('big-integer') +const { toSignedLittleBuffer,readBufferFromBigInt } = require("../Helpers") +const { readBigIntFromBuffer } = require("../Helpers") + +class MTProtoState { + /** + * + `telethon.network.mtprotosender.MTProtoSender` needs to hold a state + in order to be able to encrypt and decrypt incoming/outgoing messages, + as well as generating the message IDs. Instances of this class hold + together all the required information. + + It doesn't make sense to use `telethon.sessions.abstract.Session` for + the sender because the sender should *not* be concerned about storing + this information to disk, as one may create as many senders as they + desire to any other data center, or some CDN. Using the same session + for all these is not a good idea as each need their own authkey, and + the concept of "copying" sessions with the unnecessary entities or + updates state for these connections doesn't make sense. + + While it would be possible to have a `MTProtoPlainState` that does no + encryption so that it was usable through the `MTProtoLayer` and thus + avoid the need for a `MTProtoPlainSender`, the `MTProtoLayer` is more + focused to efficiency and this state is also more advanced (since it + supports gzipping and invoking after other message IDs). There are too + many methods that would be needed to make it convenient to use for the + authentication process, at which point the `MTProtoPlainSender` is better + * @param authKey + * @param loggers + */ + constructor(authKey, loggers) { + this.authKey = authKey + this._log = loggers + this.timeOffset = 0 + this.salt = 0 + + this.id = this._sequence = this._lastMsgId = null + this.reset() + } + + /** + * Resets the state + */ + reset() { + // Session IDs can be random on every connection + this.id = Helpers.generateRandomLong(true) + this._sequence = 0 + this._lastMsgId = BigInt(0) + } + + /** + * Updates the message ID to a new one, + * used when the time offset changed. + * @param message + */ + updateMessageId(message) { + message.msgId = this._getNewMsgId() + } + + /** + * Calculate the key based on Telegram guidelines, specifying whether it's the client or not + * @param authKey + * @param msgKey + * @param client + * @returns {{iv: Buffer, key: Buffer}} + */ + async _calcKey(authKey, msgKey, client) { + const x = client === true ? 0 : 8 + const [sha256a , sha256b] = await Promise.all([ + Helpers.sha256(Buffer.concat([msgKey, authKey.slice(x, x + 36)])), + Helpers.sha256(Buffer.concat([authKey.slice(x + 40, x + 76), msgKey])) + ]) + const key = Buffer.concat([sha256a.slice(0, 8), sha256b.slice(8, 24), sha256a.slice(24, 32)]) + const iv = Buffer.concat([sha256b.slice(0, 8), sha256a.slice(8, 24), sha256b.slice(24, 32)]) + return { key, iv } + } + + /** + * Writes a message containing the given data into buffer. + * Returns the message id. + * @param buffer + * @param data + * @param contentRelated + * @param afterId + */ + async writeDataAsMessage(buffer, data, contentRelated, afterId) { + const msgId = this._getNewMsgId() + const seqNo = this._getSeqNo(contentRelated) + let body + if (!afterId) { + body = await GZIPPacked.gzipIfSmaller(contentRelated, data) + } else { + body = await GZIPPacked.gzipIfSmaller(contentRelated, new InvokeAfterMsg(afterId, data).getBytes()) + } + const s = Buffer.alloc(4) + s.writeInt32LE(seqNo, 0) + const b = Buffer.alloc(4) + b.writeInt32LE(body.length, 0) + const m = toSignedLittleBuffer(msgId, 8) + buffer.write(Buffer.concat([m, s, b])) + buffer.write(body) + return msgId + } + + /** + * Encrypts the given message data using the current authorization key + * following MTProto 2.0 guidelines core.telegram.org/mtproto/description. + * @param data + */ + async encryptMessageData(data) { + await this.authKey.waitForKey() + const s = toSignedLittleBuffer(this.salt,8) + const i = toSignedLittleBuffer(this.id,8) + data = Buffer.concat([Buffer.concat([s,i]), data]) + const padding = Helpers.generateRandomBytes(Helpers.mod(-(data.length + 12), 16) + 12) + // Being substr(what, offset, length); x = 0 for client + // "msg_key_large = SHA256(substr(auth_key, 88+x, 32) + pt + padding)" + const msgKeyLarge = await Helpers.sha256(Buffer.concat([this.authKey.getKey().slice(88, 88 + 32), data, padding])) + // "msg_key = substr (msg_key_large, 8, 16)" + const msgKey = msgKeyLarge.slice(8, 24) + + const { iv, key } = await this._calcKey(this.authKey.getKey(), msgKey, true) + + const keyId = Helpers.readBufferFromBigInt(this.authKey.keyId, 8) + return Buffer.concat([keyId, msgKey, new IGE(key,iv).encryptIge(Buffer.concat([data, padding]))]) + } + + /** + * Inverse of `encrypt_message_data` for incoming server messages. + * @param body + */ + async decryptMessageData(body) { + if (body.length < 8) { + throw new InvalidBufferError(body) + } + + // TODO Check salt,sessionId, and sequenceNumber + const keyId = Helpers.readBigIntFromBuffer(body.slice(0, 8)) + if (keyId.neq(this.authKey.keyId)) { + throw new SecurityError('Server replied with an invalid auth key') + } + + const msgKey = body.slice(8, 24) + const { iv, key } = await this._calcKey(this.authKey.getKey(), msgKey, false) + body = new IGE(key,iv).decryptIge(body.slice(24)) + + // https://core.telegram.org/mtproto/security_guidelines + // Sections "checking sha256 hash" and "message length" + + const ourKey = await Helpers.sha256(Buffer.concat([this.authKey.getKey().slice(96, 96 + 32), body])) + + if (!msgKey.equals(ourKey.slice(8, 24))) { + throw new SecurityError('Received msg_key doesn\'t match with expected one') + } + + const reader = new BinaryReader(body) + reader.readLong() // removeSalt + const serverId = reader.readLong() + if (serverId !== this.id) { + // throw new SecurityError('Server replied with a wrong session ID'); + } + + const remoteMsgId = reader.readLong() + const remoteSequence = reader.readInt() + reader.readInt() // msgLen for the inner object, padding ignored + + // We could read msg_len bytes and use those in a new reader to read + // the next TLObject without including the padding, but since the + // reader isn't used for anything else after this, it's unnecessary. + const obj = reader.tgReadObject() + + return new TLMessage(remoteMsgId, remoteSequence, obj) + } + + /** + * Generates a new unique message ID based on the current + * time (in ms) since epoch, applying a known time offset. + * @private + */ + _getNewMsgId() { + const now = new Date().getTime() / 1000 + this.timeOffset + const nanoseconds = Math.floor((now - Math.floor(now)) * 1e9) + let newMsgId = (BigInt(Math.floor(now)).shiftLeft(BigInt(32))).or(BigInt(nanoseconds).shiftLeft(BigInt(2))) + if (this._lastMsgId.greaterOrEquals(newMsgId)) { + newMsgId = this._lastMsgId.add(BigInt(4)) + } + this._lastMsgId = newMsgId + return newMsgId + } + + /** + * Updates the time offset to the correct + * one given a known valid message ID. + * @param correctMsgId {BigInteger} + */ + updateTimeOffset(correctMsgId) { + const bad = this._getNewMsgId() + const old = this.timeOffset + const now = Math.floor(new Date().getTime() / 1000) + const correct = correctMsgId.shiftRight(BigInt(32)) + this.timeOffset = correct - now + + if (this.timeOffset !== old) { + this._lastMsgId = BigInt(0) + this._log.debug( + `Updated time offset (old offset ${old}, bad ${bad}, good ${correctMsgId}, new ${this.timeOffset})`, + ) + } + + return this.timeOffset + } + + /** + * Generates the next sequence number depending on whether + * it should be for a content-related query or not. + * @param contentRelated + * @private + */ + _getSeqNo(contentRelated) { + if (contentRelated) { + const result = this._sequence * 2 + 1 + this._sequence += 1 + return result + } else { + return this._sequence * 2 + } + } +} + +module.exports = MTProtoState diff --git a/src/lib/gramjs/network/RequestState.js b/src/lib/gramjs/network/RequestState.js new file mode 100644 index 000000000..48997eadd --- /dev/null +++ b/src/lib/gramjs/network/RequestState.js @@ -0,0 +1,16 @@ +class RequestState { + constructor(request, after = null) { + this.containerId = null + this.msgId = null + this.request = request + this.data = request.getBytes() + this.after = after + this.result = null + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve + this.reject = reject + }) + } +} + +module.exports = RequestState diff --git a/src/lib/gramjs/network/connection/Connection.js b/src/lib/gramjs/network/connection/Connection.js new file mode 100644 index 000000000..fc5265c11 --- /dev/null +++ b/src/lib/gramjs/network/connection/Connection.js @@ -0,0 +1,172 @@ +const PromisedWebSockets = require('../../extensions/PromisedWebSockets') +const AsyncQueue = require('../../extensions/AsyncQueue') + +/** + * The `Connection` class is a wrapper around ``asyncio.open_connection``. + * + * Subclasses will implement different transport modes as atomic operations, + * which this class eases doing since the exposed interface simply puts and + * gets complete data payloads to and from queues. + * + * The only error that will raise from send and receive methods is + * ``ConnectionError``, which will raise when attempting to send if + * the client is disconnected (includes remote disconnections). + */ +class Connection { + PacketCodecClass = null + + constructor(ip, port, dcId, loggers) { + this._ip = ip + this._port = port + this._dcId = dcId + this._log = loggers + this._connected = false + this._sendTask = null + this._recvTask = null + this._codec = null + this._obfuscation = null // TcpObfuscated and MTProxy + this._sendArray = new AsyncQueue() + this._recvArray = new AsyncQueue() + //this.socket = new PromiseSocket(new Socket()) + + this.socket = new PromisedWebSockets() + } + + async _connect() { + this._log.debug('Connecting') + this._codec = new this.PacketCodecClass(this) + await this.socket.connect(this._port, this._ip, this) + this._log.debug('Finished connecting') + // await this.socket.connect({host: this._ip, port: this._port}); + await this._initConn() + } + + async connect() { + await this._connect() + this._connected = true + + if (!this._sendTask) { + this._sendTask = this._sendLoop() + } + this._recvTask = this._recvLoop() + } + + async disconnect() { + this._connected = false + await this._recvArray.push(null) + await this.socket.close() + } + + async send(data) { + if (!this._connected) { + throw new Error('Not connected') + } + await this._sendArray.push(data) + } + + async recv() { + while (this._connected) { + const result = await this._recvArray.pop() + // null = sentinel value = keep trying + if (result) { + return result + } + } + throw new Error('Not connected') + } + + async _sendLoop() { + // TODO handle errors + try { + while (this._connected) { + const data = await this._sendArray.pop() + if (!data) { + this._sendTask = null + return + } + await this._send(data) + } + } catch (e) { + this._log.info('The server closed the connection while sending') + } + } + + async _recvLoop() { + let data + while (this._connected) { + try { + data = await this._recv() + if (!data) { + throw new Error("no data received") + } + } catch (e) { + this._log.info('connection closed') + //await this._recvArray.push() + + this.disconnect() + return + } + await this._recvArray.push(data) + } + } + + async _initConn() { + if (this._codec.tag) { + await this.socket.write(this._codec.tag) + } + } + + async _send(data) { + const encodedPacket = this._codec.encodePacket(data) + this.socket.write(encodedPacket) + } + + async _recv() { + return await this._codec.readPacket(this.socket) + } + + toString() { + return `${this._ip}:${this._port}/${this.constructor.name.replace('Connection', '')}` + } +} + +class ObfuscatedConnection extends Connection { + ObfuscatedIO = null + + async _initConn() { + this._obfuscation = new this.ObfuscatedIO(this) + this.socket.write(this._obfuscation.header) + } + + _send(data) { + this._obfuscation.write(this._codec.encodePacket(data)) + } + + + async _recv() { + return await this._codec.readPacket(this._obfuscation) + } +} + +class PacketCodec { + constructor(connection) { + this._conn = connection + } + + encodePacket(data) { + throw new Error('Not Implemented') + + // Override + } + + async readPacket(reader) { + // override + throw new Error('Not Implemented') + } +} + +module.exports = { + Connection, + PacketCodec, + ObfuscatedConnection, +} diff --git a/src/lib/gramjs/network/connection/TCPAbridged.js b/src/lib/gramjs/network/connection/TCPAbridged.js new file mode 100644 index 000000000..f589897bf --- /dev/null +++ b/src/lib/gramjs/network/connection/TCPAbridged.js @@ -0,0 +1,51 @@ +const { readBufferFromBigInt } = require('../../Helpers') +const { Connection, PacketCodec } = require('./Connection') +const BigInt = require('big-integer') + +class AbridgedPacketCodec extends PacketCodec { + static tag = Buffer.from('ef', 'hex') + static obfuscateTag = Buffer.from('efefefef', 'hex') + + constructor(props) { + super(props) + this.tag = AbridgedPacketCodec.tag + this.obfuscateTag = AbridgedPacketCodec.obfuscateTag + } + + encodePacket(data) { + let length = data.length >> 2 + if (length < 127) { + const b = Buffer.alloc(1) + b.writeUInt8(length, 0) + length = b + } else { + length = Buffer.concat([Buffer.from('7f', 'hex'), readBufferFromBigInt(BigInt(length), 3)]) + } + return Buffer.concat([length, data]) + } + + async readPacket(reader) { + const readData = await reader.read(1) + let length = readData[0] + if (length >= 127) { + length = Buffer.concat([await reader.read(3), Buffer.alloc(1)]) + .readInt32LE(0) + } + + return await reader.read(length << 2) + } +} + +/** + * This is the mode with the lowest overhead, as it will + * only require 1 byte if the packet length is less than + * 508 bytes (127 << 2, which is very common). + */ +class ConnectionTCPAbridged extends Connection { + PacketCodecClass = AbridgedPacketCodec +} + +module.exports = { + ConnectionTCPAbridged, + AbridgedPacketCodec, +} diff --git a/src/lib/gramjs/network/connection/TCPFull.js b/src/lib/gramjs/network/connection/TCPFull.js new file mode 100644 index 000000000..742de1440 --- /dev/null +++ b/src/lib/gramjs/network/connection/TCPFull.js @@ -0,0 +1,57 @@ +//CONTEST +// const { Connection, PacketCodec } = require('./Connection') +// const { crc32 } = require('../../Helpers') +// const { InvalidChecksumError } = require('../../errors/Common') +// +// class FullPacketCodec extends PacketCodec { +// constructor(connection) { +// super(connection) +// this._sendCounter = 0 // Telegram will ignore us otherwise +// } +// +// encodePacket(data) { +// // https://core.telegram.org/mtproto#tcp-transport +// // total length, sequence number, packet and checksum (CRC32) +// const length = data.length + 12 +// const e = Buffer.alloc(8) +// e.writeInt32LE(length,0) +// e.writeInt32LE(this._sendCounter,4) +// data = Buffer.concat([e, data]) +// const crc = Buffer.alloc(4) +// crc.writeUInt32LE(crc32(data),0) +// this._sendCounter += 1 +// return Buffer.concat([data, crc]) +// } +// +// /** +// * +// * @param reader {PromisedWebSockets} +// * @returns {Promise<*>} +// */ +// async readPacket(reader) { +// const packetLenSeq = await reader.read(8) // 4 and 4 +// // process.exit(0); +// if (packetLenSeq === undefined) { +// return false +// } +// const packetLen = packetLenSeq.readInt32LE(0) +// let body = await reader.read(packetLen - 8) +// const [checksum] = body.slice(-4).readUInt32LE(0) +// body = body.slice(0, -4) +// +// const validChecksum = crc32(Buffer.concat([packetLenSeq, body])) +// if (!(validChecksum === checksum)) { +// throw new InvalidChecksumError(checksum, validChecksum) +// } +// return body +// } +// } +// +// class ConnectionTCPFull extends Connection { +// PacketCodecClass = FullPacketCodec; +// } +// +// module.exports = { +// FullPacketCodec, +// ConnectionTCPFull, +// } diff --git a/src/lib/gramjs/network/connection/TCPObfuscated.js b/src/lib/gramjs/network/connection/TCPObfuscated.js new file mode 100644 index 000000000..1cfb3464e --- /dev/null +++ b/src/lib/gramjs/network/connection/TCPObfuscated.js @@ -0,0 +1,78 @@ +const { generateRandomBytes } = require('../../Helpers') +const { ObfuscatedConnection } = require('./Connection') +const { AbridgedPacketCodec } = require('./TCPAbridged') +const CTR = require('../../crypto/CTR') + +class ObfuscatedIO { + header = null + + constructor(connection) { + this.connection = connection.socket + const res = this.initHeader(connection.PacketCodecClass) + this.header = res.random + + this._encrypt = res.encryptor + this._decrypt = res.decryptor + } + + initHeader(packetCodec) { + // Obfuscated messages secrets cannot start with any of these + const keywords = [Buffer.from('50567247', 'hex'), Buffer.from('474554', 'hex'), + Buffer.from('504f5354', 'hex'), Buffer.from('eeeeeeee', 'hex')] + let random + + // eslint-disable-next-line no-constant-condition + while (true) { + random = generateRandomBytes(64) + if (random[0] !== 0xef && !(random.slice(4, 8).equals(Buffer.alloc(4)))) { + let ok = true + for (const key of keywords) { + if (key.equals(random.slice(0, 4))) { + ok = false + break + } + } + if (ok) { + break + } + } + } + random = random.toJSON().data + + const randomReversed = Buffer.from(random.slice(8, 56)).reverse() + // Encryption has "continuous buffer" enabled + const encryptKey = Buffer.from(random.slice(8, 40)) + const encryptIv = Buffer.from(random.slice(40, 56)) + const decryptKey = Buffer.from(randomReversed.slice(0, 32)) + const decryptIv = Buffer.from(randomReversed.slice(32, 48)) + const encryptor = new CTR(encryptKey, encryptIv) + const decryptor = new CTR(decryptKey, decryptIv) + + random = Buffer.concat([ + Buffer.from(random.slice(0, 56)), packetCodec.obfuscateTag, Buffer.from(random.slice(60)), + ]) + random = Buffer.concat([ + Buffer.from(random.slice(0, 56)), Buffer.from(encryptor.encrypt(random).slice(56, 64)),Buffer.from(random.slice(64)) , + ]) + return { random, encryptor, decryptor } + } + + async read(n) { + const data = await this.connection.readExactly(n) + return this._decrypt.encrypt(data) + } + + write(data) { + this.connection.write(this._encrypt.encrypt(data)) + } +} + +class ConnectionTCPObfuscated extends ObfuscatedConnection { + ObfuscatedIO = ObfuscatedIO + PacketCodecClass = AbridgedPacketCodec +} + +module.exports = { + ConnectionTCPObfuscated, +} + diff --git a/src/lib/gramjs/network/connection/index.js b/src/lib/gramjs/network/connection/index.js new file mode 100644 index 000000000..71811e807 --- /dev/null +++ b/src/lib/gramjs/network/connection/index.js @@ -0,0 +1,11 @@ +const { Connection } = require('./Connection') +const { ConnectionTCPFull } = require('./TCPFull') +const { ConnectionTCPAbridged } = require('./TCPAbridged') +const { ConnectionTCPObfuscated } = require('./TCPObfuscated') + +module.exports = { + Connection, + ConnectionTCPFull, + ConnectionTCPAbridged, + ConnectionTCPObfuscated, +} diff --git a/src/lib/gramjs/network/index.js b/src/lib/gramjs/network/index.js new file mode 100644 index 000000000..c0edbf809 --- /dev/null +++ b/src/lib/gramjs/network/index.js @@ -0,0 +1,30 @@ +const MTProtoPlainSender = require('./MTProtoPlainSender') +const doAuthentication = require('./Authenticator') +const MTProtoSender = require('./MTProtoSender') + +class UpdateConnectionState { + static disconnected = -1 + static connected = 1 + static broken = 0 + + constructor(state) { + this.state = state + } +} + +const { + Connection, + ConnectionTCPFull, + ConnectionTCPAbridged, + ConnectionTCPObfuscated, +} = require('./connection') +module.exports = { + Connection, + ConnectionTCPFull, + ConnectionTCPAbridged, + ConnectionTCPObfuscated, + MTProtoPlainSender, + doAuthentication, + MTProtoSender, + UpdateConnectionState, +} diff --git a/src/lib/gramjs/sessions/Abstract.js b/src/lib/gramjs/sessions/Abstract.js new file mode 100644 index 000000000..5768e8dc7 --- /dev/null +++ b/src/lib/gramjs/sessions/Abstract.js @@ -0,0 +1,175 @@ +class Session { + constructor() { + + } + + /** + * Creates a clone of this session file + * @param toInstance {Session|null} + * @returns {Session} + */ + /* CONTEST + clone(toInstance = null) { + return toInstance || new this.constructor() + }*/ + + /** + * Sets the information of the data center address and port that + * the library should connect to, as well as the data center ID, + * which is currently unused. + * @param dcId {number} + * @param serverAddress {string} + * @param port {number} + */ + setDC(dcId, serverAddress, port) { + throw new Error('Not implemented') + } + + /** + * Returns the currently-used data center ID. + */ + get dcId() { + throw new Error('Not Implemented') + } + + /** + * Returns the server address where the library should connect to. + */ + get serverAddress() { + throw new Error('Not Implemented') + } + + /** + * Returns the port to which the library should connect to. + */ + get port() { + throw new Error('Not Implemented') + } + + /** + * Returns an ``AuthKey`` instance associated with the saved + * data center, or `None` if a new one should be generated. + */ + get authKey() { + throw new Error('Not Implemented') + } + + /** + * Sets the ``AuthKey`` to be used for the saved data center. + * @param value + */ + set authKey(value) { + throw new Error('Not Implemented') + } + + /** + * Returns an ID of the takeout process initialized for this session, + * or `None` if there's no were any unfinished takeout requests. + */ + /*CONTEST + get takeoutId() { + throw new Error('Not Implemented') + } + */ + /** + * Sets the ID of the unfinished takeout process for this session. + * @param value + */ + /*CONTEST + set takeoutId(value) { + throw new Error('Not Implemented') + } + */ + /** + * Returns the ``UpdateState`` associated with the given `entity_id`. + * If the `entity_id` is 0, it should return the ``UpdateState`` for + * no specific channel (the "general" state). If no state is known + * it should ``return None``. + * @param entityId + */ + /*CONTEST + getUpdateState(entityId) { + throw new Error('Not Implemented') + } + + */ + + /** + * Sets the given ``UpdateState`` for the specified `entity_id`, which + * should be 0 if the ``UpdateState`` is the "general" state (and not + * for any specific channel). + * @param entityId + * @param state + */ + /*CONTEST + setUpdateState(entityId, state) { + throw new Error('Not Implemented') + } + + */ + + /** + * Called on client disconnection. Should be used to + * free any used resources. Can be left empty if none. + */ + /*CONTEST + close() { + + } + + */ + + /** + * called whenever important properties change. It should + * make persist the relevant session information to disk. + */ + save() { + throw new Error('Not Implemented') + } + + /** + * Called upon client.log_out(). Should delete the stored + * information from disk since it's not valid anymore. + */ + + delete() { + throw new Error('Not Implemented') + } + + /** + * Lists available sessions. Not used by the library itself. + */ + /*CONTEST + listSessions() { + throw new Error('Not Implemented') + } + + */ + + /** + * Processes the input ``TLObject`` or ``list`` and saves + * whatever information is relevant (e.g., ID or access hash). + * @param tlo + */ + /*CONTEST + processEntities(tlo) { + throw new Error('Not Implemented') + } + + */ + + /** + * Turns the given key into an ``InputPeer`` (e.g. ``InputPeerUser``). + * The library uses this method whenever an ``InputPeer`` is needed + * to suit several purposes (e.g. user only provided its ID or wishes + * to use a cached username to avoid extra RPC). + */ + /*CONTEST + getInputEntity(key) { + throw new Error('Not Implemented') + } + + */ +} + +module.exports = Session diff --git a/src/lib/gramjs/sessions/CacheApiSession.js b/src/lib/gramjs/sessions/CacheApiSession.js new file mode 100644 index 000000000..8857e04c9 --- /dev/null +++ b/src/lib/gramjs/sessions/CacheApiSession.js @@ -0,0 +1,21 @@ +const StorageSession = require('./StorageSession') + +const CACHE_NAME = 'GramJs' + +class CacheApiSession extends StorageSession { + async _fetchFromCache(key) { + const request = new Request(key) + const cache = await self.caches.open(CACHE_NAME) + const cached = await cache.match(request) + return cached ? cached.text() : null + } + + async _saveToCache(key, data) { + const request = new Request(key) + const response = new Response(data) + const cache = await self.caches.open(CACHE_NAME) + return cache.put(request, response) + } +} + +module.exports = CacheApiSession diff --git a/src/lib/gramjs/sessions/LocalStorageSession.js b/src/lib/gramjs/sessions/LocalStorageSession.js new file mode 100644 index 000000000..ea228760d --- /dev/null +++ b/src/lib/gramjs/sessions/LocalStorageSession.js @@ -0,0 +1,13 @@ +const StorageSession = require('./StorageSession') + +class LocalStorageSession extends StorageSession { + async _fetchFromCache(key) { + return localStorage.getItem(key); + } + + async _saveToCache(key, data) { + return localStorage.setItem(key, data); + } +} + +module.exports = LocalStorageSession diff --git a/src/lib/gramjs/sessions/Memory.js b/src/lib/gramjs/sessions/Memory.js new file mode 100644 index 000000000..487aa1ea2 --- /dev/null +++ b/src/lib/gramjs/sessions/Memory.js @@ -0,0 +1,256 @@ +const utils = require('../Utils') +const types = require('../tl').constructors +const Session = require('./Abstract') + +class MemorySession extends Session { + constructor() { + super() + + this._serverAddress = null + this._dcId = 0 + this._port = null + this._takeoutId = null + + this._entities = new Set() + this._updateStates = {} + } + + setDC(dcId, serverAddress, port) { + this._dcId = dcId | 0 + this._serverAddress = serverAddress + this._port = port + } + + get dcId() { + return this._dcId + } + + get serverAddress() { + return this._serverAddress + } + + get port() { + return this._port + } + + get authKey() { + return this._authKey + } + + set authKey(value) { + this._authKey = value + } + /* CONTEST + get takeoutId() { + return this._takeoutId + } + + set takeoutId(value) { + this._takeoutId = value + } + + + getUpdateState(entityId) { + return this._updateStates[entityId] + } + + setUpdateState(entityId, state) { + return this._updateStates[entityId] = state + } + + close() { + } + + save() { + } + + async load() { + + } + + delete() { + } + + _entityValuesToRow(id, hash, username, phone, name) { + // While this is a simple implementation it might be overrode by, + // other classes so they don't need to implement the plural form + // of the method. Don't remove. + return [id, hash, username, phone, name] + } + + _entityToRow(e) { + if (!(e.classType === "constructor")) { + return + } + let p + let markedId + try { + p = utils.getInputPeer(e, false) + markedId = utils.getPeerId(p) + } catch (e) { + // Note: `get_input_peer` already checks for non-zero `accessHash`. + // See issues #354 and #392. It also checks that the entity + // is not `min`, because its `accessHash` cannot be used + // anywhere (since layer 102, there are two access hashes). + return + } + let pHash + if (p instanceof types.InputPeerUser || p instanceof types.InputPeerChannel) { + pHash = p.accessHash + } else if (p instanceof types.InputPeerChat) { + pHash = 0 + } else { + return + } + + let username = e.username + if (username) { + username = username.toLowerCase() + } + const phone = e.phone + const name = utils.getDisplayName(e) + return this._entityValuesToRow(markedId, pHash, username, phone, name) + } + + _entitiesToRows(tlo) { + let entities = [] + if (tlo.classType === "constructor" && utils.isListLike(tlo)) { + // This may be a list of users already for instance + entities = tlo + } else { + if (tlo instanceof Object) { + if ('user' in tlo) { + entities.push(tlo.user) + } + if ('chats' in tlo && utils.isListLike(tlo.chats)) { + entities.concat(tlo.chats) + } + if ('users' in tlo && utils.isListLike(tlo.users)) { + entities.concat(tlo.users) + } + } + } + const rows = [] // Rows to add (id, hash, username, phone, name) + for (const e of entities) { + const row = this._entityToRow(e) + if (row) { + rows.push(row) + } + } + return rows + } + + processEntities(tlo) { + const entitiesSet = this._entitiesToRows(tlo) + for (const e of entitiesSet) { + this._entities.add(e) + } + } + + getEntityRowsByPhone(phone) { + for (const e of this._entities) { // id, hash, username, phone, name + if (e[3] === phone) { + return [e[0], e[1]] + } + } + } + + getEntityRowsByUsername(username) { + for (const e of this._entities) { // id, hash, username, phone, name + if (e[2] === username) { + return [e[0], e[1]] + } + } + } + + getEntityRowsByName(name) { + for (const e of this._entities) { // id, hash, username, phone, name + if (e[4] === name) { + return [e[0], e[1]] + } + } + } + + getEntityRowsById(id, exact = true) { + if (exact) { + for (const e of this._entities) { // id, hash, username, phone, name + if (e[0] === id) { + return [e[0], e[1]] + } + } + } else { + const ids = [utils.getPeerId(new types.PeerUser({ userId: id })), + utils.getPeerId(new types.PeerChat({ chatId: id })), + utils.getPeerId(new types.PeerChannel({ channelId: id })), + ] + for (const e of this._entities) { // id, hash, username, phone, name + if (ids.includes(e[0])) { + return [e[0], e[1]] + } + } + } + } + + getInputEntity(key) { + let exact + if (key.SUBCLASS_OF_ID !== undefined) { + if ([0xc91c90b6, 0xe669bf46, 0x40f202fd].includes(key.SUBCLASS_OF_ID)) { + // hex(crc32(b'InputPeer', b'InputUser' and b'InputChannel')) + // We already have an Input version, so nothing else required + return key + } + // Try to early return if this key can be casted as input peer + return utils.getInputPeer(key) + } else { + // Not a TLObject or can't be cast into InputPeer + if (key.classType === 'constructor') { + key = utils.getPeerId(key) + exact = true + } else { + exact = !(typeof key == 'number') || key < 0 + } + } + let result = null + if (typeof key === 'string') { + const phone = utils.parsePhone(key) + if (phone) { + result = this.getEntityRowsByPhone(phone) + } else { + const { username, isInvite } = utils.parseUsername(key) + if (username && !isInvite) { + result = this.getEntityRowsByUsername(username) + } else { + const tup = utils.resolveInviteLink(key)[1] + if (tup) { + result = this.getEntityRowsById(tup, false) + } + } + } + } else if (typeof key === 'number') { + result = this.getEntityRowsById(key, exact) + } + if (!result && typeof key === 'string') { + result = this.getEntityRowsByName(key) + } + + if (result) { + let entityId = result[0] // unpack resulting tuple + const entityHash = result[1] + const resolved = utils.resolveId(entityId) + entityId = resolved[0] + const kind = resolved[1] + // removes the mark and returns type of entity + if (kind === types.PeerUser) { + return new types.InputPeerUser({ userId: entityId, accessHash: entityHash }) + } else if (kind === types.PeerChat) { + return new types.InputPeerChat({ chatId: entityId }) + } else if (kind === types.PeerChannel) { + return new types.InputPeerChannel({ channelId: entityId, accessHash: entityHash }) + } + } else { + throw new Error('Could not find input entity with key ' + key) + } + }*/ +} + +module.exports = MemorySession diff --git a/src/lib/gramjs/sessions/StorageSession.js b/src/lib/gramjs/sessions/StorageSession.js new file mode 100644 index 000000000..73773cbdf --- /dev/null +++ b/src/lib/gramjs/sessions/StorageSession.js @@ -0,0 +1,120 @@ +const MemorySession = require('./Memory') +const AuthKey = require('../crypto/AuthKey') +const utils = require('../Utils') + +const CACHE_NAME = 'GramJs' +const STORAGE_KEY_BASE = 'GramJs-session-' + +class CacheApi extends MemorySession { + constructor(sessionId) { + super() + this._storageKey = sessionId + this._authKeys = {} + } + + async load() { + if (!this._storageKey) { + return + } + + try { + const json = await this._fetchFromCache(this._storageKey) + const { mainDcId, keys, hashes } = JSON.parse(json) + const { ipAddress, port } = utils.getDC(mainDcId) + + this.setDC(mainDcId, ipAddress, port, true) + + Object.keys(keys).forEach((dcId) => { + if (keys[dcId] && hashes[dcId]){ + this._authKeys[dcId] = new AuthKey( + Buffer.from(keys[dcId].data), + Buffer.from(hashes[dcId].data) + ) + } + }) + } catch (err) { + throw new Error(`Failed to retrieve or parse JSON from Cache for key ${this._storageKey}`) + } + } + + setDC(dcId, serverAddress, port, skipUpdateStorage = false) { + this._dcId = dcId + this._serverAddress = serverAddress + this._port = port + + delete this._authKeys[dcId] + + if (!skipUpdateStorage) { + void this._updateStorage() + } + } + + async save() { + if (!this._storageKey) { + this._storageKey = generateStorageKey() + } + + await this._updateStorage() + + return this._storageKey + } + + get authKey() { + throw new Error('Not supported') + } + + set authKey(value) { + throw new Error('Not supported') + } + + getAuthKey(dcId = this._dcId) { + return this._authKeys[dcId] + } + + setAuthKey(authKey, dcId = this._dcId) { + this._authKeys[dcId] = authKey + + void this._updateStorage() + } + + async _updateStorage() { + if (!this._storageKey) { + return + } + + const sessionData = { + mainDcId: this._dcId, + keys: {}, + hashes: {} + } + + Object.keys(this._authKeys).map((dcId) => { + const authKey = this._authKeys[dcId] + sessionData.keys[dcId] = authKey._key + sessionData.hashes[dcId] = authKey._hash + }) + + await this._saveToCache(this._storageKey, JSON.stringify(sessionData)) + } + + async delete() { + const request = new Request(this._storageKey) + const cache = await self.caches.open(CACHE_NAME) + await cache.delete(request) + } + + async _fetchFromCache(key) { + throw new Error('Not Implemented') + } + + async _saveToCache(key, data) { + throw new Error('Not Implemented') + } +} + +function generateStorageKey() { + // Creating two sessions at the same moment is not expected nor supported. + return `${STORAGE_KEY_BASE}${Date.now()}` +} + +module.exports = CacheApi diff --git a/src/lib/gramjs/sessions/StringSession.js b/src/lib/gramjs/sessions/StringSession.js new file mode 100644 index 000000000..c321c5db8 --- /dev/null +++ b/src/lib/gramjs/sessions/StringSession.js @@ -0,0 +1,105 @@ +const MemorySession = require('./Memory') +const AuthKey = require('../crypto/AuthKey') +const BinaryReader = require('../extensions/BinaryReader') +const CURRENT_VERSION = '1' + + +class StringSession extends MemorySession { + /** + * This session file can be easily saved and loaded as a string. According + * to the initial design, it contains only the data that is necessary for + * successful connection and authentication, so takeout ID is not stored. + + * It is thought to be used where you don't want to create any on-disk + * files but would still like to be able to save and load existing sessions + * by other means. + + * You can use custom `encode` and `decode` functions, if present: + + * `encode` definition must be ``function encode(value: Buffer) -> string:``. + * `decode` definition must be ``function decode(value: string) -> Buffer:``. + * @param session {string|null} + */ + constructor(session = null) { + super() + if (session) { + if (session[0] !== CURRENT_VERSION) { + throw new Error('Not a valid string') + } + session = session.slice(1) + const r = StringSession.decode(session) + const reader = new BinaryReader(r) + this._dcId = reader.read(1) + .readUInt8(0) + const serverAddressLen = reader.read(2) + .readInt16BE(0) + this._serverAddress = String(reader.read(serverAddressLen)) + this._port = reader.read(2) + .readInt16BE(0) + this._key = reader.read(-1) + } + } + + /** + * @param x {Buffer} + * @returns {string} + */ + static encode(x) { + return x.toString('base64') + } + + /** + * @param x {string} + * @returns {Buffer} + */ + static decode(x) { + return Buffer.from(x, 'base64') + } + + async load() { + if (this._key) { + this._authKey = new AuthKey() + await this._authKey.setKey(this._key) + } + } + + save() { + if (!this.authKey) { + return '' + } + const dcBuffer = Buffer.from([this.dcId]) + const addressBuffer = Buffer.from(this.serverAddress) + const addressLengthBuffer = Buffer.alloc(2) + addressLengthBuffer.writeInt16BE(addressBuffer.length, 0) + const portBuffer = Buffer.alloc(2) + portBuffer.writeInt16BE(this.port, 0) + + return CURRENT_VERSION + StringSession.encode(Buffer.concat([ + dcBuffer, + addressLengthBuffer, + addressBuffer, + portBuffer, + this.authKey.getKey(), + ])) + } + + getAuthKey(dcId) { + if (dcId && dcId !== this.dcId) { + // Not supported. + return undefined + } + + return this.authKey + } + + setAuthKey(authKey, dcId) { + if (dcId && dcId !== this.dcId) { + // Not supported. + return undefined + } + + this.authKey = authKey + } +} + +module.exports = StringSession diff --git a/src/lib/gramjs/sessions/index.js b/src/lib/gramjs/sessions/index.js new file mode 100644 index 000000000..4fcbb4d4f --- /dev/null +++ b/src/lib/gramjs/sessions/index.js @@ -0,0 +1,11 @@ +const Memory = require('./Memory') +const StringSession = require('./StringSession') +const CacheApiSession = require('./CacheApiSession') +const LocalStorageSession = require('./LocalStorageSession') + +module.exports = { + Memory, + StringSession, + CacheApiSession, + LocalStorageSession, +} diff --git a/src/lib/gramjs/tl/AllTLObjects.js b/src/lib/gramjs/tl/AllTLObjects.js new file mode 100644 index 000000000..4a4e45ded --- /dev/null +++ b/src/lib/gramjs/tl/AllTLObjects.js @@ -0,0 +1,19 @@ +const api = require('./api') +const LAYER = 121 +const tlobjects = {} + + +for (const tl of Object.values(api)) { + if (tl.CONSTRUCTOR_ID) { + tlobjects[tl.CONSTRUCTOR_ID] = tl + } else { + for (const sub of Object.values(tl)) { + tlobjects[sub.CONSTRUCTOR_ID] = sub + } + } +} + +module.exports = { + LAYER, + tlobjects +} diff --git a/src/lib/gramjs/tl/MTProtoRequest.js b/src/lib/gramjs/tl/MTProtoRequest.js new file mode 100644 index 000000000..5dfee464a --- /dev/null +++ b/src/lib/gramjs/tl/MTProtoRequest.js @@ -0,0 +1,42 @@ +class MTProtoRequest { + constructor() { + this.sent = false + this.msgId = 0 // long + this.sequence = 0 + + this.dirty = false + this.sendTime = 0 + this.confirmReceived = false + + // These should be overrode + + this.constructorId = 0 + this.confirmed = false + this.responded = false + } + + // these should not be overrode + onSendSuccess() { + this.sendTime = new Date().getTime() + this.sent = true + } + + onConfirm() { + this.confirmReceived = true + } + + needResend() { + return this.dirty || (this.confirmed && !this.confirmReceived && new Date().getTime() - this.sendTime > 3000) + } + + // These should be overrode + onSend() { + throw Error('Not overload ' + this.constructor.name) + } + + onResponse(buffer) {} + + onException(exception) {} +} + +module.exports = MTProtoRequest diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts new file mode 100644 index 000000000..5c191b27d --- /dev/null +++ b/src/lib/gramjs/tl/api.d.ts @@ -0,0 +1,10692 @@ + +// This file is autogenerated. All changes will be overwritten. + +import { BigInteger } from 'big-integer'; + +export default Api; + +namespace Api { + + type AnyClass = new (...args: any[]) => any; + type I = InstanceType; + type ValuesOf = T[keyof T]; + type AnyLiteral = Record; + + type Reader = any; // To be defined. + type Client = any; // To be defined. + type Utils = any; // To be defined. + + type X = unknown; + type Type = unknown; + type Bool = boolean; + type int = number; + type int128 = number; + type int256 = number; + type long = BigInteger; + type bytes = Buffer; + + class VirtualClass { + static CONSTRUCTOR_ID: number; + static SUBCLASS_OF_ID: number; + static className: string; + static classType: 'constructor' | 'request'; + + static serializeBytes(data: Buffer | string): Buffer; + static serializeDate(date: Date | number): Buffer; + static fromReader(reader: Reader): VirtualClass; + + CONSTRUCTOR_ID: number; + SUBCLASS_OF_ID: number; + className: string; + classType: 'constructor' | 'request'; + + constructor(args: Args); + } + + class Request extends VirtualClass> { + static readResult(reader: Reader): Buffer; + static resolve(client: Client, utils: Utils): Promise; + + __response: Response; + } + + export type TypeInputPeer = InputPeerEmpty | InputPeerSelf | InputPeerChat | InputPeerUser | InputPeerChannel | InputPeerUserFromMessage | InputPeerChannelFromMessage; + export type TypeInputUser = InputUserEmpty | InputUserSelf | InputUser | InputUserFromMessage; + export type TypeInputContact = InputPhoneContact; + export type TypeInputFile = InputFile | InputFileBig; + export type TypeInputMedia = InputMediaEmpty | InputMediaUploadedPhoto | InputMediaPhoto | InputMediaGeoPoint | InputMediaContact | InputMediaUploadedDocument | InputMediaDocument | InputMediaVenue | InputMediaPhotoExternal | InputMediaDocumentExternal | InputMediaGame | InputMediaInvoice | InputMediaGeoLive | InputMediaPoll | InputMediaDice; + export type TypeInputChatPhoto = InputChatPhotoEmpty | InputChatUploadedPhoto | InputChatPhoto; + export type TypeInputGeoPoint = InputGeoPointEmpty | InputGeoPoint; + export type TypeInputPhoto = InputPhotoEmpty | InputPhoto; + export type TypeInputFileLocation = InputFileLocation | InputEncryptedFileLocation | InputDocumentFileLocation | InputSecureFileLocation | InputTakeoutFileLocation | InputPhotoFileLocation | InputPhotoLegacyFileLocation | InputPeerPhotoFileLocation | InputStickerSetThumb; + export type TypePeer = PeerUser | PeerChat | PeerChannel; + export type TypeUser = UserEmpty | User; + export type TypeUserProfilePhoto = UserProfilePhotoEmpty | UserProfilePhoto; + export type TypeUserStatus = UserStatusEmpty | UserStatusOnline | UserStatusOffline | UserStatusRecently | UserStatusLastWeek | UserStatusLastMonth; + export type TypeChat = ChatEmpty | Chat | ChatForbidden | Channel | ChannelForbidden; + export type TypeChatFull = ChatFull | ChannelFull; + export type TypeChatParticipant = ChatParticipant | ChatParticipantCreator | ChatParticipantAdmin; + export type TypeChatParticipants = ChatParticipantsForbidden | ChatParticipants; + export type TypeChatPhoto = ChatPhotoEmpty | ChatPhoto; + export type TypeMessage = MessageEmpty | Message | MessageService; + export type TypeMessageMedia = MessageMediaEmpty | MessageMediaPhoto | MessageMediaGeo | MessageMediaContact | MessageMediaUnsupported | MessageMediaDocument | MessageMediaWebPage | MessageMediaVenue | MessageMediaGame | MessageMediaInvoice | MessageMediaGeoLive | MessageMediaPoll | MessageMediaDice; + export type TypeMessageAction = MessageActionEmpty | MessageActionChatCreate | MessageActionChatEditTitle | MessageActionChatEditPhoto | MessageActionChatDeletePhoto | MessageActionChatAddUser | MessageActionChatDeleteUser | MessageActionChatJoinedByLink | MessageActionChannelCreate | MessageActionChatMigrateTo | MessageActionChannelMigrateFrom | MessageActionPinMessage | MessageActionHistoryClear | MessageActionGameScore | MessageActionPaymentSentMe | MessageActionPaymentSent | MessageActionPhoneCall | MessageActionScreenshotTaken | MessageActionCustomAction | MessageActionBotAllowed | MessageActionSecureValuesSentMe | MessageActionSecureValuesSent | MessageActionContactSignUp | MessageActionGeoProximityReached; + export type TypeDialog = Dialog | DialogFolder; + export type TypePhoto = PhotoEmpty | Photo; + export type TypePhotoSize = PhotoSizeEmpty | PhotoSize | PhotoCachedSize | PhotoStrippedSize | PhotoSizeProgressive | PhotoPathSize; + export type TypeGeoPoint = GeoPointEmpty | GeoPoint; + export type TypeInputNotifyPeer = InputNotifyPeer | InputNotifyUsers | InputNotifyChats | InputNotifyBroadcasts; + export type TypeInputPeerNotifySettings = InputPeerNotifySettings; + export type TypePeerNotifySettings = PeerNotifySettings; + export type TypePeerSettings = PeerSettings; + export type TypeWallPaper = WallPaper | WallPaperNoFile; + export type TypeReportReason = InputReportReasonSpam | InputReportReasonViolence | InputReportReasonPornography | InputReportReasonChildAbuse | InputReportReasonOther | InputReportReasonCopyright | InputReportReasonGeoIrrelevant; + export type TypeUserFull = UserFull; + export type TypeContact = Contact; + export type TypeImportedContact = ImportedContact; + export type TypeContactStatus = ContactStatus; + export type TypeMessagesFilter = InputMessagesFilterEmpty | InputMessagesFilterPhotos | InputMessagesFilterVideo | InputMessagesFilterPhotoVideo | InputMessagesFilterDocument | InputMessagesFilterUrl | InputMessagesFilterGif | InputMessagesFilterVoice | InputMessagesFilterMusic | InputMessagesFilterChatPhotos | InputMessagesFilterPhoneCalls | InputMessagesFilterRoundVoice | InputMessagesFilterRoundVideo | InputMessagesFilterMyMentions | InputMessagesFilterGeo | InputMessagesFilterContacts | InputMessagesFilterPinned; + export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateUserPhoto | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelParticipant | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages; + export type TypeUpdates = UpdatesTooLong | UpdateShortMessage | UpdateShortChatMessage | UpdateShort | UpdatesCombined | Updates | UpdateShortSentMessage; + export type TypeDcOption = DcOption; + export type TypeConfig = Config; + export type TypeNearestDc = NearestDc; + export type TypeEncryptedChat = EncryptedChatEmpty | EncryptedChatWaiting | EncryptedChatRequested | EncryptedChat | EncryptedChatDiscarded; + export type TypeInputEncryptedChat = InputEncryptedChat; + export type TypeEncryptedFile = EncryptedFileEmpty | EncryptedFile; + export type TypeInputEncryptedFile = InputEncryptedFileEmpty | InputEncryptedFileUploaded | InputEncryptedFile | InputEncryptedFileBigUploaded; + export type TypeEncryptedMessage = EncryptedMessage | EncryptedMessageService; + export type TypeInputDocument = InputDocumentEmpty | InputDocument; + export type TypeDocument = DocumentEmpty | Document; + export type TypeNotifyPeer = NotifyPeer | NotifyUsers | NotifyChats | NotifyBroadcasts; + export type TypeSendMessageAction = SendMessageTypingAction | SendMessageCancelAction | SendMessageRecordVideoAction | SendMessageUploadVideoAction | SendMessageRecordAudioAction | SendMessageUploadAudioAction | SendMessageUploadPhotoAction | SendMessageUploadDocumentAction | SendMessageGeoLocationAction | SendMessageChooseContactAction | SendMessageGamePlayAction | SendMessageRecordRoundAction | SendMessageUploadRoundAction; + export type TypeInputPrivacyKey = InputPrivacyKeyStatusTimestamp | InputPrivacyKeyChatInvite | InputPrivacyKeyPhoneCall | InputPrivacyKeyPhoneP2P | InputPrivacyKeyForwards | InputPrivacyKeyProfilePhoto | InputPrivacyKeyPhoneNumber | InputPrivacyKeyAddedByPhone; + export type TypePrivacyKey = PrivacyKeyStatusTimestamp | PrivacyKeyChatInvite | PrivacyKeyPhoneCall | PrivacyKeyPhoneP2P | PrivacyKeyForwards | PrivacyKeyProfilePhoto | PrivacyKeyPhoneNumber | PrivacyKeyAddedByPhone; + export type TypeInputPrivacyRule = InputPrivacyValueAllowContacts | InputPrivacyValueAllowAll | InputPrivacyValueAllowUsers | InputPrivacyValueDisallowContacts | InputPrivacyValueDisallowAll | InputPrivacyValueDisallowUsers | InputPrivacyValueAllowChatParticipants | InputPrivacyValueDisallowChatParticipants; + export type TypePrivacyRule = PrivacyValueAllowContacts | PrivacyValueAllowAll | PrivacyValueAllowUsers | PrivacyValueDisallowContacts | PrivacyValueDisallowAll | PrivacyValueDisallowUsers | PrivacyValueAllowChatParticipants | PrivacyValueDisallowChatParticipants; + export type TypeAccountDaysTTL = AccountDaysTTL; + export type TypeDocumentAttribute = DocumentAttributeImageSize | DocumentAttributeAnimated | DocumentAttributeSticker | DocumentAttributeVideo | DocumentAttributeAudio | DocumentAttributeFilename | DocumentAttributeHasStickers; + export type TypeStickerPack = StickerPack; + export type TypeWebPage = WebPageEmpty | WebPagePending | WebPage | WebPageNotModified; + export type TypeAuthorization = Authorization; + export type TypeReceivedNotifyMessage = ReceivedNotifyMessage; + export type TypeExportedChatInvite = ChatInviteEmpty | ChatInviteExported; + export type TypeChatInvite = ChatInviteAlready | ChatInvite | ChatInvitePeek; + export type TypeInputStickerSet = InputStickerSetEmpty | InputStickerSetID | InputStickerSetShortName | InputStickerSetAnimatedEmoji | InputStickerSetDice; + export type TypeStickerSet = StickerSet; + export type TypeBotCommand = BotCommand; + export type TypeBotInfo = BotInfo; + export type TypeKeyboardButton = KeyboardButton | KeyboardButtonUrl | KeyboardButtonCallback | KeyboardButtonRequestPhone | KeyboardButtonRequestGeoLocation | KeyboardButtonSwitchInline | KeyboardButtonGame | KeyboardButtonBuy | KeyboardButtonUrlAuth | InputKeyboardButtonUrlAuth | KeyboardButtonRequestPoll; + export type TypeKeyboardButtonRow = KeyboardButtonRow; + export type TypeReplyMarkup = ReplyKeyboardHide | ReplyKeyboardForceReply | ReplyKeyboardMarkup | ReplyInlineMarkup; + export type TypeMessageEntity = MessageEntityUnknown | MessageEntityMention | MessageEntityHashtag | MessageEntityBotCommand | MessageEntityUrl | MessageEntityEmail | MessageEntityBold | MessageEntityItalic | MessageEntityCode | MessageEntityPre | MessageEntityTextUrl | MessageEntityMentionName | InputMessageEntityMentionName | MessageEntityPhone | MessageEntityCashtag | MessageEntityUnderline | MessageEntityStrike | MessageEntityBlockquote | MessageEntityBankCard; + export type TypeInputChannel = InputChannelEmpty | InputChannel | InputChannelFromMessage; + export type TypeMessageRange = MessageRange; + export type TypeChannelMessagesFilter = ChannelMessagesFilterEmpty | ChannelMessagesFilter; + export type TypeChannelParticipant = ChannelParticipant | ChannelParticipantSelf | ChannelParticipantCreator | ChannelParticipantAdmin | ChannelParticipantBanned | ChannelParticipantLeft; + export type TypeChannelParticipantsFilter = ChannelParticipantsRecent | ChannelParticipantsAdmins | ChannelParticipantsKicked | ChannelParticipantsBots | ChannelParticipantsBanned | ChannelParticipantsSearch | ChannelParticipantsContacts | ChannelParticipantsMentions; + export type TypeInputBotInlineMessage = InputBotInlineMessageMediaAuto | InputBotInlineMessageText | InputBotInlineMessageMediaGeo | InputBotInlineMessageMediaVenue | InputBotInlineMessageMediaContact | InputBotInlineMessageGame; + export type TypeInputBotInlineResult = InputBotInlineResult | InputBotInlineResultPhoto | InputBotInlineResultDocument | InputBotInlineResultGame; + export type TypeBotInlineMessage = BotInlineMessageMediaAuto | BotInlineMessageText | BotInlineMessageMediaGeo | BotInlineMessageMediaVenue | BotInlineMessageMediaContact; + export type TypeBotInlineResult = BotInlineResult | BotInlineMediaResult; + export type TypeExportedMessageLink = ExportedMessageLink; + export type TypeMessageFwdHeader = MessageFwdHeader; + export type TypeInputBotInlineMessageID = InputBotInlineMessageID; + export type TypeInlineBotSwitchPM = InlineBotSwitchPM; + export type TypeTopPeer = TopPeer; + export type TypeTopPeerCategory = TopPeerCategoryBotsPM | TopPeerCategoryBotsInline | TopPeerCategoryCorrespondents | TopPeerCategoryGroups | TopPeerCategoryChannels | TopPeerCategoryPhoneCalls | TopPeerCategoryForwardUsers | TopPeerCategoryForwardChats; + export type TypeTopPeerCategoryPeers = TopPeerCategoryPeers; + export type TypeDraftMessage = DraftMessageEmpty | DraftMessage; + export type TypeStickerSetCovered = StickerSetCovered | StickerSetMultiCovered; + export type TypeMaskCoords = MaskCoords; + export type TypeInputStickeredMedia = InputStickeredMediaPhoto | InputStickeredMediaDocument; + export type TypeGame = Game; + export type TypeInputGame = InputGameID | InputGameShortName; + export type TypeHighScore = HighScore; + export type TypeRichText = TextEmpty | TextPlain | TextBold | TextItalic | TextUnderline | TextStrike | TextFixed | TextUrl | TextEmail | TextConcat | TextSubscript | TextSuperscript | TextMarked | TextPhone | TextImage | TextAnchor; + export type TypePageBlock = PageBlockUnsupported | PageBlockTitle | PageBlockSubtitle | PageBlockAuthorDate | PageBlockHeader | PageBlockSubheader | PageBlockParagraph | PageBlockPreformatted | PageBlockFooter | PageBlockDivider | PageBlockAnchor | PageBlockList | PageBlockBlockquote | PageBlockPullquote | PageBlockPhoto | PageBlockVideo | PageBlockCover | PageBlockEmbed | PageBlockEmbedPost | PageBlockCollage | PageBlockSlideshow | PageBlockChannel | PageBlockAudio | PageBlockKicker | PageBlockTable | PageBlockOrderedList | PageBlockDetails | PageBlockRelatedArticles | PageBlockMap; + export type TypePhoneCallDiscardReason = PhoneCallDiscardReasonMissed | PhoneCallDiscardReasonDisconnect | PhoneCallDiscardReasonHangup | PhoneCallDiscardReasonBusy; + export type TypeDataJSON = DataJSON; + export type TypeLabeledPrice = LabeledPrice; + export type TypeInvoice = Invoice; + export type TypePaymentCharge = PaymentCharge; + export type TypePostAddress = PostAddress; + export type TypePaymentRequestedInfo = PaymentRequestedInfo; + export type TypePaymentSavedCredentials = PaymentSavedCredentialsCard; + export type TypeWebDocument = WebDocument | WebDocumentNoProxy; + export type TypeInputWebDocument = InputWebDocument; + export type TypeInputWebFileLocation = InputWebFileLocation | InputWebFileGeoPointLocation; + export type TypeInputPaymentCredentials = InputPaymentCredentialsSaved | InputPaymentCredentials | InputPaymentCredentialsApplePay | InputPaymentCredentialsAndroidPay; + export type TypeShippingOption = ShippingOption; + export type TypeInputStickerSetItem = InputStickerSetItem; + export type TypeInputPhoneCall = InputPhoneCall; + export type TypePhoneCall = PhoneCallEmpty | PhoneCallWaiting | PhoneCallRequested | PhoneCallAccepted | PhoneCall | PhoneCallDiscarded; + export type TypePhoneConnection = PhoneConnection | PhoneConnectionWebrtc; + export type TypePhoneCallProtocol = PhoneCallProtocol; + export type TypeCdnPublicKey = CdnPublicKey; + export type TypeCdnConfig = CdnConfig; + export type TypeLangPackString = LangPackString | LangPackStringPluralized | LangPackStringDeleted; + export type TypeLangPackDifference = LangPackDifference; + export type TypeLangPackLanguage = LangPackLanguage; + export type TypeChannelAdminLogEventAction = ChannelAdminLogEventActionChangeTitle | ChannelAdminLogEventActionChangeAbout | ChannelAdminLogEventActionChangeUsername | ChannelAdminLogEventActionChangePhoto | ChannelAdminLogEventActionToggleInvites | ChannelAdminLogEventActionToggleSignatures | ChannelAdminLogEventActionUpdatePinned | ChannelAdminLogEventActionEditMessage | ChannelAdminLogEventActionDeleteMessage | ChannelAdminLogEventActionParticipantJoin | ChannelAdminLogEventActionParticipantLeave | ChannelAdminLogEventActionParticipantInvite | ChannelAdminLogEventActionParticipantToggleBan | ChannelAdminLogEventActionParticipantToggleAdmin | ChannelAdminLogEventActionChangeStickerSet | ChannelAdminLogEventActionTogglePreHistoryHidden | ChannelAdminLogEventActionDefaultBannedRights | ChannelAdminLogEventActionStopPoll | ChannelAdminLogEventActionChangeLinkedChat | ChannelAdminLogEventActionChangeLocation | ChannelAdminLogEventActionToggleSlowMode; + export type TypeChannelAdminLogEvent = ChannelAdminLogEvent; + export type TypeChannelAdminLogEventsFilter = ChannelAdminLogEventsFilter; + export type TypePopularContact = PopularContact; + export type TypeRecentMeUrl = RecentMeUrlUnknown | RecentMeUrlUser | RecentMeUrlChat | RecentMeUrlChatInvite | RecentMeUrlStickerSet; + export type TypeInputSingleMedia = InputSingleMedia; + export type TypeWebAuthorization = WebAuthorization; + export type TypeInputMessage = InputMessageID | InputMessageReplyTo | InputMessagePinned | InputMessageCallbackQuery; + export type TypeInputDialogPeer = InputDialogPeer | InputDialogPeerFolder; + export type TypeDialogPeer = DialogPeer | DialogPeerFolder; + export type TypeFileHash = FileHash; + export type TypeInputClientProxy = InputClientProxy; + export type TypeInputSecureFile = InputSecureFileUploaded | InputSecureFile; + export type TypeSecureFile = SecureFileEmpty | SecureFile; + export type TypeSecureData = SecureData; + export type TypeSecurePlainData = SecurePlainPhone | SecurePlainEmail; + export type TypeSecureValueType = SecureValueTypePersonalDetails | SecureValueTypePassport | SecureValueTypeDriverLicense | SecureValueTypeIdentityCard | SecureValueTypeInternalPassport | SecureValueTypeAddress | SecureValueTypeUtilityBill | SecureValueTypeBankStatement | SecureValueTypeRentalAgreement | SecureValueTypePassportRegistration | SecureValueTypeTemporaryRegistration | SecureValueTypePhone | SecureValueTypeEmail; + export type TypeSecureValue = SecureValue; + export type TypeInputSecureValue = InputSecureValue; + export type TypeSecureValueHash = SecureValueHash; + export type TypeSecureValueError = SecureValueErrorData | SecureValueErrorFrontSide | SecureValueErrorReverseSide | SecureValueErrorSelfie | SecureValueErrorFile | SecureValueErrorFiles | SecureValueError | SecureValueErrorTranslationFile | SecureValueErrorTranslationFiles; + export type TypeSecureCredentialsEncrypted = SecureCredentialsEncrypted; + export type TypeSavedContact = SavedPhoneContact; + export type TypePasswordKdfAlgo = PasswordKdfAlgoUnknown | PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow; + export type TypeSecurePasswordKdfAlgo = SecurePasswordKdfAlgoUnknown | SecurePasswordKdfAlgoPBKDF2HMACSHA512iter100000 | SecurePasswordKdfAlgoSHA512; + export type TypeSecureSecretSettings = SecureSecretSettings; + export type TypeInputCheckPasswordSRP = InputCheckPasswordEmpty | InputCheckPasswordSRP; + export type TypeSecureRequiredType = SecureRequiredType | SecureRequiredTypeOneOf; + export type TypeInputAppEvent = InputAppEvent; + export type TypeJSONObjectValue = JsonObjectValue; + export type TypeJSONValue = JsonNull | JsonBool | JsonNumber | JsonString | JsonArray | JsonObject; + export type TypePageTableCell = PageTableCell; + export type TypePageTableRow = PageTableRow; + export type TypePageCaption = PageCaption; + export type TypePageListItem = PageListItemText | PageListItemBlocks; + export type TypePageListOrderedItem = PageListOrderedItemText | PageListOrderedItemBlocks; + export type TypePageRelatedArticle = PageRelatedArticle; + export type TypePage = Page; + export type TypePollAnswer = PollAnswer; + export type TypePoll = Poll; + export type TypePollAnswerVoters = PollAnswerVoters; + export type TypePollResults = PollResults; + export type TypeChatOnlines = ChatOnlines; + export type TypeStatsURL = StatsURL; + export type TypeChatAdminRights = ChatAdminRights; + export type TypeChatBannedRights = ChatBannedRights; + export type TypeInputWallPaper = InputWallPaper | InputWallPaperSlug | InputWallPaperNoFile; + export type TypeCodeSettings = CodeSettings; + export type TypeWallPaperSettings = WallPaperSettings; + export type TypeAutoDownloadSettings = AutoDownloadSettings; + export type TypeEmojiKeyword = EmojiKeyword | EmojiKeywordDeleted; + export type TypeEmojiKeywordsDifference = EmojiKeywordsDifference; + export type TypeEmojiURL = EmojiURL; + export type TypeEmojiLanguage = EmojiLanguage; + export type TypeFileLocation = FileLocationToBeDeprecated; + export type TypeFolder = Folder; + export type TypeInputFolderPeer = InputFolderPeer; + export type TypeFolderPeer = FolderPeer; + export type TypeUrlAuthResult = UrlAuthResultRequest | UrlAuthResultAccepted | UrlAuthResultDefault; + export type TypeChannelLocation = ChannelLocationEmpty | ChannelLocation; + export type TypePeerLocated = PeerLocated | PeerSelfLocated; + export type TypeRestrictionReason = RestrictionReason; + export type TypeInputTheme = InputTheme | InputThemeSlug; + export type TypeTheme = Theme; + export type TypeBaseTheme = BaseThemeClassic | BaseThemeDay | BaseThemeNight | BaseThemeTinted | BaseThemeArctic; + export type TypeInputThemeSettings = InputThemeSettings; + export type TypeThemeSettings = ThemeSettings; + export type TypeWebPageAttribute = WebPageAttributeTheme; + export type TypeMessageUserVote = MessageUserVote | MessageUserVoteInputOption | MessageUserVoteMultiple; + export type TypeBankCardOpenUrl = BankCardOpenUrl; + export type TypeDialogFilter = DialogFilter; + export type TypeDialogFilterSuggested = DialogFilterSuggested; + export type TypeStatsDateRangeDays = StatsDateRangeDays; + export type TypeStatsAbsValueAndPrev = StatsAbsValueAndPrev; + export type TypeStatsPercentValue = StatsPercentValue; + export type TypeStatsGraph = StatsGraphAsync | StatsGraphError | StatsGraph; + export type TypeMessageInteractionCounters = MessageInteractionCounters; + export type TypeVideoSize = VideoSize; + export type TypeStatsGroupTopPoster = StatsGroupTopPoster; + export type TypeStatsGroupTopAdmin = StatsGroupTopAdmin; + export type TypeStatsGroupTopInviter = StatsGroupTopInviter; + export type TypeGlobalPrivacySettings = GlobalPrivacySettings; + export type TypeMessageViews = MessageViews; + export type TypeMessageReplyHeader = MessageReplyHeader; + export type TypeMessageReplies = MessageReplies; + export type TypePeerBlocked = PeerBlocked; + export type TypeResPQ = ResPQ; + export type TypeP_Q_inner_data = PQInnerData | PQInnerDataDc | PQInnerDataTemp | PQInnerDataTempDc; + export type TypeServer_DH_Params = ServerDHParamsFail | ServerDHParamsOk; + export type TypeServer_DH_inner_data = ServerDHInnerData; + export type TypeClient_DH_Inner_Data = ClientDHInnerData; + export type TypeSet_client_DH_params_answer = DhGenOk | DhGenRetry | DhGenFail; + export type TypeDestroyAuthKeyRes = DestroyAuthKeyOk | DestroyAuthKeyNone | DestroyAuthKeyFail; + export type TypeMsgsAck = MsgsAck; + export type TypeBadMsgNotification = BadMsgNotification | BadServerSalt; + export type TypeMsgsStateReq = MsgsStateReq; + export type TypeMsgsStateInfo = MsgsStateInfo; + export type TypeMsgsAllInfo = MsgsAllInfo; + export type TypeMsgDetailedInfo = MsgDetailedInfo | MsgNewDetailedInfo; + export type TypeMsgResendReq = MsgResendReq; + export type TypeRpcError = RpcError; + export type TypeRpcDropAnswer = RpcAnswerUnknown | RpcAnswerDroppedRunning | RpcAnswerDropped; + export type TypeFutureSalt = FutureSalt; + export type TypeFutureSalts = FutureSalts; + export type TypePong = Pong; + export type TypeDestroySessionRes = DestroySessionOk | DestroySessionNone; + export type TypeNewSession = NewSessionCreated; + export type TypeHttpWait = HttpWait; + export type TypeIpPort = IpPort | IpPortSecret; + export type TypeAccessPointRule = AccessPointRule; + export type TypeTlsClientHello = TlsClientHello; + export type TypeTlsBlock = TlsBlockString | TlsBlockRandom | TlsBlockZero | TlsBlockDomain | TlsBlockGrease | TlsBlockScope; + + + export namespace storage { + export type TypeFileType = storage.FileUnknown | storage.FilePartial | storage.FileJpeg | storage.FileGif | storage.FilePng | storage.FilePdf | storage.FileMp3 | storage.FileMov | storage.FileMp4 | storage.FileWebp; + } + + export namespace auth { + export type TypeSentCode = auth.SentCode; + export type TypeAuthorization = auth.Authorization | auth.AuthorizationSignUpRequired; + export type TypeExportedAuthorization = auth.ExportedAuthorization; + export type TypePasswordRecovery = auth.PasswordRecovery; + export type TypeCodeType = auth.CodeTypeSms | auth.CodeTypeCall | auth.CodeTypeFlashCall; + export type TypeSentCodeType = auth.SentCodeTypeApp | auth.SentCodeTypeSms | auth.SentCodeTypeCall | auth.SentCodeTypeFlashCall; + export type TypeLoginToken = auth.LoginToken | auth.LoginTokenMigrateTo | auth.LoginTokenSuccess; + } + + export namespace contacts { + export type TypeContacts = contacts.ContactsNotModified | contacts.Contacts; + export type TypeImportedContacts = contacts.ImportedContacts; + export type TypeBlocked = contacts.Blocked | contacts.BlockedSlice; + export type TypeFound = contacts.Found; + export type TypeResolvedPeer = contacts.ResolvedPeer; + export type TypeTopPeers = contacts.TopPeersNotModified | contacts.TopPeers | contacts.TopPeersDisabled; + } + + export namespace messages { + export type TypeDialogs = messages.Dialogs | messages.DialogsSlice | messages.DialogsNotModified; + export type TypeMessages = messages.Messages | messages.MessagesSlice | messages.ChannelMessages | messages.MessagesNotModified; + export type TypeChats = messages.Chats | messages.ChatsSlice; + export type TypeChatFull = messages.ChatFull; + export type TypeAffectedHistory = messages.AffectedHistory; + export type TypeDhConfig = messages.DhConfigNotModified | messages.DhConfig; + export type TypeSentEncryptedMessage = messages.SentEncryptedMessage | messages.SentEncryptedFile; + export type TypeStickers = messages.StickersNotModified | messages.Stickers; + export type TypeAllStickers = messages.AllStickersNotModified | messages.AllStickers; + export type TypeAffectedMessages = messages.AffectedMessages; + export type TypeStickerSet = messages.StickerSet; + export type TypeSavedGifs = messages.SavedGifsNotModified | messages.SavedGifs; + export type TypeBotResults = messages.BotResults; + export type TypeBotCallbackAnswer = messages.BotCallbackAnswer; + export type TypeMessageEditData = messages.MessageEditData; + export type TypePeerDialogs = messages.PeerDialogs; + export type TypeFeaturedStickers = messages.FeaturedStickersNotModified | messages.FeaturedStickers; + export type TypeRecentStickers = messages.RecentStickersNotModified | messages.RecentStickers; + export type TypeArchivedStickers = messages.ArchivedStickers; + export type TypeStickerSetInstallResult = messages.StickerSetInstallResultSuccess | messages.StickerSetInstallResultArchive; + export type TypeHighScores = messages.HighScores; + export type TypeFavedStickers = messages.FavedStickersNotModified | messages.FavedStickers; + export type TypeFoundStickerSets = messages.FoundStickerSetsNotModified | messages.FoundStickerSets; + export type TypeSearchCounter = messages.SearchCounter; + export type TypeInactiveChats = messages.InactiveChats; + export type TypeVotesList = messages.VotesList; + export type TypeMessageViews = messages.MessageViews; + export type TypeDiscussionMessage = messages.DiscussionMessage; + } + + export namespace updates { + export type TypeState = updates.State; + export type TypeDifference = updates.DifferenceEmpty | updates.Difference | updates.DifferenceSlice | updates.DifferenceTooLong; + export type TypeChannelDifference = updates.ChannelDifferenceEmpty | updates.ChannelDifferenceTooLong | updates.ChannelDifference; + } + + export namespace photos { + export type TypePhotos = photos.Photos | photos.PhotosSlice; + export type TypePhoto = photos.Photo; + } + + export namespace upload { + export type TypeFile = upload.File | upload.FileCdnRedirect; + export type TypeWebFile = upload.WebFile; + export type TypeCdnFile = upload.CdnFileReuploadNeeded | upload.CdnFile; + } + + export namespace help { + export type TypeAppUpdate = help.AppUpdate | help.NoAppUpdate; + export type TypeInviteText = help.InviteText; + export type TypeSupport = help.Support; + export type TypeTermsOfService = help.TermsOfService; + export type TypeRecentMeUrls = help.RecentMeUrls; + export type TypeTermsOfServiceUpdate = help.TermsOfServiceUpdateEmpty | help.TermsOfServiceUpdate; + export type TypeDeepLinkInfo = help.DeepLinkInfoEmpty | help.DeepLinkInfo; + export type TypePassportConfig = help.PassportConfigNotModified | help.PassportConfig; + export type TypeSupportName = help.SupportName; + export type TypeUserInfo = help.UserInfoEmpty | help.UserInfo; + export type TypePromoData = help.PromoDataEmpty | help.PromoData; + export type TypeCountryCode = help.CountryCode; + export type TypeCountry = help.Country; + export type TypeCountriesList = help.CountriesListNotModified | help.CountriesList; + export type TypeConfigSimple = help.ConfigSimple; + } + + export namespace account { + export type TypePrivacyRules = account.PrivacyRules; + export type TypeAuthorizations = account.Authorizations; + export type TypePassword = account.Password; + export type TypePasswordSettings = account.PasswordSettings; + export type TypePasswordInputSettings = account.PasswordInputSettings; + export type TypeTmpPassword = account.TmpPassword; + export type TypeWebAuthorizations = account.WebAuthorizations; + export type TypeAuthorizationForm = account.AuthorizationForm; + export type TypeSentEmailCode = account.SentEmailCode; + export type TypeTakeout = account.Takeout; + export type TypeWallPapers = account.WallPapersNotModified | account.WallPapers; + export type TypeAutoDownloadSettings = account.AutoDownloadSettings; + export type TypeThemes = account.ThemesNotModified | account.Themes; + export type TypeContentSettings = account.ContentSettings; + } + + export namespace channels { + export type TypeChannelParticipants = channels.ChannelParticipants | channels.ChannelParticipantsNotModified; + export type TypeChannelParticipant = channels.ChannelParticipant; + export type TypeAdminLogResults = channels.AdminLogResults; + } + + export namespace payments { + export type TypePaymentForm = payments.PaymentForm; + export type TypeValidatedRequestedInfo = payments.ValidatedRequestedInfo; + export type TypePaymentResult = payments.PaymentResult | payments.PaymentVerificationNeeded; + export type TypePaymentReceipt = payments.PaymentReceipt; + export type TypeSavedInfo = payments.SavedInfo; + export type TypeBankCardData = payments.BankCardData; + } + + export namespace phone { + export type TypePhoneCall = phone.PhoneCall; + } + + export namespace stats { + export type TypeBroadcastStats = stats.BroadcastStats; + export type TypeMegagroupStats = stats.MegagroupStats; + export type TypeMessageStats = stats.MessageStats; + } + + export class InputPeerEmpty extends VirtualClass {}; + export class InputPeerSelf extends VirtualClass {}; + export class InputPeerChat extends VirtualClass<{ + chatId: int; + }> { + chatId: int; + }; + export class InputPeerUser extends VirtualClass<{ + userId: int; + accessHash: long; + }> { + userId: int; + accessHash: long; + }; + export class InputPeerChannel extends VirtualClass<{ + channelId: int; + accessHash: long; + }> { + channelId: int; + accessHash: long; + }; + export class InputPeerUserFromMessage extends VirtualClass<{ + peer: Api.TypeInputPeer; + msgId: int; + userId: int; + }> { + peer: Api.TypeInputPeer; + msgId: int; + userId: int; + }; + export class InputPeerChannelFromMessage extends VirtualClass<{ + peer: Api.TypeInputPeer; + msgId: int; + channelId: int; + }> { + peer: Api.TypeInputPeer; + msgId: int; + channelId: int; + }; + export class InputUserEmpty extends VirtualClass {}; + export class InputUserSelf extends VirtualClass {}; + export class InputUser extends VirtualClass<{ + userId: int; + accessHash: long; + }> { + userId: int; + accessHash: long; + }; + export class InputUserFromMessage extends VirtualClass<{ + peer: Api.TypeInputPeer; + msgId: int; + userId: int; + }> { + peer: Api.TypeInputPeer; + msgId: int; + userId: int; + }; + export class InputPhoneContact extends VirtualClass<{ + clientId: long; + phone: string; + firstName: string; + lastName: string; + }> { + clientId: long; + phone: string; + firstName: string; + lastName: string; + }; + export class InputFile extends VirtualClass<{ + id: long; + parts: int; + name: string; + md5Checksum: string; + }> { + id: long; + parts: int; + name: string; + md5Checksum: string; + }; + export class InputFileBig extends VirtualClass<{ + id: long; + parts: int; + name: string; + }> { + id: long; + parts: int; + name: string; + }; + export class InputMediaEmpty extends VirtualClass {}; + export class InputMediaUploadedPhoto extends VirtualClass<{ + // flags: null; + file: Api.TypeInputFile; + stickers?: Api.TypeInputDocument[]; + ttlSeconds?: int; + }> { + // flags: null; + file: Api.TypeInputFile; + stickers?: Api.TypeInputDocument[]; + ttlSeconds?: int; + }; + export class InputMediaPhoto extends VirtualClass<{ + // flags: null; + id: Api.TypeInputPhoto; + ttlSeconds?: int; + }> { + // flags: null; + id: Api.TypeInputPhoto; + ttlSeconds?: int; + }; + export class InputMediaGeoPoint extends VirtualClass<{ + geoPoint: Api.TypeInputGeoPoint; + }> { + geoPoint: Api.TypeInputGeoPoint; + }; + export class InputMediaContact extends VirtualClass<{ + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + }> { + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + }; + export class InputMediaUploadedDocument extends VirtualClass<{ + // flags: null; + nosoundVideo?: true; + forceFile?: true; + file: Api.TypeInputFile; + thumb?: Api.TypeInputFile; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + stickers?: Api.TypeInputDocument[]; + ttlSeconds?: int; + }> { + // flags: null; + nosoundVideo?: true; + forceFile?: true; + file: Api.TypeInputFile; + thumb?: Api.TypeInputFile; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + stickers?: Api.TypeInputDocument[]; + ttlSeconds?: int; + }; + export class InputMediaDocument extends VirtualClass<{ + // flags: null; + id: Api.TypeInputDocument; + ttlSeconds?: int; + }> { + // flags: null; + id: Api.TypeInputDocument; + ttlSeconds?: int; + }; + export class InputMediaVenue extends VirtualClass<{ + geoPoint: Api.TypeInputGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + }> { + geoPoint: Api.TypeInputGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + }; + export class InputMediaPhotoExternal extends VirtualClass<{ + // flags: null; + url: string; + ttlSeconds?: int; + }> { + // flags: null; + url: string; + ttlSeconds?: int; + }; + export class InputMediaDocumentExternal extends VirtualClass<{ + // flags: null; + url: string; + ttlSeconds?: int; + }> { + // flags: null; + url: string; + ttlSeconds?: int; + }; + export class InputMediaGame extends VirtualClass<{ + id: Api.TypeInputGame; + }> { + id: Api.TypeInputGame; + }; + export class InputMediaInvoice extends VirtualClass<{ + // flags: null; + title: string; + description: string; + photo?: Api.TypeInputWebDocument; + invoice: Api.TypeInvoice; + payload: bytes; + provider: string; + providerData: Api.TypeDataJSON; + startParam: string; + }> { + // flags: null; + title: string; + description: string; + photo?: Api.TypeInputWebDocument; + invoice: Api.TypeInvoice; + payload: bytes; + provider: string; + providerData: Api.TypeDataJSON; + startParam: string; + }; + export class InputMediaGeoLive extends VirtualClass<{ + // flags: null; + stopped?: true; + geoPoint: Api.TypeInputGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + }> { + // flags: null; + stopped?: true; + geoPoint: Api.TypeInputGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + }; + export class InputMediaPoll extends VirtualClass<{ + // flags: null; + poll: Api.TypePoll; + correctAnswers?: bytes[]; + solution?: string; + solutionEntities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + poll: Api.TypePoll; + correctAnswers?: bytes[]; + solution?: string; + solutionEntities?: Api.TypeMessageEntity[]; + }; + export class InputMediaDice extends VirtualClass<{ + emoticon: string; + }> { + emoticon: string; + }; + export class InputChatPhotoEmpty extends VirtualClass {}; + export class InputChatUploadedPhoto extends VirtualClass<{ + // flags: null; + file?: Api.TypeInputFile; + video?: Api.TypeInputFile; + videoStartTs?: double; + } | void> { + // flags: null; + file?: Api.TypeInputFile; + video?: Api.TypeInputFile; + videoStartTs?: double; + }; + export class InputChatPhoto extends VirtualClass<{ + id: Api.TypeInputPhoto; + }> { + id: Api.TypeInputPhoto; + }; + export class InputGeoPointEmpty extends VirtualClass {}; + export class InputGeoPoint extends VirtualClass<{ + // flags: null; + lat: double; + long: double; + accuracyRadius?: int; + }> { + // flags: null; + lat: double; + long: double; + accuracyRadius?: int; + }; + export class InputPhotoEmpty extends VirtualClass {}; + export class InputPhoto extends VirtualClass<{ + id: long; + accessHash: long; + fileReference: bytes; + }> { + id: long; + accessHash: long; + fileReference: bytes; + }; + export class InputFileLocation extends VirtualClass<{ + volumeId: long; + localId: int; + secret: long; + fileReference: bytes; + }> { + volumeId: long; + localId: int; + secret: long; + fileReference: bytes; + }; + export class InputEncryptedFileLocation extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputDocumentFileLocation extends VirtualClass<{ + id: long; + accessHash: long; + fileReference: bytes; + thumbSize: string; + }> { + id: long; + accessHash: long; + fileReference: bytes; + thumbSize: string; + }; + export class InputSecureFileLocation extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputTakeoutFileLocation extends VirtualClass {}; + export class InputPhotoFileLocation extends VirtualClass<{ + id: long; + accessHash: long; + fileReference: bytes; + thumbSize: string; + }> { + id: long; + accessHash: long; + fileReference: bytes; + thumbSize: string; + }; + export class InputPhotoLegacyFileLocation extends VirtualClass<{ + id: long; + accessHash: long; + fileReference: bytes; + volumeId: long; + localId: int; + secret: long; + }> { + id: long; + accessHash: long; + fileReference: bytes; + volumeId: long; + localId: int; + secret: long; + }; + export class InputPeerPhotoFileLocation extends VirtualClass<{ + // flags: null; + big?: true; + peer: Api.TypeInputPeer; + volumeId: long; + localId: int; + }> { + // flags: null; + big?: true; + peer: Api.TypeInputPeer; + volumeId: long; + localId: int; + }; + export class InputStickerSetThumb extends VirtualClass<{ + stickerset: Api.TypeInputStickerSet; + volumeId: long; + localId: int; + }> { + stickerset: Api.TypeInputStickerSet; + volumeId: long; + localId: int; + }; + export class PeerUser extends VirtualClass<{ + userId: int; + }> { + userId: int; + }; + export class PeerChat extends VirtualClass<{ + chatId: int; + }> { + chatId: int; + }; + export class PeerChannel extends VirtualClass<{ + channelId: int; + }> { + channelId: int; + }; + export class UserEmpty extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class User extends VirtualClass<{ + // flags: null; + self?: true; + contact?: true; + mutualContact?: true; + deleted?: true; + bot?: true; + botChatHistory?: true; + botNochats?: true; + verified?: true; + restricted?: true; + min?: true; + botInlineGeo?: true; + support?: true; + scam?: true; + applyMinPhoto?: true; + id: int; + accessHash?: long; + firstName?: string; + lastName?: string; + username?: string; + phone?: string; + photo?: Api.TypeUserProfilePhoto; + status?: Api.TypeUserStatus; + botInfoVersion?: int; + restrictionReason?: Api.TypeRestrictionReason[]; + botInlinePlaceholder?: string; + langCode?: string; + }> { + // flags: null; + self?: true; + contact?: true; + mutualContact?: true; + deleted?: true; + bot?: true; + botChatHistory?: true; + botNochats?: true; + verified?: true; + restricted?: true; + min?: true; + botInlineGeo?: true; + support?: true; + scam?: true; + applyMinPhoto?: true; + id: int; + accessHash?: long; + firstName?: string; + lastName?: string; + username?: string; + phone?: string; + photo?: Api.TypeUserProfilePhoto; + status?: Api.TypeUserStatus; + botInfoVersion?: int; + restrictionReason?: Api.TypeRestrictionReason[]; + botInlinePlaceholder?: string; + langCode?: string; + }; + export class UserProfilePhotoEmpty extends VirtualClass {}; + export class UserProfilePhoto extends VirtualClass<{ + // flags: null; + hasVideo?: true; + photoId: long; + photoSmall: Api.TypeFileLocation; + photoBig: Api.TypeFileLocation; + dcId: int; + }> { + // flags: null; + hasVideo?: true; + photoId: long; + photoSmall: Api.TypeFileLocation; + photoBig: Api.TypeFileLocation; + dcId: int; + }; + export class UserStatusEmpty extends VirtualClass {}; + export class UserStatusOnline extends VirtualClass<{ + expires: int; + }> { + expires: int; + }; + export class UserStatusOffline extends VirtualClass<{ + wasOnline: int; + }> { + wasOnline: int; + }; + export class UserStatusRecently extends VirtualClass {}; + export class UserStatusLastWeek extends VirtualClass {}; + export class UserStatusLastMonth extends VirtualClass {}; + export class ChatEmpty extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class Chat extends VirtualClass<{ + // flags: null; + creator?: true; + kicked?: true; + left?: true; + deactivated?: true; + id: int; + title: string; + photo: Api.TypeChatPhoto; + participantsCount: int; + date: int; + version: int; + migratedTo?: Api.TypeInputChannel; + adminRights?: Api.TypeChatAdminRights; + defaultBannedRights?: Api.TypeChatBannedRights; + }> { + // flags: null; + creator?: true; + kicked?: true; + left?: true; + deactivated?: true; + id: int; + title: string; + photo: Api.TypeChatPhoto; + participantsCount: int; + date: int; + version: int; + migratedTo?: Api.TypeInputChannel; + adminRights?: Api.TypeChatAdminRights; + defaultBannedRights?: Api.TypeChatBannedRights; + }; + export class ChatForbidden extends VirtualClass<{ + id: int; + title: string; + }> { + id: int; + title: string; + }; + export class Channel extends VirtualClass<{ + // flags: null; + creator?: true; + left?: true; + broadcast?: true; + verified?: true; + megagroup?: true; + restricted?: true; + signatures?: true; + min?: true; + scam?: true; + hasLink?: true; + hasGeo?: true; + slowmodeEnabled?: true; + callActive?: true; + id: int; + accessHash?: long; + title: string; + username?: string; + photo: Api.TypeChatPhoto; + date: int; + version: int; + restrictionReason?: Api.TypeRestrictionReason[]; + adminRights?: Api.TypeChatAdminRights; + bannedRights?: Api.TypeChatBannedRights; + defaultBannedRights?: Api.TypeChatBannedRights; + participantsCount?: int; + }> { + // flags: null; + creator?: true; + left?: true; + broadcast?: true; + verified?: true; + megagroup?: true; + restricted?: true; + signatures?: true; + min?: true; + scam?: true; + hasLink?: true; + hasGeo?: true; + slowmodeEnabled?: true; + callActive?: true; + id: int; + accessHash?: long; + title: string; + username?: string; + photo: Api.TypeChatPhoto; + date: int; + version: int; + restrictionReason?: Api.TypeRestrictionReason[]; + adminRights?: Api.TypeChatAdminRights; + bannedRights?: Api.TypeChatBannedRights; + defaultBannedRights?: Api.TypeChatBannedRights; + participantsCount?: int; + }; + export class ChannelForbidden extends VirtualClass<{ + // flags: null; + broadcast?: true; + megagroup?: true; + id: int; + accessHash: long; + title: string; + untilDate?: int; + }> { + // flags: null; + broadcast?: true; + megagroup?: true; + id: int; + accessHash: long; + title: string; + untilDate?: int; + }; + export class ChatFull extends VirtualClass<{ + // flags: null; + canSetUsername?: true; + hasScheduled?: true; + id: int; + about: string; + participants: Api.TypeChatParticipants; + chatPhoto?: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + exportedInvite: Api.TypeExportedChatInvite; + botInfo?: Api.TypeBotInfo[]; + pinnedMsgId?: int; + folderId?: int; + }> { + // flags: null; + canSetUsername?: true; + hasScheduled?: true; + id: int; + about: string; + participants: Api.TypeChatParticipants; + chatPhoto?: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + exportedInvite: Api.TypeExportedChatInvite; + botInfo?: Api.TypeBotInfo[]; + pinnedMsgId?: int; + folderId?: int; + }; + export class ChannelFull extends VirtualClass<{ + // flags: null; + canViewParticipants?: true; + canSetUsername?: true; + canSetStickers?: true; + hiddenPrehistory?: true; + canSetLocation?: true; + hasScheduled?: true; + canViewStats?: true; + blocked?: true; + id: int; + about: string; + participantsCount?: int; + adminsCount?: int; + kickedCount?: int; + bannedCount?: int; + onlineCount?: int; + readInboxMaxId: int; + readOutboxMaxId: int; + unreadCount: int; + chatPhoto: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + exportedInvite: Api.TypeExportedChatInvite; + botInfo: Api.TypeBotInfo[]; + migratedFromChatId?: int; + migratedFromMaxId?: int; + pinnedMsgId?: int; + stickerset?: Api.TypeStickerSet; + availableMinId?: int; + folderId?: int; + linkedChatId?: int; + location?: Api.TypeChannelLocation; + slowmodeSeconds?: int; + slowmodeNextSendDate?: int; + statsDc?: int; + pts: int; + }> { + // flags: null; + canViewParticipants?: true; + canSetUsername?: true; + canSetStickers?: true; + hiddenPrehistory?: true; + canSetLocation?: true; + hasScheduled?: true; + canViewStats?: true; + blocked?: true; + id: int; + about: string; + participantsCount?: int; + adminsCount?: int; + kickedCount?: int; + bannedCount?: int; + onlineCount?: int; + readInboxMaxId: int; + readOutboxMaxId: int; + unreadCount: int; + chatPhoto: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + exportedInvite: Api.TypeExportedChatInvite; + botInfo: Api.TypeBotInfo[]; + migratedFromChatId?: int; + migratedFromMaxId?: int; + pinnedMsgId?: int; + stickerset?: Api.TypeStickerSet; + availableMinId?: int; + folderId?: int; + linkedChatId?: int; + location?: Api.TypeChannelLocation; + slowmodeSeconds?: int; + slowmodeNextSendDate?: int; + statsDc?: int; + pts: int; + }; + export class ChatParticipant extends VirtualClass<{ + userId: int; + inviterId: int; + date: int; + }> { + userId: int; + inviterId: int; + date: int; + }; + export class ChatParticipantCreator extends VirtualClass<{ + userId: int; + }> { + userId: int; + }; + export class ChatParticipantAdmin extends VirtualClass<{ + userId: int; + inviterId: int; + date: int; + }> { + userId: int; + inviterId: int; + date: int; + }; + export class ChatParticipantsForbidden extends VirtualClass<{ + // flags: null; + chatId: int; + selfParticipant?: Api.TypeChatParticipant; + }> { + // flags: null; + chatId: int; + selfParticipant?: Api.TypeChatParticipant; + }; + export class ChatParticipants extends VirtualClass<{ + chatId: int; + participants: Api.TypeChatParticipant[]; + version: int; + }> { + chatId: int; + participants: Api.TypeChatParticipant[]; + version: int; + }; + export class ChatPhotoEmpty extends VirtualClass {}; + export class ChatPhoto extends VirtualClass<{ + // flags: null; + hasVideo?: true; + photoSmall: Api.TypeFileLocation; + photoBig: Api.TypeFileLocation; + dcId: int; + }> { + // flags: null; + hasVideo?: true; + photoSmall: Api.TypeFileLocation; + photoBig: Api.TypeFileLocation; + dcId: int; + }; + export class MessageEmpty extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class Message extends VirtualClass<{ + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + post?: true; + fromScheduled?: true; + legacy?: true; + editHide?: true; + pinned?: true; + id: int; + fromId?: Api.TypePeer; + peerId: Api.TypePeer; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + date: int; + message: string; + media?: Api.TypeMessageMedia; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + views?: int; + forwards?: int; + replies?: Api.TypeMessageReplies; + editDate?: int; + postAuthor?: string; + groupedId?: long; + restrictionReason?: Api.TypeRestrictionReason[]; + }> { + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + post?: true; + fromScheduled?: true; + legacy?: true; + editHide?: true; + pinned?: true; + id: int; + fromId?: Api.TypePeer; + peerId: Api.TypePeer; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + date: int; + message: string; + media?: Api.TypeMessageMedia; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + views?: int; + forwards?: int; + replies?: Api.TypeMessageReplies; + editDate?: int; + postAuthor?: string; + groupedId?: long; + restrictionReason?: Api.TypeRestrictionReason[]; + }; + export class MessageService extends VirtualClass<{ + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + post?: true; + legacy?: true; + id: int; + fromId?: Api.TypePeer; + peerId: Api.TypePeer; + replyTo?: Api.TypeMessageReplyHeader; + date: int; + action: Api.TypeMessageAction; + }> { + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + post?: true; + legacy?: true; + id: int; + fromId?: Api.TypePeer; + peerId: Api.TypePeer; + replyTo?: Api.TypeMessageReplyHeader; + date: int; + action: Api.TypeMessageAction; + }; + export class MessageMediaEmpty extends VirtualClass {}; + export class MessageMediaPhoto extends VirtualClass<{ + // flags: null; + photo?: Api.TypePhoto; + ttlSeconds?: int; + } | void> { + // flags: null; + photo?: Api.TypePhoto; + ttlSeconds?: int; + }; + export class MessageMediaGeo extends VirtualClass<{ + geo: Api.TypeGeoPoint; + }> { + geo: Api.TypeGeoPoint; + }; + export class MessageMediaContact extends VirtualClass<{ + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + userId: int; + }> { + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + userId: int; + }; + export class MessageMediaUnsupported extends VirtualClass {}; + export class MessageMediaDocument extends VirtualClass<{ + // flags: null; + document?: Api.TypeDocument; + ttlSeconds?: int; + } | void> { + // flags: null; + document?: Api.TypeDocument; + ttlSeconds?: int; + }; + export class MessageMediaWebPage extends VirtualClass<{ + webpage: Api.TypeWebPage; + }> { + webpage: Api.TypeWebPage; + }; + export class MessageMediaVenue extends VirtualClass<{ + geo: Api.TypeGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + }> { + geo: Api.TypeGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + }; + export class MessageMediaGame extends VirtualClass<{ + game: Api.TypeGame; + }> { + game: Api.TypeGame; + }; + export class MessageMediaInvoice extends VirtualClass<{ + // flags: null; + shippingAddressRequested?: true; + test?: true; + title: string; + description: string; + photo?: Api.TypeWebDocument; + receiptMsgId?: int; + currency: string; + totalAmount: long; + startParam: string; + }> { + // flags: null; + shippingAddressRequested?: true; + test?: true; + title: string; + description: string; + photo?: Api.TypeWebDocument; + receiptMsgId?: int; + currency: string; + totalAmount: long; + startParam: string; + }; + export class MessageMediaGeoLive extends VirtualClass<{ + // flags: null; + geo: Api.TypeGeoPoint; + heading?: int; + period: int; + proximityNotificationRadius?: int; + }> { + // flags: null; + geo: Api.TypeGeoPoint; + heading?: int; + period: int; + proximityNotificationRadius?: int; + }; + export class MessageMediaPoll extends VirtualClass<{ + poll: Api.TypePoll; + results: Api.TypePollResults; + }> { + poll: Api.TypePoll; + results: Api.TypePollResults; + }; + export class MessageMediaDice extends VirtualClass<{ + value: int; + emoticon: string; + }> { + value: int; + emoticon: string; + }; + export class MessageActionEmpty extends VirtualClass {}; + export class MessageActionChatCreate extends VirtualClass<{ + title: string; + users: int[]; + }> { + title: string; + users: int[]; + }; + export class MessageActionChatEditTitle extends VirtualClass<{ + title: string; + }> { + title: string; + }; + export class MessageActionChatEditPhoto extends VirtualClass<{ + photo: Api.TypePhoto; + }> { + photo: Api.TypePhoto; + }; + export class MessageActionChatDeletePhoto extends VirtualClass {}; + export class MessageActionChatAddUser extends VirtualClass<{ + users: int[]; + }> { + users: int[]; + }; + export class MessageActionChatDeleteUser extends VirtualClass<{ + userId: int; + }> { + userId: int; + }; + export class MessageActionChatJoinedByLink extends VirtualClass<{ + inviterId: int; + }> { + inviterId: int; + }; + export class MessageActionChannelCreate extends VirtualClass<{ + title: string; + }> { + title: string; + }; + export class MessageActionChatMigrateTo extends VirtualClass<{ + channelId: int; + }> { + channelId: int; + }; + export class MessageActionChannelMigrateFrom extends VirtualClass<{ + title: string; + chatId: int; + }> { + title: string; + chatId: int; + }; + export class MessageActionPinMessage extends VirtualClass {}; + export class MessageActionHistoryClear extends VirtualClass {}; + export class MessageActionGameScore extends VirtualClass<{ + gameId: long; + score: int; + }> { + gameId: long; + score: int; + }; + export class MessageActionPaymentSentMe extends VirtualClass<{ + // flags: null; + currency: string; + totalAmount: long; + payload: bytes; + info?: Api.TypePaymentRequestedInfo; + shippingOptionId?: string; + charge: Api.TypePaymentCharge; + }> { + // flags: null; + currency: string; + totalAmount: long; + payload: bytes; + info?: Api.TypePaymentRequestedInfo; + shippingOptionId?: string; + charge: Api.TypePaymentCharge; + }; + export class MessageActionPaymentSent extends VirtualClass<{ + currency: string; + totalAmount: long; + }> { + currency: string; + totalAmount: long; + }; + export class MessageActionPhoneCall extends VirtualClass<{ + // flags: null; + video?: true; + callId: long; + reason?: Api.TypePhoneCallDiscardReason; + duration?: int; + }> { + // flags: null; + video?: true; + callId: long; + reason?: Api.TypePhoneCallDiscardReason; + duration?: int; + }; + export class MessageActionScreenshotTaken extends VirtualClass {}; + export class MessageActionCustomAction extends VirtualClass<{ + message: string; + }> { + message: string; + }; + export class MessageActionBotAllowed extends VirtualClass<{ + domain: string; + }> { + domain: string; + }; + export class MessageActionSecureValuesSentMe extends VirtualClass<{ + values: Api.TypeSecureValue[]; + credentials: Api.TypeSecureCredentialsEncrypted; + }> { + values: Api.TypeSecureValue[]; + credentials: Api.TypeSecureCredentialsEncrypted; + }; + export class MessageActionSecureValuesSent extends VirtualClass<{ + types: Api.TypeSecureValueType[]; + }> { + types: Api.TypeSecureValueType[]; + }; + export class MessageActionContactSignUp extends VirtualClass {}; + export class MessageActionGeoProximityReached extends VirtualClass<{ + fromId: Api.TypePeer; + toId: Api.TypePeer; + distance: int; + }> { + fromId: Api.TypePeer; + toId: Api.TypePeer; + distance: int; + }; + export class Dialog extends VirtualClass<{ + // flags: null; + pinned?: true; + unreadMark?: true; + peer: Api.TypePeer; + topMessage: int; + readInboxMaxId: int; + readOutboxMaxId: int; + unreadCount: int; + unreadMentionsCount: int; + notifySettings: Api.TypePeerNotifySettings; + pts?: int; + draft?: Api.TypeDraftMessage; + folderId?: int; + }> { + // flags: null; + pinned?: true; + unreadMark?: true; + peer: Api.TypePeer; + topMessage: int; + readInboxMaxId: int; + readOutboxMaxId: int; + unreadCount: int; + unreadMentionsCount: int; + notifySettings: Api.TypePeerNotifySettings; + pts?: int; + draft?: Api.TypeDraftMessage; + folderId?: int; + }; + export class DialogFolder extends VirtualClass<{ + // flags: null; + pinned?: true; + folder: Api.TypeFolder; + peer: Api.TypePeer; + topMessage: int; + unreadMutedPeersCount: int; + unreadUnmutedPeersCount: int; + unreadMutedMessagesCount: int; + unreadUnmutedMessagesCount: int; + }> { + // flags: null; + pinned?: true; + folder: Api.TypeFolder; + peer: Api.TypePeer; + topMessage: int; + unreadMutedPeersCount: int; + unreadUnmutedPeersCount: int; + unreadMutedMessagesCount: int; + unreadUnmutedMessagesCount: int; + }; + export class PhotoEmpty extends VirtualClass<{ + id: long; + }> { + id: long; + }; + export class Photo extends VirtualClass<{ + // flags: null; + hasStickers?: true; + id: long; + accessHash: long; + fileReference: bytes; + date: int; + sizes: Api.TypePhotoSize[]; + videoSizes?: Api.TypeVideoSize[]; + dcId: int; + }> { + // flags: null; + hasStickers?: true; + id: long; + accessHash: long; + fileReference: bytes; + date: int; + sizes: Api.TypePhotoSize[]; + videoSizes?: Api.TypeVideoSize[]; + dcId: int; + }; + export class PhotoSizeEmpty extends VirtualClass<{ + type: string; + }> { + type: string; + }; + export class PhotoSize extends VirtualClass<{ + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + size: int; + }> { + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + size: int; + }; + export class PhotoCachedSize extends VirtualClass<{ + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + bytes: bytes; + }> { + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + bytes: bytes; + }; + export class PhotoStrippedSize extends VirtualClass<{ + type: string; + bytes: bytes; + }> { + type: string; + bytes: bytes; + }; + export class PhotoSizeProgressive extends VirtualClass<{ + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + sizes: int[]; + }> { + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + sizes: int[]; + }; + export class PhotoPathSize extends VirtualClass<{ + type: string; + bytes: bytes; + }> { + type: string; + bytes: bytes; + }; + export class GeoPointEmpty extends VirtualClass {}; + export class GeoPoint extends VirtualClass<{ + // flags: null; + long: double; + lat: double; + accessHash: long; + accuracyRadius?: int; + }> { + // flags: null; + long: double; + lat: double; + accessHash: long; + accuracyRadius?: int; + }; + export class InputNotifyPeer extends VirtualClass<{ + peer: Api.TypeInputPeer; + }> { + peer: Api.TypeInputPeer; + }; + export class InputNotifyUsers extends VirtualClass {}; + export class InputNotifyChats extends VirtualClass {}; + export class InputNotifyBroadcasts extends VirtualClass {}; + export class InputPeerNotifySettings extends VirtualClass<{ + // flags: null; + showPreviews?: Bool; + silent?: Bool; + muteUntil?: int; + sound?: string; + } | void> { + // flags: null; + showPreviews?: Bool; + silent?: Bool; + muteUntil?: int; + sound?: string; + }; + export class PeerNotifySettings extends VirtualClass<{ + // flags: null; + showPreviews?: Bool; + silent?: Bool; + muteUntil?: int; + sound?: string; + } | void> { + // flags: null; + showPreviews?: Bool; + silent?: Bool; + muteUntil?: int; + sound?: string; + }; + export class PeerSettings extends VirtualClass<{ + // flags: null; + reportSpam?: true; + addContact?: true; + blockContact?: true; + shareContact?: true; + needContactsException?: true; + reportGeo?: true; + autoarchived?: true; + geoDistance?: int; + } | void> { + // flags: null; + reportSpam?: true; + addContact?: true; + blockContact?: true; + shareContact?: true; + needContactsException?: true; + reportGeo?: true; + autoarchived?: true; + geoDistance?: int; + }; + export class WallPaper extends VirtualClass<{ + id: long; + // flags: null; + creator?: true; + default?: true; + pattern?: true; + dark?: true; + accessHash: long; + slug: string; + document: Api.TypeDocument; + settings?: Api.TypeWallPaperSettings; + }> { + id: long; + // flags: null; + creator?: true; + default?: true; + pattern?: true; + dark?: true; + accessHash: long; + slug: string; + document: Api.TypeDocument; + settings?: Api.TypeWallPaperSettings; + }; + export class WallPaperNoFile extends VirtualClass<{ + // flags: null; + default?: true; + dark?: true; + settings?: Api.TypeWallPaperSettings; + } | void> { + // flags: null; + default?: true; + dark?: true; + settings?: Api.TypeWallPaperSettings; + }; + export class InputReportReasonSpam extends VirtualClass {}; + export class InputReportReasonViolence extends VirtualClass {}; + export class InputReportReasonPornography extends VirtualClass {}; + export class InputReportReasonChildAbuse extends VirtualClass {}; + export class InputReportReasonOther extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class InputReportReasonCopyright extends VirtualClass {}; + export class InputReportReasonGeoIrrelevant extends VirtualClass {}; + export class UserFull extends VirtualClass<{ + // flags: null; + blocked?: true; + phoneCallsAvailable?: true; + phoneCallsPrivate?: true; + canPinMessage?: true; + hasScheduled?: true; + videoCallsAvailable?: true; + user: Api.TypeUser; + about?: string; + settings: Api.TypePeerSettings; + profilePhoto?: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + botInfo?: Api.TypeBotInfo; + pinnedMsgId?: int; + commonChatsCount: int; + folderId?: int; + }> { + // flags: null; + blocked?: true; + phoneCallsAvailable?: true; + phoneCallsPrivate?: true; + canPinMessage?: true; + hasScheduled?: true; + videoCallsAvailable?: true; + user: Api.TypeUser; + about?: string; + settings: Api.TypePeerSettings; + profilePhoto?: Api.TypePhoto; + notifySettings: Api.TypePeerNotifySettings; + botInfo?: Api.TypeBotInfo; + pinnedMsgId?: int; + commonChatsCount: int; + folderId?: int; + }; + export class Contact extends VirtualClass<{ + userId: int; + mutual: Bool; + }> { + userId: int; + mutual: Bool; + }; + export class ImportedContact extends VirtualClass<{ + userId: int; + clientId: long; + }> { + userId: int; + clientId: long; + }; + export class ContactStatus extends VirtualClass<{ + userId: int; + status: Api.TypeUserStatus; + }> { + userId: int; + status: Api.TypeUserStatus; + }; + export class InputMessagesFilterEmpty extends VirtualClass {}; + export class InputMessagesFilterPhotos extends VirtualClass {}; + export class InputMessagesFilterVideo extends VirtualClass {}; + export class InputMessagesFilterPhotoVideo extends VirtualClass {}; + export class InputMessagesFilterDocument extends VirtualClass {}; + export class InputMessagesFilterUrl extends VirtualClass {}; + export class InputMessagesFilterGif extends VirtualClass {}; + export class InputMessagesFilterVoice extends VirtualClass {}; + export class InputMessagesFilterMusic extends VirtualClass {}; + export class InputMessagesFilterChatPhotos extends VirtualClass {}; + export class InputMessagesFilterPhoneCalls extends VirtualClass<{ + // flags: null; + missed?: true; + } | void> { + // flags: null; + missed?: true; + }; + export class InputMessagesFilterRoundVoice extends VirtualClass {}; + export class InputMessagesFilterRoundVideo extends VirtualClass {}; + export class InputMessagesFilterMyMentions extends VirtualClass {}; + export class InputMessagesFilterGeo extends VirtualClass {}; + export class InputMessagesFilterContacts extends VirtualClass {}; + export class InputMessagesFilterPinned extends VirtualClass {}; + export class UpdateNewMessage extends VirtualClass<{ + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }> { + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }; + export class UpdateMessageID extends VirtualClass<{ + id: int; + randomId: long; + }> { + id: int; + randomId: long; + }; + export class UpdateDeleteMessages extends VirtualClass<{ + messages: int[]; + pts: int; + ptsCount: int; + }> { + messages: int[]; + pts: int; + ptsCount: int; + }; + export class UpdateUserTyping extends VirtualClass<{ + userId: int; + action: Api.TypeSendMessageAction; + }> { + userId: int; + action: Api.TypeSendMessageAction; + }; + export class UpdateChatUserTyping extends VirtualClass<{ + chatId: int; + userId: int; + action: Api.TypeSendMessageAction; + }> { + chatId: int; + userId: int; + action: Api.TypeSendMessageAction; + }; + export class UpdateChatParticipants extends VirtualClass<{ + participants: Api.TypeChatParticipants; + }> { + participants: Api.TypeChatParticipants; + }; + export class UpdateUserStatus extends VirtualClass<{ + userId: int; + status: Api.TypeUserStatus; + }> { + userId: int; + status: Api.TypeUserStatus; + }; + export class UpdateUserName extends VirtualClass<{ + userId: int; + firstName: string; + lastName: string; + username: string; + }> { + userId: int; + firstName: string; + lastName: string; + username: string; + }; + export class UpdateUserPhoto extends VirtualClass<{ + userId: int; + date: int; + photo: Api.TypeUserProfilePhoto; + previous: Bool; + }> { + userId: int; + date: int; + photo: Api.TypeUserProfilePhoto; + previous: Bool; + }; + export class UpdateNewEncryptedMessage extends VirtualClass<{ + message: Api.TypeEncryptedMessage; + qts: int; + }> { + message: Api.TypeEncryptedMessage; + qts: int; + }; + export class UpdateEncryptedChatTyping extends VirtualClass<{ + chatId: int; + }> { + chatId: int; + }; + export class UpdateEncryption extends VirtualClass<{ + chat: Api.TypeEncryptedChat; + date: int; + }> { + chat: Api.TypeEncryptedChat; + date: int; + }; + export class UpdateEncryptedMessagesRead extends VirtualClass<{ + chatId: int; + maxDate: int; + date: int; + }> { + chatId: int; + maxDate: int; + date: int; + }; + export class UpdateChatParticipantAdd extends VirtualClass<{ + chatId: int; + userId: int; + inviterId: int; + date: int; + version: int; + }> { + chatId: int; + userId: int; + inviterId: int; + date: int; + version: int; + }; + export class UpdateChatParticipantDelete extends VirtualClass<{ + chatId: int; + userId: int; + version: int; + }> { + chatId: int; + userId: int; + version: int; + }; + export class UpdateDcOptions extends VirtualClass<{ + dcOptions: Api.TypeDcOption[]; + }> { + dcOptions: Api.TypeDcOption[]; + }; + export class UpdateNotifySettings extends VirtualClass<{ + peer: Api.TypeNotifyPeer; + notifySettings: Api.TypePeerNotifySettings; + }> { + peer: Api.TypeNotifyPeer; + notifySettings: Api.TypePeerNotifySettings; + }; + export class UpdateServiceNotification extends VirtualClass<{ + // flags: null; + popup?: true; + inboxDate?: int; + type: string; + message: string; + media: Api.TypeMessageMedia; + entities: Api.TypeMessageEntity[]; + }> { + // flags: null; + popup?: true; + inboxDate?: int; + type: string; + message: string; + media: Api.TypeMessageMedia; + entities: Api.TypeMessageEntity[]; + }; + export class UpdatePrivacy extends VirtualClass<{ + key: Api.TypePrivacyKey; + rules: Api.TypePrivacyRule[]; + }> { + key: Api.TypePrivacyKey; + rules: Api.TypePrivacyRule[]; + }; + export class UpdateUserPhone extends VirtualClass<{ + userId: int; + phone: string; + }> { + userId: int; + phone: string; + }; + export class UpdateReadHistoryInbox extends VirtualClass<{ + // flags: null; + folderId?: int; + peer: Api.TypePeer; + maxId: int; + stillUnreadCount: int; + pts: int; + ptsCount: int; + }> { + // flags: null; + folderId?: int; + peer: Api.TypePeer; + maxId: int; + stillUnreadCount: int; + pts: int; + ptsCount: int; + }; + export class UpdateReadHistoryOutbox extends VirtualClass<{ + peer: Api.TypePeer; + maxId: int; + pts: int; + ptsCount: int; + }> { + peer: Api.TypePeer; + maxId: int; + pts: int; + ptsCount: int; + }; + export class UpdateWebPage extends VirtualClass<{ + webpage: Api.TypeWebPage; + pts: int; + ptsCount: int; + }> { + webpage: Api.TypeWebPage; + pts: int; + ptsCount: int; + }; + export class UpdateReadMessagesContents extends VirtualClass<{ + messages: int[]; + pts: int; + ptsCount: int; + }> { + messages: int[]; + pts: int; + ptsCount: int; + }; + export class UpdateChannelTooLong extends VirtualClass<{ + // flags: null; + channelId: int; + pts?: int; + }> { + // flags: null; + channelId: int; + pts?: int; + }; + export class UpdateChannel extends VirtualClass<{ + channelId: int; + }> { + channelId: int; + }; + export class UpdateNewChannelMessage extends VirtualClass<{ + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }> { + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }; + export class UpdateReadChannelInbox extends VirtualClass<{ + // flags: null; + folderId?: int; + channelId: int; + maxId: int; + stillUnreadCount: int; + pts: int; + }> { + // flags: null; + folderId?: int; + channelId: int; + maxId: int; + stillUnreadCount: int; + pts: int; + }; + export class UpdateDeleteChannelMessages extends VirtualClass<{ + channelId: int; + messages: int[]; + pts: int; + ptsCount: int; + }> { + channelId: int; + messages: int[]; + pts: int; + ptsCount: int; + }; + export class UpdateChannelMessageViews extends VirtualClass<{ + channelId: int; + id: int; + views: int; + }> { + channelId: int; + id: int; + views: int; + }; + export class UpdateChatParticipantAdmin extends VirtualClass<{ + chatId: int; + userId: int; + isAdmin: Bool; + version: int; + }> { + chatId: int; + userId: int; + isAdmin: Bool; + version: int; + }; + export class UpdateNewStickerSet extends VirtualClass<{ + stickerset: messages.TypeStickerSet; + }> { + stickerset: messages.TypeStickerSet; + }; + export class UpdateStickerSetsOrder extends VirtualClass<{ + // flags: null; + masks?: true; + order: long[]; + }> { + // flags: null; + masks?: true; + order: long[]; + }; + export class UpdateStickerSets extends VirtualClass {}; + export class UpdateSavedGifs extends VirtualClass {}; + export class UpdateBotInlineQuery extends VirtualClass<{ + // flags: null; + queryId: long; + userId: int; + query: string; + geo?: Api.TypeGeoPoint; + offset: string; + }> { + // flags: null; + queryId: long; + userId: int; + query: string; + geo?: Api.TypeGeoPoint; + offset: string; + }; + export class UpdateBotInlineSend extends VirtualClass<{ + // flags: null; + userId: int; + query: string; + geo?: Api.TypeGeoPoint; + id: string; + msgId?: Api.TypeInputBotInlineMessageID; + }> { + // flags: null; + userId: int; + query: string; + geo?: Api.TypeGeoPoint; + id: string; + msgId?: Api.TypeInputBotInlineMessageID; + }; + export class UpdateEditChannelMessage extends VirtualClass<{ + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }> { + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }; + export class UpdateBotCallbackQuery extends VirtualClass<{ + // flags: null; + queryId: long; + userId: int; + peer: Api.TypePeer; + msgId: int; + chatInstance: long; + data?: bytes; + gameShortName?: string; + }> { + // flags: null; + queryId: long; + userId: int; + peer: Api.TypePeer; + msgId: int; + chatInstance: long; + data?: bytes; + gameShortName?: string; + }; + export class UpdateEditMessage extends VirtualClass<{ + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }> { + message: Api.TypeMessage; + pts: int; + ptsCount: int; + }; + export class UpdateInlineBotCallbackQuery extends VirtualClass<{ + // flags: null; + queryId: long; + userId: int; + msgId: Api.TypeInputBotInlineMessageID; + chatInstance: long; + data?: bytes; + gameShortName?: string; + }> { + // flags: null; + queryId: long; + userId: int; + msgId: Api.TypeInputBotInlineMessageID; + chatInstance: long; + data?: bytes; + gameShortName?: string; + }; + export class UpdateReadChannelOutbox extends VirtualClass<{ + channelId: int; + maxId: int; + }> { + channelId: int; + maxId: int; + }; + export class UpdateDraftMessage extends VirtualClass<{ + peer: Api.TypePeer; + draft: Api.TypeDraftMessage; + }> { + peer: Api.TypePeer; + draft: Api.TypeDraftMessage; + }; + export class UpdateReadFeaturedStickers extends VirtualClass {}; + export class UpdateRecentStickers extends VirtualClass {}; + export class UpdateConfig extends VirtualClass {}; + export class UpdatePtsChanged extends VirtualClass {}; + export class UpdateChannelWebPage extends VirtualClass<{ + channelId: int; + webpage: Api.TypeWebPage; + pts: int; + ptsCount: int; + }> { + channelId: int; + webpage: Api.TypeWebPage; + pts: int; + ptsCount: int; + }; + export class UpdateDialogPinned extends VirtualClass<{ + // flags: null; + pinned?: true; + folderId?: int; + peer: Api.TypeDialogPeer; + }> { + // flags: null; + pinned?: true; + folderId?: int; + peer: Api.TypeDialogPeer; + }; + export class UpdatePinnedDialogs extends VirtualClass<{ + // flags: null; + folderId?: int; + order?: Api.TypeDialogPeer[]; + } | void> { + // flags: null; + folderId?: int; + order?: Api.TypeDialogPeer[]; + }; + export class UpdateBotWebhookJSON extends VirtualClass<{ + data: Api.TypeDataJSON; + }> { + data: Api.TypeDataJSON; + }; + export class UpdateBotWebhookJSONQuery extends VirtualClass<{ + queryId: long; + data: Api.TypeDataJSON; + timeout: int; + }> { + queryId: long; + data: Api.TypeDataJSON; + timeout: int; + }; + export class UpdateBotShippingQuery extends VirtualClass<{ + queryId: long; + userId: int; + payload: bytes; + shippingAddress: Api.TypePostAddress; + }> { + queryId: long; + userId: int; + payload: bytes; + shippingAddress: Api.TypePostAddress; + }; + export class UpdateBotPrecheckoutQuery extends VirtualClass<{ + // flags: null; + queryId: long; + userId: int; + payload: bytes; + info?: Api.TypePaymentRequestedInfo; + shippingOptionId?: string; + currency: string; + totalAmount: long; + }> { + // flags: null; + queryId: long; + userId: int; + payload: bytes; + info?: Api.TypePaymentRequestedInfo; + shippingOptionId?: string; + currency: string; + totalAmount: long; + }; + export class UpdatePhoneCall extends VirtualClass<{ + phoneCall: Api.TypePhoneCall; + }> { + phoneCall: Api.TypePhoneCall; + }; + export class UpdateLangPackTooLong extends VirtualClass<{ + langCode: string; + }> { + langCode: string; + }; + export class UpdateLangPack extends VirtualClass<{ + difference: Api.TypeLangPackDifference; + }> { + difference: Api.TypeLangPackDifference; + }; + export class UpdateFavedStickers extends VirtualClass {}; + export class UpdateChannelReadMessagesContents extends VirtualClass<{ + channelId: int; + messages: int[]; + }> { + channelId: int; + messages: int[]; + }; + export class UpdateContactsReset extends VirtualClass {}; + export class UpdateChannelAvailableMessages extends VirtualClass<{ + channelId: int; + availableMinId: int; + }> { + channelId: int; + availableMinId: int; + }; + export class UpdateDialogUnreadMark extends VirtualClass<{ + // flags: null; + unread?: true; + peer: Api.TypeDialogPeer; + }> { + // flags: null; + unread?: true; + peer: Api.TypeDialogPeer; + }; + export class UpdateMessagePoll extends VirtualClass<{ + // flags: null; + pollId: long; + poll?: Api.TypePoll; + results: Api.TypePollResults; + }> { + // flags: null; + pollId: long; + poll?: Api.TypePoll; + results: Api.TypePollResults; + }; + export class UpdateChatDefaultBannedRights extends VirtualClass<{ + peer: Api.TypePeer; + defaultBannedRights: Api.TypeChatBannedRights; + version: int; + }> { + peer: Api.TypePeer; + defaultBannedRights: Api.TypeChatBannedRights; + version: int; + }; + export class UpdateFolderPeers extends VirtualClass<{ + folderPeers: Api.TypeFolderPeer[]; + pts: int; + ptsCount: int; + }> { + folderPeers: Api.TypeFolderPeer[]; + pts: int; + ptsCount: int; + }; + export class UpdatePeerSettings extends VirtualClass<{ + peer: Api.TypePeer; + settings: Api.TypePeerSettings; + }> { + peer: Api.TypePeer; + settings: Api.TypePeerSettings; + }; + export class UpdatePeerLocated extends VirtualClass<{ + peers: Api.TypePeerLocated[]; + }> { + peers: Api.TypePeerLocated[]; + }; + export class UpdateNewScheduledMessage extends VirtualClass<{ + message: Api.TypeMessage; + }> { + message: Api.TypeMessage; + }; + export class UpdateDeleteScheduledMessages extends VirtualClass<{ + peer: Api.TypePeer; + messages: int[]; + }> { + peer: Api.TypePeer; + messages: int[]; + }; + export class UpdateTheme extends VirtualClass<{ + theme: Api.TypeTheme; + }> { + theme: Api.TypeTheme; + }; + export class UpdateGeoLiveViewed extends VirtualClass<{ + peer: Api.TypePeer; + msgId: int; + }> { + peer: Api.TypePeer; + msgId: int; + }; + export class UpdateLoginToken extends VirtualClass {}; + export class UpdateMessagePollVote extends VirtualClass<{ + pollId: long; + userId: int; + options: bytes[]; + }> { + pollId: long; + userId: int; + options: bytes[]; + }; + export class UpdateDialogFilter extends VirtualClass<{ + // flags: null; + id: int; + filter?: Api.TypeDialogFilter; + }> { + // flags: null; + id: int; + filter?: Api.TypeDialogFilter; + }; + export class UpdateDialogFilterOrder extends VirtualClass<{ + order: int[]; + }> { + order: int[]; + }; + export class UpdateDialogFilters extends VirtualClass {}; + export class UpdatePhoneCallSignalingData extends VirtualClass<{ + phoneCallId: long; + data: bytes; + }> { + phoneCallId: long; + data: bytes; + }; + export class UpdateChannelParticipant extends VirtualClass<{ + // flags: null; + channelId: int; + date: int; + userId: int; + prevParticipant?: Api.TypeChannelParticipant; + newParticipant?: Api.TypeChannelParticipant; + qts: int; + }> { + // flags: null; + channelId: int; + date: int; + userId: int; + prevParticipant?: Api.TypeChannelParticipant; + newParticipant?: Api.TypeChannelParticipant; + qts: int; + }; + export class UpdateChannelMessageForwards extends VirtualClass<{ + channelId: int; + id: int; + forwards: int; + }> { + channelId: int; + id: int; + forwards: int; + }; + export class UpdateReadChannelDiscussionInbox extends VirtualClass<{ + // flags: null; + channelId: int; + topMsgId: int; + readMaxId: int; + broadcastId?: int; + broadcastPost?: int; + }> { + // flags: null; + channelId: int; + topMsgId: int; + readMaxId: int; + broadcastId?: int; + broadcastPost?: int; + }; + export class UpdateReadChannelDiscussionOutbox extends VirtualClass<{ + channelId: int; + topMsgId: int; + readMaxId: int; + }> { + channelId: int; + topMsgId: int; + readMaxId: int; + }; + export class UpdatePeerBlocked extends VirtualClass<{ + peerId: Api.TypePeer; + blocked: Bool; + }> { + peerId: Api.TypePeer; + blocked: Bool; + }; + export class UpdateChannelUserTyping extends VirtualClass<{ + // flags: null; + channelId: int; + topMsgId?: int; + userId: int; + action: Api.TypeSendMessageAction; + }> { + // flags: null; + channelId: int; + topMsgId?: int; + userId: int; + action: Api.TypeSendMessageAction; + }; + export class UpdatePinnedMessages extends VirtualClass<{ + // flags: null; + pinned?: true; + peer: Api.TypePeer; + messages: int[]; + pts: int; + ptsCount: int; + }> { + // flags: null; + pinned?: true; + peer: Api.TypePeer; + messages: int[]; + pts: int; + ptsCount: int; + }; + export class UpdatePinnedChannelMessages extends VirtualClass<{ + // flags: null; + pinned?: true; + channelId: int; + messages: int[]; + pts: int; + ptsCount: int; + }> { + // flags: null; + pinned?: true; + channelId: int; + messages: int[]; + pts: int; + ptsCount: int; + }; + export class UpdatesTooLong extends VirtualClass {}; + export class UpdateShortMessage extends VirtualClass<{ + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + id: int; + userId: int; + message: string; + pts: int; + ptsCount: int; + date: int; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + entities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + id: int; + userId: int; + message: string; + pts: int; + ptsCount: int; + date: int; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + entities?: Api.TypeMessageEntity[]; + }; + export class UpdateShortChatMessage extends VirtualClass<{ + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + id: int; + fromId: int; + chatId: int; + message: string; + pts: int; + ptsCount: int; + date: int; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + entities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + out?: true; + mentioned?: true; + mediaUnread?: true; + silent?: true; + id: int; + fromId: int; + chatId: int; + message: string; + pts: int; + ptsCount: int; + date: int; + fwdFrom?: Api.TypeMessageFwdHeader; + viaBotId?: int; + replyTo?: Api.TypeMessageReplyHeader; + entities?: Api.TypeMessageEntity[]; + }; + export class UpdateShort extends VirtualClass<{ + update: Api.TypeUpdate; + date: int; + }> { + update: Api.TypeUpdate; + date: int; + }; + export class UpdatesCombined extends VirtualClass<{ + updates: Api.TypeUpdate[]; + users: Api.TypeUser[]; + chats: Api.TypeChat[]; + date: int; + seqStart: int; + seq: int; + }> { + updates: Api.TypeUpdate[]; + users: Api.TypeUser[]; + chats: Api.TypeChat[]; + date: int; + seqStart: int; + seq: int; + }; + export class Updates extends VirtualClass<{ + updates: Api.TypeUpdate[]; + users: Api.TypeUser[]; + chats: Api.TypeChat[]; + date: int; + seq: int; + }> { + updates: Api.TypeUpdate[]; + users: Api.TypeUser[]; + chats: Api.TypeChat[]; + date: int; + seq: int; + }; + export class UpdateShortSentMessage extends VirtualClass<{ + // flags: null; + out?: true; + id: int; + pts: int; + ptsCount: int; + date: int; + media?: Api.TypeMessageMedia; + entities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + out?: true; + id: int; + pts: int; + ptsCount: int; + date: int; + media?: Api.TypeMessageMedia; + entities?: Api.TypeMessageEntity[]; + }; + export class DcOption extends VirtualClass<{ + // flags: null; + ipv6?: true; + mediaOnly?: true; + tcpoOnly?: true; + cdn?: true; + static?: true; + id: int; + ipAddress: string; + port: int; + secret?: bytes; + }> { + // flags: null; + ipv6?: true; + mediaOnly?: true; + tcpoOnly?: true; + cdn?: true; + static?: true; + id: int; + ipAddress: string; + port: int; + secret?: bytes; + }; + export class Config extends VirtualClass<{ + // flags: null; + phonecallsEnabled?: true; + defaultP2pContacts?: true; + preloadFeaturedStickers?: true; + ignorePhoneEntities?: true; + revokePmInbox?: true; + blockedMode?: true; + pfsEnabled?: true; + date: int; + expires: int; + testMode: Bool; + thisDc: int; + dcOptions: Api.TypeDcOption[]; + dcTxtDomainName: string; + chatSizeMax: int; + megagroupSizeMax: int; + forwardedCountMax: int; + onlineUpdatePeriodMs: int; + offlineBlurTimeoutMs: int; + offlineIdleTimeoutMs: int; + onlineCloudTimeoutMs: int; + notifyCloudDelayMs: int; + notifyDefaultDelayMs: int; + pushChatPeriodMs: int; + pushChatLimit: int; + savedGifsLimit: int; + editTimeLimit: int; + revokeTimeLimit: int; + revokePmTimeLimit: int; + ratingEDecay: int; + stickersRecentLimit: int; + stickersFavedLimit: int; + channelsReadMediaPeriod: int; + tmpSessions?: int; + pinnedDialogsCountMax: int; + pinnedInfolderCountMax: int; + callReceiveTimeoutMs: int; + callRingTimeoutMs: int; + callConnectTimeoutMs: int; + callPacketTimeoutMs: int; + meUrlPrefix: string; + autoupdateUrlPrefix?: string; + gifSearchUsername?: string; + venueSearchUsername?: string; + imgSearchUsername?: string; + staticMapsProvider?: string; + captionLengthMax: int; + messageLengthMax: int; + webfileDcId: int; + suggestedLangCode?: string; + langPackVersion?: int; + baseLangPackVersion?: int; + }> { + // flags: null; + phonecallsEnabled?: true; + defaultP2pContacts?: true; + preloadFeaturedStickers?: true; + ignorePhoneEntities?: true; + revokePmInbox?: true; + blockedMode?: true; + pfsEnabled?: true; + date: int; + expires: int; + testMode: Bool; + thisDc: int; + dcOptions: Api.TypeDcOption[]; + dcTxtDomainName: string; + chatSizeMax: int; + megagroupSizeMax: int; + forwardedCountMax: int; + onlineUpdatePeriodMs: int; + offlineBlurTimeoutMs: int; + offlineIdleTimeoutMs: int; + onlineCloudTimeoutMs: int; + notifyCloudDelayMs: int; + notifyDefaultDelayMs: int; + pushChatPeriodMs: int; + pushChatLimit: int; + savedGifsLimit: int; + editTimeLimit: int; + revokeTimeLimit: int; + revokePmTimeLimit: int; + ratingEDecay: int; + stickersRecentLimit: int; + stickersFavedLimit: int; + channelsReadMediaPeriod: int; + tmpSessions?: int; + pinnedDialogsCountMax: int; + pinnedInfolderCountMax: int; + callReceiveTimeoutMs: int; + callRingTimeoutMs: int; + callConnectTimeoutMs: int; + callPacketTimeoutMs: int; + meUrlPrefix: string; + autoupdateUrlPrefix?: string; + gifSearchUsername?: string; + venueSearchUsername?: string; + imgSearchUsername?: string; + staticMapsProvider?: string; + captionLengthMax: int; + messageLengthMax: int; + webfileDcId: int; + suggestedLangCode?: string; + langPackVersion?: int; + baseLangPackVersion?: int; + }; + export class NearestDc extends VirtualClass<{ + country: string; + thisDc: int; + nearestDc: int; + }> { + country: string; + thisDc: int; + nearestDc: int; + }; + export class EncryptedChatEmpty extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class EncryptedChatWaiting extends VirtualClass<{ + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + }> { + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + }; + export class EncryptedChatRequested extends VirtualClass<{ + // flags: null; + folderId?: int; + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gA: bytes; + }> { + // flags: null; + folderId?: int; + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gA: bytes; + }; + export class EncryptedChat extends VirtualClass<{ + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAOrB: bytes; + keyFingerprint: long; + }> { + id: int; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAOrB: bytes; + keyFingerprint: long; + }; + export class EncryptedChatDiscarded extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class InputEncryptedChat extends VirtualClass<{ + chatId: int; + accessHash: long; + }> { + chatId: int; + accessHash: long; + }; + export class EncryptedFileEmpty extends VirtualClass {}; + export class EncryptedFile extends VirtualClass<{ + id: long; + accessHash: long; + size: int; + dcId: int; + keyFingerprint: int; + }> { + id: long; + accessHash: long; + size: int; + dcId: int; + keyFingerprint: int; + }; + export class InputEncryptedFileEmpty extends VirtualClass {}; + export class InputEncryptedFileUploaded extends VirtualClass<{ + id: long; + parts: int; + md5Checksum: string; + keyFingerprint: int; + }> { + id: long; + parts: int; + md5Checksum: string; + keyFingerprint: int; + }; + export class InputEncryptedFile extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputEncryptedFileBigUploaded extends VirtualClass<{ + id: long; + parts: int; + keyFingerprint: int; + }> { + id: long; + parts: int; + keyFingerprint: int; + }; + export class EncryptedMessage extends VirtualClass<{ + randomId: long; + chatId: int; + date: int; + bytes: bytes; + file: Api.TypeEncryptedFile; + }> { + randomId: long; + chatId: int; + date: int; + bytes: bytes; + file: Api.TypeEncryptedFile; + }; + export class EncryptedMessageService extends VirtualClass<{ + randomId: long; + chatId: int; + date: int; + bytes: bytes; + }> { + randomId: long; + chatId: int; + date: int; + bytes: bytes; + }; + export class InputDocumentEmpty extends VirtualClass {}; + export class InputDocument extends VirtualClass<{ + id: long; + accessHash: long; + fileReference: bytes; + }> { + id: long; + accessHash: long; + fileReference: bytes; + }; + export class DocumentEmpty extends VirtualClass<{ + id: long; + }> { + id: long; + }; + export class Document extends VirtualClass<{ + // flags: null; + id: long; + accessHash: long; + fileReference: bytes; + date: int; + mimeType: string; + size: int; + thumbs?: Api.TypePhotoSize[]; + videoThumbs?: Api.TypeVideoSize[]; + dcId: int; + attributes: Api.TypeDocumentAttribute[]; + }> { + // flags: null; + id: long; + accessHash: long; + fileReference: bytes; + date: int; + mimeType: string; + size: int; + thumbs?: Api.TypePhotoSize[]; + videoThumbs?: Api.TypeVideoSize[]; + dcId: int; + attributes: Api.TypeDocumentAttribute[]; + }; + export class NotifyPeer extends VirtualClass<{ + peer: Api.TypePeer; + }> { + peer: Api.TypePeer; + }; + export class NotifyUsers extends VirtualClass {}; + export class NotifyChats extends VirtualClass {}; + export class NotifyBroadcasts extends VirtualClass {}; + export class SendMessageTypingAction extends VirtualClass {}; + export class SendMessageCancelAction extends VirtualClass {}; + export class SendMessageRecordVideoAction extends VirtualClass {}; + export class SendMessageUploadVideoAction extends VirtualClass<{ + progress: int; + }> { + progress: int; + }; + export class SendMessageRecordAudioAction extends VirtualClass {}; + export class SendMessageUploadAudioAction extends VirtualClass<{ + progress: int; + }> { + progress: int; + }; + export class SendMessageUploadPhotoAction extends VirtualClass<{ + progress: int; + }> { + progress: int; + }; + export class SendMessageUploadDocumentAction extends VirtualClass<{ + progress: int; + }> { + progress: int; + }; + export class SendMessageGeoLocationAction extends VirtualClass {}; + export class SendMessageChooseContactAction extends VirtualClass {}; + export class SendMessageGamePlayAction extends VirtualClass {}; + export class SendMessageRecordRoundAction extends VirtualClass {}; + export class SendMessageUploadRoundAction extends VirtualClass<{ + progress: int; + }> { + progress: int; + }; + export class InputPrivacyKeyStatusTimestamp extends VirtualClass {}; + export class InputPrivacyKeyChatInvite extends VirtualClass {}; + export class InputPrivacyKeyPhoneCall extends VirtualClass {}; + export class InputPrivacyKeyPhoneP2P extends VirtualClass {}; + export class InputPrivacyKeyForwards extends VirtualClass {}; + export class InputPrivacyKeyProfilePhoto extends VirtualClass {}; + export class InputPrivacyKeyPhoneNumber extends VirtualClass {}; + export class InputPrivacyKeyAddedByPhone extends VirtualClass {}; + export class PrivacyKeyStatusTimestamp extends VirtualClass {}; + export class PrivacyKeyChatInvite extends VirtualClass {}; + export class PrivacyKeyPhoneCall extends VirtualClass {}; + export class PrivacyKeyPhoneP2P extends VirtualClass {}; + export class PrivacyKeyForwards extends VirtualClass {}; + export class PrivacyKeyProfilePhoto extends VirtualClass {}; + export class PrivacyKeyPhoneNumber extends VirtualClass {}; + export class PrivacyKeyAddedByPhone extends VirtualClass {}; + export class InputPrivacyValueAllowContacts extends VirtualClass {}; + export class InputPrivacyValueAllowAll extends VirtualClass {}; + export class InputPrivacyValueAllowUsers extends VirtualClass<{ + users: Api.TypeInputUser[]; + }> { + users: Api.TypeInputUser[]; + }; + export class InputPrivacyValueDisallowContacts extends VirtualClass {}; + export class InputPrivacyValueDisallowAll extends VirtualClass {}; + export class InputPrivacyValueDisallowUsers extends VirtualClass<{ + users: Api.TypeInputUser[]; + }> { + users: Api.TypeInputUser[]; + }; + export class InputPrivacyValueAllowChatParticipants extends VirtualClass<{ + chats: int[]; + }> { + chats: int[]; + }; + export class InputPrivacyValueDisallowChatParticipants extends VirtualClass<{ + chats: int[]; + }> { + chats: int[]; + }; + export class PrivacyValueAllowContacts extends VirtualClass {}; + export class PrivacyValueAllowAll extends VirtualClass {}; + export class PrivacyValueAllowUsers extends VirtualClass<{ + users: int[]; + }> { + users: int[]; + }; + export class PrivacyValueDisallowContacts extends VirtualClass {}; + export class PrivacyValueDisallowAll extends VirtualClass {}; + export class PrivacyValueDisallowUsers extends VirtualClass<{ + users: int[]; + }> { + users: int[]; + }; + export class PrivacyValueAllowChatParticipants extends VirtualClass<{ + chats: int[]; + }> { + chats: int[]; + }; + export class PrivacyValueDisallowChatParticipants extends VirtualClass<{ + chats: int[]; + }> { + chats: int[]; + }; + export class AccountDaysTTL extends VirtualClass<{ + days: int; + }> { + days: int; + }; + export class DocumentAttributeImageSize extends VirtualClass<{ + w: int; + h: int; + }> { + w: int; + h: int; + }; + export class DocumentAttributeAnimated extends VirtualClass {}; + export class DocumentAttributeSticker extends VirtualClass<{ + // flags: null; + mask?: true; + alt: string; + stickerset: Api.TypeInputStickerSet; + maskCoords?: Api.TypeMaskCoords; + }> { + // flags: null; + mask?: true; + alt: string; + stickerset: Api.TypeInputStickerSet; + maskCoords?: Api.TypeMaskCoords; + }; + export class DocumentAttributeVideo extends VirtualClass<{ + // flags: null; + roundMessage?: true; + supportsStreaming?: true; + duration: int; + w: int; + h: int; + }> { + // flags: null; + roundMessage?: true; + supportsStreaming?: true; + duration: int; + w: int; + h: int; + }; + export class DocumentAttributeAudio extends VirtualClass<{ + // flags: null; + voice?: true; + duration: int; + title?: string; + performer?: string; + waveform?: bytes; + }> { + // flags: null; + voice?: true; + duration: int; + title?: string; + performer?: string; + waveform?: bytes; + }; + export class DocumentAttributeFilename extends VirtualClass<{ + fileName: string; + }> { + fileName: string; + }; + export class DocumentAttributeHasStickers extends VirtualClass {}; + export class StickerPack extends VirtualClass<{ + emoticon: string; + documents: long[]; + }> { + emoticon: string; + documents: long[]; + }; + export class WebPageEmpty extends VirtualClass<{ + id: long; + }> { + id: long; + }; + export class WebPagePending extends VirtualClass<{ + id: long; + date: int; + }> { + id: long; + date: int; + }; + export class WebPage extends VirtualClass<{ + // flags: null; + id: long; + url: string; + displayUrl: string; + hash: int; + type?: string; + siteName?: string; + title?: string; + description?: string; + photo?: Api.TypePhoto; + embedUrl?: string; + embedType?: string; + embedWidth?: int; + embedHeight?: int; + duration?: int; + author?: string; + document?: Api.TypeDocument; + cachedPage?: Api.TypePage; + attributes?: Api.TypeWebPageAttribute[]; + }> { + // flags: null; + id: long; + url: string; + displayUrl: string; + hash: int; + type?: string; + siteName?: string; + title?: string; + description?: string; + photo?: Api.TypePhoto; + embedUrl?: string; + embedType?: string; + embedWidth?: int; + embedHeight?: int; + duration?: int; + author?: string; + document?: Api.TypeDocument; + cachedPage?: Api.TypePage; + attributes?: Api.TypeWebPageAttribute[]; + }; + export class WebPageNotModified extends VirtualClass<{ + // flags: null; + cachedPageViews?: int; + } | void> { + // flags: null; + cachedPageViews?: int; + }; + export class Authorization extends VirtualClass<{ + // flags: null; + current?: true; + officialApp?: true; + passwordPending?: true; + hash: long; + deviceModel: string; + platform: string; + systemVersion: string; + apiId: int; + appName: string; + appVersion: string; + dateCreated: int; + dateActive: int; + ip: string; + country: string; + region: string; + }> { + // flags: null; + current?: true; + officialApp?: true; + passwordPending?: true; + hash: long; + deviceModel: string; + platform: string; + systemVersion: string; + apiId: int; + appName: string; + appVersion: string; + dateCreated: int; + dateActive: int; + ip: string; + country: string; + region: string; + }; + export class ReceivedNotifyMessage extends VirtualClass<{ + id: int; + // flags: int; + }> { + id: int; + // flags: int; + }; + export class ChatInviteEmpty extends VirtualClass {}; + export class ChatInviteExported extends VirtualClass<{ + link: string; + }> { + link: string; + }; + export class ChatInviteAlready extends VirtualClass<{ + chat: Api.TypeChat; + }> { + chat: Api.TypeChat; + }; + export class ChatInvite extends VirtualClass<{ + // flags: null; + channel?: true; + broadcast?: true; + public?: true; + megagroup?: true; + title: string; + photo: Api.TypePhoto; + participantsCount: int; + participants?: Api.TypeUser[]; + }> { + // flags: null; + channel?: true; + broadcast?: true; + public?: true; + megagroup?: true; + title: string; + photo: Api.TypePhoto; + participantsCount: int; + participants?: Api.TypeUser[]; + }; + export class ChatInvitePeek extends VirtualClass<{ + chat: Api.TypeChat; + expires: int; + }> { + chat: Api.TypeChat; + expires: int; + }; + export class InputStickerSetEmpty extends VirtualClass {}; + export class InputStickerSetID extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputStickerSetShortName extends VirtualClass<{ + shortName: string; + }> { + shortName: string; + }; + export class InputStickerSetAnimatedEmoji extends VirtualClass {}; + export class InputStickerSetDice extends VirtualClass<{ + emoticon: string; + }> { + emoticon: string; + }; + export class StickerSet extends VirtualClass<{ + // flags: null; + archived?: true; + official?: true; + masks?: true; + animated?: true; + installedDate?: int; + id: long; + accessHash: long; + title: string; + shortName: string; + thumb?: Api.TypePhotoSize; + thumbDcId?: int; + count: int; + hash: int; + }> { + // flags: null; + archived?: true; + official?: true; + masks?: true; + animated?: true; + installedDate?: int; + id: long; + accessHash: long; + title: string; + shortName: string; + thumb?: Api.TypePhotoSize; + thumbDcId?: int; + count: int; + hash: int; + }; + export class BotCommand extends VirtualClass<{ + command: string; + description: string; + }> { + command: string; + description: string; + }; + export class BotInfo extends VirtualClass<{ + userId: int; + description: string; + commands: Api.TypeBotCommand[]; + }> { + userId: int; + description: string; + commands: Api.TypeBotCommand[]; + }; + export class KeyboardButton extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class KeyboardButtonUrl extends VirtualClass<{ + text: string; + url: string; + }> { + text: string; + url: string; + }; + export class KeyboardButtonCallback extends VirtualClass<{ + // flags: null; + requiresPassword?: true; + text: string; + data: bytes; + }> { + // flags: null; + requiresPassword?: true; + text: string; + data: bytes; + }; + export class KeyboardButtonRequestPhone extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class KeyboardButtonRequestGeoLocation extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class KeyboardButtonSwitchInline extends VirtualClass<{ + // flags: null; + samePeer?: true; + text: string; + query: string; + }> { + // flags: null; + samePeer?: true; + text: string; + query: string; + }; + export class KeyboardButtonGame extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class KeyboardButtonBuy extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class KeyboardButtonUrlAuth extends VirtualClass<{ + // flags: null; + text: string; + fwdText?: string; + url: string; + buttonId: int; + }> { + // flags: null; + text: string; + fwdText?: string; + url: string; + buttonId: int; + }; + export class InputKeyboardButtonUrlAuth extends VirtualClass<{ + // flags: null; + requestWriteAccess?: true; + text: string; + fwdText?: string; + url: string; + bot: Api.TypeInputUser; + }> { + // flags: null; + requestWriteAccess?: true; + text: string; + fwdText?: string; + url: string; + bot: Api.TypeInputUser; + }; + export class KeyboardButtonRequestPoll extends VirtualClass<{ + // flags: null; + quiz?: Bool; + text: string; + }> { + // flags: null; + quiz?: Bool; + text: string; + }; + export class KeyboardButtonRow extends VirtualClass<{ + buttons: Api.TypeKeyboardButton[]; + }> { + buttons: Api.TypeKeyboardButton[]; + }; + export class ReplyKeyboardHide extends VirtualClass<{ + // flags: null; + selective?: true; + } | void> { + // flags: null; + selective?: true; + }; + export class ReplyKeyboardForceReply extends VirtualClass<{ + // flags: null; + singleUse?: true; + selective?: true; + } | void> { + // flags: null; + singleUse?: true; + selective?: true; + }; + export class ReplyKeyboardMarkup extends VirtualClass<{ + // flags: null; + resize?: true; + singleUse?: true; + selective?: true; + rows: Api.TypeKeyboardButtonRow[]; + }> { + // flags: null; + resize?: true; + singleUse?: true; + selective?: true; + rows: Api.TypeKeyboardButtonRow[]; + }; + export class ReplyInlineMarkup extends VirtualClass<{ + rows: Api.TypeKeyboardButtonRow[]; + }> { + rows: Api.TypeKeyboardButtonRow[]; + }; + export class MessageEntityUnknown extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityMention extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityHashtag extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityBotCommand extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityUrl extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityEmail extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityBold extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityItalic extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityCode extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityPre extends VirtualClass<{ + offset: int; + length: int; + language: string; + }> { + offset: int; + length: int; + language: string; + }; + export class MessageEntityTextUrl extends VirtualClass<{ + offset: int; + length: int; + url: string; + }> { + offset: int; + length: int; + url: string; + }; + export class MessageEntityMentionName extends VirtualClass<{ + offset: int; + length: int; + userId: int; + }> { + offset: int; + length: int; + userId: int; + }; + export class InputMessageEntityMentionName extends VirtualClass<{ + offset: int; + length: int; + userId: Api.TypeInputUser; + }> { + offset: int; + length: int; + userId: Api.TypeInputUser; + }; + export class MessageEntityPhone extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityCashtag extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityUnderline extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityStrike extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityBlockquote extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class MessageEntityBankCard extends VirtualClass<{ + offset: int; + length: int; + }> { + offset: int; + length: int; + }; + export class InputChannelEmpty extends VirtualClass {}; + export class InputChannel extends VirtualClass<{ + channelId: int; + accessHash: long; + }> { + channelId: int; + accessHash: long; + }; + export class InputChannelFromMessage extends VirtualClass<{ + peer: Api.TypeInputPeer; + msgId: int; + channelId: int; + }> { + peer: Api.TypeInputPeer; + msgId: int; + channelId: int; + }; + export class MessageRange extends VirtualClass<{ + minId: int; + maxId: int; + }> { + minId: int; + maxId: int; + }; + export class ChannelMessagesFilterEmpty extends VirtualClass {}; + export class ChannelMessagesFilter extends VirtualClass<{ + // flags: null; + excludeNewMessages?: true; + ranges: Api.TypeMessageRange[]; + }> { + // flags: null; + excludeNewMessages?: true; + ranges: Api.TypeMessageRange[]; + }; + export class ChannelParticipant extends VirtualClass<{ + userId: int; + date: int; + }> { + userId: int; + date: int; + }; + export class ChannelParticipantSelf extends VirtualClass<{ + userId: int; + inviterId: int; + date: int; + }> { + userId: int; + inviterId: int; + date: int; + }; + export class ChannelParticipantCreator extends VirtualClass<{ + // flags: null; + userId: int; + adminRights: Api.TypeChatAdminRights; + rank?: string; + }> { + // flags: null; + userId: int; + adminRights: Api.TypeChatAdminRights; + rank?: string; + }; + export class ChannelParticipantAdmin extends VirtualClass<{ + // flags: null; + canEdit?: true; + self?: true; + userId: int; + inviterId?: int; + promotedBy: int; + date: int; + adminRights: Api.TypeChatAdminRights; + rank?: string; + }> { + // flags: null; + canEdit?: true; + self?: true; + userId: int; + inviterId?: int; + promotedBy: int; + date: int; + adminRights: Api.TypeChatAdminRights; + rank?: string; + }; + export class ChannelParticipantBanned extends VirtualClass<{ + // flags: null; + left?: true; + userId: int; + kickedBy: int; + date: int; + bannedRights: Api.TypeChatBannedRights; + }> { + // flags: null; + left?: true; + userId: int; + kickedBy: int; + date: int; + bannedRights: Api.TypeChatBannedRights; + }; + export class ChannelParticipantLeft extends VirtualClass<{ + userId: int; + }> { + userId: int; + }; + export class ChannelParticipantsRecent extends VirtualClass {}; + export class ChannelParticipantsAdmins extends VirtualClass {}; + export class ChannelParticipantsKicked extends VirtualClass<{ + q: string; + }> { + q: string; + }; + export class ChannelParticipantsBots extends VirtualClass {}; + export class ChannelParticipantsBanned extends VirtualClass<{ + q: string; + }> { + q: string; + }; + export class ChannelParticipantsSearch extends VirtualClass<{ + q: string; + }> { + q: string; + }; + export class ChannelParticipantsContacts extends VirtualClass<{ + q: string; + }> { + q: string; + }; + export class ChannelParticipantsMentions extends VirtualClass<{ + // flags: null; + q?: string; + topMsgId?: int; + } | void> { + // flags: null; + q?: string; + topMsgId?: int; + }; + export class InputBotInlineMessageMediaAuto extends VirtualClass<{ + // flags: null; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineMessageText extends VirtualClass<{ + // flags: null; + noWebpage?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + noWebpage?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineMessageMediaGeo extends VirtualClass<{ + // flags: null; + geoPoint: Api.TypeInputGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + geoPoint: Api.TypeInputGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineMessageMediaVenue extends VirtualClass<{ + // flags: null; + geoPoint: Api.TypeInputGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + geoPoint: Api.TypeInputGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineMessageMediaContact extends VirtualClass<{ + // flags: null; + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineMessageGame extends VirtualClass<{ + // flags: null; + replyMarkup?: Api.TypeReplyMarkup; + } | void> { + // flags: null; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class InputBotInlineResult extends VirtualClass<{ + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + url?: string; + thumb?: Api.TypeInputWebDocument; + content?: Api.TypeInputWebDocument; + sendMessage: Api.TypeInputBotInlineMessage; + }> { + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + url?: string; + thumb?: Api.TypeInputWebDocument; + content?: Api.TypeInputWebDocument; + sendMessage: Api.TypeInputBotInlineMessage; + }; + export class InputBotInlineResultPhoto extends VirtualClass<{ + id: string; + type: string; + photo: Api.TypeInputPhoto; + sendMessage: Api.TypeInputBotInlineMessage; + }> { + id: string; + type: string; + photo: Api.TypeInputPhoto; + sendMessage: Api.TypeInputBotInlineMessage; + }; + export class InputBotInlineResultDocument extends VirtualClass<{ + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + document: Api.TypeInputDocument; + sendMessage: Api.TypeInputBotInlineMessage; + }> { + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + document: Api.TypeInputDocument; + sendMessage: Api.TypeInputBotInlineMessage; + }; + export class InputBotInlineResultGame extends VirtualClass<{ + id: string; + shortName: string; + sendMessage: Api.TypeInputBotInlineMessage; + }> { + id: string; + shortName: string; + sendMessage: Api.TypeInputBotInlineMessage; + }; + export class BotInlineMessageMediaAuto extends VirtualClass<{ + // flags: null; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class BotInlineMessageText extends VirtualClass<{ + // flags: null; + noWebpage?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + noWebpage?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class BotInlineMessageMediaGeo extends VirtualClass<{ + // flags: null; + geo: Api.TypeGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + geo: Api.TypeGeoPoint; + heading?: int; + period?: int; + proximityNotificationRadius?: int; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class BotInlineMessageMediaVenue extends VirtualClass<{ + // flags: null; + geo: Api.TypeGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + geo: Api.TypeGeoPoint; + title: string; + address: string; + provider: string; + venueId: string; + venueType: string; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class BotInlineMessageMediaContact extends VirtualClass<{ + // flags: null; + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + replyMarkup?: Api.TypeReplyMarkup; + }> { + // flags: null; + phoneNumber: string; + firstName: string; + lastName: string; + vcard: string; + replyMarkup?: Api.TypeReplyMarkup; + }; + export class BotInlineResult extends VirtualClass<{ + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + url?: string; + thumb?: Api.TypeWebDocument; + content?: Api.TypeWebDocument; + sendMessage: Api.TypeBotInlineMessage; + }> { + // flags: null; + id: string; + type: string; + title?: string; + description?: string; + url?: string; + thumb?: Api.TypeWebDocument; + content?: Api.TypeWebDocument; + sendMessage: Api.TypeBotInlineMessage; + }; + export class BotInlineMediaResult extends VirtualClass<{ + // flags: null; + id: string; + type: string; + photo?: Api.TypePhoto; + document?: Api.TypeDocument; + title?: string; + description?: string; + sendMessage: Api.TypeBotInlineMessage; + }> { + // flags: null; + id: string; + type: string; + photo?: Api.TypePhoto; + document?: Api.TypeDocument; + title?: string; + description?: string; + sendMessage: Api.TypeBotInlineMessage; + }; + export class ExportedMessageLink extends VirtualClass<{ + link: string; + html: string; + }> { + link: string; + html: string; + }; + export class MessageFwdHeader extends VirtualClass<{ + // flags: null; + fromId?: Api.TypePeer; + fromName?: string; + date: int; + channelPost?: int; + postAuthor?: string; + savedFromPeer?: Api.TypePeer; + savedFromMsgId?: int; + psaType?: string; + }> { + // flags: null; + fromId?: Api.TypePeer; + fromName?: string; + date: int; + channelPost?: int; + postAuthor?: string; + savedFromPeer?: Api.TypePeer; + savedFromMsgId?: int; + psaType?: string; + }; + export class InputBotInlineMessageID extends VirtualClass<{ + dcId: int; + id: long; + accessHash: long; + }> { + dcId: int; + id: long; + accessHash: long; + }; + export class InlineBotSwitchPM extends VirtualClass<{ + text: string; + startParam: string; + }> { + text: string; + startParam: string; + }; + export class TopPeer extends VirtualClass<{ + peer: Api.TypePeer; + rating: double; + }> { + peer: Api.TypePeer; + rating: double; + }; + export class TopPeerCategoryBotsPM extends VirtualClass {}; + export class TopPeerCategoryBotsInline extends VirtualClass {}; + export class TopPeerCategoryCorrespondents extends VirtualClass {}; + export class TopPeerCategoryGroups extends VirtualClass {}; + export class TopPeerCategoryChannels extends VirtualClass {}; + export class TopPeerCategoryPhoneCalls extends VirtualClass {}; + export class TopPeerCategoryForwardUsers extends VirtualClass {}; + export class TopPeerCategoryForwardChats extends VirtualClass {}; + export class TopPeerCategoryPeers extends VirtualClass<{ + category: Api.TypeTopPeerCategory; + count: int; + peers: Api.TypeTopPeer[]; + }> { + category: Api.TypeTopPeerCategory; + count: int; + peers: Api.TypeTopPeer[]; + }; + export class DraftMessageEmpty extends VirtualClass<{ + // flags: null; + date?: int; + } | void> { + // flags: null; + date?: int; + }; + export class DraftMessage extends VirtualClass<{ + // flags: null; + noWebpage?: true; + replyToMsgId?: int; + message: string; + entities?: Api.TypeMessageEntity[]; + date: int; + }> { + // flags: null; + noWebpage?: true; + replyToMsgId?: int; + message: string; + entities?: Api.TypeMessageEntity[]; + date: int; + }; + export class StickerSetCovered extends VirtualClass<{ + set: Api.TypeStickerSet; + cover: Api.TypeDocument; + }> { + set: Api.TypeStickerSet; + cover: Api.TypeDocument; + }; + export class StickerSetMultiCovered extends VirtualClass<{ + set: Api.TypeStickerSet; + covers: Api.TypeDocument[]; + }> { + set: Api.TypeStickerSet; + covers: Api.TypeDocument[]; + }; + export class MaskCoords extends VirtualClass<{ + n: int; + x: double; + y: double; + zoom: double; + }> { + n: int; + x: double; + y: double; + zoom: double; + }; + export class InputStickeredMediaPhoto extends VirtualClass<{ + id: Api.TypeInputPhoto; + }> { + id: Api.TypeInputPhoto; + }; + export class InputStickeredMediaDocument extends VirtualClass<{ + id: Api.TypeInputDocument; + }> { + id: Api.TypeInputDocument; + }; + export class Game extends VirtualClass<{ + // flags: null; + id: long; + accessHash: long; + shortName: string; + title: string; + description: string; + photo: Api.TypePhoto; + document?: Api.TypeDocument; + }> { + // flags: null; + id: long; + accessHash: long; + shortName: string; + title: string; + description: string; + photo: Api.TypePhoto; + document?: Api.TypeDocument; + }; + export class InputGameID extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputGameShortName extends VirtualClass<{ + botId: Api.TypeInputUser; + shortName: string; + }> { + botId: Api.TypeInputUser; + shortName: string; + }; + export class HighScore extends VirtualClass<{ + pos: int; + userId: int; + score: int; + }> { + pos: int; + userId: int; + score: int; + }; + export class TextEmpty extends VirtualClass {}; + export class TextPlain extends VirtualClass<{ + text: string; + }> { + text: string; + }; + export class TextBold extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextItalic extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextUnderline extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextStrike extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextFixed extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextUrl extends VirtualClass<{ + text: Api.TypeRichText; + url: string; + webpageId: long; + }> { + text: Api.TypeRichText; + url: string; + webpageId: long; + }; + export class TextEmail extends VirtualClass<{ + text: Api.TypeRichText; + email: string; + }> { + text: Api.TypeRichText; + email: string; + }; + export class TextConcat extends VirtualClass<{ + texts: Api.TypeRichText[]; + }> { + texts: Api.TypeRichText[]; + }; + export class TextSubscript extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextSuperscript extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextMarked extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class TextPhone extends VirtualClass<{ + text: Api.TypeRichText; + phone: string; + }> { + text: Api.TypeRichText; + phone: string; + }; + export class TextImage extends VirtualClass<{ + documentId: long; + w: int; + h: int; + }> { + documentId: long; + w: int; + h: int; + }; + export class TextAnchor extends VirtualClass<{ + text: Api.TypeRichText; + name: string; + }> { + text: Api.TypeRichText; + name: string; + }; + export class PageBlockUnsupported extends VirtualClass {}; + export class PageBlockTitle extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockSubtitle extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockAuthorDate extends VirtualClass<{ + author: Api.TypeRichText; + publishedDate: int; + }> { + author: Api.TypeRichText; + publishedDate: int; + }; + export class PageBlockHeader extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockSubheader extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockParagraph extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockPreformatted extends VirtualClass<{ + text: Api.TypeRichText; + language: string; + }> { + text: Api.TypeRichText; + language: string; + }; + export class PageBlockFooter extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockDivider extends VirtualClass {}; + export class PageBlockAnchor extends VirtualClass<{ + name: string; + }> { + name: string; + }; + export class PageBlockList extends VirtualClass<{ + items: Api.TypePageListItem[]; + }> { + items: Api.TypePageListItem[]; + }; + export class PageBlockBlockquote extends VirtualClass<{ + text: Api.TypeRichText; + caption: Api.TypeRichText; + }> { + text: Api.TypeRichText; + caption: Api.TypeRichText; + }; + export class PageBlockPullquote extends VirtualClass<{ + text: Api.TypeRichText; + caption: Api.TypeRichText; + }> { + text: Api.TypeRichText; + caption: Api.TypeRichText; + }; + export class PageBlockPhoto extends VirtualClass<{ + // flags: null; + photoId: long; + caption: Api.TypePageCaption; + url?: string; + webpageId?: long; + }> { + // flags: null; + photoId: long; + caption: Api.TypePageCaption; + url?: string; + webpageId?: long; + }; + export class PageBlockVideo extends VirtualClass<{ + // flags: null; + autoplay?: true; + loop?: true; + videoId: long; + caption: Api.TypePageCaption; + }> { + // flags: null; + autoplay?: true; + loop?: true; + videoId: long; + caption: Api.TypePageCaption; + }; + export class PageBlockCover extends VirtualClass<{ + cover: Api.TypePageBlock; + }> { + cover: Api.TypePageBlock; + }; + export class PageBlockEmbed extends VirtualClass<{ + // flags: null; + fullWidth?: true; + allowScrolling?: true; + url?: string; + html?: string; + posterPhotoId?: long; + w?: int; + h?: int; + caption: Api.TypePageCaption; + }> { + // flags: null; + fullWidth?: true; + allowScrolling?: true; + url?: string; + html?: string; + posterPhotoId?: long; + w?: int; + h?: int; + caption: Api.TypePageCaption; + }; + export class PageBlockEmbedPost extends VirtualClass<{ + url: string; + webpageId: long; + authorPhotoId: long; + author: string; + date: int; + blocks: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }> { + url: string; + webpageId: long; + authorPhotoId: long; + author: string; + date: int; + blocks: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }; + export class PageBlockCollage extends VirtualClass<{ + items: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }> { + items: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }; + export class PageBlockSlideshow extends VirtualClass<{ + items: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }> { + items: Api.TypePageBlock[]; + caption: Api.TypePageCaption; + }; + export class PageBlockChannel extends VirtualClass<{ + channel: Api.TypeChat; + }> { + channel: Api.TypeChat; + }; + export class PageBlockAudio extends VirtualClass<{ + audioId: long; + caption: Api.TypePageCaption; + }> { + audioId: long; + caption: Api.TypePageCaption; + }; + export class PageBlockKicker extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageBlockTable extends VirtualClass<{ + // flags: null; + bordered?: true; + striped?: true; + title: Api.TypeRichText; + rows: Api.TypePageTableRow[]; + }> { + // flags: null; + bordered?: true; + striped?: true; + title: Api.TypeRichText; + rows: Api.TypePageTableRow[]; + }; + export class PageBlockOrderedList extends VirtualClass<{ + items: Api.TypePageListOrderedItem[]; + }> { + items: Api.TypePageListOrderedItem[]; + }; + export class PageBlockDetails extends VirtualClass<{ + // flags: null; + open?: true; + blocks: Api.TypePageBlock[]; + title: Api.TypeRichText; + }> { + // flags: null; + open?: true; + blocks: Api.TypePageBlock[]; + title: Api.TypeRichText; + }; + export class PageBlockRelatedArticles extends VirtualClass<{ + title: Api.TypeRichText; + articles: Api.TypePageRelatedArticle[]; + }> { + title: Api.TypeRichText; + articles: Api.TypePageRelatedArticle[]; + }; + export class PageBlockMap extends VirtualClass<{ + geo: Api.TypeGeoPoint; + zoom: int; + w: int; + h: int; + caption: Api.TypePageCaption; + }> { + geo: Api.TypeGeoPoint; + zoom: int; + w: int; + h: int; + caption: Api.TypePageCaption; + }; + export class PhoneCallDiscardReasonMissed extends VirtualClass {}; + export class PhoneCallDiscardReasonDisconnect extends VirtualClass {}; + export class PhoneCallDiscardReasonHangup extends VirtualClass {}; + export class PhoneCallDiscardReasonBusy extends VirtualClass {}; + export class DataJSON extends VirtualClass<{ + data: string; + }> { + data: string; + }; + export class LabeledPrice extends VirtualClass<{ + label: string; + amount: long; + }> { + label: string; + amount: long; + }; + export class Invoice extends VirtualClass<{ + // flags: null; + test?: true; + nameRequested?: true; + phoneRequested?: true; + emailRequested?: true; + shippingAddressRequested?: true; + flexible?: true; + phoneToProvider?: true; + emailToProvider?: true; + currency: string; + prices: Api.TypeLabeledPrice[]; + }> { + // flags: null; + test?: true; + nameRequested?: true; + phoneRequested?: true; + emailRequested?: true; + shippingAddressRequested?: true; + flexible?: true; + phoneToProvider?: true; + emailToProvider?: true; + currency: string; + prices: Api.TypeLabeledPrice[]; + }; + export class PaymentCharge extends VirtualClass<{ + id: string; + providerChargeId: string; + }> { + id: string; + providerChargeId: string; + }; + export class PostAddress extends VirtualClass<{ + streetLine1: string; + streetLine2: string; + city: string; + state: string; + countryIso2: string; + postCode: string; + }> { + streetLine1: string; + streetLine2: string; + city: string; + state: string; + countryIso2: string; + postCode: string; + }; + export class PaymentRequestedInfo extends VirtualClass<{ + // flags: null; + name?: string; + phone?: string; + email?: string; + shippingAddress?: Api.TypePostAddress; + } | void> { + // flags: null; + name?: string; + phone?: string; + email?: string; + shippingAddress?: Api.TypePostAddress; + }; + export class PaymentSavedCredentialsCard extends VirtualClass<{ + id: string; + title: string; + }> { + id: string; + title: string; + }; + export class WebDocument extends VirtualClass<{ + url: string; + accessHash: long; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }> { + url: string; + accessHash: long; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }; + export class WebDocumentNoProxy extends VirtualClass<{ + url: string; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }> { + url: string; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }; + export class InputWebDocument extends VirtualClass<{ + url: string; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }> { + url: string; + size: int; + mimeType: string; + attributes: Api.TypeDocumentAttribute[]; + }; + export class InputWebFileLocation extends VirtualClass<{ + url: string; + accessHash: long; + }> { + url: string; + accessHash: long; + }; + export class InputWebFileGeoPointLocation extends VirtualClass<{ + geoPoint: Api.TypeInputGeoPoint; + accessHash: long; + w: int; + h: int; + zoom: int; + scale: int; + }> { + geoPoint: Api.TypeInputGeoPoint; + accessHash: long; + w: int; + h: int; + zoom: int; + scale: int; + }; + export class InputPaymentCredentialsSaved extends VirtualClass<{ + id: string; + tmpPassword: bytes; + }> { + id: string; + tmpPassword: bytes; + }; + export class InputPaymentCredentials extends VirtualClass<{ + // flags: null; + save?: true; + data: Api.TypeDataJSON; + }> { + // flags: null; + save?: true; + data: Api.TypeDataJSON; + }; + export class InputPaymentCredentialsApplePay extends VirtualClass<{ + paymentData: Api.TypeDataJSON; + }> { + paymentData: Api.TypeDataJSON; + }; + export class InputPaymentCredentialsAndroidPay extends VirtualClass<{ + paymentToken: Api.TypeDataJSON; + googleTransactionId: string; + }> { + paymentToken: Api.TypeDataJSON; + googleTransactionId: string; + }; + export class ShippingOption extends VirtualClass<{ + id: string; + title: string; + prices: Api.TypeLabeledPrice[]; + }> { + id: string; + title: string; + prices: Api.TypeLabeledPrice[]; + }; + export class InputStickerSetItem extends VirtualClass<{ + // flags: null; + document: Api.TypeInputDocument; + emoji: string; + maskCoords?: Api.TypeMaskCoords; + }> { + // flags: null; + document: Api.TypeInputDocument; + emoji: string; + maskCoords?: Api.TypeMaskCoords; + }; + export class InputPhoneCall extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class PhoneCallEmpty extends VirtualClass<{ + id: long; + }> { + id: long; + }; + export class PhoneCallWaiting extends VirtualClass<{ + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + protocol: Api.TypePhoneCallProtocol; + receiveDate?: int; + }> { + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + protocol: Api.TypePhoneCallProtocol; + receiveDate?: int; + }; + export class PhoneCallRequested extends VirtualClass<{ + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAHash: bytes; + protocol: Api.TypePhoneCallProtocol; + }> { + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAHash: bytes; + protocol: Api.TypePhoneCallProtocol; + }; + export class PhoneCallAccepted extends VirtualClass<{ + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gB: bytes; + protocol: Api.TypePhoneCallProtocol; + }> { + // flags: null; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gB: bytes; + protocol: Api.TypePhoneCallProtocol; + }; + export class PhoneCall extends VirtualClass<{ + // flags: null; + p2pAllowed?: true; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAOrB: bytes; + keyFingerprint: long; + protocol: Api.TypePhoneCallProtocol; + connections: Api.TypePhoneConnection[]; + startDate: int; + }> { + // flags: null; + p2pAllowed?: true; + video?: true; + id: long; + accessHash: long; + date: int; + adminId: int; + participantId: int; + gAOrB: bytes; + keyFingerprint: long; + protocol: Api.TypePhoneCallProtocol; + connections: Api.TypePhoneConnection[]; + startDate: int; + }; + export class PhoneCallDiscarded extends VirtualClass<{ + // flags: null; + needRating?: true; + needDebug?: true; + video?: true; + id: long; + reason?: Api.TypePhoneCallDiscardReason; + duration?: int; + }> { + // flags: null; + needRating?: true; + needDebug?: true; + video?: true; + id: long; + reason?: Api.TypePhoneCallDiscardReason; + duration?: int; + }; + export class PhoneConnection extends VirtualClass<{ + id: long; + ip: string; + ipv6: string; + port: int; + peerTag: bytes; + }> { + id: long; + ip: string; + ipv6: string; + port: int; + peerTag: bytes; + }; + export class PhoneConnectionWebrtc extends VirtualClass<{ + // flags: null; + turn?: true; + stun?: true; + id: long; + ip: string; + ipv6: string; + port: int; + username: string; + password: string; + }> { + // flags: null; + turn?: true; + stun?: true; + id: long; + ip: string; + ipv6: string; + port: int; + username: string; + password: string; + }; + export class PhoneCallProtocol extends VirtualClass<{ + // flags: null; + udpP2p?: true; + udpReflector?: true; + minLayer: int; + maxLayer: int; + libraryVersions: string[]; + }> { + // flags: null; + udpP2p?: true; + udpReflector?: true; + minLayer: int; + maxLayer: int; + libraryVersions: string[]; + }; + export class CdnPublicKey extends VirtualClass<{ + dcId: int; + publicKey: string; + }> { + dcId: int; + publicKey: string; + }; + export class CdnConfig extends VirtualClass<{ + publicKeys: Api.TypeCdnPublicKey[]; + }> { + publicKeys: Api.TypeCdnPublicKey[]; + }; + export class LangPackString extends VirtualClass<{ + key: string; + value: string; + }> { + key: string; + value: string; + }; + export class LangPackStringPluralized extends VirtualClass<{ + // flags: null; + key: string; + zeroValue?: string; + oneValue?: string; + twoValue?: string; + fewValue?: string; + manyValue?: string; + otherValue: string; + }> { + // flags: null; + key: string; + zeroValue?: string; + oneValue?: string; + twoValue?: string; + fewValue?: string; + manyValue?: string; + otherValue: string; + }; + export class LangPackStringDeleted extends VirtualClass<{ + key: string; + }> { + key: string; + }; + export class LangPackDifference extends VirtualClass<{ + langCode: string; + fromVersion: int; + version: int; + strings: Api.TypeLangPackString[]; + }> { + langCode: string; + fromVersion: int; + version: int; + strings: Api.TypeLangPackString[]; + }; + export class LangPackLanguage extends VirtualClass<{ + // flags: null; + official?: true; + rtl?: true; + beta?: true; + name: string; + nativeName: string; + langCode: string; + baseLangCode?: string; + pluralCode: string; + stringsCount: int; + translatedCount: int; + translationsUrl: string; + }> { + // flags: null; + official?: true; + rtl?: true; + beta?: true; + name: string; + nativeName: string; + langCode: string; + baseLangCode?: string; + pluralCode: string; + stringsCount: int; + translatedCount: int; + translationsUrl: string; + }; + export class ChannelAdminLogEventActionChangeTitle extends VirtualClass<{ + prevValue: string; + newValue: string; + }> { + prevValue: string; + newValue: string; + }; + export class ChannelAdminLogEventActionChangeAbout extends VirtualClass<{ + prevValue: string; + newValue: string; + }> { + prevValue: string; + newValue: string; + }; + export class ChannelAdminLogEventActionChangeUsername extends VirtualClass<{ + prevValue: string; + newValue: string; + }> { + prevValue: string; + newValue: string; + }; + export class ChannelAdminLogEventActionChangePhoto extends VirtualClass<{ + prevPhoto: Api.TypePhoto; + newPhoto: Api.TypePhoto; + }> { + prevPhoto: Api.TypePhoto; + newPhoto: Api.TypePhoto; + }; + export class ChannelAdminLogEventActionToggleInvites extends VirtualClass<{ + newValue: Bool; + }> { + newValue: Bool; + }; + export class ChannelAdminLogEventActionToggleSignatures extends VirtualClass<{ + newValue: Bool; + }> { + newValue: Bool; + }; + export class ChannelAdminLogEventActionUpdatePinned extends VirtualClass<{ + message: Api.TypeMessage; + }> { + message: Api.TypeMessage; + }; + export class ChannelAdminLogEventActionEditMessage extends VirtualClass<{ + prevMessage: Api.TypeMessage; + newMessage: Api.TypeMessage; + }> { + prevMessage: Api.TypeMessage; + newMessage: Api.TypeMessage; + }; + export class ChannelAdminLogEventActionDeleteMessage extends VirtualClass<{ + message: Api.TypeMessage; + }> { + message: Api.TypeMessage; + }; + export class ChannelAdminLogEventActionParticipantJoin extends VirtualClass {}; + export class ChannelAdminLogEventActionParticipantLeave extends VirtualClass {}; + export class ChannelAdminLogEventActionParticipantInvite extends VirtualClass<{ + participant: Api.TypeChannelParticipant; + }> { + participant: Api.TypeChannelParticipant; + }; + export class ChannelAdminLogEventActionParticipantToggleBan extends VirtualClass<{ + prevParticipant: Api.TypeChannelParticipant; + newParticipant: Api.TypeChannelParticipant; + }> { + prevParticipant: Api.TypeChannelParticipant; + newParticipant: Api.TypeChannelParticipant; + }; + export class ChannelAdminLogEventActionParticipantToggleAdmin extends VirtualClass<{ + prevParticipant: Api.TypeChannelParticipant; + newParticipant: Api.TypeChannelParticipant; + }> { + prevParticipant: Api.TypeChannelParticipant; + newParticipant: Api.TypeChannelParticipant; + }; + export class ChannelAdminLogEventActionChangeStickerSet extends VirtualClass<{ + prevStickerset: Api.TypeInputStickerSet; + newStickerset: Api.TypeInputStickerSet; + }> { + prevStickerset: Api.TypeInputStickerSet; + newStickerset: Api.TypeInputStickerSet; + }; + export class ChannelAdminLogEventActionTogglePreHistoryHidden extends VirtualClass<{ + newValue: Bool; + }> { + newValue: Bool; + }; + export class ChannelAdminLogEventActionDefaultBannedRights extends VirtualClass<{ + prevBannedRights: Api.TypeChatBannedRights; + newBannedRights: Api.TypeChatBannedRights; + }> { + prevBannedRights: Api.TypeChatBannedRights; + newBannedRights: Api.TypeChatBannedRights; + }; + export class ChannelAdminLogEventActionStopPoll extends VirtualClass<{ + message: Api.TypeMessage; + }> { + message: Api.TypeMessage; + }; + export class ChannelAdminLogEventActionChangeLinkedChat extends VirtualClass<{ + prevValue: int; + newValue: int; + }> { + prevValue: int; + newValue: int; + }; + export class ChannelAdminLogEventActionChangeLocation extends VirtualClass<{ + prevValue: Api.TypeChannelLocation; + newValue: Api.TypeChannelLocation; + }> { + prevValue: Api.TypeChannelLocation; + newValue: Api.TypeChannelLocation; + }; + export class ChannelAdminLogEventActionToggleSlowMode extends VirtualClass<{ + prevValue: int; + newValue: int; + }> { + prevValue: int; + newValue: int; + }; + export class ChannelAdminLogEvent extends VirtualClass<{ + id: long; + date: int; + userId: int; + action: Api.TypeChannelAdminLogEventAction; + }> { + id: long; + date: int; + userId: int; + action: Api.TypeChannelAdminLogEventAction; + }; + export class ChannelAdminLogEventsFilter extends VirtualClass<{ + // flags: null; + join?: true; + leave?: true; + invite?: true; + ban?: true; + unban?: true; + kick?: true; + unkick?: true; + promote?: true; + demote?: true; + info?: true; + settings?: true; + pinned?: true; + edit?: true; + delete?: true; + } | void> { + // flags: null; + join?: true; + leave?: true; + invite?: true; + ban?: true; + unban?: true; + kick?: true; + unkick?: true; + promote?: true; + demote?: true; + info?: true; + settings?: true; + pinned?: true; + edit?: true; + delete?: true; + }; + export class PopularContact extends VirtualClass<{ + clientId: long; + importers: int; + }> { + clientId: long; + importers: int; + }; + export class RecentMeUrlUnknown extends VirtualClass<{ + url: string; + }> { + url: string; + }; + export class RecentMeUrlUser extends VirtualClass<{ + url: string; + userId: int; + }> { + url: string; + userId: int; + }; + export class RecentMeUrlChat extends VirtualClass<{ + url: string; + chatId: int; + }> { + url: string; + chatId: int; + }; + export class RecentMeUrlChatInvite extends VirtualClass<{ + url: string; + chatInvite: Api.TypeChatInvite; + }> { + url: string; + chatInvite: Api.TypeChatInvite; + }; + export class RecentMeUrlStickerSet extends VirtualClass<{ + url: string; + set: Api.TypeStickerSetCovered; + }> { + url: string; + set: Api.TypeStickerSetCovered; + }; + export class InputSingleMedia extends VirtualClass<{ + // flags: null; + media: Api.TypeInputMedia; + randomId: long; + message: string; + entities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + media: Api.TypeInputMedia; + randomId: long; + message: string; + entities?: Api.TypeMessageEntity[]; + }; + export class WebAuthorization extends VirtualClass<{ + hash: long; + botId: int; + domain: string; + browser: string; + platform: string; + dateCreated: int; + dateActive: int; + ip: string; + region: string; + }> { + hash: long; + botId: int; + domain: string; + browser: string; + platform: string; + dateCreated: int; + dateActive: int; + ip: string; + region: string; + }; + export class InputMessageID extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class InputMessageReplyTo extends VirtualClass<{ + id: int; + }> { + id: int; + }; + export class InputMessagePinned extends VirtualClass {}; + export class InputMessageCallbackQuery extends VirtualClass<{ + id: int; + queryId: long; + }> { + id: int; + queryId: long; + }; + export class InputDialogPeer extends VirtualClass<{ + peer: Api.TypeInputPeer; + }> { + peer: Api.TypeInputPeer; + }; + export class InputDialogPeerFolder extends VirtualClass<{ + folderId: int; + }> { + folderId: int; + }; + export class DialogPeer extends VirtualClass<{ + peer: Api.TypePeer; + }> { + peer: Api.TypePeer; + }; + export class DialogPeerFolder extends VirtualClass<{ + folderId: int; + }> { + folderId: int; + }; + export class FileHash extends VirtualClass<{ + offset: int; + limit: int; + hash: bytes; + }> { + offset: int; + limit: int; + hash: bytes; + }; + export class InputClientProxy extends VirtualClass<{ + address: string; + port: int; + }> { + address: string; + port: int; + }; + export class InputSecureFileUploaded extends VirtualClass<{ + id: long; + parts: int; + md5Checksum: string; + fileHash: bytes; + secret: bytes; + }> { + id: long; + parts: int; + md5Checksum: string; + fileHash: bytes; + secret: bytes; + }; + export class InputSecureFile extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class SecureFileEmpty extends VirtualClass {}; + export class SecureFile extends VirtualClass<{ + id: long; + accessHash: long; + size: int; + dcId: int; + date: int; + fileHash: bytes; + secret: bytes; + }> { + id: long; + accessHash: long; + size: int; + dcId: int; + date: int; + fileHash: bytes; + secret: bytes; + }; + export class SecureData extends VirtualClass<{ + data: bytes; + dataHash: bytes; + secret: bytes; + }> { + data: bytes; + dataHash: bytes; + secret: bytes; + }; + export class SecurePlainPhone extends VirtualClass<{ + phone: string; + }> { + phone: string; + }; + export class SecurePlainEmail extends VirtualClass<{ + email: string; + }> { + email: string; + }; + export class SecureValueTypePersonalDetails extends VirtualClass {}; + export class SecureValueTypePassport extends VirtualClass {}; + export class SecureValueTypeDriverLicense extends VirtualClass {}; + export class SecureValueTypeIdentityCard extends VirtualClass {}; + export class SecureValueTypeInternalPassport extends VirtualClass {}; + export class SecureValueTypeAddress extends VirtualClass {}; + export class SecureValueTypeUtilityBill extends VirtualClass {}; + export class SecureValueTypeBankStatement extends VirtualClass {}; + export class SecureValueTypeRentalAgreement extends VirtualClass {}; + export class SecureValueTypePassportRegistration extends VirtualClass {}; + export class SecureValueTypeTemporaryRegistration extends VirtualClass {}; + export class SecureValueTypePhone extends VirtualClass {}; + export class SecureValueTypeEmail extends VirtualClass {}; + export class SecureValue extends VirtualClass<{ + // flags: null; + type: Api.TypeSecureValueType; + data?: Api.TypeSecureData; + frontSide?: Api.TypeSecureFile; + reverseSide?: Api.TypeSecureFile; + selfie?: Api.TypeSecureFile; + translation?: Api.TypeSecureFile[]; + files?: Api.TypeSecureFile[]; + plainData?: Api.TypeSecurePlainData; + hash: bytes; + }> { + // flags: null; + type: Api.TypeSecureValueType; + data?: Api.TypeSecureData; + frontSide?: Api.TypeSecureFile; + reverseSide?: Api.TypeSecureFile; + selfie?: Api.TypeSecureFile; + translation?: Api.TypeSecureFile[]; + files?: Api.TypeSecureFile[]; + plainData?: Api.TypeSecurePlainData; + hash: bytes; + }; + export class InputSecureValue extends VirtualClass<{ + // flags: null; + type: Api.TypeSecureValueType; + data?: Api.TypeSecureData; + frontSide?: Api.TypeInputSecureFile; + reverseSide?: Api.TypeInputSecureFile; + selfie?: Api.TypeInputSecureFile; + translation?: Api.TypeInputSecureFile[]; + files?: Api.TypeInputSecureFile[]; + plainData?: Api.TypeSecurePlainData; + }> { + // flags: null; + type: Api.TypeSecureValueType; + data?: Api.TypeSecureData; + frontSide?: Api.TypeInputSecureFile; + reverseSide?: Api.TypeInputSecureFile; + selfie?: Api.TypeInputSecureFile; + translation?: Api.TypeInputSecureFile[]; + files?: Api.TypeInputSecureFile[]; + plainData?: Api.TypeSecurePlainData; + }; + export class SecureValueHash extends VirtualClass<{ + type: Api.TypeSecureValueType; + hash: bytes; + }> { + type: Api.TypeSecureValueType; + hash: bytes; + }; + export class SecureValueErrorData extends VirtualClass<{ + type: Api.TypeSecureValueType; + dataHash: bytes; + field: string; + text: string; + }> { + type: Api.TypeSecureValueType; + dataHash: bytes; + field: string; + text: string; + }; + export class SecureValueErrorFrontSide extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }; + export class SecureValueErrorReverseSide extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }; + export class SecureValueErrorSelfie extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }; + export class SecureValueErrorFile extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }; + export class SecureValueErrorFiles extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes[]; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes[]; + text: string; + }; + export class SecureValueError extends VirtualClass<{ + type: Api.TypeSecureValueType; + hash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + hash: bytes; + text: string; + }; + export class SecureValueErrorTranslationFile extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes; + text: string; + }; + export class SecureValueErrorTranslationFiles extends VirtualClass<{ + type: Api.TypeSecureValueType; + fileHash: bytes[]; + text: string; + }> { + type: Api.TypeSecureValueType; + fileHash: bytes[]; + text: string; + }; + export class SecureCredentialsEncrypted extends VirtualClass<{ + data: bytes; + hash: bytes; + secret: bytes; + }> { + data: bytes; + hash: bytes; + secret: bytes; + }; + export class SavedPhoneContact extends VirtualClass<{ + phone: string; + firstName: string; + lastName: string; + date: int; + }> { + phone: string; + firstName: string; + lastName: string; + date: int; + }; + export class PasswordKdfAlgoUnknown extends VirtualClass {}; + export class PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow extends VirtualClass<{ + salt1: bytes; + salt2: bytes; + g: int; + p: bytes; + }> { + salt1: bytes; + salt2: bytes; + g: int; + p: bytes; + }; + export class SecurePasswordKdfAlgoUnknown extends VirtualClass {}; + export class SecurePasswordKdfAlgoPBKDF2HMACSHA512iter100000 extends VirtualClass<{ + salt: bytes; + }> { + salt: bytes; + }; + export class SecurePasswordKdfAlgoSHA512 extends VirtualClass<{ + salt: bytes; + }> { + salt: bytes; + }; + export class SecureSecretSettings extends VirtualClass<{ + secureAlgo: Api.TypeSecurePasswordKdfAlgo; + secureSecret: bytes; + secureSecretId: long; + }> { + secureAlgo: Api.TypeSecurePasswordKdfAlgo; + secureSecret: bytes; + secureSecretId: long; + }; + export class InputCheckPasswordEmpty extends VirtualClass {}; + export class InputCheckPasswordSRP extends VirtualClass<{ + srpId: long; + A: bytes; + M1: bytes; + }> { + srpId: long; + A: bytes; + M1: bytes; + }; + export class SecureRequiredType extends VirtualClass<{ + // flags: null; + nativeNames?: true; + selfieRequired?: true; + translationRequired?: true; + type: Api.TypeSecureValueType; + }> { + // flags: null; + nativeNames?: true; + selfieRequired?: true; + translationRequired?: true; + type: Api.TypeSecureValueType; + }; + export class SecureRequiredTypeOneOf extends VirtualClass<{ + types: Api.TypeSecureRequiredType[]; + }> { + types: Api.TypeSecureRequiredType[]; + }; + export class InputAppEvent extends VirtualClass<{ + time: double; + type: string; + peer: long; + data: Api.TypeJSONValue; + }> { + time: double; + type: string; + peer: long; + data: Api.TypeJSONValue; + }; + export class JsonObjectValue extends VirtualClass<{ + key: string; + value: Api.TypeJSONValue; + }> { + key: string; + value: Api.TypeJSONValue; + }; + export class JsonNull extends VirtualClass {}; + export class JsonBool extends VirtualClass<{ + value: Bool; + }> { + value: Bool; + }; + export class JsonNumber extends VirtualClass<{ + value: double; + }> { + value: double; + }; + export class JsonString extends VirtualClass<{ + value: string; + }> { + value: string; + }; + export class JsonArray extends VirtualClass<{ + value: Api.TypeJSONValue[]; + }> { + value: Api.TypeJSONValue[]; + }; + export class JsonObject extends VirtualClass<{ + value: Api.TypeJSONObjectValue[]; + }> { + value: Api.TypeJSONObjectValue[]; + }; + export class PageTableCell extends VirtualClass<{ + // flags: null; + header?: true; + alignCenter?: true; + alignRight?: true; + valignMiddle?: true; + valignBottom?: true; + text?: Api.TypeRichText; + colspan?: int; + rowspan?: int; + } | void> { + // flags: null; + header?: true; + alignCenter?: true; + alignRight?: true; + valignMiddle?: true; + valignBottom?: true; + text?: Api.TypeRichText; + colspan?: int; + rowspan?: int; + }; + export class PageTableRow extends VirtualClass<{ + cells: Api.TypePageTableCell[]; + }> { + cells: Api.TypePageTableCell[]; + }; + export class PageCaption extends VirtualClass<{ + text: Api.TypeRichText; + credit: Api.TypeRichText; + }> { + text: Api.TypeRichText; + credit: Api.TypeRichText; + }; + export class PageListItemText extends VirtualClass<{ + text: Api.TypeRichText; + }> { + text: Api.TypeRichText; + }; + export class PageListItemBlocks extends VirtualClass<{ + blocks: Api.TypePageBlock[]; + }> { + blocks: Api.TypePageBlock[]; + }; + export class PageListOrderedItemText extends VirtualClass<{ + num: string; + text: Api.TypeRichText; + }> { + num: string; + text: Api.TypeRichText; + }; + export class PageListOrderedItemBlocks extends VirtualClass<{ + num: string; + blocks: Api.TypePageBlock[]; + }> { + num: string; + blocks: Api.TypePageBlock[]; + }; + export class PageRelatedArticle extends VirtualClass<{ + // flags: null; + url: string; + webpageId: long; + title?: string; + description?: string; + photoId?: long; + author?: string; + publishedDate?: int; + }> { + // flags: null; + url: string; + webpageId: long; + title?: string; + description?: string; + photoId?: long; + author?: string; + publishedDate?: int; + }; + export class Page extends VirtualClass<{ + // flags: null; + part?: true; + rtl?: true; + v2?: true; + url: string; + blocks: Api.TypePageBlock[]; + photos: Api.TypePhoto[]; + documents: Api.TypeDocument[]; + views?: int; + }> { + // flags: null; + part?: true; + rtl?: true; + v2?: true; + url: string; + blocks: Api.TypePageBlock[]; + photos: Api.TypePhoto[]; + documents: Api.TypeDocument[]; + views?: int; + }; + export class PollAnswer extends VirtualClass<{ + text: string; + option: bytes; + }> { + text: string; + option: bytes; + }; + export class Poll extends VirtualClass<{ + id: long; + // flags: null; + closed?: true; + publicVoters?: true; + multipleChoice?: true; + quiz?: true; + question: string; + answers: Api.TypePollAnswer[]; + closePeriod?: int; + closeDate?: int; + }> { + id: long; + // flags: null; + closed?: true; + publicVoters?: true; + multipleChoice?: true; + quiz?: true; + question: string; + answers: Api.TypePollAnswer[]; + closePeriod?: int; + closeDate?: int; + }; + export class PollAnswerVoters extends VirtualClass<{ + // flags: null; + chosen?: true; + correct?: true; + option: bytes; + voters: int; + }> { + // flags: null; + chosen?: true; + correct?: true; + option: bytes; + voters: int; + }; + export class PollResults extends VirtualClass<{ + // flags: null; + min?: true; + results?: Api.TypePollAnswerVoters[]; + totalVoters?: int; + recentVoters?: int[]; + solution?: string; + solutionEntities?: Api.TypeMessageEntity[]; + } | void> { + // flags: null; + min?: true; + results?: Api.TypePollAnswerVoters[]; + totalVoters?: int; + recentVoters?: int[]; + solution?: string; + solutionEntities?: Api.TypeMessageEntity[]; + }; + export class ChatOnlines extends VirtualClass<{ + onlines: int; + }> { + onlines: int; + }; + export class StatsURL extends VirtualClass<{ + url: string; + }> { + url: string; + }; + export class ChatAdminRights extends VirtualClass<{ + // flags: null; + changeInfo?: true; + postMessages?: true; + editMessages?: true; + deleteMessages?: true; + banUsers?: true; + inviteUsers?: true; + pinMessages?: true; + addAdmins?: true; + anonymous?: true; + } | void> { + // flags: null; + changeInfo?: true; + postMessages?: true; + editMessages?: true; + deleteMessages?: true; + banUsers?: true; + inviteUsers?: true; + pinMessages?: true; + addAdmins?: true; + anonymous?: true; + }; + export class ChatBannedRights extends VirtualClass<{ + // flags: null; + viewMessages?: true; + sendMessages?: true; + sendMedia?: true; + sendStickers?: true; + sendGifs?: true; + sendGames?: true; + sendInline?: true; + embedLinks?: true; + sendPolls?: true; + changeInfo?: true; + inviteUsers?: true; + pinMessages?: true; + untilDate: int; + }> { + // flags: null; + viewMessages?: true; + sendMessages?: true; + sendMedia?: true; + sendStickers?: true; + sendGifs?: true; + sendGames?: true; + sendInline?: true; + embedLinks?: true; + sendPolls?: true; + changeInfo?: true; + inviteUsers?: true; + pinMessages?: true; + untilDate: int; + }; + export class InputWallPaper extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputWallPaperSlug extends VirtualClass<{ + slug: string; + }> { + slug: string; + }; + export class InputWallPaperNoFile extends VirtualClass {}; + export class CodeSettings extends VirtualClass<{ + // flags: null; + allowFlashcall?: true; + currentNumber?: true; + allowAppHash?: true; + } | void> { + // flags: null; + allowFlashcall?: true; + currentNumber?: true; + allowAppHash?: true; + }; + export class WallPaperSettings extends VirtualClass<{ + // flags: null; + blur?: true; + motion?: true; + backgroundColor?: int; + secondBackgroundColor?: int; + intensity?: int; + rotation?: int; + } | void> { + // flags: null; + blur?: true; + motion?: true; + backgroundColor?: int; + secondBackgroundColor?: int; + intensity?: int; + rotation?: int; + }; + export class AutoDownloadSettings extends VirtualClass<{ + // flags: null; + disabled?: true; + videoPreloadLarge?: true; + audioPreloadNext?: true; + phonecallsLessData?: true; + photoSizeMax: int; + videoSizeMax: int; + fileSizeMax: int; + videoUploadMaxbitrate: int; + }> { + // flags: null; + disabled?: true; + videoPreloadLarge?: true; + audioPreloadNext?: true; + phonecallsLessData?: true; + photoSizeMax: int; + videoSizeMax: int; + fileSizeMax: int; + videoUploadMaxbitrate: int; + }; + export class EmojiKeyword extends VirtualClass<{ + keyword: string; + emoticons: string[]; + }> { + keyword: string; + emoticons: string[]; + }; + export class EmojiKeywordDeleted extends VirtualClass<{ + keyword: string; + emoticons: string[]; + }> { + keyword: string; + emoticons: string[]; + }; + export class EmojiKeywordsDifference extends VirtualClass<{ + langCode: string; + fromVersion: int; + version: int; + keywords: Api.TypeEmojiKeyword[]; + }> { + langCode: string; + fromVersion: int; + version: int; + keywords: Api.TypeEmojiKeyword[]; + }; + export class EmojiURL extends VirtualClass<{ + url: string; + }> { + url: string; + }; + export class EmojiLanguage extends VirtualClass<{ + langCode: string; + }> { + langCode: string; + }; + export class FileLocationToBeDeprecated extends VirtualClass<{ + volumeId: long; + localId: int; + }> { + volumeId: long; + localId: int; + }; + export class Folder extends VirtualClass<{ + // flags: null; + autofillNewBroadcasts?: true; + autofillPublicGroups?: true; + autofillNewCorrespondents?: true; + id: int; + title: string; + photo?: Api.TypeChatPhoto; + }> { + // flags: null; + autofillNewBroadcasts?: true; + autofillPublicGroups?: true; + autofillNewCorrespondents?: true; + id: int; + title: string; + photo?: Api.TypeChatPhoto; + }; + export class InputFolderPeer extends VirtualClass<{ + peer: Api.TypeInputPeer; + folderId: int; + }> { + peer: Api.TypeInputPeer; + folderId: int; + }; + export class FolderPeer extends VirtualClass<{ + peer: Api.TypePeer; + folderId: int; + }> { + peer: Api.TypePeer; + folderId: int; + }; + export class UrlAuthResultRequest extends VirtualClass<{ + // flags: null; + requestWriteAccess?: true; + bot: Api.TypeUser; + domain: string; + }> { + // flags: null; + requestWriteAccess?: true; + bot: Api.TypeUser; + domain: string; + }; + export class UrlAuthResultAccepted extends VirtualClass<{ + url: string; + }> { + url: string; + }; + export class UrlAuthResultDefault extends VirtualClass {}; + export class ChannelLocationEmpty extends VirtualClass {}; + export class ChannelLocation extends VirtualClass<{ + geoPoint: Api.TypeGeoPoint; + address: string; + }> { + geoPoint: Api.TypeGeoPoint; + address: string; + }; + export class PeerLocated extends VirtualClass<{ + peer: Api.TypePeer; + expires: int; + distance: int; + }> { + peer: Api.TypePeer; + expires: int; + distance: int; + }; + export class PeerSelfLocated extends VirtualClass<{ + expires: int; + }> { + expires: int; + }; + export class RestrictionReason extends VirtualClass<{ + platform: string; + reason: string; + text: string; + }> { + platform: string; + reason: string; + text: string; + }; + export class InputTheme extends VirtualClass<{ + id: long; + accessHash: long; + }> { + id: long; + accessHash: long; + }; + export class InputThemeSlug extends VirtualClass<{ + slug: string; + }> { + slug: string; + }; + export class Theme extends VirtualClass<{ + // flags: null; + creator?: true; + default?: true; + id: long; + accessHash: long; + slug: string; + title: string; + document?: Api.TypeDocument; + settings?: Api.TypeThemeSettings; + installsCount: int; + }> { + // flags: null; + creator?: true; + default?: true; + id: long; + accessHash: long; + slug: string; + title: string; + document?: Api.TypeDocument; + settings?: Api.TypeThemeSettings; + installsCount: int; + }; + export class BaseThemeClassic extends VirtualClass {}; + export class BaseThemeDay extends VirtualClass {}; + export class BaseThemeNight extends VirtualClass {}; + export class BaseThemeTinted extends VirtualClass {}; + export class BaseThemeArctic extends VirtualClass {}; + export class InputThemeSettings extends VirtualClass<{ + // flags: null; + baseTheme: Api.TypeBaseTheme; + accentColor: int; + messageTopColor?: int; + messageBottomColor?: int; + wallpaper?: Api.TypeInputWallPaper; + wallpaperSettings?: Api.TypeWallPaperSettings; + }> { + // flags: null; + baseTheme: Api.TypeBaseTheme; + accentColor: int; + messageTopColor?: int; + messageBottomColor?: int; + wallpaper?: Api.TypeInputWallPaper; + wallpaperSettings?: Api.TypeWallPaperSettings; + }; + export class ThemeSettings extends VirtualClass<{ + // flags: null; + baseTheme: Api.TypeBaseTheme; + accentColor: int; + messageTopColor?: int; + messageBottomColor?: int; + wallpaper?: Api.TypeWallPaper; + }> { + // flags: null; + baseTheme: Api.TypeBaseTheme; + accentColor: int; + messageTopColor?: int; + messageBottomColor?: int; + wallpaper?: Api.TypeWallPaper; + }; + export class WebPageAttributeTheme extends VirtualClass<{ + // flags: null; + documents?: Api.TypeDocument[]; + settings?: Api.TypeThemeSettings; + } | void> { + // flags: null; + documents?: Api.TypeDocument[]; + settings?: Api.TypeThemeSettings; + }; + export class MessageUserVote extends VirtualClass<{ + userId: int; + option: bytes; + date: int; + }> { + userId: int; + option: bytes; + date: int; + }; + export class MessageUserVoteInputOption extends VirtualClass<{ + userId: int; + date: int; + }> { + userId: int; + date: int; + }; + export class MessageUserVoteMultiple extends VirtualClass<{ + userId: int; + options: bytes[]; + date: int; + }> { + userId: int; + options: bytes[]; + date: int; + }; + export class BankCardOpenUrl extends VirtualClass<{ + url: string; + name: string; + }> { + url: string; + name: string; + }; + export class DialogFilter extends VirtualClass<{ + // flags: null; + contacts?: true; + nonContacts?: true; + groups?: true; + broadcasts?: true; + bots?: true; + excludeMuted?: true; + excludeRead?: true; + excludeArchived?: true; + id: int; + title: string; + emoticon?: string; + pinnedPeers: Api.TypeInputPeer[]; + includePeers: Api.TypeInputPeer[]; + excludePeers: Api.TypeInputPeer[]; + }> { + // flags: null; + contacts?: true; + nonContacts?: true; + groups?: true; + broadcasts?: true; + bots?: true; + excludeMuted?: true; + excludeRead?: true; + excludeArchived?: true; + id: int; + title: string; + emoticon?: string; + pinnedPeers: Api.TypeInputPeer[]; + includePeers: Api.TypeInputPeer[]; + excludePeers: Api.TypeInputPeer[]; + }; + export class DialogFilterSuggested extends VirtualClass<{ + filter: Api.TypeDialogFilter; + description: string; + }> { + filter: Api.TypeDialogFilter; + description: string; + }; + export class StatsDateRangeDays extends VirtualClass<{ + minDate: int; + maxDate: int; + }> { + minDate: int; + maxDate: int; + }; + export class StatsAbsValueAndPrev extends VirtualClass<{ + current: double; + previous: double; + }> { + current: double; + previous: double; + }; + export class StatsPercentValue extends VirtualClass<{ + part: double; + total: double; + }> { + part: double; + total: double; + }; + export class StatsGraphAsync extends VirtualClass<{ + token: string; + }> { + token: string; + }; + export class StatsGraphError extends VirtualClass<{ + error: string; + }> { + error: string; + }; + export class StatsGraph extends VirtualClass<{ + // flags: null; + json: Api.TypeDataJSON; + zoomToken?: string; + }> { + // flags: null; + json: Api.TypeDataJSON; + zoomToken?: string; + }; + export class MessageInteractionCounters extends VirtualClass<{ + msgId: int; + views: int; + forwards: int; + }> { + msgId: int; + views: int; + forwards: int; + }; + export class VideoSize extends VirtualClass<{ + // flags: null; + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + size: int; + videoStartTs?: double; + }> { + // flags: null; + type: string; + location: Api.TypeFileLocation; + w: int; + h: int; + size: int; + videoStartTs?: double; + }; + export class StatsGroupTopPoster extends VirtualClass<{ + userId: int; + messages: int; + avgChars: int; + }> { + userId: int; + messages: int; + avgChars: int; + }; + export class StatsGroupTopAdmin extends VirtualClass<{ + userId: int; + deleted: int; + kicked: int; + banned: int; + }> { + userId: int; + deleted: int; + kicked: int; + banned: int; + }; + export class StatsGroupTopInviter extends VirtualClass<{ + userId: int; + invitations: int; + }> { + userId: int; + invitations: int; + }; + export class GlobalPrivacySettings extends VirtualClass<{ + // flags: null; + archiveAndMuteNewNoncontactPeers?: Bool; + } | void> { + // flags: null; + archiveAndMuteNewNoncontactPeers?: Bool; + }; + export class MessageViews extends VirtualClass<{ + // flags: null; + views?: int; + forwards?: int; + replies?: Api.TypeMessageReplies; + } | void> { + // flags: null; + views?: int; + forwards?: int; + replies?: Api.TypeMessageReplies; + }; + export class MessageReplyHeader extends VirtualClass<{ + // flags: null; + replyToMsgId: int; + replyToPeerId?: Api.TypePeer; + replyToTopId?: int; + }> { + // flags: null; + replyToMsgId: int; + replyToPeerId?: Api.TypePeer; + replyToTopId?: int; + }; + export class MessageReplies extends VirtualClass<{ + // flags: null; + comments?: true; + replies: int; + repliesPts: int; + recentRepliers?: Api.TypePeer[]; + channelId?: int; + maxId?: int; + readMaxId?: int; + }> { + // flags: null; + comments?: true; + replies: int; + repliesPts: int; + recentRepliers?: Api.TypePeer[]; + channelId?: int; + maxId?: int; + readMaxId?: int; + }; + export class PeerBlocked extends VirtualClass<{ + peerId: Api.TypePeer; + date: int; + }> { + peerId: Api.TypePeer; + date: int; + }; + export class ResPQ extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + pq: bytes; + serverPublicKeyFingerprints: long[]; + }> { + nonce: int128; + serverNonce: int128; + pq: bytes; + serverPublicKeyFingerprints: long[]; + }; + export class PQInnerData extends VirtualClass<{ + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + }> { + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + }; + export class PQInnerDataDc extends VirtualClass<{ + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + dc: int; + }> { + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + dc: int; + }; + export class PQInnerDataTemp extends VirtualClass<{ + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + expiresIn: int; + }> { + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + expiresIn: int; + }; + export class PQInnerDataTempDc extends VirtualClass<{ + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + dc: int; + expiresIn: int; + }> { + pq: bytes; + p: bytes; + q: bytes; + nonce: int128; + serverNonce: int128; + newNonce: int256; + dc: int; + expiresIn: int; + }; + export class ServerDHParamsFail extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + newNonceHash: int128; + }> { + nonce: int128; + serverNonce: int128; + newNonceHash: int128; + }; + export class ServerDHParamsOk extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + encryptedAnswer: bytes; + }> { + nonce: int128; + serverNonce: int128; + encryptedAnswer: bytes; + }; + export class ServerDHInnerData extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + g: int; + dhPrime: bytes; + gA: bytes; + serverTime: int; + }> { + nonce: int128; + serverNonce: int128; + g: int; + dhPrime: bytes; + gA: bytes; + serverTime: int; + }; + export class ClientDHInnerData extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + retryId: long; + gB: bytes; + }> { + nonce: int128; + serverNonce: int128; + retryId: long; + gB: bytes; + }; + export class DhGenOk extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + newNonceHash1: int128; + }> { + nonce: int128; + serverNonce: int128; + newNonceHash1: int128; + }; + export class DhGenRetry extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + newNonceHash2: int128; + }> { + nonce: int128; + serverNonce: int128; + newNonceHash2: int128; + }; + export class DhGenFail extends VirtualClass<{ + nonce: int128; + serverNonce: int128; + newNonceHash3: int128; + }> { + nonce: int128; + serverNonce: int128; + newNonceHash3: int128; + }; + export class DestroyAuthKeyOk extends VirtualClass {}; + export class DestroyAuthKeyNone extends VirtualClass {}; + export class DestroyAuthKeyFail extends VirtualClass {}; + export class MsgsAck extends VirtualClass<{ + msgIds: long[]; + }> { + msgIds: long[]; + }; + export class BadMsgNotification extends VirtualClass<{ + badMsgId: long; + badMsgSeqno: int; + errorCode: int; + }> { + badMsgId: long; + badMsgSeqno: int; + errorCode: int; + }; + export class BadServerSalt extends VirtualClass<{ + badMsgId: long; + badMsgSeqno: int; + errorCode: int; + newServerSalt: long; + }> { + badMsgId: long; + badMsgSeqno: int; + errorCode: int; + newServerSalt: long; + }; + export class MsgsStateReq extends VirtualClass<{ + msgIds: long[]; + }> { + msgIds: long[]; + }; + export class MsgsStateInfo extends VirtualClass<{ + reqMsgId: long; + info: string; + }> { + reqMsgId: long; + info: string; + }; + export class MsgsAllInfo extends VirtualClass<{ + msgIds: long[]; + info: string; + }> { + msgIds: long[]; + info: string; + }; + export class MsgDetailedInfo extends VirtualClass<{ + msgId: long; + answerMsgId: long; + bytes: int; + status: int; + }> { + msgId: long; + answerMsgId: long; + bytes: int; + status: int; + }; + export class MsgNewDetailedInfo extends VirtualClass<{ + answerMsgId: long; + bytes: int; + status: int; + }> { + answerMsgId: long; + bytes: int; + status: int; + }; + export class MsgResendReq extends VirtualClass<{ + msgIds: long[]; + }> { + msgIds: long[]; + }; + export class RpcError extends VirtualClass<{ + errorCode: int; + errorMessage: string; + }> { + errorCode: int; + errorMessage: string; + }; + export class RpcAnswerUnknown extends VirtualClass {}; + export class RpcAnswerDroppedRunning extends VirtualClass {}; + export class RpcAnswerDropped extends VirtualClass<{ + msgId: long; + seqNo: int; + bytes: int; + }> { + msgId: long; + seqNo: int; + bytes: int; + }; + export class FutureSalt extends VirtualClass<{ + validSince: int; + validUntil: int; + salt: long; + }> { + validSince: int; + validUntil: int; + salt: long; + }; + export class FutureSalts extends VirtualClass<{ + reqMsgId: long; + now: int; + salts: future_salt[]; + }> { + reqMsgId: long; + now: int; + salts: future_salt[]; + }; + export class Pong extends VirtualClass<{ + msgId: long; + pingId: long; + }> { + msgId: long; + pingId: long; + }; + export class DestroySessionOk extends VirtualClass<{ + sessionId: long; + }> { + sessionId: long; + }; + export class DestroySessionNone extends VirtualClass<{ + sessionId: long; + }> { + sessionId: long; + }; + export class NewSessionCreated extends VirtualClass<{ + firstMsgId: long; + uniqueId: long; + serverSalt: long; + }> { + firstMsgId: long; + uniqueId: long; + serverSalt: long; + }; + export class HttpWait extends VirtualClass<{ + maxDelay: int; + waitAfter: int; + maxWait: int; + }> { + maxDelay: int; + waitAfter: int; + maxWait: int; + }; + export class IpPort extends VirtualClass<{ + ipv4: int; + port: int; + }> { + ipv4: int; + port: int; + }; + export class IpPortSecret extends VirtualClass<{ + ipv4: int; + port: int; + secret: bytes; + }> { + ipv4: int; + port: int; + secret: bytes; + }; + export class AccessPointRule extends VirtualClass<{ + phonePrefixRules: string; + dcId: int; + ips: Api.TypeIpPort[]; + }> { + phonePrefixRules: string; + dcId: int; + ips: Api.TypeIpPort[]; + }; + export class TlsClientHello extends VirtualClass<{ + blocks: Api.TypeTlsBlock[]; + }> { + blocks: Api.TypeTlsBlock[]; + }; + export class TlsBlockString extends VirtualClass<{ + data: string; + }> { + data: string; + }; + export class TlsBlockRandom extends VirtualClass<{ + length: int; + }> { + length: int; + }; + export class TlsBlockZero extends VirtualClass<{ + length: int; + }> { + length: int; + }; + export class TlsBlockDomain extends VirtualClass {}; + export class TlsBlockGrease extends VirtualClass<{ + seed: int; + }> { + seed: int; + }; + export class TlsBlockScope extends VirtualClass<{ + entries: Api.TypeTlsBlock[]; + }> { + entries: Api.TypeTlsBlock[]; + }; + + + export namespace storage { + export class FileUnknown extends VirtualClass {}; + export class FilePartial extends VirtualClass {}; + export class FileJpeg extends VirtualClass {}; + export class FileGif extends VirtualClass {}; + export class FilePng extends VirtualClass {}; + export class FilePdf extends VirtualClass {}; + export class FileMp3 extends VirtualClass {}; + export class FileMov extends VirtualClass {}; + export class FileMp4 extends VirtualClass {}; + export class FileWebp extends VirtualClass {}; + } + + export namespace auth { + export class SentCode extends VirtualClass<{ + // flags: null; + type: auth.TypeSentCodeType; + phoneCodeHash: string; + nextType?: auth.TypeCodeType; + timeout?: int; + }> { + // flags: null; + type: auth.TypeSentCodeType; + phoneCodeHash: string; + nextType?: auth.TypeCodeType; + timeout?: int; + }; + export class Authorization extends VirtualClass<{ + // flags: null; + tmpSessions?: int; + user: Api.TypeUser; + }> { + // flags: null; + tmpSessions?: int; + user: Api.TypeUser; + }; + export class AuthorizationSignUpRequired extends VirtualClass<{ + // flags: null; + termsOfService?: help.TypeTermsOfService; + } | void> { + // flags: null; + termsOfService?: help.TypeTermsOfService; + }; + export class ExportedAuthorization extends VirtualClass<{ + id: int; + bytes: bytes; + }> { + id: int; + bytes: bytes; + }; + export class PasswordRecovery extends VirtualClass<{ + emailPattern: string; + }> { + emailPattern: string; + }; + export class CodeTypeSms extends VirtualClass {}; + export class CodeTypeCall extends VirtualClass {}; + export class CodeTypeFlashCall extends VirtualClass {}; + export class SentCodeTypeApp extends VirtualClass<{ + length: int; + }> { + length: int; + }; + export class SentCodeTypeSms extends VirtualClass<{ + length: int; + }> { + length: int; + }; + export class SentCodeTypeCall extends VirtualClass<{ + length: int; + }> { + length: int; + }; + export class SentCodeTypeFlashCall extends VirtualClass<{ + pattern: string; + }> { + pattern: string; + }; + export class LoginToken extends VirtualClass<{ + expires: int; + token: bytes; + }> { + expires: int; + token: bytes; + }; + export class LoginTokenMigrateTo extends VirtualClass<{ + dcId: int; + token: bytes; + }> { + dcId: int; + token: bytes; + }; + export class LoginTokenSuccess extends VirtualClass<{ + authorization: auth.TypeAuthorization; + }> { + authorization: auth.TypeAuthorization; + }; + } + + export namespace contacts { + export class ContactsNotModified extends VirtualClass {}; + export class Contacts extends VirtualClass<{ + contacts: Api.TypeContact[]; + savedCount: int; + users: Api.TypeUser[]; + }> { + contacts: Api.TypeContact[]; + savedCount: int; + users: Api.TypeUser[]; + }; + export class ImportedContacts extends VirtualClass<{ + imported: Api.TypeImportedContact[]; + popularInvites: Api.TypePopularContact[]; + retryContacts: long[]; + users: Api.TypeUser[]; + }> { + imported: Api.TypeImportedContact[]; + popularInvites: Api.TypePopularContact[]; + retryContacts: long[]; + users: Api.TypeUser[]; + }; + export class Blocked extends VirtualClass<{ + blocked: Api.TypePeerBlocked[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + blocked: Api.TypePeerBlocked[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class BlockedSlice extends VirtualClass<{ + count: int; + blocked: Api.TypePeerBlocked[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + count: int; + blocked: Api.TypePeerBlocked[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class Found extends VirtualClass<{ + myResults: Api.TypePeer[]; + results: Api.TypePeer[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + myResults: Api.TypePeer[]; + results: Api.TypePeer[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class ResolvedPeer extends VirtualClass<{ + peer: Api.TypePeer; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + peer: Api.TypePeer; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class TopPeersNotModified extends VirtualClass {}; + export class TopPeers extends VirtualClass<{ + categories: Api.TypeTopPeerCategoryPeers[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + categories: Api.TypeTopPeerCategoryPeers[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class TopPeersDisabled extends VirtualClass {}; + } + + export namespace messages { + export class Dialogs extends VirtualClass<{ + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class DialogsSlice extends VirtualClass<{ + count: int; + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + count: int; + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class DialogsNotModified extends VirtualClass<{ + count: int; + }> { + count: int; + }; + export class Messages extends VirtualClass<{ + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class MessagesSlice extends VirtualClass<{ + // flags: null; + inexact?: true; + count: int; + nextRate?: int; + offsetIdOffset?: int; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + // flags: null; + inexact?: true; + count: int; + nextRate?: int; + offsetIdOffset?: int; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class ChannelMessages extends VirtualClass<{ + // flags: null; + inexact?: true; + pts: int; + count: int; + offsetIdOffset?: int; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + // flags: null; + inexact?: true; + pts: int; + count: int; + offsetIdOffset?: int; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class MessagesNotModified extends VirtualClass<{ + count: int; + }> { + count: int; + }; + export class Chats extends VirtualClass<{ + chats: Api.TypeChat[]; + }> { + chats: Api.TypeChat[]; + }; + export class ChatsSlice extends VirtualClass<{ + count: int; + chats: Api.TypeChat[]; + }> { + count: int; + chats: Api.TypeChat[]; + }; + export class ChatFull extends VirtualClass<{ + fullChat: Api.TypeChatFull; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + fullChat: Api.TypeChatFull; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class AffectedHistory extends VirtualClass<{ + pts: int; + ptsCount: int; + offset: int; + }> { + pts: int; + ptsCount: int; + offset: int; + }; + export class DhConfigNotModified extends VirtualClass<{ + random: bytes; + }> { + random: bytes; + }; + export class DhConfig extends VirtualClass<{ + g: int; + p: bytes; + version: int; + random: bytes; + }> { + g: int; + p: bytes; + version: int; + random: bytes; + }; + export class SentEncryptedMessage extends VirtualClass<{ + date: int; + }> { + date: int; + }; + export class SentEncryptedFile extends VirtualClass<{ + date: int; + file: Api.TypeEncryptedFile; + }> { + date: int; + file: Api.TypeEncryptedFile; + }; + export class StickersNotModified extends VirtualClass {}; + export class Stickers extends VirtualClass<{ + hash: int; + stickers: Api.TypeDocument[]; + }> { + hash: int; + stickers: Api.TypeDocument[]; + }; + export class AllStickersNotModified extends VirtualClass {}; + export class AllStickers extends VirtualClass<{ + hash: int; + sets: Api.TypeStickerSet[]; + }> { + hash: int; + sets: Api.TypeStickerSet[]; + }; + export class AffectedMessages extends VirtualClass<{ + pts: int; + ptsCount: int; + }> { + pts: int; + ptsCount: int; + }; + export class StickerSet extends VirtualClass<{ + set: Api.TypeStickerSet; + packs: Api.TypeStickerPack[]; + documents: Api.TypeDocument[]; + }> { + set: Api.TypeStickerSet; + packs: Api.TypeStickerPack[]; + documents: Api.TypeDocument[]; + }; + export class SavedGifsNotModified extends VirtualClass {}; + export class SavedGifs extends VirtualClass<{ + hash: int; + gifs: Api.TypeDocument[]; + }> { + hash: int; + gifs: Api.TypeDocument[]; + }; + export class BotResults extends VirtualClass<{ + // flags: null; + gallery?: true; + queryId: long; + nextOffset?: string; + switchPm?: Api.TypeInlineBotSwitchPM; + results: Api.TypeBotInlineResult[]; + cacheTime: int; + users: Api.TypeUser[]; + }> { + // flags: null; + gallery?: true; + queryId: long; + nextOffset?: string; + switchPm?: Api.TypeInlineBotSwitchPM; + results: Api.TypeBotInlineResult[]; + cacheTime: int; + users: Api.TypeUser[]; + }; + export class BotCallbackAnswer extends VirtualClass<{ + // flags: null; + alert?: true; + hasUrl?: true; + nativeUi?: true; + message?: string; + url?: string; + cacheTime: int; + }> { + // flags: null; + alert?: true; + hasUrl?: true; + nativeUi?: true; + message?: string; + url?: string; + cacheTime: int; + }; + export class MessageEditData extends VirtualClass<{ + // flags: null; + caption?: true; + } | void> { + // flags: null; + caption?: true; + }; + export class PeerDialogs extends VirtualClass<{ + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + state: updates.TypeState; + }> { + dialogs: Api.TypeDialog[]; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + state: updates.TypeState; + }; + export class FeaturedStickersNotModified extends VirtualClass<{ + count: int; + }> { + count: int; + }; + export class FeaturedStickers extends VirtualClass<{ + hash: int; + count: int; + sets: Api.TypeStickerSetCovered[]; + unread: long[]; + }> { + hash: int; + count: int; + sets: Api.TypeStickerSetCovered[]; + unread: long[]; + }; + export class RecentStickersNotModified extends VirtualClass {}; + export class RecentStickers extends VirtualClass<{ + hash: int; + packs: Api.TypeStickerPack[]; + stickers: Api.TypeDocument[]; + dates: int[]; + }> { + hash: int; + packs: Api.TypeStickerPack[]; + stickers: Api.TypeDocument[]; + dates: int[]; + }; + export class ArchivedStickers extends VirtualClass<{ + count: int; + sets: Api.TypeStickerSetCovered[]; + }> { + count: int; + sets: Api.TypeStickerSetCovered[]; + }; + export class StickerSetInstallResultSuccess extends VirtualClass {}; + export class StickerSetInstallResultArchive extends VirtualClass<{ + sets: Api.TypeStickerSetCovered[]; + }> { + sets: Api.TypeStickerSetCovered[]; + }; + export class HighScores extends VirtualClass<{ + scores: Api.TypeHighScore[]; + users: Api.TypeUser[]; + }> { + scores: Api.TypeHighScore[]; + users: Api.TypeUser[]; + }; + export class FavedStickersNotModified extends VirtualClass {}; + export class FavedStickers extends VirtualClass<{ + hash: int; + packs: Api.TypeStickerPack[]; + stickers: Api.TypeDocument[]; + }> { + hash: int; + packs: Api.TypeStickerPack[]; + stickers: Api.TypeDocument[]; + }; + export class FoundStickerSetsNotModified extends VirtualClass {}; + export class FoundStickerSets extends VirtualClass<{ + hash: int; + sets: Api.TypeStickerSetCovered[]; + }> { + hash: int; + sets: Api.TypeStickerSetCovered[]; + }; + export class SearchCounter extends VirtualClass<{ + // flags: null; + inexact?: true; + filter: Api.TypeMessagesFilter; + count: int; + }> { + // flags: null; + inexact?: true; + filter: Api.TypeMessagesFilter; + count: int; + }; + export class InactiveChats extends VirtualClass<{ + dates: int[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + dates: int[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class VotesList extends VirtualClass<{ + // flags: null; + count: int; + votes: Api.TypeMessageUserVote[]; + users: Api.TypeUser[]; + nextOffset?: string; + }> { + // flags: null; + count: int; + votes: Api.TypeMessageUserVote[]; + users: Api.TypeUser[]; + nextOffset?: string; + }; + export class MessageViews extends VirtualClass<{ + views: Api.TypeMessageViews[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + views: Api.TypeMessageViews[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class DiscussionMessage extends VirtualClass<{ + // flags: null; + messages: Api.TypeMessage[]; + maxId?: int; + readInboxMaxId?: int; + readOutboxMaxId?: int; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + // flags: null; + messages: Api.TypeMessage[]; + maxId?: int; + readInboxMaxId?: int; + readOutboxMaxId?: int; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + } + + export namespace updates { + export class State extends VirtualClass<{ + pts: int; + qts: int; + date: int; + seq: int; + unreadCount: int; + }> { + pts: int; + qts: int; + date: int; + seq: int; + unreadCount: int; + }; + export class DifferenceEmpty extends VirtualClass<{ + date: int; + seq: int; + }> { + date: int; + seq: int; + }; + export class Difference extends VirtualClass<{ + newMessages: Api.TypeMessage[]; + newEncryptedMessages: Api.TypeEncryptedMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + state: updates.TypeState; + }> { + newMessages: Api.TypeMessage[]; + newEncryptedMessages: Api.TypeEncryptedMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + state: updates.TypeState; + }; + export class DifferenceSlice extends VirtualClass<{ + newMessages: Api.TypeMessage[]; + newEncryptedMessages: Api.TypeEncryptedMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + intermediateState: updates.TypeState; + }> { + newMessages: Api.TypeMessage[]; + newEncryptedMessages: Api.TypeEncryptedMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + intermediateState: updates.TypeState; + }; + export class DifferenceTooLong extends VirtualClass<{ + pts: int; + }> { + pts: int; + }; + export class ChannelDifferenceEmpty extends VirtualClass<{ + // flags: null; + final?: true; + pts: int; + timeout?: int; + }> { + // flags: null; + final?: true; + pts: int; + timeout?: int; + }; + export class ChannelDifferenceTooLong extends VirtualClass<{ + // flags: null; + final?: true; + timeout?: int; + dialog: Api.TypeDialog; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + // flags: null; + final?: true; + timeout?: int; + dialog: Api.TypeDialog; + messages: Api.TypeMessage[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class ChannelDifference extends VirtualClass<{ + // flags: null; + final?: true; + pts: int; + timeout?: int; + newMessages: Api.TypeMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + // flags: null; + final?: true; + pts: int; + timeout?: int; + newMessages: Api.TypeMessage[]; + otherUpdates: Api.TypeUpdate[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + } + + export namespace photos { + export class Photos extends VirtualClass<{ + photos: Api.TypePhoto[]; + users: Api.TypeUser[]; + }> { + photos: Api.TypePhoto[]; + users: Api.TypeUser[]; + }; + export class PhotosSlice extends VirtualClass<{ + count: int; + photos: Api.TypePhoto[]; + users: Api.TypeUser[]; + }> { + count: int; + photos: Api.TypePhoto[]; + users: Api.TypeUser[]; + }; + export class Photo extends VirtualClass<{ + photo: Api.TypePhoto; + users: Api.TypeUser[]; + }> { + photo: Api.TypePhoto; + users: Api.TypeUser[]; + }; + } + + export namespace upload { + export class File extends VirtualClass<{ + type: storage.TypeFileType; + mtime: int; + bytes: bytes; + }> { + type: storage.TypeFileType; + mtime: int; + bytes: bytes; + }; + export class FileCdnRedirect extends VirtualClass<{ + dcId: int; + fileToken: bytes; + encryptionKey: bytes; + encryptionIv: bytes; + fileHashes: Api.TypeFileHash[]; + }> { + dcId: int; + fileToken: bytes; + encryptionKey: bytes; + encryptionIv: bytes; + fileHashes: Api.TypeFileHash[]; + }; + export class WebFile extends VirtualClass<{ + size: int; + mimeType: string; + fileType: storage.TypeFileType; + mtime: int; + bytes: bytes; + }> { + size: int; + mimeType: string; + fileType: storage.TypeFileType; + mtime: int; + bytes: bytes; + }; + export class CdnFileReuploadNeeded extends VirtualClass<{ + requestToken: bytes; + }> { + requestToken: bytes; + }; + export class CdnFile extends VirtualClass<{ + bytes: bytes; + }> { + bytes: bytes; + }; + } + + export namespace help { + export class AppUpdate extends VirtualClass<{ + // flags: null; + canNotSkip?: true; + id: int; + version: string; + text: string; + entities: Api.TypeMessageEntity[]; + document?: Api.TypeDocument; + url?: string; + }> { + // flags: null; + canNotSkip?: true; + id: int; + version: string; + text: string; + entities: Api.TypeMessageEntity[]; + document?: Api.TypeDocument; + url?: string; + }; + export class NoAppUpdate extends VirtualClass {}; + export class InviteText extends VirtualClass<{ + message: string; + }> { + message: string; + }; + export class Support extends VirtualClass<{ + phoneNumber: string; + user: Api.TypeUser; + }> { + phoneNumber: string; + user: Api.TypeUser; + }; + export class TermsOfService extends VirtualClass<{ + // flags: null; + popup?: true; + id: Api.TypeDataJSON; + text: string; + entities: Api.TypeMessageEntity[]; + minAgeConfirm?: int; + }> { + // flags: null; + popup?: true; + id: Api.TypeDataJSON; + text: string; + entities: Api.TypeMessageEntity[]; + minAgeConfirm?: int; + }; + export class RecentMeUrls extends VirtualClass<{ + urls: Api.TypeRecentMeUrl[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + urls: Api.TypeRecentMeUrl[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class TermsOfServiceUpdateEmpty extends VirtualClass<{ + expires: int; + }> { + expires: int; + }; + export class TermsOfServiceUpdate extends VirtualClass<{ + expires: int; + termsOfService: help.TypeTermsOfService; + }> { + expires: int; + termsOfService: help.TypeTermsOfService; + }; + export class DeepLinkInfoEmpty extends VirtualClass {}; + export class DeepLinkInfo extends VirtualClass<{ + // flags: null; + updateApp?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + }> { + // flags: null; + updateApp?: true; + message: string; + entities?: Api.TypeMessageEntity[]; + }; + export class PassportConfigNotModified extends VirtualClass {}; + export class PassportConfig extends VirtualClass<{ + hash: int; + countriesLangs: Api.TypeDataJSON; + }> { + hash: int; + countriesLangs: Api.TypeDataJSON; + }; + export class SupportName extends VirtualClass<{ + name: string; + }> { + name: string; + }; + export class UserInfoEmpty extends VirtualClass {}; + export class UserInfo extends VirtualClass<{ + message: string; + entities: Api.TypeMessageEntity[]; + author: string; + date: int; + }> { + message: string; + entities: Api.TypeMessageEntity[]; + author: string; + date: int; + }; + export class PromoDataEmpty extends VirtualClass<{ + expires: int; + }> { + expires: int; + }; + export class PromoData extends VirtualClass<{ + // flags: null; + proxy?: true; + expires: int; + peer: Api.TypePeer; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + psaType?: string; + psaMessage?: string; + }> { + // flags: null; + proxy?: true; + expires: int; + peer: Api.TypePeer; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + psaType?: string; + psaMessage?: string; + }; + export class CountryCode extends VirtualClass<{ + // flags: null; + countryCode: string; + prefixes?: string[]; + patterns?: string[]; + }> { + // flags: null; + countryCode: string; + prefixes?: string[]; + patterns?: string[]; + }; + export class Country extends VirtualClass<{ + // flags: null; + hidden?: true; + iso2: string; + defaultName: string; + name?: string; + countryCodes: help.TypeCountryCode[]; + }> { + // flags: null; + hidden?: true; + iso2: string; + defaultName: string; + name?: string; + countryCodes: help.TypeCountryCode[]; + }; + export class CountriesListNotModified extends VirtualClass {}; + export class CountriesList extends VirtualClass<{ + countries: help.TypeCountry[]; + hash: int; + }> { + countries: help.TypeCountry[]; + hash: int; + }; + export class ConfigSimple extends VirtualClass<{ + date: int; + expires: int; + rules: Api.TypeAccessPointRule[]; + }> { + date: int; + expires: int; + rules: Api.TypeAccessPointRule[]; + }; + } + + export namespace account { + export class PrivacyRules extends VirtualClass<{ + rules: Api.TypePrivacyRule[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + rules: Api.TypePrivacyRule[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + export class Authorizations extends VirtualClass<{ + authorizations: Api.TypeAuthorization[]; + }> { + authorizations: Api.TypeAuthorization[]; + }; + export class Password extends VirtualClass<{ + // flags: null; + hasRecovery?: true; + hasSecureValues?: true; + hasPassword?: true; + currentAlgo?: Api.TypePasswordKdfAlgo; + srp_B?: bytes; + srpId?: long; + hint?: string; + emailUnconfirmedPattern?: string; + newAlgo: Api.TypePasswordKdfAlgo; + newSecureAlgo: Api.TypeSecurePasswordKdfAlgo; + secureRandom: bytes; + }> { + // flags: null; + hasRecovery?: true; + hasSecureValues?: true; + hasPassword?: true; + currentAlgo?: Api.TypePasswordKdfAlgo; + srp_B?: bytes; + srpId?: long; + hint?: string; + emailUnconfirmedPattern?: string; + newAlgo: Api.TypePasswordKdfAlgo; + newSecureAlgo: Api.TypeSecurePasswordKdfAlgo; + secureRandom: bytes; + }; + export class PasswordSettings extends VirtualClass<{ + // flags: null; + email?: string; + secureSettings?: Api.TypeSecureSecretSettings; + } | void> { + // flags: null; + email?: string; + secureSettings?: Api.TypeSecureSecretSettings; + }; + export class PasswordInputSettings extends VirtualClass<{ + // flags: null; + newAlgo?: Api.TypePasswordKdfAlgo; + newPasswordHash?: bytes; + hint?: string; + email?: string; + newSecureSettings?: Api.TypeSecureSecretSettings; + } | void> { + // flags: null; + newAlgo?: Api.TypePasswordKdfAlgo; + newPasswordHash?: bytes; + hint?: string; + email?: string; + newSecureSettings?: Api.TypeSecureSecretSettings; + }; + export class TmpPassword extends VirtualClass<{ + tmpPassword: bytes; + validUntil: int; + }> { + tmpPassword: bytes; + validUntil: int; + }; + export class WebAuthorizations extends VirtualClass<{ + authorizations: Api.TypeWebAuthorization[]; + users: Api.TypeUser[]; + }> { + authorizations: Api.TypeWebAuthorization[]; + users: Api.TypeUser[]; + }; + export class AuthorizationForm extends VirtualClass<{ + // flags: null; + requiredTypes: Api.TypeSecureRequiredType[]; + values: Api.TypeSecureValue[]; + errors: Api.TypeSecureValueError[]; + users: Api.TypeUser[]; + privacyPolicyUrl?: string; + }> { + // flags: null; + requiredTypes: Api.TypeSecureRequiredType[]; + values: Api.TypeSecureValue[]; + errors: Api.TypeSecureValueError[]; + users: Api.TypeUser[]; + privacyPolicyUrl?: string; + }; + export class SentEmailCode extends VirtualClass<{ + emailPattern: string; + length: int; + }> { + emailPattern: string; + length: int; + }; + export class Takeout extends VirtualClass<{ + id: long; + }> { + id: long; + }; + export class WallPapersNotModified extends VirtualClass {}; + export class WallPapers extends VirtualClass<{ + hash: int; + wallpapers: Api.TypeWallPaper[]; + }> { + hash: int; + wallpapers: Api.TypeWallPaper[]; + }; + export class AutoDownloadSettings extends VirtualClass<{ + low: Api.TypeAutoDownloadSettings; + medium: Api.TypeAutoDownloadSettings; + high: Api.TypeAutoDownloadSettings; + }> { + low: Api.TypeAutoDownloadSettings; + medium: Api.TypeAutoDownloadSettings; + high: Api.TypeAutoDownloadSettings; + }; + export class ThemesNotModified extends VirtualClass {}; + export class Themes extends VirtualClass<{ + hash: int; + themes: Api.TypeTheme[]; + }> { + hash: int; + themes: Api.TypeTheme[]; + }; + export class ContentSettings extends VirtualClass<{ + // flags: null; + sensitiveEnabled?: true; + sensitiveCanChange?: true; + } | void> { + // flags: null; + sensitiveEnabled?: true; + sensitiveCanChange?: true; + }; + } + + export namespace channels { + export class ChannelParticipants extends VirtualClass<{ + count: int; + participants: Api.TypeChannelParticipant[]; + users: Api.TypeUser[]; + }> { + count: int; + participants: Api.TypeChannelParticipant[]; + users: Api.TypeUser[]; + }; + export class ChannelParticipantsNotModified extends VirtualClass {}; + export class ChannelParticipant extends VirtualClass<{ + participant: Api.TypeChannelParticipant; + users: Api.TypeUser[]; + }> { + participant: Api.TypeChannelParticipant; + users: Api.TypeUser[]; + }; + export class AdminLogResults extends VirtualClass<{ + events: Api.TypeChannelAdminLogEvent[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }> { + events: Api.TypeChannelAdminLogEvent[]; + chats: Api.TypeChat[]; + users: Api.TypeUser[]; + }; + } + + export namespace payments { + export class PaymentForm extends VirtualClass<{ + // flags: null; + canSaveCredentials?: true; + passwordMissing?: true; + botId: int; + invoice: Api.TypeInvoice; + providerId: int; + url: string; + nativeProvider?: string; + nativeParams?: Api.TypeDataJSON; + savedInfo?: Api.TypePaymentRequestedInfo; + savedCredentials?: Api.TypePaymentSavedCredentials; + users: Api.TypeUser[]; + }> { + // flags: null; + canSaveCredentials?: true; + passwordMissing?: true; + botId: int; + invoice: Api.TypeInvoice; + providerId: int; + url: string; + nativeProvider?: string; + nativeParams?: Api.TypeDataJSON; + savedInfo?: Api.TypePaymentRequestedInfo; + savedCredentials?: Api.TypePaymentSavedCredentials; + users: Api.TypeUser[]; + }; + export class ValidatedRequestedInfo extends VirtualClass<{ + // flags: null; + id?: string; + shippingOptions?: Api.TypeShippingOption[]; + } | void> { + // flags: null; + id?: string; + shippingOptions?: Api.TypeShippingOption[]; + }; + export class PaymentResult extends VirtualClass<{ + updates: Api.TypeUpdates; + }> { + updates: Api.TypeUpdates; + }; + export class PaymentVerificationNeeded extends VirtualClass<{ + url: string; + }> { + url: string; + }; + export class PaymentReceipt extends VirtualClass<{ + // flags: null; + date: int; + botId: int; + invoice: Api.TypeInvoice; + providerId: int; + info?: Api.TypePaymentRequestedInfo; + shipping?: Api.TypeShippingOption; + currency: string; + totalAmount: long; + credentialsTitle: string; + users: Api.TypeUser[]; + }> { + // flags: null; + date: int; + botId: int; + invoice: Api.TypeInvoice; + providerId: int; + info?: Api.TypePaymentRequestedInfo; + shipping?: Api.TypeShippingOption; + currency: string; + totalAmount: long; + credentialsTitle: string; + users: Api.TypeUser[]; + }; + export class SavedInfo extends VirtualClass<{ + // flags: null; + hasSavedCredentials?: true; + savedInfo?: Api.TypePaymentRequestedInfo; + } | void> { + // flags: null; + hasSavedCredentials?: true; + savedInfo?: Api.TypePaymentRequestedInfo; + }; + export class BankCardData extends VirtualClass<{ + title: string; + openUrls: Api.TypeBankCardOpenUrl[]; + }> { + title: string; + openUrls: Api.TypeBankCardOpenUrl[]; + }; + } + + export namespace phone { + export class PhoneCall extends VirtualClass<{ + phoneCall: Api.TypePhoneCall; + users: Api.TypeUser[]; + }> { + phoneCall: Api.TypePhoneCall; + users: Api.TypeUser[]; + }; + } + + export namespace stats { + export class BroadcastStats extends VirtualClass<{ + period: Api.TypeStatsDateRangeDays; + followers: Api.TypeStatsAbsValueAndPrev; + viewsPerPost: Api.TypeStatsAbsValueAndPrev; + sharesPerPost: Api.TypeStatsAbsValueAndPrev; + enabledNotifications: Api.TypeStatsPercentValue; + growthGraph: Api.TypeStatsGraph; + followersGraph: Api.TypeStatsGraph; + muteGraph: Api.TypeStatsGraph; + topHoursGraph: Api.TypeStatsGraph; + interactionsGraph: Api.TypeStatsGraph; + ivInteractionsGraph: Api.TypeStatsGraph; + viewsBySourceGraph: Api.TypeStatsGraph; + newFollowersBySourceGraph: Api.TypeStatsGraph; + languagesGraph: Api.TypeStatsGraph; + recentMessageInteractions: Api.TypeMessageInteractionCounters[]; + }> { + period: Api.TypeStatsDateRangeDays; + followers: Api.TypeStatsAbsValueAndPrev; + viewsPerPost: Api.TypeStatsAbsValueAndPrev; + sharesPerPost: Api.TypeStatsAbsValueAndPrev; + enabledNotifications: Api.TypeStatsPercentValue; + growthGraph: Api.TypeStatsGraph; + followersGraph: Api.TypeStatsGraph; + muteGraph: Api.TypeStatsGraph; + topHoursGraph: Api.TypeStatsGraph; + interactionsGraph: Api.TypeStatsGraph; + ivInteractionsGraph: Api.TypeStatsGraph; + viewsBySourceGraph: Api.TypeStatsGraph; + newFollowersBySourceGraph: Api.TypeStatsGraph; + languagesGraph: Api.TypeStatsGraph; + recentMessageInteractions: Api.TypeMessageInteractionCounters[]; + }; + export class MegagroupStats extends VirtualClass<{ + period: Api.TypeStatsDateRangeDays; + members: Api.TypeStatsAbsValueAndPrev; + messages: Api.TypeStatsAbsValueAndPrev; + viewers: Api.TypeStatsAbsValueAndPrev; + posters: Api.TypeStatsAbsValueAndPrev; + growthGraph: Api.TypeStatsGraph; + membersGraph: Api.TypeStatsGraph; + newMembersBySourceGraph: Api.TypeStatsGraph; + languagesGraph: Api.TypeStatsGraph; + messagesGraph: Api.TypeStatsGraph; + actionsGraph: Api.TypeStatsGraph; + topHoursGraph: Api.TypeStatsGraph; + weekdaysGraph: Api.TypeStatsGraph; + topPosters: Api.TypeStatsGroupTopPoster[]; + topAdmins: Api.TypeStatsGroupTopAdmin[]; + topInviters: Api.TypeStatsGroupTopInviter[]; + users: Api.TypeUser[]; + }> { + period: Api.TypeStatsDateRangeDays; + members: Api.TypeStatsAbsValueAndPrev; + messages: Api.TypeStatsAbsValueAndPrev; + viewers: Api.TypeStatsAbsValueAndPrev; + posters: Api.TypeStatsAbsValueAndPrev; + growthGraph: Api.TypeStatsGraph; + membersGraph: Api.TypeStatsGraph; + newMembersBySourceGraph: Api.TypeStatsGraph; + languagesGraph: Api.TypeStatsGraph; + messagesGraph: Api.TypeStatsGraph; + actionsGraph: Api.TypeStatsGraph; + topHoursGraph: Api.TypeStatsGraph; + weekdaysGraph: Api.TypeStatsGraph; + topPosters: Api.TypeStatsGroupTopPoster[]; + topAdmins: Api.TypeStatsGroupTopAdmin[]; + topInviters: Api.TypeStatsGroupTopInviter[]; + users: Api.TypeUser[]; + }; + export class MessageStats extends VirtualClass<{ + viewsGraph: Api.TypeStatsGraph; + }> { + viewsGraph: Api.TypeStatsGraph; + }; + } + + export class InvokeAfterMsg extends Request, X> { + msgId: long; + query: X; + }; + export class InvokeAfterMsgs extends Request, X> { + msgIds: long[]; + query: X; + }; + export class InitConnection extends Request, X> { + // flags: null; + apiId: int; + deviceModel: string; + systemVersion: string; + appVersion: string; + systemLangCode: string; + langPack: string; + langCode: string; + proxy?: Api.TypeInputClientProxy; + params?: Api.TypeJSONValue; + query: X; + }; + export class InvokeWithLayer extends Request, X> { + layer: int; + query: X; + }; + export class InvokeWithoutUpdates extends Request, X> { + query: X; + }; + export class InvokeWithMessagesRange extends Request, X> { + range: Api.TypeMessageRange; + query: X; + }; + export class InvokeWithTakeout extends Request, X> { + takeoutId: long; + query: X; + }; + export class ReqPq extends Request, Api.TypeResPQ> { + nonce: int128; + }; + export class ReqPqMulti extends Request, Api.TypeResPQ> { + nonce: int128; + }; + export class ReqDHParams extends Request, Api.TypeServer_DH_Params> { + nonce: int128; + serverNonce: int128; + p: bytes; + q: bytes; + publicKeyFingerprint: long; + encryptedData: bytes; + }; + export class SetClientDHParams extends Request, Api.TypeSet_client_DH_params_answer> { + nonce: int128; + serverNonce: int128; + encryptedData: bytes; + }; + export class DestroyAuthKey extends Request {}; + export class RpcDropAnswer extends Request, Api.TypeRpcDropAnswer> { + reqMsgId: long; + }; + export class GetFutureSalts extends Request, Api.TypeFutureSalts> { + num: int; + }; + export class Ping extends Request, Api.TypePong> { + pingId: long; + }; + export class PingDelayDisconnect extends Request, Api.TypePong> { + pingId: long; + disconnectDelay: int; + }; + export class DestroySession extends Request, Api.TypeDestroySessionRes> { + sessionId: long; + }; + + + export namespace auth { + export class SendCode extends Request, auth.TypeSentCode> { + phoneNumber: string; + apiId: int; + apiHash: string; + settings: Api.TypeCodeSettings; + }; + export class SignUp extends Request, auth.TypeAuthorization> { + phoneNumber: string; + phoneCodeHash: string; + firstName: string; + lastName: string; + }; + export class SignIn extends Request, auth.TypeAuthorization> { + phoneNumber: string; + phoneCodeHash: string; + phoneCode: string; + }; + export class LogOut extends Request {}; + export class ResetAuthorizations extends Request {}; + export class ExportAuthorization extends Request, auth.TypeExportedAuthorization> { + dcId: int; + }; + export class ImportAuthorization extends Request, auth.TypeAuthorization> { + id: int; + bytes: bytes; + }; + export class BindTempAuthKey extends Request, Bool> { + permAuthKeyId: long; + nonce: long; + expiresAt: int; + encryptedMessage: bytes; + }; + export class ImportBotAuthorization extends Request, auth.TypeAuthorization> { + // flags: int; + apiId: int; + apiHash: string; + botAuthToken: string; + }; + export class CheckPassword extends Request, auth.TypeAuthorization> { + password: Api.TypeInputCheckPasswordSRP; + }; + export class RequestPasswordRecovery extends Request {}; + export class RecoverPassword extends Request, auth.TypeAuthorization> { + code: string; + }; + export class ResendCode extends Request, auth.TypeSentCode> { + phoneNumber: string; + phoneCodeHash: string; + }; + export class CancelCode extends Request, Bool> { + phoneNumber: string; + phoneCodeHash: string; + }; + export class DropTempAuthKeys extends Request, Bool> { + exceptAuthKeys: long[]; + }; + export class ExportLoginToken extends Request, auth.TypeLoginToken> { + apiId: int; + apiHash: string; + exceptIds: int[]; + }; + export class ImportLoginToken extends Request, auth.TypeLoginToken> { + token: bytes; + }; + export class AcceptLoginToken extends Request, Api.TypeAuthorization> { + token: bytes; + }; + } + + export namespace account { + export class RegisterDevice extends Request, Bool> { + // flags: null; + noMuted?: true; + tokenType: int; + token: string; + appSandbox: Bool; + secret: bytes; + otherUids: int[]; + }; + export class UnregisterDevice extends Request, Bool> { + tokenType: int; + token: string; + otherUids: int[]; + }; + export class UpdateNotifySettings extends Request, Bool> { + peer: Api.TypeInputNotifyPeer; + settings: Api.TypeInputPeerNotifySettings; + }; + export class GetNotifySettings extends Request, Api.TypePeerNotifySettings> { + peer: Api.TypeInputNotifyPeer; + }; + export class ResetNotifySettings extends Request {}; + export class UpdateProfile extends Request, Api.TypeUser> { + // flags: null; + firstName?: string; + lastName?: string; + about?: string; + }; + export class UpdateStatus extends Request, Bool> { + offline: Bool; + }; + export class GetWallPapers extends Request, account.TypeWallPapers> { + hash: int; + }; + export class ReportPeer extends Request, Bool> { + peer: Api.TypeInputPeer; + reason: Api.TypeReportReason; + }; + export class CheckUsername extends Request, Bool> { + username: string; + }; + export class UpdateUsername extends Request, Api.TypeUser> { + username: string; + }; + export class GetPrivacy extends Request, account.TypePrivacyRules> { + key: Api.TypeInputPrivacyKey; + }; + export class SetPrivacy extends Request, account.TypePrivacyRules> { + key: Api.TypeInputPrivacyKey; + rules: Api.TypeInputPrivacyRule[]; + }; + export class DeleteAccount extends Request, Bool> { + reason: string; + }; + export class GetAccountTTL extends Request {}; + export class SetAccountTTL extends Request, Bool> { + ttl: Api.TypeAccountDaysTTL; + }; + export class SendChangePhoneCode extends Request, auth.TypeSentCode> { + phoneNumber: string; + settings: Api.TypeCodeSettings; + }; + export class ChangePhone extends Request, Api.TypeUser> { + phoneNumber: string; + phoneCodeHash: string; + phoneCode: string; + }; + export class UpdateDeviceLocked extends Request, Bool> { + period: int; + }; + export class GetAuthorizations extends Request {}; + export class ResetAuthorization extends Request, Bool> { + hash: long; + }; + export class GetPassword extends Request {}; + export class GetPasswordSettings extends Request, account.TypePasswordSettings> { + password: Api.TypeInputCheckPasswordSRP; + }; + export class UpdatePasswordSettings extends Request, Bool> { + password: Api.TypeInputCheckPasswordSRP; + newSettings: account.TypePasswordInputSettings; + }; + export class SendConfirmPhoneCode extends Request, auth.TypeSentCode> { + hash: string; + settings: Api.TypeCodeSettings; + }; + export class ConfirmPhone extends Request, Bool> { + phoneCodeHash: string; + phoneCode: string; + }; + export class GetTmpPassword extends Request, account.TypeTmpPassword> { + password: Api.TypeInputCheckPasswordSRP; + period: int; + }; + export class GetWebAuthorizations extends Request {}; + export class ResetWebAuthorization extends Request, Bool> { + hash: long; + }; + export class ResetWebAuthorizations extends Request {}; + export class GetAllSecureValues extends Request {}; + export class GetSecureValue extends Request, Api.TypeSecureValue[]> { + types: Api.TypeSecureValueType[]; + }; + export class SaveSecureValue extends Request, Api.TypeSecureValue> { + value: Api.TypeInputSecureValue; + secureSecretId: long; + }; + export class DeleteSecureValue extends Request, Bool> { + types: Api.TypeSecureValueType[]; + }; + export class GetAuthorizationForm extends Request, account.TypeAuthorizationForm> { + botId: int; + scope: string; + publicKey: string; + }; + export class AcceptAuthorization extends Request, Bool> { + botId: int; + scope: string; + publicKey: string; + valueHashes: Api.TypeSecureValueHash[]; + credentials: Api.TypeSecureCredentialsEncrypted; + }; + export class SendVerifyPhoneCode extends Request, auth.TypeSentCode> { + phoneNumber: string; + settings: Api.TypeCodeSettings; + }; + export class VerifyPhone extends Request, Bool> { + phoneNumber: string; + phoneCodeHash: string; + phoneCode: string; + }; + export class SendVerifyEmailCode extends Request, account.TypeSentEmailCode> { + email: string; + }; + export class VerifyEmail extends Request, Bool> { + email: string; + code: string; + }; + export class InitTakeoutSession extends Request, account.TypeTakeout> { + // flags: null; + contacts?: true; + messageUsers?: true; + messageChats?: true; + messageMegagroups?: true; + messageChannels?: true; + files?: true; + fileMaxSize?: int; + }; + export class FinishTakeoutSession extends Request, Bool> { + // flags: null; + success?: true; + }; + export class ConfirmPasswordEmail extends Request, Bool> { + code: string; + }; + export class ResendPasswordEmail extends Request {}; + export class CancelPasswordEmail extends Request {}; + export class GetContactSignUpNotification extends Request {}; + export class SetContactSignUpNotification extends Request, Bool> { + silent: Bool; + }; + export class GetNotifyExceptions extends Request, Api.TypeUpdates> { + // flags: null; + compareSound?: true; + peer?: Api.TypeInputNotifyPeer; + }; + export class GetWallPaper extends Request, Api.TypeWallPaper> { + wallpaper: Api.TypeInputWallPaper; + }; + export class UploadWallPaper extends Request, Api.TypeWallPaper> { + file: Api.TypeInputFile; + mimeType: string; + settings: Api.TypeWallPaperSettings; + }; + export class SaveWallPaper extends Request, Bool> { + wallpaper: Api.TypeInputWallPaper; + unsave: Bool; + settings: Api.TypeWallPaperSettings; + }; + export class InstallWallPaper extends Request, Bool> { + wallpaper: Api.TypeInputWallPaper; + settings: Api.TypeWallPaperSettings; + }; + export class ResetWallPapers extends Request {}; + export class GetAutoDownloadSettings extends Request {}; + export class SaveAutoDownloadSettings extends Request, Bool> { + // flags: null; + low?: true; + high?: true; + settings: Api.TypeAutoDownloadSettings; + }; + export class UploadTheme extends Request, Api.TypeDocument> { + // flags: null; + file: Api.TypeInputFile; + thumb?: Api.TypeInputFile; + fileName: string; + mimeType: string; + }; + export class CreateTheme extends Request, Api.TypeTheme> { + // flags: null; + slug: string; + title: string; + document?: Api.TypeInputDocument; + settings?: Api.TypeInputThemeSettings; + }; + export class UpdateTheme extends Request, Api.TypeTheme> { + // flags: null; + format: string; + theme: Api.TypeInputTheme; + slug?: string; + title?: string; + document?: Api.TypeInputDocument; + settings?: Api.TypeInputThemeSettings; + }; + export class SaveTheme extends Request, Bool> { + theme: Api.TypeInputTheme; + unsave: Bool; + }; + export class InstallTheme extends Request, Bool> { + // flags: null; + dark?: true; + format?: string; + theme?: Api.TypeInputTheme; + }; + export class GetTheme extends Request, Api.TypeTheme> { + format: string; + theme: Api.TypeInputTheme; + documentId: long; + }; + export class GetThemes extends Request, account.TypeThemes> { + format: string; + hash: int; + }; + export class SetContentSettings extends Request, Bool> { + // flags: null; + sensitiveEnabled?: true; + }; + export class GetContentSettings extends Request {}; + export class GetMultiWallPapers extends Request, Api.TypeWallPaper[]> { + wallpapers: Api.TypeInputWallPaper[]; + }; + export class GetGlobalPrivacySettings extends Request {}; + export class SetGlobalPrivacySettings extends Request, Api.TypeGlobalPrivacySettings> { + settings: Api.TypeGlobalPrivacySettings; + }; + } + + export namespace users { + export class GetUsers extends Request, Api.TypeUser[]> { + id: Api.TypeInputUser[]; + }; + export class GetFullUser extends Request, Api.TypeUserFull> { + id: Api.TypeInputUser; + }; + export class SetSecureValueErrors extends Request, Bool> { + id: Api.TypeInputUser; + errors: Api.TypeSecureValueError[]; + }; + } + + export namespace contacts { + export class GetContactIDs extends Request, int[]> { + hash: int; + }; + export class GetStatuses extends Request {}; + export class GetContacts extends Request, contacts.TypeContacts> { + hash: int; + }; + export class ImportContacts extends Request, contacts.TypeImportedContacts> { + contacts: Api.TypeInputContact[]; + }; + export class DeleteContacts extends Request, Api.TypeUpdates> { + id: Api.TypeInputUser[]; + }; + export class DeleteByPhones extends Request, Bool> { + phones: string[]; + }; + export class Block extends Request, Bool> { + id: Api.TypeInputPeer; + }; + export class Unblock extends Request, Bool> { + id: Api.TypeInputPeer; + }; + export class GetBlocked extends Request, contacts.TypeBlocked> { + offset: int; + limit: int; + }; + export class Search extends Request, contacts.TypeFound> { + q: string; + limit: int; + }; + export class ResolveUsername extends Request, contacts.TypeResolvedPeer> { + username: string; + }; + export class GetTopPeers extends Request, contacts.TypeTopPeers> { + // flags: null; + correspondents?: true; + botsPm?: true; + botsInline?: true; + phoneCalls?: true; + forwardUsers?: true; + forwardChats?: true; + groups?: true; + channels?: true; + offset: int; + limit: int; + hash: int; + }; + export class ResetTopPeerRating extends Request, Bool> { + category: Api.TypeTopPeerCategory; + peer: Api.TypeInputPeer; + }; + export class ResetSaved extends Request {}; + export class GetSaved extends Request {}; + export class ToggleTopPeers extends Request, Bool> { + enabled: Bool; + }; + export class AddContact extends Request, Api.TypeUpdates> { + // flags: null; + addPhonePrivacyException?: true; + id: Api.TypeInputUser; + firstName: string; + lastName: string; + phone: string; + }; + export class AcceptContact extends Request, Api.TypeUpdates> { + id: Api.TypeInputUser; + }; + export class GetLocated extends Request, Api.TypeUpdates> { + // flags: null; + background?: true; + geoPoint: Api.TypeInputGeoPoint; + selfExpires?: int; + }; + export class BlockFromReplies extends Request, Api.TypeUpdates> { + // flags: null; + deleteMessage?: true; + deleteHistory?: true; + reportSpam?: true; + msgId: int; + }; + } + + export namespace messages { + export class GetMessages extends Request, messages.TypeMessages> { + id: Api.TypeInputMessage[]; + }; + export class GetDialogs extends Request, messages.TypeDialogs> { + // flags: null; + excludePinned?: true; + folderId?: int; + offsetDate: int; + offsetId: int; + offsetPeer: Api.TypeInputPeer; + limit: int; + hash: int; + }; + export class GetHistory extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + offsetId: int; + offsetDate: int; + addOffset: int; + limit: int; + maxId: int; + minId: int; + hash: int; + }; + export class Search extends Request, messages.TypeMessages> { + // flags: null; + peer: Api.TypeInputPeer; + q: string; + fromId?: Api.TypeInputPeer; + topMsgId?: int; + filter: Api.TypeMessagesFilter; + minDate: int; + maxDate: int; + offsetId: int; + addOffset: int; + limit: int; + maxId: int; + minId: int; + hash: int; + }; + export class ReadHistory extends Request, messages.TypeAffectedMessages> { + peer: Api.TypeInputPeer; + maxId: int; + }; + export class DeleteHistory extends Request, messages.TypeAffectedHistory> { + // flags: null; + justClear?: true; + revoke?: true; + peer: Api.TypeInputPeer; + maxId: int; + }; + export class DeleteMessages extends Request, messages.TypeAffectedMessages> { + // flags: null; + revoke?: true; + id: int[]; + }; + export class ReceivedMessages extends Request, Api.TypeReceivedNotifyMessage[]> { + maxId: int; + }; + export class SetTyping extends Request, Bool> { + // flags: null; + peer: Api.TypeInputPeer; + topMsgId?: int; + action: Api.TypeSendMessageAction; + }; + export class SendMessage extends Request, Api.TypeUpdates> { + // flags: null; + noWebpage?: true; + silent?: true; + background?: true; + clearDraft?: true; + peer: Api.TypeInputPeer; + replyToMsgId?: int; + message: string; + randomId: long; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + scheduleDate?: int; + }; + export class SendMedia extends Request, Api.TypeUpdates> { + // flags: null; + silent?: true; + background?: true; + clearDraft?: true; + peer: Api.TypeInputPeer; + replyToMsgId?: int; + media: Api.TypeInputMedia; + message: string; + randomId: long; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + scheduleDate?: int; + }; + export class ForwardMessages extends Request, Api.TypeUpdates> { + // flags: null; + silent?: true; + background?: true; + withMyScore?: true; + fromPeer: Api.TypeInputPeer; + id: int[]; + randomId: long[]; + toPeer: Api.TypeInputPeer; + scheduleDate?: int; + }; + export class ReportSpam extends Request, Bool> { + peer: Api.TypeInputPeer; + }; + export class GetPeerSettings extends Request, Api.TypePeerSettings> { + peer: Api.TypeInputPeer; + }; + export class Report extends Request, Bool> { + peer: Api.TypeInputPeer; + id: int[]; + reason: Api.TypeReportReason; + }; + export class GetChats extends Request, messages.TypeChats> { + id: int[]; + }; + export class GetFullChat extends Request, messages.TypeChatFull> { + chatId: int; + }; + export class EditChatTitle extends Request, Api.TypeUpdates> { + chatId: int; + title: string; + }; + export class EditChatPhoto extends Request, Api.TypeUpdates> { + chatId: int; + photo: Api.TypeInputChatPhoto; + }; + export class AddChatUser extends Request, Api.TypeUpdates> { + chatId: int; + userId: Api.TypeInputUser; + fwdLimit: int; + }; + export class DeleteChatUser extends Request, Api.TypeUpdates> { + chatId: int; + userId: Api.TypeInputUser; + }; + export class CreateChat extends Request, Api.TypeUpdates> { + users: Api.TypeInputUser[]; + title: string; + }; + export class GetDhConfig extends Request, messages.TypeDhConfig> { + version: int; + randomLength: int; + }; + export class RequestEncryption extends Request, Api.TypeEncryptedChat> { + userId: Api.TypeInputUser; + randomId: int; + gA: bytes; + }; + export class AcceptEncryption extends Request, Api.TypeEncryptedChat> { + peer: Api.TypeInputEncryptedChat; + gB: bytes; + keyFingerprint: long; + }; + export class DiscardEncryption extends Request, Bool> { + chatId: int; + }; + export class SetEncryptedTyping extends Request, Bool> { + peer: Api.TypeInputEncryptedChat; + typing: Bool; + }; + export class ReadEncryptedHistory extends Request, Bool> { + peer: Api.TypeInputEncryptedChat; + maxDate: int; + }; + export class SendEncrypted extends Request, messages.TypeSentEncryptedMessage> { + // flags: null; + silent?: true; + peer: Api.TypeInputEncryptedChat; + randomId: long; + data: bytes; + }; + export class SendEncryptedFile extends Request, messages.TypeSentEncryptedMessage> { + // flags: null; + silent?: true; + peer: Api.TypeInputEncryptedChat; + randomId: long; + data: bytes; + file: Api.TypeInputEncryptedFile; + }; + export class SendEncryptedService extends Request, messages.TypeSentEncryptedMessage> { + peer: Api.TypeInputEncryptedChat; + randomId: long; + data: bytes; + }; + export class ReceivedQueue extends Request, long[]> { + maxQts: int; + }; + export class ReportEncryptedSpam extends Request, Bool> { + peer: Api.TypeInputEncryptedChat; + }; + export class ReadMessageContents extends Request, messages.TypeAffectedMessages> { + id: int[]; + }; + export class GetStickers extends Request, messages.TypeStickers> { + emoticon: string; + hash: int; + }; + export class GetAllStickers extends Request, messages.TypeAllStickers> { + hash: int; + }; + export class GetWebPagePreview extends Request, Api.TypeMessageMedia> { + // flags: null; + message: string; + entities?: Api.TypeMessageEntity[]; + }; + export class ExportChatInvite extends Request, Api.TypeExportedChatInvite> { + peer: Api.TypeInputPeer; + }; + export class CheckChatInvite extends Request, Api.TypeChatInvite> { + hash: string; + }; + export class ImportChatInvite extends Request, Api.TypeUpdates> { + hash: string; + }; + export class GetStickerSet extends Request, messages.TypeStickerSet> { + stickerset: Api.TypeInputStickerSet; + }; + export class InstallStickerSet extends Request, messages.TypeStickerSetInstallResult> { + stickerset: Api.TypeInputStickerSet; + archived: Bool; + }; + export class UninstallStickerSet extends Request, Bool> { + stickerset: Api.TypeInputStickerSet; + }; + export class StartBot extends Request, Api.TypeUpdates> { + bot: Api.TypeInputUser; + peer: Api.TypeInputPeer; + randomId: long; + startParam: string; + }; + export class GetMessagesViews extends Request, messages.TypeMessageViews> { + peer: Api.TypeInputPeer; + id: int[]; + increment: Bool; + }; + export class EditChatAdmin extends Request, Bool> { + chatId: int; + userId: Api.TypeInputUser; + isAdmin: Bool; + }; + export class MigrateChat extends Request, Api.TypeUpdates> { + chatId: int; + }; + export class SearchGlobal extends Request, messages.TypeMessages> { + // flags: null; + folderId?: int; + q: string; + filter: Api.TypeMessagesFilter; + minDate: int; + maxDate: int; + offsetRate: int; + offsetPeer: Api.TypeInputPeer; + offsetId: int; + limit: int; + }; + export class ReorderStickerSets extends Request, Bool> { + // flags: null; + masks?: true; + order: long[]; + }; + export class GetDocumentByHash extends Request, Api.TypeDocument> { + sha256: bytes; + size: int; + mimeType: string; + }; + export class GetSavedGifs extends Request, messages.TypeSavedGifs> { + hash: int; + }; + export class SaveGif extends Request, Bool> { + id: Api.TypeInputDocument; + unsave: Bool; + }; + export class GetInlineBotResults extends Request, messages.TypeBotResults> { + // flags: null; + bot: Api.TypeInputUser; + peer: Api.TypeInputPeer; + geoPoint?: Api.TypeInputGeoPoint; + query: string; + offset: string; + }; + export class SetInlineBotResults extends Request, Bool> { + // flags: null; + gallery?: true; + private?: true; + queryId: long; + results: Api.TypeInputBotInlineResult[]; + cacheTime: int; + nextOffset?: string; + switchPm?: Api.TypeInlineBotSwitchPM; + }; + export class SendInlineBotResult extends Request, Api.TypeUpdates> { + // flags: null; + silent?: true; + background?: true; + clearDraft?: true; + hideVia?: true; + peer: Api.TypeInputPeer; + replyToMsgId?: int; + randomId: long; + queryId: long; + id: string; + scheduleDate?: int; + }; + export class GetMessageEditData extends Request, messages.TypeMessageEditData> { + peer: Api.TypeInputPeer; + id: int; + }; + export class EditMessage extends Request, Api.TypeUpdates> { + // flags: null; + noWebpage?: true; + peer: Api.TypeInputPeer; + id: int; + message?: string; + media?: Api.TypeInputMedia; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + scheduleDate?: int; + }; + export class EditInlineBotMessage extends Request, Bool> { + // flags: null; + noWebpage?: true; + id: Api.TypeInputBotInlineMessageID; + message?: string; + media?: Api.TypeInputMedia; + replyMarkup?: Api.TypeReplyMarkup; + entities?: Api.TypeMessageEntity[]; + }; + export class GetBotCallbackAnswer extends Request, messages.TypeBotCallbackAnswer> { + // flags: null; + game?: true; + peer: Api.TypeInputPeer; + msgId: int; + data?: bytes; + password?: Api.TypeInputCheckPasswordSRP; + }; + export class SetBotCallbackAnswer extends Request, Bool> { + // flags: null; + alert?: true; + queryId: long; + message?: string; + url?: string; + cacheTime: int; + }; + export class GetPeerDialogs extends Request, messages.TypePeerDialogs> { + peers: Api.TypeInputDialogPeer[]; + }; + export class SaveDraft extends Request, Bool> { + // flags: null; + noWebpage?: true; + replyToMsgId?: int; + peer: Api.TypeInputPeer; + message: string; + entities?: Api.TypeMessageEntity[]; + }; + export class GetAllDrafts extends Request {}; + export class GetFeaturedStickers extends Request, messages.TypeFeaturedStickers> { + hash: int; + }; + export class ReadFeaturedStickers extends Request, Bool> { + id: long[]; + }; + export class GetRecentStickers extends Request, messages.TypeRecentStickers> { + // flags: null; + attached?: true; + hash: int; + }; + export class SaveRecentSticker extends Request, Bool> { + // flags: null; + attached?: true; + id: Api.TypeInputDocument; + unsave: Bool; + }; + export class ClearRecentStickers extends Request, Bool> { + // flags: null; + attached?: true; + }; + export class GetArchivedStickers extends Request, messages.TypeArchivedStickers> { + // flags: null; + masks?: true; + offsetId: long; + limit: int; + }; + export class GetMaskStickers extends Request, messages.TypeAllStickers> { + hash: int; + }; + export class GetAttachedStickers extends Request, Api.TypeStickerSetCovered[]> { + media: Api.TypeInputStickeredMedia; + }; + export class SetGameScore extends Request, Api.TypeUpdates> { + // flags: null; + editMessage?: true; + force?: true; + peer: Api.TypeInputPeer; + id: int; + userId: Api.TypeInputUser; + score: int; + }; + export class SetInlineGameScore extends Request, Bool> { + // flags: null; + editMessage?: true; + force?: true; + id: Api.TypeInputBotInlineMessageID; + userId: Api.TypeInputUser; + score: int; + }; + export class GetGameHighScores extends Request, messages.TypeHighScores> { + peer: Api.TypeInputPeer; + id: int; + userId: Api.TypeInputUser; + }; + export class GetInlineGameHighScores extends Request, messages.TypeHighScores> { + id: Api.TypeInputBotInlineMessageID; + userId: Api.TypeInputUser; + }; + export class GetCommonChats extends Request, messages.TypeChats> { + userId: Api.TypeInputUser; + maxId: int; + limit: int; + }; + export class GetAllChats extends Request, messages.TypeChats> { + exceptIds: int[]; + }; + export class GetWebPage extends Request, Api.TypeWebPage> { + url: string; + hash: int; + }; + export class ToggleDialogPin extends Request, Bool> { + // flags: null; + pinned?: true; + peer: Api.TypeInputDialogPeer; + }; + export class ReorderPinnedDialogs extends Request, Bool> { + // flags: null; + force?: true; + folderId: int; + order: Api.TypeInputDialogPeer[]; + }; + export class GetPinnedDialogs extends Request, messages.TypePeerDialogs> { + folderId: int; + }; + export class SetBotShippingResults extends Request, Bool> { + // flags: null; + queryId: long; + error?: string; + shippingOptions?: Api.TypeShippingOption[]; + }; + export class SetBotPrecheckoutResults extends Request, Bool> { + // flags: null; + success?: true; + queryId: long; + error?: string; + }; + export class UploadMedia extends Request, Api.TypeMessageMedia> { + peer: Api.TypeInputPeer; + media: Api.TypeInputMedia; + }; + export class SendScreenshotNotification extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + replyToMsgId: int; + randomId: long; + }; + export class GetFavedStickers extends Request, messages.TypeFavedStickers> { + hash: int; + }; + export class FaveSticker extends Request, Bool> { + id: Api.TypeInputDocument; + unfave: Bool; + }; + export class GetUnreadMentions extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + offsetId: int; + addOffset: int; + limit: int; + maxId: int; + minId: int; + }; + export class ReadMentions extends Request, messages.TypeAffectedHistory> { + peer: Api.TypeInputPeer; + }; + export class GetRecentLocations extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + limit: int; + hash: int; + }; + export class SendMultiMedia extends Request, Api.TypeUpdates> { + // flags: null; + silent?: true; + background?: true; + clearDraft?: true; + peer: Api.TypeInputPeer; + replyToMsgId?: int; + multiMedia: Api.TypeInputSingleMedia[]; + scheduleDate?: int; + }; + export class UploadEncryptedFile extends Request, Api.TypeEncryptedFile> { + peer: Api.TypeInputEncryptedChat; + file: Api.TypeInputEncryptedFile; + }; + export class SearchStickerSets extends Request, messages.TypeFoundStickerSets> { + // flags: null; + excludeFeatured?: true; + q: string; + hash: int; + }; + export class GetSplitRanges extends Request {}; + export class MarkDialogUnread extends Request, Bool> { + // flags: null; + unread?: true; + peer: Api.TypeInputDialogPeer; + }; + export class GetDialogUnreadMarks extends Request {}; + export class ClearAllDrafts extends Request {}; + export class UpdatePinnedMessage extends Request, Api.TypeUpdates> { + // flags: null; + silent?: true; + unpin?: true; + pmOneside?: true; + peer: Api.TypeInputPeer; + id: int; + }; + export class SendVote extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + msgId: int; + options: bytes[]; + }; + export class GetPollResults extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + msgId: int; + }; + export class GetOnlines extends Request, Api.TypeChatOnlines> { + peer: Api.TypeInputPeer; + }; + export class GetStatsURL extends Request, Api.TypeStatsURL> { + // flags: null; + dark?: true; + peer: Api.TypeInputPeer; + params: string; + }; + export class EditChatAbout extends Request, Bool> { + peer: Api.TypeInputPeer; + about: string; + }; + export class EditChatDefaultBannedRights extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + bannedRights: Api.TypeChatBannedRights; + }; + export class GetEmojiKeywords extends Request, Api.TypeEmojiKeywordsDifference> { + langCode: string; + }; + export class GetEmojiKeywordsDifference extends Request, Api.TypeEmojiKeywordsDifference> { + langCode: string; + fromVersion: int; + }; + export class GetEmojiKeywordsLanguages extends Request, Api.TypeEmojiLanguage[]> { + langCodes: string[]; + }; + export class GetEmojiURL extends Request, Api.TypeEmojiURL> { + langCode: string; + }; + export class GetSearchCounters extends Request, messages.TypeSearchCounter[]> { + peer: Api.TypeInputPeer; + filters: Api.TypeMessagesFilter[]; + }; + export class RequestUrlAuth extends Request, Api.TypeUrlAuthResult> { + peer: Api.TypeInputPeer; + msgId: int; + buttonId: int; + }; + export class AcceptUrlAuth extends Request, Api.TypeUrlAuthResult> { + // flags: null; + writeAllowed?: true; + peer: Api.TypeInputPeer; + msgId: int; + buttonId: int; + }; + export class HidePeerSettingsBar extends Request, Bool> { + peer: Api.TypeInputPeer; + }; + export class GetScheduledHistory extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + hash: int; + }; + export class GetScheduledMessages extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + id: int[]; + }; + export class SendScheduledMessages extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + id: int[]; + }; + export class DeleteScheduledMessages extends Request, Api.TypeUpdates> { + peer: Api.TypeInputPeer; + id: int[]; + }; + export class GetPollVotes extends Request, messages.TypeVotesList> { + // flags: null; + peer: Api.TypeInputPeer; + id: int; + option?: bytes; + offset?: string; + limit: int; + }; + export class ToggleStickerSets extends Request, Bool> { + // flags: null; + uninstall?: true; + archive?: true; + unarchive?: true; + stickersets: Api.TypeInputStickerSet[]; + }; + export class GetDialogFilters extends Request {}; + export class GetSuggestedDialogFilters extends Request {}; + export class UpdateDialogFilter extends Request, Bool> { + // flags: null; + id: int; + filter?: Api.TypeDialogFilter; + }; + export class UpdateDialogFiltersOrder extends Request, Bool> { + order: int[]; + }; + export class GetOldFeaturedStickers extends Request, messages.TypeFeaturedStickers> { + offset: int; + limit: int; + hash: int; + }; + export class GetReplies extends Request, messages.TypeMessages> { + peer: Api.TypeInputPeer; + msgId: int; + offsetId: int; + offsetDate: int; + addOffset: int; + limit: int; + maxId: int; + minId: int; + hash: int; + }; + export class GetDiscussionMessage extends Request, messages.TypeDiscussionMessage> { + peer: Api.TypeInputPeer; + msgId: int; + }; + export class ReadDiscussion extends Request, Bool> { + peer: Api.TypeInputPeer; + msgId: int; + readMaxId: int; + }; + export class UnpinAllMessages extends Request, messages.TypeAffectedHistory> { + peer: Api.TypeInputPeer; + }; + } + + export namespace updates { + export class GetState extends Request {}; + export class GetDifference extends Request, updates.TypeDifference> { + // flags: null; + pts: int; + ptsTotalLimit?: int; + date: int; + qts: int; + }; + export class GetChannelDifference extends Request, updates.TypeChannelDifference> { + // flags: null; + force?: true; + channel: Api.TypeInputChannel; + filter: Api.TypeChannelMessagesFilter; + pts: int; + limit: int; + }; + } + + export namespace photos { + export class UpdateProfilePhoto extends Request, photos.TypePhoto> { + id: Api.TypeInputPhoto; + }; + export class UploadProfilePhoto extends Request, photos.TypePhoto> { + // flags: null; + file?: Api.TypeInputFile; + video?: Api.TypeInputFile; + videoStartTs?: double; + }; + export class DeletePhotos extends Request, long[]> { + id: Api.TypeInputPhoto[]; + }; + export class GetUserPhotos extends Request, photos.TypePhotos> { + userId: Api.TypeInputUser; + offset: int; + maxId: long; + limit: int; + }; + } + + export namespace upload { + export class SaveFilePart extends Request, Bool> { + fileId: long; + filePart: int; + bytes: bytes; + }; + export class GetFile extends Request, upload.TypeFile> { + // flags: null; + precise?: true; + cdnSupported?: true; + location: Api.TypeInputFileLocation; + offset: int; + limit: int; + }; + export class SaveBigFilePart extends Request, Bool> { + fileId: long; + filePart: int; + fileTotalParts: int; + bytes: bytes; + }; + export class GetWebFile extends Request, upload.TypeWebFile> { + location: Api.TypeInputWebFileLocation; + offset: int; + limit: int; + }; + export class GetCdnFile extends Request, upload.TypeCdnFile> { + fileToken: bytes; + offset: int; + limit: int; + }; + export class ReuploadCdnFile extends Request, Api.TypeFileHash[]> { + fileToken: bytes; + requestToken: bytes; + }; + export class GetCdnFileHashes extends Request, Api.TypeFileHash[]> { + fileToken: bytes; + offset: int; + }; + export class GetFileHashes extends Request, Api.TypeFileHash[]> { + location: Api.TypeInputFileLocation; + offset: int; + }; + } + + export namespace help { + export class GetConfig extends Request {}; + export class GetNearestDc extends Request {}; + export class GetAppUpdate extends Request, help.TypeAppUpdate> { + source: string; + }; + export class GetInviteText extends Request {}; + export class GetSupport extends Request {}; + export class GetAppChangelog extends Request, Api.TypeUpdates> { + prevAppVersion: string; + }; + export class SetBotUpdatesStatus extends Request, Bool> { + pendingUpdatesCount: int; + message: string; + }; + export class GetCdnConfig extends Request {}; + export class GetRecentMeUrls extends Request, help.TypeRecentMeUrls> { + referer: string; + }; + export class GetTermsOfServiceUpdate extends Request {}; + export class AcceptTermsOfService extends Request, Bool> { + id: Api.TypeDataJSON; + }; + export class GetDeepLinkInfo extends Request, help.TypeDeepLinkInfo> { + path: string; + }; + export class GetAppConfig extends Request {}; + export class SaveAppLog extends Request, Bool> { + events: Api.TypeInputAppEvent[]; + }; + export class GetPassportConfig extends Request, help.TypePassportConfig> { + hash: int; + }; + export class GetSupportName extends Request {}; + export class GetUserInfo extends Request, help.TypeUserInfo> { + userId: Api.TypeInputUser; + }; + export class EditUserInfo extends Request, help.TypeUserInfo> { + userId: Api.TypeInputUser; + message: string; + entities: Api.TypeMessageEntity[]; + }; + export class GetPromoData extends Request {}; + export class HidePromoData extends Request, Bool> { + peer: Api.TypeInputPeer; + }; + export class DismissSuggestion extends Request, Bool> { + suggestion: string; + }; + export class GetCountriesList extends Request, help.TypeCountriesList> { + langCode: string; + hash: int; + }; + } + + export namespace channels { + export class ReadHistory extends Request, Bool> { + channel: Api.TypeInputChannel; + maxId: int; + }; + export class DeleteMessages extends Request, messages.TypeAffectedMessages> { + channel: Api.TypeInputChannel; + id: int[]; + }; + export class DeleteUserHistory extends Request, messages.TypeAffectedHistory> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + }; + export class ReportSpam extends Request, Bool> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + id: int[]; + }; + export class GetMessages extends Request, messages.TypeMessages> { + channel: Api.TypeInputChannel; + id: Api.TypeInputMessage[]; + }; + export class GetParticipants extends Request, channels.TypeChannelParticipants> { + channel: Api.TypeInputChannel; + filter: Api.TypeChannelParticipantsFilter; + offset: int; + limit: int; + hash: int; + }; + export class GetParticipant extends Request, channels.TypeChannelParticipant> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + }; + export class GetChannels extends Request, messages.TypeChats> { + id: Api.TypeInputChannel[]; + }; + export class GetFullChannel extends Request, messages.TypeChatFull> { + channel: Api.TypeInputChannel; + }; + export class CreateChannel extends Request, Api.TypeUpdates> { + // flags: null; + broadcast?: true; + megagroup?: true; + title: string; + about: string; + geoPoint?: Api.TypeInputGeoPoint; + address?: string; + }; + export class EditAdmin extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + adminRights: Api.TypeChatAdminRights; + rank: string; + }; + export class EditTitle extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + title: string; + }; + export class EditPhoto extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + photo: Api.TypeInputChatPhoto; + }; + export class CheckUsername extends Request, Bool> { + channel: Api.TypeInputChannel; + username: string; + }; + export class UpdateUsername extends Request, Bool> { + channel: Api.TypeInputChannel; + username: string; + }; + export class JoinChannel extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + }; + export class LeaveChannel extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + }; + export class InviteToChannel extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + users: Api.TypeInputUser[]; + }; + export class DeleteChannel extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + }; + export class ExportMessageLink extends Request, Api.TypeExportedMessageLink> { + // flags: null; + grouped?: true; + thread?: true; + channel: Api.TypeInputChannel; + id: int; + }; + export class ToggleSignatures extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + enabled: Bool; + }; + export class GetAdminedPublicChannels extends Request, messages.TypeChats> { + // flags: null; + byLocation?: true; + checkLimit?: true; + }; + export class EditBanned extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + bannedRights: Api.TypeChatBannedRights; + }; + export class GetAdminLog extends Request, channels.TypeAdminLogResults> { + // flags: null; + channel: Api.TypeInputChannel; + q: string; + eventsFilter?: Api.TypeChannelAdminLogEventsFilter; + admins?: Api.TypeInputUser[]; + maxId: long; + minId: long; + limit: int; + }; + export class SetStickers extends Request, Bool> { + channel: Api.TypeInputChannel; + stickerset: Api.TypeInputStickerSet; + }; + export class ReadMessageContents extends Request, Bool> { + channel: Api.TypeInputChannel; + id: int[]; + }; + export class DeleteHistory extends Request, Bool> { + channel: Api.TypeInputChannel; + maxId: int; + }; + export class TogglePreHistoryHidden extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + enabled: Bool; + }; + export class GetLeftChannels extends Request, messages.TypeChats> { + offset: int; + }; + export class GetGroupsForDiscussion extends Request {}; + export class SetDiscussionGroup extends Request, Bool> { + broadcast: Api.TypeInputChannel; + group: Api.TypeInputChannel; + }; + export class EditCreator extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + userId: Api.TypeInputUser; + password: Api.TypeInputCheckPasswordSRP; + }; + export class EditLocation extends Request, Bool> { + channel: Api.TypeInputChannel; + geoPoint: Api.TypeInputGeoPoint; + address: string; + }; + export class ToggleSlowMode extends Request, Api.TypeUpdates> { + channel: Api.TypeInputChannel; + seconds: int; + }; + export class GetInactiveChannels extends Request {}; + } + + export namespace bots { + export class SendCustomRequest extends Request, Api.TypeDataJSON> { + customMethod: string; + params: Api.TypeDataJSON; + }; + export class AnswerWebhookJSONQuery extends Request, Bool> { + queryId: long; + data: Api.TypeDataJSON; + }; + export class SetBotCommands extends Request, Bool> { + commands: Api.TypeBotCommand[]; + }; + } + + export namespace payments { + export class GetPaymentForm extends Request, payments.TypePaymentForm> { + msgId: int; + }; + export class GetPaymentReceipt extends Request, payments.TypePaymentReceipt> { + msgId: int; + }; + export class ValidateRequestedInfo extends Request, payments.TypeValidatedRequestedInfo> { + // flags: null; + save?: true; + msgId: int; + info: Api.TypePaymentRequestedInfo; + }; + export class SendPaymentForm extends Request, payments.TypePaymentResult> { + // flags: null; + msgId: int; + requestedInfoId?: string; + shippingOptionId?: string; + credentials: Api.TypeInputPaymentCredentials; + }; + export class GetSavedInfo extends Request {}; + export class ClearSavedInfo extends Request, Bool> { + // flags: null; + credentials?: true; + info?: true; + }; + export class GetBankCardData extends Request, payments.TypeBankCardData> { + number: string; + }; + } + + export namespace stickers { + export class CreateStickerSet extends Request, messages.TypeStickerSet> { + // flags: null; + masks?: true; + animated?: true; + userId: Api.TypeInputUser; + title: string; + shortName: string; + thumb?: Api.TypeInputDocument; + stickers: Api.TypeInputStickerSetItem[]; + }; + export class RemoveStickerFromSet extends Request, messages.TypeStickerSet> { + sticker: Api.TypeInputDocument; + }; + export class ChangeStickerPosition extends Request, messages.TypeStickerSet> { + sticker: Api.TypeInputDocument; + position: int; + }; + export class AddStickerToSet extends Request, messages.TypeStickerSet> { + stickerset: Api.TypeInputStickerSet; + sticker: Api.TypeInputStickerSetItem; + }; + export class SetStickerSetThumb extends Request, messages.TypeStickerSet> { + stickerset: Api.TypeInputStickerSet; + thumb: Api.TypeInputDocument; + }; + } + + export namespace phone { + export class GetCallConfig extends Request {}; + export class RequestCall extends Request, phone.TypePhoneCall> { + // flags: null; + video?: true; + userId: Api.TypeInputUser; + randomId: int; + gAHash: bytes; + protocol: Api.TypePhoneCallProtocol; + }; + export class AcceptCall extends Request, phone.TypePhoneCall> { + peer: Api.TypeInputPhoneCall; + gB: bytes; + protocol: Api.TypePhoneCallProtocol; + }; + export class ConfirmCall extends Request, phone.TypePhoneCall> { + peer: Api.TypeInputPhoneCall; + gA: bytes; + keyFingerprint: long; + protocol: Api.TypePhoneCallProtocol; + }; + export class ReceivedCall extends Request, Bool> { + peer: Api.TypeInputPhoneCall; + }; + export class DiscardCall extends Request, Api.TypeUpdates> { + // flags: null; + video?: true; + peer: Api.TypeInputPhoneCall; + duration: int; + reason: Api.TypePhoneCallDiscardReason; + connectionId: long; + }; + export class SetCallRating extends Request, Api.TypeUpdates> { + // flags: null; + userInitiative?: true; + peer: Api.TypeInputPhoneCall; + rating: int; + comment: string; + }; + export class SaveCallDebug extends Request, Bool> { + peer: Api.TypeInputPhoneCall; + debug: Api.TypeDataJSON; + }; + export class SendSignalingData extends Request, Bool> { + peer: Api.TypeInputPhoneCall; + data: bytes; + }; + } + + export namespace langpack { + export class GetLangPack extends Request, Api.TypeLangPackDifference> { + langPack: string; + langCode: string; + }; + export class GetStrings extends Request, Api.TypeLangPackString[]> { + langPack: string; + langCode: string; + keys: string[]; + }; + export class GetDifference extends Request, Api.TypeLangPackDifference> { + langPack: string; + langCode: string; + fromVersion: int; + }; + export class GetLanguages extends Request, Api.TypeLangPackLanguage[]> { + langPack: string; + }; + export class GetLanguage extends Request, Api.TypeLangPackLanguage> { + langPack: string; + langCode: string; + }; + } + + export namespace folders { + export class EditPeerFolders extends Request, Api.TypeUpdates> { + folderPeers: Api.TypeInputFolderPeer[]; + }; + export class DeleteFolder extends Request, Api.TypeUpdates> { + folderId: int; + }; + } + + export namespace stats { + export class GetBroadcastStats extends Request, stats.TypeBroadcastStats> { + // flags: null; + dark?: true; + channel: Api.TypeInputChannel; + }; + export class LoadAsyncGraph extends Request, Api.TypeStatsGraph> { + // flags: null; + token: string; + x?: long; + }; + export class GetMegagroupStats extends Request, stats.TypeMegagroupStats> { + // flags: null; + dark?: true; + channel: Api.TypeInputChannel; + }; + export class GetMessagePublicForwards extends Request, messages.TypeMessages> { + channel: Api.TypeInputChannel; + msgId: int; + offsetRate: int; + offsetPeer: Api.TypeInputPeer; + offsetId: int; + limit: int; + }; + export class GetMessageStats extends Request, stats.TypeMessageStats> { + // flags: null; + dark?: true; + channel: Api.TypeInputChannel; + msgId: int; + }; + } + + export type AnyRequest = InvokeAfterMsg | InvokeAfterMsgs | InitConnection | InvokeWithLayer | InvokeWithoutUpdates | InvokeWithMessagesRange | InvokeWithTakeout | ReqPq | ReqPqMulti | ReqDHParams | SetClientDHParams | DestroyAuthKey | RpcDropAnswer | GetFutureSalts | Ping | PingDelayDisconnect | DestroySession + | auth.SendCode | auth.SignUp | auth.SignIn | auth.LogOut | auth.ResetAuthorizations | auth.ExportAuthorization | auth.ImportAuthorization | auth.BindTempAuthKey | auth.ImportBotAuthorization | auth.CheckPassword | auth.RequestPasswordRecovery | auth.RecoverPassword | auth.ResendCode | auth.CancelCode | auth.DropTempAuthKeys | auth.ExportLoginToken | auth.ImportLoginToken | auth.AcceptLoginToken + | account.RegisterDevice | account.UnregisterDevice | account.UpdateNotifySettings | account.GetNotifySettings | account.ResetNotifySettings | account.UpdateProfile | account.UpdateStatus | account.GetWallPapers | account.ReportPeer | account.CheckUsername | account.UpdateUsername | account.GetPrivacy | account.SetPrivacy | account.DeleteAccount | account.GetAccountTTL | account.SetAccountTTL | account.SendChangePhoneCode | account.ChangePhone | account.UpdateDeviceLocked | account.GetAuthorizations | account.ResetAuthorization | account.GetPassword | account.GetPasswordSettings | account.UpdatePasswordSettings | account.SendConfirmPhoneCode | account.ConfirmPhone | account.GetTmpPassword | account.GetWebAuthorizations | account.ResetWebAuthorization | account.ResetWebAuthorizations | account.GetAllSecureValues | account.GetSecureValue | account.SaveSecureValue | account.DeleteSecureValue | account.GetAuthorizationForm | account.AcceptAuthorization | account.SendVerifyPhoneCode | account.VerifyPhone | account.SendVerifyEmailCode | account.VerifyEmail | account.InitTakeoutSession | account.FinishTakeoutSession | account.ConfirmPasswordEmail | account.ResendPasswordEmail | account.CancelPasswordEmail | account.GetContactSignUpNotification | account.SetContactSignUpNotification | account.GetNotifyExceptions | account.GetWallPaper | account.UploadWallPaper | account.SaveWallPaper | account.InstallWallPaper | account.ResetWallPapers | account.GetAutoDownloadSettings | account.SaveAutoDownloadSettings | account.UploadTheme | account.CreateTheme | account.UpdateTheme | account.SaveTheme | account.InstallTheme | account.GetTheme | account.GetThemes | account.SetContentSettings | account.GetContentSettings | account.GetMultiWallPapers | account.GetGlobalPrivacySettings | account.SetGlobalPrivacySettings + | users.GetUsers | users.GetFullUser | users.SetSecureValueErrors + | contacts.GetContactIDs | contacts.GetStatuses | contacts.GetContacts | contacts.ImportContacts | contacts.DeleteContacts | contacts.DeleteByPhones | contacts.Block | contacts.Unblock | contacts.GetBlocked | contacts.Search | contacts.ResolveUsername | contacts.GetTopPeers | contacts.ResetTopPeerRating | contacts.ResetSaved | contacts.GetSaved | contacts.ToggleTopPeers | contacts.AddContact | contacts.AcceptContact | contacts.GetLocated | contacts.BlockFromReplies + | messages.GetMessages | messages.GetDialogs | messages.GetHistory | messages.Search | messages.ReadHistory | messages.DeleteHistory | messages.DeleteMessages | messages.ReceivedMessages | messages.SetTyping | messages.SendMessage | messages.SendMedia | messages.ForwardMessages | messages.ReportSpam | messages.GetPeerSettings | messages.Report | messages.GetChats | messages.GetFullChat | messages.EditChatTitle | messages.EditChatPhoto | messages.AddChatUser | messages.DeleteChatUser | messages.CreateChat | messages.GetDhConfig | messages.RequestEncryption | messages.AcceptEncryption | messages.DiscardEncryption | messages.SetEncryptedTyping | messages.ReadEncryptedHistory | messages.SendEncrypted | messages.SendEncryptedFile | messages.SendEncryptedService | messages.ReceivedQueue | messages.ReportEncryptedSpam | messages.ReadMessageContents | messages.GetStickers | messages.GetAllStickers | messages.GetWebPagePreview | messages.ExportChatInvite | messages.CheckChatInvite | messages.ImportChatInvite | messages.GetStickerSet | messages.InstallStickerSet | messages.UninstallStickerSet | messages.StartBot | messages.GetMessagesViews | messages.EditChatAdmin | messages.MigrateChat | messages.SearchGlobal | messages.ReorderStickerSets | messages.GetDocumentByHash | messages.GetSavedGifs | messages.SaveGif | messages.GetInlineBotResults | messages.SetInlineBotResults | messages.SendInlineBotResult | messages.GetMessageEditData | messages.EditMessage | messages.EditInlineBotMessage | messages.GetBotCallbackAnswer | messages.SetBotCallbackAnswer | messages.GetPeerDialogs | messages.SaveDraft | messages.GetAllDrafts | messages.GetFeaturedStickers | messages.ReadFeaturedStickers | messages.GetRecentStickers | messages.SaveRecentSticker | messages.ClearRecentStickers | messages.GetArchivedStickers | messages.GetMaskStickers | messages.GetAttachedStickers | messages.SetGameScore | messages.SetInlineGameScore | messages.GetGameHighScores | messages.GetInlineGameHighScores | messages.GetCommonChats | messages.GetAllChats | messages.GetWebPage | messages.ToggleDialogPin | messages.ReorderPinnedDialogs | messages.GetPinnedDialogs | messages.SetBotShippingResults | messages.SetBotPrecheckoutResults | messages.UploadMedia | messages.SendScreenshotNotification | messages.GetFavedStickers | messages.FaveSticker | messages.GetUnreadMentions | messages.ReadMentions | messages.GetRecentLocations | messages.SendMultiMedia | messages.UploadEncryptedFile | messages.SearchStickerSets | messages.GetSplitRanges | messages.MarkDialogUnread | messages.GetDialogUnreadMarks | messages.ClearAllDrafts | messages.UpdatePinnedMessage | messages.SendVote | messages.GetPollResults | messages.GetOnlines | messages.GetStatsURL | messages.EditChatAbout | messages.EditChatDefaultBannedRights | messages.GetEmojiKeywords | messages.GetEmojiKeywordsDifference | messages.GetEmojiKeywordsLanguages | messages.GetEmojiURL | messages.GetSearchCounters | messages.RequestUrlAuth | messages.AcceptUrlAuth | messages.HidePeerSettingsBar | messages.GetScheduledHistory | messages.GetScheduledMessages | messages.SendScheduledMessages | messages.DeleteScheduledMessages | messages.GetPollVotes | messages.ToggleStickerSets | messages.GetDialogFilters | messages.GetSuggestedDialogFilters | messages.UpdateDialogFilter | messages.UpdateDialogFiltersOrder | messages.GetOldFeaturedStickers | messages.GetReplies | messages.GetDiscussionMessage | messages.ReadDiscussion | messages.UnpinAllMessages + | updates.GetState | updates.GetDifference | updates.GetChannelDifference + | photos.UpdateProfilePhoto | photos.UploadProfilePhoto | photos.DeletePhotos | photos.GetUserPhotos + | upload.SaveFilePart | upload.GetFile | upload.SaveBigFilePart | upload.GetWebFile | upload.GetCdnFile | upload.ReuploadCdnFile | upload.GetCdnFileHashes | upload.GetFileHashes + | help.GetConfig | help.GetNearestDc | help.GetAppUpdate | help.GetInviteText | help.GetSupport | help.GetAppChangelog | help.SetBotUpdatesStatus | help.GetCdnConfig | help.GetRecentMeUrls | help.GetTermsOfServiceUpdate | help.AcceptTermsOfService | help.GetDeepLinkInfo | help.GetAppConfig | help.SaveAppLog | help.GetPassportConfig | help.GetSupportName | help.GetUserInfo | help.EditUserInfo | help.GetPromoData | help.HidePromoData | help.DismissSuggestion | help.GetCountriesList + | channels.ReadHistory | channels.DeleteMessages | channels.DeleteUserHistory | channels.ReportSpam | channels.GetMessages | channels.GetParticipants | channels.GetParticipant | channels.GetChannels | channels.GetFullChannel | channels.CreateChannel | channels.EditAdmin | channels.EditTitle | channels.EditPhoto | channels.CheckUsername | channels.UpdateUsername | channels.JoinChannel | channels.LeaveChannel | channels.InviteToChannel | channels.DeleteChannel | channels.ExportMessageLink | channels.ToggleSignatures | channels.GetAdminedPublicChannels | channels.EditBanned | channels.GetAdminLog | channels.SetStickers | channels.ReadMessageContents | channels.DeleteHistory | channels.TogglePreHistoryHidden | channels.GetLeftChannels | channels.GetGroupsForDiscussion | channels.SetDiscussionGroup | channels.EditCreator | channels.EditLocation | channels.ToggleSlowMode | channels.GetInactiveChannels + | bots.SendCustomRequest | bots.AnswerWebhookJSONQuery | bots.SetBotCommands + | payments.GetPaymentForm | payments.GetPaymentReceipt | payments.ValidateRequestedInfo | payments.SendPaymentForm | payments.GetSavedInfo | payments.ClearSavedInfo | payments.GetBankCardData + | stickers.CreateStickerSet | stickers.RemoveStickerFromSet | stickers.ChangeStickerPosition | stickers.AddStickerToSet | stickers.SetStickerSetThumb + | phone.GetCallConfig | phone.RequestCall | phone.AcceptCall | phone.ConfirmCall | phone.ReceivedCall | phone.DiscardCall | phone.SetCallRating | phone.SaveCallDebug | phone.SendSignalingData + | langpack.GetLangPack | langpack.GetStrings | langpack.GetDifference | langpack.GetLanguages | langpack.GetLanguage + | folders.EditPeerFolders | folders.DeleteFolder + | stats.GetBroadcastStats | stats.LoadAsyncGraph | stats.GetMegagroupStats | stats.GetMessagePublicForwards | stats.GetMessageStats; + +} diff --git a/src/lib/gramjs/tl/api.js b/src/lib/gramjs/tl/api.js new file mode 100644 index 000000000..72da67171 --- /dev/null +++ b/src/lib/gramjs/tl/api.js @@ -0,0 +1,383 @@ +const { + parseTl, + serializeBytes, + serializeDate +} = require('./generationHelpers') +const { readBufferFromBigInt,toSignedLittleBuffer } = require('../Helpers') + +const tlContent = require('./apiTl.js') +const schemeContent = require('./schemaTl.js') + +/*CONTEST +const NAMED_AUTO_CASTS = new Set([ + 'chatId,int' +]) +const NAMED_BLACKLIST = new Set([ + 'discardEncryption' +]) +const AUTO_CASTS = new Set([ + 'InputPeer', + 'InputChannel', + 'InputUser', + 'InputDialogPeer', + 'InputNotifyPeer', + 'InputMedia', + 'InputPhoto', + 'InputMessage', + 'InputDocument', + 'InputChatPhoto' +]) + + */ +const CACHING_SUPPORTED = typeof self !== 'undefined' && self.localStorage !== undefined + +const CACHE_KEY = 'GramJs:apiCache' + +function buildApiFromTlSchema() { + let definitions; + const fromCache = CACHING_SUPPORTED && loadFromCache() + + if (fromCache) { + definitions = fromCache + } else { + definitions = loadFromTlSchemas() + + if (CACHING_SUPPORTED) { + localStorage.setItem(CACHE_KEY, JSON.stringify(definitions)) + } + } + + return mergeWithNamespaces( + createClasses('constructor', definitions.constructors), + createClasses('request', definitions.requests) + ) +} + +function loadFromCache() { + const jsonCache = localStorage.getItem(CACHE_KEY) + return jsonCache && JSON.parse(jsonCache) +} + +function loadFromTlSchemas() { + const [constructorParamsApi, functionParamsApi] = extractParams(tlContent) + const [constructorParamsSchema, functionParamsSchema] = extractParams(schemeContent) + const constructors = [].concat(constructorParamsApi, constructorParamsSchema) + const requests = [].concat(functionParamsApi, functionParamsSchema) + + return { constructors, requests } +} + +function mergeWithNamespaces(obj1, obj2) { + const result = { ...obj1 } + + Object.keys(obj2).forEach((key) => { + if (typeof obj2[key] === 'function' || !result[key]) { + result[key] = obj2[key] + } else { + Object.assign(result[key], obj2[key]) + } + }) + + return result +} + +function extractParams(fileContent) { + const f = parseTl(fileContent, 109) + const constructors = [] + const functions = [] + for (const d of f) { + d.isFunction ? functions.push(d) : constructors.push(d) + } + return [constructors, functions] +} + +function argToBytes(x, type) { + switch (type) { + case 'int': + const i = Buffer.alloc(4) + i.writeInt32LE(x, 0) + return i + case 'long': + return toSignedLittleBuffer(x, 8) + case 'int128': + return toSignedLittleBuffer(x, 16) + case 'int256': + return toSignedLittleBuffer(x, 32) + case 'double': + const d = Buffer.alloc(8) + d.writeDoubleLE(x, 0) + return d + case 'string': + return serializeBytes(x) + case 'Bool': + return x ? Buffer.from('b5757299', 'hex') : Buffer.from('379779bc', 'hex') + case 'true': + return Buffer.alloc(0) + case 'bytes': + return serializeBytes(x) + case 'date': + return serializeDate(x) + default: + return x.getBytes() + } +} +/* +CONTEST +async function getInputFromResolve(utils, client, peer, peerType) { + switch (peerType) { + case 'InputPeer': + return utils.getInputPeer(await client.getInputEntity(peer)) + case 'InputChannel': + return utils.getInputChannel(await client.getInputEntity(peer)) + case 'InputUser': + return utils.getInputUser(await client.getInputEntity(peer)) + case 'InputDialogPeer': + return await client._getInputDialog(peer) + case 'InputNotifyPeer': + return await client._getInputNotify(peer) + case 'InputMedia': + return utils.getInputMedia(peer) + case 'InputPhoto': + return utils.getInputPhoto(peer) + case 'InputMessage': + return utils.getInputMessage(peer) + case 'InputDocument': + return utils.getInputDocument(peer) + case 'InputChatPhoto': + return utils.getInputChatPhoto(peer) + case 'chatId,int' : + return await client.getPeerId(peer, false) + default: + throw new Error('unsupported peer type : ' + peerType) + } +} +*/ +function getArgFromReader(reader, arg) { + if (arg.isVector) { + if (arg.useVectorId) { + reader.readInt() + } + const temp = [] + const len = reader.readInt() + arg.isVector = false + for (let i = 0; i < len; i++) { + temp.push(getArgFromReader(reader, arg)) + } + arg.isVector = true + return temp + } else if (arg.flagIndicator) { + return reader.readInt() + } else { + switch (arg.type) { + case 'int': + return reader.readInt() + case 'long': + return reader.readLong() + case 'int128': + return reader.readLargeInt(128) + case 'int256': + return reader.readLargeInt(256) + case 'double': + return reader.readDouble() + case 'string': + return reader.tgReadString() + case 'Bool': + return reader.tgReadBool() + case 'true': + return true + case 'bytes': + return reader.tgReadBytes() + case 'date': + return reader.tgReadDate() + default: + if (!arg.skipConstructorId) { + return reader.tgReadObject() + } else { + return api.constructors[arg.type].fromReader(reader) + } + } + } +} + +function createClasses(classesType, params) { + const classes = {} + for (const classParams of params) { + const { name, constructorId, subclassOfId, argsConfig, namespace, result } = classParams + const fullName = [namespace, name].join('.').replace(/^\./, '') + + class VirtualClass { + static CONSTRUCTOR_ID = constructorId + static SUBCLASS_OF_ID = subclassOfId + static className = fullName + static classType = classesType + + CONSTRUCTOR_ID = constructorId + SUBCLASS_OF_ID = subclassOfId + className = fullName + classType = classesType + + constructor(args) { + args = args || {} + Object.keys(args) + .forEach((argName) => { + this[argName] = args[argName] + }) + } + + static fromReader(reader) { + + const args = {} + + for (const argName in argsConfig) { + if (argsConfig.hasOwnProperty(argName)) { + const arg = argsConfig[argName] + if (arg.isFlag) { + if (arg.type === 'true') { + args[argName] = Boolean(args['flags'] & 1 << arg.flagIndex) + continue + } + if (args['flags'] & 1 << arg.flagIndex) { + args[argName] = getArgFromReader(reader, arg) + } else { + args[argName] = null + } + } else { + if (arg.flagIndicator) { + arg.name = 'flags' + } + args[argName] = getArgFromReader(reader, arg) + } + } + } + return new VirtualClass(args) + } + + getBytes() { + // The next is pseudo-code: + const idForBytes = this.CONSTRUCTOR_ID + const c = Buffer.alloc(4) + c.writeUInt32LE(idForBytes, 0) + const buffers = [c] + for (const arg in argsConfig) { + if (argsConfig.hasOwnProperty(arg)) { + if (argsConfig[arg].isFlag) { + if ((this[arg]===false&&argsConfig[arg].type==="true") || this[arg]===null || this[arg]===undefined){ + continue + } + } + if (argsConfig[arg].isVector) { + if (argsConfig[arg].useVectorId) { + buffers.push(Buffer.from('15c4b51c', 'hex')) + } + const l = Buffer.alloc(4) + l.writeInt32LE(this[arg].length, 0) + buffers.push(l, Buffer.concat(this[arg].map(x => argToBytes(x, argsConfig[arg].type)))) + } else if (argsConfig[arg].flagIndicator) { + if (!Object.values(argsConfig) + .some((f) => f.isFlag)) { + buffers.push(Buffer.alloc(4)) + } else { + let flagCalculate = 0 + for (const f in argsConfig) { + if (argsConfig[f].isFlag) { + if ((this[f]===false&&argsConfig[f].type==="true") || this[f]===undefined || this[f]===null) { + flagCalculate |= 0 + } else { + flagCalculate |= 1 << argsConfig[f].flagIndex + } + } + } + const f = Buffer.alloc(4) + f.writeUInt32LE(flagCalculate, 0) + buffers.push(f) + } + } else { + buffers.push(argToBytes(this[arg], argsConfig[arg].type)) + + if (this[arg] && typeof this[arg].getBytes === 'function') { + let boxed = (argsConfig[arg].type.charAt(argsConfig[arg].type.indexOf('.') + 1)) + boxed = boxed === boxed.toUpperCase() + if (!boxed) { + buffers.shift() + } + } + } + } + + } + return Buffer.concat(buffers) + } + + readResult(reader) { + if (classesType !== 'request') { + throw new Error('`readResult()` called for non-request instance') + } + + const m = result.match(/Vector<(int|long)>/) + if (m) { + reader.readInt() + let temp = [] + let len = reader.readInt() + if (m[1] === 'int') { + for (let i = 0; i < len; i++) { + temp.push(reader.readInt()) + } + } else { + for (let i = 0; i < len; i++) { + temp.push(reader.readLong()) + } + } + return temp + } else { + return reader.tgReadObject() + } + } + + /*CONTEST + async resolve(client, utils) { + + if (classesType !== 'request') { + throw new Error('`resolve()` called for non-request instance') + } + + for (const arg in argsConfig) { + if (argsConfig.hasOwnProperty(arg)) { + if (!AUTO_CASTS.has(argsConfig[arg].type)) { + if (!NAMED_AUTO_CASTS.has(`${argsConfig[arg].name},${argsConfig[arg].type}`)) { + continue + } + } + if (argsConfig[arg].isFlag) { + if (!this[arg]) { + continue + } + } + if (argsConfig[arg].isVector) { + const temp = [] + for (const x of this[arg]) { + temp.push(await getInputFromResolve(utils, client, x, argsConfig[arg].type)) + } + this[arg] = temp + } else { + this[arg] = await getInputFromResolve(utils, client, this[arg], argsConfig[arg].type) + } + } + } + }*/ + } + + if (namespace) { + if (!classes[namespace]) { + classes[namespace] = {} + } + classes[namespace][name] = VirtualClass + + } else { + classes[name] = VirtualClass + } + } + + return classes +} + +module.exports = buildApiFromTlSchema() diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js new file mode 100644 index 000000000..e79b15331 --- /dev/null +++ b/src/lib/gramjs/tl/apiTl.js @@ -0,0 +1,988 @@ +module.exports = `boolFalse#bc799737 = Bool; +boolTrue#997275b5 = Bool; +true#3fedd339 = True; +vector#1cb5c415 {t:Type} # [ t ] = Vector t; +error#c4b9f9bb code:int text:string = Error; +null#56730bcc = Null; +inputPeerEmpty#7f3b18ea = InputPeer; +inputPeerSelf#7da07ec9 = InputPeer; +inputPeerChat#179be863 chat_id:int = InputPeer; +inputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer; +inputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer; +inputPeerUserFromMessage#17bae2e6 peer:InputPeer msg_id:int user_id:int = InputPeer; +inputPeerChannelFromMessage#9c95f7bb peer:InputPeer msg_id:int channel_id:int = InputPeer; +inputUserEmpty#b98886cf = InputUser; +inputUserSelf#f7c1b13f = InputUser; +inputUser#d8292816 user_id:int access_hash:long = InputUser; +inputUserFromMessage#2d117597 peer:InputPeer msg_id:int user_id:int = InputUser; +inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact; +inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile; +inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile; +inputMediaEmpty#9664f57f = InputMedia; +inputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia; +inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia; +inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia; +inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaDocument#23ab23d2 flags:# id:InputDocument ttl_seconds:flags.0?int = InputMedia; +inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia; +inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaGame#d33f43f3 id:InputGame = InputMedia; +inputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia; +inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia; +inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia; +inputMediaDice#e66fbf7b emoticon:string = InputMedia; +inputChatPhotoEmpty#1ca48f57 = InputChatPhoto; +inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto; +inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto; +inputGeoPointEmpty#e4c123d6 = InputGeoPoint; +inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint; +inputPhotoEmpty#1cd7bf0d = InputPhoto; +inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto; +inputFileLocation#dfdaabe1 volume_id:long local_id:int secret:long file_reference:bytes = InputFileLocation; +inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation; +inputDocumentFileLocation#bad07584 id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputSecureFileLocation#cbc7ee28 id:long access_hash:long = InputFileLocation; +inputTakeoutFileLocation#29be5899 = InputFileLocation; +inputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation; +inputPeerPhotoFileLocation#27d69997 flags:# big:flags.0?true peer:InputPeer volume_id:long local_id:int = InputFileLocation; +inputStickerSetThumb#dbaeae9 stickerset:InputStickerSet volume_id:long local_id:int = InputFileLocation; +peerUser#9db1bc6d user_id:int = Peer; +peerChat#bad0e5bb chat_id:int = Peer; +peerChannel#bddde532 channel_id:int = Peer; +storage.fileUnknown#aa963b05 = storage.FileType; +storage.filePartial#40bc6f52 = storage.FileType; +storage.fileJpeg#7efe0e = storage.FileType; +storage.fileGif#cae1aadf = storage.FileType; +storage.filePng#a4f63c0 = storage.FileType; +storage.filePdf#ae1e508d = storage.FileType; +storage.fileMp3#528a0677 = storage.FileType; +storage.fileMov#4b09ebbc = storage.FileType; +storage.fileMp4#b3cea0e4 = storage.FileType; +storage.fileWebp#1081464c = storage.FileType; +userEmpty#200250ba id:int = User; +user#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User; +userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto; +userProfilePhoto#69d3ab26 flags:# has_video:flags.0?true photo_id:long photo_small:FileLocation photo_big:FileLocation dc_id:int = UserProfilePhoto; +userStatusEmpty#9d05049 = UserStatus; +userStatusOnline#edb93949 expires:int = UserStatus; +userStatusOffline#8c703f was_online:int = UserStatus; +userStatusRecently#e26f42f1 = UserStatus; +userStatusLastWeek#7bf09fc = UserStatus; +userStatusLastMonth#77ebc742 = UserStatus; +chatEmpty#9ba2d800 id:int = Chat; +chat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; +chatForbidden#7328bdb id:int title:string = Chat; +channel#d31a961e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; +channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat; +chatFull#1b7c9db3 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int = ChatFull; +channelFull#f0e6672a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int = ChatFull; +chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant; +chatParticipantCreator#da13538a user_id:int = ChatParticipant; +chatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant; +chatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants; +chatParticipants#3f460fed chat_id:int participants:Vector version:int = ChatParticipants; +chatPhotoEmpty#37c1011c = ChatPhoto; +chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto; +messageEmpty#83e5de54 id:int = Message; +message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; +messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message; +messageMediaEmpty#3ded6320 = MessageMedia; +messageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia; +messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia; +messageMediaContact#cbf24940 phone_number:string first_name:string last_name:string vcard:string user_id:int = MessageMedia; +messageMediaUnsupported#9f84f49e = MessageMedia; +messageMediaDocument#9cb070d7 flags:# document:flags.0?Document ttl_seconds:flags.2?int = MessageMedia; +messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia; +messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia; +messageMediaGame#fdb19008 game:Game = MessageMedia; +messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia; +messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia; +messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; +messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; +messageActionEmpty#b6aef7b0 = MessageAction; +messageActionChatCreate#a6638b9a title:string users:Vector = MessageAction; +messageActionChatEditTitle#b5a1ce5a title:string = MessageAction; +messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction; +messageActionChatDeletePhoto#95e3fbef = MessageAction; +messageActionChatAddUser#488a7337 users:Vector = MessageAction; +messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction; +messageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction; +messageActionChannelCreate#95d2ac92 title:string = MessageAction; +messageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction; +messageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction; +messageActionPinMessage#94bd38ed = MessageAction; +messageActionHistoryClear#9fbab604 = MessageAction; +messageActionGameScore#92a72876 game_id:long score:int = MessageAction; +messageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction; +messageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction; +messageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction; +messageActionScreenshotTaken#4792929b = MessageAction; +messageActionCustomAction#fae69f56 message:string = MessageAction; +messageActionBotAllowed#abe9affe domain:string = MessageAction; +messageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction; +messageActionSecureValuesSent#d95c6154 types:Vector = MessageAction; +messageActionContactSignUp#f3f25f76 = MessageAction; +messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction; +dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog; +dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog; +photoEmpty#2331b22d id:long = Photo; +photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector video_sizes:flags.1?Vector dc_id:int = Photo; +photoSizeEmpty#e17e23c type:string = PhotoSize; +photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize; +photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize; +photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize; +photoSizeProgressive#5aa86a51 type:string location:FileLocation w:int h:int sizes:Vector = PhotoSize; +photoPathSize#d8214d41 type:string bytes:bytes = PhotoSize; +geoPointEmpty#1117dd5f = GeoPoint; +geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint; +auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; +auth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization; +auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization; +auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization; +inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer; +inputNotifyUsers#193b4417 = InputNotifyPeer; +inputNotifyChats#4a95e84e = InputNotifyPeer; +inputNotifyBroadcasts#b1db7c7e = InputNotifyPeer; +inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings; +peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings; +peerSettings#733f2961 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true geo_distance:flags.6?int = PeerSettings; +wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper; +wallPaperNoFile#8af40b25 flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper; +inputReportReasonSpam#58dbcab8 = ReportReason; +inputReportReasonViolence#1e22c78d = ReportReason; +inputReportReasonPornography#2e59d922 = ReportReason; +inputReportReasonChildAbuse#adf44ee3 = ReportReason; +inputReportReasonOther#e1746d0a text:string = ReportReason; +inputReportReasonCopyright#9b89f93a = ReportReason; +inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; +userFull#edf17c12 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int = UserFull; +contact#f911c994 user_id:int mutual:Bool = Contact; +importedContact#d0028438 user_id:int client_id:long = ImportedContact; +contactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus; +contacts.contactsNotModified#b74ba9d2 = contacts.Contacts; +contacts.contacts#eae87e42 contacts:Vector saved_count:int users:Vector = contacts.Contacts; +contacts.importedContacts#77d01c3b imported:Vector popular_invites:Vector retry_contacts:Vector users:Vector = contacts.ImportedContacts; +contacts.blocked#ade1591 blocked:Vector chats:Vector users:Vector = contacts.Blocked; +contacts.blockedSlice#e1664194 count:int blocked:Vector chats:Vector users:Vector = contacts.Blocked; +messages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs; +messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesNotModified#74535f21 count:int = messages.Messages; +messages.chats#64ff9fd5 chats:Vector = messages.Chats; +messages.chatsSlice#9cd81144 count:int chats:Vector = messages.Chats; +messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull; +messages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory; +inputMessagesFilterEmpty#57e2f66c = MessagesFilter; +inputMessagesFilterPhotos#9609a51c = MessagesFilter; +inputMessagesFilterVideo#9fc00e65 = MessagesFilter; +inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; +inputMessagesFilterDocument#9eddf188 = MessagesFilter; +inputMessagesFilterUrl#7ef0dd87 = MessagesFilter; +inputMessagesFilterGif#ffc86587 = MessagesFilter; +inputMessagesFilterVoice#50f5c392 = MessagesFilter; +inputMessagesFilterMusic#3751b49e = MessagesFilter; +inputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter; +inputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter; +inputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter; +inputMessagesFilterRoundVideo#b549da53 = MessagesFilter; +inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter; +inputMessagesFilterGeo#e7026d0d = MessagesFilter; +inputMessagesFilterContacts#e062db83 = MessagesFilter; +inputMessagesFilterPinned#1bb00451 = MessagesFilter; +updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; +updateMessageID#4e90bfd6 id:int random_id:long = Update; +updateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update; +updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update; +updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update; +updateChatParticipants#7761198 participants:ChatParticipants = Update; +updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update; +updateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update; +updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update; +updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update; +updateEncryptedChatTyping#1710f156 chat_id:int = Update; +updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update; +updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update; +updateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update; +updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update; +updateDcOptions#8e5e9873 dc_options:Vector = Update; +updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update; +updateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update; +updatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update; +updateUserPhone#12b9417b user_id:int phone:string = Update; +updateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update; +updateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update; +updateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update; +updateReadMessagesContents#68c13933 messages:Vector pts:int pts_count:int = Update; +updateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update; +updateChannel#b6d45656 channel_id:int = Update; +updateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update; +updateReadChannelInbox#330b5424 flags:# folder_id:flags.0?int channel_id:int max_id:int still_unread_count:int pts:int = Update; +updateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector pts:int pts_count:int = Update; +updateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update; +updateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update; +updateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update; +updateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector = Update; +updateStickerSets#43ae3dec = Update; +updateSavedGifs#9375341e = Update; +updateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update; +updateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update; +updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update; +updateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update; +updateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update; +updateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update; +updateReadFeaturedStickers#571d2742 = Update; +updateRecentStickers#9a422c20 = Update; +updateConfig#a229dd06 = Update; +updatePtsChanged#3354678f = Update; +updateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update; +updateDialogPinned#6e6fe51c flags:# pinned:flags.0?true folder_id:flags.1?int peer:DialogPeer = Update; +updatePinnedDialogs#fa0f3ca2 flags:# folder_id:flags.1?int order:flags.0?Vector = Update; +updateBotWebhookJSON#8317c0c3 data:DataJSON = Update; +updateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update; +updateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update; +updateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update; +updatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update; +updateLangPackTooLong#46560264 lang_code:string = Update; +updateLangPack#56022f4d difference:LangPackDifference = Update; +updateFavedStickers#e511996d = Update; +updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector = Update; +updateContactsReset#7084a7be = Update; +updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update; +updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update; +updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update; +updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update; +updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update; +updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update; +updatePeerLocated#b4afcfb0 peers:Vector = Update; +updateNewScheduledMessage#39a51dfb message:Message = Update; +updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update; +updateTheme#8216fba3 theme:Theme = Update; +updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update; +updateLoginToken#564fe691 = Update; +updateMessagePollVote#42f88f2c poll_id:long user_id:int options:Vector = Update; +updateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update; +updateDialogFilterOrder#a5d72105 order:Vector = Update; +updateDialogFilters#3504914f = Update; +updatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update; +updateChannelParticipant#65d2b464 flags:# channel_id:int date:int user_id:int prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant qts:int = Update; +updateChannelMessageForwards#6e8a84df channel_id:int id:int forwards:int = Update; +updateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int read_max_id:int broadcast_id:flags.0?int broadcast_post:flags.0?int = Update; +updateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update; +updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update; +updateChannelUserTyping#ff2abe9f flags:# channel_id:int top_msg_id:flags.0?int user_id:int action:SendMessageAction = Update; +updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update; +updatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector pts:int pts_count:int = Update; +updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; +updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; +updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; +updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference; +updates.differenceTooLong#4afe8f6d pts:int = updates.Difference; +updatesTooLong#e317af7e = Updates; +updateShortMessage#2296d2c8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShortChatMessage#402d5dbb flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShort#78d4dec1 update:Update date:int = Updates; +updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; +updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; +updateShortSentMessage#11f1331c flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector = Updates; +photos.photos#8dca6aa5 photos:Vector users:Vector = photos.Photos; +photos.photosSlice#15051f54 count:int photos:Vector users:Vector = photos.Photos; +photos.photo#20212ca8 photo:Photo users:Vector = photos.Photo; +upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File; +upload.fileCdnRedirect#f18cda44 dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes file_hashes:Vector = upload.File; +dcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption; +config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config; +nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc; +help.appUpdate#1da7158f flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string = help.AppUpdate; +help.noAppUpdate#c45a6536 = help.AppUpdate; +help.inviteText#18cb9f78 message:string = help.InviteText; +encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat; +encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat; +encryptedChatRequested#62718a82 flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat; +encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat; +encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat; +inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat; +encryptedFileEmpty#c21f497e = EncryptedFile; +encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile; +inputEncryptedFileEmpty#1837c364 = InputEncryptedFile; +inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile; +inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile; +inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile; +encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage; +encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage; +messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig; +messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig; +messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage; +messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage; +inputDocumentEmpty#72f0eaae = InputDocument; +inputDocument#1abfb575 id:long access_hash:long file_reference:bytes = InputDocument; +documentEmpty#36f8c871 id:long = Document; +document#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector video_thumbs:flags.1?Vector dc_id:int attributes:Vector = Document; +help.support#17c6b5f6 phone_number:string user:User = help.Support; +notifyPeer#9fd40bd8 peer:Peer = NotifyPeer; +notifyUsers#b4c83b4c = NotifyPeer; +notifyChats#c007cec3 = NotifyPeer; +notifyBroadcasts#d612e8ef = NotifyPeer; +sendMessageTypingAction#16bf744e = SendMessageAction; +sendMessageCancelAction#fd5ec8f5 = SendMessageAction; +sendMessageRecordVideoAction#a187d66f = SendMessageAction; +sendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction; +sendMessageRecordAudioAction#d52f73f7 = SendMessageAction; +sendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction; +sendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction; +sendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction; +sendMessageGeoLocationAction#176f8ba1 = SendMessageAction; +sendMessageChooseContactAction#628cbc6f = SendMessageAction; +sendMessageGamePlayAction#dd6a8f48 = SendMessageAction; +sendMessageRecordRoundAction#88f27fbc = SendMessageAction; +sendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction; +contacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found; +inputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey; +inputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey; +inputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey; +inputPrivacyKeyPhoneP2P#db9e70d2 = InputPrivacyKey; +inputPrivacyKeyForwards#a4dd4c08 = InputPrivacyKey; +inputPrivacyKeyProfilePhoto#5719bacc = InputPrivacyKey; +inputPrivacyKeyPhoneNumber#352dafa = InputPrivacyKey; +inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey; +privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey; +privacyKeyChatInvite#500e6dfa = PrivacyKey; +privacyKeyPhoneCall#3d662b7b = PrivacyKey; +privacyKeyPhoneP2P#39491cc8 = PrivacyKey; +privacyKeyForwards#69ec56a3 = PrivacyKey; +privacyKeyProfilePhoto#96151fed = PrivacyKey; +privacyKeyPhoneNumber#d19ae46d = PrivacyKey; +privacyKeyAddedByPhone#42ffd42b = PrivacyKey; +inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule; +inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule; +inputPrivacyValueAllowUsers#131cc67f users:Vector = InputPrivacyRule; +inputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule; +inputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule; +inputPrivacyValueDisallowUsers#90110467 users:Vector = InputPrivacyRule; +inputPrivacyValueAllowChatParticipants#4c81c1ba chats:Vector = InputPrivacyRule; +inputPrivacyValueDisallowChatParticipants#d82363af chats:Vector = InputPrivacyRule; +privacyValueAllowContacts#fffe1bac = PrivacyRule; +privacyValueAllowAll#65427b82 = PrivacyRule; +privacyValueAllowUsers#4d5bbe0c users:Vector = PrivacyRule; +privacyValueDisallowContacts#f888fa1a = PrivacyRule; +privacyValueDisallowAll#8b73e763 = PrivacyRule; +privacyValueDisallowUsers#c7f49b7 users:Vector = PrivacyRule; +privacyValueAllowChatParticipants#18be796b chats:Vector = PrivacyRule; +privacyValueDisallowChatParticipants#acae0690 chats:Vector = PrivacyRule; +account.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules; +accountDaysTTL#b8d0afdf days:int = AccountDaysTTL; +documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; +documentAttributeAnimated#11b58939 = DocumentAttribute; +documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute; +documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute; +documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute; +documentAttributeFilename#15590068 file_name:string = DocumentAttribute; +documentAttributeHasStickers#9801d2f7 = DocumentAttribute; +messages.stickersNotModified#f1749a22 = messages.Stickers; +messages.stickers#e4599bbd hash:int stickers:Vector = messages.Stickers; +stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; +messages.allStickersNotModified#e86602c3 = messages.AllStickers; +messages.allStickers#edfd405f hash:int sets:Vector = messages.AllStickers; +messages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages; +webPageEmpty#eb1477e8 id:long = WebPage; +webPagePending#c586da1c id:long date:int = WebPage; +webPage#e89c45b2 flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage; +webPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage; +authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization; +account.authorizations#1250abde authorizations:Vector = account.Authorizations; +account.password#ad2641f8 flags:# has_recovery:flags.0?true has_secure_values:flags.1?true has_password:flags.2?true current_algo:flags.2?PasswordKdfAlgo srp_B:flags.2?bytes srp_id:flags.2?long hint:flags.3?string email_unconfirmed_pattern:flags.4?string new_algo:PasswordKdfAlgo new_secure_algo:SecurePasswordKdfAlgo secure_random:bytes = account.Password; +account.passwordSettings#9a5c33e5 flags:# email:flags.0?string secure_settings:flags.1?SecureSecretSettings = account.PasswordSettings; +account.passwordInputSettings#c23727c9 flags:# new_algo:flags.0?PasswordKdfAlgo new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string new_secure_settings:flags.2?SecureSecretSettings = account.PasswordInputSettings; +auth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery; +receivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage; +chatInviteEmpty#69df3769 = ExportedChatInvite; +chatInviteExported#fc2e05bc link:string = ExportedChatInvite; +chatInviteAlready#5a686d7c chat:Chat = ChatInvite; +chatInvite#dfc2f58e flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:Photo participants_count:int participants:flags.4?Vector = ChatInvite; +chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite; +inputStickerSetEmpty#ffb62b95 = InputStickerSet; +inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet; +inputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet; +inputStickerSetAnimatedEmoji#28703c8 = InputStickerSet; +inputStickerSetDice#e67f520e emoticon:string = InputStickerSet; +stickerSet#eeb46f27 flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true animated:flags.5?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumb:flags.4?PhotoSize thumb_dc_id:flags.4?int count:int hash:int = StickerSet; +messages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet; +botCommand#c27ac8c7 command:string description:string = BotCommand; +botInfo#98e81d3a user_id:int description:string commands:Vector = BotInfo; +keyboardButton#a2fa4880 text:string = KeyboardButton; +keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; +keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; +keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; +keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; +keyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton; +keyboardButtonGame#50f41ccf text:string = KeyboardButton; +keyboardButtonBuy#afd93fbb text:string = KeyboardButton; +keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton; +inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton; +keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; +keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow; +replyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup; +replyKeyboardForceReply#f4108aa0 flags:# single_use:flags.1?true selective:flags.2?true = ReplyMarkup; +replyKeyboardMarkup#3502758c flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector = ReplyMarkup; +replyInlineMarkup#48a30254 rows:Vector = ReplyMarkup; +messageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity; +messageEntityMention#fa04579d offset:int length:int = MessageEntity; +messageEntityHashtag#6f635b0d offset:int length:int = MessageEntity; +messageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity; +messageEntityUrl#6ed02538 offset:int length:int = MessageEntity; +messageEntityEmail#64e475c2 offset:int length:int = MessageEntity; +messageEntityBold#bd610bc9 offset:int length:int = MessageEntity; +messageEntityItalic#826f8b60 offset:int length:int = MessageEntity; +messageEntityCode#28a20571 offset:int length:int = MessageEntity; +messageEntityPre#73924be0 offset:int length:int language:string = MessageEntity; +messageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity; +messageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity; +inputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity; +messageEntityPhone#9b69e34b offset:int length:int = MessageEntity; +messageEntityCashtag#4c4e743f offset:int length:int = MessageEntity; +messageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity; +messageEntityStrike#bf0693d4 offset:int length:int = MessageEntity; +messageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity; +messageEntityBankCard#761e6af4 offset:int length:int = MessageEntity; +inputChannelEmpty#ee8c1e86 = InputChannel; +inputChannel#afeb712e channel_id:int access_hash:long = InputChannel; +inputChannelFromMessage#2a286531 peer:InputPeer msg_id:int channel_id:int = InputChannel; +contacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector users:Vector = contacts.ResolvedPeer; +messageRange#ae30253 min_id:int max_id:int = MessageRange; +updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference; +updates.channelDifferenceTooLong#a4bcc6fe flags:# final:flags.0?true timeout:flags.1?int dialog:Dialog messages:Vector chats:Vector users:Vector = updates.ChannelDifference; +updates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector other_updates:Vector chats:Vector users:Vector = updates.ChannelDifference; +channelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter; +channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector = ChannelMessagesFilter; +channelParticipant#15ebac1d user_id:int date:int = ChannelParticipant; +channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant; +channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; +channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; +channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; +channelParticipantLeft#c3c6796b user_id:int = ChannelParticipant; +channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; +channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter; +channelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter; +channelParticipantsBots#b0d1865b = ChannelParticipantsFilter; +channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter; +channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter; +channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter; +channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter; +channels.channelParticipants#f56ee2a8 count:int participants:Vector users:Vector = channels.ChannelParticipants; +channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants; +channels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector = channels.ChannelParticipant; +help.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector min_age_confirm:flags.1?int = help.TermsOfService; +messages.savedGifsNotModified#e8025ca2 = messages.SavedGifs; +messages.savedGifs#2e0709a5 hash:int gifs:Vector = messages.SavedGifs; +inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineResult#88bf9319 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?InputWebDocument content:flags.5?InputWebDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult; +botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineResult#11965f3a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?WebDocument content:flags.5?WebDocument send_message:BotInlineMessage = BotInlineResult; +botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult; +messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector cache_time:int users:Vector = messages.BotResults; +exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink; +messageFwdHeader#5f777dce flags:# from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; +auth.codeTypeSms#72a3158c = auth.CodeType; +auth.codeTypeCall#741cd3e3 = auth.CodeType; +auth.codeTypeFlashCall#226ccefb = auth.CodeType; +auth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType; +auth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType; +auth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType; +auth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType; +messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer; +messages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData; +inputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID; +inlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM; +messages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs; +topPeer#edcdc05b peer:Peer rating:double = TopPeer; +topPeerCategoryBotsPM#ab661b5b = TopPeerCategory; +topPeerCategoryBotsInline#148677e2 = TopPeerCategory; +topPeerCategoryCorrespondents#637b7ed = TopPeerCategory; +topPeerCategoryGroups#bd17a14a = TopPeerCategory; +topPeerCategoryChannels#161d9628 = TopPeerCategory; +topPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory; +topPeerCategoryForwardUsers#a8406ca9 = TopPeerCategory; +topPeerCategoryForwardChats#fbeec0f0 = TopPeerCategory; +topPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector = TopPeerCategoryPeers; +contacts.topPeersNotModified#de266ef5 = contacts.TopPeers; +contacts.topPeers#70b772a8 categories:Vector chats:Vector users:Vector = contacts.TopPeers; +contacts.topPeersDisabled#b52c939d = contacts.TopPeers; +draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage; +draftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector date:int = DraftMessage; +messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers; +messages.featuredStickers#b6abc341 hash:int count:int sets:Vector unread:Vector = messages.FeaturedStickers; +messages.recentStickersNotModified#b17f890 = messages.RecentStickers; +messages.recentStickers#22f3afb3 hash:int packs:Vector stickers:Vector dates:Vector = messages.RecentStickers; +messages.archivedStickers#4fcba9c8 count:int sets:Vector = messages.ArchivedStickers; +messages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult; +messages.stickerSetInstallResultArchive#35e410a8 sets:Vector = messages.StickerSetInstallResult; +stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered; +stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered; +maskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords; +inputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia; +inputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia; +game#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game; +inputGameID#32c3e77 id:long access_hash:long = InputGame; +inputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame; +highScore#58fffcd0 pos:int user_id:int score:int = HighScore; +messages.highScores#9a3bfd99 scores:Vector users:Vector = messages.HighScores; +textEmpty#dc3d824f = RichText; +textPlain#744694e0 text:string = RichText; +textBold#6724abc4 text:RichText = RichText; +textItalic#d912a59c text:RichText = RichText; +textUnderline#c12622c4 text:RichText = RichText; +textStrike#9bf8bb95 text:RichText = RichText; +textFixed#6c3f19b9 text:RichText = RichText; +textUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText; +textEmail#de5a0dd6 text:RichText email:string = RichText; +textConcat#7e6260d7 texts:Vector = RichText; +textSubscript#ed6a8504 text:RichText = RichText; +textSuperscript#c7fb5e01 text:RichText = RichText; +textMarked#34b8621 text:RichText = RichText; +textPhone#1ccb966a text:RichText phone:string = RichText; +textImage#81ccf4f document_id:long w:int h:int = RichText; +textAnchor#35553762 text:RichText name:string = RichText; +pageBlockUnsupported#13567e8a = PageBlock; +pageBlockTitle#70abc3fd text:RichText = PageBlock; +pageBlockSubtitle#8ffa9a1f text:RichText = PageBlock; +pageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock; +pageBlockHeader#bfd064ec text:RichText = PageBlock; +pageBlockSubheader#f12bb6e1 text:RichText = PageBlock; +pageBlockParagraph#467a0766 text:RichText = PageBlock; +pageBlockPreformatted#c070d93e text:RichText language:string = PageBlock; +pageBlockFooter#48870999 text:RichText = PageBlock; +pageBlockDivider#db20b188 = PageBlock; +pageBlockAnchor#ce0d37b0 name:string = PageBlock; +pageBlockList#e4e88011 items:Vector = PageBlock; +pageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock; +pageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock; +pageBlockPhoto#1759c560 flags:# photo_id:long caption:PageCaption url:flags.0?string webpage_id:flags.0?long = PageBlock; +pageBlockVideo#7c8fe7b6 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:PageCaption = PageBlock; +pageBlockCover#39f23300 cover:PageBlock = PageBlock; +pageBlockEmbed#a8718dc5 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:flags.5?int h:flags.5?int caption:PageCaption = PageBlock; +pageBlockEmbedPost#f259a80b url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector caption:PageCaption = PageBlock; +pageBlockCollage#65a0fa4d items:Vector caption:PageCaption = PageBlock; +pageBlockSlideshow#31f9590 items:Vector caption:PageCaption = PageBlock; +pageBlockChannel#ef1751b5 channel:Chat = PageBlock; +pageBlockAudio#804361ea audio_id:long caption:PageCaption = PageBlock; +pageBlockKicker#1e148390 text:RichText = PageBlock; +pageBlockTable#bf4dea82 flags:# bordered:flags.0?true striped:flags.1?true title:RichText rows:Vector = PageBlock; +pageBlockOrderedList#9a8ae1e1 items:Vector = PageBlock; +pageBlockDetails#76768bed flags:# open:flags.0?true blocks:Vector title:RichText = PageBlock; +pageBlockRelatedArticles#16115a96 title:RichText articles:Vector = PageBlock; +pageBlockMap#a44f3ef6 geo:GeoPoint zoom:int w:int h:int caption:PageCaption = PageBlock; +phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason; +phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason; +phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason; +phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason; +dataJSON#7d748d04 data:string = DataJSON; +labeledPrice#cb296bf8 label:string amount:long = LabeledPrice; +invoice#c30aa358 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector = Invoice; +paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge; +postAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress; +paymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo; +paymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials; +webDocument#1c570ed1 url:string access_hash:long size:int mime_type:string attributes:Vector = WebDocument; +webDocumentNoProxy#f9c8bcc6 url:string size:int mime_type:string attributes:Vector = WebDocument; +inputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector = InputWebDocument; +inputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation; +inputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w:int h:int zoom:int scale:int = InputWebFileLocation; +upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile; +payments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; +payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; +payments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult; +payments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult; +payments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt; +payments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo; +inputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials; +inputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsAndroidPay#ca05d50e payment_token:DataJSON google_transaction_id:string = InputPaymentCredentials; +account.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword; +shippingOption#b6213cdf id:string title:string prices:Vector = ShippingOption; +inputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem; +inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall; +phoneCallEmpty#5366c915 id:long = PhoneCall; +phoneCallWaiting#1b8f4ad1 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall; +phoneCallRequested#87eabb53 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCallAccepted#997c454a flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCall#8742ae7f flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int = PhoneCall; +phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall; +phoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection; +phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection; +phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector = PhoneCallProtocol; +phone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector = phone.PhoneCall; +upload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile; +upload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile; +cdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey; +cdnConfig#5725e40a public_keys:Vector = CdnConfig; +langPackString#cad181f6 key:string value:string = LangPackString; +langPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString; +langPackStringDeleted#2979eeb2 key:string = LangPackString; +langPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector = LangPackDifference; +langPackLanguage#eeca5ce3 flags:# official:flags.0?true rtl:flags.2?true beta:flags.3?true name:string native_name:string lang_code:string base_lang_code:flags.1?string plural_code:string strings_count:int translated_count:int translations_url:string = LangPackLanguage; +channelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangePhoto#434bd2af prev_photo:Photo new_photo:Photo = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction; +channelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBannedRights new_banned_rights:ChatBannedRights = ChannelAdminLogEventAction; +channelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLinkedChat#a26f881b prev_value:int new_value:int = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction; +channelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent; +channels.adminLogResults#ed8af74d events:Vector chats:Vector users:Vector = channels.AdminLogResults; +channelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true = ChannelAdminLogEventsFilter; +popularContact#5ce14175 client_id:long importers:int = PopularContact; +messages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers; +messages.favedStickers#f37f2f16 hash:int packs:Vector stickers:Vector = messages.FavedStickers; +recentMeUrlUnknown#46e1d13d url:string = RecentMeUrl; +recentMeUrlUser#8dbc3336 url:string user_id:int = RecentMeUrl; +recentMeUrlChat#a01b22f9 url:string chat_id:int = RecentMeUrl; +recentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl; +recentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl; +help.recentMeUrls#e0310d7 urls:Vector chats:Vector users:Vector = help.RecentMeUrls; +inputSingleMedia#1cc6e91f flags:# media:InputMedia random_id:long message:string entities:flags.0?Vector = InputSingleMedia; +webAuthorization#cac943f2 hash:long bot_id:int domain:string browser:string platform:string date_created:int date_active:int ip:string region:string = WebAuthorization; +account.webAuthorizations#ed56c9fc authorizations:Vector users:Vector = account.WebAuthorizations; +inputMessageID#a676a322 id:int = InputMessage; +inputMessageReplyTo#bad88395 id:int = InputMessage; +inputMessagePinned#86872538 = InputMessage; +inputMessageCallbackQuery#acfa1a7e id:int query_id:long = InputMessage; +inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer; +inputDialogPeerFolder#64600527 folder_id:int = InputDialogPeer; +dialogPeer#e56dbf05 peer:Peer = DialogPeer; +dialogPeerFolder#514519e2 folder_id:int = DialogPeer; +messages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets; +messages.foundStickerSets#5108d648 hash:int sets:Vector = messages.FoundStickerSets; +fileHash#6242c773 offset:int limit:int hash:bytes = FileHash; +inputClientProxy#75588b3f address:string port:int = InputClientProxy; +help.termsOfServiceUpdateEmpty#e3309f7f expires:int = help.TermsOfServiceUpdate; +help.termsOfServiceUpdate#28ecf961 expires:int terms_of_service:help.TermsOfService = help.TermsOfServiceUpdate; +inputSecureFileUploaded#3334b0f0 id:long parts:int md5_checksum:string file_hash:bytes secret:bytes = InputSecureFile; +inputSecureFile#5367e5be id:long access_hash:long = InputSecureFile; +secureFileEmpty#64199744 = SecureFile; +secureFile#e0277a62 id:long access_hash:long size:int dc_id:int date:int file_hash:bytes secret:bytes = SecureFile; +secureData#8aeabec3 data:bytes data_hash:bytes secret:bytes = SecureData; +securePlainPhone#7d6099dd phone:string = SecurePlainData; +securePlainEmail#21ec5a5f email:string = SecurePlainData; +secureValueTypePersonalDetails#9d2a81e3 = SecureValueType; +secureValueTypePassport#3dac6a00 = SecureValueType; +secureValueTypeDriverLicense#6e425c4 = SecureValueType; +secureValueTypeIdentityCard#a0d0744b = SecureValueType; +secureValueTypeInternalPassport#99a48f23 = SecureValueType; +secureValueTypeAddress#cbe31e26 = SecureValueType; +secureValueTypeUtilityBill#fc36954e = SecureValueType; +secureValueTypeBankStatement#89137c0d = SecureValueType; +secureValueTypeRentalAgreement#8b883488 = SecureValueType; +secureValueTypePassportRegistration#99e3806a = SecureValueType; +secureValueTypeTemporaryRegistration#ea02ec33 = SecureValueType; +secureValueTypePhone#b320aadb = SecureValueType; +secureValueTypeEmail#8e3ca7ee = SecureValueType; +secureValue#187fa0ca flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?SecureFile reverse_side:flags.2?SecureFile selfie:flags.3?SecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData hash:bytes = SecureValue; +inputSecureValue#db21d0a7 flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?InputSecureFile reverse_side:flags.2?InputSecureFile selfie:flags.3?InputSecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData = InputSecureValue; +secureValueHash#ed1ecdb0 type:SecureValueType hash:bytes = SecureValueHash; +secureValueErrorData#e8a40bd9 type:SecureValueType data_hash:bytes field:string text:string = SecureValueError; +secureValueErrorFrontSide#be3dfa type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorReverseSide#868a2aa5 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorSelfie#e537ced6 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFile#7a700873 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFiles#666220e9 type:SecureValueType file_hash:Vector text:string = SecureValueError; +secureValueError#869d758f type:SecureValueType hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFile#a1144770 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFiles#34636dd8 type:SecureValueType file_hash:Vector text:string = SecureValueError; +secureCredentialsEncrypted#33f0ea47 data:bytes hash:bytes secret:bytes = SecureCredentialsEncrypted; +account.authorizationForm#ad2e1cd8 flags:# required_types:Vector values:Vector errors:Vector users:Vector privacy_policy_url:flags.0?string = account.AuthorizationForm; +account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; +help.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo; +help.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo; +savedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact; +account.takeout#4dba4501 id:long = account.Takeout; +passwordKdfAlgoUnknown#d45ab096 = PasswordKdfAlgo; +passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow#3a912d4a salt1:bytes salt2:bytes g:int p:bytes = PasswordKdfAlgo; +securePasswordKdfAlgoUnknown#4a8537 = SecurePasswordKdfAlgo; +securePasswordKdfAlgoPBKDF2HMACSHA512iter100000#bbf2dda0 salt:bytes = SecurePasswordKdfAlgo; +securePasswordKdfAlgoSHA512#86471d92 salt:bytes = SecurePasswordKdfAlgo; +secureSecretSettings#1527bcac secure_algo:SecurePasswordKdfAlgo secure_secret:bytes secure_secret_id:long = SecureSecretSettings; +inputCheckPasswordEmpty#9880f658 = InputCheckPasswordSRP; +inputCheckPasswordSRP#d27ff082 srp_id:long A:bytes M1:bytes = InputCheckPasswordSRP; +secureRequiredType#829d99da flags:# native_names:flags.0?true selfie_required:flags.1?true translation_required:flags.2?true type:SecureValueType = SecureRequiredType; +secureRequiredTypeOneOf#27477b4 types:Vector = SecureRequiredType; +help.passportConfigNotModified#bfb9f457 = help.PassportConfig; +help.passportConfig#a098d6af hash:int countries_langs:DataJSON = help.PassportConfig; +inputAppEvent#1d1b1245 time:double type:string peer:long data:JSONValue = InputAppEvent; +jsonObjectValue#c0de1bd9 key:string value:JSONValue = JSONObjectValue; +jsonNull#3f6d7b68 = JSONValue; +jsonBool#c7345e6a value:Bool = JSONValue; +jsonNumber#2be0dfa4 value:double = JSONValue; +jsonString#b71e767a value:string = JSONValue; +jsonArray#f7444763 value:Vector = JSONValue; +jsonObject#99c1d49d value:Vector = JSONValue; +pageTableCell#34566b6a flags:# header:flags.0?true align_center:flags.3?true align_right:flags.4?true valign_middle:flags.5?true valign_bottom:flags.6?true text:flags.7?RichText colspan:flags.1?int rowspan:flags.2?int = PageTableCell; +pageTableRow#e0c0c5e5 cells:Vector = PageTableRow; +pageCaption#6f747657 text:RichText credit:RichText = PageCaption; +pageListItemText#b92fb6cd text:RichText = PageListItem; +pageListItemBlocks#25e073fc blocks:Vector = PageListItem; +pageListOrderedItemText#5e068047 num:string text:RichText = PageListOrderedItem; +pageListOrderedItemBlocks#98dd8936 num:string blocks:Vector = PageListOrderedItem; +pageRelatedArticle#b390dc08 flags:# url:string webpage_id:long title:flags.0?string description:flags.1?string photo_id:flags.2?long author:flags.3?string published_date:flags.4?int = PageRelatedArticle; +page#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:string blocks:Vector photos:Vector documents:Vector views:flags.3?int = Page; +help.supportName#8c05f1c9 name:string = help.SupportName; +help.userInfoEmpty#f3ae2eed = help.UserInfo; +help.userInfo#1eb3758 message:string entities:Vector author:string date:int = help.UserInfo; +pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer; +poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector close_period:flags.4?int close_date:flags.5?int = Poll; +pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters; +pollResults#badcc1a3 flags:# min:flags.0?true results:flags.1?Vector total_voters:flags.2?int recent_voters:flags.3?Vector solution:flags.4?string solution_entities:flags.4?Vector = PollResults; +chatOnlines#f041e250 onlines:int = ChatOnlines; +statsURL#47a971e0 url:string = StatsURL; +chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true = ChatAdminRights; +chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights; +inputWallPaper#e630b979 id:long access_hash:long = InputWallPaper; +inputWallPaperSlug#72091c80 slug:string = InputWallPaper; +inputWallPaperNoFile#8427bbac = InputWallPaper; +account.wallPapersNotModified#1c199183 = account.WallPapers; +account.wallPapers#702b65a9 hash:int wallpapers:Vector = account.WallPapers; +codeSettings#debebe83 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true = CodeSettings; +wallPaperSettings#5086cf8 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int intensity:flags.3?int rotation:flags.4?int = WallPaperSettings; +autoDownloadSettings#e04232f3 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true photo_size_max:int video_size_max:int file_size_max:int video_upload_maxbitrate:int = AutoDownloadSettings; +account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; +emojiKeyword#d5b3b9f9 keyword:string emoticons:Vector = EmojiKeyword; +emojiKeywordDeleted#236df622 keyword:string emoticons:Vector = EmojiKeyword; +emojiKeywordsDifference#5cc761bd lang_code:string from_version:int version:int keywords:Vector = EmojiKeywordsDifference; +emojiURL#a575739d url:string = EmojiURL; +emojiLanguage#b3fb5361 lang_code:string = EmojiLanguage; +fileLocationToBeDeprecated#bc7fc6cd volume_id:long local_id:int = FileLocation; +folder#ff544e65 flags:# autofill_new_broadcasts:flags.0?true autofill_public_groups:flags.1?true autofill_new_correspondents:flags.2?true id:int title:string photo:flags.3?ChatPhoto = Folder; +inputFolderPeer#fbd2c296 peer:InputPeer folder_id:int = InputFolderPeer; +folderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer; +messages.searchCounter#e844ebff flags:# inexact:flags.1?true filter:MessagesFilter count:int = messages.SearchCounter; +urlAuthResultRequest#92d33a0e flags:# request_write_access:flags.0?true bot:User domain:string = UrlAuthResult; +urlAuthResultAccepted#8f8c0e4e url:string = UrlAuthResult; +urlAuthResultDefault#a9d6db1f = UrlAuthResult; +channelLocationEmpty#bfb5ad8b = ChannelLocation; +channelLocation#209b82db geo_point:GeoPoint address:string = ChannelLocation; +peerLocated#ca461b5d peer:Peer expires:int distance:int = PeerLocated; +peerSelfLocated#f8ec284b expires:int = PeerLocated; +restrictionReason#d072acb4 platform:string reason:string text:string = RestrictionReason; +inputTheme#3c5693e9 id:long access_hash:long = InputTheme; +inputThemeSlug#f5890df1 slug:string = InputTheme; +theme#28f1114 flags:# creator:flags.0?true default:flags.1?true id:long access_hash:long slug:string title:string document:flags.2?Document settings:flags.3?ThemeSettings installs_count:int = Theme; +account.themesNotModified#f41eb622 = account.Themes; +account.themes#7f676421 hash:int themes:Vector = account.Themes; +auth.loginToken#629f1980 expires:int token:bytes = auth.LoginToken; +auth.loginTokenMigrateTo#68e9916 dc_id:int token:bytes = auth.LoginToken; +auth.loginTokenSuccess#390d5c5e authorization:auth.Authorization = auth.LoginToken; +account.contentSettings#57e28221 flags:# sensitive_enabled:flags.0?true sensitive_can_change:flags.1?true = account.ContentSettings; +messages.inactiveChats#a927fec5 dates:Vector chats:Vector users:Vector = messages.InactiveChats; +baseThemeClassic#c3a12462 = BaseTheme; +baseThemeDay#fbd81688 = BaseTheme; +baseThemeNight#b7b31ea8 = BaseTheme; +baseThemeTinted#6d5f77ee = BaseTheme; +baseThemeArctic#5b11125a = BaseTheme; +inputThemeSettings#bd507cd1 flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?InputWallPaper wallpaper_settings:flags.1?WallPaperSettings = InputThemeSettings; +themeSettings#9c14984a flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?WallPaper = ThemeSettings; +webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; +messageUserVote#a28e5559 user_id:int option:bytes date:int = MessageUserVote; +messageUserVoteInputOption#36377430 user_id:int date:int = MessageUserVote; +messageUserVoteMultiple#e8fe0de user_id:int options:Vector date:int = MessageUserVote; +messages.votesList#823f649 flags:# count:int votes:Vector users:Vector next_offset:flags.0?string = messages.VotesList; +bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; +payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; +dialogFilter#7438f7e8 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter; +dialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested; +// Some unused classes were removed below this line +videoSize#e831c556 flags:# type:string location:FileLocation w:int h:int size:int video_start_ts:flags.0?double = VideoSize; +messages.discussionMessage#f5dd8f9d flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector users:Vector = messages.DiscussionMessage; +messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; +messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int max_id:flags.2?int read_max_id:flags.3?int = MessageReplies; +peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; +---functions--- +initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; +invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; +auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; +auth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization; +auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; +auth.logOut#5717da40 = Bool; +auth.resetAuthorizations#9fab0d1a = Bool; +auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization; +auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization; +auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool; +auth.checkPassword#d18b4d16 password:InputCheckPasswordSRP = auth.Authorization; +auth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery; +auth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode; +auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool; +auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector = Bool; +auth.exportLoginToken#b1b41517 api_id:int api_hash:string except_ids:Vector = auth.LoginToken; +auth.importLoginToken#95ac5ce4 token:bytes = auth.LoginToken; +account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool; +account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings; +account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User; +account.getWallPapers#aabb1763 hash:int = account.WallPapers; +account.uploadWallPaper#dd853661 file:InputFile mime_type:string settings:WallPaperSettings = WallPaper; +account.checkUsername#2714d86c username:string = Bool; +account.updateUsername#3e0bdd7c username:string = User; +account.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules; +account.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector = account.PrivacyRules; +account.getAuthorizations#e320c158 = account.Authorizations; +account.resetAuthorization#df77f3bc hash:long = Bool; +account.getPassword#548a30f5 = account.Password; +account.getPasswordSettings#9cd4eaf9 password:InputCheckPasswordSRP = account.PasswordSettings; +account.updatePasswordSettings#a59b102f password:InputCheckPasswordSRP new_settings:account.PasswordInputSettings = Bool; +account.sendConfirmPhoneCode#1b3faa88 hash:string settings:CodeSettings = auth.SentCode; +account.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool; +account.getTmpPassword#449e0b51 password:InputCheckPasswordSRP period:int = account.TmpPassword; +account.sendVerifyPhoneCode#a5a356f9 phone_number:string settings:CodeSettings = auth.SentCode; +account.confirmPasswordEmail#8fdf1920 code:string = Bool; +account.getContactSignUpNotification#9f07c728 = Bool; +account.setContactSignUpNotification#cff43f61 silent:Bool = Bool; +users.getUsers#d91a548 id:Vector = Vector; +users.getFullUser#ca30a5b1 id:InputUser = UserFull; +contacts.getContacts#c023849f hash:int = contacts.Contacts; +contacts.importContacts#2c800be5 contacts:Vector = contacts.ImportedContacts; +contacts.deleteContacts#96a0e00 id:Vector = Updates; +contacts.block#68cc1411 id:InputPeer = Bool; +contacts.unblock#bea65d50 id:InputPeer = Bool; +contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked; +contacts.search#11f812d8 q:string limit:int = contacts.Found; +contacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer; +contacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers; +messages.getMessages#63c66506 id:Vector = messages.Messages; +messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; +messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; +messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory; +messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; +messages.receivedMessages#5a954c0 max_id:int = Vector; +messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; +messages.sendMessage#520c3870 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates; +messages.getChats#3c6aa187 id:Vector = messages.Chats; +messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull; +messages.editChatTitle#dc452855 chat_id:int title:string = Updates; +messages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates; +messages.createChat#9cb126e users:Vector title:string = Updates; +messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig; +messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages; +messages.getStickers#43d4f2c emoticon:string hash:int = messages.Stickers; +messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers; +messages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia; +messages.exportChatInvite#df7534c peer:InputPeer = ExportedChatInvite; +messages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet; +messages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult; +messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; +messages.migrateChat#15a3b8e3 chat_id:int = Updates; +messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document; +messages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs; +messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults; +messages.editMessage#48f71778 flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int = Updates; +messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer; +messages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs; +messages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector = Bool; +messages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers; +messages.readFeaturedStickers#5b118126 id:Vector = Bool; +messages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers; +messages.getWebPage#32ca8f91 url:string hash:int = WebPage; +messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool; +messages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs; +messages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia; +messages.getFavedStickers#21ce0b0e hash:int = messages.FavedStickers; +messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool; +messages.sendMultiMedia#cc0110cb flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int = Updates; +messages.searchStickerSets#c2b7d08b flags:# exclude_featured:flags.0?true q:string hash:int = messages.FoundStickerSets; +messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool; +messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; +messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates; +messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines; +messages.editChatAbout#def60797 peer:InputPeer about:string = Bool; +messages.editChatDefaultBannedRights#a5866b41 peer:InputPeer banned_rights:ChatBannedRights = Updates; +messages.getScheduledHistory#e2c2685b peer:InputPeer hash:int = messages.Messages; +messages.sendScheduledMessages#bd38850a peer:InputPeer id:Vector = Updates; +messages.deleteScheduledMessages#59ae2b16 peer:InputPeer id:Vector = Updates; +messages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?bytes offset:flags.1?string limit:int = messages.VotesList; +messages.getDialogFilters#f19ed96d = Vector; +messages.getSuggestedDialogFilters#a29cd42c = Vector; +messages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool; +messages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; +messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; +messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory; +updates.getState#edd4882a = updates.State; +updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; +updates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference; +photos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo; +upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool; +upload.getFile#b15a9afc flags:# precise:flags.0?true cdn_supported:flags.1?true location:InputFileLocation offset:int limit:int = upload.File; +upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool; +help.getConfig#c4f9186b = Config; +help.getNearestDc#1fb33026 = NearestDc; +help.getSupport#9cdf08cd = help.Support; +help.acceptTermsOfService#ee72f79a id:DataJSON = Bool; +channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool; +channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages; +channels.getMessages#ad8c9a23 channel:InputChannel id:Vector = messages.Messages; +channels.getParticipants#123e05e9 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:int = channels.ChannelParticipants; +channels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channels.ChannelParticipant; +channels.getChannels#a7f6bbb id:Vector = messages.Chats; +channels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull; +channels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates; +channels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates; +channels.editTitle#566decd0 channel:InputChannel title:string = Updates; +channels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates; +channels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool; +channels.updateUsername#3514b3de channel:InputChannel username:string = Bool; +channels.joinChannel#24b524c5 channel:InputChannel = Updates; +channels.leaveChannel#f836aa95 channel:InputChannel = Updates; +channels.inviteToChannel#199f3a6c channel:InputChannel users:Vector = Updates; +channels.deleteChannel#c0111fe3 channel:InputChannel = Updates; +channels.exportMessageLink#e63fadeb flags:# grouped:flags.0?true thread:flags.1?true channel:InputChannel id:int = ExportedMessageLink; +channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates; +channels.editBanned#72796912 channel:InputChannel user_id:InputUser banned_rights:ChatBannedRights = Updates; +channels.readMessageContents#eab5dc38 channel:InputChannel id:Vector = Bool; +channels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates; +channels.getGroupsForDiscussion#f5dad378 = messages.Chats; +channels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool; +payments.getPaymentForm#99f09745 msg_id:int = payments.PaymentForm; +payments.getPaymentReceipt#a092a980 msg_id:int = payments.PaymentReceipt; +payments.validateRequestedInfo#770a8e74 flags:# save:flags.0?true msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo; +payments.sendPaymentForm#2b8879b3 flags:# msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials = payments.PaymentResult; +payments.getSavedInfo#227d824b = payments.SavedInfo; +langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference; +langpack.getLanguages#42c6978f lang_pack:string = Vector; +folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates; +// LAYER 121 +`; \ No newline at end of file diff --git a/src/lib/gramjs/tl/core/GZIPPacked.js b/src/lib/gramjs/tl/core/GZIPPacked.js new file mode 100644 index 000000000..b2833cfe4 --- /dev/null +++ b/src/lib/gramjs/tl/core/GZIPPacked.js @@ -0,0 +1,57 @@ +const { serializeBytes } = require('../index') +const { inflate } = require('pako/dist/pako_inflate') +//CONTEST const { deflate } = require('pako/dist/pako_deflate') + +class GZIPPacked { + static CONSTRUCTOR_ID = 0x3072cfa1 + static classType = 'constructor' + + constructor(data) { + this.data = data + this.CONSTRUCTOR_ID = 0x3072cfa1 + this.classType = 'constructor' + } + + static async gzipIfSmaller(contentRelated, data) { + if (contentRelated && data.length > 512) { + const gzipped = await (new GZIPPacked(data)).toBytes() + if (gzipped.length < data.length) { + return gzipped + } + } + return data + } + + static gzip(input) { + return Buffer.from(input) + // TODO this usually makes it faster for large requests + //return Buffer.from(deflate(input, { level: 9, gzip: true })) + } + + static ungzip(input) { + return Buffer.from(inflate(input)) + } + + async toBytes() { + const g = Buffer.alloc(4) + g.writeUInt32LE(GZIPPacked.CONSTRUCTOR_ID, 0) + return Buffer.concat([ + g, + serializeBytes(await GZIPPacked.gzip(this.data)), + ]) + } + + static async read(reader) { + const constructor = reader.readInt(false) + if (constructor !== GZIPPacked.CONSTRUCTOR_ID) { + throw new Error('not equal') + } + return await GZIPPacked.gzip(reader.tgReadBytes()) + } + + static async fromReader(reader) { + return new GZIPPacked(await GZIPPacked.ungzip(reader.tgReadBytes())) + } +} + +module.exports = GZIPPacked diff --git a/src/lib/gramjs/tl/core/MessageContainer.js b/src/lib/gramjs/tl/core/MessageContainer.js new file mode 100644 index 000000000..75f41eb57 --- /dev/null +++ b/src/lib/gramjs/tl/core/MessageContainer.js @@ -0,0 +1,45 @@ +const TLMessage = require('./TLMessage') + +class MessageContainer { + static CONSTRUCTOR_ID = 0x73f1f8dc; + static classType = "constructor" + // Maximum size in bytes for the inner payload of the container. + // Telegram will close the connection if the payload is bigger. + // The overhead of the container itself is subtracted. + static MAXIMUM_SIZE = 1044456 - 8; + + // Maximum amount of messages that can't be sent inside a single + // container, inclusive. Beyond this limit Telegram will respond + // with BAD_MESSAGE 64 (invalid container). + // + // This limit is not 100% accurate and may in some cases be higher. + // However, sending up to 100 requests at once in a single container + // is a reasonable conservative value, since it could also depend on + // other factors like size per request, but we cannot know this. + static MAXIMUM_LENGTH = 100; + + constructor(messages) { + + this.CONSTRUCTOR_ID = 0x73f1f8dc + this.messages = messages + this.classType = "constructor" + } + + static async fromReader(reader) { + const messages = [] + const length = reader.readInt() + for (let x = 0; x < length; x++) { + const msgId = reader.readLong() + const seqNo = reader.readInt() + const length = reader.readInt() + const before = reader.tellPosition() + const obj = reader.tgReadObject() + reader.setPosition(before + length) + const tlMessage = new TLMessage(msgId, seqNo, obj) + messages.push(tlMessage) + } + return new MessageContainer(messages) + } +} + +module.exports = MessageContainer diff --git a/src/lib/gramjs/tl/core/RPCResult.js b/src/lib/gramjs/tl/core/RPCResult.js new file mode 100644 index 000000000..ba8b80545 --- /dev/null +++ b/src/lib/gramjs/tl/core/RPCResult.js @@ -0,0 +1,33 @@ +const { RpcError } = require('../index').constructors +const GZIPPacked = require('./GZIPPacked') + +class RPCResult { + static CONSTRUCTOR_ID = 0xf35c6d01; + static classType = "constructor" + + constructor(reqMsgId, body, error) { + this.CONSTRUCTOR_ID = 0xf35c6d01 + this.reqMsgId = reqMsgId + this.body = body + this.error = error + this.classType = "constructor" + } + + static async fromReader(reader) { + const msgId = reader.readLong() + const innerCode = reader.readInt(false) + if (innerCode === RpcError.CONSTRUCTOR_ID) { + return new RPCResult(msgId, null, RpcError.fromReader(reader)) + } + if (innerCode === GZIPPacked.CONSTRUCTOR_ID) { + return new RPCResult(msgId, (await GZIPPacked.fromReader(reader)).data) + } + reader.seek(-4) + // This reader.read() will read more than necessary, but it's okay. + // We could make use of MessageContainer's length here, but since + // it's not necessary we don't need to care about it. + return new RPCResult(msgId, reader.read(), null) + } +} + +module.exports = RPCResult diff --git a/src/lib/gramjs/tl/core/TLMessage.js b/src/lib/gramjs/tl/core/TLMessage.js new file mode 100644 index 000000000..9acf9f549 --- /dev/null +++ b/src/lib/gramjs/tl/core/TLMessage.js @@ -0,0 +1,14 @@ + +class TLMessage { + static SIZE_OVERHEAD = 12; + static classType = "constructor" + + constructor(msgId, seqNo, obj) { + this.msgId = msgId + this.seqNo = seqNo + this.obj = obj + this.classType = "constructor" + } +} + +module.exports = TLMessage diff --git a/src/lib/gramjs/tl/core/index.js b/src/lib/gramjs/tl/core/index.js new file mode 100644 index 000000000..0a7440de6 --- /dev/null +++ b/src/lib/gramjs/tl/core/index.js @@ -0,0 +1,17 @@ +const TLMessage = require('./TLMessage') +const RPCResult = require('./RPCResult') +const MessageContainer = require('./MessageContainer') +const GZIPPacked = require('./GZIPPacked') +const coreObjects = { + [RPCResult.CONSTRUCTOR_ID]: RPCResult, + [GZIPPacked.CONSTRUCTOR_ID]: GZIPPacked, + [MessageContainer.CONSTRUCTOR_ID]: MessageContainer, +} + +module.exports = { + TLMessage, + RPCResult, + MessageContainer, + GZIPPacked, + coreObjects, +} diff --git a/src/lib/gramjs/tl/generateModules.js b/src/lib/gramjs/tl/generateModules.js new file mode 100644 index 000000000..120a58c03 --- /dev/null +++ b/src/lib/gramjs/tl/generateModules.js @@ -0,0 +1,14 @@ +const fs = require('fs'); +const path = require('path'); + +require('./types-generator/generate'); + +function main() { + const apiTl = fs.readFileSync(path.resolve(__dirname, './static/api.reduced.tl')); + fs.writeFileSync(path.resolve(__dirname, './apiTl.js'), `module.exports = \`${apiTl}\`;`); + + const schemaTl = fs.readFileSync(path.resolve(__dirname, './static/schema.reduced.tl')); + fs.writeFileSync(path.resolve(__dirname, './schemaTl.js'), `module.exports = \`${schemaTl}\`;`); +} + +main(); diff --git a/src/lib/gramjs/tl/generationHelpers.js b/src/lib/gramjs/tl/generationHelpers.js new file mode 100644 index 000000000..400fcf043 --- /dev/null +++ b/src/lib/gramjs/tl/generationHelpers.js @@ -0,0 +1,356 @@ +const snakeToCamelCase = (name) => { + const result = name.replace(/(?:^|_)([a-z])/g, (_, g) => g.toUpperCase()) + return result.replace(/_/g, '') +} +const variableSnakeToCamelCase = (str) => str.replace( + /([-_][a-z])/g, + (group) => group.toUpperCase() + .replace('-', '') + .replace('_', '') +) + +const CORE_TYPES = new Set([ + 0xbc799737, // boolFalse#bc799737 = Bool; + 0x997275b5, // boolTrue#997275b5 = Bool; + 0x3fedd339, // true#3fedd339 = True; + 0xc4b9f9bb, // error#c4b9f9bb code:int text:string = Error; + 0x56730bcc // null#56730bcc = Null; +]) +const AUTH_KEY_TYPES = new Set([ + 0x05162463, // resPQ, + 0x83c95aec, // p_q_inner_data + 0xa9f55f95, // p_q_inner_data_dc + 0x3c6a84d4, // p_q_inner_data_temp + 0x56fddf88, // p_q_inner_data_temp_dc + 0xd0e8075c, // server_DH_params_ok + 0xb5890dba, // server_DH_inner_data + 0x6643b654, // client_DH_inner_data + 0xd712e4be, // req_DH_params + 0xf5045f1f, // set_client_DH_params + 0x3072cfa1 // gzip_packed +]) + +// This is copy-pasted from `gramjs/Helpers.js` to not depend on TypeScript modules +function makeCRCTable() { + let c + const crcTable = [] + for (let n = 0; n < 256; n++) { + c = n + for (let k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)) + } + crcTable[n] = c + } + return crcTable +} + +let crcTable = null + +function crc32(buf) { + if (!crcTable) { + crcTable = makeCRCTable() + } + if (!Buffer.isBuffer(buf)) { + buf = Buffer.from(buf) + } + let crc = -1 + + for (let index = 0; index < buf.length; index++) { + const byte = buf[index] + crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8) + } + return (crc ^ (-1)) >>> 0 +} + +const fromLine = (line, isFunction) => { + const match = line.match(/([\w.]+)(?:#([0-9a-fA-F]+))?(?:\s{?\w+:[\w\d<>#.?!]+}?)*\s=\s([\w\d<>#.?]+);$/) + if (!match) { + // Probably "vector#1cb5c415 {t:Type} # [ t ] = Vector t;" + throw new Error(`Cannot parse TLObject ${line}`) + } + + const argsMatch = findAll(/({)?(\w+):([\w\d<>#.?!]+)}?/, line) + const currentConfig = { + name: match[1], + constructorId: parseInt(match[2], 16), + argsConfig: {}, + subclassOfId: crc32(match[3]), + result: match[3], + isFunction: isFunction, + namespace: null + } + if (!currentConfig.constructorId) { + + let hexId = '' + let args + + if (Object.values(currentConfig.argsConfig).length) { + args = ` ${Object.keys(currentConfig.argsConfig).map((arg) => arg.toString()).join(' ')}` + } else { + args = '' + } + + const representation = `${currentConfig.name}${hexId}${args} = ${currentConfig.result}` + .replace(/(:|\?)bytes /g, '$1string ') + .replace(/|{|}/g, '') + .replace(/ \w+:flags\.\d+\?true/g, '') + + if (currentConfig.name === 'inputMediaInvoice') { + // eslint-disable-next-line no-empty + if (currentConfig.name === 'inputMediaInvoice') { + } + } + + currentConfig.constructorId = crc32(Buffer.from(representation, 'utf8')) + } + for (const [brace, name, argType] of argsMatch) { + if (brace === undefined) { + currentConfig.argsConfig[variableSnakeToCamelCase(name)] = buildArgConfig(name, argType) + } + } + if (currentConfig.name.includes('.')) { + [currentConfig.namespace, currentConfig.name] = currentConfig.name.split(/\.(.+)/) + } + currentConfig.name = snakeToCamelCase(currentConfig.name) + /* + for (const arg in currentConfig.argsConfig){ + if (currentConfig.argsConfig.hasOwnProperty(arg)){ + if (currentConfig.argsConfig[arg].flagIndicator){ + delete currentConfig.argsConfig[arg] + } + } + }*/ + return currentConfig +} + +function buildArgConfig(name, argType) { + name = name === 'self' ? 'is_self' : name + // Default values + const currentConfig = { + isVector: false, + isFlag: false, + skipConstructorId: false, + flagIndex: -1, + flagIndicator: true, + type: null, + useVectorId: null + } + + // Special case: some types can be inferred, which makes it + // less annoying to type. Currently the only type that can + // be inferred is if the name is 'random_id', to which a + // random ID will be assigned if left as None (the default) + let canBeInferred = name === 'random_id' + + // The type can be an indicator that other arguments will be flags + if (argType !== '#') { + currentConfig.flagIndicator = false + // Strip the exclamation mark always to have only the name + currentConfig.type = argType.replace(/^!+/, '') + + // The type may be a flag (flags.IDX?REAL_TYPE) + // Note that 'flags' is NOT the flags name; this + // is determined by a previous argument + // However, we assume that the argument will always be called 'flags' + // @ts-ignore + const flagMatch = currentConfig.type.match(/flags.(\d+)\?([\w<>.]+)/) + + if (flagMatch) { + currentConfig.isFlag = true + currentConfig.flagIndex = Number(flagMatch[1]); + // Update the type to match the exact type, not the "flagged" one + [, , currentConfig.type] = flagMatch + } + + // Then check if the type is a Vector + // @ts-ignore + const vectorMatch = currentConfig.type.match(/[Vv]ector<([\w\d.]+)>/) + + if (vectorMatch) { + currentConfig.isVector = true + + // If the type's first letter is not uppercase, then + // it is a constructor and we use (read/write) its ID. + // @ts-ignore + currentConfig.useVectorId = currentConfig.type.charAt(0) === 'V'; + + // Update the type to match the one inside the vector + [, currentConfig.type] = vectorMatch + } + + // See use_vector_id. An example of such case is ipPort in + // help.configSpecial + // @ts-ignore + if (/^[a-z]$/.test(currentConfig.type.split('.') + .pop() + .charAt(0) + ) + ) { + currentConfig.skipConstructorId = true + } + + // The name may contain "date" in it, if this is the case and + // the type is "int", we can safely assume that this should be + // treated as a "date" object. Note that this is not a valid + // Telegram object, but it's easier to work with + // if ( + // this.type === 'int' && + // (/(\b|_)([dr]ate|until|since)(\b|_)/.test(name) || + // ['expires', 'expires_at', 'was_online'].includes(name)) + // ) { + // this.type = 'date'; + // } + } + return currentConfig +} + + +const parseTl = function* (content, layer, methods = [], ignoreIds = CORE_TYPES) { + const methodInfo = (methods || []).reduce((o, m) => ({ ...o, [m.name]: m }), {}) + const objAll = [] + const objByName = {} + const objByType = {} + + const file = content + + let isFunction = false + + for (let line of file.split('\n')) { + const commentIndex = line.indexOf('//') + + if (commentIndex !== -1) { + line = line.slice(0, commentIndex) + } + + line = line.trim() + + if (!line) { + continue + } + + const match = line.match(/---(\w+)---/) + + if (match) { + const [, followingTypes] = match + isFunction = followingTypes === 'functions' + continue + } + + try { + const result = fromLine(line, isFunction) + + if (ignoreIds.has(result.constructorId)) { + continue + } + + objAll.push(result) + + if (!result.isFunction) { + if (!objByType[result.result]) { + objByType[result.result] = [] + } + + objByName[result.name] = result + objByType[result.result].push(result) + } + } catch (e) { + if (!e.toString().includes('vector#1cb5c415')) { + throw e + } + } + } + + // Once all objects have been parsed, replace the + // string type from the arguments with references + for (const obj of objAll) { + //console.log(obj) + if (AUTH_KEY_TYPES.has(obj.constructorId)) { + for (const arg in obj.argsConfig) { + if (obj.argsConfig[arg].type === 'string') { + obj.argsConfig[arg].type = 'bytes' + } + } + } + } + + for (const obj of objAll) { + yield obj + } + +} + +const findAll = (regex, str, matches = []) => { + if (!regex.flags.includes(`g`)) { + regex = new RegExp(regex.source, `g`) + } + + const res = regex.exec(str) + + if (res) { + matches.push(res.slice(1)) + findAll(regex, str, matches) + } + + return matches +} + +function serializeBytes(data) { + if (!(data instanceof Buffer)) { + if (typeof data == 'string') { + data = Buffer.from(data) + } else { + throw Error(`Bytes or str expected, not ${data.constructor.name}`) + } + } + const r = [] + let padding + if (data.length < 254) { + padding = (data.length + 1) % 4 + if (padding !== 0) { + padding = 4 - padding + } + r.push(Buffer.from([data.length])) + r.push(data) + } else { + padding = data.length % 4 + if (padding !== 0) { + padding = 4 - padding + } + r.push(Buffer.from([254, data.length % 256, (data.length >> 8) % 256, (data.length >> 16) % 256])) + r.push(data) + } + r.push(Buffer.alloc(padding) + .fill(0)) + + return Buffer.concat(r) + +} + +function serializeDate(dt) { + if (!dt) { + return Buffer.alloc(4) + .fill(0) + } + if (dt instanceof Date) { + dt = Math.floor((Date.now() - dt.getTime()) / 1000) + } + if (typeof dt == 'number') { + const t = Buffer.alloc(4) + t.writeInt32LE(dt, 0) + return t + } + throw Error(`Cannot interpret "${dt}" as a date`) +} + +module.exports = { + findAll, + parseTl, + buildArgConfig, + fromLine, + CORE_TYPES, + serializeDate, + serializeBytes, + snakeToCamelCase, + variableSnakeToCamelCase +} diff --git a/src/lib/gramjs/tl/index.js b/src/lib/gramjs/tl/index.js new file mode 100644 index 000000000..3e59ed5c5 --- /dev/null +++ b/src/lib/gramjs/tl/index.js @@ -0,0 +1,12 @@ +const api = require('./api') +const { serializeBytes, serializeDate } = require('./generationHelpers') +const patched = null + +module.exports = { + // TODO Refactor internal usages to always use `api`. + constructors: api, + requests: api, + patched, + serializeBytes, + serializeDate +} diff --git a/src/lib/gramjs/tl/schemaTl.js b/src/lib/gramjs/tl/schemaTl.js new file mode 100644 index 000000000..d9b064472 --- /dev/null +++ b/src/lib/gramjs/tl/schemaTl.js @@ -0,0 +1,38 @@ +module.exports = `resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector = ResPQ; +p_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data; +server_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params; +server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params; +server_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data; +client_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data; +dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer; +dh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer; +dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer; +destroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes; +destroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes; +destroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes; +---functions--- +req_pq#60469778 nonce:int128 = ResPQ; +req_pq_multi#be7e8ef1 nonce:int128 = ResPQ; +req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params; +set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer; +destroy_auth_key#d1435160 = DestroyAuthKeyRes; +---types--- +msgs_ack#62d6b459 msg_ids:Vector = MsgsAck; +bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification; +bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification; +msgs_state_req#da69fb52 msg_ids:Vector = MsgsStateReq; +msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo; +msgs_all_info#8cc0d131 msg_ids:Vector info:string = MsgsAllInfo; +msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo; +msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo; +msg_resend_req#7d861a08 msg_ids:Vector = MsgResendReq; +rpc_error#2144ca19 error_code:int error_message:string = RpcError; +future_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt; +future_salts#ae500895 req_msg_id:long now:int salts:vector = FutureSalts; +pong#347773c5 msg_id:long ping_id:long = Pong; +destroy_session_ok#e22045fc session_id:long = DestroySessionRes; +destroy_session_none#62d350c9 session_id:long = DestroySessionRes; +new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession; +---functions--- +ping#7abe77ec ping_id:long = Pong; +`; \ No newline at end of file diff --git a/src/lib/gramjs/tl/static/api.reduced.tl b/src/lib/gramjs/tl/static/api.reduced.tl new file mode 100644 index 000000000..e573b5d23 --- /dev/null +++ b/src/lib/gramjs/tl/static/api.reduced.tl @@ -0,0 +1,987 @@ +boolFalse#bc799737 = Bool; +boolTrue#997275b5 = Bool; +true#3fedd339 = True; +vector#1cb5c415 {t:Type} # [ t ] = Vector t; +error#c4b9f9bb code:int text:string = Error; +null#56730bcc = Null; +inputPeerEmpty#7f3b18ea = InputPeer; +inputPeerSelf#7da07ec9 = InputPeer; +inputPeerChat#179be863 chat_id:int = InputPeer; +inputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer; +inputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer; +inputPeerUserFromMessage#17bae2e6 peer:InputPeer msg_id:int user_id:int = InputPeer; +inputPeerChannelFromMessage#9c95f7bb peer:InputPeer msg_id:int channel_id:int = InputPeer; +inputUserEmpty#b98886cf = InputUser; +inputUserSelf#f7c1b13f = InputUser; +inputUser#d8292816 user_id:int access_hash:long = InputUser; +inputUserFromMessage#2d117597 peer:InputPeer msg_id:int user_id:int = InputUser; +inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact; +inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile; +inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile; +inputMediaEmpty#9664f57f = InputMedia; +inputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia; +inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia; +inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia; +inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaDocument#23ab23d2 flags:# id:InputDocument ttl_seconds:flags.0?int = InputMedia; +inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia; +inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaGame#d33f43f3 id:InputGame = InputMedia; +inputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia; +inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia; +inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia; +inputMediaDice#e66fbf7b emoticon:string = InputMedia; +inputChatPhotoEmpty#1ca48f57 = InputChatPhoto; +inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto; +inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto; +inputGeoPointEmpty#e4c123d6 = InputGeoPoint; +inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint; +inputPhotoEmpty#1cd7bf0d = InputPhoto; +inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto; +inputFileLocation#dfdaabe1 volume_id:long local_id:int secret:long file_reference:bytes = InputFileLocation; +inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation; +inputDocumentFileLocation#bad07584 id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputSecureFileLocation#cbc7ee28 id:long access_hash:long = InputFileLocation; +inputTakeoutFileLocation#29be5899 = InputFileLocation; +inputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation; +inputPeerPhotoFileLocation#27d69997 flags:# big:flags.0?true peer:InputPeer volume_id:long local_id:int = InputFileLocation; +inputStickerSetThumb#dbaeae9 stickerset:InputStickerSet volume_id:long local_id:int = InputFileLocation; +peerUser#9db1bc6d user_id:int = Peer; +peerChat#bad0e5bb chat_id:int = Peer; +peerChannel#bddde532 channel_id:int = Peer; +storage.fileUnknown#aa963b05 = storage.FileType; +storage.filePartial#40bc6f52 = storage.FileType; +storage.fileJpeg#7efe0e = storage.FileType; +storage.fileGif#cae1aadf = storage.FileType; +storage.filePng#a4f63c0 = storage.FileType; +storage.filePdf#ae1e508d = storage.FileType; +storage.fileMp3#528a0677 = storage.FileType; +storage.fileMov#4b09ebbc = storage.FileType; +storage.fileMp4#b3cea0e4 = storage.FileType; +storage.fileWebp#1081464c = storage.FileType; +userEmpty#200250ba id:int = User; +user#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User; +userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto; +userProfilePhoto#69d3ab26 flags:# has_video:flags.0?true photo_id:long photo_small:FileLocation photo_big:FileLocation dc_id:int = UserProfilePhoto; +userStatusEmpty#9d05049 = UserStatus; +userStatusOnline#edb93949 expires:int = UserStatus; +userStatusOffline#8c703f was_online:int = UserStatus; +userStatusRecently#e26f42f1 = UserStatus; +userStatusLastWeek#7bf09fc = UserStatus; +userStatusLastMonth#77ebc742 = UserStatus; +chatEmpty#9ba2d800 id:int = Chat; +chat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; +chatForbidden#7328bdb id:int title:string = Chat; +channel#d31a961e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; +channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat; +chatFull#1b7c9db3 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int = ChatFull; +channelFull#f0e6672a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int = ChatFull; +chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant; +chatParticipantCreator#da13538a user_id:int = ChatParticipant; +chatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant; +chatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants; +chatParticipants#3f460fed chat_id:int participants:Vector version:int = ChatParticipants; +chatPhotoEmpty#37c1011c = ChatPhoto; +chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto; +messageEmpty#83e5de54 id:int = Message; +message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; +messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message; +messageMediaEmpty#3ded6320 = MessageMedia; +messageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia; +messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia; +messageMediaContact#cbf24940 phone_number:string first_name:string last_name:string vcard:string user_id:int = MessageMedia; +messageMediaUnsupported#9f84f49e = MessageMedia; +messageMediaDocument#9cb070d7 flags:# document:flags.0?Document ttl_seconds:flags.2?int = MessageMedia; +messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia; +messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia; +messageMediaGame#fdb19008 game:Game = MessageMedia; +messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia; +messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia; +messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; +messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; +messageActionEmpty#b6aef7b0 = MessageAction; +messageActionChatCreate#a6638b9a title:string users:Vector = MessageAction; +messageActionChatEditTitle#b5a1ce5a title:string = MessageAction; +messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction; +messageActionChatDeletePhoto#95e3fbef = MessageAction; +messageActionChatAddUser#488a7337 users:Vector = MessageAction; +messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction; +messageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction; +messageActionChannelCreate#95d2ac92 title:string = MessageAction; +messageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction; +messageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction; +messageActionPinMessage#94bd38ed = MessageAction; +messageActionHistoryClear#9fbab604 = MessageAction; +messageActionGameScore#92a72876 game_id:long score:int = MessageAction; +messageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction; +messageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction; +messageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction; +messageActionScreenshotTaken#4792929b = MessageAction; +messageActionCustomAction#fae69f56 message:string = MessageAction; +messageActionBotAllowed#abe9affe domain:string = MessageAction; +messageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction; +messageActionSecureValuesSent#d95c6154 types:Vector = MessageAction; +messageActionContactSignUp#f3f25f76 = MessageAction; +messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction; +dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog; +dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog; +photoEmpty#2331b22d id:long = Photo; +photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector video_sizes:flags.1?Vector dc_id:int = Photo; +photoSizeEmpty#e17e23c type:string = PhotoSize; +photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize; +photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize; +photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize; +photoSizeProgressive#5aa86a51 type:string location:FileLocation w:int h:int sizes:Vector = PhotoSize; +photoPathSize#d8214d41 type:string bytes:bytes = PhotoSize; +geoPointEmpty#1117dd5f = GeoPoint; +geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint; +auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; +auth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization; +auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization; +auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization; +inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer; +inputNotifyUsers#193b4417 = InputNotifyPeer; +inputNotifyChats#4a95e84e = InputNotifyPeer; +inputNotifyBroadcasts#b1db7c7e = InputNotifyPeer; +inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings; +peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings; +peerSettings#733f2961 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true geo_distance:flags.6?int = PeerSettings; +wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper; +wallPaperNoFile#8af40b25 flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper; +inputReportReasonSpam#58dbcab8 = ReportReason; +inputReportReasonViolence#1e22c78d = ReportReason; +inputReportReasonPornography#2e59d922 = ReportReason; +inputReportReasonChildAbuse#adf44ee3 = ReportReason; +inputReportReasonOther#e1746d0a text:string = ReportReason; +inputReportReasonCopyright#9b89f93a = ReportReason; +inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; +userFull#edf17c12 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int = UserFull; +contact#f911c994 user_id:int mutual:Bool = Contact; +importedContact#d0028438 user_id:int client_id:long = ImportedContact; +contactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus; +contacts.contactsNotModified#b74ba9d2 = contacts.Contacts; +contacts.contacts#eae87e42 contacts:Vector saved_count:int users:Vector = contacts.Contacts; +contacts.importedContacts#77d01c3b imported:Vector popular_invites:Vector retry_contacts:Vector users:Vector = contacts.ImportedContacts; +contacts.blocked#ade1591 blocked:Vector chats:Vector users:Vector = contacts.Blocked; +contacts.blockedSlice#e1664194 count:int blocked:Vector chats:Vector users:Vector = contacts.Blocked; +messages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs; +messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesNotModified#74535f21 count:int = messages.Messages; +messages.chats#64ff9fd5 chats:Vector = messages.Chats; +messages.chatsSlice#9cd81144 count:int chats:Vector = messages.Chats; +messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull; +messages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory; +inputMessagesFilterEmpty#57e2f66c = MessagesFilter; +inputMessagesFilterPhotos#9609a51c = MessagesFilter; +inputMessagesFilterVideo#9fc00e65 = MessagesFilter; +inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; +inputMessagesFilterDocument#9eddf188 = MessagesFilter; +inputMessagesFilterUrl#7ef0dd87 = MessagesFilter; +inputMessagesFilterGif#ffc86587 = MessagesFilter; +inputMessagesFilterVoice#50f5c392 = MessagesFilter; +inputMessagesFilterMusic#3751b49e = MessagesFilter; +inputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter; +inputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter; +inputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter; +inputMessagesFilterRoundVideo#b549da53 = MessagesFilter; +inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter; +inputMessagesFilterGeo#e7026d0d = MessagesFilter; +inputMessagesFilterContacts#e062db83 = MessagesFilter; +inputMessagesFilterPinned#1bb00451 = MessagesFilter; +updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; +updateMessageID#4e90bfd6 id:int random_id:long = Update; +updateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update; +updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update; +updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update; +updateChatParticipants#7761198 participants:ChatParticipants = Update; +updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update; +updateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update; +updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update; +updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update; +updateEncryptedChatTyping#1710f156 chat_id:int = Update; +updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update; +updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update; +updateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update; +updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update; +updateDcOptions#8e5e9873 dc_options:Vector = Update; +updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update; +updateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update; +updatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update; +updateUserPhone#12b9417b user_id:int phone:string = Update; +updateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update; +updateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update; +updateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update; +updateReadMessagesContents#68c13933 messages:Vector pts:int pts_count:int = Update; +updateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update; +updateChannel#b6d45656 channel_id:int = Update; +updateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update; +updateReadChannelInbox#330b5424 flags:# folder_id:flags.0?int channel_id:int max_id:int still_unread_count:int pts:int = Update; +updateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector pts:int pts_count:int = Update; +updateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update; +updateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update; +updateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update; +updateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector = Update; +updateStickerSets#43ae3dec = Update; +updateSavedGifs#9375341e = Update; +updateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update; +updateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update; +updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update; +updateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update; +updateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update; +updateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update; +updateReadFeaturedStickers#571d2742 = Update; +updateRecentStickers#9a422c20 = Update; +updateConfig#a229dd06 = Update; +updatePtsChanged#3354678f = Update; +updateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update; +updateDialogPinned#6e6fe51c flags:# pinned:flags.0?true folder_id:flags.1?int peer:DialogPeer = Update; +updatePinnedDialogs#fa0f3ca2 flags:# folder_id:flags.1?int order:flags.0?Vector = Update; +updateBotWebhookJSON#8317c0c3 data:DataJSON = Update; +updateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update; +updateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update; +updateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update; +updatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update; +updateLangPackTooLong#46560264 lang_code:string = Update; +updateLangPack#56022f4d difference:LangPackDifference = Update; +updateFavedStickers#e511996d = Update; +updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector = Update; +updateContactsReset#7084a7be = Update; +updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update; +updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update; +updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update; +updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update; +updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update; +updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update; +updatePeerLocated#b4afcfb0 peers:Vector = Update; +updateNewScheduledMessage#39a51dfb message:Message = Update; +updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update; +updateTheme#8216fba3 theme:Theme = Update; +updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update; +updateLoginToken#564fe691 = Update; +updateMessagePollVote#42f88f2c poll_id:long user_id:int options:Vector = Update; +updateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update; +updateDialogFilterOrder#a5d72105 order:Vector = Update; +updateDialogFilters#3504914f = Update; +updatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update; +updateChannelParticipant#65d2b464 flags:# channel_id:int date:int user_id:int prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant qts:int = Update; +updateChannelMessageForwards#6e8a84df channel_id:int id:int forwards:int = Update; +updateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int read_max_id:int broadcast_id:flags.0?int broadcast_post:flags.0?int = Update; +updateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update; +updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update; +updateChannelUserTyping#ff2abe9f flags:# channel_id:int top_msg_id:flags.0?int user_id:int action:SendMessageAction = Update; +updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update; +updatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector pts:int pts_count:int = Update; +updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; +updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; +updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; +updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference; +updates.differenceTooLong#4afe8f6d pts:int = updates.Difference; +updatesTooLong#e317af7e = Updates; +updateShortMessage#2296d2c8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShortChatMessage#402d5dbb flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShort#78d4dec1 update:Update date:int = Updates; +updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; +updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; +updateShortSentMessage#11f1331c flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector = Updates; +photos.photos#8dca6aa5 photos:Vector users:Vector = photos.Photos; +photos.photosSlice#15051f54 count:int photos:Vector users:Vector = photos.Photos; +photos.photo#20212ca8 photo:Photo users:Vector = photos.Photo; +upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File; +upload.fileCdnRedirect#f18cda44 dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes file_hashes:Vector = upload.File; +dcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption; +config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config; +nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc; +help.appUpdate#1da7158f flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string = help.AppUpdate; +help.noAppUpdate#c45a6536 = help.AppUpdate; +help.inviteText#18cb9f78 message:string = help.InviteText; +encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat; +encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat; +encryptedChatRequested#62718a82 flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat; +encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat; +encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat; +inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat; +encryptedFileEmpty#c21f497e = EncryptedFile; +encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile; +inputEncryptedFileEmpty#1837c364 = InputEncryptedFile; +inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile; +inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile; +inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile; +encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage; +encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage; +messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig; +messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig; +messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage; +messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage; +inputDocumentEmpty#72f0eaae = InputDocument; +inputDocument#1abfb575 id:long access_hash:long file_reference:bytes = InputDocument; +documentEmpty#36f8c871 id:long = Document; +document#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector video_thumbs:flags.1?Vector dc_id:int attributes:Vector = Document; +help.support#17c6b5f6 phone_number:string user:User = help.Support; +notifyPeer#9fd40bd8 peer:Peer = NotifyPeer; +notifyUsers#b4c83b4c = NotifyPeer; +notifyChats#c007cec3 = NotifyPeer; +notifyBroadcasts#d612e8ef = NotifyPeer; +sendMessageTypingAction#16bf744e = SendMessageAction; +sendMessageCancelAction#fd5ec8f5 = SendMessageAction; +sendMessageRecordVideoAction#a187d66f = SendMessageAction; +sendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction; +sendMessageRecordAudioAction#d52f73f7 = SendMessageAction; +sendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction; +sendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction; +sendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction; +sendMessageGeoLocationAction#176f8ba1 = SendMessageAction; +sendMessageChooseContactAction#628cbc6f = SendMessageAction; +sendMessageGamePlayAction#dd6a8f48 = SendMessageAction; +sendMessageRecordRoundAction#88f27fbc = SendMessageAction; +sendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction; +contacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found; +inputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey; +inputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey; +inputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey; +inputPrivacyKeyPhoneP2P#db9e70d2 = InputPrivacyKey; +inputPrivacyKeyForwards#a4dd4c08 = InputPrivacyKey; +inputPrivacyKeyProfilePhoto#5719bacc = InputPrivacyKey; +inputPrivacyKeyPhoneNumber#352dafa = InputPrivacyKey; +inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey; +privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey; +privacyKeyChatInvite#500e6dfa = PrivacyKey; +privacyKeyPhoneCall#3d662b7b = PrivacyKey; +privacyKeyPhoneP2P#39491cc8 = PrivacyKey; +privacyKeyForwards#69ec56a3 = PrivacyKey; +privacyKeyProfilePhoto#96151fed = PrivacyKey; +privacyKeyPhoneNumber#d19ae46d = PrivacyKey; +privacyKeyAddedByPhone#42ffd42b = PrivacyKey; +inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule; +inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule; +inputPrivacyValueAllowUsers#131cc67f users:Vector = InputPrivacyRule; +inputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule; +inputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule; +inputPrivacyValueDisallowUsers#90110467 users:Vector = InputPrivacyRule; +inputPrivacyValueAllowChatParticipants#4c81c1ba chats:Vector = InputPrivacyRule; +inputPrivacyValueDisallowChatParticipants#d82363af chats:Vector = InputPrivacyRule; +privacyValueAllowContacts#fffe1bac = PrivacyRule; +privacyValueAllowAll#65427b82 = PrivacyRule; +privacyValueAllowUsers#4d5bbe0c users:Vector = PrivacyRule; +privacyValueDisallowContacts#f888fa1a = PrivacyRule; +privacyValueDisallowAll#8b73e763 = PrivacyRule; +privacyValueDisallowUsers#c7f49b7 users:Vector = PrivacyRule; +privacyValueAllowChatParticipants#18be796b chats:Vector = PrivacyRule; +privacyValueDisallowChatParticipants#acae0690 chats:Vector = PrivacyRule; +account.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules; +accountDaysTTL#b8d0afdf days:int = AccountDaysTTL; +documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; +documentAttributeAnimated#11b58939 = DocumentAttribute; +documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute; +documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute; +documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute; +documentAttributeFilename#15590068 file_name:string = DocumentAttribute; +documentAttributeHasStickers#9801d2f7 = DocumentAttribute; +messages.stickersNotModified#f1749a22 = messages.Stickers; +messages.stickers#e4599bbd hash:int stickers:Vector = messages.Stickers; +stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; +messages.allStickersNotModified#e86602c3 = messages.AllStickers; +messages.allStickers#edfd405f hash:int sets:Vector = messages.AllStickers; +messages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages; +webPageEmpty#eb1477e8 id:long = WebPage; +webPagePending#c586da1c id:long date:int = WebPage; +webPage#e89c45b2 flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage; +webPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage; +authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization; +account.authorizations#1250abde authorizations:Vector = account.Authorizations; +account.password#ad2641f8 flags:# has_recovery:flags.0?true has_secure_values:flags.1?true has_password:flags.2?true current_algo:flags.2?PasswordKdfAlgo srp_B:flags.2?bytes srp_id:flags.2?long hint:flags.3?string email_unconfirmed_pattern:flags.4?string new_algo:PasswordKdfAlgo new_secure_algo:SecurePasswordKdfAlgo secure_random:bytes = account.Password; +account.passwordSettings#9a5c33e5 flags:# email:flags.0?string secure_settings:flags.1?SecureSecretSettings = account.PasswordSettings; +account.passwordInputSettings#c23727c9 flags:# new_algo:flags.0?PasswordKdfAlgo new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string new_secure_settings:flags.2?SecureSecretSettings = account.PasswordInputSettings; +auth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery; +receivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage; +chatInviteEmpty#69df3769 = ExportedChatInvite; +chatInviteExported#fc2e05bc link:string = ExportedChatInvite; +chatInviteAlready#5a686d7c chat:Chat = ChatInvite; +chatInvite#dfc2f58e flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:Photo participants_count:int participants:flags.4?Vector = ChatInvite; +chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite; +inputStickerSetEmpty#ffb62b95 = InputStickerSet; +inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet; +inputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet; +inputStickerSetAnimatedEmoji#28703c8 = InputStickerSet; +inputStickerSetDice#e67f520e emoticon:string = InputStickerSet; +stickerSet#eeb46f27 flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true animated:flags.5?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumb:flags.4?PhotoSize thumb_dc_id:flags.4?int count:int hash:int = StickerSet; +messages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet; +botCommand#c27ac8c7 command:string description:string = BotCommand; +botInfo#98e81d3a user_id:int description:string commands:Vector = BotInfo; +keyboardButton#a2fa4880 text:string = KeyboardButton; +keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; +keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; +keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; +keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; +keyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton; +keyboardButtonGame#50f41ccf text:string = KeyboardButton; +keyboardButtonBuy#afd93fbb text:string = KeyboardButton; +keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton; +inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton; +keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; +keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow; +replyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup; +replyKeyboardForceReply#f4108aa0 flags:# single_use:flags.1?true selective:flags.2?true = ReplyMarkup; +replyKeyboardMarkup#3502758c flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector = ReplyMarkup; +replyInlineMarkup#48a30254 rows:Vector = ReplyMarkup; +messageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity; +messageEntityMention#fa04579d offset:int length:int = MessageEntity; +messageEntityHashtag#6f635b0d offset:int length:int = MessageEntity; +messageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity; +messageEntityUrl#6ed02538 offset:int length:int = MessageEntity; +messageEntityEmail#64e475c2 offset:int length:int = MessageEntity; +messageEntityBold#bd610bc9 offset:int length:int = MessageEntity; +messageEntityItalic#826f8b60 offset:int length:int = MessageEntity; +messageEntityCode#28a20571 offset:int length:int = MessageEntity; +messageEntityPre#73924be0 offset:int length:int language:string = MessageEntity; +messageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity; +messageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity; +inputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity; +messageEntityPhone#9b69e34b offset:int length:int = MessageEntity; +messageEntityCashtag#4c4e743f offset:int length:int = MessageEntity; +messageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity; +messageEntityStrike#bf0693d4 offset:int length:int = MessageEntity; +messageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity; +messageEntityBankCard#761e6af4 offset:int length:int = MessageEntity; +inputChannelEmpty#ee8c1e86 = InputChannel; +inputChannel#afeb712e channel_id:int access_hash:long = InputChannel; +inputChannelFromMessage#2a286531 peer:InputPeer msg_id:int channel_id:int = InputChannel; +contacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector users:Vector = contacts.ResolvedPeer; +messageRange#ae30253 min_id:int max_id:int = MessageRange; +updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference; +updates.channelDifferenceTooLong#a4bcc6fe flags:# final:flags.0?true timeout:flags.1?int dialog:Dialog messages:Vector chats:Vector users:Vector = updates.ChannelDifference; +updates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector other_updates:Vector chats:Vector users:Vector = updates.ChannelDifference; +channelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter; +channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector = ChannelMessagesFilter; +channelParticipant#15ebac1d user_id:int date:int = ChannelParticipant; +channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant; +channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; +channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; +channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; +channelParticipantLeft#c3c6796b user_id:int = ChannelParticipant; +channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; +channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter; +channelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter; +channelParticipantsBots#b0d1865b = ChannelParticipantsFilter; +channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter; +channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter; +channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter; +channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter; +channels.channelParticipants#f56ee2a8 count:int participants:Vector users:Vector = channels.ChannelParticipants; +channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants; +channels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector = channels.ChannelParticipant; +help.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector min_age_confirm:flags.1?int = help.TermsOfService; +messages.savedGifsNotModified#e8025ca2 = messages.SavedGifs; +messages.savedGifs#2e0709a5 hash:int gifs:Vector = messages.SavedGifs; +inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineResult#88bf9319 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?InputWebDocument content:flags.5?InputWebDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult; +botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineResult#11965f3a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?WebDocument content:flags.5?WebDocument send_message:BotInlineMessage = BotInlineResult; +botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult; +messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector cache_time:int users:Vector = messages.BotResults; +exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink; +messageFwdHeader#5f777dce flags:# from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; +auth.codeTypeSms#72a3158c = auth.CodeType; +auth.codeTypeCall#741cd3e3 = auth.CodeType; +auth.codeTypeFlashCall#226ccefb = auth.CodeType; +auth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType; +auth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType; +auth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType; +auth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType; +messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer; +messages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData; +inputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID; +inlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM; +messages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs; +topPeer#edcdc05b peer:Peer rating:double = TopPeer; +topPeerCategoryBotsPM#ab661b5b = TopPeerCategory; +topPeerCategoryBotsInline#148677e2 = TopPeerCategory; +topPeerCategoryCorrespondents#637b7ed = TopPeerCategory; +topPeerCategoryGroups#bd17a14a = TopPeerCategory; +topPeerCategoryChannels#161d9628 = TopPeerCategory; +topPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory; +topPeerCategoryForwardUsers#a8406ca9 = TopPeerCategory; +topPeerCategoryForwardChats#fbeec0f0 = TopPeerCategory; +topPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector = TopPeerCategoryPeers; +contacts.topPeersNotModified#de266ef5 = contacts.TopPeers; +contacts.topPeers#70b772a8 categories:Vector chats:Vector users:Vector = contacts.TopPeers; +contacts.topPeersDisabled#b52c939d = contacts.TopPeers; +draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage; +draftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector date:int = DraftMessage; +messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers; +messages.featuredStickers#b6abc341 hash:int count:int sets:Vector unread:Vector = messages.FeaturedStickers; +messages.recentStickersNotModified#b17f890 = messages.RecentStickers; +messages.recentStickers#22f3afb3 hash:int packs:Vector stickers:Vector dates:Vector = messages.RecentStickers; +messages.archivedStickers#4fcba9c8 count:int sets:Vector = messages.ArchivedStickers; +messages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult; +messages.stickerSetInstallResultArchive#35e410a8 sets:Vector = messages.StickerSetInstallResult; +stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered; +stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered; +maskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords; +inputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia; +inputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia; +game#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game; +inputGameID#32c3e77 id:long access_hash:long = InputGame; +inputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame; +highScore#58fffcd0 pos:int user_id:int score:int = HighScore; +messages.highScores#9a3bfd99 scores:Vector users:Vector = messages.HighScores; +textEmpty#dc3d824f = RichText; +textPlain#744694e0 text:string = RichText; +textBold#6724abc4 text:RichText = RichText; +textItalic#d912a59c text:RichText = RichText; +textUnderline#c12622c4 text:RichText = RichText; +textStrike#9bf8bb95 text:RichText = RichText; +textFixed#6c3f19b9 text:RichText = RichText; +textUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText; +textEmail#de5a0dd6 text:RichText email:string = RichText; +textConcat#7e6260d7 texts:Vector = RichText; +textSubscript#ed6a8504 text:RichText = RichText; +textSuperscript#c7fb5e01 text:RichText = RichText; +textMarked#34b8621 text:RichText = RichText; +textPhone#1ccb966a text:RichText phone:string = RichText; +textImage#81ccf4f document_id:long w:int h:int = RichText; +textAnchor#35553762 text:RichText name:string = RichText; +pageBlockUnsupported#13567e8a = PageBlock; +pageBlockTitle#70abc3fd text:RichText = PageBlock; +pageBlockSubtitle#8ffa9a1f text:RichText = PageBlock; +pageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock; +pageBlockHeader#bfd064ec text:RichText = PageBlock; +pageBlockSubheader#f12bb6e1 text:RichText = PageBlock; +pageBlockParagraph#467a0766 text:RichText = PageBlock; +pageBlockPreformatted#c070d93e text:RichText language:string = PageBlock; +pageBlockFooter#48870999 text:RichText = PageBlock; +pageBlockDivider#db20b188 = PageBlock; +pageBlockAnchor#ce0d37b0 name:string = PageBlock; +pageBlockList#e4e88011 items:Vector = PageBlock; +pageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock; +pageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock; +pageBlockPhoto#1759c560 flags:# photo_id:long caption:PageCaption url:flags.0?string webpage_id:flags.0?long = PageBlock; +pageBlockVideo#7c8fe7b6 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:PageCaption = PageBlock; +pageBlockCover#39f23300 cover:PageBlock = PageBlock; +pageBlockEmbed#a8718dc5 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:flags.5?int h:flags.5?int caption:PageCaption = PageBlock; +pageBlockEmbedPost#f259a80b url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector caption:PageCaption = PageBlock; +pageBlockCollage#65a0fa4d items:Vector caption:PageCaption = PageBlock; +pageBlockSlideshow#31f9590 items:Vector caption:PageCaption = PageBlock; +pageBlockChannel#ef1751b5 channel:Chat = PageBlock; +pageBlockAudio#804361ea audio_id:long caption:PageCaption = PageBlock; +pageBlockKicker#1e148390 text:RichText = PageBlock; +pageBlockTable#bf4dea82 flags:# bordered:flags.0?true striped:flags.1?true title:RichText rows:Vector = PageBlock; +pageBlockOrderedList#9a8ae1e1 items:Vector = PageBlock; +pageBlockDetails#76768bed flags:# open:flags.0?true blocks:Vector title:RichText = PageBlock; +pageBlockRelatedArticles#16115a96 title:RichText articles:Vector = PageBlock; +pageBlockMap#a44f3ef6 geo:GeoPoint zoom:int w:int h:int caption:PageCaption = PageBlock; +phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason; +phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason; +phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason; +phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason; +dataJSON#7d748d04 data:string = DataJSON; +labeledPrice#cb296bf8 label:string amount:long = LabeledPrice; +invoice#c30aa358 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector = Invoice; +paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge; +postAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress; +paymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo; +paymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials; +webDocument#1c570ed1 url:string access_hash:long size:int mime_type:string attributes:Vector = WebDocument; +webDocumentNoProxy#f9c8bcc6 url:string size:int mime_type:string attributes:Vector = WebDocument; +inputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector = InputWebDocument; +inputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation; +inputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w:int h:int zoom:int scale:int = InputWebFileLocation; +upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile; +payments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; +payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; +payments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult; +payments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult; +payments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt; +payments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo; +inputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials; +inputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsAndroidPay#ca05d50e payment_token:DataJSON google_transaction_id:string = InputPaymentCredentials; +account.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword; +shippingOption#b6213cdf id:string title:string prices:Vector = ShippingOption; +inputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem; +inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall; +phoneCallEmpty#5366c915 id:long = PhoneCall; +phoneCallWaiting#1b8f4ad1 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall; +phoneCallRequested#87eabb53 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCallAccepted#997c454a flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCall#8742ae7f flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int = PhoneCall; +phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall; +phoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection; +phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection; +phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector = PhoneCallProtocol; +phone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector = phone.PhoneCall; +upload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile; +upload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile; +cdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey; +cdnConfig#5725e40a public_keys:Vector = CdnConfig; +langPackString#cad181f6 key:string value:string = LangPackString; +langPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString; +langPackStringDeleted#2979eeb2 key:string = LangPackString; +langPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector = LangPackDifference; +langPackLanguage#eeca5ce3 flags:# official:flags.0?true rtl:flags.2?true beta:flags.3?true name:string native_name:string lang_code:string base_lang_code:flags.1?string plural_code:string strings_count:int translated_count:int translations_url:string = LangPackLanguage; +channelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangePhoto#434bd2af prev_photo:Photo new_photo:Photo = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction; +channelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBannedRights new_banned_rights:ChatBannedRights = ChannelAdminLogEventAction; +channelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLinkedChat#a26f881b prev_value:int new_value:int = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction; +channelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent; +channels.adminLogResults#ed8af74d events:Vector chats:Vector users:Vector = channels.AdminLogResults; +channelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true = ChannelAdminLogEventsFilter; +popularContact#5ce14175 client_id:long importers:int = PopularContact; +messages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers; +messages.favedStickers#f37f2f16 hash:int packs:Vector stickers:Vector = messages.FavedStickers; +recentMeUrlUnknown#46e1d13d url:string = RecentMeUrl; +recentMeUrlUser#8dbc3336 url:string user_id:int = RecentMeUrl; +recentMeUrlChat#a01b22f9 url:string chat_id:int = RecentMeUrl; +recentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl; +recentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl; +help.recentMeUrls#e0310d7 urls:Vector chats:Vector users:Vector = help.RecentMeUrls; +inputSingleMedia#1cc6e91f flags:# media:InputMedia random_id:long message:string entities:flags.0?Vector = InputSingleMedia; +webAuthorization#cac943f2 hash:long bot_id:int domain:string browser:string platform:string date_created:int date_active:int ip:string region:string = WebAuthorization; +account.webAuthorizations#ed56c9fc authorizations:Vector users:Vector = account.WebAuthorizations; +inputMessageID#a676a322 id:int = InputMessage; +inputMessageReplyTo#bad88395 id:int = InputMessage; +inputMessagePinned#86872538 = InputMessage; +inputMessageCallbackQuery#acfa1a7e id:int query_id:long = InputMessage; +inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer; +inputDialogPeerFolder#64600527 folder_id:int = InputDialogPeer; +dialogPeer#e56dbf05 peer:Peer = DialogPeer; +dialogPeerFolder#514519e2 folder_id:int = DialogPeer; +messages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets; +messages.foundStickerSets#5108d648 hash:int sets:Vector = messages.FoundStickerSets; +fileHash#6242c773 offset:int limit:int hash:bytes = FileHash; +inputClientProxy#75588b3f address:string port:int = InputClientProxy; +help.termsOfServiceUpdateEmpty#e3309f7f expires:int = help.TermsOfServiceUpdate; +help.termsOfServiceUpdate#28ecf961 expires:int terms_of_service:help.TermsOfService = help.TermsOfServiceUpdate; +inputSecureFileUploaded#3334b0f0 id:long parts:int md5_checksum:string file_hash:bytes secret:bytes = InputSecureFile; +inputSecureFile#5367e5be id:long access_hash:long = InputSecureFile; +secureFileEmpty#64199744 = SecureFile; +secureFile#e0277a62 id:long access_hash:long size:int dc_id:int date:int file_hash:bytes secret:bytes = SecureFile; +secureData#8aeabec3 data:bytes data_hash:bytes secret:bytes = SecureData; +securePlainPhone#7d6099dd phone:string = SecurePlainData; +securePlainEmail#21ec5a5f email:string = SecurePlainData; +secureValueTypePersonalDetails#9d2a81e3 = SecureValueType; +secureValueTypePassport#3dac6a00 = SecureValueType; +secureValueTypeDriverLicense#6e425c4 = SecureValueType; +secureValueTypeIdentityCard#a0d0744b = SecureValueType; +secureValueTypeInternalPassport#99a48f23 = SecureValueType; +secureValueTypeAddress#cbe31e26 = SecureValueType; +secureValueTypeUtilityBill#fc36954e = SecureValueType; +secureValueTypeBankStatement#89137c0d = SecureValueType; +secureValueTypeRentalAgreement#8b883488 = SecureValueType; +secureValueTypePassportRegistration#99e3806a = SecureValueType; +secureValueTypeTemporaryRegistration#ea02ec33 = SecureValueType; +secureValueTypePhone#b320aadb = SecureValueType; +secureValueTypeEmail#8e3ca7ee = SecureValueType; +secureValue#187fa0ca flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?SecureFile reverse_side:flags.2?SecureFile selfie:flags.3?SecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData hash:bytes = SecureValue; +inputSecureValue#db21d0a7 flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?InputSecureFile reverse_side:flags.2?InputSecureFile selfie:flags.3?InputSecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData = InputSecureValue; +secureValueHash#ed1ecdb0 type:SecureValueType hash:bytes = SecureValueHash; +secureValueErrorData#e8a40bd9 type:SecureValueType data_hash:bytes field:string text:string = SecureValueError; +secureValueErrorFrontSide#be3dfa type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorReverseSide#868a2aa5 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorSelfie#e537ced6 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFile#7a700873 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFiles#666220e9 type:SecureValueType file_hash:Vector text:string = SecureValueError; +secureValueError#869d758f type:SecureValueType hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFile#a1144770 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFiles#34636dd8 type:SecureValueType file_hash:Vector text:string = SecureValueError; +secureCredentialsEncrypted#33f0ea47 data:bytes hash:bytes secret:bytes = SecureCredentialsEncrypted; +account.authorizationForm#ad2e1cd8 flags:# required_types:Vector values:Vector errors:Vector users:Vector privacy_policy_url:flags.0?string = account.AuthorizationForm; +account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; +help.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo; +help.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo; +savedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact; +account.takeout#4dba4501 id:long = account.Takeout; +passwordKdfAlgoUnknown#d45ab096 = PasswordKdfAlgo; +passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow#3a912d4a salt1:bytes salt2:bytes g:int p:bytes = PasswordKdfAlgo; +securePasswordKdfAlgoUnknown#4a8537 = SecurePasswordKdfAlgo; +securePasswordKdfAlgoPBKDF2HMACSHA512iter100000#bbf2dda0 salt:bytes = SecurePasswordKdfAlgo; +securePasswordKdfAlgoSHA512#86471d92 salt:bytes = SecurePasswordKdfAlgo; +secureSecretSettings#1527bcac secure_algo:SecurePasswordKdfAlgo secure_secret:bytes secure_secret_id:long = SecureSecretSettings; +inputCheckPasswordEmpty#9880f658 = InputCheckPasswordSRP; +inputCheckPasswordSRP#d27ff082 srp_id:long A:bytes M1:bytes = InputCheckPasswordSRP; +secureRequiredType#829d99da flags:# native_names:flags.0?true selfie_required:flags.1?true translation_required:flags.2?true type:SecureValueType = SecureRequiredType; +secureRequiredTypeOneOf#27477b4 types:Vector = SecureRequiredType; +help.passportConfigNotModified#bfb9f457 = help.PassportConfig; +help.passportConfig#a098d6af hash:int countries_langs:DataJSON = help.PassportConfig; +inputAppEvent#1d1b1245 time:double type:string peer:long data:JSONValue = InputAppEvent; +jsonObjectValue#c0de1bd9 key:string value:JSONValue = JSONObjectValue; +jsonNull#3f6d7b68 = JSONValue; +jsonBool#c7345e6a value:Bool = JSONValue; +jsonNumber#2be0dfa4 value:double = JSONValue; +jsonString#b71e767a value:string = JSONValue; +jsonArray#f7444763 value:Vector = JSONValue; +jsonObject#99c1d49d value:Vector = JSONValue; +pageTableCell#34566b6a flags:# header:flags.0?true align_center:flags.3?true align_right:flags.4?true valign_middle:flags.5?true valign_bottom:flags.6?true text:flags.7?RichText colspan:flags.1?int rowspan:flags.2?int = PageTableCell; +pageTableRow#e0c0c5e5 cells:Vector = PageTableRow; +pageCaption#6f747657 text:RichText credit:RichText = PageCaption; +pageListItemText#b92fb6cd text:RichText = PageListItem; +pageListItemBlocks#25e073fc blocks:Vector = PageListItem; +pageListOrderedItemText#5e068047 num:string text:RichText = PageListOrderedItem; +pageListOrderedItemBlocks#98dd8936 num:string blocks:Vector = PageListOrderedItem; +pageRelatedArticle#b390dc08 flags:# url:string webpage_id:long title:flags.0?string description:flags.1?string photo_id:flags.2?long author:flags.3?string published_date:flags.4?int = PageRelatedArticle; +page#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:string blocks:Vector photos:Vector documents:Vector views:flags.3?int = Page; +help.supportName#8c05f1c9 name:string = help.SupportName; +help.userInfoEmpty#f3ae2eed = help.UserInfo; +help.userInfo#1eb3758 message:string entities:Vector author:string date:int = help.UserInfo; +pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer; +poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector close_period:flags.4?int close_date:flags.5?int = Poll; +pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters; +pollResults#badcc1a3 flags:# min:flags.0?true results:flags.1?Vector total_voters:flags.2?int recent_voters:flags.3?Vector solution:flags.4?string solution_entities:flags.4?Vector = PollResults; +chatOnlines#f041e250 onlines:int = ChatOnlines; +statsURL#47a971e0 url:string = StatsURL; +chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true = ChatAdminRights; +chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights; +inputWallPaper#e630b979 id:long access_hash:long = InputWallPaper; +inputWallPaperSlug#72091c80 slug:string = InputWallPaper; +inputWallPaperNoFile#8427bbac = InputWallPaper; +account.wallPapersNotModified#1c199183 = account.WallPapers; +account.wallPapers#702b65a9 hash:int wallpapers:Vector = account.WallPapers; +codeSettings#debebe83 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true = CodeSettings; +wallPaperSettings#5086cf8 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int intensity:flags.3?int rotation:flags.4?int = WallPaperSettings; +autoDownloadSettings#e04232f3 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true photo_size_max:int video_size_max:int file_size_max:int video_upload_maxbitrate:int = AutoDownloadSettings; +account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; +emojiKeyword#d5b3b9f9 keyword:string emoticons:Vector = EmojiKeyword; +emojiKeywordDeleted#236df622 keyword:string emoticons:Vector = EmojiKeyword; +emojiKeywordsDifference#5cc761bd lang_code:string from_version:int version:int keywords:Vector = EmojiKeywordsDifference; +emojiURL#a575739d url:string = EmojiURL; +emojiLanguage#b3fb5361 lang_code:string = EmojiLanguage; +fileLocationToBeDeprecated#bc7fc6cd volume_id:long local_id:int = FileLocation; +folder#ff544e65 flags:# autofill_new_broadcasts:flags.0?true autofill_public_groups:flags.1?true autofill_new_correspondents:flags.2?true id:int title:string photo:flags.3?ChatPhoto = Folder; +inputFolderPeer#fbd2c296 peer:InputPeer folder_id:int = InputFolderPeer; +folderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer; +messages.searchCounter#e844ebff flags:# inexact:flags.1?true filter:MessagesFilter count:int = messages.SearchCounter; +urlAuthResultRequest#92d33a0e flags:# request_write_access:flags.0?true bot:User domain:string = UrlAuthResult; +urlAuthResultAccepted#8f8c0e4e url:string = UrlAuthResult; +urlAuthResultDefault#a9d6db1f = UrlAuthResult; +channelLocationEmpty#bfb5ad8b = ChannelLocation; +channelLocation#209b82db geo_point:GeoPoint address:string = ChannelLocation; +peerLocated#ca461b5d peer:Peer expires:int distance:int = PeerLocated; +peerSelfLocated#f8ec284b expires:int = PeerLocated; +restrictionReason#d072acb4 platform:string reason:string text:string = RestrictionReason; +inputTheme#3c5693e9 id:long access_hash:long = InputTheme; +inputThemeSlug#f5890df1 slug:string = InputTheme; +theme#28f1114 flags:# creator:flags.0?true default:flags.1?true id:long access_hash:long slug:string title:string document:flags.2?Document settings:flags.3?ThemeSettings installs_count:int = Theme; +account.themesNotModified#f41eb622 = account.Themes; +account.themes#7f676421 hash:int themes:Vector = account.Themes; +auth.loginToken#629f1980 expires:int token:bytes = auth.LoginToken; +auth.loginTokenMigrateTo#68e9916 dc_id:int token:bytes = auth.LoginToken; +auth.loginTokenSuccess#390d5c5e authorization:auth.Authorization = auth.LoginToken; +account.contentSettings#57e28221 flags:# sensitive_enabled:flags.0?true sensitive_can_change:flags.1?true = account.ContentSettings; +messages.inactiveChats#a927fec5 dates:Vector chats:Vector users:Vector = messages.InactiveChats; +baseThemeClassic#c3a12462 = BaseTheme; +baseThemeDay#fbd81688 = BaseTheme; +baseThemeNight#b7b31ea8 = BaseTheme; +baseThemeTinted#6d5f77ee = BaseTheme; +baseThemeArctic#5b11125a = BaseTheme; +inputThemeSettings#bd507cd1 flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?InputWallPaper wallpaper_settings:flags.1?WallPaperSettings = InputThemeSettings; +themeSettings#9c14984a flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?WallPaper = ThemeSettings; +webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; +messageUserVote#a28e5559 user_id:int option:bytes date:int = MessageUserVote; +messageUserVoteInputOption#36377430 user_id:int date:int = MessageUserVote; +messageUserVoteMultiple#e8fe0de user_id:int options:Vector date:int = MessageUserVote; +messages.votesList#823f649 flags:# count:int votes:Vector users:Vector next_offset:flags.0?string = messages.VotesList; +bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; +payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; +dialogFilter#7438f7e8 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter; +dialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested; +// Some unused classes were removed below this line +videoSize#e831c556 flags:# type:string location:FileLocation w:int h:int size:int video_start_ts:flags.0?double = VideoSize; +messages.discussionMessage#f5dd8f9d flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector users:Vector = messages.DiscussionMessage; +messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; +messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int max_id:flags.2?int read_max_id:flags.3?int = MessageReplies; +peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; +---functions--- +initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; +invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; +auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; +auth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization; +auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; +auth.logOut#5717da40 = Bool; +auth.resetAuthorizations#9fab0d1a = Bool; +auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization; +auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization; +auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool; +auth.checkPassword#d18b4d16 password:InputCheckPasswordSRP = auth.Authorization; +auth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery; +auth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode; +auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool; +auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector = Bool; +auth.exportLoginToken#b1b41517 api_id:int api_hash:string except_ids:Vector = auth.LoginToken; +auth.importLoginToken#95ac5ce4 token:bytes = auth.LoginToken; +account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool; +account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings; +account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User; +account.getWallPapers#aabb1763 hash:int = account.WallPapers; +account.uploadWallPaper#dd853661 file:InputFile mime_type:string settings:WallPaperSettings = WallPaper; +account.checkUsername#2714d86c username:string = Bool; +account.updateUsername#3e0bdd7c username:string = User; +account.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules; +account.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector = account.PrivacyRules; +account.getAuthorizations#e320c158 = account.Authorizations; +account.resetAuthorization#df77f3bc hash:long = Bool; +account.getPassword#548a30f5 = account.Password; +account.getPasswordSettings#9cd4eaf9 password:InputCheckPasswordSRP = account.PasswordSettings; +account.updatePasswordSettings#a59b102f password:InputCheckPasswordSRP new_settings:account.PasswordInputSettings = Bool; +account.sendConfirmPhoneCode#1b3faa88 hash:string settings:CodeSettings = auth.SentCode; +account.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool; +account.getTmpPassword#449e0b51 password:InputCheckPasswordSRP period:int = account.TmpPassword; +account.sendVerifyPhoneCode#a5a356f9 phone_number:string settings:CodeSettings = auth.SentCode; +account.confirmPasswordEmail#8fdf1920 code:string = Bool; +account.getContactSignUpNotification#9f07c728 = Bool; +account.setContactSignUpNotification#cff43f61 silent:Bool = Bool; +users.getUsers#d91a548 id:Vector = Vector; +users.getFullUser#ca30a5b1 id:InputUser = UserFull; +contacts.getContacts#c023849f hash:int = contacts.Contacts; +contacts.importContacts#2c800be5 contacts:Vector = contacts.ImportedContacts; +contacts.deleteContacts#96a0e00 id:Vector = Updates; +contacts.block#68cc1411 id:InputPeer = Bool; +contacts.unblock#bea65d50 id:InputPeer = Bool; +contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked; +contacts.search#11f812d8 q:string limit:int = contacts.Found; +contacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer; +contacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers; +messages.getMessages#63c66506 id:Vector = messages.Messages; +messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; +messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; +messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory; +messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; +messages.receivedMessages#5a954c0 max_id:int = Vector; +messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; +messages.sendMessage#520c3870 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates; +messages.getChats#3c6aa187 id:Vector = messages.Chats; +messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull; +messages.editChatTitle#dc452855 chat_id:int title:string = Updates; +messages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates; +messages.createChat#9cb126e users:Vector title:string = Updates; +messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig; +messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages; +messages.getStickers#43d4f2c emoticon:string hash:int = messages.Stickers; +messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers; +messages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia; +messages.exportChatInvite#df7534c peer:InputPeer = ExportedChatInvite; +messages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet; +messages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult; +messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; +messages.migrateChat#15a3b8e3 chat_id:int = Updates; +messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document; +messages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs; +messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults; +messages.editMessage#48f71778 flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int = Updates; +messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer; +messages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs; +messages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector = Bool; +messages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers; +messages.readFeaturedStickers#5b118126 id:Vector = Bool; +messages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers; +messages.getWebPage#32ca8f91 url:string hash:int = WebPage; +messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool; +messages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs; +messages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia; +messages.getFavedStickers#21ce0b0e hash:int = messages.FavedStickers; +messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool; +messages.sendMultiMedia#cc0110cb flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int = Updates; +messages.searchStickerSets#c2b7d08b flags:# exclude_featured:flags.0?true q:string hash:int = messages.FoundStickerSets; +messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool; +messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; +messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates; +messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines; +messages.editChatAbout#def60797 peer:InputPeer about:string = Bool; +messages.editChatDefaultBannedRights#a5866b41 peer:InputPeer banned_rights:ChatBannedRights = Updates; +messages.getScheduledHistory#e2c2685b peer:InputPeer hash:int = messages.Messages; +messages.sendScheduledMessages#bd38850a peer:InputPeer id:Vector = Updates; +messages.deleteScheduledMessages#59ae2b16 peer:InputPeer id:Vector = Updates; +messages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?bytes offset:flags.1?string limit:int = messages.VotesList; +messages.getDialogFilters#f19ed96d = Vector; +messages.getSuggestedDialogFilters#a29cd42c = Vector; +messages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool; +messages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; +messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; +messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory; +updates.getState#edd4882a = updates.State; +updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; +updates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference; +photos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo; +upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool; +upload.getFile#b15a9afc flags:# precise:flags.0?true cdn_supported:flags.1?true location:InputFileLocation offset:int limit:int = upload.File; +upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool; +help.getConfig#c4f9186b = Config; +help.getNearestDc#1fb33026 = NearestDc; +help.getSupport#9cdf08cd = help.Support; +help.acceptTermsOfService#ee72f79a id:DataJSON = Bool; +channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool; +channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages; +channels.getMessages#ad8c9a23 channel:InputChannel id:Vector = messages.Messages; +channels.getParticipants#123e05e9 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:int = channels.ChannelParticipants; +channels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channels.ChannelParticipant; +channels.getChannels#a7f6bbb id:Vector = messages.Chats; +channels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull; +channels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates; +channels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates; +channels.editTitle#566decd0 channel:InputChannel title:string = Updates; +channels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates; +channels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool; +channels.updateUsername#3514b3de channel:InputChannel username:string = Bool; +channels.joinChannel#24b524c5 channel:InputChannel = Updates; +channels.leaveChannel#f836aa95 channel:InputChannel = Updates; +channels.inviteToChannel#199f3a6c channel:InputChannel users:Vector = Updates; +channels.deleteChannel#c0111fe3 channel:InputChannel = Updates; +channels.exportMessageLink#e63fadeb flags:# grouped:flags.0?true thread:flags.1?true channel:InputChannel id:int = ExportedMessageLink; +channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates; +channels.editBanned#72796912 channel:InputChannel user_id:InputUser banned_rights:ChatBannedRights = Updates; +channels.readMessageContents#eab5dc38 channel:InputChannel id:Vector = Bool; +channels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates; +channels.getGroupsForDiscussion#f5dad378 = messages.Chats; +channels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool; +payments.getPaymentForm#99f09745 msg_id:int = payments.PaymentForm; +payments.getPaymentReceipt#a092a980 msg_id:int = payments.PaymentReceipt; +payments.validateRequestedInfo#770a8e74 flags:# save:flags.0?true msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo; +payments.sendPaymentForm#2b8879b3 flags:# msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials = payments.PaymentResult; +payments.getSavedInfo#227d824b = payments.SavedInfo; +langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference; +langpack.getLanguages#42c6978f lang_pack:string = Vector; +folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates; +// LAYER 121 diff --git a/src/lib/gramjs/tl/static/api.tl b/src/lib/gramjs/tl/static/api.tl new file mode 100644 index 000000000..531ea9f51 --- /dev/null +++ b/src/lib/gramjs/tl/static/api.tl @@ -0,0 +1,1552 @@ +/////////////////////////////// +/////////////////// Layer cons +/////////////////////////////// + +//invokeAfterMsg#cb9f372d msg_id:long query:!X = X; +//invokeAfterMsgs#3dc4b4f0 msg_ids:Vector query:!X = X; +//invokeWithLayer1#53835315 query:!X = X; +//invokeWithLayer2#289dd1f6 query:!X = X; +//invokeWithLayer3#b7475268 query:!X = X; +//invokeWithLayer4#dea0d430 query:!X = X; +//invokeWithLayer5#417a57ae query:!X = X; +//invokeWithLayer6#3a64d54d query:!X = X; +//invokeWithLayer7#a5be56d3 query:!X = X; +//invokeWithLayer8#e9abd9fd query:!X = X; +//invokeWithLayer9#76715a63 query:!X = X; +//invokeWithLayer10#39620c41 query:!X = X; +//invokeWithLayer11#a6b88fdf query:!X = X; +//invokeWithLayer12#dda60d3c query:!X = X; +//invokeWithLayer13#427c8ea2 query:!X = X; +//invokeWithLayer14#2b9b08fa query:!X = X; +//invokeWithLayer15#b4418b64 query:!X = X; +//invokeWithLayer16#cf5f0987 query:!X = X; +//invokeWithLayer17#50858a19 query:!X = X; +//invokeWithLayer18#1c900537 query:!X = X; +//invokeWithLayer#da9b0d0d layer:int query:!X = X; // after 18 layer + +/////////////////////////////// +///////// Main application API +/////////////////////////////// + +boolFalse#bc799737 = Bool; +boolTrue#997275b5 = Bool; + +true#3fedd339 = True; + +vector#1cb5c415 {t:Type} # [ t ] = Vector t; + +error#c4b9f9bb code:int text:string = Error; + +null#56730bcc = Null; + +inputPeerEmpty#7f3b18ea = InputPeer; +inputPeerSelf#7da07ec9 = InputPeer; +inputPeerChat#179be863 chat_id:int = InputPeer; +inputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer; +inputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer; +inputPeerUserFromMessage#17bae2e6 peer:InputPeer msg_id:int user_id:int = InputPeer; +inputPeerChannelFromMessage#9c95f7bb peer:InputPeer msg_id:int channel_id:int = InputPeer; + +inputUserEmpty#b98886cf = InputUser; +inputUserSelf#f7c1b13f = InputUser; +inputUser#d8292816 user_id:int access_hash:long = InputUser; +inputUserFromMessage#2d117597 peer:InputPeer msg_id:int user_id:int = InputUser; + +inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact; + +inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile; +inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile; + +inputMediaEmpty#9664f57f = InputMedia; +inputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia; +inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia; +inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia; +inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; +inputMediaDocument#23ab23d2 flags:# id:InputDocument ttl_seconds:flags.0?int = InputMedia; +inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia; +inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia; +inputMediaGame#d33f43f3 id:InputGame = InputMedia; +inputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia; +inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia; +inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia; +inputMediaDice#e66fbf7b emoticon:string = InputMedia; + +inputChatPhotoEmpty#1ca48f57 = InputChatPhoto; +inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto; +inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto; + +inputGeoPointEmpty#e4c123d6 = InputGeoPoint; +inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint; + +inputPhotoEmpty#1cd7bf0d = InputPhoto; +inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto; + +inputFileLocation#dfdaabe1 volume_id:long local_id:int secret:long file_reference:bytes = InputFileLocation; +inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation; +inputDocumentFileLocation#bad07584 id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputSecureFileLocation#cbc7ee28 id:long access_hash:long = InputFileLocation; +inputTakeoutFileLocation#29be5899 = InputFileLocation; +inputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; +inputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation; +inputPeerPhotoFileLocation#27d69997 flags:# big:flags.0?true peer:InputPeer volume_id:long local_id:int = InputFileLocation; +inputStickerSetThumb#dbaeae9 stickerset:InputStickerSet volume_id:long local_id:int = InputFileLocation; + +peerUser#9db1bc6d user_id:int = Peer; +peerChat#bad0e5bb chat_id:int = Peer; +peerChannel#bddde532 channel_id:int = Peer; + +storage.fileUnknown#aa963b05 = storage.FileType; +storage.filePartial#40bc6f52 = storage.FileType; +storage.fileJpeg#7efe0e = storage.FileType; +storage.fileGif#cae1aadf = storage.FileType; +storage.filePng#a4f63c0 = storage.FileType; +storage.filePdf#ae1e508d = storage.FileType; +storage.fileMp3#528a0677 = storage.FileType; +storage.fileMov#4b09ebbc = storage.FileType; +storage.fileMp4#b3cea0e4 = storage.FileType; +storage.fileWebp#1081464c = storage.FileType; + +userEmpty#200250ba id:int = User; +user#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User; + +userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto; +userProfilePhoto#69d3ab26 flags:# has_video:flags.0?true photo_id:long photo_small:FileLocation photo_big:FileLocation dc_id:int = UserProfilePhoto; + +userStatusEmpty#9d05049 = UserStatus; +userStatusOnline#edb93949 expires:int = UserStatus; +userStatusOffline#8c703f was_online:int = UserStatus; +userStatusRecently#e26f42f1 = UserStatus; +userStatusLastWeek#7bf09fc = UserStatus; +userStatusLastMonth#77ebc742 = UserStatus; + +chatEmpty#9ba2d800 id:int = Chat; +chat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; +chatForbidden#7328bdb id:int title:string = Chat; +channel#d31a961e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; +channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat; + +chatFull#1b7c9db3 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int = ChatFull; +channelFull#f0e6672a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int = ChatFull; + +chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant; +chatParticipantCreator#da13538a user_id:int = ChatParticipant; +chatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant; + +chatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants; +chatParticipants#3f460fed chat_id:int participants:Vector version:int = ChatParticipants; + +chatPhotoEmpty#37c1011c = ChatPhoto; +chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto; + +messageEmpty#83e5de54 id:int = Message; +message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; +messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message; + +messageMediaEmpty#3ded6320 = MessageMedia; +messageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia; +messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia; +messageMediaContact#cbf24940 phone_number:string first_name:string last_name:string vcard:string user_id:int = MessageMedia; +messageMediaUnsupported#9f84f49e = MessageMedia; +messageMediaDocument#9cb070d7 flags:# document:flags.0?Document ttl_seconds:flags.2?int = MessageMedia; +messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia; +messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia; +messageMediaGame#fdb19008 game:Game = MessageMedia; +messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia; +messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia; +messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; +messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; + +messageActionEmpty#b6aef7b0 = MessageAction; +messageActionChatCreate#a6638b9a title:string users:Vector = MessageAction; +messageActionChatEditTitle#b5a1ce5a title:string = MessageAction; +messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction; +messageActionChatDeletePhoto#95e3fbef = MessageAction; +messageActionChatAddUser#488a7337 users:Vector = MessageAction; +messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction; +messageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction; +messageActionChannelCreate#95d2ac92 title:string = MessageAction; +messageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction; +messageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction; +messageActionPinMessage#94bd38ed = MessageAction; +messageActionHistoryClear#9fbab604 = MessageAction; +messageActionGameScore#92a72876 game_id:long score:int = MessageAction; +messageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction; +messageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction; +messageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction; +messageActionScreenshotTaken#4792929b = MessageAction; +messageActionCustomAction#fae69f56 message:string = MessageAction; +messageActionBotAllowed#abe9affe domain:string = MessageAction; +messageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction; +messageActionSecureValuesSent#d95c6154 types:Vector = MessageAction; +messageActionContactSignUp#f3f25f76 = MessageAction; +messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction; + +dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog; +dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog; + +photoEmpty#2331b22d id:long = Photo; +photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector video_sizes:flags.1?Vector dc_id:int = Photo; + +photoSizeEmpty#e17e23c type:string = PhotoSize; +photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize; +photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize; +photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize; +photoSizeProgressive#5aa86a51 type:string location:FileLocation w:int h:int sizes:Vector = PhotoSize; +photoPathSize#d8214d41 type:string bytes:bytes = PhotoSize; + +geoPointEmpty#1117dd5f = GeoPoint; +geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint; + +auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; + +auth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization; +auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization; + +auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization; + +inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer; +inputNotifyUsers#193b4417 = InputNotifyPeer; +inputNotifyChats#4a95e84e = InputNotifyPeer; +inputNotifyBroadcasts#b1db7c7e = InputNotifyPeer; + +inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings; + +peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings; + +peerSettings#733f2961 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true geo_distance:flags.6?int = PeerSettings; + +wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper; +wallPaperNoFile#8af40b25 flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper; + +inputReportReasonSpam#58dbcab8 = ReportReason; +inputReportReasonViolence#1e22c78d = ReportReason; +inputReportReasonPornography#2e59d922 = ReportReason; +inputReportReasonChildAbuse#adf44ee3 = ReportReason; +inputReportReasonOther#e1746d0a text:string = ReportReason; +inputReportReasonCopyright#9b89f93a = ReportReason; +inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; + +userFull#edf17c12 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int = UserFull; + +contact#f911c994 user_id:int mutual:Bool = Contact; + +importedContact#d0028438 user_id:int client_id:long = ImportedContact; + +contactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus; + +contacts.contactsNotModified#b74ba9d2 = contacts.Contacts; +contacts.contacts#eae87e42 contacts:Vector saved_count:int users:Vector = contacts.Contacts; + +contacts.importedContacts#77d01c3b imported:Vector popular_invites:Vector retry_contacts:Vector users:Vector = contacts.ImportedContacts; + +contacts.blocked#ade1591 blocked:Vector chats:Vector users:Vector = contacts.Blocked; +contacts.blockedSlice#e1664194 count:int blocked:Vector chats:Vector users:Vector = contacts.Blocked; + +messages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; +messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs; + +messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesNotModified#74535f21 count:int = messages.Messages; + +messages.chats#64ff9fd5 chats:Vector = messages.Chats; +messages.chatsSlice#9cd81144 count:int chats:Vector = messages.Chats; + +messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull; + +messages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory; + +inputMessagesFilterEmpty#57e2f66c = MessagesFilter; +inputMessagesFilterPhotos#9609a51c = MessagesFilter; +inputMessagesFilterVideo#9fc00e65 = MessagesFilter; +inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; +inputMessagesFilterDocument#9eddf188 = MessagesFilter; +inputMessagesFilterUrl#7ef0dd87 = MessagesFilter; +inputMessagesFilterGif#ffc86587 = MessagesFilter; +inputMessagesFilterVoice#50f5c392 = MessagesFilter; +inputMessagesFilterMusic#3751b49e = MessagesFilter; +inputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter; +inputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter; +inputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter; +inputMessagesFilterRoundVideo#b549da53 = MessagesFilter; +inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter; +inputMessagesFilterGeo#e7026d0d = MessagesFilter; +inputMessagesFilterContacts#e062db83 = MessagesFilter; +inputMessagesFilterPinned#1bb00451 = MessagesFilter; + +updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; +updateMessageID#4e90bfd6 id:int random_id:long = Update; +updateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update; +updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update; +updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update; +updateChatParticipants#7761198 participants:ChatParticipants = Update; +updateUserStatus#1bfbd823 user_id:int status:UserStatus = Update; +updateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update; +updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update; +updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update; +updateEncryptedChatTyping#1710f156 chat_id:int = Update; +updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update; +updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update; +updateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update; +updateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update; +updateDcOptions#8e5e9873 dc_options:Vector = Update; +updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update; +updateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update; +updatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update; +updateUserPhone#12b9417b user_id:int phone:string = Update; +updateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update; +updateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update; +updateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update; +updateReadMessagesContents#68c13933 messages:Vector pts:int pts_count:int = Update; +updateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update; +updateChannel#b6d45656 channel_id:int = Update; +updateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update; +updateReadChannelInbox#330b5424 flags:# folder_id:flags.0?int channel_id:int max_id:int still_unread_count:int pts:int = Update; +updateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector pts:int pts_count:int = Update; +updateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update; +updateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update; +updateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update; +updateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector = Update; +updateStickerSets#43ae3dec = Update; +updateSavedGifs#9375341e = Update; +updateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update; +updateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update; +updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update; +updateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update; +updateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; +updateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update; +updateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update; +updateReadFeaturedStickers#571d2742 = Update; +updateRecentStickers#9a422c20 = Update; +updateConfig#a229dd06 = Update; +updatePtsChanged#3354678f = Update; +updateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update; +updateDialogPinned#6e6fe51c flags:# pinned:flags.0?true folder_id:flags.1?int peer:DialogPeer = Update; +updatePinnedDialogs#fa0f3ca2 flags:# folder_id:flags.1?int order:flags.0?Vector = Update; +updateBotWebhookJSON#8317c0c3 data:DataJSON = Update; +updateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update; +updateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update; +updateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update; +updatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update; +updateLangPackTooLong#46560264 lang_code:string = Update; +updateLangPack#56022f4d difference:LangPackDifference = Update; +updateFavedStickers#e511996d = Update; +updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector = Update; +updateContactsReset#7084a7be = Update; +updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update; +updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update; +updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update; +updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update; +updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update; +updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update; +updatePeerLocated#b4afcfb0 peers:Vector = Update; +updateNewScheduledMessage#39a51dfb message:Message = Update; +updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update; +updateTheme#8216fba3 theme:Theme = Update; +updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update; +updateLoginToken#564fe691 = Update; +updateMessagePollVote#42f88f2c poll_id:long user_id:int options:Vector = Update; +updateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update; +updateDialogFilterOrder#a5d72105 order:Vector = Update; +updateDialogFilters#3504914f = Update; +updatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update; +updateChannelParticipant#65d2b464 flags:# channel_id:int date:int user_id:int prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant qts:int = Update; +updateChannelMessageForwards#6e8a84df channel_id:int id:int forwards:int = Update; +updateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int read_max_id:int broadcast_id:flags.0?int broadcast_post:flags.0?int = Update; +updateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update; +updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update; +updateChannelUserTyping#ff2abe9f flags:# channel_id:int top_msg_id:flags.0?int user_id:int action:SendMessageAction = Update; +updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update; +updatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector pts:int pts_count:int = Update; + +updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; + +updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; +updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; +updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference; +updates.differenceTooLong#4afe8f6d pts:int = updates.Difference; + +updatesTooLong#e317af7e = Updates; +updateShortMessage#2296d2c8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShortChatMessage#402d5dbb flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShort#78d4dec1 update:Update date:int = Updates; +updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; +updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; +updateShortSentMessage#11f1331c flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector = Updates; + +photos.photos#8dca6aa5 photos:Vector users:Vector = photos.Photos; +photos.photosSlice#15051f54 count:int photos:Vector users:Vector = photos.Photos; + +photos.photo#20212ca8 photo:Photo users:Vector = photos.Photo; + +upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File; +upload.fileCdnRedirect#f18cda44 dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes file_hashes:Vector = upload.File; + +dcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption; + +config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config; + +nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc; + +help.appUpdate#1da7158f flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string = help.AppUpdate; +help.noAppUpdate#c45a6536 = help.AppUpdate; + +help.inviteText#18cb9f78 message:string = help.InviteText; + +encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat; +encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat; +encryptedChatRequested#62718a82 flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat; +encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat; +encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat; + +inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat; + +encryptedFileEmpty#c21f497e = EncryptedFile; +encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile; + +inputEncryptedFileEmpty#1837c364 = InputEncryptedFile; +inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile; +inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile; +inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile; + +encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage; +encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage; + +messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig; +messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig; + +messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage; +messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage; + +inputDocumentEmpty#72f0eaae = InputDocument; +inputDocument#1abfb575 id:long access_hash:long file_reference:bytes = InputDocument; + +documentEmpty#36f8c871 id:long = Document; +document#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector video_thumbs:flags.1?Vector dc_id:int attributes:Vector = Document; + +help.support#17c6b5f6 phone_number:string user:User = help.Support; + +notifyPeer#9fd40bd8 peer:Peer = NotifyPeer; +notifyUsers#b4c83b4c = NotifyPeer; +notifyChats#c007cec3 = NotifyPeer; +notifyBroadcasts#d612e8ef = NotifyPeer; + +sendMessageTypingAction#16bf744e = SendMessageAction; +sendMessageCancelAction#fd5ec8f5 = SendMessageAction; +sendMessageRecordVideoAction#a187d66f = SendMessageAction; +sendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction; +sendMessageRecordAudioAction#d52f73f7 = SendMessageAction; +sendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction; +sendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction; +sendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction; +sendMessageGeoLocationAction#176f8ba1 = SendMessageAction; +sendMessageChooseContactAction#628cbc6f = SendMessageAction; +sendMessageGamePlayAction#dd6a8f48 = SendMessageAction; +sendMessageRecordRoundAction#88f27fbc = SendMessageAction; +sendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction; + +contacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found; + +inputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey; +inputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey; +inputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey; +inputPrivacyKeyPhoneP2P#db9e70d2 = InputPrivacyKey; +inputPrivacyKeyForwards#a4dd4c08 = InputPrivacyKey; +inputPrivacyKeyProfilePhoto#5719bacc = InputPrivacyKey; +inputPrivacyKeyPhoneNumber#352dafa = InputPrivacyKey; +inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey; + +privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey; +privacyKeyChatInvite#500e6dfa = PrivacyKey; +privacyKeyPhoneCall#3d662b7b = PrivacyKey; +privacyKeyPhoneP2P#39491cc8 = PrivacyKey; +privacyKeyForwards#69ec56a3 = PrivacyKey; +privacyKeyProfilePhoto#96151fed = PrivacyKey; +privacyKeyPhoneNumber#d19ae46d = PrivacyKey; +privacyKeyAddedByPhone#42ffd42b = PrivacyKey; + +inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule; +inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule; +inputPrivacyValueAllowUsers#131cc67f users:Vector = InputPrivacyRule; +inputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule; +inputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule; +inputPrivacyValueDisallowUsers#90110467 users:Vector = InputPrivacyRule; +inputPrivacyValueAllowChatParticipants#4c81c1ba chats:Vector = InputPrivacyRule; +inputPrivacyValueDisallowChatParticipants#d82363af chats:Vector = InputPrivacyRule; + +privacyValueAllowContacts#fffe1bac = PrivacyRule; +privacyValueAllowAll#65427b82 = PrivacyRule; +privacyValueAllowUsers#4d5bbe0c users:Vector = PrivacyRule; +privacyValueDisallowContacts#f888fa1a = PrivacyRule; +privacyValueDisallowAll#8b73e763 = PrivacyRule; +privacyValueDisallowUsers#c7f49b7 users:Vector = PrivacyRule; +privacyValueAllowChatParticipants#18be796b chats:Vector = PrivacyRule; +privacyValueDisallowChatParticipants#acae0690 chats:Vector = PrivacyRule; + +account.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules; + +accountDaysTTL#b8d0afdf days:int = AccountDaysTTL; + +documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; +documentAttributeAnimated#11b58939 = DocumentAttribute; +documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute; +documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute; +documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute; +documentAttributeFilename#15590068 file_name:string = DocumentAttribute; +documentAttributeHasStickers#9801d2f7 = DocumentAttribute; + +messages.stickersNotModified#f1749a22 = messages.Stickers; +messages.stickers#e4599bbd hash:int stickers:Vector = messages.Stickers; + +stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; + +messages.allStickersNotModified#e86602c3 = messages.AllStickers; +messages.allStickers#edfd405f hash:int sets:Vector = messages.AllStickers; + +messages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages; + +webPageEmpty#eb1477e8 id:long = WebPage; +webPagePending#c586da1c id:long date:int = WebPage; +webPage#e89c45b2 flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage; +webPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage; + +authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization; + +account.authorizations#1250abde authorizations:Vector = account.Authorizations; + +account.password#ad2641f8 flags:# has_recovery:flags.0?true has_secure_values:flags.1?true has_password:flags.2?true current_algo:flags.2?PasswordKdfAlgo srp_B:flags.2?bytes srp_id:flags.2?long hint:flags.3?string email_unconfirmed_pattern:flags.4?string new_algo:PasswordKdfAlgo new_secure_algo:SecurePasswordKdfAlgo secure_random:bytes = account.Password; + +account.passwordSettings#9a5c33e5 flags:# email:flags.0?string secure_settings:flags.1?SecureSecretSettings = account.PasswordSettings; + +account.passwordInputSettings#c23727c9 flags:# new_algo:flags.0?PasswordKdfAlgo new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string new_secure_settings:flags.2?SecureSecretSettings = account.PasswordInputSettings; + +auth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery; + +receivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage; + +chatInviteEmpty#69df3769 = ExportedChatInvite; +chatInviteExported#fc2e05bc link:string = ExportedChatInvite; + +chatInviteAlready#5a686d7c chat:Chat = ChatInvite; +chatInvite#dfc2f58e flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:Photo participants_count:int participants:flags.4?Vector = ChatInvite; +chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite; + +inputStickerSetEmpty#ffb62b95 = InputStickerSet; +inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet; +inputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet; +inputStickerSetAnimatedEmoji#28703c8 = InputStickerSet; +inputStickerSetDice#e67f520e emoticon:string = InputStickerSet; + +stickerSet#eeb46f27 flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true animated:flags.5?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumb:flags.4?PhotoSize thumb_dc_id:flags.4?int count:int hash:int = StickerSet; + +messages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet; + +botCommand#c27ac8c7 command:string description:string = BotCommand; + +botInfo#98e81d3a user_id:int description:string commands:Vector = BotInfo; + +keyboardButton#a2fa4880 text:string = KeyboardButton; +keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; +keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; +keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; +keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; +keyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton; +keyboardButtonGame#50f41ccf text:string = KeyboardButton; +keyboardButtonBuy#afd93fbb text:string = KeyboardButton; +keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton; +inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton; +keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; + +keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow; + +replyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup; +replyKeyboardForceReply#f4108aa0 flags:# single_use:flags.1?true selective:flags.2?true = ReplyMarkup; +replyKeyboardMarkup#3502758c flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector = ReplyMarkup; +replyInlineMarkup#48a30254 rows:Vector = ReplyMarkup; + +messageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity; +messageEntityMention#fa04579d offset:int length:int = MessageEntity; +messageEntityHashtag#6f635b0d offset:int length:int = MessageEntity; +messageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity; +messageEntityUrl#6ed02538 offset:int length:int = MessageEntity; +messageEntityEmail#64e475c2 offset:int length:int = MessageEntity; +messageEntityBold#bd610bc9 offset:int length:int = MessageEntity; +messageEntityItalic#826f8b60 offset:int length:int = MessageEntity; +messageEntityCode#28a20571 offset:int length:int = MessageEntity; +messageEntityPre#73924be0 offset:int length:int language:string = MessageEntity; +messageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity; +messageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity; +inputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity; +messageEntityPhone#9b69e34b offset:int length:int = MessageEntity; +messageEntityCashtag#4c4e743f offset:int length:int = MessageEntity; +messageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity; +messageEntityStrike#bf0693d4 offset:int length:int = MessageEntity; +messageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity; +messageEntityBankCard#761e6af4 offset:int length:int = MessageEntity; + +inputChannelEmpty#ee8c1e86 = InputChannel; +inputChannel#afeb712e channel_id:int access_hash:long = InputChannel; +inputChannelFromMessage#2a286531 peer:InputPeer msg_id:int channel_id:int = InputChannel; + +contacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector users:Vector = contacts.ResolvedPeer; + +messageRange#ae30253 min_id:int max_id:int = MessageRange; + +updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference; +updates.channelDifferenceTooLong#a4bcc6fe flags:# final:flags.0?true timeout:flags.1?int dialog:Dialog messages:Vector chats:Vector users:Vector = updates.ChannelDifference; +updates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector other_updates:Vector chats:Vector users:Vector = updates.ChannelDifference; + +channelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter; +channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector = ChannelMessagesFilter; + +channelParticipant#15ebac1d user_id:int date:int = ChannelParticipant; +channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant; +channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; +channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; +channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; +channelParticipantLeft#c3c6796b user_id:int = ChannelParticipant; + +channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; +channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter; +channelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter; +channelParticipantsBots#b0d1865b = ChannelParticipantsFilter; +channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter; +channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter; +channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter; +channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter; + +channels.channelParticipants#f56ee2a8 count:int participants:Vector users:Vector = channels.ChannelParticipants; +channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants; + +channels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector = channels.ChannelParticipant; + +help.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector min_age_confirm:flags.1?int = help.TermsOfService; + +messages.savedGifsNotModified#e8025ca2 = messages.SavedGifs; +messages.savedGifs#2e0709a5 hash:int gifs:Vector = messages.SavedGifs; + +inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; + +inputBotInlineResult#88bf9319 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?InputWebDocument content:flags.5?InputWebDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult; +inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult; + +botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; + +botInlineResult#11965f3a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?WebDocument content:flags.5?WebDocument send_message:BotInlineMessage = BotInlineResult; +botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult; + +messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector cache_time:int users:Vector = messages.BotResults; + +exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink; + +messageFwdHeader#5f777dce flags:# from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; + +auth.codeTypeSms#72a3158c = auth.CodeType; +auth.codeTypeCall#741cd3e3 = auth.CodeType; +auth.codeTypeFlashCall#226ccefb = auth.CodeType; + +auth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType; +auth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType; +auth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType; +auth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType; + +messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer; + +messages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData; + +inputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID; + +inlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM; + +messages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs; + +topPeer#edcdc05b peer:Peer rating:double = TopPeer; + +topPeerCategoryBotsPM#ab661b5b = TopPeerCategory; +topPeerCategoryBotsInline#148677e2 = TopPeerCategory; +topPeerCategoryCorrespondents#637b7ed = TopPeerCategory; +topPeerCategoryGroups#bd17a14a = TopPeerCategory; +topPeerCategoryChannels#161d9628 = TopPeerCategory; +topPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory; +topPeerCategoryForwardUsers#a8406ca9 = TopPeerCategory; +topPeerCategoryForwardChats#fbeec0f0 = TopPeerCategory; + +topPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector = TopPeerCategoryPeers; + +contacts.topPeersNotModified#de266ef5 = contacts.TopPeers; +contacts.topPeers#70b772a8 categories:Vector chats:Vector users:Vector = contacts.TopPeers; +contacts.topPeersDisabled#b52c939d = contacts.TopPeers; + +draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage; +draftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector date:int = DraftMessage; + +messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers; +messages.featuredStickers#b6abc341 hash:int count:int sets:Vector unread:Vector = messages.FeaturedStickers; + +messages.recentStickersNotModified#b17f890 = messages.RecentStickers; +messages.recentStickers#22f3afb3 hash:int packs:Vector stickers:Vector dates:Vector = messages.RecentStickers; + +messages.archivedStickers#4fcba9c8 count:int sets:Vector = messages.ArchivedStickers; + +messages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult; +messages.stickerSetInstallResultArchive#35e410a8 sets:Vector = messages.StickerSetInstallResult; + +stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered; +stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered; + +maskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords; + +inputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia; +inputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia; + +game#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game; + +inputGameID#32c3e77 id:long access_hash:long = InputGame; +inputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame; + +highScore#58fffcd0 pos:int user_id:int score:int = HighScore; + +messages.highScores#9a3bfd99 scores:Vector users:Vector = messages.HighScores; + +textEmpty#dc3d824f = RichText; +textPlain#744694e0 text:string = RichText; +textBold#6724abc4 text:RichText = RichText; +textItalic#d912a59c text:RichText = RichText; +textUnderline#c12622c4 text:RichText = RichText; +textStrike#9bf8bb95 text:RichText = RichText; +textFixed#6c3f19b9 text:RichText = RichText; +textUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText; +textEmail#de5a0dd6 text:RichText email:string = RichText; +textConcat#7e6260d7 texts:Vector = RichText; +textSubscript#ed6a8504 text:RichText = RichText; +textSuperscript#c7fb5e01 text:RichText = RichText; +textMarked#34b8621 text:RichText = RichText; +textPhone#1ccb966a text:RichText phone:string = RichText; +textImage#81ccf4f document_id:long w:int h:int = RichText; +textAnchor#35553762 text:RichText name:string = RichText; + +pageBlockUnsupported#13567e8a = PageBlock; +pageBlockTitle#70abc3fd text:RichText = PageBlock; +pageBlockSubtitle#8ffa9a1f text:RichText = PageBlock; +pageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock; +pageBlockHeader#bfd064ec text:RichText = PageBlock; +pageBlockSubheader#f12bb6e1 text:RichText = PageBlock; +pageBlockParagraph#467a0766 text:RichText = PageBlock; +pageBlockPreformatted#c070d93e text:RichText language:string = PageBlock; +pageBlockFooter#48870999 text:RichText = PageBlock; +pageBlockDivider#db20b188 = PageBlock; +pageBlockAnchor#ce0d37b0 name:string = PageBlock; +pageBlockList#e4e88011 items:Vector = PageBlock; +pageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock; +pageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock; +pageBlockPhoto#1759c560 flags:# photo_id:long caption:PageCaption url:flags.0?string webpage_id:flags.0?long = PageBlock; +pageBlockVideo#7c8fe7b6 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:PageCaption = PageBlock; +pageBlockCover#39f23300 cover:PageBlock = PageBlock; +pageBlockEmbed#a8718dc5 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:flags.5?int h:flags.5?int caption:PageCaption = PageBlock; +pageBlockEmbedPost#f259a80b url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector caption:PageCaption = PageBlock; +pageBlockCollage#65a0fa4d items:Vector caption:PageCaption = PageBlock; +pageBlockSlideshow#31f9590 items:Vector caption:PageCaption = PageBlock; +pageBlockChannel#ef1751b5 channel:Chat = PageBlock; +pageBlockAudio#804361ea audio_id:long caption:PageCaption = PageBlock; +pageBlockKicker#1e148390 text:RichText = PageBlock; +pageBlockTable#bf4dea82 flags:# bordered:flags.0?true striped:flags.1?true title:RichText rows:Vector = PageBlock; +pageBlockOrderedList#9a8ae1e1 items:Vector = PageBlock; +pageBlockDetails#76768bed flags:# open:flags.0?true blocks:Vector title:RichText = PageBlock; +pageBlockRelatedArticles#16115a96 title:RichText articles:Vector = PageBlock; +pageBlockMap#a44f3ef6 geo:GeoPoint zoom:int w:int h:int caption:PageCaption = PageBlock; + +phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason; +phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason; +phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason; +phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason; + +dataJSON#7d748d04 data:string = DataJSON; + +labeledPrice#cb296bf8 label:string amount:long = LabeledPrice; + +invoice#c30aa358 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector = Invoice; + +paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge; + +postAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress; + +paymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo; + +paymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials; + +webDocument#1c570ed1 url:string access_hash:long size:int mime_type:string attributes:Vector = WebDocument; +webDocumentNoProxy#f9c8bcc6 url:string size:int mime_type:string attributes:Vector = WebDocument; + +inputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector = InputWebDocument; + +inputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation; +inputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w:int h:int zoom:int scale:int = InputWebFileLocation; + +upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile; + +payments.paymentForm#3f56aea3 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; + +payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; + +payments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult; +payments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult; + +payments.paymentReceipt#500911e1 flags:# date:int bot_id:int invoice:Invoice provider_id:int info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt; + +payments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo; + +inputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials; +inputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials; +inputPaymentCredentialsAndroidPay#ca05d50e payment_token:DataJSON google_transaction_id:string = InputPaymentCredentials; + +account.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword; + +shippingOption#b6213cdf id:string title:string prices:Vector = ShippingOption; + +inputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem; + +inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall; + +phoneCallEmpty#5366c915 id:long = PhoneCall; +phoneCallWaiting#1b8f4ad1 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall; +phoneCallRequested#87eabb53 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCallAccepted#997c454a flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall; +phoneCall#8742ae7f flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int = PhoneCall; +phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall; + +phoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection; +phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection; + +phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector = PhoneCallProtocol; + +phone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector = phone.PhoneCall; + +upload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile; +upload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile; + +cdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey; + +cdnConfig#5725e40a public_keys:Vector = CdnConfig; + +langPackString#cad181f6 key:string value:string = LangPackString; +langPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString; +langPackStringDeleted#2979eeb2 key:string = LangPackString; + +langPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector = LangPackDifference; + +langPackLanguage#eeca5ce3 flags:# official:flags.0?true rtl:flags.2?true beta:flags.3?true name:string native_name:string lang_code:string base_lang_code:flags.1?string plural_code:string strings_count:int translated_count:int translations_url:string = LangPackLanguage; + +channelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction; +channelAdminLogEventActionChangePhoto#434bd2af prev_photo:Photo new_photo:Photo = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction; +channelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction; +channelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBannedRights new_banned_rights:ChatBannedRights = ChannelAdminLogEventAction; +channelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLinkedChat#a26f881b prev_value:int new_value:int = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction; +channelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction; + +channelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent; + +channels.adminLogResults#ed8af74d events:Vector chats:Vector users:Vector = channels.AdminLogResults; + +channelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true = ChannelAdminLogEventsFilter; + +popularContact#5ce14175 client_id:long importers:int = PopularContact; + +messages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers; +messages.favedStickers#f37f2f16 hash:int packs:Vector stickers:Vector = messages.FavedStickers; + +recentMeUrlUnknown#46e1d13d url:string = RecentMeUrl; +recentMeUrlUser#8dbc3336 url:string user_id:int = RecentMeUrl; +recentMeUrlChat#a01b22f9 url:string chat_id:int = RecentMeUrl; +recentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl; +recentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl; + +help.recentMeUrls#e0310d7 urls:Vector chats:Vector users:Vector = help.RecentMeUrls; + +inputSingleMedia#1cc6e91f flags:# media:InputMedia random_id:long message:string entities:flags.0?Vector = InputSingleMedia; + +webAuthorization#cac943f2 hash:long bot_id:int domain:string browser:string platform:string date_created:int date_active:int ip:string region:string = WebAuthorization; + +account.webAuthorizations#ed56c9fc authorizations:Vector users:Vector = account.WebAuthorizations; + +inputMessageID#a676a322 id:int = InputMessage; +inputMessageReplyTo#bad88395 id:int = InputMessage; +inputMessagePinned#86872538 = InputMessage; +inputMessageCallbackQuery#acfa1a7e id:int query_id:long = InputMessage; + +inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer; +inputDialogPeerFolder#64600527 folder_id:int = InputDialogPeer; + +dialogPeer#e56dbf05 peer:Peer = DialogPeer; +dialogPeerFolder#514519e2 folder_id:int = DialogPeer; + +messages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets; +messages.foundStickerSets#5108d648 hash:int sets:Vector = messages.FoundStickerSets; + +fileHash#6242c773 offset:int limit:int hash:bytes = FileHash; + +inputClientProxy#75588b3f address:string port:int = InputClientProxy; + +help.termsOfServiceUpdateEmpty#e3309f7f expires:int = help.TermsOfServiceUpdate; +help.termsOfServiceUpdate#28ecf961 expires:int terms_of_service:help.TermsOfService = help.TermsOfServiceUpdate; + +inputSecureFileUploaded#3334b0f0 id:long parts:int md5_checksum:string file_hash:bytes secret:bytes = InputSecureFile; +inputSecureFile#5367e5be id:long access_hash:long = InputSecureFile; + +secureFileEmpty#64199744 = SecureFile; +secureFile#e0277a62 id:long access_hash:long size:int dc_id:int date:int file_hash:bytes secret:bytes = SecureFile; + +secureData#8aeabec3 data:bytes data_hash:bytes secret:bytes = SecureData; + +securePlainPhone#7d6099dd phone:string = SecurePlainData; +securePlainEmail#21ec5a5f email:string = SecurePlainData; + +secureValueTypePersonalDetails#9d2a81e3 = SecureValueType; +secureValueTypePassport#3dac6a00 = SecureValueType; +secureValueTypeDriverLicense#6e425c4 = SecureValueType; +secureValueTypeIdentityCard#a0d0744b = SecureValueType; +secureValueTypeInternalPassport#99a48f23 = SecureValueType; +secureValueTypeAddress#cbe31e26 = SecureValueType; +secureValueTypeUtilityBill#fc36954e = SecureValueType; +secureValueTypeBankStatement#89137c0d = SecureValueType; +secureValueTypeRentalAgreement#8b883488 = SecureValueType; +secureValueTypePassportRegistration#99e3806a = SecureValueType; +secureValueTypeTemporaryRegistration#ea02ec33 = SecureValueType; +secureValueTypePhone#b320aadb = SecureValueType; +secureValueTypeEmail#8e3ca7ee = SecureValueType; + +secureValue#187fa0ca flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?SecureFile reverse_side:flags.2?SecureFile selfie:flags.3?SecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData hash:bytes = SecureValue; + +inputSecureValue#db21d0a7 flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?InputSecureFile reverse_side:flags.2?InputSecureFile selfie:flags.3?InputSecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData = InputSecureValue; + +secureValueHash#ed1ecdb0 type:SecureValueType hash:bytes = SecureValueHash; + +secureValueErrorData#e8a40bd9 type:SecureValueType data_hash:bytes field:string text:string = SecureValueError; +secureValueErrorFrontSide#be3dfa type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorReverseSide#868a2aa5 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorSelfie#e537ced6 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFile#7a700873 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorFiles#666220e9 type:SecureValueType file_hash:Vector text:string = SecureValueError; +secureValueError#869d758f type:SecureValueType hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFile#a1144770 type:SecureValueType file_hash:bytes text:string = SecureValueError; +secureValueErrorTranslationFiles#34636dd8 type:SecureValueType file_hash:Vector text:string = SecureValueError; + +secureCredentialsEncrypted#33f0ea47 data:bytes hash:bytes secret:bytes = SecureCredentialsEncrypted; + +account.authorizationForm#ad2e1cd8 flags:# required_types:Vector values:Vector errors:Vector users:Vector privacy_policy_url:flags.0?string = account.AuthorizationForm; + +account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; + +help.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo; +help.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo; + +savedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact; + +account.takeout#4dba4501 id:long = account.Takeout; + +passwordKdfAlgoUnknown#d45ab096 = PasswordKdfAlgo; +passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow#3a912d4a salt1:bytes salt2:bytes g:int p:bytes = PasswordKdfAlgo; + +securePasswordKdfAlgoUnknown#4a8537 = SecurePasswordKdfAlgo; +securePasswordKdfAlgoPBKDF2HMACSHA512iter100000#bbf2dda0 salt:bytes = SecurePasswordKdfAlgo; +securePasswordKdfAlgoSHA512#86471d92 salt:bytes = SecurePasswordKdfAlgo; + +secureSecretSettings#1527bcac secure_algo:SecurePasswordKdfAlgo secure_secret:bytes secure_secret_id:long = SecureSecretSettings; + +inputCheckPasswordEmpty#9880f658 = InputCheckPasswordSRP; +inputCheckPasswordSRP#d27ff082 srp_id:long A:bytes M1:bytes = InputCheckPasswordSRP; + +secureRequiredType#829d99da flags:# native_names:flags.0?true selfie_required:flags.1?true translation_required:flags.2?true type:SecureValueType = SecureRequiredType; +secureRequiredTypeOneOf#27477b4 types:Vector = SecureRequiredType; + +help.passportConfigNotModified#bfb9f457 = help.PassportConfig; +help.passportConfig#a098d6af hash:int countries_langs:DataJSON = help.PassportConfig; + +inputAppEvent#1d1b1245 time:double type:string peer:long data:JSONValue = InputAppEvent; + +jsonObjectValue#c0de1bd9 key:string value:JSONValue = JSONObjectValue; + +jsonNull#3f6d7b68 = JSONValue; +jsonBool#c7345e6a value:Bool = JSONValue; +jsonNumber#2be0dfa4 value:double = JSONValue; +jsonString#b71e767a value:string = JSONValue; +jsonArray#f7444763 value:Vector = JSONValue; +jsonObject#99c1d49d value:Vector = JSONValue; + +pageTableCell#34566b6a flags:# header:flags.0?true align_center:flags.3?true align_right:flags.4?true valign_middle:flags.5?true valign_bottom:flags.6?true text:flags.7?RichText colspan:flags.1?int rowspan:flags.2?int = PageTableCell; + +pageTableRow#e0c0c5e5 cells:Vector = PageTableRow; + +pageCaption#6f747657 text:RichText credit:RichText = PageCaption; + +pageListItemText#b92fb6cd text:RichText = PageListItem; +pageListItemBlocks#25e073fc blocks:Vector = PageListItem; + +pageListOrderedItemText#5e068047 num:string text:RichText = PageListOrderedItem; +pageListOrderedItemBlocks#98dd8936 num:string blocks:Vector = PageListOrderedItem; + +pageRelatedArticle#b390dc08 flags:# url:string webpage_id:long title:flags.0?string description:flags.1?string photo_id:flags.2?long author:flags.3?string published_date:flags.4?int = PageRelatedArticle; + +page#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:string blocks:Vector photos:Vector documents:Vector views:flags.3?int = Page; + +help.supportName#8c05f1c9 name:string = help.SupportName; + +help.userInfoEmpty#f3ae2eed = help.UserInfo; +help.userInfo#1eb3758 message:string entities:Vector author:string date:int = help.UserInfo; + +pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer; + +poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector close_period:flags.4?int close_date:flags.5?int = Poll; + +pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters; + +pollResults#badcc1a3 flags:# min:flags.0?true results:flags.1?Vector total_voters:flags.2?int recent_voters:flags.3?Vector solution:flags.4?string solution_entities:flags.4?Vector = PollResults; + +chatOnlines#f041e250 onlines:int = ChatOnlines; + +statsURL#47a971e0 url:string = StatsURL; + +chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true = ChatAdminRights; + +chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights; + +inputWallPaper#e630b979 id:long access_hash:long = InputWallPaper; +inputWallPaperSlug#72091c80 slug:string = InputWallPaper; +inputWallPaperNoFile#8427bbac = InputWallPaper; + +account.wallPapersNotModified#1c199183 = account.WallPapers; +account.wallPapers#702b65a9 hash:int wallpapers:Vector = account.WallPapers; + +codeSettings#debebe83 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true = CodeSettings; + +wallPaperSettings#5086cf8 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int intensity:flags.3?int rotation:flags.4?int = WallPaperSettings; + +autoDownloadSettings#e04232f3 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true photo_size_max:int video_size_max:int file_size_max:int video_upload_maxbitrate:int = AutoDownloadSettings; + +account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; + +emojiKeyword#d5b3b9f9 keyword:string emoticons:Vector = EmojiKeyword; +emojiKeywordDeleted#236df622 keyword:string emoticons:Vector = EmojiKeyword; + +emojiKeywordsDifference#5cc761bd lang_code:string from_version:int version:int keywords:Vector = EmojiKeywordsDifference; + +emojiURL#a575739d url:string = EmojiURL; + +emojiLanguage#b3fb5361 lang_code:string = EmojiLanguage; + +fileLocationToBeDeprecated#bc7fc6cd volume_id:long local_id:int = FileLocation; + +folder#ff544e65 flags:# autofill_new_broadcasts:flags.0?true autofill_public_groups:flags.1?true autofill_new_correspondents:flags.2?true id:int title:string photo:flags.3?ChatPhoto = Folder; + +inputFolderPeer#fbd2c296 peer:InputPeer folder_id:int = InputFolderPeer; + +folderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer; + +messages.searchCounter#e844ebff flags:# inexact:flags.1?true filter:MessagesFilter count:int = messages.SearchCounter; + +urlAuthResultRequest#92d33a0e flags:# request_write_access:flags.0?true bot:User domain:string = UrlAuthResult; +urlAuthResultAccepted#8f8c0e4e url:string = UrlAuthResult; +urlAuthResultDefault#a9d6db1f = UrlAuthResult; + +channelLocationEmpty#bfb5ad8b = ChannelLocation; +channelLocation#209b82db geo_point:GeoPoint address:string = ChannelLocation; + +peerLocated#ca461b5d peer:Peer expires:int distance:int = PeerLocated; +peerSelfLocated#f8ec284b expires:int = PeerLocated; + +restrictionReason#d072acb4 platform:string reason:string text:string = RestrictionReason; + +inputTheme#3c5693e9 id:long access_hash:long = InputTheme; +inputThemeSlug#f5890df1 slug:string = InputTheme; + +theme#28f1114 flags:# creator:flags.0?true default:flags.1?true id:long access_hash:long slug:string title:string document:flags.2?Document settings:flags.3?ThemeSettings installs_count:int = Theme; + +account.themesNotModified#f41eb622 = account.Themes; +account.themes#7f676421 hash:int themes:Vector = account.Themes; + +auth.loginToken#629f1980 expires:int token:bytes = auth.LoginToken; +auth.loginTokenMigrateTo#68e9916 dc_id:int token:bytes = auth.LoginToken; +auth.loginTokenSuccess#390d5c5e authorization:auth.Authorization = auth.LoginToken; + +account.contentSettings#57e28221 flags:# sensitive_enabled:flags.0?true sensitive_can_change:flags.1?true = account.ContentSettings; + +messages.inactiveChats#a927fec5 dates:Vector chats:Vector users:Vector = messages.InactiveChats; + +baseThemeClassic#c3a12462 = BaseTheme; +baseThemeDay#fbd81688 = BaseTheme; +baseThemeNight#b7b31ea8 = BaseTheme; +baseThemeTinted#6d5f77ee = BaseTheme; +baseThemeArctic#5b11125a = BaseTheme; + +inputThemeSettings#bd507cd1 flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?InputWallPaper wallpaper_settings:flags.1?WallPaperSettings = InputThemeSettings; + +themeSettings#9c14984a flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?WallPaper = ThemeSettings; + +webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; + +messageUserVote#a28e5559 user_id:int option:bytes date:int = MessageUserVote; +messageUserVoteInputOption#36377430 user_id:int date:int = MessageUserVote; +messageUserVoteMultiple#e8fe0de user_id:int options:Vector date:int = MessageUserVote; + +messages.votesList#823f649 flags:# count:int votes:Vector users:Vector next_offset:flags.0?string = messages.VotesList; + +bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; + +payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; + +dialogFilter#7438f7e8 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter; + +dialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested; + +statsDateRangeDays#b637edaf min_date:int max_date:int = StatsDateRangeDays; + +statsAbsValueAndPrev#cb43acde current:double previous:double = StatsAbsValueAndPrev; + +statsPercentValue#cbce2fe0 part:double total:double = StatsPercentValue; + +statsGraphAsync#4a27eb2d token:string = StatsGraph; +statsGraphError#bedc9822 error:string = StatsGraph; +statsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph; + +messageInteractionCounters#ad4fc9bd msg_id:int views:int forwards:int = MessageInteractionCounters; + +stats.broadcastStats#bdf78394 period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph recent_message_interactions:Vector = stats.BroadcastStats; + +help.promoDataEmpty#98f6ac75 expires:int = help.PromoData; +help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector psa_type:flags.1?string psa_message:flags.2?string = help.PromoData; + +videoSize#e831c556 flags:# type:string location:FileLocation w:int h:int size:int video_start_ts:flags.0?double = VideoSize; + +statsGroupTopPoster#18f3d0f7 user_id:int messages:int avg_chars:int = StatsGroupTopPoster; + +statsGroupTopAdmin#6014f412 user_id:int deleted:int kicked:int banned:int = StatsGroupTopAdmin; + +statsGroupTopInviter#31962a4c user_id:int invitations:int = StatsGroupTopInviter; + +stats.megagroupStats#ef7ff916 period:StatsDateRangeDays members:StatsAbsValueAndPrev messages:StatsAbsValueAndPrev viewers:StatsAbsValueAndPrev posters:StatsAbsValueAndPrev growth_graph:StatsGraph members_graph:StatsGraph new_members_by_source_graph:StatsGraph languages_graph:StatsGraph messages_graph:StatsGraph actions_graph:StatsGraph top_hours_graph:StatsGraph weekdays_graph:StatsGraph top_posters:Vector top_admins:Vector top_inviters:Vector users:Vector = stats.MegagroupStats; + +globalPrivacySettings#bea2f424 flags:# archive_and_mute_new_noncontact_peers:flags.0?Bool = GlobalPrivacySettings; + +help.countryCode#4203c5ef flags:# country_code:string prefixes:flags.0?Vector patterns:flags.1?Vector = help.CountryCode; + +help.country#c3878e23 flags:# hidden:flags.0?true iso2:string default_name:string name:flags.1?string country_codes:Vector = help.Country; + +help.countriesListNotModified#93cc1f32 = help.CountriesList; +help.countriesList#87d0759e countries:Vector hash:int = help.CountriesList; + +messageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:flags.2?MessageReplies = MessageViews; + +messages.messageViews#b6c4f543 views:Vector chats:Vector users:Vector = messages.MessageViews; + +messages.discussionMessage#f5dd8f9d flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector users:Vector = messages.DiscussionMessage; + +messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; + +messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int max_id:flags.2?int read_max_id:flags.3?int = MessageReplies; + +peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; + +stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats; + +---functions--- + +invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; +invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector query:!X = X; +initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; +invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; +invokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X; +invokeWithMessagesRange#365275f2 {X:Type} range:MessageRange query:!X = X; +invokeWithTakeout#aca9fd2e {X:Type} takeout_id:long query:!X = X; + +auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; +auth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization; +auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; +auth.logOut#5717da40 = Bool; +auth.resetAuthorizations#9fab0d1a = Bool; +auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization; +auth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization; +auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool; +auth.importBotAuthorization#67a3ff2c flags:int api_id:int api_hash:string bot_auth_token:string = auth.Authorization; +auth.checkPassword#d18b4d16 password:InputCheckPasswordSRP = auth.Authorization; +auth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery; +auth.recoverPassword#4ea56e92 code:string = auth.Authorization; +auth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode; +auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool; +auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector = Bool; +auth.exportLoginToken#b1b41517 api_id:int api_hash:string except_ids:Vector = auth.LoginToken; +auth.importLoginToken#95ac5ce4 token:bytes = auth.LoginToken; +auth.acceptLoginToken#e894ad4d token:bytes = Authorization; + +account.registerDevice#68976c6f flags:# no_muted:flags.0?true token_type:int token:string app_sandbox:Bool secret:bytes other_uids:Vector = Bool; +account.unregisterDevice#3076c4bf token_type:int token:string other_uids:Vector = Bool; +account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool; +account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings; +account.resetNotifySettings#db7e1747 = Bool; +account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User; +account.updateStatus#6628562c offline:Bool = Bool; +account.getWallPapers#aabb1763 hash:int = account.WallPapers; +account.reportPeer#ae189d5f peer:InputPeer reason:ReportReason = Bool; +account.checkUsername#2714d86c username:string = Bool; +account.updateUsername#3e0bdd7c username:string = User; +account.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules; +account.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector = account.PrivacyRules; +account.deleteAccount#418d4e0b reason:string = Bool; +account.getAccountTTL#8fc711d = AccountDaysTTL; +account.setAccountTTL#2442485e ttl:AccountDaysTTL = Bool; +account.sendChangePhoneCode#82574ae5 phone_number:string settings:CodeSettings = auth.SentCode; +account.changePhone#70c32edb phone_number:string phone_code_hash:string phone_code:string = User; +account.updateDeviceLocked#38df3532 period:int = Bool; +account.getAuthorizations#e320c158 = account.Authorizations; +account.resetAuthorization#df77f3bc hash:long = Bool; +account.getPassword#548a30f5 = account.Password; +account.getPasswordSettings#9cd4eaf9 password:InputCheckPasswordSRP = account.PasswordSettings; +account.updatePasswordSettings#a59b102f password:InputCheckPasswordSRP new_settings:account.PasswordInputSettings = Bool; +account.sendConfirmPhoneCode#1b3faa88 hash:string settings:CodeSettings = auth.SentCode; +account.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool; +account.getTmpPassword#449e0b51 password:InputCheckPasswordSRP period:int = account.TmpPassword; +account.getWebAuthorizations#182e6d6f = account.WebAuthorizations; +account.resetWebAuthorization#2d01b9ef hash:long = Bool; +account.resetWebAuthorizations#682d2594 = Bool; +account.getAllSecureValues#b288bc7d = Vector; +account.getSecureValue#73665bc2 types:Vector = Vector; +account.saveSecureValue#899fe31d value:InputSecureValue secure_secret_id:long = SecureValue; +account.deleteSecureValue#b880bc4b types:Vector = Bool; +account.getAuthorizationForm#b86ba8e1 bot_id:int scope:string public_key:string = account.AuthorizationForm; +account.acceptAuthorization#e7027c94 bot_id:int scope:string public_key:string value_hashes:Vector credentials:SecureCredentialsEncrypted = Bool; +account.sendVerifyPhoneCode#a5a356f9 phone_number:string settings:CodeSettings = auth.SentCode; +account.verifyPhone#4dd3a7f6 phone_number:string phone_code_hash:string phone_code:string = Bool; +account.sendVerifyEmailCode#7011509f email:string = account.SentEmailCode; +account.verifyEmail#ecba39db email:string code:string = Bool; +account.initTakeoutSession#f05b4804 flags:# contacts:flags.0?true message_users:flags.1?true message_chats:flags.2?true message_megagroups:flags.3?true message_channels:flags.4?true files:flags.5?true file_max_size:flags.5?int = account.Takeout; +account.finishTakeoutSession#1d2652ee flags:# success:flags.0?true = Bool; +account.confirmPasswordEmail#8fdf1920 code:string = Bool; +account.resendPasswordEmail#7a7f2a15 = Bool; +account.cancelPasswordEmail#c1cbd5b6 = Bool; +account.getContactSignUpNotification#9f07c728 = Bool; +account.setContactSignUpNotification#cff43f61 silent:Bool = Bool; +account.getNotifyExceptions#53577479 flags:# compare_sound:flags.1?true peer:flags.0?InputNotifyPeer = Updates; +account.getWallPaper#fc8ddbea wallpaper:InputWallPaper = WallPaper; +account.uploadWallPaper#dd853661 file:InputFile mime_type:string settings:WallPaperSettings = WallPaper; +account.saveWallPaper#6c5a5b37 wallpaper:InputWallPaper unsave:Bool settings:WallPaperSettings = Bool; +account.installWallPaper#feed5769 wallpaper:InputWallPaper settings:WallPaperSettings = Bool; +account.resetWallPapers#bb3b9804 = Bool; +account.getAutoDownloadSettings#56da0b3f = account.AutoDownloadSettings; +account.saveAutoDownloadSettings#76f36233 flags:# low:flags.0?true high:flags.1?true settings:AutoDownloadSettings = Bool; +account.uploadTheme#1c3db333 flags:# file:InputFile thumb:flags.0?InputFile file_name:string mime_type:string = Document; +account.createTheme#8432c21f flags:# slug:string title:string document:flags.2?InputDocument settings:flags.3?InputThemeSettings = Theme; +account.updateTheme#5cb367d5 flags:# format:string theme:InputTheme slug:flags.0?string title:flags.1?string document:flags.2?InputDocument settings:flags.3?InputThemeSettings = Theme; +account.saveTheme#f257106c theme:InputTheme unsave:Bool = Bool; +account.installTheme#7ae43737 flags:# dark:flags.0?true format:flags.1?string theme:flags.1?InputTheme = Bool; +account.getTheme#8d9d742b format:string theme:InputTheme document_id:long = Theme; +account.getThemes#285946f8 format:string hash:int = account.Themes; +account.setContentSettings#b574b16b flags:# sensitive_enabled:flags.0?true = Bool; +account.getContentSettings#8b9b4dae = account.ContentSettings; +account.getMultiWallPapers#65ad71dc wallpapers:Vector = Vector; +account.getGlobalPrivacySettings#eb2b4cf6 = GlobalPrivacySettings; +account.setGlobalPrivacySettings#1edaaac2 settings:GlobalPrivacySettings = GlobalPrivacySettings; + +users.getUsers#d91a548 id:Vector = Vector; +users.getFullUser#ca30a5b1 id:InputUser = UserFull; +users.setSecureValueErrors#90c894b5 id:InputUser errors:Vector = Bool; + +contacts.getContactIDs#2caa4a42 hash:int = Vector; +contacts.getStatuses#c4a353ee = Vector; +contacts.getContacts#c023849f hash:int = contacts.Contacts; +contacts.importContacts#2c800be5 contacts:Vector = contacts.ImportedContacts; +contacts.deleteContacts#96a0e00 id:Vector = Updates; +contacts.deleteByPhones#1013fd9e phones:Vector = Bool; +contacts.block#68cc1411 id:InputPeer = Bool; +contacts.unblock#bea65d50 id:InputPeer = Bool; +contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked; +contacts.search#11f812d8 q:string limit:int = contacts.Found; +contacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer; +contacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers; +contacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = Bool; +contacts.resetSaved#879537f1 = Bool; +contacts.getSaved#82f1e39f = Vector; +contacts.toggleTopPeers#8514bdda enabled:Bool = Bool; +contacts.addContact#e8f463d0 flags:# add_phone_privacy_exception:flags.0?true id:InputUser first_name:string last_name:string phone:string = Updates; +contacts.acceptContact#f831a20f id:InputUser = Updates; +contacts.getLocated#d348bc44 flags:# background:flags.1?true geo_point:InputGeoPoint self_expires:flags.0?int = Updates; +contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_history:flags.1?true report_spam:flags.2?true msg_id:int = Updates; + +messages.getMessages#63c66506 id:Vector = messages.Messages; +messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; +messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; +messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory; +messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; +messages.receivedMessages#5a954c0 max_id:int = Vector; +messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; +messages.sendMessage#520c3870 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; +messages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates; +messages.reportSpam#cf1592db peer:InputPeer = Bool; +messages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings; +messages.report#bd82b658 peer:InputPeer id:Vector reason:ReportReason = Bool; +messages.getChats#3c6aa187 id:Vector = messages.Chats; +messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull; +messages.editChatTitle#dc452855 chat_id:int title:string = Updates; +messages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates; +messages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates; +messages.deleteChatUser#e0611f16 chat_id:int user_id:InputUser = Updates; +messages.createChat#9cb126e users:Vector title:string = Updates; +messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig; +messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat; +messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat; +messages.discardEncryption#edd923c5 chat_id:int = Bool; +messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool; +messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool; +messages.sendEncrypted#44fa7a15 flags:# silent:flags.0?true peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage; +messages.sendEncryptedFile#5559481d flags:# silent:flags.0?true peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage; +messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage; +messages.receivedQueue#55a5bb66 max_qts:int = Vector; +messages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool; +messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages; +messages.getStickers#43d4f2c emoticon:string hash:int = messages.Stickers; +messages.getAllStickers#1c9618b1 hash:int = messages.AllStickers; +messages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia; +messages.exportChatInvite#df7534c peer:InputPeer = ExportedChatInvite; +messages.checkChatInvite#3eadb1bb hash:string = ChatInvite; +messages.importChatInvite#6c50051c hash:string = Updates; +messages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet; +messages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult; +messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; +messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates; +messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; +messages.editChatAdmin#a9e69f2e chat_id:int user_id:InputUser is_admin:Bool = Bool; +messages.migrateChat#15a3b8e3 chat_id:int = Updates; +messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.reorderStickerSets#78337739 flags:# masks:flags.0?true order:Vector = Bool; +messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document; +messages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs; +messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool; +messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults; +messages.setInlineBotResults#eb5ea206 flags:# gallery:flags.0?true private:flags.1?true query_id:long results:Vector cache_time:int next_offset:flags.2?string switch_pm:flags.3?InlineBotSwitchPM = Bool; +messages.sendInlineBotResult#220815b0 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true hide_via:flags.11?true peer:InputPeer reply_to_msg_id:flags.0?int random_id:long query_id:long id:string schedule_date:flags.10?int = Updates; +messages.getMessageEditData#fda68d36 peer:InputPeer id:int = messages.MessageEditData; +messages.editMessage#48f71778 flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int = Updates; +messages.editInlineBotMessage#83557dba flags:# no_webpage:flags.1?true id:InputBotInlineMessageID message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector = Bool; +messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer; +messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool; +messages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs; +messages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector = Bool; +messages.getAllDrafts#6a3f8d65 = Updates; +messages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers; +messages.readFeaturedStickers#5b118126 id:Vector = Bool; +messages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers; +messages.saveRecentSticker#392718f8 flags:# attached:flags.0?true id:InputDocument unsave:Bool = Bool; +messages.clearRecentStickers#8999602d flags:# attached:flags.0?true = Bool; +messages.getArchivedStickers#57f17692 flags:# masks:flags.0?true offset_id:long limit:int = messages.ArchivedStickers; +messages.getMaskStickers#65b8c79f hash:int = messages.AllStickers; +messages.getAttachedStickers#cc5b67cc media:InputStickeredMedia = Vector; +messages.setGameScore#8ef8ecc0 flags:# edit_message:flags.0?true force:flags.1?true peer:InputPeer id:int user_id:InputUser score:int = Updates; +messages.setInlineGameScore#15ad9f64 flags:# edit_message:flags.0?true force:flags.1?true id:InputBotInlineMessageID user_id:InputUser score:int = Bool; +messages.getGameHighScores#e822649d peer:InputPeer id:int user_id:InputUser = messages.HighScores; +messages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:InputUser = messages.HighScores; +messages.getCommonChats#d0a48c4 user_id:InputUser max_id:int limit:int = messages.Chats; +messages.getAllChats#eba80ff0 except_ids:Vector = messages.Chats; +messages.getWebPage#32ca8f91 url:string hash:int = WebPage; +messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool; +messages.reorderPinnedDialogs#3b1adf37 flags:# force:flags.0?true folder_id:int order:Vector = Bool; +messages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs; +messages.setBotShippingResults#e5f672fa flags:# query_id:long error:flags.0?string shipping_options:flags.1?Vector = Bool; +messages.setBotPrecheckoutResults#9c2dd95 flags:# success:flags.1?true query_id:long error:flags.0?string = Bool; +messages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia; +messages.sendScreenshotNotification#c97df020 peer:InputPeer reply_to_msg_id:int random_id:long = Updates; +messages.getFavedStickers#21ce0b0e hash:int = messages.FavedStickers; +messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool; +messages.getUnreadMentions#46578472 peer:InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; +messages.readMentions#f0189d3 peer:InputPeer = messages.AffectedHistory; +messages.getRecentLocations#bbc45b09 peer:InputPeer limit:int hash:int = messages.Messages; +messages.sendMultiMedia#cc0110cb flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int = Updates; +messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile; +messages.searchStickerSets#c2b7d08b flags:# exclude_featured:flags.0?true q:string hash:int = messages.FoundStickerSets; +messages.getSplitRanges#1cff7e08 = Vector; +messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool; +messages.getDialogUnreadMarks#22e24e22 = Vector; +messages.clearAllDrafts#7e58ee9c = Bool; +messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; +messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates; +messages.getPollResults#73bb643b peer:InputPeer msg_id:int = Updates; +messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines; +messages.getStatsURL#812c2ae6 flags:# dark:flags.0?true peer:InputPeer params:string = StatsURL; +messages.editChatAbout#def60797 peer:InputPeer about:string = Bool; +messages.editChatDefaultBannedRights#a5866b41 peer:InputPeer banned_rights:ChatBannedRights = Updates; +messages.getEmojiKeywords#35a0e062 lang_code:string = EmojiKeywordsDifference; +messages.getEmojiKeywordsDifference#1508b6af lang_code:string from_version:int = EmojiKeywordsDifference; +messages.getEmojiKeywordsLanguages#4e9963b2 lang_codes:Vector = Vector; +messages.getEmojiURL#d5b10c26 lang_code:string = EmojiURL; +messages.getSearchCounters#732eef00 peer:InputPeer filters:Vector = Vector; +messages.requestUrlAuth#e33f5613 peer:InputPeer msg_id:int button_id:int = UrlAuthResult; +messages.acceptUrlAuth#f729ea98 flags:# write_allowed:flags.0?true peer:InputPeer msg_id:int button_id:int = UrlAuthResult; +messages.hidePeerSettingsBar#4facb138 peer:InputPeer = Bool; +messages.getScheduledHistory#e2c2685b peer:InputPeer hash:int = messages.Messages; +messages.getScheduledMessages#bdbb0464 peer:InputPeer id:Vector = messages.Messages; +messages.sendScheduledMessages#bd38850a peer:InputPeer id:Vector = Updates; +messages.deleteScheduledMessages#59ae2b16 peer:InputPeer id:Vector = Updates; +messages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?bytes offset:flags.1?string limit:int = messages.VotesList; +messages.toggleStickerSets#b5052fea flags:# uninstall:flags.0?true archive:flags.1?true unarchive:flags.2?true stickersets:Vector = Bool; +messages.getDialogFilters#f19ed96d = Vector; +messages.getSuggestedDialogFilters#a29cd42c = Vector; +messages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool; +messages.updateDialogFiltersOrder#c563c1e4 order:Vector = Bool; +messages.getOldFeaturedStickers#5fe7025b offset:int limit:int hash:int = messages.FeaturedStickers; +messages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; +messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; +messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory; + +updates.getState#edd4882a = updates.State; +updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; +updates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference; + +photos.updateProfilePhoto#72d4742c id:InputPhoto = photos.Photo; +photos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo; +photos.deletePhotos#87cf7f2f id:Vector = Vector; +photos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos; + +upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool; +upload.getFile#b15a9afc flags:# precise:flags.0?true cdn_supported:flags.1?true location:InputFileLocation offset:int limit:int = upload.File; +upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool; +upload.getWebFile#24e6818d location:InputWebFileLocation offset:int limit:int = upload.WebFile; +upload.getCdnFile#2000bcc3 file_token:bytes offset:int limit:int = upload.CdnFile; +upload.reuploadCdnFile#9b2754a8 file_token:bytes request_token:bytes = Vector; +upload.getCdnFileHashes#4da54231 file_token:bytes offset:int = Vector; +upload.getFileHashes#c7025931 location:InputFileLocation offset:int = Vector; + +help.getConfig#c4f9186b = Config; +help.getNearestDc#1fb33026 = NearestDc; +help.getAppUpdate#522d5a7d source:string = help.AppUpdate; +help.getInviteText#4d392343 = help.InviteText; +help.getSupport#9cdf08cd = help.Support; +help.getAppChangelog#9010ef6f prev_app_version:string = Updates; +help.setBotUpdatesStatus#ec22cfcd pending_updates_count:int message:string = Bool; +help.getCdnConfig#52029342 = CdnConfig; +help.getRecentMeUrls#3dc0f114 referer:string = help.RecentMeUrls; +help.getTermsOfServiceUpdate#2ca51fd1 = help.TermsOfServiceUpdate; +help.acceptTermsOfService#ee72f79a id:DataJSON = Bool; +help.getDeepLinkInfo#3fedc75f path:string = help.DeepLinkInfo; +help.getAppConfig#98914110 = JSONValue; +help.saveAppLog#6f02f748 events:Vector = Bool; +help.getPassportConfig#c661ad08 hash:int = help.PassportConfig; +help.getSupportName#d360e72c = help.SupportName; +help.getUserInfo#38a08d3 user_id:InputUser = help.UserInfo; +help.editUserInfo#66b91b70 user_id:InputUser message:string entities:Vector = help.UserInfo; +help.getPromoData#c0977421 = help.PromoData; +help.hidePromoData#1e251c95 peer:InputPeer = Bool; +help.dismissSuggestion#77fa99f suggestion:string = Bool; +help.getCountriesList#735787a8 lang_code:string hash:int = help.CountriesList; + +channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool; +channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages; +channels.deleteUserHistory#d10dd71b channel:InputChannel user_id:InputUser = messages.AffectedHistory; +channels.reportSpam#fe087810 channel:InputChannel user_id:InputUser id:Vector = Bool; +channels.getMessages#ad8c9a23 channel:InputChannel id:Vector = messages.Messages; +channels.getParticipants#123e05e9 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:int = channels.ChannelParticipants; +channels.getParticipant#546dd7a6 channel:InputChannel user_id:InputUser = channels.ChannelParticipant; +channels.getChannels#a7f6bbb id:Vector = messages.Chats; +channels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull; +channels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates; +channels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates; +channels.editTitle#566decd0 channel:InputChannel title:string = Updates; +channels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates; +channels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool; +channels.updateUsername#3514b3de channel:InputChannel username:string = Bool; +channels.joinChannel#24b524c5 channel:InputChannel = Updates; +channels.leaveChannel#f836aa95 channel:InputChannel = Updates; +channels.inviteToChannel#199f3a6c channel:InputChannel users:Vector = Updates; +channels.deleteChannel#c0111fe3 channel:InputChannel = Updates; +channels.exportMessageLink#e63fadeb flags:# grouped:flags.0?true thread:flags.1?true channel:InputChannel id:int = ExportedMessageLink; +channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates; +channels.getAdminedPublicChannels#f8b036af flags:# by_location:flags.0?true check_limit:flags.1?true = messages.Chats; +channels.editBanned#72796912 channel:InputChannel user_id:InputUser banned_rights:ChatBannedRights = Updates; +channels.getAdminLog#33ddf480 flags:# channel:InputChannel q:string events_filter:flags.0?ChannelAdminLogEventsFilter admins:flags.1?Vector max_id:long min_id:long limit:int = channels.AdminLogResults; +channels.setStickers#ea8ca4f9 channel:InputChannel stickerset:InputStickerSet = Bool; +channels.readMessageContents#eab5dc38 channel:InputChannel id:Vector = Bool; +channels.deleteHistory#af369d42 channel:InputChannel max_id:int = Bool; +channels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates; +channels.getLeftChannels#8341ecc0 offset:int = messages.Chats; +channels.getGroupsForDiscussion#f5dad378 = messages.Chats; +channels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool; +channels.editCreator#8f38cd1f channel:InputChannel user_id:InputUser password:InputCheckPasswordSRP = Updates; +channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint address:string = Bool; +channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates; +channels.getInactiveChannels#11e831ee = messages.InactiveChats; + +bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON; +bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool; +bots.setBotCommands#805d46f6 commands:Vector = Bool; + +payments.getPaymentForm#99f09745 msg_id:int = payments.PaymentForm; +payments.getPaymentReceipt#a092a980 msg_id:int = payments.PaymentReceipt; +payments.validateRequestedInfo#770a8e74 flags:# save:flags.0?true msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo; +payments.sendPaymentForm#2b8879b3 flags:# msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials = payments.PaymentResult; +payments.getSavedInfo#227d824b = payments.SavedInfo; +payments.clearSavedInfo#d83d70c1 flags:# credentials:flags.0?true info:flags.1?true = Bool; +payments.getBankCardData#2e79d779 number:string = payments.BankCardData; + +stickers.createStickerSet#f1036780 flags:# masks:flags.0?true animated:flags.1?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector = messages.StickerSet; +stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet; +stickers.changeStickerPosition#ffb6d4ca sticker:InputDocument position:int = messages.StickerSet; +stickers.addStickerToSet#8653febe stickerset:InputStickerSet sticker:InputStickerSetItem = messages.StickerSet; +stickers.setStickerSetThumb#9a364e30 stickerset:InputStickerSet thumb:InputDocument = messages.StickerSet; + +phone.getCallConfig#55451fa9 = DataJSON; +phone.requestCall#42ff96ed flags:# video:flags.0?true user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall; +phone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall; +phone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall; +phone.receivedCall#17d54f61 peer:InputPhoneCall = Bool; +phone.discardCall#b2cbc1c0 flags:# video:flags.0?true peer:InputPhoneCall duration:int reason:PhoneCallDiscardReason connection_id:long = Updates; +phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhoneCall rating:int comment:string = Updates; +phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool; +phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool; + +langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference; +langpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector = Vector; +langpack.getDifference#cd984aa5 lang_pack:string lang_code:string from_version:int = LangPackDifference; +langpack.getLanguages#42c6978f lang_pack:string = Vector; +langpack.getLanguage#6a596502 lang_pack:string lang_code:string = LangPackLanguage; + +folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates; +folders.deleteFolder#1c295881 folder_id:int = Updates; + +stats.getBroadcastStats#ab42441a flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastStats; +stats.loadAsyncGraph#621d5fa0 flags:# token:string x:flags.0?long = StatsGraph; +stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel = stats.MegagroupStats; +stats.getMessagePublicForwards#5630281b channel:InputChannel msg_id:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; + +// LAYER 121 diff --git a/src/lib/gramjs/tl/static/schema.reduced.tl b/src/lib/gramjs/tl/static/schema.reduced.tl new file mode 100644 index 000000000..c62d662a5 --- /dev/null +++ b/src/lib/gramjs/tl/static/schema.reduced.tl @@ -0,0 +1,37 @@ +resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector = ResPQ; +p_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data; +server_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params; +server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params; +server_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data; +client_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data; +dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer; +dh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer; +dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer; +destroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes; +destroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes; +destroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes; +---functions--- +req_pq#60469778 nonce:int128 = ResPQ; +req_pq_multi#be7e8ef1 nonce:int128 = ResPQ; +req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params; +set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer; +destroy_auth_key#d1435160 = DestroyAuthKeyRes; +---types--- +msgs_ack#62d6b459 msg_ids:Vector = MsgsAck; +bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification; +bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification; +msgs_state_req#da69fb52 msg_ids:Vector = MsgsStateReq; +msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo; +msgs_all_info#8cc0d131 msg_ids:Vector info:string = MsgsAllInfo; +msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo; +msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo; +msg_resend_req#7d861a08 msg_ids:Vector = MsgResendReq; +rpc_error#2144ca19 error_code:int error_message:string = RpcError; +future_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt; +future_salts#ae500895 req_msg_id:long now:int salts:vector = FutureSalts; +pong#347773c5 msg_id:long ping_id:long = Pong; +destroy_session_ok#e22045fc session_id:long = DestroySessionRes; +destroy_session_none#62d350c9 session_id:long = DestroySessionRes; +new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession; +---functions--- +ping#7abe77ec ping_id:long = Pong; diff --git a/src/lib/gramjs/tl/static/schema.tl b/src/lib/gramjs/tl/static/schema.tl new file mode 100644 index 000000000..0f79e320e --- /dev/null +++ b/src/lib/gramjs/tl/static/schema.tl @@ -0,0 +1,113 @@ +// Core types (no need to gen) + +//vector#1cb5c415 {t:Type} # [ t ] = Vector t; + +/////////////////////////////// +/// Authorization key creation +/////////////////////////////// + +resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector = ResPQ; + +p_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data; +p_q_inner_data_dc#a9f55f95 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int = P_Q_inner_data; +p_q_inner_data_temp#3c6a84d4 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 expires_in:int = P_Q_inner_data; +p_q_inner_data_temp_dc#56fddf88 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int expires_in:int = P_Q_inner_data; + +server_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params; +server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params; + +server_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data; + +client_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data; + +dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer; +dh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer; +dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer; + +destroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes; +destroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes; +destroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes; + +---functions--- + +req_pq#60469778 nonce:int128 = ResPQ; +req_pq_multi#be7e8ef1 nonce:int128 = ResPQ; + +req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params; + +set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer; + +destroy_auth_key#d1435160 = DestroyAuthKeyRes; + +/////////////////////////////// +////////////// System messages +/////////////////////////////// + +---types--- + +msgs_ack#62d6b459 msg_ids:Vector = MsgsAck; + +bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification; +bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification; + +msgs_state_req#da69fb52 msg_ids:Vector = MsgsStateReq; +msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo; +msgs_all_info#8cc0d131 msg_ids:Vector info:string = MsgsAllInfo; + +msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo; +msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo; + +msg_resend_req#7d861a08 msg_ids:Vector = MsgResendReq; + +//rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult; // parsed manually + +rpc_error#2144ca19 error_code:int error_message:string = RpcError; + +rpc_answer_unknown#5e2ad36e = RpcDropAnswer; +rpc_answer_dropped_running#cd78e586 = RpcDropAnswer; +rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer; + +future_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt; +future_salts#ae500895 req_msg_id:long now:int salts:vector = FutureSalts; + +pong#347773c5 msg_id:long ping_id:long = Pong; + +destroy_session_ok#e22045fc session_id:long = DestroySessionRes; +destroy_session_none#62d350c9 session_id:long = DestroySessionRes; + +new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession; + +//message msg_id:long seqno:int bytes:int body:Object = Message; // parsed manually +//msg_container#73f1f8dc messages:vector = MessageContainer; // parsed manually +//msg_copy#e06046b2 orig_message:Message = MessageCopy; // parsed manually, not used - use msg_container +//gzip_packed#3072cfa1 packed_data:string = Object; // parsed manually + +http_wait#9299359f max_delay:int wait_after:int max_wait:int = HttpWait; + +//ipPort ipv4:int port:int = IpPort; +//help.configSimple#d997c3c5 date:int expires:int dc_id:int ip_port_list:Vector = help.ConfigSimple; + +ipPort#d433ad73 ipv4:int port:int = IpPort; +ipPortSecret#37982646 ipv4:int port:int secret:bytes = IpPort; +accessPointRule#4679b65f phone_prefix_rules:string dc_id:int ips:vector = AccessPointRule; +help.configSimple#5a592a6c date:int expires:int rules:vector = help.ConfigSimple; + +tlsClientHello blocks:vector = TlsClientHello; + +tlsBlockString data:string = TlsBlock; +tlsBlockRandom length:int = TlsBlock; +tlsBlockZero length:int = TlsBlock; +tlsBlockDomain = TlsBlock; +tlsBlockGrease seed:int = TlsBlock; +tlsBlockScope entries:Vector = TlsBlock; + +---functions--- + +rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer; + +get_future_salts#b921bd04 num:int = FutureSalts; + +ping#7abe77ec ping_id:long = Pong; +ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong; + +destroy_session#e7512126 session_id:long = DestroySessionRes; diff --git a/src/lib/gramjs/tl/types-generator/generate.js b/src/lib/gramjs/tl/types-generator/generate.js new file mode 100644 index 000000000..0b16b02f9 --- /dev/null +++ b/src/lib/gramjs/tl/types-generator/generate.js @@ -0,0 +1,57 @@ +const path = require('path') +const fs = require('fs') + +const { parseTl } = require('../generationHelpers') +const templateFn = require('./template') + +const INPUT_FILE = path.resolve(__dirname, '../static/api.tl') +const SCHEMA_FILE = path.resolve(__dirname, '../static/schema.tl') + +const OUTPUT_FILE = path.resolve(__dirname, '../api.d.ts') + +function main() { + const tlContent = fs.readFileSync(INPUT_FILE, 'utf-8') + const apiConfig = extractParams(tlContent) + const schemeContent = fs.readFileSync(SCHEMA_FILE, 'utf-8') + const schemeConfig = extractParams(schemeContent) + const types = [...apiConfig.types, ...schemeConfig.types] + const functions = [...apiConfig.functions, ...schemeConfig.functions] + const constructors = [...apiConfig.constructors, ...schemeConfig.constructors] + const generated = templateFn({ types: types, functions: functions, constructors: constructors }) + + fs.writeFileSync(OUTPUT_FILE, generated) +} + +function extractParams(fileContent) { + const defInterator = parseTl(fileContent, 109) + const types = {} + const constructors = [] + const functions = [] + + for (const def of defInterator) { + if (def.isFunction) { + functions.push(def) + } else { + if (!types[def.result]) { + let [namespace, name] = def.result.includes('.') ? def.result.split('.') : [undefined, def.result] + + types[def.result] = { + namespace, + name, + constructors: [] + } + } + + types[def.result].constructors.push(def.namespace ? `${def.namespace}.${def.name}` : def.name) + constructors.push(def) + } + } + + return { + types: Object.values(types), + constructors, + functions + } +} + +main() diff --git a/src/lib/gramjs/tl/types-generator/template.js b/src/lib/gramjs/tl/types-generator/template.js new file mode 100644 index 000000000..7981c6a49 --- /dev/null +++ b/src/lib/gramjs/tl/types-generator/template.js @@ -0,0 +1,219 @@ +// Not sure what they are for. +const WEIRD_TYPES = new Set(['Bool', 'X', 'Type']) + +module.exports = ({ types, constructors, functions }) => { + function groupByKey(collection, key) { + return collection.reduce((byKey, member) => { + const keyValue = member[key] || '_' + + if (!byKey[keyValue]) { + byKey[keyValue] = [member] + } else { + byKey[keyValue].push(member) + } + + return byKey + }, {}) + } + + function renderTypes(types, indent) { + return types.map(({ name, constructors }) => ` + ${!constructors.length ? '// ' : ''}export type Type${upperFirst(name)} = ${constructors.map((name) => name) + .join(' | ')}; + `.trim()) + .join(`\n${indent}`) + } + + function renderConstructors(constructors, indent) { + return constructors.map(({ name, argsConfig }) => { + const argKeys = Object.keys(argsConfig) + + if (!argKeys.length) { + return `export class ${upperFirst(name)} extends VirtualClass {};` + } + + let hasRequiredArgs = argKeys.some((argName) => argName !== 'flags' && !argsConfig[argName].isFlag) + + return ` + export class ${upperFirst(name)} extends VirtualClass<{ +${indent} ${Object.keys(argsConfig) + .map((argName) => ` + ${renderArg(argName, argsConfig[argName])}; + `.trim()) + .join(`\n${indent} `)} +${indent}}${!hasRequiredArgs ? ` | void` : ''}> { +${indent} ${Object.keys(argsConfig) + .map((argName) => ` + ${renderArg(argName, argsConfig[argName])}; + `.trim()) + .join(`\n${indent} `)} +${indent}};`.trim() + }) + .join(`\n${indent}`) + } + + function renderRequests(requests, indent) { + return requests.map(({ name, argsConfig, result }) => { + const argKeys = Object.keys(argsConfig) + + if (!argKeys.length) { + return `export class ${upperFirst(name)} extends Request {};` + } + + let hasRequiredArgs = argKeys.some((argName) => argName !== 'flags' && !argsConfig[argName].isFlag) + + return ` + export class ${upperFirst(name)} extends Request ` + ${renderArg(argName, argsConfig[argName])}; + `.trim()) + .join(`\n${indent} `)} +${indent}}${!hasRequiredArgs ? ` | void` : ''}>, ${renderResult(result)}> { +${indent} ${argKeys.map((argName) => ` + ${renderArg(argName, argsConfig[argName])}; + `.trim()) + .join(`\n${indent} `)} +${indent}};`.trim() + }) + .join(`\n${indent}`) + } + + function renderResult(result) { + const vectorMatch = result.match(/[Vv]ector<([\w\d.]+)>/) + const isVector = Boolean(vectorMatch) + const scalarValue = isVector ? vectorMatch[1] : result + const isTlType = Boolean(scalarValue.match(/^[A-Z]/)) || scalarValue.includes('.') + + return renderValueType(scalarValue, isVector, isTlType) + } + + function renderArg(argName, argConfig) { + const { + isVector, isFlag, skipConstructorId, type + } = argConfig + + const valueType = renderValueType(type, isVector, !skipConstructorId) + + return `${argName === 'flags' ? '// ' : ''}${argName}${isFlag ? '?' : ''}: ${valueType}` + } + + function renderValueType(type, isVector, isTlType) { + if (WEIRD_TYPES.has(type)) { + return type + } + + let resType + + if (typeof type === 'string' && isTlType) { + resType = renderTypeName(type) + } else { + resType = type + } + + if (isVector) { + resType = `${resType}[]` + } + + return resType + } + + function renderTypeName(typeName) { + return typeName.includes('.') ? typeName.replace('.', '.Type') : `Api.Type${typeName}` + } + + function upperFirst(str) { + return `${str[0].toUpperCase()}${str.slice(1)}` + } + + const typesByNs = groupByKey(types, 'namespace') + const constructorsByNs = groupByKey(constructors, 'namespace') + const requestsByNs = groupByKey(functions, 'namespace') + + // language=TypeScript + return ` +// This file is autogenerated. All changes will be overwritten. + +import { BigInteger } from 'big-integer'; + +export default Api; + +namespace Api { + + type AnyClass = new (...args: any[]) => any; + type I = InstanceType; + type ValuesOf = T[keyof T]; + type AnyLiteral = Record; + + type Reader = any; // To be defined. + type Client = any; // To be defined. + type Utils = any; // To be defined. + + type X = unknown; + type Type = unknown; + type Bool = boolean; + type int = number; + type int128 = number; + type int256 = number; + type long = BigInteger; + type bytes = Buffer; + + class VirtualClass { + static CONSTRUCTOR_ID: number; + static SUBCLASS_OF_ID: number; + static className: string; + static classType: 'constructor' | 'request'; + + static serializeBytes(data: Buffer | string): Buffer; + static serializeDate(date: Date | number): Buffer; + static fromReader(reader: Reader): VirtualClass; + + CONSTRUCTOR_ID: number; + SUBCLASS_OF_ID: number; + className: string; + classType: 'constructor' | 'request'; + + constructor(args: Args); + } + + class Request extends VirtualClass> { + static readResult(reader: Reader): Buffer; + static resolve(client: Client, utils: Utils): Promise; + + __response: Response; + } + + ${renderTypes(typesByNs._, ' ')} + ${Object.keys(typesByNs) + .map(namespace => namespace !== '_' ? ` + export namespace ${namespace} { + ${renderTypes(typesByNs[namespace], ' ')} + }` : '') + .join('\n')} + + ${renderConstructors(constructorsByNs._, ' ')} + ${Object.keys(constructorsByNs) + .map(namespace => namespace !== '_' ? ` + export namespace ${namespace} { + ${renderConstructors(constructorsByNs[namespace], ' ')} + }` : '') + .join('\n')} + + ${renderRequests(requestsByNs._, ' ')} + ${Object.keys(requestsByNs) + .map(namespace => namespace !== '_' ? ` + export namespace ${namespace} { + ${renderRequests(requestsByNs[namespace], ' ')} + }` : '') + .join('\n')} + + export type AnyRequest = ${requestsByNs._.map(({ name }) => upperFirst(name)) + .join(' | ')} + | ${Object.keys(requestsByNs) + .filter(ns => ns !== '_') + .map(ns => requestsByNs[ns].map(({ name }) => `${ns}.${upperFirst(name)}`) + .join(' | ')) + .join('\n | ')}; + +} +` +} diff --git a/src/lib/lovely-chart/Axes.js b/src/lib/lovely-chart/Axes.js new file mode 100644 index 000000000..c0d354b41 --- /dev/null +++ b/src/lib/lovely-chart/Axes.js @@ -0,0 +1,173 @@ +import { GUTTER, AXES_FONT, X_AXIS_HEIGHT, X_AXIS_SHIFT_START, PLOT_TOP_PADDING } from './constants'; +import { humanize } from './format'; +import { getCssColor } from './skin'; +import { applyXEdgeOpacity, applyYEdgeOpacity, xScaleLevelToStep, yScaleLevelToStep } from './formulas'; +import { toPixels } from './Projection'; + +export function createAxes(context, data, plotSize, colors) { + function drawXAxis(state, projection) { + context.clearRect(0, plotSize.height - X_AXIS_HEIGHT + 1, plotSize.width, X_AXIS_HEIGHT + 1); + + const topOffset = plotSize.height - X_AXIS_HEIGHT / 2; + const scaleLevel = Math.floor(state.xAxisScale); + const step = xScaleLevelToStep(scaleLevel); + const opacityFactor = 1 - (state.xAxisScale - scaleLevel); + + context.font = AXES_FONT; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + + for (let i = state.labelFromIndex; i <= state.labelToIndex; i++) { + const shiftedI = i - X_AXIS_SHIFT_START; + + if (shiftedI % step !== 0) { + continue; + } + + const label = data.xLabels[i]; + const [xPx] = toPixels(projection, i, 0); + let opacity = shiftedI % (step * 2) === 0 ? 1 : opacityFactor; + opacity = applyYEdgeOpacity(opacity, xPx, plotSize.width); + + context.fillStyle = getCssColor(colors, 'x-axis-text', opacity); + context.fillText(label.text, xPx, topOffset); + } + } + + function drawYAxis(state, projection, secondaryProjection) { + const { + yAxisScale, yAxisScaleFrom, yAxisScaleTo, yAxisScaleProgress = 0, + yMinViewport, yMinViewportFrom, yMinViewportTo, + yMaxViewport, yMaxViewportFrom, yMaxViewportTo, + yMinViewportSecond, yMinViewportSecondFrom, yMinViewportSecondTo, + yMaxViewportSecond, yMaxViewportSecondFrom, yMaxViewportSecondTo, + } = state; + const colorKey = secondaryProjection && `dataset#${data.datasets[0].key}`; + const isYChanging = yMinViewportFrom !== undefined || yMaxViewportFrom !== undefined; + + if (data.isPercentage) { + _drawYAxisPercents(projection); + } else { + _drawYAxisScaled( + state, + projection, + Math.round(yAxisScaleTo || yAxisScale), + yMinViewportTo !== undefined ? yMinViewportTo : yMinViewport, + yMaxViewportTo !== undefined ? yMaxViewportTo : yMaxViewport, + yAxisScaleFrom ? yAxisScaleProgress : 1, + colorKey, + ); + } + + if (yAxisScaleProgress > 0 && isYChanging) { + _drawYAxisScaled( + state, + projection, + Math.round(yAxisScaleFrom), + yMinViewportFrom !== undefined ? yMinViewportFrom : yMinViewport, + yMaxViewportFrom !== undefined ? yMaxViewportFrom : yMaxViewport, + 1 - yAxisScaleProgress, + colorKey, + ); + } + + if (secondaryProjection) { + const { yAxisScaleSecond, yAxisScaleSecondFrom, yAxisScaleSecondTo, yAxisScaleSecondProgress = 0 } = state; + const secondaryColorKey = `dataset#${data.datasets[data.datasets.length - 1].key}`; + const isYChanging = yMinViewportSecondFrom !== undefined || yMaxViewportSecondFrom !== undefined; + + _drawYAxisScaled( + state, + secondaryProjection, + Math.round(yAxisScaleSecondTo || yAxisScaleSecond), + yMinViewportSecondTo !== undefined ? yMinViewportSecondTo : yMinViewportSecond, + yMaxViewportSecondTo !== undefined ? yMaxViewportSecondTo : yMaxViewportSecond, + yAxisScaleSecondFrom ? yAxisScaleSecondProgress : 1, + secondaryColorKey, + true, + ); + + if (yAxisScaleSecondProgress > 0 && isYChanging) { + _drawYAxisScaled( + state, + secondaryProjection, + Math.round(yAxisScaleSecondFrom), + yMinViewportSecondFrom !== undefined ? yMinViewportSecondFrom : yMinViewportSecond, + yMaxViewportSecondFrom !== undefined ? yMaxViewportSecondFrom : yMaxViewportSecond, + 1 - yAxisScaleSecondProgress, + secondaryColorKey, + true, + ); + } + } + } + + function _drawYAxisScaled(state, projection, scaleLevel, yMin, yMax, opacity = 1, colorKey = null, isSecondary = false) { + const step = yScaleLevelToStep(scaleLevel); + const firstVisibleValue = Math.ceil(yMin / step) * step; + const lastVisibleValue = Math.floor(yMax / step) * step; + + context.font = AXES_FONT; + context.textAlign = isSecondary ? 'right' : 'left'; + context.textBaseline = 'bottom'; + + context.lineWidth = 1; + + context.beginPath(); + + for (let value = firstVisibleValue; value <= lastVisibleValue; value += step) { + const [, yPx] = toPixels(projection, 0, value); + const textOpacity = applyXEdgeOpacity(opacity, yPx); + + context.fillStyle = colorKey + ? getCssColor(colors, colorKey, textOpacity) + : getCssColor(colors, 'y-axis-text', textOpacity); + + if (!isSecondary) { + context.fillText(humanize(value), GUTTER, yPx - GUTTER / 2); + } else { + context.fillText(humanize(value), plotSize.width - GUTTER, yPx - GUTTER / 2); + } + + if (isSecondary) { + context.strokeStyle = getCssColor(colors, colorKey, opacity); + + context.moveTo(plotSize.width - GUTTER, yPx); + context.lineTo(plotSize.width - GUTTER * 2, yPx); + } else { + context.moveTo(GUTTER, yPx); + context.strokeStyle = getCssColor(colors, 'grid-lines', opacity); + context.lineTo(plotSize.width - GUTTER, yPx); + } + } + + context.stroke(); + } + + function _drawYAxisPercents(projection) { + const percentValues = [0, 0.25, 0.50, 0.75, 1]; + const [, height] = projection.getSize(); + + context.font = AXES_FONT; + context.textAlign = 'left'; + context.textBaseline = 'bottom'; + context.lineWidth = 1; + + context.beginPath(); + + percentValues.forEach((value) => { + const yPx = height - height * value + PLOT_TOP_PADDING; + + context.fillStyle = getCssColor(colors, 'y-axis-text', 1); + context.fillText(`${value * 100}%`, GUTTER, yPx - GUTTER / 4); + + context.moveTo(GUTTER, yPx); + context.strokeStyle = getCssColor(colors, 'grid-lines', 1); + context.lineTo(plotSize.width - GUTTER, yPx); + }); + + context.stroke(); + } + + return { drawXAxis, drawYAxis }; +} diff --git a/src/lib/lovely-chart/Header.js b/src/lib/lovely-chart/Header.js new file mode 100644 index 000000000..1f91ba086 --- /dev/null +++ b/src/lib/lovely-chart/Header.js @@ -0,0 +1,64 @@ +import { createElement, addEventListener } from './minifiers'; +import { toggleText } from './toggleText'; +import { throttle } from './utils'; + +export function createHeader(container, title, zoomOutCallback) { + let _element; + let _titleElement; + let _zoomOutElement; + let _captionElement; + let _isZooming; + + const setCaptionThrottled = throttle(setCaption, 100, false); + + _setupLayout(); + + function setCaption(caption) { + if (_isZooming) { + return; + } + + _captionElement.innerHTML = caption; + } + + function zoom(caption) { + _zoomOutElement = toggleText(_titleElement, 'Zoom Out', 'lovely-chart--header-title lovely-chart--header-zoom-out-control'); + setTimeout(() => { + addEventListener(_zoomOutElement, 'click', _onZoomOut); + }, 500); + + setCaption(caption); + } + + function toggleIsZooming(isZooming) { + _isZooming = isZooming; + } + + function _setupLayout() { + _element = createElement(); + _element.className = 'lovely-chart--header'; + + _titleElement = createElement(); + _titleElement.className = 'lovely-chart--header-title'; + _titleElement.innerHTML = title; + _element.appendChild(_titleElement); + + _captionElement = createElement(); + _captionElement.className = 'lovely-chart--header-caption lovely-chart--position-right'; + _element.appendChild(_captionElement); + + container.appendChild(_element); + } + + function _onZoomOut() { + _titleElement = toggleText(_zoomOutElement, title, 'lovely-chart--header-title', true); + + zoomOutCallback(); + } + + return { + setCaption: setCaptionThrottled, + zoom, + toggleIsZooming, + }; +} diff --git a/src/lib/lovely-chart/LovelyChart.js b/src/lib/lovely-chart/LovelyChart.js new file mode 100644 index 000000000..8ce9f4ec2 --- /dev/null +++ b/src/lib/lovely-chart/LovelyChart.js @@ -0,0 +1,214 @@ +import { createStateManager } from './StateManager'; +import { createHeader } from './Header'; +import { createAxes } from './Axes'; +import { createMinimap } from './Minimap'; +import { createTooltip } from './Tooltip'; +import { createTools } from './Tools'; +import { createZoomer } from './Zoomer'; +import { createColors } from './skin'; +import { analyzeData } from './data'; +import { setupCanvas, clearCanvas } from './canvas'; +import { preparePoints } from './preparePoints'; +import { createProjection } from './Projection'; +import { drawDatasets } from './drawDatasets'; +import { createElement } from './minifiers'; +import { getFullLabelDate, getLabelDate } from './format'; +import { hideOnScroll } from './hideOnScroll'; +import { + X_AXIS_HEIGHT, + GUTTER, + PLOT_TOP_PADDING, + PLOT_HEIGHT, + PLOT_LINE_WIDTH, + SIMPLIFIER_PLOT_FACTOR, +} from './constants'; +import { getSimplificationDelta, isDataRange } from './formulas'; +import { debounce } from './utils'; +import './styles/index.scss'; + +function create(container, originalData) { + let _stateManager; + + let _element; + let _plot; + let _context; + let _plotSize; + + let _header; + let _axes; + let _minimap; + let _tooltip; + let _tools; + let _zoomer; + + let _state; + let _windowWidth = window.innerWidth; + + const _data = analyzeData(originalData); + const _colors = createColors(_data.colors); + const _redrawDebounced = debounce(_redraw, 500, false, true); + + _setupComponents(); + _setupGlobalListeners(); + + function _setupComponents() { + _setupContainer(); + _header = createHeader(_element, _data.title, _onZoomOut); + _setupPlotCanvas(); + _stateManager = createStateManager(_data, _plotSize, _onStateUpdate); + _axes = createAxes(_context, _data, _plotSize, _colors); + _minimap = createMinimap(_element, _data, _colors, _onRangeChange); + _tooltip = createTooltip(_element, _data, _plotSize, _colors, _onZoomIn, _onFocus); + _tools = createTools(_element, _data, _onFilterChange); + _zoomer = _data.isZoomable && createZoomer(_data, originalData, _colors, _stateManager, _element, _header, _minimap, _tooltip, _tools); + // hideOnScroll(_element); + } + + function _setupContainer() { + _element = createElement(); + _element.className = `lovely-chart--container${_data.shouldZoomToPie ? ' lovely-chart--container-type-pie' : ''}`; + + container.appendChild(_element); + } + + function _setupPlotCanvas() { + const { canvas, context } = setupCanvas(_element, { + width: _element.clientWidth, + height: PLOT_HEIGHT, + }); + + _plot = canvas; + _context = context; + + _plotSize = { + width: _plot.offsetWidth, + height: _plot.offsetHeight, + }; + } + + function _onStateUpdate(state) { + _state = state; + + const { datasets } = _data; + const range = { + from: state.labelFromIndex, + to: state.labelToIndex, + }; + const boundsAndParams = { + begin: state.begin, + end: state.end, + totalXWidth: state.totalXWidth, + yMin: state.yMinViewport, + yMax: state.yMaxViewport, + availableWidth: _plotSize.width, + availableHeight: _plotSize.height - X_AXIS_HEIGHT, + xPadding: GUTTER, + yPadding: PLOT_TOP_PADDING, + }; + const visibilities = datasets.map(({ key }) => state[`opacity#${key}`]); + const points = preparePoints(_data, datasets, range, visibilities, boundsAndParams); + const projection = createProjection(boundsAndParams); + + let secondaryPoints = null; + let secondaryProjection = null; + if (_data.hasSecondYAxis) { + const secondaryDataset = datasets.find((d) => d.hasOwnYAxis); + const bounds = { + yMin: state.yMinViewportSecond, + yMax: state.yMaxViewportSecond, + }; + secondaryPoints = preparePoints(_data, [secondaryDataset], range, visibilities, bounds)[0]; + secondaryProjection = projection.copy(bounds); + } + + _header.setCaption(_getCaption(state)); + + clearCanvas(_plot, _context); + + const totalPoints = points.reduce((a, p) => a + p.length, 0); + const simplification = getSimplificationDelta(totalPoints) * SIMPLIFIER_PLOT_FACTOR; + + drawDatasets( + _context, state, _data, + range, points, projection, secondaryPoints, secondaryProjection, + PLOT_LINE_WIDTH, visibilities, _colors, false, simplification, + ); + if (!_data.isPie) { + _axes.drawYAxis(state, projection, secondaryProjection); + // TODO check isChanged + _axes.drawXAxis(state, projection); + } + _minimap.update(state); + _tooltip.update(state, points, projection, secondaryPoints, secondaryProjection); + } + + function _onRangeChange(range) { + _stateManager.update({ range }); + } + + function _onFilterChange(filter) { + _stateManager.update({ filter }); + } + + function _onFocus(focusOn) { + if (_data.isBars || _data.isPie) { + // TODO animate + _stateManager.update({ focusOn }); + } + } + + function _onZoomIn(labelIndex) { + _zoomer.zoomIn(_state, labelIndex); + } + + function _onZoomOut() { + _zoomer.zoomOut(_state); + } + + function _setupGlobalListeners() { + document.documentElement.addEventListener('darkmode', () => { + _stateManager.update(); + }); + + window.addEventListener('resize', () => { + if (window.innerWidth !== _windowWidth) { + _windowWidth = window.innerWidth; + _redrawDebounced(); + } + }); + + window.addEventListener('orientationchange', () => { + _redrawDebounced(); + }); + } + + function _redraw() { + Object.assign(_data, analyzeData(originalData)); + _element.remove(); + _setupComponents(); + } + + function _getCaption(state) { + let startIndex; + let endIndex; + + if (_zoomer && _zoomer.isZoomed()) { + // TODO Fix label + startIndex = state.labelFromIndex === 0 ? 0 : state.labelFromIndex + 1; + endIndex = state.labelToIndex === state.totalXWidth - 1 ? state.labelToIndex : state.labelToIndex - 1; + } else { + startIndex = state.labelFromIndex; + endIndex = state.labelToIndex; + } + + return isDataRange(_data.xLabels[startIndex], _data.xLabels[endIndex]) + ? ( + `${getLabelDate(_data.xLabels[startIndex])}` + + ' — ' + + `${getLabelDate(_data.xLabels[endIndex])}` + ) + : getFullLabelDate(_data.xLabels[startIndex]); + } +} + +export { create }; diff --git a/src/lib/lovely-chart/Minimap.js b/src/lib/lovely-chart/Minimap.js new file mode 100644 index 000000000..e3f031ae2 --- /dev/null +++ b/src/lib/lovely-chart/Minimap.js @@ -0,0 +1,276 @@ +import { setupCanvas, clearCanvas } from './canvas'; +import { preparePoints } from './preparePoints'; +import { createProjection } from './Projection'; +import { drawDatasets } from './drawDatasets'; +import { captureEvents } from './captureEvents'; +import { + DEFAULT_RANGE, + MINIMAP_HEIGHT, + MINIMAP_EAR_WIDTH, + MINIMAP_MARGIN, + MINIMAP_LINE_WIDTH, + MINIMAP_MAX_ANIMATED_DATASETS, + SIMPLIFIER_MINIMAP_FACTOR, +} from './constants'; +import { proxyMerge, throttleWithRaf } from './utils'; +import { createElement } from './minifiers'; +import { getSimplificationDelta } from './formulas'; + +export function createMinimap(container, data, colors, rangeCallback) { + let _element; + let _canvas; + let _context; + let _canvasSize; + let _ruler; + let _slider; + + let _capturedOffset; + let _range = {}; + let _state; + + const _updateRulerOnRaf = throttleWithRaf(_updateRuler); + + _setupLayout(); + _updateRange(DEFAULT_RANGE); + + function update(newState) { + const { begin, end } = newState; + if (!_capturedOffset) { + _updateRange({ begin, end }, true); + } + + if (data.datasets.length >= MINIMAP_MAX_ANIMATED_DATASETS) { + newState = newState.static; + } + + if (!_isStateChanged(newState)) { + return; + } + + _state = proxyMerge(newState, { focusOn: null }); + clearCanvas(_canvas, _context); + + _drawDatasets(_state); + } + + function toggle(shouldShow) { + _element.classList.toggle('lovely-chart--state-hidden', !shouldShow); + + requestAnimationFrame(() => { + _element.classList.toggle('lovely-chart--state-transparent', !shouldShow); + }); + } + + function _setupLayout() { + _element = createElement(); + + _element.className = 'lovely-chart--minimap'; + _element.style.height = `${MINIMAP_HEIGHT}px`; + + _setupCanvas(); + _setupRuler(); + + container.appendChild(_element); + + _canvasSize = { + width: _canvas.offsetWidth, + height: _canvas.offsetHeight, + }; + } + + function _getSize() { + return { + width: container.offsetWidth - MINIMAP_MARGIN * 2, + height: MINIMAP_HEIGHT, + }; + } + + function _setupCanvas() { + const { canvas, context } = setupCanvas(_element, _getSize()); + + _canvas = canvas; + _context = context; + } + + function _setupRuler() { + _ruler = createElement(); + _ruler.className = 'lovely-chart--minimap-ruler'; + _ruler.innerHTML = + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + + _slider = _ruler.children[1]; + + captureEvents( + _slider.children[1], + { + onCapture: _onDragCapture, + onDrag: _onSliderDrag, + onRelease: _onDragRelease, + draggingCursor: 'grabbing', + }, + ); + + captureEvents( + _slider.children[0], + { + onCapture: _onDragCapture, + onDrag: _onLeftEarDrag, + onRelease: _onDragRelease, + draggingCursor: 'ew-resize', + }, + ); + + captureEvents( + _slider.children[2], + { + onCapture: _onDragCapture, + onDrag: _onRightEarDrag, + onRelease: _onDragRelease, + draggingCursor: 'ew-resize', + }, + ); + + _element.appendChild(_ruler); + } + + function _isStateChanged(newState) { + if (!_state) { + return true; + } + + const { datasets } = data; + + if (datasets.some(({ key }) => _state[`opacity#${key}`] !== newState[`opacity#${key}`])) { + return true; + } + + if (_state.yMaxMinimap !== newState.yMaxMinimap) { + return true; + } + + return false; + } + + function _drawDatasets(state = {}) { + const { datasets } = data; + const range = { + from: 0, + to: state.totalXWidth, + }; + const boundsAndParams = { + begin: 0, + end: 1, + totalXWidth: state.totalXWidth, + yMin: state.yMinMinimap, + yMax: state.yMaxMinimap, + availableWidth: _canvasSize.width, + availableHeight: _canvasSize.height, + yPadding: 1, + }; + const visibilities = datasets.map(({ key }) => _state[`opacity#${key}`]); + const points = preparePoints(data, datasets, range, visibilities, boundsAndParams, true); + const projection = createProjection(boundsAndParams); + + let secondaryPoints = null; + let secondaryProjection = null; + if (data.hasSecondYAxis) { + const secondaryDataset = datasets.find((d) => d.hasOwnYAxis); + const bounds = { yMin: state.yMinMinimapSecond, yMax: state.yMaxMinimapSecond }; + secondaryPoints = preparePoints(data, [secondaryDataset], range, visibilities, bounds)[0]; + secondaryProjection = projection.copy(bounds); + } + + const totalPoints = points.reduce((a, p) => a + p.length, 0); + const simplification = getSimplificationDelta(totalPoints) * SIMPLIFIER_MINIMAP_FACTOR; + + drawDatasets( + _context, state, data, + range, points, projection, secondaryPoints, secondaryProjection, + MINIMAP_LINE_WIDTH, visibilities, colors, true, simplification, + ); + } + + function _onDragCapture(e) { + e.preventDefault(); + _capturedOffset = e.target.offsetLeft; + } + + function _onDragRelease() { + _capturedOffset = null; + } + + function _onSliderDrag(moveEvent, captureEvent, { dragOffsetX }) { + const minX1 = 0; + const maxX1 = _canvasSize.width - _slider.offsetWidth; + + const newX1 = Math.max(minX1, Math.min(_capturedOffset + dragOffsetX - MINIMAP_EAR_WIDTH, maxX1)); + const newX2 = newX1 + _slider.offsetWidth; + const begin = newX1 / _canvasSize.width; + const end = newX2 / _canvasSize.width; + + _updateRange({ begin, end }); + } + + function _onLeftEarDrag(moveEvent, captureEvent, { dragOffsetX }) { + const minX1 = 0; + const maxX1 = _slider.offsetLeft + _slider.offsetWidth - MINIMAP_EAR_WIDTH * 2; + + const newX1 = Math.min(maxX1, Math.max(minX1, _capturedOffset + dragOffsetX)); + const begin = newX1 / _canvasSize.width; + + _updateRange({ begin }); + } + + function _onRightEarDrag(moveEvent, captureEvent, { dragOffsetX }) { + const minX2 = _slider.offsetLeft + MINIMAP_EAR_WIDTH * 2; + const maxX2 = _canvasSize.width; + + const newX2 = Math.max(minX2, Math.min(_capturedOffset + MINIMAP_EAR_WIDTH + dragOffsetX, maxX2)); + const end = newX2 / _canvasSize.width; + + _updateRange({ end }); + } + + function _updateRange(range, isExternal) { + let nextRange = Object.assign({}, _range, range); + + if (_state && _state.minimapDelta && !isExternal) { + nextRange = _adjustDiscreteRange(nextRange); + } + + if (nextRange.begin === _range.begin && nextRange.end === _range.end) { + return; + } + + _range = nextRange; + _updateRulerOnRaf(); + + if (!isExternal) { + rangeCallback(_range); + } + } + + function _adjustDiscreteRange(nextRange) { + // TODO sometimes beginChange and endChange are different for slider drag because of pixels division + const begin = Math.round(nextRange.begin / _state.minimapDelta) * _state.minimapDelta; + const end = Math.round(nextRange.end / _state.minimapDelta) * _state.minimapDelta; + + return { begin, end }; + } + + function _updateRuler() { + const { begin, end } = _range; + + _ruler.children[0].style.width = `${begin * 100}%`; + _ruler.children[1].style.width = `${(end - begin) * 100}%`; + _ruler.children[2].style.width = `${(1 - end) * 100}%`; + } + + return { update, toggle }; +} diff --git a/src/lib/lovely-chart/Projection.js b/src/lib/lovely-chart/Projection.js new file mode 100644 index 000000000..6ed8e0c09 --- /dev/null +++ b/src/lib/lovely-chart/Projection.js @@ -0,0 +1,79 @@ +import { proxyMerge } from './utils'; + +export function createProjection(params) { + const { + begin, + end, + totalXWidth, + yMin, + yMax, + availableWidth, + availableHeight, + xPadding = 0, + yPadding = 0, + } = params; + + let effectiveWidth = availableWidth; + + // TODO bug get rid of padding jumps + if (begin === 0) { + effectiveWidth -= xPadding; + } + if (end === 1) { + effectiveWidth -= xPadding; + } + const xFactor = effectiveWidth / ((end - begin) * totalXWidth); + let xOffsetPx = (begin * totalXWidth) * xFactor; + if (begin === 0) { + xOffsetPx -= xPadding; + } + + const effectiveHeight = availableHeight - yPadding; + const yFactor = effectiveHeight / (yMax - yMin); + const yOffsetPx = yMin * yFactor; + + function getState() { + return { xFactor, xOffsetPx, availableHeight, yFactor, yOffsetPx }; + } + + function findClosestLabelIndex(xPx) { + return Math.round((xPx + xOffsetPx) / xFactor); + } + + function copy(overrides, cons) { + return createProjection(proxyMerge(params, overrides), cons); + } + + function getCenter() { + return [ + availableWidth / 2, + availableHeight - effectiveHeight / 2, + ]; + } + + function getSize() { + return [availableWidth, effectiveHeight]; + } + + function getParams() { + return params; + } + + return { + findClosestLabelIndex, + copy, + getCenter, + getSize, + getParams, + getState, + }; +} + +export function toPixels(projection, labelIndex, value) { + const { xFactor, xOffsetPx, availableHeight, yFactor, yOffsetPx } = projection.getState(); + + return [ + labelIndex * xFactor - xOffsetPx, + availableHeight - (value * yFactor - yOffsetPx), + ]; +} diff --git a/src/lib/lovely-chart/StateManager.js b/src/lib/lovely-chart/StateManager.js new file mode 100644 index 000000000..25701782f --- /dev/null +++ b/src/lib/lovely-chart/StateManager.js @@ -0,0 +1,222 @@ +import { createTransitionManager } from './TransitionManager'; +import { throttleWithRaf, getMaxMin, mergeArrays, proxyMerge, sumArrays } from './utils'; +import { + AXES_MAX_COLUMN_WIDTH, + AXES_MAX_ROW_HEIGHT, + X_AXIS_HEIGHT, + ANIMATE_PROPS, + Y_AXIS_ZERO_BASED_THRESHOLD, +} from './constants'; +import { xStepToScaleLevel, yScaleLevelToStep, yStepToScaleLevel } from './formulas'; + +export function createStateManager(data, viewportSize, callback) { + const _range = { begin: 0, end: 1 }; + const _filter = _buildDefaultFilter(); + const _transitionConfig = _buildTransitionConfig(); + const _transitions = createTransitionManager(_runCallback); + const _runCallbackOnRaf = throttleWithRaf(_runCallback); + + let _state = {}; + + function update({ range = {}, filter = {}, focusOn, minimapDelta } = {}, noTransition) { + Object.assign(_range, range); + Object.assign(_filter, filter); + + const prevState = _state; + _state = calculateState(data, viewportSize, _range, _filter, focusOn, minimapDelta, prevState); + + if (!noTransition) { + _transitionConfig.forEach(({ prop, duration, options }) => { + const transition = _transitions.get(prop); + const currentTarget = transition ? transition.to : prevState[prop]; + + if (currentTarget !== undefined && currentTarget !== _state[prop]) { + const current = transition + ? (options.includes('fast') ? prevState[prop] : transition.current) + : prevState[prop]; + + if (transition) { + _transitions.remove(prop); + } + + _transitions.add(prop, current, _state[prop], duration, options); + } + }); + } + + if (!_transitions.isRunning() || !_transitions.isFast()) { + _runCallbackOnRaf(); + } + } + + function hasAnimations() { + return _transitions.isFast(); + } + + function _buildTransitionConfig() { + const transitionConfig = []; + const datasetVisibilities = data.datasets.map(({ key }) => `opacity#${key} 300`); + + mergeArrays([ + ANIMATE_PROPS, + datasetVisibilities, + ]).forEach((transition) => { + const [prop, duration, ...options] = transition.split(' '); + transitionConfig.push({ prop, duration, options }); + }); + + return transitionConfig; + } + + function _buildDefaultFilter() { + const filter = {}; + + data.datasets.forEach(({ key }) => { + filter[key] = true; + }); + + return filter; + } + + function _runCallback() { + const state = _transitions.isFast() ? proxyMerge(_state, _transitions.getState()) : _state; + state.static = _state; + callback(state); + } + + return { update, hasAnimations }; +} + +function calculateState(data, viewportSize, range, filter, focusOn, minimapDelta, prevState) { + const { begin, end } = range; + const totalXWidth = data.xLabels.length - 1; + + const labelFromIndex = Math.max(0, Math.ceil(totalXWidth * begin)); + const labelToIndex = Math.min(Math.floor(totalXWidth * end), totalXWidth); + + const xAxisScale = calculateXAxisScale(viewportSize.width, labelFromIndex, labelToIndex); + + const yRanges = data.isStacked + ? calculateYRangesStacked(data, filter, labelFromIndex, labelToIndex, prevState) + : calculateYRanges(data, filter, labelFromIndex, labelToIndex, prevState); + + const yAxisScale = calculateYAxisScale(viewportSize.height, yRanges.yMinViewport, yRanges.yMaxViewport); + const yAxisScaleSecond = data.hasSecondYAxis && + calculateYAxisScale(viewportSize.height, yRanges.yMinViewportSecond, yRanges.yMaxViewportSecond); + + const yStep = yScaleLevelToStep(yAxisScale); + yRanges.yMinViewport -= yRanges.yMinViewport % yStep; + + if (yAxisScaleSecond) { + const yStepSecond = yScaleLevelToStep(yAxisScaleSecond); + yRanges.yMinViewportSecond -= yRanges.yMinViewportSecond % yStepSecond; + } + + const datasetsOpacity = {}; + data.datasets.forEach(({ key }) => { + datasetsOpacity[`opacity#${key}`] = filter[key] ? 1 : 0; + }); + + // TODO perf + return Object.assign( + { + totalXWidth, + xAxisScale, + yAxisScale, + yAxisScaleSecond, + labelFromIndex: Math.max(0, labelFromIndex - 1), + labelToIndex: Math.min(labelToIndex + 1, totalXWidth), + filter: Object.assign({}, filter), + focusOn: focusOn !== undefined ? focusOn : prevState.focusOn, + minimapDelta: minimapDelta !== undefined ? minimapDelta : prevState.minimapDelta, + }, + yRanges, + datasetsOpacity, + range, + ); +} + +function calculateYRanges(data, filter, labelFromIndex, labelToIndex, prevState) { + const secondaryYAxisDataset = data.hasSecondYAxis && data.datasets.slice(-1)[0]; + const filteredDatasets = data.datasets.filter((d) => filter[d.key] && d !== secondaryYAxisDataset); + + const yRanges = calculateYRangesForGroup(data, labelFromIndex, labelToIndex, prevState, filteredDatasets); + + if (secondaryYAxisDataset) { + const group = filter[secondaryYAxisDataset.key] ? [secondaryYAxisDataset] : []; + const { + yMinViewport: yMinViewportSecond, + yMaxViewport: yMaxViewportSecond, + yMinMinimap: yMinMinimapSecond, + yMaxMinimap: yMaxMinimapSecond, + } = calculateYRangesForGroup(data, labelFromIndex, labelToIndex, prevState, [secondaryYAxisDataset]); + + Object.assign(yRanges, { + yMinViewportSecond, + yMaxViewportSecond, + yMinMinimapSecond, + yMaxMinimapSecond, + }); + } + + return yRanges; +} + +function calculateYRangesForGroup(data, labelFromIndex, labelToIndex, prevState, datasets) { + const { min: yMinMinimapReal = prevState.yMinMinimap, max: yMaxMinimap = prevState.yMaxMinimap } + = getMaxMin(mergeArrays(datasets.map(({ yMax, yMin }) => [yMax, yMin]))); + const yMinMinimap = yMinMinimapReal / yMaxMinimap > Y_AXIS_ZERO_BASED_THRESHOLD ? yMinMinimapReal : 0; + + let yMinViewport; + let yMaxViewport; + + if (labelFromIndex === 0 && labelToIndex === data.xLabels.length - 1) { + yMinViewport = yMinMinimap; + yMaxViewport = yMaxMinimap; + } else { + const filteredValues = datasets.map(({ values }) => values); + const viewportValues = filteredValues.map((values) => values.slice(labelFromIndex, labelToIndex + 1)); + const viewportMaxMin = getMaxMin(mergeArrays(viewportValues)); + const yMinViewportReal = viewportMaxMin.min !== undefined ? viewportMaxMin.min : prevState.yMinViewport; + yMaxViewport = viewportMaxMin.max !== undefined ? viewportMaxMin.max : prevState.yMaxViewport; + yMinViewport = yMinViewportReal / yMaxViewport > Y_AXIS_ZERO_BASED_THRESHOLD ? yMinViewportReal : 0; + } + + return { + yMinViewport, + yMaxViewport, + yMinMinimap, + yMaxMinimap, + }; +} + +function calculateYRangesStacked(data, filter, labelFromIndex, labelToIndex, prevState) { + const filteredDatasets = data.datasets.filter((d) => filter[d.key]); + const filteredValues = filteredDatasets.map(({ values }) => values); + + const sums = filteredValues.length ? sumArrays(filteredValues) : []; + const { max: yMaxMinimap = prevState.yMaxMinimap } = getMaxMin(sums); + const { max: yMaxViewport = prevState.yMaxViewport } = getMaxMin(sums.slice(labelFromIndex, labelToIndex + 1)); + + return { + yMinViewport: 0, + yMaxViewport, + yMinMinimap: 0, + yMaxMinimap, + }; +} + +function calculateXAxisScale(plotWidth, labelFromIndex, labelToIndex) { + const viewportLabelsCount = labelToIndex - labelFromIndex; + const maxColumns = Math.floor(plotWidth / AXES_MAX_COLUMN_WIDTH); + + return xStepToScaleLevel(viewportLabelsCount / maxColumns); +} + +function calculateYAxisScale(plotHeight, yMin, yMax) { + const availableHeight = plotHeight - X_AXIS_HEIGHT; + const viewportLabelsCount = yMax - yMin; + const maxRows = Math.floor(availableHeight / AXES_MAX_ROW_HEIGHT); + + return yStepToScaleLevel(viewportLabelsCount / maxRows); +} diff --git a/src/lib/lovely-chart/Tools.js b/src/lib/lovely-chart/Tools.js new file mode 100644 index 000000000..629ec0827 --- /dev/null +++ b/src/lib/lovely-chart/Tools.js @@ -0,0 +1,100 @@ +import { createElement } from './minifiers'; +import { captureEvents } from './captureEvents'; + +export function createTools(container, data, filterCallback) { + let _element; + + _setupLayout(); + _updateFilter(); + + function redraw() { + if (_element) { + const oldElement = _element; + oldElement.classList.add('lovely-chart--state-hidden'); + setTimeout(() => { + oldElement.parentNode.removeChild(oldElement); + }, 500); + } + + _setupLayout(); + _element.classList.add('lovely-chart--state-transparent'); + requestAnimationFrame(() => { + _element.classList.remove('lovely-chart--state-transparent'); + }); + } + + function _setupLayout() { + _element = createElement(); + _element.className = 'lovely-chart--tools'; + + if (data.datasets.length < 2) { + _element.className += ' lovely-chart--state-hidden'; + } + + data.datasets.forEach(({ key, name }) => { + const control = createElement('a'); + control.href = '#'; + control.dataset.key = key; + control.className = `lovely-chart--button lovely-chart--color-${data.colors[key].slice(1)} lovely-chart--state-checked`; + control.innerHTML = `${name}`; + + control.addEventListener('click', (e) => { + e.preventDefault(); + + if (!control.dataset.clickPrevented) { + _updateFilter(control); + } + + delete control.dataset.clickPrevented; + }); + + captureEvents(control, { + onLongPress: () => { + control.dataset.clickPrevented = 'true'; + + _updateFilter(control, true); + }, + }); + + _element.appendChild(control); + }); + + container.appendChild(_element); + } + + function _updateFilter(button, isLongPress = false) { + const buttons = Array.from(_element.getElementsByTagName('a')); + const isSingleChecked = _element.querySelectorAll('.lovely-chart--state-checked').length === 1; + + if (button) { + if (button.classList.contains('lovely-chart--state-checked') && isSingleChecked) { + if (isLongPress) { + buttons.forEach((b) => b.classList.add('lovely-chart--state-checked')); + button.classList.remove('lovely-chart--state-checked'); + } else { + button.classList.remove('lovely-chart--state-shake'); + requestAnimationFrame(() => { + button.classList.add('lovely-chart--state-shake'); + }); + } + } else if (isLongPress) { + buttons.forEach((b) => b.classList.remove('lovely-chart--state-checked')); + button.classList.add('lovely-chart--state-checked'); + } else { + button.classList.toggle('lovely-chart--state-checked'); + } + } + + const filter = {}; + + buttons.forEach((input) => { + filter[input.dataset.key] = input.classList.contains('lovely-chart--state-checked'); + }); + + filterCallback(filter); + } + + return { + redraw, + }; +} diff --git a/src/lib/lovely-chart/Tooltip.js b/src/lib/lovely-chart/Tooltip.js new file mode 100644 index 000000000..8dd6f7081 --- /dev/null +++ b/src/lib/lovely-chart/Tooltip.js @@ -0,0 +1,466 @@ +import { setupCanvas, clearCanvas } from './canvas'; +import { BALLOON_OFFSET, X_AXIS_HEIGHT } from './constants'; +import { getPieRadius, isDataRange } from './formulas'; +import { formatInteger, getLabelDate, getFullLabelDate } from './format'; +import { getCssColor } from './skin'; +import { throttle, throttleWithRaf } from './utils'; +import { addEventListener, createElement } from './minifiers'; +import { toPixels } from './Projection'; + +export function createTooltip(container, data, plotSize, colors, onZoom, onFocus) { + let _state; + let _points; + let _projection; + let _secondaryPoints; + let _secondaryProjection; + + let _element; + let _canvas; + let _context; + let _balloon; + + let _offsetX; + let _offsetY; + let _clickedOnLabel = null; + + let _isZoomed = false; + let _isZooming = false; + + const _selectLabelOnRaf = throttleWithRaf(_selectLabel); + const _throttledUpdateContent = throttle(_updateContent, 100, true, true); + + _setupLayout(); + + function update(state, points, projection, secondaryPoints, secondaryProjection) { + _state = state; + _points = points; + _projection = projection; + _secondaryPoints = secondaryPoints; + _secondaryProjection = secondaryProjection; + _selectLabel(true); + } + + function toggleLoading(isLoading) { + _balloon.classList.toggle('lovely-chart--state-loading', isLoading); + + if (!isLoading) { + _clear(); + } + } + + function toggleIsZoomed(isZoomed) { + if (isZoomed !== _isZoomed) { + _isZooming = true; + } + _isZoomed = isZoomed; + _balloon.classList.toggle('lovely-chart--state-inactive', isZoomed); + } + + function _setupLayout() { + _element = createElement(); + _element.className = `lovely-chart--tooltip`; + + _setupCanvas(); + _setupBalloon(); + + if ('ontouchstart' in window) { + addEventListener(_element, 'touchmove', _onMouseMove); + addEventListener(_element, 'touchstart', _onMouseMove); + addEventListener(document, 'touchstart', _onDocumentMove); + } else { + addEventListener(_element, 'mousemove', _onMouseMove); + addEventListener(_element, 'click', _onClick); + addEventListener(document, 'mousemove', _onDocumentMove); + } + + container.appendChild(_element); + } + + function _setupCanvas() { + const { canvas, context } = setupCanvas(_element, plotSize); + + _canvas = canvas; + _context = context; + } + + function _setupBalloon() { + _balloon = createElement(); + _balloon.className = `lovely-chart--tooltip-balloon${!data.isZoomable ? ' lovely-chart--state-inactive' : ''}`; + _balloon.innerHTML = '
    '; + + if (data.isZoomable) { + addEventListener(_balloon, 'click', _onBalloonClick); + } + + _element.appendChild(_balloon); + } + + function _onMouseMove(e) { + if (e.target === _balloon || _balloon.contains(e.target) || _clickedOnLabel) { + return; + } + + _isZooming = false; + + const pageOffset = _getPageOffset(_element); + _offsetX = (e.touches ? e.touches[0].clientX : e.clientX) - pageOffset.left; + _offsetY = (e.touches ? e.touches[0].clientY : e.clientY) - pageOffset.top; + + _selectLabelOnRaf(); + } + + function _onDocumentMove(e) { + if (_offsetX !== null && e.target !== _element && !_element.contains(e.target)) { + _clear(); + } + } + + function _onClick(e) { + if (_isZooming) { + return; + } + + const oldLabelIndex = _clickedOnLabel; + + _clickedOnLabel = null; + _onMouseMove(e, true); + + const newLabelIndex = _getLabelIndex(); + if (newLabelIndex !== oldLabelIndex) { + _clickedOnLabel = newLabelIndex; + } + } + + function _onBalloonClick() { + if (_balloon.classList.contains('lovely-chart--state-inactive')) { + return; + } + + const labelIndex = _projection.findClosestLabelIndex(_offsetX); + onZoom(labelIndex); + } + + function _clear(isExternal) { + _offsetX = null; + _clickedOnLabel = null; + clearCanvas(_canvas, _context); + _hideBalloon(); + + if (!isExternal && onFocus) { + onFocus(null); + } + } + + function _getLabelIndex() { + const labelIndex = _projection.findClosestLabelIndex(_offsetX); + return labelIndex < _state.labelFromIndex || labelIndex > _state.labelToIndex ? null : labelIndex; + } + + function _selectLabel(isExternal) { + if (!_offsetX || !_state || _isZooming) { + return; + } + + const labelIndex = _getLabelIndex(); + if (labelIndex === null) { + _clear(isExternal); + return; + } + + const pointerVector = getPointerVector(); + const shouldShowBalloon = data.isPie ? pointerVector.distance <= getPieRadius(_projection) : true; + + if (!isExternal && onFocus) { + if (data.isPie) { + onFocus(pointerVector); + } else { + onFocus(labelIndex); + } + } + + function getValue(values, labelIndex) { + if (data.isPie) { + return values.slice(_state.labelFromIndex, _state.labelToIndex + 1).reduce((a, x) => a + x, 0); + } + + return values[labelIndex]; + } + + const [xPx] = toPixels(_projection, labelIndex, 0); + const statistics = data.datasets + .map(({ key, name, values, hasOwnYAxis }, i) => ({ + key, + name, + value: getValue(values, labelIndex), + hasOwnYAxis, + originalIndex: i, + })) + .filter(({ key }) => _state.filter[key]); + + if (statistics.length && shouldShowBalloon) { + _updateBalloon(statistics, labelIndex); + } else { + _hideBalloon(); + } + + clearCanvas(_canvas, _context); + if (data.isLines || data.isAreas) { + if (data.isLines) { + _drawCircles(statistics, labelIndex); + } + + _drawTail(xPx, plotSize.height - X_AXIS_HEIGHT, getCssColor(colors, 'grid-lines')); + } + } + + function _drawCircles(statistics, labelIndex) { + statistics.forEach(({ value, key, hasOwnYAxis, originalIndex }) => { + const pointIndex = labelIndex - _state.labelFromIndex; + const point = hasOwnYAxis ? _secondaryPoints[pointIndex] : _points[originalIndex][pointIndex]; + + if (!point) { + return; + } + + const [x, y] = hasOwnYAxis + ? toPixels(_secondaryProjection, labelIndex, point.stackValue) + : toPixels(_projection, labelIndex, point.stackValue); + + // TODO animate + _drawCircle( + [x, y], + getCssColor(colors, `dataset#${key}`), + getCssColor(colors, 'background'), + ); + }); + } + + function _drawCircle([xPx, yPx], strokeColor, fillColor) { + _context.strokeStyle = strokeColor; + _context.fillStyle = fillColor; + _context.lineWidth = 2; + + _context.beginPath(); + _context.arc(xPx, yPx, 4, 0, 2 * Math.PI); + _context.fill(); + _context.stroke(); + } + + function _drawTail(xPx, height, color) { + _context.strokeStyle = color; + _context.lineWidth = 1; + + _context.beginPath(); + _context.moveTo(xPx, 0); + _context.lineTo(xPx, height); + _context.stroke(); + } + + function _getBalloonLeftOffset(labelIndex) { + const meanLabel = (_state.labelFromIndex + _state.labelToIndex) / 2; + const { angle } = getPointerVector(); + + const shouldPlaceRight = data.isPie ? angle > Math.PI / 2 : labelIndex < meanLabel; + + return shouldPlaceRight + ? _offsetX + BALLOON_OFFSET + : _offsetX - (_balloon.offsetWidth + BALLOON_OFFSET); + } + + function _getBalloonTopOffset() { + return data.isPie ? `${_offsetY}px` : 0; + } + + function _updateBalloon(statistics, labelIndex) { + _balloon.style.transform = `translate3D(${_getBalloonLeftOffset(labelIndex)}px, ${_getBalloonTopOffset()}, 0)`; + _balloon.classList.add('lovely-chart--state-shown'); + + if (data.isPie) { + _updateContent(null, statistics); + } else { + _throttledUpdateContent(_getTitle(data, labelIndex), statistics); + } + } + + function _getTitle(data, labelIndex) { + if (data.labelType === 'text') { + return data.xLabels[labelIndex].text; + } + + if (_isZoomed) { + if (isDataRange(data.xLabels[_state.labelFromIndex + 1], data.xLabels[_state.labelToIndex - 1])) { + return getLabelDate(data.xLabels[labelIndex], { isShort: true, displayYear: false, displayHours: true }); + } + + return data.xLabels[labelIndex].text; + } + + return getFullLabelDate(data.xLabels[labelIndex], { isShort: true }); + } + + function _isPieSectorSelected(statistics, value, totalValue, index, pointerVector) { + const offset = index > 0 ? statistics.slice(0, index).reduce((a, x) => a + x.value, 0) : 0; + const beginAngle = offset / totalValue * Math.PI * 2 - Math.PI / 2; + const endAngle = (offset + value) / totalValue * Math.PI * 2 - Math.PI / 2; + + return pointerVector && + beginAngle <= pointerVector.angle && + pointerVector.angle < endAngle && + pointerVector.distance <= getPieRadius(_projection); + } + + function _updateTitle(title) { + const titleContainer = _balloon.children[0]; + + if (data.isPie) { + if (titleContainer) { + titleContainer.style.display = 'none'; + } + } else { + if (titleContainer.style.display === 'none') { + titleContainer.style.display = ''; + } + const currentTitle = titleContainer.querySelector(':not(.lovely-chart--state-hidden)'); + + if (!titleContainer.innerHTML || !currentTitle) { + titleContainer.innerHTML = `${title}`; + } else { + currentTitle.innerHTML = title; + } + } + } + + function _insertNewDataSet(dataSetContainer, { name, key, value }, totalValue) { + const className = `lovely-chart--tooltip-dataset-value lovely-chart--position-right lovely-chart--color-${data.colors[key].slice(1)}`; + const newDataSet = createElement(); + newDataSet.className = 'lovely-chart--tooltip-dataset'; + newDataSet.setAttribute('data-present', 'true'); + newDataSet.setAttribute('data-name', name); + newDataSet.innerHTML = `${name}${formatInteger(value)}`; + _renderPercentageValue(newDataSet, value, totalValue); + + const totalText = dataSetContainer.querySelector(`[data-total="true"]`); + if (totalText) { + dataSetContainer.insertBefore(newDataSet, totalText); + } else { + dataSetContainer.appendChild(newDataSet); + } + } + + function _updateDataSet(currentDataSet, { key, value } = {}, totalValue) { + currentDataSet.setAttribute('data-present', 'true'); + + const valueElement = currentDataSet.querySelector(`.lovely-chart--tooltip-dataset-value.lovely-chart--color-${data.colors[key].slice(1)}:not(.lovely-chart--state-hidden)`); + valueElement.innerHTML = formatInteger(value); + + _renderPercentageValue(currentDataSet, value, totalValue); + } + + function _renderPercentageValue(dataSet, value, totalValue) { + if (!data.isPercentage) { + return; + } + + if (data.isPie) { + Array.from(dataSet.querySelectorAll(`.lovely-chart--percentage-title`)).forEach(e => e.remove()); + return; + } + + const percentageValue = Math.round(value / totalValue * 100); + const percentageElement = dataSet.querySelector(`.lovely-chart--percentage-title:not(.lovely-chart--state-hidden)`); + + if (!percentageElement) { + const newPercentageTitle = createElement('span'); + newPercentageTitle.className = 'lovely-chart--percentage-title lovely-chart--position-left'; + newPercentageTitle.innerHTML = `${percentageValue}%`; + dataSet.prepend(newPercentageTitle); + } else { + percentageElement.innerHTML = `${percentageValue}%`; + } + } + + function _updateDataSets(statistics) { + const dataSetContainer = _balloon.children[1]; + if (data.isPie) { + dataSetContainer.classList.add('lovely-chart--tooltip-legend-pie'); + } + + Array.from(dataSetContainer.children).forEach((dataSet) => { + if (!data.isPie && dataSetContainer.classList.contains('lovely-chart--tooltip-legend-pie')) { + dataSet.remove(); + } else { + dataSet.setAttribute('data-present', 'false'); + } + }); + + const totalValue = statistics.reduce((a, x) => a + x.value, 0); + const pointerVector = getPointerVector(); + const finalStatistics = data.isPie ? statistics.filter(({ value }, index) => _isPieSectorSelected(statistics, value, totalValue, index, pointerVector)) : statistics; + + finalStatistics.forEach((statItem) => { + const currentDataSet = dataSetContainer.querySelector(`[data-name="${statItem.name}"]`); + + if (!currentDataSet) { + _insertNewDataSet(dataSetContainer, statItem, totalValue); + } else { + _updateDataSet(currentDataSet, statItem, totalValue); + } + }); + + if (data.isBars && data.isStacked) { + _renderTotal(dataSetContainer, formatInteger(totalValue)); + } + + Array.from(dataSetContainer.querySelectorAll('[data-present="false"]')) + .forEach((dataSet) => { + dataSet.remove(); + }); + } + + function _updateContent(title, statistics) { + _updateTitle(title); + _updateDataSets(statistics); + } + + function _renderTotal(dataSetContainer, totalValue) { + const totalText = dataSetContainer.querySelector(`[data-total="true"]`); + const className = `lovely-chart--tooltip-dataset-value lovely-chart--position-right`; + if (!totalText) { + const newTotalText = createElement(); + newTotalText.className = 'lovely-chart--tooltip-dataset'; + newTotalText.setAttribute('data-present', 'true'); + newTotalText.setAttribute('data-total', 'true'); + newTotalText.innerHTML = `All${totalValue}`; + dataSetContainer.appendChild(newTotalText); + } else { + totalText.setAttribute('data-present', 'true'); + + const valueElement = totalText.querySelector(`.lovely-chart--tooltip-dataset-value:not(.lovely-chart--state-hidden)`); + valueElement.innerHTML = totalValue; + } + } + + function _hideBalloon() { + _balloon.classList.remove('lovely-chart--state-shown'); + } + + function getPointerVector() { + const { width, height } = _element.getBoundingClientRect(); + + const center = [width / 2, height / 2]; + const angle = Math.atan2(_offsetY - center[1], _offsetX - center[0]); + const distance = Math.sqrt((_offsetX - center[0]) ** 2 + (_offsetY - center[1]) ** 2); + + return { + angle: angle >= -Math.PI / 2 ? angle : 2 * Math.PI + angle, + distance, + }; + } + + function _getPageOffset(el) { + return el.getBoundingClientRect(); + } + + return { update, toggleLoading, toggleIsZoomed }; +} + diff --git a/src/lib/lovely-chart/TransitionManager.js b/src/lib/lovely-chart/TransitionManager.js new file mode 100644 index 000000000..cfbd07bb9 --- /dev/null +++ b/src/lib/lovely-chart/TransitionManager.js @@ -0,0 +1,138 @@ +import { SPEED_TEST_FAST_FPS, SPEED_TEST_INTERVAL, TRANSITION_DEFAULT_DURATION } from './constants'; + +function transition(t) { + // faster + // return -t * (t - 2); + // easeOut + return 1 - Math.pow(1 - t, 1.675); +} + +export function createTransitionManager(onTick) { + const _transitions = {}; + + let _nextFrame = null; + + let _testStartedAt = null; + let _fps = null; + let _testingFps = null; + let _slowDetectedAt = null; + let _startedAsSlow = null; + + function add(prop, from, to, duration, options) { + _transitions[prop] = { + from, + to, + duration, + options, + current: from, + startedAt: Date.now(), + progress: 0, + }; + + if (!_nextFrame) { + _resetSpeedTest(); + _nextFrame = requestAnimationFrame(_tick); + } + } + + function remove(prop) { + delete _transitions[prop]; + + if (!isRunning()) { + cancelAnimationFrame(_nextFrame); + _nextFrame = null; + } + } + + function get(prop) { + return _transitions[prop]; + } + + function getState() { + const state = {}; + + Object.keys(_transitions).forEach((prop) => { + const { current, from, to, progress } = _transitions[prop]; + state[prop] = current; + // TODO perf lazy + state[`${prop}From`] = from; + state[`${prop}To`] = to; + state[`${prop}Progress`] = progress; + }); + + return state; + } + + function isRunning() { + return Boolean(Object.keys(_transitions).length); + } + + function isFast(forceCheck) { + if (!forceCheck && (_startedAsSlow || _slowDetectedAt)) { + return false; + } + + return _fps === null || _fps >= SPEED_TEST_FAST_FPS; + } + + function _tick() { + const isSlow = !isFast(); + _speedTest(); + + const state = {}; + + Object.keys(_transitions).forEach((prop) => { + const { startedAt, from, to, duration = TRANSITION_DEFAULT_DURATION, options } = _transitions[prop]; + const progress = Math.min(1, (Date.now() - startedAt) / duration); + let current = from + (to - from) * transition(progress); + + if (options.includes('ceil')) { + current = Math.ceil(current); + } else if (options.includes('floor')) { + current = Math.floor(current); + } + + _transitions[prop].current = current; + _transitions[prop].progress = progress; + state[prop] = current; + + if (progress === 1) { + remove(prop); + } + }); + + if (!isSlow) { + onTick(state); + } + + if (isRunning()) { + _nextFrame = requestAnimationFrame(_tick); + } + } + + function _resetSpeedTest() { + _testStartedAt = null; + _testingFps = null; + if (_slowDetectedAt && Date.now() - _slowDetectedAt > 5000) { + _slowDetectedAt = null; + } + _startedAsSlow = Boolean(_slowDetectedAt) || !isFast(true); + } + + function _speedTest() { + if (!_testStartedAt || (Date.now() - _testStartedAt) >= SPEED_TEST_INTERVAL) { + if (_testingFps) { + _fps = _testingFps; + if (!_slowDetectedAt && !isFast(true)) { + _slowDetectedAt = Date.now(); + } + } + _testStartedAt = Date.now(); + _testingFps = 0; + } else { + _testingFps++; + } + } + + return { add, remove, get, getState, isRunning, isFast }; +} diff --git a/src/lib/lovely-chart/Zoomer.js b/src/lib/lovely-chart/Zoomer.js new file mode 100644 index 000000000..e596228b7 --- /dev/null +++ b/src/lib/lovely-chart/Zoomer.js @@ -0,0 +1,161 @@ +import { analyzeData } from './data'; +import { getFullLabelDate } from './format'; +import { ZOOM_RANGE_DELTA, ZOOM_RANGE_MIDDLE, ZOOM_TIMEOUT } from './constants'; +import { createColors } from './skin'; + +export function createZoomer(data, overviewData, colors, stateManager, container, header, minimap, tooltip, tools) { + let _isZoomed = false; + let _stateBeforeZoomIn; + let _stateBeforeZoomOut; + + function zoomIn(state, labelIndex) { + if (_isZoomed) { + return; + } + + const label = data.xLabels[labelIndex]; + + _stateBeforeZoomIn = state; + header.toggleIsZooming(true); + tooltip.toggleLoading(true); + tooltip.toggleIsZoomed(true); + if (data.shouldZoomToPie) { + container.classList.add('lovely-chart--state-zoomed-in'); + container.classList.add('lovely-chart--state-animating'); + } + + const { value: date } = label; + const dataPromise = data.shouldZoomToPie ? Promise.resolve(_generatePieData(labelIndex)) : data.onZoom(date); + dataPromise.then((newData) => _replaceData(newData, labelIndex, label)); + } + + function zoomOut(state) { + if (!_isZoomed) { + return; + } + + _stateBeforeZoomOut = state; + header.toggleIsZooming(true); + tooltip.toggleLoading(true); + tooltip.toggleIsZoomed(false); + if (data.shouldZoomToPie) { + container.classList.remove('lovely-chart--state-zoomed-in'); + container.classList.add('lovely-chart--state-animating'); + } + + const labelIndex = Math.round((state.labelFromIndex + state.labelToIndex) / 2); + _replaceData(overviewData, labelIndex); + } + + function isZoomed() { + return _isZoomed; + } + + function _replaceData(newRawData, labelIndex, zoomInLabel) { + tooltip.toggleLoading(false); + + const labelWidth = 1 / data.xLabels.length; + const labelMiddle = labelIndex / (data.xLabels.length - 1); + const filter = {}; + data.datasets.forEach(({ key }) => filter[key] = false); + const newData = analyzeData(newRawData, _isZoomed || data.shouldZoomToPie ? 'day' : 'hour'); + const shouldZoomToLines = Object.keys(data.datasets).length !== Object.keys(newData.datasets).length; + + stateManager.update({ + range: { + begin: labelMiddle - labelWidth / 2, + end: labelMiddle + labelWidth / 2, + }, + filter, + }); + + setTimeout(() => { + Object.assign(data, newData); + if (shouldZoomToLines) { + Object.assign(colors, createColors(newRawData.colors)); + } + + if (shouldZoomToLines) { + minimap.toggle(_isZoomed); + tools.redraw(); + container.style.width = `${container.scrollWidth}px`; + container.style.height = `${container.scrollHeight}px`; + } + + stateManager.update({ + range: { + begin: ZOOM_RANGE_MIDDLE - ZOOM_RANGE_DELTA, + end: ZOOM_RANGE_MIDDLE + ZOOM_RANGE_DELTA, + }, + focusOn: null, + }, true); + + const daysCount = _isZoomed || data.shouldZoomToPie ? data.xLabels.length : data.xLabels.length / 24; + const halfDayWidth = (1 / daysCount) / 2; + + let range; + let filter; + + if (_isZoomed) { + range = { + begin: _stateBeforeZoomIn.begin, + end: _stateBeforeZoomIn.end, + }; + filter = shouldZoomToLines ? _stateBeforeZoomIn.filter : _stateBeforeZoomOut.filter; + } else { + if (shouldZoomToLines) { + range = { + begin: 0, + end: 1, + }; + filter = {}; + data.datasets.forEach(({ key }) => filter[key] = true); + } else { + range = { + begin: ZOOM_RANGE_MIDDLE - halfDayWidth, + end: ZOOM_RANGE_MIDDLE + halfDayWidth, + }; + filter = _stateBeforeZoomIn.filter; + } + } + + stateManager.update({ + range, + filter, + minimapDelta: _isZoomed ? null : range.end - range.begin, + }); + + if (zoomInLabel) { + header.zoom(getFullLabelDate(zoomInLabel)); + } + + _isZoomed = !_isZoomed; + header.toggleIsZooming(false); + }, stateManager.hasAnimations() ? ZOOM_TIMEOUT : 0); + + setTimeout(() => { + if (data.shouldZoomToPie) { + container.classList.remove('lovely-chart--state-animating'); + } + }, stateManager.hasAnimations() ? 1000 : 0); + } + + function _generatePieData(labelIndex) { + return Object.assign( + {}, + overviewData, + { + type: 'pie', + labels: overviewData.labels.slice(labelIndex - 3, labelIndex + 4), + datasets: overviewData.datasets.map((dataset) => { + return { + ...dataset, + values: dataset.values.slice(labelIndex - 3, labelIndex + 4), + }; + }), + }, + ); + } + + return { zoomIn, zoomOut, isZoomed }; +} diff --git a/src/lib/lovely-chart/canvas.js b/src/lib/lovely-chart/canvas.js new file mode 100644 index 000000000..2f53855bb --- /dev/null +++ b/src/lib/lovely-chart/canvas.js @@ -0,0 +1,22 @@ +import { DPR } from './constants'; +import { createElement } from './minifiers'; + +export function setupCanvas(container, { width, height }) { + const canvas = createElement('canvas'); + + canvas.width = width * DPR; + canvas.height = height * DPR; + canvas.style.width = '100%'; + canvas.style.height = `${height}px`; + + const context = canvas.getContext('2d'); + context.scale(DPR, DPR); + + container.appendChild(canvas); + + return { canvas, context }; +} + +export function clearCanvas(canvas, context) { + context.clearRect(0, 0, canvas.width, canvas.height); +} diff --git a/src/lib/lovely-chart/captureEvents.js b/src/lib/lovely-chart/captureEvents.js new file mode 100644 index 000000000..1eca9a6b5 --- /dev/null +++ b/src/lib/lovely-chart/captureEvents.js @@ -0,0 +1,79 @@ +import { addEventListener, removeEventListener } from './minifiers'; +import { LONG_PRESS_TIMEOUT } from './constants'; + +export function captureEvents(element, options) { + let captureEvent = null; + let longPressTimeout = null; + + function onCapture(e) { + captureEvent = e; + + if (e.type === 'mousedown') { + addEventListener(document, 'mousemove', onMove); + addEventListener(document, 'mouseup', onRelease); + } else if (e.type === 'touchstart') { + addEventListener(document, 'touchmove', onMove); + addEventListener(document, 'touchend', onRelease); + addEventListener(document, 'touchcancel', onRelease); + + // https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad + // Android does not have this value, and iOS has it but as read-only. + if (e.pageX === undefined) { + e.pageX = e.touches[0].pageX; + } + } + + if (options.draggingCursor) { + document.documentElement.classList.add(`cursor-${options.draggingCursor}`); + } + + options.onCapture && options.onCapture(e); + + if (options.onLongPress) { + longPressTimeout = setTimeout(() => options.onLongPress(), LONG_PRESS_TIMEOUT); + } + } + + function onRelease(e) { + if (captureEvent) { + if (longPressTimeout) { + clearTimeout(longPressTimeout); + longPressTimeout = null; + } + + if (options.draggingCursor) { + document.documentElement.classList.remove(`cursor-${options.draggingCursor}`); + } + + removeEventListener(document, 'mouseup', onRelease); + removeEventListener(document, 'mousemove', onMove); + removeEventListener(document, 'touchcancel', onRelease); + removeEventListener(document, 'touchend', onRelease); + removeEventListener(document, 'touchmove', onMove); + + captureEvent = null; + + options.onRelease && options.onRelease(e); + } + } + + function onMove(e) { + if (captureEvent) { + if (longPressTimeout) { + clearTimeout(longPressTimeout); + longPressTimeout = null; + } + + if (e.type === 'touchmove' && e.pageX === undefined) { + e.pageX = e.touches[0].pageX; + } + + options.onDrag && options.onDrag(e, captureEvent, { + dragOffsetX: e.pageX - captureEvent.pageX, + }); + } + } + + addEventListener(element, 'mousedown', onCapture); + addEventListener(element, 'touchstart', onCapture); +} diff --git a/src/lib/lovely-chart/constants.js b/src/lib/lovely-chart/constants.js new file mode 100644 index 000000000..8a7205f18 --- /dev/null +++ b/src/lib/lovely-chart/constants.js @@ -0,0 +1,62 @@ +export const DPR = window.devicePixelRatio || 1; + +export const DEFAULT_RANGE = { begin: 0.8, end: 1 }; +export const TRANSITION_DEFAULT_DURATION = 300; +export const LONG_PRESS_TIMEOUT = 500; + +export const GUTTER = 10; +export const PLOT_HEIGHT = 320; +export const PLOT_TOP_PADDING = 15; +export const PLOT_LINE_WIDTH = 2; +export const PLOT_PIE_RADIUS_FACTOR = 0.9 / 2; +export const PLOT_PIE_SHIFT = 10; +export const PLOT_BARS_WIDTH_SHIFT = 0.5; + +export const BALLOON_OFFSET = 20; + +export const AXES_FONT = '300 10px Helvetica, Arial, sans-serif'; +export const AXES_MAX_COLUMN_WIDTH = 45; +export const AXES_MAX_ROW_HEIGHT = 50; +export const X_AXIS_HEIGHT = 30; +export const X_AXIS_SHIFT_START = 1; +export const Y_AXIS_ZERO_BASED_THRESHOLD = 0.1; + +export const MINIMAP_HEIGHT = 40; +export const MINIMAP_MARGIN = 10; +export const MINIMAP_LINE_WIDTH = 1; +export const MINIMAP_EAR_WIDTH = 8; +export const MINIMAP_MAX_ANIMATED_DATASETS = 4; + +export const ZOOM_TIMEOUT = TRANSITION_DEFAULT_DURATION; +export const ZOOM_RANGE_DELTA = 0.1; +export const ZOOM_RANGE_MIDDLE = .5; + +export const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; +export const WEEK_DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; +export const WEEK_DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + +export const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000; + +export const SPEED_TEST_INTERVAL = 200; +export const SPEED_TEST_FAST_FPS = 4; + +export const SIMPLIFIER_MIN_POINTS = 1000; +export const SIMPLIFIER_PLOT_FACTOR = 1; +export const SIMPLIFIER_MINIMAP_FACTOR = 0.5; + +export const ANIMATE_PROPS = [ + // Viewport X-axis + 'begin 200 fast', 'end 200 fast', 'labelFromIndex 200 fast floor', 'labelToIndex 200 fast ceil', + + // X-axis labels + 'xAxisScale 400', + + // Viewport Y-axis + 'yMinViewport', 'yMaxViewport', 'yMinViewportSecond', 'yMaxViewportSecond', + + // Minimap Y-axis + 'yMinMinimap', 'yMaxMinimap', 'yMinMinimapSecond', 'yMaxMinimapSecond', + + // Y-axis labels + 'yAxisScale', 'yAxisScaleSecond', +]; diff --git a/src/lib/lovely-chart/data.js b/src/lib/lovely-chart/data.js new file mode 100644 index 000000000..f6dc150a1 --- /dev/null +++ b/src/lib/lovely-chart/data.js @@ -0,0 +1,84 @@ +import { getMaxMin } from './utils'; +import { buildDayLabels, buildTimeLabels, buildTextLabels } from './format'; + +export function analyzeData(data) { + const { title, labelType, isStacked, isPercentage, hasSecondYAxis, onZoom } = data; + const { datasets, labels } = prepareDatasets(data); + + const colors = {}; + let totalYMin = Infinity; + let totalYMax = -Infinity; + datasets.forEach(({ key, color, yMin, yMax }) => { + colors[key] = color; + + if (yMin < totalYMin) { + totalYMin = yMin; + } + + if (yMax > totalYMax) { + totalYMax = yMax; + } + }); + + let xLabels; + switch (labelType) { + case 'hour': + xLabels = buildTimeLabels(labels); + break; + case 'text': + xLabels = buildTextLabels(labels); + break; + default: + xLabels = buildDayLabels(labels); + break; + } + + const analyzed = { + title, + labelType, + xLabels, + datasets, + isStacked, + isPercentage, + hasSecondYAxis, + onZoom, + isLines: data.type === 'line', + isBars: data.type === 'bar', + isAreas: data.type === 'area', + isPie: data.type === 'pie', + yMin: totalYMin, + yMax: totalYMax, + colors, + }; + + analyzed.shouldZoomToPie = !analyzed.onZoom && analyzed.isPercentage; + analyzed.isZoomable = analyzed.onZoom || analyzed.shouldZoomToPie; + + return analyzed; +} + +function prepareDatasets(data) { + const { type, labels, datasets, hasSecondYAxis } = data; + + return { + labels: cloneArray(labels), + datasets: datasets.map(({ name, color, values }, i) => { + const { min: yMin, max: yMax } = getMaxMin(values); + + return { + type, + key: `y${i}`, + name, + color, + values: cloneArray(values), + hasOwnYAxis: hasSecondYAxis && i === datasets.length - 1, + yMin, + yMax, + }; + }), + }; +} + +function cloneArray(array) { + return array.slice(0); +} diff --git a/src/lib/lovely-chart/drawDatasets.js b/src/lib/lovely-chart/drawDatasets.js new file mode 100644 index 000000000..891572a93 --- /dev/null +++ b/src/lib/lovely-chart/drawDatasets.js @@ -0,0 +1,229 @@ +import { getCssColor } from './skin'; +import { mergeArrays } from './utils'; +import { getPieRadius, getPieTextShift, getPieTextSize } from './formulas'; +import { PLOT_BARS_WIDTH_SHIFT, PLOT_PIE_SHIFT } from './constants'; +import { simplify } from './simplify'; +import { toPixels } from './Projection'; + +export function drawDatasets( + context, state, data, + range, points, projection, secondaryPoints, secondaryProjection, + lineWidth, visibilities, colors, pieToBar, simplification, +) { + data.datasets.forEach(({ key, type, hasOwnYAxis }, i) => { + if (!visibilities[i]) { + return; + } + + const options = { + color: getCssColor(colors, `dataset#${key}`), + lineWidth, + opacity: data.isStacked ? 1 : visibilities[i], + simplification, + }; + + const datasetType = type === 'pie' && pieToBar ? 'bar' : type; + let datasetPoints = hasOwnYAxis ? secondaryPoints : points[i]; + let datasetProjection = hasOwnYAxis ? secondaryProjection : projection; + + if (datasetType === 'area') { + const { yMin, yMax } = projection.getParams(); + const yHeight = yMax - yMin; + const bottomLine = [ + { labelIndex: range.from, stackValue: 0 }, + { labelIndex: range.to, stackValue: 0 }, + ]; + const topLine = [ + { labelIndex: range.to, stackValue: yHeight }, + { labelIndex: range.from, stackValue: yHeight }, + ]; + + datasetPoints = mergeArrays([points[i - 1] || bottomLine, topLine]); + } + + if (datasetType === 'pie') { + options.center = projection.getCenter(); + options.radius = getPieRadius(projection); + options.pointerVector = state.focusOn; + } + + if (datasetType === 'bar') { + const [x0] = toPixels(projection, 0, 0); + const [x1] = toPixels(projection, 1, 0); + + options.lineWidth = x1 - x0; + options.focusOn = state.focusOn; + } + + drawDataset(datasetType, context, datasetPoints, datasetProjection, options); + }); + + if (state.focusOn && data.isBars) { + const [x0] = toPixels(projection, 0, 0); + const [x1] = toPixels(projection, 1, 0); + + drawBarsMask(context, projection, { + focusOn: state.focusOn, + color: getCssColor(colors, 'mask'), + lineWidth: x1 - x0, + }); + } +} + +function drawDataset(type, ...args) { + switch (type) { + case 'line': + return drawDatasetLine(...args); + case 'bar': + return drawDatasetBars(...args); + case 'area': + return drawDatasetArea(...args); + case 'pie': + return drawDatasetPie(...args); + } +} + +function drawDatasetLine(context, points, projection, options) { + context.beginPath(); + + let pixels = []; + + for (let j = 0, l = points.length; j < l; j++) { + const { labelIndex, stackValue } = points[j]; + pixels.push(toPixels(projection, labelIndex, stackValue)); + } + + if (options.simplification) { + const simplifierFn = simplify(pixels); + pixels = simplifierFn(options.simplification).points; + } + + pixels.forEach(([x, y]) => { + context.lineTo(x, y); + }); + + context.save(); + context.strokeStyle = options.color; + context.lineWidth = options.lineWidth; + context.globalAlpha = options.opacity; + context.lineJoin = 'bevel'; + context.lineCap = 'butt'; + context.stroke(); + context.restore(); +} + +// TODO try areas +function drawDatasetBars(context, points, projection, options) { + const { yMin } = projection.getParams(); + + context.save(); + context.globalAlpha = options.opacity; + context.fillStyle = options.color; + + for (let j = 0, l = points.length; j < l; j++) { + const { labelIndex, stackValue, stackOffset = 0 } = points[j]; + + const [, yFrom] = toPixels(projection, labelIndex, Math.max(stackOffset, yMin)); + const [x, yTo] = toPixels(projection, labelIndex, stackValue); + const rectX = x - options.lineWidth / 2; + const rectY = yTo; + const rectW = options.opacity === 1 ? + options.lineWidth + PLOT_BARS_WIDTH_SHIFT : + options.lineWidth + PLOT_BARS_WIDTH_SHIFT * options.opacity; + const rectH = yFrom - yTo; + + context.fillRect(rectX, rectY, rectW, rectH); + } + + context.restore(); +} + +function drawBarsMask(context, projection, options) { + const [xCenter, yCenter] = projection.getCenter(); + const [width, height] = projection.getSize(); + + const [x] = toPixels(projection, options.focusOn, 0); + + context.fillStyle = options.color; + context.fillRect(xCenter - width / 2, yCenter - height / 2, x - options.lineWidth / 2 + PLOT_BARS_WIDTH_SHIFT, height); + context.fillRect(x + options.lineWidth / 2, yCenter - height / 2, width - (x + options.lineWidth / 2), height); +} + +function drawDatasetArea(context, points, projection, options) { + context.beginPath(); + + let pixels = []; + + for (let j = 0, l = points.length; j < l; j++) { + const { labelIndex, stackValue } = points[j]; + pixels.push(toPixels(projection, labelIndex, stackValue)); + } + + if (options.simplification) { + const simplifierFn = simplify(pixels); + pixels = simplifierFn(options.simplification).points; + } + + pixels.forEach(([x, y]) => { + context.lineTo(x, y); + }); + + context.save(); + context.fillStyle = options.color; + context.lineWidth = options.lineWidth; + context.globalAlpha = options.opacity; + context.lineJoin = 'bevel'; + context.lineCap = 'butt'; + context.fill(); + context.restore(); +} + +function drawDatasetPie(context, points, projection, options) { + const { visibleValue, stackValue, stackOffset = 0 } = points[0]; + + if (!visibleValue) { + return; + } + + const { yMin, yMax } = projection.getParams(); + const percentFactor = 1 / (yMax - yMin); + const percent = visibleValue * percentFactor; + + const beginAngle = stackOffset * percentFactor * Math.PI * 2 - Math.PI / 2; + const endAngle = stackValue * percentFactor * Math.PI * 2 - Math.PI / 2; + + const { radius = 120, center: [x, y], pointerVector } = options; + + const shift = ( + pointerVector && + beginAngle <= pointerVector.angle && + pointerVector.angle < endAngle && + pointerVector.distance <= radius + ) ? PLOT_PIE_SHIFT : 0; + + const shiftAngle = (beginAngle + endAngle) / 2; + const directionX = Math.cos(shiftAngle); + const directionY = Math.sin(shiftAngle); + const shiftX = directionX * shift; + const shiftY = directionY * shift; + + context.save(); + + context.beginPath(); + context.fillStyle = options.color; + context.moveTo(x + shiftX, y + shiftY); + context.arc(x + shiftX, y + shiftY, radius, beginAngle, endAngle); + context.lineTo(x + shiftX, y + shiftY); + context.fill(); + + context.font = `700 ${getPieTextSize(percent, radius)}px Helvetica, Arial, sans-serif`; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = 'white'; + const textShift = getPieTextShift(percent, radius); + context.fillText( + `${Math.round(percent * 100)}%`, x + directionX * textShift + shiftX, y + directionY * textShift + shiftY, + ); + + context.restore(); +} diff --git a/src/lib/lovely-chart/format.js b/src/lib/lovely-chart/format.js new file mode 100644 index 000000000..50da3ffb8 --- /dev/null +++ b/src/lib/lovely-chart/format.js @@ -0,0 +1,81 @@ +import { MONTHS, WEEK_DAYS, WEEK_DAYS_SHORT } from './constants'; + +export function buildDayLabels(labels) { + return labels.map((value) => { + const date = new Date(value); + const day = date.getDate(); + const month = MONTHS[date.getMonth()]; + + return ({ + value, + text: `${day} ${month}`, + }); + }); +} + +export function buildTimeLabels(labels) { + return labels.map((value) => { + const date = new Date(value); + const hours = date.getUTCHours(); + const minutes = date.getUTCMinutes(); + + return ({ + value, + text: `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}`, + }); + }); +} + +export function buildTextLabels(labels) { + return labels.map((value, i) => { + return ({ + value: i, + text: value, + }); + }); +} + +export function humanize(value, decimals = 1) { + if (value >= 1e6) { + return keepThreeDigits(value / 1e6, decimals) + 'M'; + } else if (value >= 1e3) { + return keepThreeDigits(value / 1e3, decimals) + 'K'; + } + + return value; +} + +// TODO perf +function keepThreeDigits(value, decimals) { + return value + .toFixed(decimals) + .replace(/(\d{3,})\.\d+/, '$1') + .replace(/\.0+$/, ''); +} + +export function formatInteger(n) { + return String(n).replace(/\d(?=(\d{3})+$)/g, '$& '); +} + +export function getFullLabelDate(label, { isShort = false } = {}) { + return getLabelDate(label, { isShort, displayWeekDay: true }); +} + +export function getLabelDate(label, { isShort = false, displayWeekDay = false, displayYear = true, displayHours = false } = {}) { + const { value } = label; + const date = new Date(value); + const weekDaysArray = isShort ? WEEK_DAYS_SHORT : WEEK_DAYS; + + let string = `${date.getUTCDate()} ${MONTHS[date.getUTCMonth()]}`; + if (displayWeekDay) { + string = `${weekDaysArray[date.getUTCDay()]}, ` + string; + } + if (displayYear) { + string += ` ${date.getUTCFullYear() + 1}`; + } + if (displayHours) { + string += `, ${('0' + date.getUTCHours()).slice(-2)}:${('0' + date.getUTCMinutes()).slice(-2)}` + } + + return string; +} diff --git a/src/lib/lovely-chart/formulas.js b/src/lib/lovely-chart/formulas.js new file mode 100644 index 000000000..15684a72c --- /dev/null +++ b/src/lib/lovely-chart/formulas.js @@ -0,0 +1,56 @@ +import { GUTTER, PLOT_PIE_RADIUS_FACTOR, MILISECONDS_IN_DAY, SIMPLIFIER_MIN_POINTS } from './constants'; + +export function xScaleLevelToStep(scaleLevel) { + return Math.pow(2, scaleLevel); +} + +export function xStepToScaleLevel(step) { + return Math.ceil(Math.log2(step || 1)); +} + +const SCALE_LEVELS = [ + 1, 2, 8, 18, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000, 100000, + 250000, 500000, 1000000, 2500000, 5000000, 10000000, 25000000, 50000000, 100000000, +]; + +export function yScaleLevelToStep(scaleLevel) { + return SCALE_LEVELS[scaleLevel] || SCALE_LEVELS[SCALE_LEVELS.length - 1]; +} + +export function yStepToScaleLevel(neededStep) { + return SCALE_LEVELS.findIndex((step) => step >= neededStep) || SCALE_LEVELS.length - 1; +} + +export function applyYEdgeOpacity(opacity, xPx, plotWidth) { + const edgeOffset = Math.min(xPx + GUTTER, plotWidth - xPx); + if (edgeOffset <= GUTTER * 4) { + opacity = Math.min(1, opacity, edgeOffset / (GUTTER * 4)); + } + return opacity; +} + +export function applyXEdgeOpacity(opacity, yPx) { + return (yPx - GUTTER <= GUTTER * 2) + ? Math.min(1, opacity, (yPx - GUTTER) / (GUTTER * 2)) + : opacity; +} + +export function getPieRadius(projection) { + return Math.min(...projection.getSize()) * PLOT_PIE_RADIUS_FACTOR; +} + +export function getPieTextSize(percent, radius) { + return (radius + percent * 200) / 10; +} + +export function getPieTextShift(percent, radius, shift) { + return percent >= 0.99 ? 0 : Math.min(1 - Math.log(percent * 30) / 5, 4 / 5) * radius; +} + +export function isDataRange(labelFrom, labelTo) { + return Math.abs(labelTo.value - labelFrom.value) > MILISECONDS_IN_DAY; +} + +export function getSimplificationDelta(pointsLength) { + return pointsLength >= SIMPLIFIER_MIN_POINTS ? Math.min((pointsLength / 1000), 1) : 0; +} diff --git a/src/lib/lovely-chart/hideOnScroll.js b/src/lib/lovely-chart/hideOnScroll.js new file mode 100644 index 000000000..03b5c1220 --- /dev/null +++ b/src/lib/lovely-chart/hideOnScroll.js @@ -0,0 +1,42 @@ +import { debounce } from './utils'; + +export const hideOnScroll = (() => { + const chartEls = []; + const showAllDebounced = debounce(showAll, 500, true, false); + const hideScrolledDebounced = debounce(hideScrolled, 500, false, true); + + function setup(chartEl) { + chartEls.push(chartEl); + + if (chartEls.length === 1) { + window.onscroll = () => { + showAllDebounced(); + hideScrolledDebounced(); + }; + } else { + hideScrolledDebounced(); + } + } + + function showAll() { + chartEls.forEach((chartEl) => { + chartEl.classList.remove('lovely-chart--state-invisible'); + }); + } + + function hideScrolled() { + chartEls.forEach((chartEl) => { + const { top, bottom } = chartEl.getBoundingClientRect(); + const shouldHide = bottom < 0 || top > window.innerHeight; + + if (!chartEl.classList.contains('lovely-chart--state-invisible')) { + chartEl.style.width = `${chartEl.scrollWidth}px`; + chartEl.style.height = `${chartEl.scrollHeight}px`; + } + + chartEl.classList.toggle('lovely-chart--state-invisible', shouldHide); + }); + } + + return setup; +})(); diff --git a/src/lib/lovely-chart/minifiers.js b/src/lib/lovely-chart/minifiers.js new file mode 100644 index 000000000..4bff89259 --- /dev/null +++ b/src/lib/lovely-chart/minifiers.js @@ -0,0 +1,11 @@ +export const createElement = (tagName = 'div') => { + return document.createElement(tagName); +}; + +export function addEventListener(element, event, cb) { + element.addEventListener(event, cb); +} + +export function removeEventListener(element, event, cb) { + element.removeEventListener(event, cb); +} diff --git a/src/lib/lovely-chart/preparePoints.js b/src/lib/lovely-chart/preparePoints.js new file mode 100644 index 000000000..97d3487a1 --- /dev/null +++ b/src/lib/lovely-chart/preparePoints.js @@ -0,0 +1,79 @@ +import { sumArrays } from './utils'; + +export function preparePoints(data, datasets, range, visibilities, bounds, pieToArea) { + let values = datasets.map(({ values }) => ( + values.slice(range.from, range.to + 1) + )); + + if (data.isPie && !pieToArea) { + values = prepareSumsByX(values); + } + + const points = values.map((datasetValues, i) => ( + datasetValues.map((value, j) => { + let visibleValue = value; + + if (data.isStacked) { + visibleValue *= visibilities[i]; + } + + return { + labelIndex: range.from + j, + value, + visibleValue, + stackOffset: 0, + stackValue: visibleValue, + }; + }) + )); + + if (data.isPercentage) { + preparePercentage(points, bounds); + } + + if (data.isStacked) { + prepareStacked(points); + } + + return points; +} + +function getSumsByY(points) { + return sumArrays(points.map((datasetPoints) => ( + datasetPoints.map(({ visibleValue }) => visibleValue) + ))); +} + +// TODO perf cache for [0..1], use in state +function preparePercentage(points, bounds) { + const sumsByY = getSumsByY(points); + + points.forEach((datasetPoints) => { + datasetPoints.forEach((point, j) => { + point.percent = point.visibleValue / sumsByY[j]; + point.visibleValue = point.percent * bounds.yMax; + }); + }); +} + +function prepareStacked(points) { + const accum = []; + + points.forEach((datasetPoints) => { + datasetPoints.forEach((point, j) => { + if (accum[j] === undefined) { + accum[j] = 0; + } + + point.stackOffset = accum[j]; + accum[j] += point.visibleValue; + point.stackValue = accum[j]; + }); + }); +} + +function prepareSumsByX(values) { + return values.map((datasetValues) => ( + [datasetValues.reduce((sum, value) => sum + value, 0)] + )); +} diff --git a/src/lib/lovely-chart/simplify.js b/src/lib/lovely-chart/simplify.js new file mode 100644 index 000000000..6b172dfbc --- /dev/null +++ b/src/lib/lovely-chart/simplify.js @@ -0,0 +1,201 @@ +export const simplify = (() => { + function simplify(points, indexes, fixedPoints) { + if (points.length < 6) { + return function () { + return { + points: points, + indexes: indexes, + removed: [], + }; + }; + } + + let worker = precalculate(points, fixedPoints); + + return function (delta) { + let result = [], + resultIndexes = [], + removed = []; + + let delta2 = delta * delta, + markers = worker(delta2); + + for (let i = 0, l = points.length; i < l; i++) { + if (markers[i] >= delta2 || i == 0 || i == l - 1) { + result.push(points[i]); + resultIndexes.push(indexes ? indexes[i] : i); + } else { + removed.push(i); + } + } + return { + points: result, + indexes: resultIndexes, + removed: removed, + }; + }; + } + + let E1 = 1.0 / Math.pow(2, 22), // максимальная дельта + MAXLIMIT = 100000; + + function precalculate(points, fixedPoints) { + + let len = points.length, + distances = [], + queue = [], + maximumDelta; + for (let i = 0, l = points.length; i < l; ++i) { + distances[i] = 0; + } + + if (!fixedPoints) { + fixedPoints = []; + } + + //инициализируем дерево срединным значением + //чтобы не попадает в ситуации когда начало линии близко к концу(те полигон) + //и правильные расчеты сложны + let subdivisionTree = 0; + + for (let i = 0, l = fixedPoints.length; i < l; ++i) { + distances[fixedPoints[i]] = MAXLIMIT; + } + + + function worker(params) { + + let start = params.start, + end = params.end, + record = params.record, + currentLimit = params.currentLimit, + usedDistance = 0; + + if (!record) { + //let deltaShifts = getDeltaShifts(points); + let usedIndex = -1, + vector = [ + points[end][0] - points[start][0], + points[end][1] - points[start][1], + ]; + for (let i = 0, l = fixedPoints.length; i < l; ++i) { + let fixId = fixedPoints[i]; + if (fixId > start) { + if (fixId < end) { + usedIndex = fixId; + usedDistance = MAXLIMIT; + break; + } else { + break; + } + } + } + if (usedIndex < 0) { + if (Math.abs(vector[0]) > E1 || Math.abs(vector[1]) > E1) { + let vectorLength = vector[0] * vector[0] + vector[1] * vector[1], + vectorLength_1 = +1.0 / vectorLength; + + for (let i = start + 1; i < end; ++i) { + let segmentDistance = pointToSegmentDistanceSquare(points[i], points[start], points[end], vector, vectorLength_1); + + if (segmentDistance > usedDistance) { + usedIndex = i; + usedDistance = segmentDistance; + } + } + + } else { + //фиксируем на среднинной точке + usedIndex = Math.round((start + end) * 0.5); + usedDistance = currentLimit; + } + distances[usedIndex] = usedDistance; + } + record = { + start: start, + end: end, + index: usedIndex, + distance: usedDistance, + }; + } + + if (record.index && record.distance > maximumDelta) { + if (record.index - start >= 2) { + queue.push({ + start: start, + end: record.index, + record: record.left, + currentLimit: record.distance, + parent: record, + parentProperty: 'left', + }); + } + if (end - record.index >= 2) { + queue.push({ + start: record.index, + end: end, + record: record.right, + currentLimit: record.distance, + parent: record, + parentProperty: 'right', + }); + } + } + + return record; + } + + function tick() { + let request = queue.pop(), + result = worker(request); + + if (request.parent && request.parentProperty) { + request.parent[request.parentProperty] = result; + } + + return result; + } + + return function (delta) { + maximumDelta = delta; + queue.push({ + start: 0, + end: len - 1, + record: subdivisionTree, + currentLimit: MAXLIMIT, + }); + subdivisionTree = tick(); + + while (queue.length) { + tick(); + } + + return distances; + }; + + } + + function pointToSegmentDistanceSquare(p, v1, v2, dv, dvlen_1) { + + let t; + let vx = +v1[0], + vy = +v1[1]; + + t = +((p[0] - vx) * dv[0] + (p[1] - vy) * dv[1]) * (dvlen_1); + + if (t > 1) { + vx = +v2[0]; + vy = +v2[1]; + } else if (t > 0) { + vx += +dv[0] * t; + vy += +dv[1] * t; + } + + let a = +p[0] - vx, + b = +p[1] - vy; + + return +a * a + b * b; + } + + return simplify; +})(); diff --git a/src/lib/lovely-chart/skin.js b/src/lib/lovely-chart/skin.js new file mode 100644 index 000000000..87504f243 --- /dev/null +++ b/src/lib/lovely-chart/skin.js @@ -0,0 +1,90 @@ +function detectSkin() { + return document.documentElement.classList.contains('dark') ? 'skin-night' : 'skin-day'; +} + +let skin = detectSkin(); + +const COLORS = { + 'skin-day': { + 'background': '#FFFFFF', + 'text-color': '#222222', + 'minimap-mask': '#E2EEF9/0.6', + 'minimap-slider': '#C0D1E1', + 'grid-lines': '#182D3B/0.1', + 'zoom-out-text': '#108BE3', + 'tooltip-background': '#FFFFFF', + 'tooltip-arrow': '#D2D5D7', + 'mask': '#FFFFFF/0.5', + 'x-axis-text': '#252529/0.6', + 'y-axis-text': '#252529/0.6', + }, + 'skin-night': { + 'background': '#242F3E', + 'text-color': '#FFFFFF', + 'minimap-mask': '#304259/0.6', + 'minimap-slider': '#56626D', + 'grid-lines': '#FFFFFF/0.1', + 'zoom-out-text': '#48AAF0', + 'tooltip-background': '#1c2533', + 'tooltip-arrow': '#D2D5D7', + 'mask': '#242F3E/0.5', + 'x-axis-text': '#A3B1C2/0.6', + 'y-axis-text': '#A3B1C2/0.6', + }, +}; + +const styleElement = document.createElement('style'); +styleElement.type = 'text/css'; +styleElement.appendChild(document.createTextNode('')); +document.head.appendChild(styleElement); +const styleSheet = styleElement.sheet; + +document.documentElement.addEventListener('darkmode', () => { + skin = detectSkin(); +}); + +export function createColors(datasetColors) { + const colors = {}; + const baseClass = `.lovely-chart--color`; + + ['skin-day', 'skin-night'].forEach((skin) => { + colors[skin] = {}; + + Object.keys(COLORS[skin]).forEach((prop) => { + colors[skin][prop] = hexToChannels(COLORS[skin][prop]); + }); + + Object.keys(datasetColors).forEach((key) => { + colors[skin][`dataset#${key}`] = hexToChannels(datasetColors[key]); + + addCssRule(styleSheet, `.lovely-chart--tooltip-dataset-value${baseClass}-${datasetColors[key].slice(1)}`, `color: ${datasetColors[key]}`); + addCssRule(styleSheet, `.lovely-chart--button${baseClass}-${datasetColors[key].slice(1)}`, `border-color: ${datasetColors[key]}; color: ${datasetColors[key]}`); + addCssRule(styleSheet, `.lovely-chart--button.lovely-chart--state-checked${baseClass}-${datasetColors[key].slice(1)}`, `background-color: ${datasetColors[key]}`); + }); + }); + + return colors; +} + +export function getCssColor(colors, key, opacity) { + return buildCssColor(colors[skin][key], opacity); +} + +function hexToChannels(hexWithAlpha) { + const [hex, alpha] = hexWithAlpha.replace('#', '').split('/'); + + return [ + parseInt(hex.slice(0, 2), 16), + parseInt(hex.slice(2, 4), 16), + parseInt(hex.slice(4, 6), 16), + alpha ? parseFloat(alpha) : 1, + ]; +} + +function buildCssColor([r, g, b, a = 1], opacity = 1) { + return `rgba(${r}, ${g}, ${b}, ${a * opacity})`; +} + +function addCssRule(sheet, selector, rule) { + sheet.insertRule(`${selector} { ${rule} }`, sheet.cssRules.length); +} diff --git a/src/lib/lovely-chart/styles/_animations.scss b/src/lib/lovely-chart/styles/_animations.scss new file mode 100644 index 000000000..0c55b280e --- /dev/null +++ b/src/lib/lovely-chart/styles/_animations.scss @@ -0,0 +1,124 @@ +@keyframes lovely-chart--animation-shake { + 0% { + transform: translateX(-3px); + } + + 16.66% { + transform: translateX(3px); + } + + 33.33% { + transform: translateX(-2px); + } + + 50% { + transform: translateX(2px); + } + + 66.66% { + transform: translateX(-1px); + } + + 83.33% { + transform: translateX(1px); + } + + 100% { + transform: translateX(0); + } +} + +@keyframes lovely-chart--animation-fadeIn { + from { + opacity: 0; + transform: scale3d(.5, .5, 1); + } + + 40% { + transform: scale3d(.75, .75, 1); + } + + to { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} + +@keyframes lovely-chart--animation-fadeOut { + from { + opacity: 1; + transform: scale3d(1, 1, 1); + } + + 60% { + transform: scale3d(.75, .75, 1); + } + + to { + opacity: 0; + transform: scale3d(.5, .5, 1); + } +} + +@keyframes lovely-chart--animation-spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg) + } +} + +.lovely-chart--transition-container { + position: relative; +} + +.lovely-chart--transition { + position: absolute; + top: 0; + bottom: 0; + + &.lovely-chart--position-top { + transform-origin: top left; + + &.lovely-chart--position-right { + transform-origin: top right; + } + } + + &.lovely-chart--position-bottom { + transform-origin: bottom left; + + &.lovely-chart--position-right { + transform-origin: bottom right; + } + } + + &.lovely-chart--position-left { + left: 0; + } + + &.lovely-chart--position-right { + right: 0; + } + + &.lovely-chart--state-hidden { + opacity: 0; + } +} + +.lovely-chart--state-animated { + animation-fill-mode: forwards; + animation-timing-function: ease-out; + animation-duration: 200ms; + + &.lovely-chart--state-hidden { + animation-name: lovely-chart--animation-fadeOut; + animation-duration: 300ms; + } + + &:not(.lovely-chart--state-hidden) { + animation-name: lovely-chart--animation-fadeIn; + } +} diff --git a/src/lib/lovely-chart/styles/_buttons.scss b/src/lib/lovely-chart/styles/_buttons.scss new file mode 100644 index 000000000..345bb6279 --- /dev/null +++ b/src/lib/lovely-chart/styles/_buttons.scss @@ -0,0 +1,67 @@ +.lovely-chart--button { + border: 1px solid #E6ECF0; + background-color: transparent; + padding: 7px 7px; + display: inline-block; + border-radius: 18px; + text-align: center; + text-decoration: none; + margin: 0 6px 8px 0; + // transition: background-color 300ms ease-out, border-color 300ms ease-out; + position: relative; + + border-color: var(--text-color); + background: transparent; + color: var(--text-color); + + &.lovely-chart--state-checked { + background-color: var(--text-color); + animation-duration: 500ms; + + .lovely-chart--button-check { + opacity: 1; + } + + .lovely-chart--button-label { + color: #ffffff; + transform: translateX(6px); + } + } + + &.lovely-chart--state-shake { + animation-name: lovely-chart--animation-shake; + } +} + +.lovely-chart--button-check { + display: inline-block; + position: absolute; + top: 7px; + left: 7px; + width: 20px; + height: 20px; + opacity: 0; + transition: opacity 300ms ease-out; + + &::after { + position: absolute; + top: 50%; + left: 50%; + content: ''; + width: 12px; + height: 12px; + margin-left: -6px; + margin-top: -6px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -256 1792 1792' version='1.1'%0A%3E%3Cg transform='matrix(1,0,0,-1,7.5932203,1217.0847)' id='g3003'%3E%3Cpath d='m 1671,970 q 0,-40 -28,-68 L 919,178 783,42 Q 755,14 715,14 675,14 647,42 L 511,178 149,540 q -28,28 -28,68 0,40 28,68 l 136,136 q 28,28 68,28 40,0 68,-28 l 294,-295 656,657 q 28,28 68,28 40,0 68,-28 l 136,-136 q 28,-28 28,-68 z' style='fill:white'/%3E%3C/g%3E%3C/svg%3E"); + background-size: 100%; + } +} + +.lovely-chart--button-label { + display: inline-block; + font-weight: 300; + line-height: 20px; + color: inherit; + padding: 0 13px; + transition: transform 300ms ease-out, color 300ms ease-out; +} diff --git a/src/lib/lovely-chart/styles/_common.scss b/src/lib/lovely-chart/styles/_common.scss new file mode 100644 index 000000000..37f43fd0e --- /dev/null +++ b/src/lib/lovely-chart/styles/_common.scss @@ -0,0 +1,152 @@ +.lovely-chart--container { + font: 300 13px '-apple-system', 'HelveticaNeue', Helvetica, Arial, sans-serif; + color: #222222; + position: relative; + text-align: left; + overflow: hidden; + user-select: none; + -webkit-user-select: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + + &.lovely-chart--state-invisible > * { + display: none; + } + + > canvas, + .lovely-chart--tooltip canvas { + margin-top: 10px; + } +} + +.lovely-chart--container-type-pie { + &.lovely-chart--state-animating { + > canvas { + transform-origin: center calc(50% - 7.5px); + } + + &.lovely-chart--state-zoomed-in > canvas { + animation: lovely-chart--animation-pie-transition-in 0.6s; + animation-timing-function: ease-out; + } + + &:not(.lovely-chart--state-zoomed-in) > canvas { + animation: lovely-chart--animation-pie-transition-out 0.55s; + animation-timing-function: ease-in; + } + } +} + +@keyframes lovely-chart--animation-pie-transition-in { + 0% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 25% { + clip-path: circle(32% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(32% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 75% { + clip-path: circle(32% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(32% at center calc(50% - 7.5px)); + transform: rotate(0); + } +} + +@media (max-width: 480px) { + @keyframes lovely-chart--animation-pie-transition-in { + 0% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 25% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(-360deg); + } + + 75% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(0); + } + } +} + +@keyframes lovely-chart--animation-pie-transition-out { + 0% { + clip-path: circle(32% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(32% at center calc(50% - 7.5px)); + transform: rotate(360deg); + } + + 50% { + clip-path: circle(32% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(32% at center calc(50% - 7.5px)); + transform: rotate(0); + } + + 75% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(0); + } +} + +@media (max-width: 480px) { + @keyframes lovely-chart--animation-pie-transition-out { + 0% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(360deg); + } + + 50% { + clip-path: circle(40% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(40% at center calc(50% - 7.5px)); + transform: rotate(0); + } + + 75% { + clip-path: circle(80% at center calc(50% - 7.5px)); + -webkit-clip-path: circle(80% at center calc(50% - 7.5px)); + transform: rotate(0); + } + } +} + +html.cursor-ew-resize, html.cursor-ew-resize * { + cursor: ew-resize !important; +} + +html.cursor-grabbing, html.cursor-grabbing * { + cursor: grabbing !important; +} + +.lovely-chart--spinner { + width: 16px; + height: 16px; + position: relative; + + &.lovely-chart--size-big { + width: 64px; + height: 64px; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' width='512px' height='512px' viewBox='0 0 16 16'%3E%3Cg%3E%3Cpath fill='%23D2D5D7' d='M9.9 0.2l-0.2 1c3 0.8 5.3 3.5 5.3 6.8 0 3.9-3.1 7-7 7s-7-3.1-7-7c0-3.3 2.3-6 5.3-6.8l-0.2-1c-3.5 0.9-6.1 4.1-6.1 7.8 0 4.4 3.6 8 8 8s8-3.6 8-8c0-3.7-2.6-6.9-6.1-7.8z' data-original='%23444444' class='active-path' data-old_color='%23444444'/%3E%3C/g%3E%3C/svg%3E%0A"); + background-size: 100%; + animation: lovely-chart--animation-spin 1s infinite linear; + } +} diff --git a/src/lib/lovely-chart/styles/_header.scss b/src/lib/lovely-chart/styles/_header.scss new file mode 100644 index 000000000..6a6334439 --- /dev/null +++ b/src/lib/lovely-chart/styles/_header.scss @@ -0,0 +1,47 @@ +.lovely-chart--header { + height: 30px; + font-weight: bold; + margin: 0 10px; + + &-title, &-caption { + color: var(--text-color); + line-height: 30px; + // transition: color 300ms ease; + + &.lovely-chart--state-hidden { + opacity: 0; + pointer-events: none; + } + } + + &-title { + font-size: 16px; + float: left; + } + + &-caption { + font-size: 12px; + text-align: right; + float: right; + } + + &-zoom-out-control { + display: flex; + align-items: center; + color: var(--zoom-out-text); + cursor: pointer; + + &::before { + content: ''; + display: inline-block; + margin-right: 6px; + width: 16px; + height: 16px; + + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Capa_1' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve' width='512px' height='512px'%3E%3Cg%3E%3Cg%3E%3Cpath d='M497.938,430.063l-112-112c-0.367-0.367-0.805-0.613-1.18-0.965C404.438,285.332,416,248.035,416,208 C416,93.313,322.695,0,208,0S0,93.313,0,208s93.305,208,208,208c40.035,0,77.332-11.563,109.098-31.242 c0.354,0.375,0.598,0.813,0.965,1.18l112,112C439.43,507.313,451.719,512,464,512c12.281,0,24.57-4.688,33.938-14.063 C516.688,479.203,516.688,448.797,497.938,430.063z M64,208c0-79.406,64.602-144,144-144s144,64.594,144,144 c0,79.406-64.602,144-144,144S64,287.406,64,208z' data-original='%23000000' class='active-path' data-old_color='%232d98e6' fill='%232d98e6'/%3E%3Cpath d='M272,176H144c-17.672,0-32,14.328-32,32s14.328,32,32,32h128c17.672,0,32-14.328,32-32S289.672,176,272,176z' data-original='%23000000' class='active-path' data-old_color='%232d98e6' fill='%232d98e6'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + } + } +} diff --git a/src/lib/lovely-chart/styles/_minimap.scss b/src/lib/lovely-chart/styles/_minimap.scss new file mode 100644 index 000000000..87eb096bc --- /dev/null +++ b/src/lib/lovely-chart/styles/_minimap.scss @@ -0,0 +1,142 @@ +.lovely-chart--minimap { + position: relative; + margin: 0 10px 16px 10px; + border-radius: 6px; + overflow: hidden; + opacity: 1; + transition: opacity 400ms ease; + + &.lovely-chart--state-hidden { + display: none; + } + + &.lovely-chart--state-transparent { + opacity: 0; + } +} + +.lovely-chart--minimap-ruler { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + white-space: nowrap; + user-select: none; + -webkit-user-select: none; +} + +.lovely-chart--minimap-mask { + display: inline-block; + width: 33.3%; + height: 100%; + background: var(--minimap-mask); + // transition: background-color 300ms ease-out; + + &:last-child { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + bottom: 0; + right: -5px; + width: 5px; + background: var(--minimap-mask); + // transition: background-color 300ms ease-out; + } + } +} + +.lovely-chart--minimap-slider { + display: inline-block; + box-sizing: border-box; + width: 33.3%; + height: 100%; + min-width: 16px; + + &-inner { + box-sizing: border-box; + border-top: 1px solid var(--minimap-slider); + border-bottom: 1px solid var(--minimap-slider); + float: left; + width: calc(100% - 16px); + height: 100%; + background: transparent !important; + cursor: grab; + // transition: border-color 300ms ease-out; + } + + &-handle { + width: 8px; + height: 100%; + position: relative; + background: var(--minimap-mask); + cursor: ew-resize; + // transition: background-color 300ms ease-out; + + &::before, &::after { + content: ''; + display: block; + position: absolute; + } + + &::before { + background: var(--minimap-slider); + top: 0; + bottom: 0; + right: 0; + left: 0; + // transition: background-color 300ms ease-out; + } + + &-pin { + display: block; + position: absolute; + background: #ffffff; + width: 2px; + height: 8px; + top: calc(50% - 4px); + left: calc(50% - 1px); + pointer-events: none; + } + + &:first-child { + float: left; + + &::before { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + } + } + + &:last-child { + float: right; + + &::before { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + } + } + + @media (pointer: coarse) { + &:after { + top: -10px; + bottom: -10px; + z-index: 1; + } + + &:first-child:after { + left: -26px; + right: 0; + } + + &:last-child:after { + left: 0; + right: -26px; + } + } + } +} diff --git a/src/lib/lovely-chart/styles/_tools.scss b/src/lib/lovely-chart/styles/_tools.scss new file mode 100644 index 000000000..a404adebe --- /dev/null +++ b/src/lib/lovely-chart/styles/_tools.scss @@ -0,0 +1,14 @@ +.lovely-chart--tools { + opacity: 1; + transition: opacity 400ms ease; + + &.lovely-chart--state-hidden { + display: none; + } + + &.lovely-chart--state-transparent { + opacity: 0; + } + + padding: 0 10px 16px 10px; +} diff --git a/src/lib/lovely-chart/styles/_tooltip.scss b/src/lib/lovely-chart/styles/_tooltip.scss new file mode 100644 index 000000000..22d3144bd --- /dev/null +++ b/src/lib/lovely-chart/styles/_tooltip.scss @@ -0,0 +1,99 @@ +.lovely-chart--tooltip { + position: absolute; + top: 30px; + left: 0; +} + +.lovely-chart--tooltip-balloon { + position: absolute; + top: 5px; + left: 0; + min-width: 130px; + max-height: 320px; + overflow: auto; + -webkit-overflow-scrolling: touch; + border-radius: 8px; + padding: 8px 10px; + white-space: nowrap; + background: var(--tooltip-background); + color: var(--text-color); + box-shadow: 0 1px 2px 1px rgba(211, 211, 211, 0.8); + opacity: 0; + transition: opacity 200ms ease-out; + cursor: pointer; + pointer-events: none; + + &.lovely-chart--state-shown { + opacity: 1; + pointer-events: auto; + } + + &.lovely-chart--state-inactive { + cursor: default; + + .lovely-chart--tooltip-title::after { + display: none; + } + } + + &.lovely-chart--state-loading { + .lovely-chart--spinner { + display: block; + } + } + + .lovely-chart--spinner { + position: absolute; + top: 7px; + right: 8px; + display: none; + } +} + +.lovely-chart--tooltip-title { + font-size: 12px; + font-weight: bold; + position: relative; + padding-bottom: 5px; + + &::after { + content: ''; + display: block; + position: absolute; + right: 0; + top: 0; + width: 12px; + height: 12px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Capa_1' x='0px' y='0px' width='512px' height='512px' viewBox='0 0 451.846 451.847' style='enable-background:new 0 0 451.846 451.847;' xml:space='preserve' class=''%3E%3Cg%3E%3Cg%3E%3Cpath d='M345.441,248.292L151.154,442.573c-12.359,12.365-32.397,12.365-44.75,0c-12.354-12.354-12.354-32.391,0-44.744 L278.318,225.92L106.409,54.017c-12.354-12.359-12.354-32.394,0-44.748c12.354-12.359,32.391-12.359,44.75,0l194.287,194.284 c6.177,6.18,9.262,14.271,9.262,22.366C354.708,234.018,351.617,242.115,345.441,248.292z' data-original='%23000000' class='active-path' data-old_color='%23757B84' fill='%23D2D5D7'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; + background-size: 75%; + } +} + +.lovely-chart--tooltip-dataset { + height: 20px; + line-height: 20px; + color: var(--text-color); + + .lovely-chart--tooltip-dataset-value { + float: right; + font-weight: bold; + } +} + +.lovely-chart--percentage-title { + display: inline-block; + font-weight: bold; + width: 25px; + margin-right: 5px; + text-align: right; + + &.lovely-chart--transition ~ .lovely-chart--dataset-title { + padding-left: 30px; + } +} + +html.dark .lovely-chart--tooltip-balloon { + box-shadow: none; +} diff --git a/src/lib/lovely-chart/styles/_variables.scss b/src/lib/lovely-chart/styles/_variables.scss new file mode 100644 index 000000000..5a4bcb7aa --- /dev/null +++ b/src/lib/lovely-chart/styles/_variables.scss @@ -0,0 +1,21 @@ +.lovely-chart--container { + --background-color: #ffffff; + --text-color: #222222; + --minimap-mask: #{rgba(#E2EEF9, 0.6)}; + --minimap-slider: #C0D1E1; + --grid-lines: #{rgba(#182D3B, 0.1)}; + --zoom-out-text: #108BE3; + --tooltip-background: #ffffff; + --tooltip-arrow: #D2D5D7; +} + +html.dark .lovely-chart--container { + --background-color: #242F3E; + --text-color: #ffffff; + --minimap-mask: #{rgba(#304259, 0.6)}; + --minimap-slider: #56626D; + --grid-lines: #{rgba(#FFFFFF, 0.1)}; + --zoom-out-text: #48AAF0; + --tooltip-background: #1c2533; + --tooltip-arrow: #D2D5D7; +} diff --git a/src/lib/lovely-chart/styles/index.scss b/src/lib/lovely-chart/styles/index.scss new file mode 100644 index 000000000..17f08910a --- /dev/null +++ b/src/lib/lovely-chart/styles/index.scss @@ -0,0 +1,8 @@ +@import 'variables'; +@import 'animations'; +@import 'common'; +@import 'header'; +@import 'minimap'; +@import 'tooltip'; +@import 'tools'; +@import 'buttons'; diff --git a/src/lib/lovely-chart/toggleText.js b/src/lib/lovely-chart/toggleText.js new file mode 100644 index 000000000..4b4b5e029 --- /dev/null +++ b/src/lib/lovely-chart/toggleText.js @@ -0,0 +1,38 @@ +import { createElement } from './minifiers'; + +export function toggleText(element, newText, className = '', inverse = false) { + const container = element.parentNode; + container.classList.add('lovely-chart--transition-container'); + + const newElement = createElement(element.tagName); + newElement.className = `${className} lovely-chart--transition lovely-chart--position-${inverse ? 'top' : 'bottom'} lovely-chart--state-hidden`; + newElement.innerHTML = newText; + + const selector = className.length ? `.${className.split(' ').join('.')}` : ''; + const oldElements = container.querySelectorAll(`${selector}.lovely-chart--state-hidden`); + oldElements.forEach(e => e.remove()); + + element.classList.add('lovely-chart--transition'); + element.classList.remove('lovely-chart--position-bottom', 'lovely-chart--position-top'); + element.classList.add(inverse ? 'lovely-chart--position-bottom' : 'lovely-chart--position-top'); + container.insertBefore(newElement, element.nextSibling); + + toggleElementIn(newElement); + toggleElementOut(element); + + return newElement; +} + +function toggleElementIn(element) { + // Remove and add `animated` class to re-trigger animation + element.classList.remove('lovely-chart--state-animated'); + element.classList.add('lovely-chart--state-animated'); + element.classList.remove('lovely-chart--state-hidden'); +} + +function toggleElementOut(element) { + // Remove and add `animated` class to re-trigger animation + element.classList.remove('lovely-chart--state-animated'); + element.classList.add('lovely-chart--state-animated'); + element.classList.add('lovely-chart--state-hidden'); +} diff --git a/src/lib/lovely-chart/utils.js b/src/lib/lovely-chart/utils.js new file mode 100644 index 000000000..d13959c23 --- /dev/null +++ b/src/lib/lovely-chart/utils.js @@ -0,0 +1,126 @@ +// https://jsperf.com/finding-maximum-element-in-an-array +export function getMaxMin(array) { + const length = array.length; + let max = array[0]; + let min = array[0]; + + for (let i = 0; i < length; i++) { + const value = array[i]; + + if (value > max) { + max = value; + } else if (value < min) { + min = value; + } + } + + return { max, min }; +} + +// https://jsperf.com/multi-array-concat/24 +export function mergeArrays(arrays) { + return [].concat.apply([], arrays); +} + +export function sumArrays(arrays) { + const sums = []; + const n = arrays.length; + + for (let i = 0, l = arrays[0].length; i < l; i++) { + sums[i] = 0; + + for (let j = 0; j < n; j++) { + sums[i] += arrays[j][i]; + } + } + + return sums; +} + +export function proxyMerge(obj1, obj2) { + return new Proxy({}, { + get: (obj, prop) => { + if (obj[prop] !== undefined) { + return obj[prop]; + } else if (obj2[prop] !== undefined) { + return obj2[prop]; + } else { + return obj1[prop]; + } + }, + }); +} + +export function throttle( + fn, + ms, + shouldRunFirst = true, +) { + let interval = null; + let isPending; + let args; + + return (..._args) => { + isPending = true; + args = _args; + + if (!interval) { + if (shouldRunFirst) { + isPending = false; + // @ts-ignore + fn(...args); + } + + interval = window.setInterval(() => { + if (!isPending) { + window.clearInterval(interval); + interval = null; + return; + } + + isPending = false; + // @ts-ignore + fn(...args); + }, ms); + } + }; +} + +export function throttleWithRaf(fn) { + let waiting = false; + let args; + + return function (..._args) { + args = _args; + + if (!waiting) { + waiting = true; + + requestAnimationFrame(() => { + waiting = false; + fn(...args); + }); + } + }; +} + +export function debounce(fn, ms, shouldRunFirst = true, shouldRunLast = true) { + let waitingTimeout = null; + + return function () { + if (waitingTimeout) { + clearTimeout(waitingTimeout); + waitingTimeout = null; + } else if (shouldRunFirst) { + fn(); + } + + waitingTimeout = setTimeout(() => { + if (shouldRunLast) { + fn(); + } + + waitingTimeout = null; + }, ms); + }; +} diff --git a/src/lib/punycode.js b/src/lib/punycode.js new file mode 100644 index 000000000..16f519c4f --- /dev/null +++ b/src/lib/punycode.js @@ -0,0 +1,184 @@ +/* eslint-disable no-nested-ternary */ +/* eslint-disable no-bitwise */ + +const utf16 = { + // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back. + decode: (input) => { + const output = []; + let i = 0; + const len = input.length; + let value; + let extra; + + while (i < len) { + value = input.charCodeAt(i++); + if ((value & 0xf800) === 0xd800) { + extra = input.charCodeAt(i++); + if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) { + throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence'); + } + value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000; + } + output.push(value); + } + return output; + }, + encode: (input) => { + const output = []; + let i = 0; + const len = input.length; + let value; + + while (i < len) { + value = input[i++]; + if ((value & 0xf800) === 0xd800) { + throw new RangeError('UTF-16(encode): Illegal UTF-16 value'); + } + if (value > 0xffff) { + value -= 0x10000; + output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800)); + value = 0xdc00 | (value & 0x3ff); + } + output.push(String.fromCharCode(value)); + } + return output.join(''); + }, +}; + +// Default parameters +const initial_n = 0x80; +const initial_bias = 72; +const delimiter = '\x2D'; +const base = 36; +const damp = 700; +const tmin = 1; +const tmax = 26; +const skew = 38; +const maxint = 0x7fffffff; + +// decode_digit(cp) returns the numeric value of a basic code +// point (for use in representing integers) in the range 0 to +// base-1, or base if cp is does not represent a value. + +function decode_digit(cp) { + return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base; +} + +// ** Bias adaptation function ** +function adapt(delta, numpoints, firsttime) { + let k; + delta = firsttime ? Math.floor(delta / damp) : delta >> 1; + delta += Math.floor(delta / numpoints); + + for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) { + delta = Math.floor(delta / (base - tmin)); + } + return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew)); +} + +// Main decode +function decode(input, preserveCase) { + // Dont use utf16 + const output = []; + const case_flags = []; + const input_length = input.length; + + let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len; + + // Initialize the state: + + n = initial_n; + i = 0; + bias = initial_bias; + + // Handle the basic code points: Let basic be the number of input code + // points before the last delimiter, or 0 if there is none, then + // copy the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) basic = 0; + + for (j = 0; j < basic; ++j) { + if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26; + if (input.charCodeAt(j) >= 0x80) { + throw new RangeError('Illegal input >= 0x80'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: Start just after the last delimiter if any + // basic code points were copied; start at the beginning otherwise. + + for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) { + // ic is the index of the next character to be consumed, + + // Decode a generalized variable-length integer into delta, + // which gets added to i. The overflow checking is easier + // if we increase i as we go, then subtract off its starting + // value at the end to obtain delta. + for (oldi = i, w = 1, k = base; ; k += base) { + if (ic >= input_length) { + throw RangeError('punycode_bad_input(1)'); + } + digit = decode_digit(input.charCodeAt(ic++)); + + if (digit >= base) { + throw RangeError('punycode_bad_input(2)'); + } + if (digit > Math.floor((maxint - i) / w)) { + throw RangeError('punycode_overflow(1)'); + } + i += digit * w; + t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias; + if (digit < t) { + break; + } + if (w > Math.floor(maxint / (base - t))) { + throw RangeError('punycode_overflow(2)'); + } + w *= base - t; + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi === 0); + + // i was supposed to wrap around from out to 0, + // incrementing n each time, so we'll fix that now: + if (Math.floor(i / out) > maxint - n) { + throw RangeError('punycode_overflow(3)'); + } + n += Math.floor(i / out); + i %= out; + + // Insert n at position i of the output: + // Case of last character determines uppercase flag: + if (preserveCase) { + case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26); + } + + output.splice(i, 0, n); + i++; + } + if (preserveCase) { + for (i = 0, len = output.length; i < len; i++) { + if (case_flags[i]) { + output[i] = String.fromCharCode(output[i]) + .toUpperCase() + .charCodeAt(0); + } + } + } + return utf16.encode(output); +} + +function toUnicode(domain) { + const domain_array = domain.split('.'); + const out = []; + for (let i = 0; i < domain_array.length; ++i) { + const s = domain_array[i]; + out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s); + } + return out.join('.'); +} + +export default toUnicode; diff --git a/src/lib/rlottie/RLottie.ts b/src/lib/rlottie/RLottie.ts new file mode 100644 index 000000000..36290c855 --- /dev/null +++ b/src/lib/rlottie/RLottie.ts @@ -0,0 +1,428 @@ +import Worker from 'worker-loader!./rlottie.worker'; + +import { + DPR, + IS_MOBILE_SCREEN, + IS_SAFARI, +} from '../../util/environment'; +import WorkerConnector from '../../util/WorkerConnector'; +import { animate } from '../../util/animation'; +import cycleRestrict from '../../util/cycleRestrict'; + +interface Params { + noLoop?: boolean; + size?: number; + quality?: number; + isLowPriority?: boolean; +} + +type Frames = ArrayBuffer[]; +type Chunks = (Frames | undefined)[]; + +// TODO Consider removing chunks +const CHUNK_SIZE = 1; +const MAX_WORKERS = 4; +const HIGH_PRIORITY_QUALITY = IS_MOBILE_SCREEN ? 0.75 : 1; +const LOW_PRIORITY_QUALITY = 0.75; +const HIGH_PRIORITY_MAX_FPS = 60; +const LOW_PRIORITY_MAX_FPS = 30; +const HIGH_PRIORITY_CACHE_MODULO = IS_SAFARI ? 2 : 4; +const LOW_PRIORITY_CACHE_MODULO = 0; + +const workers = new Array(MAX_WORKERS).fill(undefined).map(() => new WorkerConnector(new Worker())); +let lastWorkerIndex = -1; + +class RLottie { + // Config + + private imgSize!: number; + + private key!: string; + + private msPerFrame!: number; + + private reduceFactor!: number; + + private cacheModulo!: number; + + private chunkSize!: number; + + private workerIndex!: number; + + private chunks: Chunks = []; + + private framesCount?: number; + + private chunksCount?: number; + + // Container + + private canvas = document.createElement('canvas'); + + private ctx = this.canvas.getContext('2d')!; + + // State + + private isAnimating = false; + + private isWaiting = true; + + private isOnLoadFired = false; + + private isDestroyed = false; + + private approxFrameIndex = 0; + + private prevFrameIndex = -1; + + private stopFrameIndex? = 0; + + private speed = 1; + + private direction: 1 | -1 = 1; + + private lastRenderAt?: number; + + constructor( + private id: string, + private container: HTMLDivElement, + private animationData: AnyLiteral, + private params: Params = {}, + private onLoad?: () => void, + ) { + this.initContainer(); + this.initConfig(); + this.initRenderer(); + } + + isPlaying() { + return this.isAnimating || this.isWaiting; + } + + play() { + this.stopFrameIndex = undefined; + this.direction = 1; + this.doPlay(); + } + + pause() { + if (this.isWaiting) { + this.stopFrameIndex = this.approxFrameIndex; + } else { + this.isAnimating = false; + } + + const currentChunkIndex = this.getChunkIndex(this.approxFrameIndex); + this.chunks = this.chunks.map((chunk, i) => (i === currentChunkIndex ? chunk : undefined)); + } + + goToAndPlay(frameIndex: number) { + this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor); + this.stopFrameIndex = undefined; + this.direction = 1; + this.doPlay(); + } + + goToAndStop(frameIndex: number) { + this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor); + this.stopFrameIndex = Math.floor(frameIndex / this.reduceFactor); + this.direction = 1; + this.doPlay(); + } + + playSegment([startFrameIndex, stopFrameIndex]: [number, number]) { + this.approxFrameIndex = Math.floor(startFrameIndex / this.reduceFactor); + this.stopFrameIndex = Math.floor(stopFrameIndex / this.reduceFactor); + this.direction = startFrameIndex < stopFrameIndex ? 1 : -1; + this.doPlay(); + } + + setSpeed(speed: number) { + this.speed = speed; + } + + destroy() { + this.isDestroyed = true; + this.pause(); + this.destroyRenderer(); + this.destroyContainer(); + } + + private initContainer() { + if (!(this.container.parentNode instanceof HTMLElement)) { + throw new Error('[RLottie] Container is not mounted'); + } + + let { size } = this.params; + + if (!size) { + size = ( + this.container.offsetWidth + || parseInt(this.container.style.width, 10) + || this.container.parentNode.offsetWidth + ); + + if (!size) { + throw new Error('[RLottie] Failed to detect width from container'); + } + } + + this.canvas.style.width = `${size}px`; + this.canvas.style.height = `${size}px`; + + const { isLowPriority, quality = isLowPriority ? LOW_PRIORITY_QUALITY : HIGH_PRIORITY_QUALITY } = this.params; + // Reduced quality only looks acceptable on high DPR screens + const imgSize = Math.round(size * Math.max(DPR * quality, 1)); + + this.canvas.width = imgSize; + this.canvas.height = imgSize; + + this.container.appendChild(this.canvas); + + this.imgSize = imgSize; + } + + private initConfig() { + this.key = `${this.id}_${this.imgSize}`; + + const { isLowPriority } = this.params; + + const maxFps = isLowPriority ? LOW_PRIORITY_MAX_FPS : HIGH_PRIORITY_MAX_FPS; + const sourceFps = this.animationData.fr || maxFps; + this.reduceFactor = sourceFps % maxFps === 0 ? sourceFps / maxFps : 1; + this.msPerFrame = 1000 / (sourceFps / this.reduceFactor); + this.cacheModulo = isLowPriority ? LOW_PRIORITY_CACHE_MODULO : HIGH_PRIORITY_CACHE_MODULO; + this.chunkSize = CHUNK_SIZE; + } + + private destroyContainer() { + this.canvas.remove(); + } + + private initRenderer() { + this.workerIndex = cycleRestrict(MAX_WORKERS, ++lastWorkerIndex); + + workers[this.workerIndex].request({ + name: 'init', + args: [ + this.key, + this.animationData, + this.imgSize, + this.params.isLowPriority, + this.reduceFactor, + this.onRendererInit.bind(this), + ], + }); + } + + private destroyRenderer() { + workers[this.workerIndex].request({ + name: 'destroy', + args: [this.key], + }); + } + + private onRendererInit(framesCount: number) { + this.framesCount = framesCount; + this.chunksCount = Math.ceil(framesCount / this.chunkSize); + + if (this.isWaiting) { + this.doPlay(); + } + } + + private doPlay() { + if (!this.framesCount) { + return; + } + + if (this.isDestroyed) { + return; + } + + if (this.isAnimating) { + return; + } + + if (!this.isWaiting) { + this.lastRenderAt = undefined; + } + + this.isAnimating = true; + this.isWaiting = false; + + animate(() => { + if (this.isDestroyed) { + return false; + } + + // Paused from outside + if (!this.isAnimating && this.isOnLoadFired) { + return false; + } + + const frameIndex = Math.round(this.approxFrameIndex); + const chunkIndex = this.getChunkIndex(frameIndex); + const chunk = this.chunks[chunkIndex]; + if (!chunk) { + this.requestChunk(chunkIndex); + this.isAnimating = false; + this.isWaiting = true; + return false; + } + + if (this.cacheModulo && chunkIndex % this.cacheModulo === 0) { + this.cleanupPrevChunk(chunkIndex); + } + + this.requestNextChunk(chunkIndex); + + if (frameIndex !== this.prevFrameIndex) { + const frame = this.getFrame(frameIndex); + if (!frame) { + this.isAnimating = false; + this.isWaiting = true; + return false; + } + + const imageData = new ImageData(new Uint8ClampedArray(frame), this.imgSize, this.imgSize); + this.ctx.putImageData(imageData, 0, 0); + + if (this.onLoad && !this.isOnLoadFired) { + this.isOnLoadFired = true; + this.onLoad(); + } + + this.prevFrameIndex = frameIndex; + } + + const now = Date.now(); + const currentSpeed = this.lastRenderAt ? this.msPerFrame / (now - this.lastRenderAt) : 1; + const delta = Math.min(1, (this.direction * this.speed) / currentSpeed); + const expectedNextFrameIndex = Math.round(this.approxFrameIndex + delta); + + this.lastRenderAt = now; + + // Forward animation finished + if (delta > 0 && (frameIndex === this.framesCount! - 1 || expectedNextFrameIndex > this.framesCount! - 1)) { + if (this.params.noLoop) { + this.isAnimating = false; + return false; + } + + this.approxFrameIndex = 0; + + // Backward animation finished + } else if (delta < 0 && (frameIndex === 0 || expectedNextFrameIndex < 0)) { + if (this.params.noLoop) { + this.isAnimating = false; + return false; + } + + this.approxFrameIndex = this.framesCount! - 1; + + // Stop frame reached + } else if ( + this.stopFrameIndex !== undefined + && (frameIndex === this.stopFrameIndex + || ( + (delta > 0 && expectedNextFrameIndex > this.stopFrameIndex) + || (delta < 0 && expectedNextFrameIndex < this.stopFrameIndex) + )) + ) { + this.stopFrameIndex = undefined; + this.isAnimating = false; + return false; + + // Preparing next frame + } else { + this.approxFrameIndex += delta; + } + + const nextFrameIndex = Math.round(this.approxFrameIndex); + + if (!this.getFrame(nextFrameIndex)) { + this.requestChunk(this.getChunkIndex(nextFrameIndex)); + this.isWaiting = true; + this.isAnimating = false; + return false; + } + + return true; + }); + } + + private getFrame(frameIndex: number) { + const chunkIndex = this.getChunkIndex(frameIndex); + const indexInChunk = this.getFrameIndexInChunk(frameIndex); + const chunk = this.chunks[chunkIndex]; + if (!chunk) { + return undefined; + } + + return chunk[indexInChunk]; + } + + private getFrameIndexInChunk(frameIndex: number) { + const chunkIndex = this.getChunkIndex(frameIndex); + return frameIndex - chunkIndex * this.chunkSize; + } + + private getChunkIndex(frameIndex: number) { + return Math.floor(frameIndex / this.chunkSize); + } + + private requestChunk(chunkIndex: number) { + if (this.chunks[chunkIndex]) { + return; + } + + this.chunks[chunkIndex] = []; + + const fromIndex = chunkIndex * this.chunkSize; + const toIndex = Math.min(fromIndex + this.chunkSize - 1, this.framesCount! - 1); + + workers[this.workerIndex].request({ + name: 'renderFrames', + args: [this.key, fromIndex, toIndex, this.onFrameLoad.bind(this)], + }); + } + + private cleanupPrevChunk(chunkIndex: number) { + if (this.chunksCount! < 3) { + return; + } + + const prevChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex - 1); + this.chunks[prevChunkIndex] = undefined; + } + + private requestNextChunk(chunkIndex: number) { + if (this.chunksCount === 1) { + return; + } + + const nextChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex + 1); + + if (!this.chunks[nextChunkIndex]) { + this.requestChunk(nextChunkIndex); + } + } + + private onFrameLoad(frameIndex: number, arrayBuffer: ArrayBuffer) { + const chunkIndex = this.getChunkIndex(frameIndex); + const chunk = this.chunks[chunkIndex]; + // Frame can be skipped and chunk can be already cleaned up + if (!chunk) { + return; + } + + chunk[this.getFrameIndexInChunk(frameIndex)] = arrayBuffer; + + if (this.isWaiting) { + this.doPlay(); + } + } +} + +export default RLottie; diff --git a/src/lib/rlottie/__mocks__/RLottie.ts b/src/lib/rlottie/__mocks__/RLottie.ts new file mode 100644 index 000000000..b758fabae --- /dev/null +++ b/src/lib/rlottie/__mocks__/RLottie.ts @@ -0,0 +1,2 @@ +export default class RLottie { +} diff --git a/src/lib/rlottie/rlottie-wasm.js b/src/lib/rlottie/rlottie-wasm.js new file mode 100644 index 000000000..773ad1abb --- /dev/null +++ b/src/lib/rlottie/rlottie-wasm.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){err("no native wasm support detected")}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":522,"maximum":522+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var DYNAMIC_BASE=5275232,DYNAMICTOP_PTR=32192;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="rlottie-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}function __ZN7VRegionC1ERK5VRect(){err("missing function: _ZN7VRegionC1ERK5VRect");abort(-1)}function __ZN7VRegionD1Ev(){err("missing function: _ZN7VRegionD1Ev");abort(-1)}function __ZN7VRegionpLERK5VRect(){err("missing function: _ZN7VRegionpLERK5VRect");abort(-1)}function __ZNK7VRegion12boundingRectEv(){err("missing function: _ZNK7VRegion12boundingRectEv");abort(-1)}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function ___map_file(pathname,size){setErrNo(63);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}var setjmpId=0;function _saveSetjmp(env,label,table,size){env=env|0;label=label|0;table=table|0;size=size|0;var i=0;setjmpId=setjmpId+1|0;HEAP32[env>>2]=setjmpId;while((i|0)<(size|0)){if((HEAP32[table+(i<<3)>>2]|0)==0){HEAP32[table+(i<<3)>>2]=setjmpId;HEAP32[table+((i<<3)+4)>>2]=label;HEAP32[table+((i<<3)+8)>>2]=0;setTempRet0(size|0);return table|0}i=i+1|0}size=size*2|0;table=_realloc(table|0,8*(size+1|0)|0)|0;table=_saveSetjmp(env|0,label|0,table|0,size|0)|0;setTempRet0(size|0);return table|0}function _testSetjmp(id,table,size){id=id|0;table=table|0;size=size|0;var i=0,curr=0;while((i|0)<(size|0)){curr=HEAP32[table+(i<<3)>>2]|0;if((curr|0)==0)break;if((curr|0)==(id|0)){return HEAP32[table+((i<<3)+4)>>2]|0}i=i+1|0}return 0}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function __getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8","_":__getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _getTempRet0(){return getTempRet0()|0}function _round(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"o":__ZN7VRegionC1ERK5VRect,"m":__ZN7VRegionD1Ev,"n":__ZN7VRegionpLERK5VRect,"x":__ZNK7VRegion12boundingRectEv,"a":___assert_fail,"u":___map_file,"h":___sys_fcntl64,"z":___sys_ioctl,"t":___sys_munmap,"A":___sys_open,"d":_abort,"c":_emscripten_longjmp,"q":_emscripten_memcpy_big,"r":_emscripten_resize_heap,"v":_environ_get,"w":_environ_sizes_get,"g":_fd_close,"y":_fd_read,"p":_fd_seek,"f":_fd_write,"b":_getTempRet0,"k":invoke_iii,"B":invoke_vi,"memory":wasmMemory,"i":_round,"l":_saveSetjmp,"j":_setTempRet0,"s":_strftime_l,"table":wasmTable,"e":_testSetjmp};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["C"]).apply(null,arguments)};var _lottie_init=Module["_lottie_init"]=function(){return(_lottie_init=Module["_lottie_init"]=Module["asm"]["D"]).apply(null,arguments)};var _lottie_resize=Module["_lottie_resize"]=function(){return(_lottie_resize=Module["_lottie_resize"]=Module["asm"]["E"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["F"]).apply(null,arguments)};var _lottie_load_from_data=Module["_lottie_load_from_data"]=function(){return(_lottie_load_from_data=Module["_lottie_load_from_data"]=Module["asm"]["G"]).apply(null,arguments)};var _lottie_buffer=Module["_lottie_buffer"]=function(){return(_lottie_buffer=Module["_lottie_buffer"]=Module["asm"]["H"]).apply(null,arguments)};var _lottie_destroy=Module["_lottie_destroy"]=function(){return(_lottie_destroy=Module["_lottie_destroy"]=Module["asm"]["I"]).apply(null,arguments)};var _lottie_render=Module["_lottie_render"]=function(){return(_lottie_render=Module["_lottie_render"]=Module["asm"]["J"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["K"]).apply(null,arguments)};var _realloc=Module["_realloc"]=function(){return(_realloc=Module["_realloc"]=Module["asm"]["L"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["M"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["N"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["O"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["P"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["Q"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["R"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["S"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["T"]).apply(null,arguments)};function invoke_iii(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["asm"]=asm;Module["intArrayFromString"]=intArrayFromString;Module["cwrap"]=cwrap;Module["allocate"]=allocate;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); diff --git a/src/lib/rlottie/rlottie-wasm.wasm b/src/lib/rlottie/rlottie-wasm.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7f299645fa9ad4a6550be611bc9dbcac4397ce76 GIT binary patch literal 317584 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 jpC$MZ{X5! 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
  • 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

    9w= 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

    n9qnCj(9-q+c?;g^J7`+z_FsnjPa8D% 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 x0A+!4KzTp~Q~)Xh&4B; +const rLottieApiPromise = new Promise((resolve) => { + Module.onRuntimeInitialized = () => { + rLottieApi = { + init: Module.cwrap('lottie_init', '', []), + destroy: Module.cwrap('lottie_destroy', '', ['number']), + resize: Module.cwrap('lottie_resize', '', ['number', 'number', 'number']), + buffer: Module.cwrap('lottie_buffer', 'number', ['number']), + render: Module.cwrap('lottie_render', '', ['number', 'number']), + loadFromData: Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']), + }; + + resolve(); + }; +}); + +const renderers = new Map(); + +async function init( + key: string, + animationData: AnyLiteral, + imgSize: number, + isLowPriority: boolean, + reduceFactor: number, + onInit: CancellableCallback, +) { + if (!rLottieApi) { + await rLottieApiPromise; + } + + const json = JSON.stringify(animationData); + const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0); + const handle = rLottieApi.init(); + const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap); + rLottieApi.resize(handle, imgSize, imgSize); + + renderers.set(key, { imgSize, reduceFactor, handle }); + + onInit(Math.ceil(framesCount / reduceFactor)); +} + +async function renderFrames( + key: string, fromIndex: number, toIndex: number, onProgress: CancellableCallback, +) { + if (!rLottieApi) { + await rLottieApiPromise; + } + + const { imgSize, reduceFactor, handle } = renderers.get(key)!; + + for (let i = fromIndex; i <= toIndex; i++) { + const realIndex = i * reduceFactor; + + rLottieApi.render(handle, realIndex); + const bufferPointer = rLottieApi.buffer(handle); + const data = Module.HEAPU8.subarray(bufferPointer, bufferPointer + (imgSize * imgSize * 4)); + const arrayBuffer = new Uint8ClampedArray(data).buffer; + onProgress(i, arrayBuffer); + } +} + +function destroy(key: string) { + const renderer = renderers.get(key)!; + + rLottieApi.destroy(renderer.handle); + + renderers.delete(key); +} + +createWorkerInterface({ + init, + renderFrames, + destroy, +}); diff --git a/src/lib/teact/dom-events.ts b/src/lib/teact/dom-events.ts new file mode 100644 index 000000000..a508df895 --- /dev/null +++ b/src/lib/teact/dom-events.ts @@ -0,0 +1,167 @@ +import { DEBUG } from '../../config'; + +type Handler = (e: Event) => void; + +const NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']); + +const delegationRegistry: Record> = {}; +const delegatedEventsByElement = new Map>(); +const documentEventCounters: Record = {}; + +export function addEventListener(element: HTMLElement, propName: string, handler: Handler) { + const eventName = resolveEventName(propName, element); + if (canUseEventDelegation(eventName, element)) { + addDelegatedListener(eventName, element, handler); + } else { + element.addEventListener(eventName, handler); + } +} + +export function removeEventListener(element: HTMLElement, propName: string, handler: Handler) { + const eventName = resolveEventName(propName, element); + if (canUseEventDelegation(eventName, element)) { + removeDelegatedListener(eventName, element); + } else { + element.removeEventListener(eventName, handler); + } +} + +function resolveEventName(propName: string, element: HTMLElement) { + const eventName = propName.replace(/^on/, '').toLowerCase(); + + if (eventName === 'change' && element.tagName !== 'SELECT') { + // React behavior repeated here. + // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput + return 'input'; + } + + if (eventName === 'doubleclick') { + return 'dblclick'; + } + + // Replace focus/blur by their "bubbleable" versions + if (eventName === 'focus') { + return 'focusin'; + } + + if (eventName === 'blur') { + return 'focusout'; + } + + return eventName; +} + +function canUseEventDelegation(realEventName: string, element: HTMLElement) { + return ( + !NON_BUBBLEABLE_EVENTS.has(realEventName) + && element.tagName !== 'VIDEO' + && element.tagName !== 'IFRAME' + ); +} + +function addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) { + if (!documentEventCounters[eventName]) { + documentEventCounters[eventName] = 0; + document.addEventListener(eventName, handleEvent); + } + + resolveDelegationRegistryForName(eventName).set(element, handler); + resolveDelegatedEventsForElement(element).add(eventName); + documentEventCounters[eventName]++; +} + +function removeDelegatedListener(eventName: string, element: HTMLElement) { + documentEventCounters[eventName]--; + if (!documentEventCounters[eventName]) { + // Synchronous deletion on 0 will cause perf degradation in the case of 1 element + // which is not a real case, so it's ok to do it this way + document.removeEventListener(eventName, handleEvent); + } + + delegationRegistry[eventName].delete(element); + delegatedEventsByElement.get(element)!.delete(eventName); +} + +export function removeAllDelegatedListeners(element: HTMLElement) { + const eventNames = delegatedEventsByElement.get(element); + if (!eventNames) { + return; + } + + eventNames.forEach((eventName) => removeDelegatedListener(eventName, element)); + delegatedEventsByElement.delete(element); +} + +function handleEvent(realEvent: Event) { + const events = delegationRegistry[realEvent.type]; + + if (events) { + let furtherCallsPrevented = false; + let current: HTMLElement = realEvent.target as HTMLElement; + + const stopPropagation = () => { + furtherCallsPrevented = true; + }; + + const preventDefault = () => { + realEvent.preventDefault(); + }; + + // Proxy is a simplest way to provide an access to the event property + const event = new Proxy(realEvent, { + get(target, p) { + if (p === 'currentTarget') { + return current; + } + if (p === 'stopPropagation' || p === 'stopImmediatePropagation') { + return stopPropagation; + } + if (p === 'preventDefault') { + // "this" is changed to proxy and one can't call methods via it + return preventDefault; + } + return Reflect.get(target, p); + }, + }); + + // This can also be limited by teact root + while (current && current !== document.body) { + const handler = events.get(current); + if (handler) { + handler(event); + if (furtherCallsPrevented) { + return; + } + } + + current = current.parentNode as HTMLElement; + } + } +} + +function resolveDelegationRegistryForName(eventName: string) { + if (!delegationRegistry[eventName]) { + delegationRegistry[eventName] = new Map(); + } + + return delegationRegistry[eventName]; +} + +function resolveDelegatedEventsForElement(element: HTMLElement) { + const existing = delegatedEventsByElement.get(element); + if (existing) { + return existing; + } + + const newSet = new Set(); + delegatedEventsByElement.set(element, newSet); + + return newSet; +} + +if (DEBUG) { + document.addEventListener('dblclick', () => { + // eslint-disable-next-line no-console + console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters }); + }); +} diff --git a/src/lib/teact/teact-dom.ts b/src/lib/teact/teact-dom.ts new file mode 100644 index 000000000..22cf76818 --- /dev/null +++ b/src/lib/teact/teact-dom.ts @@ -0,0 +1,474 @@ +import { + hasElementChanged, + isComponentElement, + isEmptyElement, + isRealElement, + isTextElement, + mountComponent, + renderComponent, + unmountTree, + getTarget, + setTarget, + VirtualElement, + VirtualElementComponent, + VirtualRealElement, +} from './teact'; +import generateIdFor from '../../util/generateIdFor'; +import { DEBUG } from '../../config'; +import { addEventListener, removeEventListener } from './dom-events'; + +type VirtualDomHead = { + children: [VirtualElement] | []; +}; + +const FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']); +const MAPPED_ATTRIBUTES: { [k: string]: string } = { + autoPlay: 'autoplay', + autoComplete: 'autocomplete', +}; +const INDEX_KEY_PREFIX = '__indexKey#'; + +const headsByElement: Record = {}; +let DEBUG_virtualTreeSize = 1; + +function render($element?: VirtualElement, parentEl?: HTMLElement | null) { + if (!parentEl) { + return undefined; + } + + let headId = parentEl.getAttribute('data-teact-head-id'); + if (!headId) { + headId = generateIdFor(headsByElement); + headsByElement[headId] = { children: [] }; + parentEl.setAttribute('data-teact-head-id', headId); + } + + const $head = headsByElement[headId]; + $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement]; + + if (process.env.APP_ENV === 'perf') { + DEBUG_virtualTreeSize = 0; + DEBUG_addToVirtualTreeSize($head); + + return DEBUG_virtualTreeSize; + } + + return undefined; +} + +function renderWithVirtual( + parentEl: HTMLElement, + $current: VirtualElement | undefined, + $new: VirtualElement | undefined, + $parent: VirtualRealElement | VirtualDomHead, + index: number, + { + skipComponentUpdate = false, + forceIndex = false, + fragment, + moveDirection, + }: { + skipComponentUpdate?: boolean; + forceIndex?: boolean; + fragment?: DocumentFragment; + moveDirection?: 'up' | 'down'; + } = {}, +) { + if ( + !skipComponentUpdate + && $current && $new + && isComponentElement($current) && isComponentElement($new) + && !hasElementChanged($current, $new) + ) { + $new = updateComponent($current, $new); + } + + // Parent element may have changed, so we need to update the listener closure. + if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) { + setupComponentUpdateListener($new, $parent, index, parentEl); + } + + if ($current === $new) { + return $new; + } + + if (!$current && $new) { + if (isComponentElement($new)) { + $new = initComponent($new, $parent, index, parentEl); + } + + const node = createNode($new); + setTarget($new, node); + + if (forceIndex && parentEl.childNodes[index]) { + parentEl.insertBefore(node, parentEl.childNodes[index]); + } else { + (fragment || parentEl).appendChild(node); + } + } else if ($current && !$new) { + parentEl.removeChild(getTarget($current)!); + unmountTree($current); + } else if ($current && $new) { + if (hasElementChanged($current, $new)) { + if (isComponentElement($new)) { + $new = initComponent($new, $parent, index, parentEl); + } + + const node = createNode($new); + setTarget($new, node); + parentEl.replaceChild(node, getTarget($current)!); + unmountTree($current); + } else { + const areComponents = isComponentElement($current) && isComponentElement($new); + + if (!areComponents) { + setTarget($new, getTarget($current)!); + } + + if (isRealElement($current) && isRealElement($new)) { + if (moveDirection) { + const node = getTarget($current)!; + const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1]; + + if (nextSibling) { + parentEl.insertBefore(node, nextSibling); + } else { + (fragment || parentEl).appendChild(node); + } + } + + if (!areComponents) { + updateAttributes($current, $new, getTarget($current) as HTMLElement); + } + + $new.children = renderChildren( + $current, + $new, + areComponents ? parentEl : getTarget($current) as HTMLElement, + ); + } + } + } + + return $new; +} + +function initComponent( + $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement, +) { + if (!isComponentElement($element)) { + return $element; + } + + const { componentInstance } = $element; + + if (!componentInstance.isMounted) { + $element = mountComponent(componentInstance); + setupComponentUpdateListener($element, $parent, index, parentEl); + + const $firstChild = $element.children[0]; + if (isComponentElement($firstChild)) { + $element.children = [initComponent($firstChild, $element, 0, parentEl)]; + } + + componentInstance.isMounted = true; + } + + return $element; +} + +function updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) { + $current.componentInstance.props = $new.componentInstance.props; + + return renderComponent($current.componentInstance); +} + +function setupComponentUpdateListener( + $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement, +) { + const { componentInstance } = $element; + + componentInstance.onUpdate = () => { + $parent.children[index] = renderWithVirtual( + parentEl, + $parent.children[index], + componentInstance.$element, + $parent, + index, + { skipComponentUpdate: true }, + ) as VirtualElementComponent; + }; +} + +function createNode($element: VirtualElement): Node { + if (isEmptyElement($element)) { + return document.createTextNode(''); + } + + if (isTextElement($element)) { + return document.createTextNode($element.value); + } + + if (isComponentElement($element)) { + return createNode($element.children[0] as VirtualElement); + } + + const { tag, props, children = [] } = $element; + const element = document.createElement(tag); + + if (typeof props.ref === 'object') { + props.ref.current = element; + } + + Object.keys(props).forEach((key) => { + addAttribute(element, key, props[key]); + }); + + $element.children = children.map(($child, i) => ( + renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement + )); + + return element; +} + +function renderChildren( + $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement, +) { + if ($new.props.teactFastList) { + return renderFastListChildren($current, $new, currentEl); + } + + const maxLength = Math.max($current.children.length, $new.children.length); + const newChildren = []; + const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined; + + for (let i = 0; i < maxLength; i++) { + const $newChild = renderWithVirtual( + currentEl, + $current.children[i], + $new.children[i], + $new, + i, + i >= $current.children.length ? { fragment } : undefined, + ); + + if ($newChild) { + newChildren.push($newChild); + } + } + + if (fragment) { + currentEl.appendChild(fragment); + } + + return newChildren; +} + +function renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) { + const newKeys = new Set( + $new.children.map(($newChild) => { + const key = 'props' in $newChild && $newChild.props.key; + + if (DEBUG && isRealElement($newChild) && !key) { + // eslint-disable-next-line no-console + console.warn('Missing `key` in `teactFastList`'); + } + + return key; + }), + ); + + let currentRemainingIndex = 0; + const remainingByKey = $current.children + .reduce((acc, $currentChild, i) => { + let key = 'props' in $currentChild ? $currentChild.props.key : undefined; + + // First we handle removed children + if (key && !newKeys.has(key)) { + renderWithVirtual(currentEl, $currentChild, undefined, $new, -1); + + return acc; + } else if (!key) { + const $newChild = $new.children[i]; + const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined; + // If a non-key element remains at the same index we preserve it with a virtual `key` + if ($newChild && !newChildKey) { + key = `${INDEX_KEY_PREFIX}${i}`; + } else { + renderWithVirtual(currentEl, $currentChild, undefined, $new, -1); + + return acc; + } + } + + // Then we build up info about remaining children + acc[key] = { + $element: $currentChild, + index: currentRemainingIndex++, + order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined, + }; + return acc; + }, {} as Record); + + let newChildren: VirtualElement[] = []; + + let fragmentQueue: VirtualElement[] | undefined; + let fragmentIndex: number | undefined; + + let currentPreservedIndex = 0; + + $new.children.forEach(($newChild, i) => { + const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`; + const currentChildInfo = remainingByKey[key]; + + if (!currentChildInfo) { + // All new nodes are queued to be inserted with fragments if possible. + if (!fragmentQueue) { + fragmentQueue = []; + fragmentIndex = i; + } + + fragmentQueue.push($newChild); + return; + } + + if (fragmentQueue) { + newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new)); + fragmentIndex = undefined; + fragmentQueue = undefined; + } + + // This is a "magic" `teactOrderKey` property that tells us the element is updated + const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined; + const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order; + const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index; + + // When the node goes down, preserved indexing actually breaks, so the "magic" should help. + if (!shouldMoveNode || isMovingDown) { + currentPreservedIndex++; + } + + newChildren.push( + renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, { + forceIndex: true, + ...(shouldMoveNode && { + moveDirection: isMovingDown ? 'down' : 'up', + }), + })!, + ); + }); + + if (fragmentQueue) { + newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new)); + } + + return newChildren; +} + +function flushFragmentQueue( + fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement, +) { + if (fragmentQueue.length === 1) { + return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!]; + } else if (fragmentQueue.length > 1) { + const fragment = document.createDocumentFragment(); + const newChildren = fragmentQueue.map(($fragmentChild) => ( + renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })! + )); + + if (parentEl.childNodes[fragmentIndex]) { + parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]); + } else { + parentEl.appendChild(fragment); + } + + return newChildren; + } + + throw new Error('Unexpected input'); +} + +function updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) { + const currentKeys = Object.keys($current.props); + const newKeys = Object.keys($new.props); + + currentKeys.forEach((key) => { + if ($current.props[key] !== undefined && $new.props[key] === undefined) { + removeAttribute(element, key, $current.props[key]); + } + }); + + newKeys.forEach((key) => { + if ($new.props[key] === undefined) { + return; + } + + if ($current.props[key] !== $new.props[key]) { + if ($current.props[key] === undefined) { + addAttribute(element, key, $new.props[key]); + } else { + updateAttribute(element, key, $current.props[key], $new.props[key]); + } + } + }); +} + +function addAttribute(element: HTMLElement, key: string, value: any) { + if (value === undefined) { + return; + } + + // An optimization attempt + if (key === 'className') { + element.className = value; + // An optimization attempt + } else if (key === 'value') { + (element as HTMLInputElement).value = value; + } else if (key === 'style') { + element.style.cssText = value; + } else if (key.startsWith('on')) { + addEventListener(element, key, value); + } else if (key.startsWith('data-')) { + element.setAttribute(key, value); + } else if (!FILTERED_ATTRIBUTES.has(key)) { + (element as any)[MAPPED_ATTRIBUTES[key] || key] = value; + } +} + +function removeAttribute(element: HTMLElement, key: string, value: any) { + if (key === 'className') { + element.className = ''; + } else if (key === 'value') { + (element as HTMLInputElement).value = ''; + } else if (key === 'style') { + element.style.cssText = ''; + } else if (key.startsWith('on')) { + removeEventListener(element, key, value); + } else if (key.startsWith('data-')) { + element.removeAttribute(key); + } else if (!FILTERED_ATTRIBUTES.has(key)) { + delete (element as any)[MAPPED_ATTRIBUTES[key] || key]; + } +} + +function updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) { + if (key === 'value') { + // Removing and adding value causes a cursor jump + (element as HTMLInputElement).value = newValue !== undefined ? newValue : ''; + } else { + removeAttribute(element, key, oldValue); + addAttribute(element, key, newValue); + } +} + +function DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) { + DEBUG_virtualTreeSize += $current.children.length; + + $current.children.forEach(($child) => { + if (isRealElement($child)) { + DEBUG_addToVirtualTreeSize($child); + } + }); +} + +export default { render }; diff --git a/src/lib/teact/teact.ts b/src/lib/teact/teact.ts new file mode 100644 index 000000000..87066357d --- /dev/null +++ b/src/lib/teact/teact.ts @@ -0,0 +1,578 @@ +import { DEBUG, DEBUG_MORE } from '../../config'; +import { + fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf, +} from '../../util/schedulers'; +import { flatten, orderBy } from '../../util/iteratees'; +import arePropsShallowEqual from '../../util/arePropsShallowEqual'; +import { handleError } from '../../util/handleError'; +import { removeAllDelegatedListeners } from './dom-events'; + +export type Props = AnyLiteral; +export type FC

    = (props: P) => any; + +export enum VirtualElementTypesEnum { + Empty, + Text, + Tag, + Component, +} + +interface VirtualElementEmpty { + type: VirtualElementTypesEnum.Empty; + target?: Node; +} + +interface VirtualElementText { + type: VirtualElementTypesEnum.Text; + target?: Node; + value: string; +} + +export interface VirtualElementTag { + type: VirtualElementTypesEnum.Tag; + target?: Node; + tag: string; + props: Props; + children: VirtualElementChildren; +} + +export interface VirtualElementComponent { + type: VirtualElementTypesEnum.Component; + componentInstance: ComponentInstance; + props: Props; + children: VirtualElementChildren; +} + +export type StateHookSetter = (newValue: ((current: T) => T) | T) => void; + +interface ComponentInstance { + $element: VirtualElementComponent; + Component: FC; + name: string; + props: Props; + renderedValue?: any; + isMounted: boolean; + hooks: { + state: { + cursor: number; + byCursor: { + value: any; + nextValue: any; + setter: StateHookSetter; + }[]; + }; + effects: { + cursor: number; + byCursor: { + effect: () => void; + dependencies?: any[]; + cleanup?: Function; + }[]; + }; + memos: { + cursor: number; + byCursor: { + current: any; + dependencies: any[]; + }[]; + }; + }; + scheduleNextState?: () => void; + forceUpdate?: () => void; + onUpdate?: () => void; +} + +export type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent; +export type VirtualRealElement = VirtualElementTag | VirtualElementComponent; +export type VirtualElementChildren = VirtualElement[]; + +const Fragment = Symbol('Fragment'); + +let renderingInstance: ComponentInstance; + +export function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty { + return $element.type === VirtualElementTypesEnum.Empty; +} + +export function isTextElement($element: VirtualElement): $element is VirtualElementText { + return $element.type === VirtualElementTypesEnum.Text; +} + +export function isTagElement($element: VirtualElement): $element is VirtualElementTag { + return $element.type === VirtualElementTypesEnum.Tag; +} + +export function isComponentElement($element: VirtualElement): $element is VirtualElementComponent { + return $element.type === VirtualElementTypesEnum.Component; +} + +export function isRealElement($element: VirtualElement): $element is VirtualRealElement { + return isTagElement($element) || isComponentElement($element); +} + +function createElement( + source: string | FC | typeof Fragment, + props: Props, + ...children: any[] +): VirtualRealElement | VirtualElementChildren { + if (!props) { + props = {}; + } + + children = flatten(children); + + if (source === Fragment) { + return children; + } else if (typeof source === 'function') { + return createComponentInstance(source, props, children); + } else { + return buildTagElement(source, props, children); + } +} + +function createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent { + let parsedChildren: any | any[] | undefined; + if (children.length === 0) { + parsedChildren = undefined; + } else if (children.length === 1) { + [parsedChildren] = children; + } else { + parsedChildren = children; + } + + const componentInstance: ComponentInstance = { + $element: {} as VirtualElementComponent, + Component, + name: Component.name, + props: { + ...props, + ...(parsedChildren && { children: parsedChildren }), + }, + isMounted: false, + hooks: { + state: { + cursor: 0, + byCursor: [], + }, + effects: { + cursor: 0, + byCursor: [], + }, + memos: { + cursor: 0, + byCursor: [], + }, + }, + }; + + componentInstance.$element = buildComponentElement(componentInstance); + + return componentInstance.$element; +} + +function buildComponentElement( + componentInstance: ComponentInstance, + children: VirtualElementChildren = [], +): VirtualElementComponent { + const { props } = componentInstance; + + return { + componentInstance, + type: VirtualElementTypesEnum.Component, + props, + children, + }; +} + +function buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag { + return { + type: VirtualElementTypesEnum.Tag, + tag, + props, + children: dropEmptyTail(children).map(buildChildElement), + }; +} + +// We only need placeholders in the middle of collection (to ensure other elements order). +function dropEmptyTail(children: any[]) { + let i = children.length - 1; + + for (; i >= 0; i--) { + if (!isEmptyPlaceholder(children[i])) { + break; + } + } + + return i + 1 < children.length ? children.slice(0, i + 1) : children; +} + +function isEmptyPlaceholder(child: any) { + // eslint-disable-next-line no-null/no-null + return child === false || child === null || child === undefined; +} + +function buildChildElement(child: any): VirtualElement { + if (isEmptyPlaceholder(child)) { + return buildEmptyElement(); + } else if (isRealElement(child)) { + return child; + } else { + return buildTextElement(child); + } +} + +function buildTextElement(value: any): VirtualElementText { + return { + type: VirtualElementTypesEnum.Text, + value: String(value), + }; +} + +function buildEmptyElement(): VirtualElementEmpty { + return { type: VirtualElementTypesEnum.Empty }; +} + +const DEBUG_components: AnyLiteral = {}; + +document.addEventListener('dblclick', () => { + // eslint-disable-next-line no-console + console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc')); +}); + +export function renderComponent(componentInstance: ComponentInstance) { + renderingInstance = componentInstance; + componentInstance.hooks.state.cursor = 0; + componentInstance.hooks.effects.cursor = 0; + componentInstance.hooks.memos.cursor = 0; + + const { Component, props } = componentInstance; + let newRenderedValue; + + try { + let DEBUG_startAt: number | undefined; + if (DEBUG) { + const componentName = componentInstance.name; + if (!DEBUG_components[componentName]) { + DEBUG_components[componentName] = { + componentName, + renderCount: 0, + renderTimes: [], + }; + } + + if (DEBUG_MORE) { + if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') { + // eslint-disable-next-line no-console + console.log(`[Teact] Render ${componentName}`); + } + } + + DEBUG_startAt = performance.now(); + } + + newRenderedValue = Component(props); + + if (DEBUG) { + const renderTime = performance.now() - DEBUG_startAt!; + const componentName = componentInstance.name; + if (renderTime > 7) { + // eslint-disable-next-line no-console + console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`); + } + DEBUG_components[componentName].renderTimes.push(renderTime); + DEBUG_components[componentName].renderCount++; + } + } catch (err) { + handleError(err); + + newRenderedValue = componentInstance.renderedValue; + } + + if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) { + return componentInstance.$element; + } + + componentInstance.renderedValue = newRenderedValue; + + const newChild = buildChildElement(newRenderedValue); + componentInstance.$element = buildComponentElement(componentInstance, [newChild]); + + return componentInstance.$element; +} + +export function hasElementChanged($old: VirtualElement, $new: VirtualElement) { + if (typeof $old !== typeof $new) { + return true; + } else if ($old.type !== $new.type) { + return true; + } else if (isTextElement($old) && isTextElement($new)) { + return $old.value !== $new.value; + } else if (isTagElement($old) && isTagElement($new)) { + return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key); + } else if (isComponentElement($old) && isComponentElement($new)) { + return ( + $old.componentInstance.Component !== $new.componentInstance.Component + ) || ( + $old.props.key !== $new.props.key + ); + } + + return false; +} + +export function unmountTree($element: VirtualElement) { + if (!isRealElement($element)) { + return; + } + + if (isComponentElement($element)) { + unmountComponent($element.componentInstance); + } else if ($element.target) { + removeAllDelegatedListeners($element.target as HTMLElement); + // Trying to help GC + // eslint-disable-next-line no-null/no-null + $element.target = null as any; + } + + $element.children.forEach(unmountTree); +} + +export function mountComponent(componentInstance: ComponentInstance) { + renderComponent(componentInstance); + componentInstance.isMounted = true; + return componentInstance.$element; +} + +function unmountComponent(componentInstance: ComponentInstance) { + if (!componentInstance.isMounted) { + return; + } + + componentInstance.hooks.memos.byCursor.forEach((hook) => { + // eslint-disable-next-line no-null/no-null + hook.current = null; + }); + + componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => { + if (typeof cleanup === 'function') { + try { + cleanup(); + } catch (err) { + handleError(err); + } + } + }); + + componentInstance.isMounted = false; + + helpGc(componentInstance); +} + +// We force cleaning as many objects as possible. Not sure this is needed at all. +/* eslint-disable no-null/no-null */ +function helpGc(componentInstance: ComponentInstance) { + componentInstance.hooks.effects.byCursor.forEach((hook) => { + hook.cleanup = null as any; + hook.effect = null as any; + hook.dependencies = null as any; + }); + + componentInstance.hooks.state.byCursor.forEach((hook) => { + hook.value = null as any; + hook.nextValue = null as any; + hook.setter = null as any; + }); + + componentInstance.hooks.memos.byCursor.forEach((hook) => { + hook.dependencies = null as any; + }); + + componentInstance.hooks = null as any; + componentInstance.$element = null as any; + componentInstance.Component = null as any; + componentInstance.props = null as any; + componentInstance.forceUpdate = null as any; + componentInstance.onUpdate = null as any; +} + +/* eslint-enable no-null/no-null */ + +function applyNextState(componentInstance: ComponentInstance) { + if (!componentInstance.isMounted) { + return; + } + + componentInstance.hooks.state.byCursor.forEach((hook) => { + hook.value = hook.nextValue; + }); +} + +function forceUpdateComponent(componentInstance: ComponentInstance) { + if (!componentInstance.isMounted || !componentInstance.onUpdate) { + return; + } + + const currentElement = componentInstance.$element; + renderComponent(componentInstance); + + if (componentInstance.$element !== currentElement) { + componentInstance.onUpdate(); + } +} + +export function getTarget($element: VirtualElement): Node | undefined { + if (isComponentElement($element)) { + return getTarget($element.children[0]); + } else { + return $element.target; + } +} + +export function setTarget($element: VirtualElement, target: Node) { + if (isComponentElement($element)) { + setTarget($element.children[0], target); + } else { + $element.target = target; + } +} + +export function useState(initial?: T): [T, StateHookSetter] { + const { cursor, byCursor } = renderingInstance.hooks.state; + + if (byCursor[cursor] === undefined) { + byCursor[cursor] = { + value: initial, + nextValue: initial, + setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => { + if (byCursor[cursor].nextValue !== newValue) { + byCursor[cursor].nextValue = typeof newValue === 'function' + ? (newValue as (current: T) => T)(byCursor[cursor].value) + : newValue; + + if (!componentInstance.scheduleNextState || !componentInstance.forceUpdate) { + componentInstance.scheduleNextState = throttleWithPrimaryRaf(() => applyNextState(componentInstance)); + componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance)); + } + + componentInstance.scheduleNextState(); + componentInstance.forceUpdate(); + } + })(renderingInstance), + }; + } + + renderingInstance.hooks.state.cursor++; + + return [ + byCursor[cursor].value, + byCursor[cursor].setter, + ]; +} + +function useLayoutEffectBase( + schedulerFn: typeof onTickEnd | typeof requestAnimationFrame, + effect: () => Function | void, + dependencies?: any[], +) { + const { cursor, byCursor } = renderingInstance.hooks.effects; + const componentInstance = renderingInstance; + + const exec = () => { + if (!componentInstance.isMounted) { + return; + } + + const { cleanup } = byCursor[cursor]; + if (typeof cleanup === 'function') { + try { + cleanup(); + } catch (err) { + handleError(err); + } + } + + byCursor[cursor].cleanup = effect() as Function; + }; + + if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) { + if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) { + schedulerFn(exec); + } + } else { + schedulerFn(exec); + } + + byCursor[cursor] = { + effect, + dependencies, + cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined, + }; + + renderingInstance.hooks.effects.cursor++; +} + +export function useEffect(effect: () => Function | void, dependencies?: any[]) { + return useLayoutEffectBase(fastRaf, effect, dependencies); +} + +export function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) { + return useLayoutEffectBase(onTickEnd, effect, dependencies); +} + +export function useMemo(resolver: () => T, dependencies: any[]): T { + const { cursor, byCursor } = renderingInstance.hooks.memos; + let { current } = byCursor[cursor] || {}; + + if ( + byCursor[cursor] === undefined + || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i]) + ) { + current = resolver(); + } + + byCursor[cursor] = { + current, + dependencies, + }; + + renderingInstance.hooks.memos.cursor++; + + return current; +} + +export function useCallback(newCallback: F, dependencies: any[]): F { + // eslint-disable-next-line react-hooks/exhaustive-deps + return useMemo(() => newCallback, dependencies); +} + +export function useRef(initial: T): { current: T }; +export function useRef(): { current: T | undefined }; // TT way (empty is `undefined`) +export function useRef(initial: null): { current: T | null }; // React way (empty is `null`) +// eslint-disable-next-line no-null/no-null +export function useRef(initial?: T | null) { + return useMemo(() => ({ + current: initial, + // eslint-disable-next-line react-hooks/exhaustive-deps + }), []); +} + +export function memo(Component: T, areEqual = arePropsShallowEqual) { + return function TeactMemoWrapper(props: Props) { + // eslint-disable-next-line react-hooks/rules-of-hooks + const propsRef = useRef(props); + const renderedRef = useRef(); + + if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) { + propsRef.current = props; + renderedRef.current = createElement(Component, props) as VirtualElementComponent; + } + + return renderedRef.current; + } as T; +} + +// We need to keep it here for JSX. +export default { + createElement, + Fragment, +}; diff --git a/src/lib/teact/teactn.tsx b/src/lib/teact/teactn.tsx new file mode 100644 index 000000000..2d910855f --- /dev/null +++ b/src/lib/teact/teactn.tsx @@ -0,0 +1,233 @@ +import React, { + FC, Props, useEffect, useState, +} from './teact'; + +import { DEBUG, DEBUG_MORE } from '../../config'; +import useForceUpdate from '../../hooks/useForceUpdate'; +import generateIdFor from '../../util/generateIdFor'; +import { throttleWithRaf } from '../../util/schedulers'; +import arePropsShallowEqual from '../../util/arePropsShallowEqual'; +import { orderBy } from '../../util/iteratees'; +import { GlobalState, GlobalActions, ActionTypes } from '../../global/types'; +import { handleError } from '../../util/handleError'; + +export default React; + +type ActionPayload = AnyLiteral; + +type Reducer = ( + global: GlobalState, + actions: GlobalActions, + payload: any, +) => GlobalState | void; + +type MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null); +type MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null); + +let currentGlobal = {} as GlobalState; + +const reducers: Record = {}; +const callbacks: Function[] = [updateContainers]; +const actions = {} as GlobalActions; +const containers = new Map; + mapReducersToProps: MapActionsToProps; + ownProps: Props; + mappedProps?: Props; + forceUpdate: Function; + areMappedPropsChanged: boolean; + DEBUG_updates: number; + DEBUG_componentName: string; +}>(); + +function runCallbacks() { + callbacks.forEach((cb) => cb(currentGlobal)); +} + +const runCallbacksThrottled = throttleWithRaf(runCallbacks); + +export function setGlobal(newGlobal?: GlobalState) { + if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) { + currentGlobal = newGlobal; + runCallbacksThrottled(); + } +} + +export function getGlobal() { + return currentGlobal; +} + +export function getDispatch() { + return actions; +} + +function onDispatch(name: string, payload?: ActionPayload) { + if (reducers[name]) { + reducers[name].forEach((reducer) => { + const newGlobal = reducer(currentGlobal, actions, payload); + if (newGlobal) { + setGlobal(newGlobal); + } + }); + } +} + +function updateContainers() { + let DEBUG_startAt: number | undefined; + if (DEBUG) { + DEBUG_startAt = performance.now(); + } + + // eslint-disable-next-line no-restricted-syntax + for (const container of containers.values()) { + const { + mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate, + } = container; + + let newMappedProps; + + try { + newMappedProps = { + ...mapStateToProps(currentGlobal, ownProps), + ...mapReducersToProps(setGlobal, actions), + }; + } catch (err) { + handleError(err); + + return; + } + + if (DEBUG) { + if (Object.values(newMappedProps).some(Number.isNaN)) { + // eslint-disable-next-line no-console + console.warn( + // eslint-disable-next-line max-len + `[TeactN] Some of \`${container.DEBUG_componentName}\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`, + ); + } + } + + if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) { + if (DEBUG_MORE) { + // eslint-disable-next-line no-console + console.log( + '[TeactN] Will update', + container.DEBUG_componentName, + 'caused by', + getUnequalProps(mappedProps!, newMappedProps).join(', '), + ); + } + + container.mappedProps = newMappedProps; + container.areMappedPropsChanged = true; + container.DEBUG_updates++; + + forceUpdate(); + } + } + + if (DEBUG) { + const updateTime = performance.now() - DEBUG_startAt!; + if (updateTime > 7) { + // eslint-disable-next-line no-console + console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`); + } + } +} + +export function addReducer(name: ActionTypes, reducer: Reducer) { + if (!reducers[name]) { + reducers[name] = []; + + actions[name] = (payload?: ActionPayload) => { + onDispatch(name, payload); + }; + } + + reducers[name].push(reducer); +} + +export function addCallback(cb: Function) { + callbacks.push(cb); +} + +export function removeCallback(cb: Function) { + const index = callbacks.indexOf(cb); + if (index !== -1) { + callbacks.splice(index, 1); + } +} + +export function withGlobal( + mapStateToProps: MapStateToProps = () => ({}), + mapReducersToProps: MapActionsToProps = () => ({}), +) { + return (Component: FC) => { + return function TeactNContainer(props: OwnProps) { + const [id] = useState(generateIdFor(containers)); + const forceUpdate = useForceUpdate(); + + useEffect(() => { + return () => { + containers.delete(id); + }; + }, [id]); + + let container = containers.get(id); + if (!container) { + container = { + mapStateToProps, + mapReducersToProps, + ownProps: props, + areMappedPropsChanged: false, + forceUpdate, + DEBUG_updates: 0, + DEBUG_componentName: Component.name, + }; + + containers.set(id, container); + } + + if (container.areMappedPropsChanged) { + container.areMappedPropsChanged = false; + } + + if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) { + container.ownProps = props; + + try { + container.mappedProps = { + ...mapStateToProps(currentGlobal, props), + ...mapReducersToProps(setGlobal, actions), + }; + } catch (err) { + handleError(err); + } + } + + // eslint-disable-next-line react/jsx-props-no-spreading + return ; + }; + }; +} + +function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) { + const currentKeys = Object.keys(currentProps); + const currentKeysLength = currentKeys.length; + const newKeysLength = Object.keys(newProps).length; + + if (currentKeysLength !== newKeysLength) { + return ['LENGTH']; + } + + return currentKeys.filter((prop) => currentProps[prop] !== newProps[prop]); +} + +if (DEBUG) { + (window as any).getGlobal = getGlobal; + + document.addEventListener('dblclick', () => { + // eslint-disable-next-line no-console + console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc')); + }); +} diff --git a/src/lib/twemojiRegex.js b/src/lib/twemojiRegex.js new file mode 100644 index 000000000..f5512d69c --- /dev/null +++ b/src/lib/twemojiRegex.js @@ -0,0 +1,15 @@ +// Copyright Twitter Inc. Licensed under MIT +// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md +// Version 09.05.2020 + +const vs16RegExp = /\uFE0F/g; +// avoid using a string literal like '\u200D' here because minifiers expand it inline +const zeroWidthJoiner = String.fromCharCode(0x200d); + +export function removeVS16s(rawEmoji) { + return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji; +} + +// This file is generated by source/emoji/scripts/generate.sh +// eslint-disable-next-line max-len +export default /(?:\u2624|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g; diff --git a/src/lib/webp/webp_wasm.js b/src/lib/webp/webp_wasm.js new file mode 100644 index 000000000..b7fe51cbb --- /dev/null +++ b/src/lib/webp/webp_wasm.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for getValue: "+type)}return null}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":157,"maximum":157+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var DYNAMIC_BASE=5259680,DYNAMICTOP_PTR=16640;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="webp_wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}__ATINIT__.push({func:function(){___wasm_call_ctors()}});function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var asmLibraryArg={"a":___assert_fail,"b":_emscripten_memcpy_big,"c":_emscripten_resize_heap,"memory":wasmMemory,"table":wasmTable};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _version=Module["_version"]=function(){return(_version=Module["_version"]=Module["asm"]["e"]).apply(null,arguments)};var _getInfo=Module["_getInfo"]=function(){return(_getInfo=Module["_getInfo"]=Module["asm"]["f"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["g"]).apply(null,arguments)};var _decode=Module["_decode"]=function(){return(_decode=Module["_decode"]=Module["asm"]["h"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["i"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["j"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["k"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["l"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["m"]).apply(null,arguments)};Module["cwrap"]=cwrap;Module["getValue"]=getValue;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); diff --git a/src/lib/webp/webp_wasm.wasm b/src/lib/webp/webp_wasm.wasm new file mode 100644 index 0000000000000000000000000000000000000000..33380c37d0fe0406ff05f2aaf0ec6fce6829c71e GIT binary patch literal 126584 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 literal 0 HcmV?d00001 diff --git a/src/lib/webp/webp_wasm.worker.js b/src/lib/webp/webp_wasm.worker.js new file mode 100644 index 000000000..6654d8231 --- /dev/null +++ b/src/lib/webp/webp_wasm.worker.js @@ -0,0 +1,51 @@ +/* eslint-disable */ +importScripts('webp_wasm.js'); + +Module.onRuntimeInitialized = async () => { + self.postMessage({ type: 'initialized' }); +}; + +self.onmessage = (event) => { + const { id, blob } = event.data; + const reader = new FileReader(); + + reader.addEventListener('loadend', () => { + const buffer = reader.result; + + const size = buffer.byteLength; + const thisPtr = Module._malloc(size); + Module.HEAPU8.set(new Uint8Array(buffer), thisPtr); + + const getInfo = Module.cwrap('getInfo', 'number', ['number', 'number']); + + const ptr = getInfo(thisPtr, size); + const success = !!Module.getValue(ptr, 'i32'); + if (!success) { + Module._free(ptr); + Module._free(thisPtr); + self.postMessage({ + type: 'result', id, width: 0, height: 0, result: null, + }); + return; + } + const width = Module.getValue(ptr + 4, 'i32'); + const height = Module.getValue(ptr + 8, 'i32'); + + Module._free(ptr); + + const decode = Module.cwrap('decode', 'number', ['number', 'number']); + + const resultPtr = decode(thisPtr, size); + + const resultView = new Uint8Array(Module.HEAPU8.buffer, resultPtr, width * height * 4); + const result = new Uint8ClampedArray(resultView); + Module._free(resultPtr); + Module._free(thisPtr); + + self.postMessage({ + type: 'result', id, width, height, result, + }); + }); + + reader.readAsArrayBuffer(blob); +}; diff --git a/src/modules/actions/all.ts b/src/modules/actions/all.ts new file mode 100644 index 000000000..ad3188e0d --- /dev/null +++ b/src/modules/actions/all.ts @@ -0,0 +1,33 @@ +import './ui/initial'; +import './ui/chats'; +import './ui/messages'; +import './ui/globalSearch'; +import './ui/localSearch'; +import './ui/stickerSearch'; +import './ui/users'; +import './ui/settings'; +import './ui/misc'; +import './ui/payments'; + +import './api/initial'; +import './api/chats'; +import './api/messages'; +import './api/symbols'; +import './api/globalSearch'; +import './api/localSearch'; +import './api/management'; +import './api/sync'; +import './api/users'; +import './api/bots'; +import './api/settings'; +import './api/twoFaSettings'; +import './api/payments'; + +import './apiUpdaters/initial'; +import './apiUpdaters/chats'; +import './apiUpdaters/messages'; +import './apiUpdaters/users'; +import './apiUpdaters/symbols'; +import './apiUpdaters/misc'; +import './apiUpdaters/settings'; +import './apiUpdaters/twoFaSettings'; diff --git a/src/modules/actions/api/bots.ts b/src/modules/actions/api/bots.ts new file mode 100644 index 000000000..75b47d800 --- /dev/null +++ b/src/modules/actions/api/bots.ts @@ -0,0 +1,91 @@ +import { addReducer, getDispatch } from '../../../lib/teact/teactn'; + +import { ApiChat } from '../../../api/types'; + +import { RE_TME_LINK } from '../../../config'; +import { callApi } from '../../../api/gramjs'; +import { selectChatMessage, selectCurrentChat } from '../../selectors'; + +addReducer('clickInlineButton', (global, actions, payload) => { + const { button } = payload; + + switch (button.type) { + case 'command': + actions.sendBotCommand({ command: button.value }); + break; + case 'url': + if (button.value.match(RE_TME_LINK)) { + actions.openTelegramLink({ url: button.value }); + } else { + window.open(button.value); + } + break; + case 'callback': { + const chat = selectCurrentChat(global); + if (!chat) { + return; + } + + void answerCallbackButton(chat, button.messageId, button.value); + break; + } + case 'requestPoll': + actions.openPollModal(); + break; + case 'buy': { + const chat = selectCurrentChat(global); + const { messageId, value } = button; + if (!chat) { + return; + } + + if (value) { + actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId }); + } else { + actions.getPaymentForm({ messageId }); + actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId)); + actions.openPaymentModal({ messageId }); + } + break; + } + } +}); + +addReducer('sendBotCommand', (global, actions, payload) => { + const { command } = payload; + const { currentUserId } = global; + const chat = selectCurrentChat(global); + if (!currentUserId || !chat) { + return; + } + + void sendBotCommand(chat, currentUserId, command); +}); + +async function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) { + await callApi('sendMessage', { + chat, + text: command, + }); +} + +async function answerCallbackButton(chat: ApiChat, messageId: number, data: string) { + const result = await callApi('answerCallbackButton', { + chatId: chat.id, + accessHash: chat.accessHash, + messageId, + data, + }); + + if (!result || !result.message) { + return; + } + + const { message, alert: isError } = result; + + if (isError) { + getDispatch().showError({ error: { message } }); + } else { + getDispatch().showNotification({ message }); + } +} diff --git a/src/modules/actions/api/chats.ts b/src/modules/actions/api/chats.ts new file mode 100644 index 000000000..e930d74da --- /dev/null +++ b/src/modules/actions/api/chats.ts @@ -0,0 +1,901 @@ +import { + addReducer, getDispatch, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { + ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID, +} from '../../../api/types'; +import { ChatCreationProgress, ManagementProgress } from '../../../types'; +import { GlobalActions } from '../../../global/types'; + +import { + ARCHIVED_FOLDER_ID, + TOP_CHAT_MESSAGES_PRELOAD_LIMIT, + CHAT_LIST_LOAD_SLICE, + RE_TME_LINK, + +} from '../../../config'; +import { callApi } from '../../../api/gramjs'; +import { + addChats, + addUsers, + replaceThreadParam, + updateChatListIds, + updateChats, + updateChat, + updateChatListSecondaryInfo, + updateManagementProgress, +} from '../../reducers'; +import { + selectChat, + selectCurrentChat, + selectUser, + selectChatListType, + selectIsChatPinned, + selectChatFolder, + selectSupportChat, + selectChatByUsername, + selectThreadTopMessageId, + selectCurrentMessageList, +} from '../../selectors'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { debounce, pause, throttle } from '../../../util/schedulers'; +import { + isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup, +} from '../../helpers'; +import { IS_TOUCH_ENV } from '../../../util/environment'; + +const TOP_CHATS_PRELOAD_PAUSE = 200; +// We expect this ID does not exist +const TMP_CHAT_ID = -1; + +const runThrottledForLoadChats = throttle((cb) => cb(), 1000, true); +const runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true); +const runDebouncedForFetchFullChat = debounce((cb) => cb(), 500, false, true); +const runDebouncedForFetchOnlines = debounce((cb) => cb(), 500, false, true); + +addReducer('preloadTopChatMessages', (global, actions) => { + (async () => { + const preloadedChatIds: number[] = []; + + for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) { + await pause(TOP_CHATS_PRELOAD_PAUSE); + + const { + byId, + listIds: { active: listIds }, + orderedPinnedIds: { active: orderedPinnedIds }, + } = getGlobal().chats; + if (!listIds) { + return; + } + + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds); + const topChats = [...pinnedChats, ...otherChats]; + const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id)); + if (!chatToPreload) { + return; + } + + preloadedChatIds.push(chatToPreload.id); + + actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID }); + + if (IS_TOUCH_ENV) { + actions.loadPinnedMessages({ chatId: chatToPreload.id }); + } + } + })(); +}); + +addReducer('openChat', (global, actions, payload) => { + const { id, threadId } = payload!; + const { currentUserId } = global; + const chat = selectChat(global, id); + + if (chat && chat.hasUnreadMark) { + actions.toggleChatUnread({ id }); + } + + if (!chat) { + if (id === currentUserId) { + void callApi('fetchChat', { type: 'self' }); + } else { + const user = selectUser(global, id); + if (user) { + void callApi('fetchChat', { type: 'user', user }); + } + } + } else if (isChatSummaryOnly(chat) && !chat.isMin) { + actions.requestChatUpdate({ chatId: id }); + } + + if (threadId !== MAIN_THREAD_ID) { + const topMessageId = selectThreadTopMessageId(global, id, threadId); + if (!topMessageId) { + actions.requestThreadInfoUpdate({ chatId: id, threadId }); + } + } +}); + +addReducer('openSupportChat', (global, actions) => { + const chat = selectSupportChat(global); + + actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID }); + + if (chat) { + return; + } + + (async () => { + const result = await callApi('fetchChat', { type: 'support' }); + if (result) { + actions.openChat({ id: result.chatId }); + } + })(); +}); + +addReducer('loadMoreChats', (global, actions, payload) => { + const { listType = 'active' } = payload!; + const listIds = global.chats.listIds[listType as ('active' | 'archived')]; + const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')]; + + if (isFullyLoaded) { + return; + } + + const oldestChat = listIds + ? listIds + .map((id) => global.chats.byId[id]) + .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id)) + .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0] + : undefined; + + if (oldestChat) { + runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date)); + } else { + runThrottledForLoadChats(() => loadChats(listType)); + } +}); + +addReducer('loadFullChat', (global, actions, payload) => { + const { chatId, force } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + if (force) { + loadFullChat(chat); + } else { + runDebouncedForFetchFullChat(() => loadFullChat(chat)); + } +}); + +addReducer('loadSuperGroupOnlines', (global, actions, payload) => { + const { chatId } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + runDebouncedForFetchOnlines(() => callApi('fetchSuperGroupOnlines', chat)); +}); + +addReducer('loadTopChats', () => { + runThrottledForLoadTopChats(() => loadChats('active')); +}); + +addReducer('requestChatUpdate', (global, actions, payload) => { + const { chatId } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + void callApi('requestChatUpdate', chat); +}); + +addReducer('updateChatMutedState', (global, actions, payload) => { + const { chatId, isMuted } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + void callApi('updateChatMutedState', { chat, isMuted }); +}); + +addReducer('createChannel', (global, actions, payload) => { + const { + title, about, photo, memberIds, + } = payload!; + + const members = (memberIds as number[]) + .map((id: number) => selectUser(global, id)) + .filter(Boolean as any); + + void createChannel(title, members, about, photo); +}); + +addReducer('joinChannel', (global, actions, payload) => { + const { chatId } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + const { id: channelId, accessHash } = chat; + + if (channelId && accessHash) { + void callApi('joinChannel', { channelId, accessHash }); + } +}); + +addReducer('leaveChannel', (global, actions, payload) => { + const { chatId } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + const { id: channelId, accessHash } = chat; + + if (channelId && accessHash) { + void callApi('leaveChannel', { channelId, accessHash }); + } +}); + +addReducer('deleteChannel', (global, actions, payload) => { + const { chatId } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + const { id: channelId, accessHash } = chat; + + if (channelId && accessHash) { + void callApi('deleteChannel', { channelId, accessHash }); + } +}); + +addReducer('createGroupChat', (global, actions, payload) => { + const { title, memberIds, photo } = payload!; + const members = (memberIds as number[]) + .map((id: number) => selectUser(global, id)) + .filter(Boolean as any); + + void createGroupChat(title, members, photo); +}); + +addReducer('toggleChatPinned', (global, actions, payload) => { + const { id, folderId } = payload!; + const chat = selectChat(global, id); + if (!chat) { + return; + } + + if (folderId) { + const folder = selectChatFolder(global, folderId); + if (folder) { + const shouldBePinned = !selectIsChatPinned(global, id, folderId); + + const { pinnedChatIds, includedChatIds } = folder; + const newPinnedIds = shouldBePinned + ? [id, ...(pinnedChatIds || [])] + : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id); + + // With both Pin and Unpin we need to re-add a user to the included group + const newIncludedChatIds = [id, ...includedChatIds]; + + void callApi('editChatFolder', { + id: folderId, + folderUpdate: { + ...folder, + pinnedChatIds: newPinnedIds, + includedChatIds: newIncludedChatIds, + }, + }); + } + } else { + const listType = selectChatListType(global, id); + const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined); + void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned }); + } +}); + +addReducer('toggleChatArchived', (global, actions, payload) => { + const { id } = payload!; + const chat = selectChat(global, id); + if (chat) { + void callApi('toggleChatArchived', { + chat, + folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID, + }); + } +}); + +addReducer('loadChatFolders', () => { + void loadChatFolders(); +}); + +addReducer('loadRecommendedChatFolders', () => { + void loadRecommendedChatFolders(); +}); + +addReducer('editChatFolder', (global, actions, payload) => { + const { id, folderUpdate } = payload!; + const folder = selectChatFolder(global, id); + + if (folder) { + void callApi('editChatFolder', { + id, + folderUpdate: { + id, + emoticon: folder.emoticon, + pinnedChatIds: folder.pinnedChatIds, + ...folderUpdate, + }, + }); + } +}); + +addReducer('addChatFolder', (global, actions, payload) => { + const { folder } = payload!; + const { orderedIds } = global.chatFolders; + const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID; + + void createChatFolder(folder, maxId); +}); + +addReducer('deleteChatFolder', (global, actions, payload) => { + const { id } = payload!; + const folder = selectChatFolder(global, id); + + if (folder) { + void deleteChatFolder(id); + } +}); + +addReducer('toggleChatUnread', (global, actions, payload) => { + const { id } = payload!; + const chat = selectChat(global, id); + if (chat) { + if (chat.unreadCount) { + void callApi('markMessageListRead', { chat, threadId: MAIN_THREAD_ID }); + } else { + void callApi('toggleDialogUnread', { + chat, + hasUnreadMark: !chat.hasUnreadMark, + }); + } + } +}); + +addReducer('openTelegramLink', (global, actions, payload) => { + const { url } = payload!; + const match = RE_TME_LINK.exec(url)!; + + const username = match[1]; + const channelPostId = match[2] ? Number(match[2]) : undefined; + + void openChatByUsername(actions, username, channelPostId); +}); + +addReducer('openChatByUsername', (global, actions, payload) => { + const { username } = payload!; + + void openChatByUsername(actions, username); +}); + +addReducer('togglePreHistoryHidden', (global, actions, payload) => { + const { chatId, isEnabled } = payload!; + let chat = selectChat(global, chatId); + + if (!chat) { + return; + } + + (async () => { + if (isChatBasicGroup(chat)) { + chat = await callApi('migrateChat', chat); + + if (!chat) { + return; + } + + actions.openChat({ id: chat.id }); + } + + void callApi('togglePreHistoryHidden', { chat, isEnabled }); + })(); +}); + +addReducer('updateChatDefaultBannedRights', (global, actions, payload) => { + const { chatId, bannedRights } = payload!; + const chat = selectChat(global, chatId); + + if (!chat) { + return; + } + + void callApi('updateChatDefaultBannedRights', { chat, bannedRights }); +}); + +addReducer('updateChatMemberBannedRights', (global, actions, payload) => { + const { chatId, userId, bannedRights } = payload!; + let chat = selectChat(global, chatId); + const user = selectUser(global, userId); + + if (!chat || !user) { + return; + } + + (async () => { + if (isChatBasicGroup(chat)) { + chat = await callApi('migrateChat', chat); + + if (!chat) { + return; + } + + actions.openChat({ id: chat.id }); + } + + await callApi('updateChatMemberBannedRights', { chat, user, bannedRights }); + + const newGlobal = getGlobal(); + const chatAfterUpdate = selectChat(newGlobal, chatId); + + if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) { + return; + } + + const { members, kickedMembers } = chatAfterUpdate.fullInfo; + + const isBanned = !!bannedRights.viewMessages; + const isUnblocked = !Object.keys(bannedRights).length; + + setGlobal(updateChat(newGlobal, chatId, { + fullInfo: { + ...chatAfterUpdate.fullInfo, + ...(members && isBanned && { + members: members.filter((m) => m.userId !== userId), + }), + ...(members && !isBanned && { + members: members.map((m) => ( + m.userId === userId + ? { ...m, bannedRights } + : m + )), + }), + ...(isUnblocked && kickedMembers && { + kickedMembers: kickedMembers.filter((m) => m.userId !== userId), + }), + }, + })); + })(); +}); + +addReducer('updateChatAdmin', (global, actions, payload) => { + const { + chatId, userId, adminRights, customTitle, + } = payload!; + let chat = selectChat(global, chatId); + const user = selectUser(global, userId); + + if (!chat || !user) { + return; + } + + (async () => { + if (isChatBasicGroup(chat)) { + chat = await callApi('migrateChat', chat); + + if (!chat) { + return; + } + + actions.openChat({ id: chat.id }); + } + + await callApi('updateChatAdmin', { + chat, user, adminRights, customTitle, + }); + + const newGlobal = getGlobal(); + const chatAfterUpdate = selectChat(newGlobal, chatId); + + if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) { + return; + } + + const { adminMembers } = chatAfterUpdate.fullInfo; + + const isDismissed = !Object.keys(adminRights).length; + + setGlobal(updateChat(newGlobal, chatId, { + fullInfo: { + ...chatAfterUpdate.fullInfo, + ...(adminMembers && isDismissed && { + adminMembers: adminMembers.filter((m) => m.userId !== userId), + }), + ...(adminMembers && !isDismissed && { + adminMembers: adminMembers.map((m) => ( + m.userId === userId + ? { ...m, adminRights, customTitle } + : m + )), + }), + }, + })); + })(); +}); + +addReducer('updateChat', (global, actions, payload) => { + const { + chatId, title, about, photo, + } = payload!; + + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + (async () => { + setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress)); + + await Promise.all([ + chat.title !== title + ? callApi('updateChatTitle', chat, title) + : undefined, + chat.fullInfo && chat.fullInfo.about !== about + ? callApi('updateChatAbout', chat, about) + : undefined, + photo + ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo }) + : undefined, + ]); + + setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete)); + })(); +}); + +addReducer('toggleSignatures', (global, actions, payload) => { + const { chatId, isEnabled } = payload!; + const chat = selectChat(global, chatId); + + if (!chat) { + return; + } + + void callApi('toggleSignatures', { chat, isEnabled }); +}); + +addReducer('loadGroupsForDiscussion', () => { + (async () => { + const groups = await callApi('fetchGroupsForDiscussion'); + if (!groups) { + return; + } + + const addedById = groups.reduce((result, group) => { + if (group) { + result[group.id] = group; + } + + return result; + }, {} as Record); + + const global = addChats(getGlobal(), addedById); + setGlobal({ + ...global, + chats: { + ...global.chats, + forDiscussionIds: Object.keys(addedById).map(Number), + }, + }); + })(); +}); + +addReducer('linkDiscussionGroup', (global, actions, payload) => { + const { channelId, chatId } = payload!; + + const channel = selectChat(global, channelId); + let chat = selectChat(global, chatId); + if (!channel || !chat) { + return; + } + + (async () => { + if (isChatBasicGroup(chat)) { + chat = await callApi('migrateChat', chat); + + if (!chat) { + return; + } + + actions.openChat({ id: chat.id }); + } + + let { fullInfo } = chat; + if (!fullInfo) { + const fullChat = await callApi('fetchFullChat', chat); + if (!fullChat) { + return; + } + + fullInfo = fullChat.fullInfo; + } + + if (fullInfo.isPreHistoryHidden) { + await callApi('togglePreHistoryHidden', { chat, isEnabled: false }); + } + + void callApi('setDiscussionGroup', { channel, chat }); + })(); +}); + +addReducer('unlinkDiscussionGroup', (global, actions, payload) => { + const { channelId } = payload!; + + const channel = selectChat(global, channelId); + if (!channel) { + return; + } + + let chat: ApiChat | undefined; + if (channel.fullInfo && channel.fullInfo.linkedChatId) { + chat = selectChat(global, channel.fullInfo.linkedChatId); + } + + (async () => { + await callApi('setDiscussionGroup', { channel }); + if (chat) { + loadFullChat(chat); + } + })(); +}); + +async function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) { + const result = await callApi('fetchChats', { + limit: CHAT_LIST_LOAD_SLICE, + offsetDate, + archived: listType === 'archived', + withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined, + }); + + if (!result) { + return; + } + + const { chatIds } = result; + + if (chatIds.length > 0 && chatIds[0] === offsetId) { + chatIds.shift(); + } + + let global = getGlobal(); + + global = addUsers(global, buildCollectionByKey(result.users, 'id')); + global = updateChats(global, buildCollectionByKey(result.chats, 'id')); + global = updateChatListIds(global, listType, chatIds); + global = updateChatListSecondaryInfo(global, listType, result); + + Object.keys(result.draftsById).map(Number).forEach((chatId) => { + global = replaceThreadParam( + global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId], + ); + }); + + Object.keys(result.replyingToById).map(Number).forEach((chatId) => { + global = replaceThreadParam( + global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId], + ); + }); + + + if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) { + global = { + ...global, + chats: { + ...global.chats, + isFullyLoaded: { + ...global.chats.isFullyLoaded, + [listType]: true, + }, + }, + }; + } + + setGlobal(global); +} + +async function loadFullChat(chat: ApiChat) { + const result = await callApi('fetchFullChat', chat); + if (!result) { + return; + } + + const { users, fullInfo } = result; + + let global = getGlobal(); + if (users) { + global = addUsers(global, buildCollectionByKey(users, 'id')); + } + global = updateChat(global, chat.id, { fullInfo }); + + setGlobal(global); +} + +async function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) { + setGlobal({ + ...getGlobal(), + chatCreation: { + progress: ChatCreationProgress.InProgress, + }, + }); + + const createdChannel = await callApi('createChannel', { title, about, users }); + if (!createdChannel) { + return; + } + + const { id: channelId, accessHash } = createdChannel; + + let global = getGlobal(); + global = updateChat(global, channelId, createdChannel); + global = { + ...global, + chatCreation: { + ...global.chatCreation, + progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error, + }, + }; + setGlobal(global); + getDispatch().openChat({ id: channelId }); + + if (channelId && accessHash && photo) { + await callApi('editChatPhoto', { chatId: channelId, accessHash, photo }); + } +} + +async function createGroupChat(title: string, users: ApiUser[], photo?: File) { + setGlobal({ + ...getGlobal(), + chatCreation: { + progress: ChatCreationProgress.InProgress, + }, + }); + + const createdChat = await callApi('createGroupChat', { title, users }); + if (!createdChat) { + return; + } + + const { id: chatId } = createdChat; + + let global = getGlobal(); + global = updateChat(global, chatId, createdChat); + global = { + ...global, + chatCreation: { + ...global.chatCreation, + progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error, + }, + }; + setGlobal(global); + getDispatch().openChat({ id: chatId }); + + if (chatId && photo) { + await callApi('editChatPhoto', { chatId, photo }); + } +} + +async function loadChatFolders() { + const chatFolders = await callApi('fetchChatFolders'); + + if (chatFolders) { + const global = getGlobal(); + + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + ...chatFolders, + }, + }); + } +} + +async function loadRecommendedChatFolders() { + const recommendedChatFolders = await callApi('fetchRecommendedChatFolders'); + + if (recommendedChatFolders) { + const global = getGlobal(); + + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + recommended: recommendedChatFolders, + }, + }); + } +} + +async function createChatFolder(folder: ApiChatFolder, maxId: number) { + // Clear fields from recommended folders + const { id: recommendedId, description, ...newFolder } = folder; + + await callApi('editChatFolder', { + id: maxId + 1, + folderUpdate: { + id: maxId + 1, + ...newFolder, + }, + }); + + if (!description) { + return; + } + + const global = getGlobal(); + const { recommended } = global.chatFolders; + + if (recommended) { + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + recommended: recommended.filter(({ id }) => id !== recommendedId), + }, + }); + } +} + +async function deleteChatFolder(id: number) { + await callApi('deleteChatFolder', id); +} + +async function openChatByUsername( + actions: GlobalActions, + username: string, + channelPostId?: number, +) { + const global = getGlobal(); + const localChat = selectChatByUsername(global, username); + if (localChat && !localChat.isMin) { + if (channelPostId) { + actions.focusMessage({ chatId: localChat.id, messageId: channelPostId }); + } else { + actions.openChat({ id: localChat.id }); + } + return; + } + + const previousChat = selectCurrentChat(global); + // Open temporary empty chat to make the click response feel faster + actions.openChat({ id: TMP_CHAT_ID }); + + const chat = await callApi('getChatByUsername', username); + if (!chat) { + if (previousChat) { + actions.openChat({ id: previousChat.id }); + } + + actions.showNotification({ message: 'User does not exist' }); + + return; + } + + setGlobal(updateChat(getGlobal(), chat.id, chat)); + + if (channelPostId) { + actions.focusMessage({ chatId: chat.id, messageId: channelPostId }); + } else { + actions.openChat({ id: chat.id }); + } +} diff --git a/src/modules/actions/api/globalSearch.ts b/src/modules/actions/api/globalSearch.ts new file mode 100644 index 000000000..8368fb757 --- /dev/null +++ b/src/modules/actions/api/globalSearch.ts @@ -0,0 +1,177 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { callApi } from '../../../api/gramjs'; +import { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types'; + +import { + addChats, + addMessages, + addUsers, + updateGlobalSearch, + updateGlobalSearchFetchingStatus, + updateGlobalSearchResults, +} from '../../reducers'; +import { throttle } from '../../../util/schedulers'; +import { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { GLOBAL_SEARCH_SLICE } from '../../../config'; +import { timestampPlusDay } from '../../../util/dateFormat'; + +const searchThrottled = throttle((cb) => cb(), 500, false); + +addReducer('setGlobalSearchQuery', (global, actions, payload) => { + const { chatId } = global.globalSearch; + const { query } = payload!; + + if (query && !chatId) { + void searchThrottled(() => { + searchChats(query); + }); + } +}); + +addReducer('setGlobalSearchDate', (global, actions, payload) => { + const { date } = payload!; + const maxDate = date ? timestampPlusDay(date) : date; + const newGlobal = updateGlobalSearch(global, { + date, + query: '', + resultsByType: { + ...global.globalSearch.resultsByType, + text: { + totalCount: undefined, + foundIds: [], + nextOffsetId: 0, + }, + }, + }); + setGlobal(newGlobal); + const { chatId } = global.globalSearch; + const chat = chatId ? selectChat(global, chatId) : undefined; + searchMessagesGlobal('', 'text', undefined, chat, maxDate, date); +}); + +addReducer('searchMessagesGlobal', (global, actions, payload) => { + const { + query, resultsByType, chatId, date, + } = global.globalSearch; + const maxDate = date ? timestampPlusDay(date) : date; + const { type } = payload; + const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {}; + + const chat = chatId ? selectChat(global, chatId) : undefined; + + searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date); +}); + +async function searchChats(query: string) { + const result = await callApi('searchChats', { query, limit: GLOBAL_SEARCH_SLICE }); + + let global = getGlobal(); + const currentSearchQuery = selectCurrentGlobalSearchQuery(global); + if (!result || !currentSearchQuery || (query !== currentSearchQuery)) { + setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false })); + return; + } + + const { + localChats, localUsers, globalChats, globalUsers, + } = result; + + if (localChats.length || globalChats.length) { + global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id')); + } + + if (localUsers.length || globalUsers.length) { + global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id')); + } + + global = updateGlobalSearchFetchingStatus(global, { chats: false }); + global = updateGlobalSearch(global, { + localResults: { + chats: localChats, + users: localUsers, + }, + globalResults: { + ...global.globalSearch.globalResults, + chats: globalChats, + users: globalUsers, + }, + }); + + setGlobal(global); +} + +async function searchMessagesGlobal( + query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number, +) { + let result; + + if (chat) { + const localResult = await callApi('searchMessagesLocal', { + chatOrUser: chat, + query, + type, + limit: GLOBAL_SEARCH_SLICE, + offsetId: offsetRate, + minDate, + maxDate, + }); + + if (localResult) { + const { + messages, users, totalCount, nextOffsetId, + } = localResult; + + result = { + messages, + users, + chats: [], + totalCount, + nextRate: nextOffsetId, + }; + } + } else { + result = await callApi('searchMessagesGlobal', { + query, + offsetRate, + limit: GLOBAL_SEARCH_SLICE, + type, + maxDate, + minDate, + }); + } + + let global = getGlobal(); + const currentSearchQuery = selectCurrentGlobalSearchQuery(global); + if (!result || (query !== '' && query !== currentSearchQuery)) { + setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false })); + return; + } + + const { + messages, users, chats, totalCount, nextRate, + } = result; + + if (chats.length) { + global = addChats(global, buildCollectionByKey(chats, 'id')); + } + + if (users.length) { + global = addUsers(global, buildCollectionByKey(users, 'id')); + } + + if (messages.length) { + global = addMessages(global, messages); + } + + global = updateGlobalSearchResults( + global, + messages, + totalCount, + type, + nextRate, + ); + + setGlobal(global); +} diff --git a/src/modules/actions/api/initial.ts b/src/modules/actions/api/initial.ts new file mode 100644 index 000000000..089780053 --- /dev/null +++ b/src/modules/actions/api/initial.ts @@ -0,0 +1,123 @@ +import { + addReducer, getDispatch, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { GlobalState } from '../../../global/types'; + +import { GRAMJS_SESSION_ID_KEY } from '../../../config'; +import { initApi, callApi } from '../../../api/gramjs'; + +addReducer('initApi', (global: GlobalState, actions) => { + const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined; + + void initApi(actions.apiUpdate, sessionId); + + return { + ...global, + authIsSessionRemembered: Boolean(sessionId), + }; +}); + +addReducer('setAuthPhoneNumber', (global, actions, payload) => { + const { phoneNumber } = payload!; + + void callApi('provideAuthPhoneNumber', phoneNumber); + + return { + ...global, + authIsLoading: true, + authError: undefined, + }; +}); + +addReducer('setAuthCode', (global, actions, payload) => { + const { code } = payload!; + + void callApi('provideAuthCode', code); + + return { + ...global, + authIsLoading: true, + authError: undefined, + }; +}); + +addReducer('setAuthPassword', (global, actions, payload) => { + const { password } = payload!; + + void callApi('provideAuthPassword', password); + + return { + ...global, + authIsLoading: true, + authError: undefined, + }; +}); + +addReducer('uploadProfilePhoto', (global, actions, payload) => { + const { file } = payload!; + + void callApi('uploadProfilePhoto', file); +}); + +addReducer('signUp', (global, actions, payload) => { + const { firstName, lastName } = payload!; + + void callApi('provideAuthRegistration', { firstName, lastName }); + + return { + ...global, + authIsLoading: true, + authError: undefined, + }; +}); + +addReducer('returnToAuthPhoneNumber', (global) => { + void callApi('restartAuth'); + + return { + ...global, + authError: undefined, + }; +}); + +addReducer('gotToAuthQrCode', (global) => { + void callApi('restartAuthWithQr'); + + return { + ...global, + authIsLoadingQrCode: true, + authError: undefined, + }; +}); + +addReducer('saveSession', (global, actions, payload) => { + const { sessionId } = payload!; + localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId); +}); + +addReducer('signOut', () => { + void signOut(); +}); + +async function signOut() { + await callApi('destroy'); + localStorage.removeItem(GRAMJS_SESSION_ID_KEY); + + getDispatch().init(); +} + +addReducer('loadNearestCountry', (global) => { + if (global.connectionState !== 'connectionStateReady') { + return; + } + + (async () => { + const authNearestCountry = await callApi('fetchNearestCountry'); + + setGlobal({ + ...getGlobal(), + authNearestCountry, + }); + })(); +}); diff --git a/src/modules/actions/api/localSearch.ts b/src/modules/actions/api/localSearch.ts new file mode 100644 index 000000000..1712ad14c --- /dev/null +++ b/src/modules/actions/api/localSearch.ts @@ -0,0 +1,174 @@ +import { + addReducer, getDispatch, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types'; + +import { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config'; +import { callApi } from '../../../api/gramjs'; +import { + selectCurrentTextSearch, + selectCurrentMediaSearchPeerId, + selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo, +} from '../../selectors'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { + addChatMessagesById, + addUsers, + updateLocalMediaSearchResults, + updateLocalTextSearchResults, +} from '../../reducers'; +import { SharedMediaType } from '../../../types'; + +addReducer('searchTextMessagesLocal', (global) => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + const chat = chatId ? selectChat(global, chatId) : undefined; + const currentSearch = selectCurrentTextSearch(global); + if (!chat || !currentSearch || !threadId) { + return; + } + + const { query, results } = currentSearch; + const offsetId = results ? results.nextOffsetId : undefined; + + let topMessageId: number | undefined; + if (threadId !== MAIN_THREAD_ID) { + const threadInfo = selectThreadInfo(global, chatId!, threadId); + topMessageId = threadInfo ? threadInfo.topMessageId : undefined; + } + + void searchTextMessages(chat, threadId, topMessageId, query, offsetId); +}); + +addReducer('searchMediaMessagesLocal', (global) => { + const peerId = selectCurrentMediaSearchPeerId(global); + const chatOrUser = peerId + ? global.users.byId[peerId] || global.chats.byId[peerId] + : undefined; + const currentSearch = selectCurrentMediaSearch(global); + + if (!chatOrUser || !currentSearch) { + return; + } + + const { currentType: type, resultsByType } = currentSearch; + const currentResults = type && resultsByType && resultsByType[type]; + const offsetId = currentResults ? currentResults.nextOffsetId : undefined; + + if (!type) { + return; + } + + void searchSharedMedia(chatOrUser, type, offsetId); +}); + +addReducer('searchMessagesByDate', (global, actions, payload) => { + const { timestamp } = payload!; + + const { chatId } = selectCurrentMessageList(global) || {}; + if (!chatId) { + return; + } + + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + void searchMessagesByDate(chat, timestamp); +}); + +async function searchTextMessages( + chatOrUser: ApiChat, + threadId: number, + topMessageId?: number, + query?: string, + offsetId?: number, +) { + const result = await callApi('searchMessagesLocal', { + chatOrUser, + type: 'text', + query, + topMessageId, + limit: MESSAGE_SEARCH_SLICE, + offsetId, + }); + + if (!result) { + return; + } + + const { + messages, users, totalCount, nextOffsetId, + } = result; + + const byId = buildCollectionByKey(messages, 'id'); + const newFoundIds = Object.keys(byId).map(Number); + + let global = getGlobal(); + + const currentSearch = selectCurrentTextSearch(global); + if (!currentSearch || (query && query !== currentSearch.query)) { + return; + } + + global = addChatMessagesById(global, chatOrUser.id, byId); + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId); + setGlobal(global); +} + +async function searchSharedMedia( + chatOrUser: ApiChat | ApiUser, + type: SharedMediaType, + offsetId?: number, +) { + const result = await callApi('searchMessagesLocal', { + chatOrUser, + type, + limit: SHARED_MEDIA_SLICE, + offsetId, + }); + + if (!result) { + return; + } + + const { + messages, users, totalCount, nextOffsetId, + } = result; + + const byId = buildCollectionByKey(messages, 'id'); + const newFoundIds = Object.keys(byId).map(Number); + + let global = getGlobal(); + + const currentSearch = selectCurrentMediaSearch(global); + if (!currentSearch) { + return; + } + + global = addChatMessagesById(global, chatOrUser.id, byId); + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId); + setGlobal(global); +} + +/** + * @param timestamp start of target date in seconds + */ +async function searchMessagesByDate(chat: ApiChat, timestamp: number) { + const messageId = await callApi('findFirstMessageIdAfterDate', { + chat, + timestamp, + }); + + if (!messageId) { + return; + } + + getDispatch().focusMessage({ + chatId: chat.id, + messageId, + }); +} diff --git a/src/modules/actions/api/management.ts b/src/modules/actions/api/management.ts new file mode 100644 index 000000000..93bd48a9e --- /dev/null +++ b/src/modules/actions/api/management.ts @@ -0,0 +1,78 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { ManagementProgress } from '../../../types'; +import { callApi } from '../../../api/gramjs'; +import { updateManagement, updateManagementProgress } from '../../reducers'; +import { selectChat, selectCurrentMessageList } from '../../selectors'; +import { isChatBasicGroup } from '../../helpers'; + +addReducer('checkPublicLink', (global, actions, payload) => { + const { chatId } = selectCurrentMessageList(global) || {}; + if (!chatId) { + return; + } + + // No need to check the username if already in progress + if (global.management.progress === ManagementProgress.InProgress) { + return; + } + + const { username } = payload!; + + (async () => { + global = updateManagementProgress(global, ManagementProgress.InProgress); + global = updateManagement(global, chatId, { isUsernameAvailable: undefined }); + setGlobal(global); + + const isUsernameAvailable = await callApi('checkChatUsername', { username })!; + + global = getGlobal(); + global = updateManagementProgress( + global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error, + ); + global = updateManagement(global, chatId, { isUsernameAvailable }); + setGlobal(global); + })(); +}); + +addReducer('updatePublicLink', (global, actions, payload) => { + const { chatId } = selectCurrentMessageList(global) || {}; + let chat = chatId && selectChat(global, chatId); + if (!chatId || !chat) { + return; + } + + const { username } = payload!; + + (async () => { + global = updateManagementProgress(global, ManagementProgress.InProgress); + setGlobal(global); + + if (isChatBasicGroup(chat)) { + chat = await callApi('migrateChat', chat); + + if (!chat) { + return; + } + + actions.openChat({ id: chat.id }); + } + + const result = await callApi('setChatUsername', { chat, username }); + + global = getGlobal(); + global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error); + global = updateManagement(global, chatId, { isUsernameAvailable: undefined }); + setGlobal(global); + })(); +}); + +addReducer('updatePrivateLink', (global) => { + const { chatId } = selectCurrentMessageList(global) || {}; + const chat = chatId && selectChat(global, chatId); + if (!chatId || !chat) { + return; + } + + callApi('updatePrivateLink', { chat }); +}); diff --git a/src/modules/actions/api/messages.ts b/src/modules/actions/api/messages.ts new file mode 100644 index 000000000..a65cc1a93 --- /dev/null +++ b/src/modules/actions/api/messages.ts @@ -0,0 +1,855 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { GlobalActions } from '../../../global/types'; +import { + ApiAttachment, + ApiChat, + ApiMessage, + ApiMessageEntity, + ApiNewPoll, + ApiOnProgress, + ApiSticker, + ApiVideo, + MAIN_THREAD_ID, + MESSAGE_DELETED, +} from '../../../api/types'; +import { LoadMoreDirection } from '../../../types'; + +import { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config'; +import { callApi, cancelApiProgress } from '../../../api/gramjs'; +import { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees'; +import { + addUsers, + addChatMessagesById, + replaceThreadParam, + safeReplaceViewportIds, + updateChatMessage, + addChats, + updateListedIds, + updateOutlyingIds, + replaceScheduledMessages, + updateThreadInfos, +} from '../../reducers'; +import { + selectChat, + selectChatMessage, + selectCurrentMessageList, + selectFocusedMessageId, + selectCurrentChat, + selectListedIds, + selectOutlyingIds, + selectViewportIds, + selectRealLastReadId, + selectReplyingToId, + selectEditingId, + selectDraft, + selectThreadOriginChat, + selectThreadTopMessageId, + selectEditingScheduledId, + selectEditingMessage, + selectScheduledMessage, +} from '../../selectors'; +import { rafPromise } from '../../../util/schedulers'; +import { copyTextToClipboard } from '../../../util/clipboard'; + +const uploadProgressCallbacks = new Map(); + +addReducer('loadViewportMessages', (global, actions, payload) => { + const { + direction = LoadMoreDirection.Around, + isBudgetPreload = false, + } = payload || {}; + + let { chatId, threadId } = payload || {}; + + if (!chatId) { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return undefined; + } + + chatId = currentMessageList.chatId; + threadId = currentMessageList.threadId; + } + + const chat = selectChat(global, chatId); + // TODO Revise if `chat.isRestricted` check is needed + if (!chat || chat.isRestricted) { + return undefined; + } + + const viewportIds = selectViewportIds(global, chatId, threadId); + const listedIds = selectListedIds(global, chatId, threadId); + const outlyingIds = selectOutlyingIds(global, chatId, threadId); + + if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) { + const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId); + const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId)); + const historyIds = (isOutlying ? outlyingIds : listedIds) || []; + const { + newViewportIds, areSomeLocal, areAllLocal, + } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around); + + if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) { + global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds); + } + + if (!areAllLocal) { + void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload); + } + } else { + const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1]; + const isOutlying = Boolean(outlyingIds); + const historyIds = (isOutlying ? outlyingIds : listedIds)!; + const { + newViewportIds, areSomeLocal, areAllLocal, + } = getViewportSlice(historyIds, offsetId, direction); + + if (areSomeLocal) { + global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds); + } + + void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId); + + if (isBudgetPreload) { + return undefined; + } + } + + return global; +}); + +async function loadWithBudget( + actions: GlobalActions, + areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean, + chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number, +) { + if (!areAllLocal) { + await loadViewportMessages( + chat, threadId, offsetId, direction, isOutlying, isBudgetPreload, + ); + } + + if (!isBudgetPreload) { + // Let reducer return and update global + await Promise.resolve(); + actions.loadViewportMessages({ + chatId: chat.id, threadId, direction, isBudgetPreload: true, + }); + } +} + +addReducer('loadMessage', (global, actions, payload) => { + const { chatId, messageId, replyOriginForId } = payload!; + const chat = selectChat(global, chatId); + + if (!chat) { + return; + } + + void loadMessage(chat, messageId, replyOriginForId); +}); + +addReducer('sendMessage', (global, actions, payload) => { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return undefined; + } + + const { chatId, threadId, type } = currentMessageList; + + if (type === 'scheduled' && !payload.scheduledAt) { + return { + ...global, + messages: { + ...global.messages, + contentToBeScheduled: payload, + }, + }; + } + + const chat = selectChat(global, chatId)!; + + actions.setReplyingToId({ messageId: undefined }); + + const params = { + ...payload, + chat, + replyingTo: selectReplyingToId(global, chatId, threadId), + }; + + const isSingle = !payload.attachments || payload.attachments.length <= 1; + const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1; + + if (isSingle) { + const { attachments, ...restParams } = params; + sendMessage({ + ...restParams, + attachment: attachments ? attachments[0] : undefined, + }); + } else if (isGrouped) { + const { + text, entities, attachments, ...commonParams + } = params; + const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM); + for (let i = 0; i < groupedAttachments.length; i++) { + const [firstAttachment, ...restAttachments] = groupedAttachments[i]; + const groupedId = `${Date.now()}${i}`; + + sendMessage({ + ...commonParams, + text: i === 0 ? text : undefined, + entities: i === 0 ? entities : undefined, + attachment: firstAttachment, + groupedId: restAttachments.length > 0 ? groupedId : undefined, + }); + + restAttachments.forEach((attachment: ApiAttachment) => { + sendMessage({ + ...commonParams, + attachment, + groupedId, + }); + }); + } + } else { + const { + text, entities, attachments, replyingTo, ...commonParams + } = params; + + if (text) { + sendMessage({ + ...commonParams, + text, + entities, + replyingTo, + }); + } + + attachments.forEach((attachment: ApiAttachment) => { + sendMessage({ + ...commonParams, + attachment, + }); + }); + } + + return undefined; +}); + +addReducer('editMessage', (global, actions, payload) => { + const { text, entities } = payload!; + + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + + const { chatId, threadId, type: messageListType } = currentMessageList; + const chat = selectChat(global, chatId); + const message = selectEditingMessage(global, chatId, threadId, messageListType); + if (!chat || !message) { + return; + } + + void callApi('editMessage', { + chat, message, text, entities, + }); + + actions.setEditingId({ messageId: undefined }); +}); + +addReducer('cancelSendingMessage', (global, actions, payload) => { + const { chatId, messageId } = payload!; + const message = selectChatMessage(global, chatId, messageId); + const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id); + if (progressCallback) { + cancelApiProgress(progressCallback); + } + + actions.apiUpdate({ + '@type': 'deleteMessages', + ids: [messageId], + chatId, + }); +}); + +addReducer('saveDraft', (global, actions, payload) => { + const { chatId, threadId, draft } = payload!; + if (!draft) { + return undefined; + } + + const { text, entities } = draft; + const chat = selectChat(global, chatId)!; + + if (threadId === MAIN_THREAD_ID) { + void callApi('saveDraft', { + chat, + text, + entities, + replyToMsgId: selectReplyingToId(global, chatId, threadId), + }); + } + + return replaceThreadParam(global, chatId, threadId, 'draft', draft); +}); + +addReducer('clearDraft', (global, actions, payload) => { + const { chatId, threadId, localOnly } = payload!; + if (!selectDraft(global, chatId, threadId)) { + return undefined; + } + + const chat = selectChat(global, chatId)!; + + if (!localOnly && threadId === MAIN_THREAD_ID) { + void callApi('clearDraft', chat); + } + + return replaceThreadParam(global, chatId, threadId, 'draft', undefined); +}); + +addReducer('pinMessage', (global, actions, payload) => { + const chat = selectCurrentChat(global); + if (!chat) { + return; + } + + const { + messageId, isUnpin, isOneSide, isSilent, + } = payload!; + + void callApi('pinMessage', { + chat, messageId, isUnpin, isOneSide, isSilent, + }); +}); + +addReducer('unpinAllMessages', (global, actions, payload) => { + const chat = selectChat(global, payload.chatId); + if (!chat) { + return; + } + + void unpinAllMessages(chat); +}); + +async function unpinAllMessages(chat: ApiChat) { + await callApi('unpinAllMessages', { chat }); + let global = getGlobal(); + global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []); + setGlobal(global); +} + +addReducer('deleteMessages', (global, actions, payload) => { + const { messageIds, shouldDeleteForAll } = payload!; + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + const { chatId, threadId } = currentMessageList; + const chat = selectChat(global, chatId)!; + + void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll }); + + const editingId = selectEditingId(global, chatId, threadId); + if (messageIds.includes(editingId)) { + actions.setEditingId({ messageId: undefined }); + } +}); + +addReducer('deleteScheduledMessages', (global, actions, payload) => { + const { messageIds } = payload!; + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + + const { chatId } = currentMessageList; + const chat = selectChat(global, chatId)!; + + void callApi('deleteScheduledMessages', { chat, messageIds }); + + const editingId = selectEditingScheduledId(global, chatId); + if (messageIds.includes(editingId)) { + actions.setEditingId({ messageId: undefined }); + } +}); + +addReducer('deleteHistory', (global, actions, payload) => { + const { chatId, maxId, shouldDeleteForAll } = payload!; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + void callApi('deleteHistory', { chat, shouldDeleteForAll, maxId }); +}); + +addReducer('markMessageListRead', (global, actions, payload) => { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + + const { chatId, threadId } = currentMessageList; + const chat = selectThreadOriginChat(global, chatId, threadId); + if (!chat) { + return; + } + + const { maxId } = payload!; + + void callApi('markMessageListRead', { chat, threadId, maxId }); +}); + +addReducer('markMessagesRead', (global, actions, payload) => { + const chat = selectCurrentChat(global); + if (!chat) { + return; + } + + const { messageIds } = payload!; + + void callApi('markMessagesRead', { chat, messageIds }); +}); + +addReducer('loadWebPagePreview', (global, actions, payload) => { + const { text } = payload!; + void loadWebPagePreview(text); +}); + +addReducer('clearWebPagePreview', (global) => { + if (!global.webPagePreview) { + return undefined; + } + + return { + ...global, + webPagePreview: undefined, + }; +}); + +addReducer('sendPollVote', (global, actions, payload) => { + const { chatId, messageId, options } = payload!; + const chat = selectChat(global, chatId); + + if (chat) { + void callApi('sendPollVote', { chat, messageId, options }); + } +}); + +addReducer('loadPollOptionResults', (global, actions, payload) => { + const { + chat, messageId, option, offset, limit, shouldResetVoters, + } = payload!; + + void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters); +}); + +addReducer('forwardMessages', (global) => { + const { fromChatId, messageIds, toChatId } = global.forwardMessages; + const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined; + const toChat = toChatId ? selectChat(global, toChatId) : undefined; + const messages = fromChatId && messageIds + ? messageIds + .sort((a, b) => a - b) + .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any) + : undefined; + + if (fromChat && toChat && messages && messages.length) { + void forwardMessages(fromChat, toChat, messages); + } +}); + +addReducer('loadScheduledHistory', (global) => { + const chat = selectCurrentChat(global); + if (!chat) { + return; + } + + const { hash } = global.scheduledMessages.byChatId[chat.id] || {}; + + void loadScheduledHistory(chat, hash); +}); + +addReducer('sendScheduledMessages', (global, actions, payload) => { + const { + chatId, id, + } = payload!; + + const chat = selectChat(global, chatId); + + if (!chat) { + return; + } + + void callApi('sendScheduledMessages', { + chat, + ids: [id], + }); +}); + +addReducer('rescheduleMessage', (global, actions, payload) => { + const { + chatId, messageId, scheduledAt, + } = payload!; + + const chat = selectChat(global, chatId); + const message = chat && selectScheduledMessage(global, chat.id, messageId); + if (!chat || !message) { + return; + } + + void callApi('rescheduleMessage', { + chat, + message, + scheduledAt, + }); +}); + +addReducer('requestThreadInfoUpdate', (global, actions, payload) => { + const { chatId, threadId } = payload; + const chat = selectThreadOriginChat(global, chatId, threadId); + if (!chat) { + return; + } + + void callApi('requestThreadInfoUpdate', { chat, threadId }); +}); + +async function loadWebPagePreview(message: string) { + const webPagePreview = await callApi('fetchWebPagePreview', { message }); + + setGlobal({ + ...getGlobal(), + webPagePreview, + }); +} + +async function loadViewportMessages( + chat: ApiChat, + threadId: number, + offsetId: number | undefined, + direction: LoadMoreDirection, + isOutlying = false, + isBudgetPreload = false, +) { + const chatId = chat.id; + + let addOffset: number | undefined; + switch (direction) { + case LoadMoreDirection.Backwards: + addOffset = undefined; + break; + case LoadMoreDirection.Around: + addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1); + break; + case LoadMoreDirection.Forwards: + addOffset = -(MESSAGE_LIST_SLICE + 1); + break; + } + + const result = await callApi('fetchMessages', { + chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!, + offsetId, + addOffset, + limit: MESSAGE_LIST_SLICE, + threadId, + }); + + if (!result) { + return; + } + + const { + messages, users, chats, threadInfos, firstMessageId, + } = result; + + const byId = buildCollectionByKey(messages, 'id'); + const ids = Object.keys(byId).map(Number); + + let global = getGlobal(); + + global = addChatMessagesById(global, chatId, byId); + global = isOutlying + ? updateOutlyingIds(global, chatId, threadId, ids) + : updateListedIds(global, chatId, threadId, ids); + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = addChats(global, buildCollectionByKey(chats, 'id')); + global = updateThreadInfos(global, chatId, threadInfos); + + if (firstMessageId) { + global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId); + } + + let listedIds = selectListedIds(global, chatId, threadId); + const outlyingIds = selectOutlyingIds(global, chatId, threadId); + + if (isOutlying && listedIds && outlyingIds) { + if (areSortedArraysIntersecting(listedIds, outlyingIds)) { + global = updateListedIds(global, chatId, threadId, outlyingIds); + listedIds = selectListedIds(global, chatId, threadId); + global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined); + isOutlying = false; + } + } + + if (!isBudgetPreload) { + const historyIds = isOutlying ? outlyingIds! : listedIds!; + const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction); + global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!); + } + + setGlobal(global); +} + +async function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) { + const result = await callApi('fetchMessage', { chat, messageId }); + if (!result) { + return; + } + + if (result === MESSAGE_DELETED) { + if (replyOriginForId) { + let global = getGlobal(); + const replyMessage = selectChatMessage(global, chat.id, replyOriginForId); + global = updateChatMessage(global, chat.id, replyOriginForId, { + ...replyMessage, + replyToMessageId: undefined, + }); + setGlobal(global); + } + + return; + } + + let global = getGlobal(); + global = updateChatMessage(global, chat.id, messageId, result.message); + global = addUsers(global, buildCollectionByKey(result.users, 'id')); + setGlobal(global); +} + +function findClosestIndex(sourceIds: number[], offsetId: number) { + if (offsetId < sourceIds[0]) { + return 0; + } + + if (offsetId > sourceIds[sourceIds.length - 1]) { + return sourceIds.length - 1; + } + + return sourceIds.findIndex((id, i) => ( + id === offsetId + || (id < offsetId && sourceIds[i + 1] > offsetId) + )); +} + +function getViewportSlice( + sourceIds: number[], + offsetId: number | undefined, + direction: LoadMoreDirection, +) { + const { length } = sourceIds; + const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1; + const isBackwards = direction === LoadMoreDirection.Backwards; + const indexForDirection = isBackwards ? index : (index + 1) || length; + const from = indexForDirection - MESSAGE_LIST_SLICE; + const to = indexForDirection + MESSAGE_LIST_SLICE - 1; + const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1); + + let areSomeLocal; + let areAllLocal; + switch (direction) { + case LoadMoreDirection.Backwards: + areSomeLocal = indexForDirection > 0; + areAllLocal = from >= 0; + break; + case LoadMoreDirection.Forwards: + areSomeLocal = indexForDirection < length; + areAllLocal = to <= length - 1; + break; + case LoadMoreDirection.Around: + default: + areSomeLocal = newViewportIds.length > 0; + areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE; + break; + } + + return { newViewportIds, areSomeLocal, areAllLocal }; +} + +async function sendMessage(params: { + chat: ApiChat; + text: string; + entities: ApiMessageEntity[]; + replyingTo: number; + attachment: ApiAttachment; + sticker: ApiSticker; + gif: ApiVideo; + poll: ApiNewPoll; +}) { + let localId: number | undefined; + const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => { + if (!uploadProgressCallbacks.has(messageLocalId)) { + localId = messageLocalId; + uploadProgressCallbacks.set(messageLocalId, progressCallback!); + } + + const global = getGlobal(); + + setGlobal({ + ...global, + fileUploads: { + byMessageLocalId: { + ...global.fileUploads.byMessageLocalId, + [messageLocalId]: { progress }, + }, + }, + }); + } : undefined; + + // @optimization + if (params.replyingTo) { + await rafPromise(); + } + + const global = getGlobal(); + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + const { threadId } = currentMessageList; + + if (!params.replyingTo && threadId !== MAIN_THREAD_ID) { + params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!; + } + + await callApi('sendMessage', params, progressCallback); + + if (progressCallback && localId) { + uploadProgressCallbacks.delete(localId); + } +} + +function forwardMessages( + fromChat: ApiChat, + toChat: ApiChat, + messages: ApiMessage[], +) { + callApi('forwardMessages', { + fromChat, + toChat, + messages, + }); + + setGlobal({ + ...getGlobal(), + forwardMessages: {}, + }); +} + +async function loadPollOptionResults( + chat: ApiChat, + messageId: number, + option: string, + offset?: string, + limit?: number, + shouldResetVoters?: boolean, +) { + const result = await callApi('loadPollOptionResults', { + chat, messageId, option, offset, limit, + }); + + if (!result) { + return; + } + + const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i; + let global = getGlobal(); + + global = addUsers(global, buildCollectionByKey(result.users, 'id')); + const { voters } = global.pollResults; + + setGlobal({ + ...global, + pollResults: { + ...global.pollResults, + voters: { + ...voters, + [option]: [ + ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []), + ...(result && result.users.map((user) => user.id)), + ].filter(isUnique), + }, + offsets: { + ...(global.pollResults.offsets ? global.pollResults.offsets : {}), + [option]: result.nextOffset || '', + }, + }, + }); +} + +addReducer('loadPinnedMessages', (global, actions, payload) => { + const { chatId } = payload; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + void loadPinnedMessages(chat); +}); + +addReducer('loadMessageLink', (global, actions, payload) => { + const { messageId, chatId } = payload; + const chat = selectChat(global, chatId); + const message = selectChatMessage(global, chatId, messageId); + + if (!chat || !message) { + return; + } + + (async () => { + const result = await callApi('fetchMessageLink', { chat, message }); + + if (result) { + copyTextToClipboard(result.link); + } + })(); +}); + +async function loadPinnedMessages(chat: ApiChat) { + const result = await callApi('fetchPinnedMessages', { chat }); + if (!result) { + return; + } + + const { messages, chats, users } = result; + + const byId = buildCollectionByKey(messages, 'id'); + const ids = Object.keys(byId).map(Number).sort((a, b) => b - a); + + let global = getGlobal(); + global = addChatMessagesById(global, chat.id, byId); + global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids); + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = addChats(global, buildCollectionByKey(chats, 'id')); + setGlobal(global); +} + +async function loadScheduledHistory(chat: ApiChat, historyHash?: number) { + const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash }); + if (!result) { + return; + } + + const { hash, messages } = result; + + const byId = buildCollectionByKey(messages, 'id'); + const ids = Object.keys(byId).map(Number).sort((a, b) => b - a); + + let global = getGlobal(); + global = replaceScheduledMessages(global, chat.id, byId, hash); + global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids); + setGlobal(global); +} diff --git a/src/modules/actions/api/payments.ts b/src/modules/actions/api/payments.ts new file mode 100644 index 000000000..af9110856 --- /dev/null +++ b/src/modules/actions/api/payments.ts @@ -0,0 +1,218 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { PaymentStep } from '../../../types/index'; +import { callApi } from '../../../api/gramjs'; +import { + selectPaymentMessageId, + selectPaymentRequestId, + selectProviderPublishableKey, + selectStripeCredentials, + selectChatMessage, +} from '../../selectors'; + +import { getStripeError } from '../../helpers/payments'; +import { buildQueryString } from '../../../util/requestQuery'; + +import { + updateShippingOptions, + setPaymentStep, + setRequestInfoId, + setPaymentForm, + setStripeCardInfo, + setInvoiceMessageInfo, + setReceipt, + clearPayment, + closeInvoice, +} from '../../reducers'; + +addReducer('validateRequestedInfo', (global, actions, payload) => { + const { requestInfo, saveInfo } = payload; + const messageId = selectPaymentMessageId(global); + if (!messageId) { + return; + } + validateRequestedInfo(messageId, requestInfo, saveInfo); +}); + +async function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) { + const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave }); + if (!result) { + return; + } + const { id, shippingOptions } = result; + if (!id) { + return; + } + let global = setRequestInfoId(getGlobal(), id); + if (shippingOptions) { + global = updateShippingOptions(global, shippingOptions); + global = setPaymentStep(global, PaymentStep.Shipping); + } else { + global = setPaymentStep(global, PaymentStep.PaymentInfo); + } + setGlobal(global); +} + +addReducer('getPaymentForm', (global, actions, payload) => { + const { messageId } = payload; + if (!messageId) { + return; + } + getPaymentForm(messageId); +}); + + +async function getPaymentForm(messageId: number) { + const result = await callApi('getPaymentForm', { messageId }); + if (!result) { + return; + } + let global = setPaymentForm(getGlobal(), result); + let step = PaymentStep.PaymentInfo; + if (global.payment.invoice + && (global.payment.invoice.shippingAddressRequested + || global.payment.invoice.nameRequested + || global.payment.invoice.phoneRequested + || global.payment.invoice.emailRequested)) { + step = PaymentStep.ShippingInfo; + } + global = setPaymentStep(global, step); + setGlobal(global); +} + +addReducer('getReceipt', (global, actions, payload) => { + const { receiptMessageId, chatId, messageId } = payload; + if (!messageId || !receiptMessageId || !chatId) { + return; + } + getReceipt(messageId, receiptMessageId, chatId); +}); + +async function getReceipt(messageId: number, receiptMessageId: number, chatId: number) { + const result = await callApi('getReceipt', receiptMessageId); + if (!result) { + return; + } + let global = getGlobal(); + const message = selectChatMessage(global, chatId, messageId); + global = setReceipt(global, result, message); + setGlobal(global); +} + +addReducer('clearPaymentError', (global) => { + setGlobal({ + ...global, + payment: { + ...global.payment, + error: undefined, + }, + }); +}); + +addReducer('clearReceipt', (global) => { + setGlobal({ + ...global, + payment: { + ...global.payment, + receipt: undefined, + }, + }); +}); + +addReducer('sendCredentialsInfo', (global, actions, payload) => { + const publishableKey = selectProviderPublishableKey(global); + if (!publishableKey) { + return; + } + const { credentials } = payload; + const { data } = credentials; + sendStipeCredentials(data, publishableKey); +}); + +addReducer('sendPaymentForm', (global, actions, payload) => { + const { shippingOptionId, saveCredentials } = payload; + const messageId = selectPaymentMessageId(global); + const requestInfoId = selectPaymentRequestId(global); + const publishableKey = selectProviderPublishableKey(global); + const stripeCredentials = selectStripeCredentials(global); + if (!messageId || !publishableKey) { + return; + } + sendPaymentForm(messageId, { + save: saveCredentials, + data: stripeCredentials, + }, requestInfoId, shippingOptionId); +}); + +async function sendStipeCredentials(data: { + cardNumber: string; + cardholder?: string; + expiryMonth: string; + expiryYear: string; + cvv: string; + country: string; + zip: string; +}, +publishableKey: string) { + const query = buildQueryString({ + 'card[number]': data.cardNumber, + 'card[exp_month]': data.expiryMonth, + 'card[exp_year]': data.expiryYear, + 'card[cvc]': data.cvv, + 'card[address_zip]': data.zip, + 'card[address_country]': data.country, + }); + + const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, { + method: 'POST', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Bearer ${publishableKey}`, + }, + }); + const result = await response.json(); + if (result.error) { + const error = getStripeError(result.error); + const global = getGlobal(); + setGlobal({ + ...global, + payment: { + ...global.payment, + error: { + ...error, + }, + }, + }); + return; + } + let global = setStripeCardInfo(getGlobal(), { + type: result.type, + id: result.id, + }); + global = setPaymentStep(global, PaymentStep.Checkout); + setGlobal(global); +} + +async function sendPaymentForm( + messageId: number, + credentials: any, + requestedInfoId?: string, + shippingOptionId?: string, +) { + const result = await callApi('sendPaymentForm', { + messageId, credentials, requestedInfoId, shippingOptionId, + }); + if (result) { + const global = clearPayment(getGlobal()); + setGlobal(closeInvoice(global)); + } +} + +addReducer('setPaymentStep', (global, actions, payload = {}) => { + return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo); +}); + +addReducer('setInvoiceMessageInfo', (global, actions, payload) => { + return setInvoiceMessageInfo(global, payload); +}); diff --git a/src/modules/actions/api/settings.ts b/src/modules/actions/api/settings.ts new file mode 100644 index 000000000..2a1f99a4d --- /dev/null +++ b/src/modules/actions/api/settings.ts @@ -0,0 +1,511 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { GlobalState } from '../../../global/types'; +import { + ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact, + UPLOADING_WALLPAPER_SLUG, +} from '../../../types'; + +import { callApi } from '../../../api/gramjs'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { selectUser } from '../../selectors'; +import { + addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings, +} from '../../reducers'; +import { isChatPrivate } from '../../helpers'; + +addReducer('updateProfile', (global, actions, payload) => { + const { + photo, firstName, lastName, bio: about, username, + } = payload!; + + (async () => { + const { currentUserId } = global; + if (!currentUserId) { + return; + } + + setGlobal({ + ...getGlobal(), + profileEdit: { + progress: ProfileEditProgress.InProgress, + }, + }); + + if (photo) { + await callApi('updateProfilePhoto', photo); + } + + if (firstName || lastName || about) { + const result = await callApi('updateProfile', { firstName, lastName, about }); + if (result) { + global = getGlobal(); + const currentUser = currentUserId && selectUser(global, currentUserId); + + if (currentUser) { + setGlobal(updateUser( + global, + currentUser.id, + { + firstName, + lastName, + fullInfo: { + ...currentUser.fullInfo, + bio: about, + }, + }, + )); + } + } + } + + if (username) { + const result = await callApi('updateUsername', username); + if (result && currentUserId) { + setGlobal(updateUser(getGlobal(), currentUserId, { username })); + } + } + + setGlobal({ + ...getGlobal(), + profileEdit: { + progress: ProfileEditProgress.Complete, + }, + }); + })(); +}); + +addReducer('checkUsername', (global, actions, payload) => { + const { username } = payload!; + + (async () => { + // No need to check the username if profile update is already in progress + if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) { + return; + } + + setGlobal({ + ...global, + profileEdit: { + progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle, + isUsernameAvailable: undefined, + }, + }); + + const isUsernameAvailable = await callApi('checkUsername', username); + + global = getGlobal(); + setGlobal({ + ...global, + profileEdit: { + ...global.profileEdit!, + isUsernameAvailable, + }, + }); + })(); +}); + +addReducer('loadWallpapers', () => { + (async () => { + const result = await callApi('fetchWallpapers', 0); + if (!result) { + return; + } + + const global = getGlobal(); + setGlobal({ + ...global, + settings: { + ...global.settings, + loadedWallpapers: result.wallpapers, + }, + }); + })(); +}); + +addReducer('uploadWallpaper', (global, actions, payload) => { + const file = payload; + const previewBlobUrl = URL.createObjectURL(file); + + setGlobal({ + ...global, + settings: { + ...global.settings, + loadedWallpapers: [ + { + slug: UPLOADING_WALLPAPER_SLUG, + document: { + fileName: '', + size: file.size, + mimeType: file.type, + previewBlobUrl, + }, + }, + ...(global.settings.loadedWallpapers || []), + ], + }, + }); + + (async () => { + const result = await callApi('uploadWallpaper', file); + if (!result) { + return; + } + + const { wallpaper } = result; + + global = getGlobal(); + if (!global.settings.loadedWallpapers) { + return; + } + + const firstWallpaper = global.settings.loadedWallpapers[0]; + if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) { + return; + } + + const withLocalMedia = { + ...wallpaper, + document: { + ...wallpaper.document, + previewBlobUrl, + }, + }; + + setGlobal({ + ...global, + settings: { + ...global.settings, + loadedWallpapers: [ + withLocalMedia, + ...global.settings.loadedWallpapers.slice(1), + ], + }, + }); + })(); +}); + +addReducer('loadBlockedContacts', () => { + (async () => { + const result = await callApi('fetchBlockedContacts'); + + if (!result) { + return; + } + + let newGlobal = getGlobal(); + + if (result.users && result.users.length) { + newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id')); + } + if (result.chats && result.chats.length) { + newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id')); + } + + newGlobal = { + ...newGlobal, + blocked: { + ...newGlobal.blocked, + ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds], + totalCount: result.totalCount, + }, + }; + + setGlobal(newGlobal); + })(); +}); + +addReducer('blockContact', (global, actions, payload) => { + const { contactId } = payload!; + + (async () => { + const result = await callApi('blockContact', contactId); + if (!result) { + return; + } + + const newGlobal = getGlobal(); + + setGlobal(addBlockedContact(newGlobal, contactId)); + })(); +}); + +addReducer('unblockContact', (global, actions, payload) => { + const { contactId } = payload!; + let accessHash: string | undefined; + const isPrivate = isChatPrivate(contactId); + + if (isPrivate) { + const user = selectUser(global, contactId); + if (!user) { + return; + } + + accessHash = user.accessHash; + } + + (async () => { + const result = await callApi('unblockContact', contactId, accessHash); + if (!result) { + return; + } + + const newGlobal = getGlobal(); + + setGlobal(removeBlockedContact(newGlobal, contactId)); + })(); +}); + +addReducer('loadAuthorizations', () => { + (async () => { + const result = await callApi('fetchAuthorizations'); + if (!result) { + return; + } + + setGlobal({ + ...getGlobal(), + activeSessions: result, + }); + })(); +}); + +addReducer('terminateAuthorization', (global, actions, payload) => { + const { hash } = payload!; + + (async () => { + const result = await callApi('terminateAuthorization', hash); + if (!result) { + return; + } + + const newGlobal = getGlobal(); + + setGlobal({ + ...newGlobal, + activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash), + }); + })(); +}); + +addReducer('terminateAllAuthorizations', () => { + (async () => { + const result = await callApi('terminateAllAuthorizations'); + if (!result) { + return; + } + + const global = getGlobal(); + + setGlobal({ + ...global, + activeSessions: global.activeSessions.filter((session) => session.isCurrent), + }); + })(); +}); + +addReducer('loadNotificationsSettings', () => { + (async () => { + const result = await callApi('loadNotificationsSettings'); + if (!result) { + return; + } + + setGlobal(replaceSettings(getGlobal(), result)); + })(); +}); + +addReducer('updateNotificationSettings', (global, actions, payload) => { + const { peerType, isSilent, isShowPreviews } = payload!; + + (async () => { + const result = await callApi('updateNotificationSettings', peerType, { isSilent, isShowPreviews }); + + if (!result) { + return; + } + + setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, isShowPreviews)); + })(); +}); + +addReducer('updateContactSignUpNotification', (global, actions, payload) => { + const { isSilent } = payload!; + + (async () => { + const result = await callApi('updateContactSignUpNotification', isSilent); + if (!result) { + return; + } + + setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent })); + })(); +}); + +addReducer('loadLanguages', () => { + (async () => { + const result = await callApi('fetchLanguages'); + if (!result) { + return; + } + + setGlobal(replaceSettings(getGlobal(), { languages: result })); + })(); +}); + +addReducer('loadPrivacySettings', () => { + (async () => { + const [ + phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings, + ] = await Promise.all([ + callApi('fetchPrivacySettings', 'phoneNumber'), + callApi('fetchPrivacySettings', 'lastSeen'), + callApi('fetchPrivacySettings', 'profilePhoto'), + callApi('fetchPrivacySettings', 'forwards'), + callApi('fetchPrivacySettings', 'chatInvite'), + ]); + + if ( + !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings + ) { + return; + } + + const global = getGlobal(); + + global.settings.privacy.phoneNumber = phoneNumberSettings; + global.settings.privacy.lastSeen = lastSeenSettings; + global.settings.privacy.profilePhoto = profilePhotoSettings; + global.settings.privacy.forwards = forwardsSettings; + global.settings.privacy.chatInvite = chatInviteSettings; + + setGlobal(global); + })(); +}); + +addReducer('setPrivacyVisibility', (global, actions, payload) => { + const { privacyKey, visibility } = payload!; + + const { + privacy: { [privacyKey as ApiPrivacyKey]: settings }, + } = global.settings; + + if (!settings) { + return; + } + + const rules = buildInputPrivacyRules(global, { + visibility, + allowedIds: [...settings.allowUserIds, ...settings.allowChatIds], + deniedIds: [...settings.blockUserIds, ...settings.blockChatIds], + }); + + (async () => { + const result = await callApi('setPrivacySettings', privacyKey, rules); + + if (result) { + const newGlobal = getGlobal(); + + newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result; + + setGlobal(newGlobal); + } + })(); +}); + +addReducer('setPrivacySettings', (global, actions, payload) => { + const { privacyKey, isAllowList, contactsIds } = payload!; + const { + privacy: { [privacyKey as ApiPrivacyKey]: settings }, + } = global.settings; + + if (!settings) { + return; + } + + const rules = buildInputPrivacyRules(global, { + visibility: settings.visibility, + allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds], + deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds], + }); + + (async () => { + const result = await callApi('setPrivacySettings', privacyKey, rules); + + if (result) { + const newGlobal = getGlobal(); + + newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result; + + setGlobal(newGlobal); + } + })(); +}); + +function buildInputPrivacyRules(global: GlobalState, { + visibility, + allowedIds, + deniedIds, +}: { + visibility: PrivacyVisibility; + allowedIds: number[]; + deniedIds: number[]; +}): IInputPrivacyRules { + const { + users: { byId: usersById }, + chats: { byId: chatsById }, + } = global; + + const rules: IInputPrivacyRules = { + visibility, + }; + let users: IInputPrivacyContact[]; + let chats: IInputPrivacyContact[]; + + const collectUsers = (userId: number) => { + if (!isChatPrivate(userId)) { + return undefined; + } + const { id, accessHash } = usersById[userId] || {}; + if (!id) { + return undefined; + } + + return { id, accessHash }; + }; + + const collectChats = (userId: number) => { + if (isChatPrivate(userId)) { + return undefined; + } + const chat = chatsById[userId]; + + return chat ? { id: chat.id } : undefined; + }; + + if (visibility === 'contacts' || visibility === 'nobody') { + users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[]; + chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[]; + + if (users.length > 0) { + rules.allowedUsers = users; + } + if (chats.length > 0) { + rules.allowedChats = chats; + } + } + + if (visibility === 'everybody' || visibility === 'contacts') { + users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[]; + chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[]; + + if (users.length > 0) { + rules.blockedUsers = users; + } + if (chats.length > 0) { + rules.blockedChats = chats; + } + } + + return rules; +} diff --git a/src/modules/actions/api/symbols.ts b/src/modules/actions/api/symbols.ts new file mode 100644 index 000000000..5c44f312a --- /dev/null +++ b/src/modules/actions/api/symbols.ts @@ -0,0 +1,355 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { ApiSticker } from '../../../api/types'; +import { callApi } from '../../../api/gramjs'; +import { pause, throttle } from '../../../util/schedulers'; +import { + updateStickerSets, + updateStickerSet, + replaceAnimatedEmojis, + updateGifSearch, + updateStickersForEmoji, + rebuildStickersForEmoji, +} from '../../reducers'; +import searchWords from '../../../util/searchWords'; +import { selectStickerSet } from '../../selectors'; + +const ADDED_SETS_THROTTLE = 500; +const ADDED_SETS_THROTTLE_CHUNK = 50; + +const searchThrottled = throttle((cb) => cb(), 500, false); + +addReducer('loadStickerSets', (global) => { + const { hash } = global.stickers.added || {}; + void loadStickerSets(hash); +}); + +addReducer('loadAddedStickers', (global, actions) => { + const { setIds: addedSetIds } = global.stickers.added; + if (!addedSetIds || !addedSetIds.length) { + return; + } + + (async () => { + for (let i = 0; i < addedSetIds.length; i++) { + actions.loadStickers({ stickerSetId: addedSetIds[i] }); + + if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) { + await pause(ADDED_SETS_THROTTLE); + } + } + })(); +}); + +addReducer('loadRecentStickers', (global) => { + const { hash } = global.stickers.recent || {}; + void loadRecentStickers(hash); +}); + +addReducer('loadFavoriteStickers', (global) => { + const { hash } = global.stickers.favorite || {}; + void loadFavoriteStickers(hash); +}); + +addReducer('loadFeaturedStickers', (global) => { + const { hash } = global.stickers.featured || {}; + void loadFeaturedStickers(hash); +}); + +addReducer('loadStickers', (global, actions, payload) => { + const { stickerSetId } = payload!; + let { stickerSetAccessHash } = payload!; + + if (!stickerSetAccessHash) { + const stickerSet = selectStickerSet(global, stickerSetId); + if (!stickerSet) { + return; + } + + stickerSetAccessHash = stickerSet.accessHash; + } + + void loadStickers(stickerSetId, stickerSetAccessHash); +}); + +addReducer('loadAnimatedEmojis', () => { + void loadAnimatedEmojis(); +}); + +addReducer('loadSavedGifs', (global) => { + const { hash } = global.gifs.saved; + void loadSavedGifs(hash); +}); + +addReducer('faveSticker', (global, actions, payload) => { + const { sticker } = payload!; + + if (sticker) { + void callApi('faveSticker', { sticker }); + } +}); + +addReducer('unfaveSticker', (global, actions, payload) => { + const { sticker } = payload!; + + if (sticker) { + void unfaveSticker(sticker); + } +}); + +addReducer('toggleStickerSet', (global, actions, payload) => { + const { stickerSetId } = payload!; + const stickerSet = selectStickerSet(global, stickerSetId); + if (!stickerSet) { + return; + } + + const { accessHash, installedDate } = stickerSet; + + void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash }); +}); + +async function loadStickerSets(hash = 0) { + const addedStickers = await callApi('fetchStickerSets', { hash }); + if (!addedStickers) { + return; + } + + setGlobal(updateStickerSets( + getGlobal(), + 'added', + addedStickers.hash, + addedStickers.sets, + )); +} + +async function loadRecentStickers(hash = 0) { + const recentStickers = await callApi('fetchRecentStickers', { hash }); + if (!recentStickers) { + return; + } + + const global = getGlobal(); + + setGlobal({ + ...global, + stickers: { + ...global.stickers, + recent: recentStickers, + }, + }); +} + +async function loadFavoriteStickers(hash = 0) { + const favoriteStickers = await callApi('fetchFavoriteStickers', { hash }); + if (!favoriteStickers) { + return; + } + + const global = getGlobal(); + + setGlobal({ + ...global, + stickers: { + ...global.stickers, + favorite: favoriteStickers, + }, + }); +} + +async function loadFeaturedStickers(hash = 0) { + const featuredStickers = await callApi('fetchFeaturedStickers', { hash }); + if (!featuredStickers) { + return; + } + + setGlobal(updateStickerSets( + getGlobal(), + 'featured', + featuredStickers.hash, + featuredStickers.sets, + )); +} + +async function loadStickers(stickerSetId: string, accessHash: string) { + const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash }); + if (!stickerSet) { + return; + } + + const { set, stickers, packs } = stickerSet; + + let global = getGlobal(); + + global = updateStickerSet(global, set.id, { ...set, stickers, packs }); + + const currentEmoji = global.stickers.forEmoji.emoji; + if (currentEmoji && packs[currentEmoji]) { + global = rebuildStickersForEmoji(global); + } + + setGlobal(global); +} + +async function loadAnimatedEmojis() { + const stickerSet = await callApi('fetchAnimatedEmojis'); + if (!stickerSet) { + return; + } + + const { set, stickers } = stickerSet; + + setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers })); +} + +function unfaveSticker(sticker: ApiSticker) { + const global = getGlobal(); + + // Remove sticker preemptively to get instant feedback when user removes sticker + // from favorites while in Sticker Picker + setGlobal({ + ...global, + stickers: { + ...global.stickers, + favorite: { + ...global.stickers.favorite, + stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id), + }, + }, + }); + + void callApi('faveSticker', { sticker, unfave: true }); +} + +addReducer('setStickerSearchQuery', (global, actions, payload) => { + const { query } = payload!; + + if (query) { + void searchThrottled(() => { + searchStickers(query); + }); + } +}); + +addReducer('setGifSearchQuery', (global, actions, payload) => { + const { query } = payload!; + + if (typeof query === 'string') { + void searchThrottled(() => { + searchGifs(query); + }); + } +}); + +addReducer('searchMoreGifs', (global) => { + const { query, offset } = global.gifs.search; + + if (typeof query === 'string') { + void searchThrottled(() => { + searchGifs(query, offset); + }); + } +}); + +addReducer('loadStickersForEmoji', (global, actions, payload) => { + const { emoji } = payload!; + const { hash } = global.stickers.forEmoji; + + void searchThrottled(() => { + loadStickersForEmoji(emoji, hash); + }); +}); + +addReducer('clearStickersForEmoji', (global) => { + return { + ...global, + stickers: { + ...global.stickers, + forEmoji: {}, + }, + }; +}); + +async function searchStickers(query: string, hash = 0) { + const result = await callApi('searchStickers', { query, hash }); + + if (!result) { + return; + } + + const global = getGlobal(); + const { setsById, added } = global.stickers; + + const resultIds = result.sets.map(({ id }) => id); + + if (added.setIds) { + added.setIds.forEach((id) => { + if (!resultIds.includes(id)) { + const { title } = setsById[id] || {}; + if (title && searchWords(title, query)) { + resultIds.unshift(id); + } + } + }); + } + + setGlobal(updateStickerSets( + global, + 'search', + result.hash, + result.sets, + resultIds, + )); +} + +async function searchGifs(query: string, offset?: string) { + const result = await callApi('searchGifs', { query, offset }); + if (!result) { + return; + } + + setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset)); +} + +async function loadSavedGifs(hash = 0) { + const savedGifs = await callApi('fetchSavedGifs', { hash }); + if (!savedGifs) { + return; + } + + const global = getGlobal(); + + setGlobal({ + ...global, + gifs: { + ...global.gifs, + saved: savedGifs, + }, + }); +} + +async function loadStickersForEmoji(emoji: string, hash = 0) { + let global = getGlobal(); + setGlobal({ + ...global, + stickers: { + ...global.stickers, + forEmoji: { + ...global.stickers.forEmoji, + emoji, + }, + }, + }); + + const result = await callApi('fetchStickersForEmoji', { emoji, hash }); + + global = getGlobal(); + + if (!result || global.stickers.forEmoji.emoji !== emoji) { + return; + } + + global = updateStickersForEmoji(global, emoji, result.stickers, result.hash); + + setGlobal(global); +} diff --git a/src/modules/actions/api/sync.ts b/src/modules/actions/api/sync.ts new file mode 100644 index 000000000..ee2427088 --- /dev/null +++ b/src/modules/actions/api/sync.ts @@ -0,0 +1,293 @@ +import { + addReducer, getGlobal, setGlobal, getDispatch, +} from '../../../lib/teact/teactn'; + +import { + ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID, +} from '../../../api/types'; +import { GlobalActions } from '../../../global/types'; + +import { + CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE, +} from '../../../config'; +import { callApi } from '../../../api/gramjs'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { + replaceChatListIds, + replaceChats, + replaceUsers, + updateUsers, + updateChats, + updateChatListSecondaryInfo, + updateThreadInfos, + replaceThreadParam, +} from '../../reducers'; +import { + selectUser, selectChat, selectCurrentMessageList, selectDraft, +} from '../../selectors'; +import { isChatPrivate } from '../../helpers'; + +addReducer('sync', (global, actions) => { + void sync(actions.afterSync); +}); + +addReducer('afterSync', (global, actions) => { + void afterSync(actions); +}); + +async function sync(afterSyncCallback: () => void) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START SYNC'); + } + + await callApi('fetchCurrentUser'); + + // This fetches only active chats and clears archived chats, which will be fetched in `afterSync` + const savedUsers = await loadAndReplaceChats(); + await loadAndReplaceMessages(savedUsers); + + setGlobal({ + ...getGlobal(), + lastSyncTime: Date.now(), + }); + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH SYNC'); + } + + afterSyncCallback(); +} + +async function afterSync(actions: GlobalActions) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START AFTER-SYNC'); + } + + actions.loadFavoriteStickers(); + + await Promise.all([ + loadAndUpdateUsers(), + loadAndReplaceArchivedChats(), + ]); + + await callApi('fetchCurrentUser'); + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> FINISH AFTER-SYNC'); + } +} + +async function loadAndReplaceChats() { + const result = await callApi('fetchChats', { + limit: CHAT_LIST_LOAD_SLICE, + withPinned: true, + }); + if (!result) { + return undefined; + } + + let global = getGlobal(); + + const { recentlyFoundChatIds } = global.globalSearch; + const { userIds: contactIds } = global.contactList || {}; + const { currentUserId } = global; + + const savedPrivateChatIds = [ + ...(recentlyFoundChatIds || []), + ...(contactIds || []), + ...(currentUserId ? [currentUserId] : []), + ]; + + const savedUsers = savedPrivateChatIds + .map((id) => selectUser(global, id)) + .filter(Boolean as any); + + const savedChats = savedPrivateChatIds + .map((id) => selectChat(global, id)) + .filter(Boolean as any); + + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + if (currentChatId) { + const selectedChat = selectChat(global, currentChatId); + if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) { + savedChats.push(selectedChat); + } + + if (isChatPrivate(currentChatId)) { + const selectedChatUser = selectUser(global, currentChatId); + if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) { + savedUsers.push(selectedChatUser); + } + } + } + + savedUsers.push(...result.users); + savedChats.push(...result.chats); + + global = replaceChats(global, buildCollectionByKey(savedChats, 'id')); + global = replaceChatListIds(global, 'active', result.chatIds); + + global = { + ...global, + chats: { + ...global.chats, + }, + }; + + global = updateChatListSecondaryInfo(global, 'active', result); + + Object.keys(result.draftsById).map(Number).forEach((chatId) => { + global = replaceThreadParam( + global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId], + ); + }); + + Object.keys(result.replyingToById).map(Number).forEach((chatId) => { + global = replaceThreadParam( + global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId], + ); + }); + + setGlobal(global); + + if (currentChatId && !global.chats.byId[currentChatId]) { + getDispatch().openChat({ id: undefined }); + } + + return savedUsers; +} + +async function loadAndReplaceArchivedChats() { + const result = await callApi('fetchChats', { + limit: CHAT_LIST_LOAD_SLICE, + archived: true, + withPinned: true, + }); + if (!result) { + return; + } + + let global = getGlobal(); + global = updateUsers(global, buildCollectionByKey(result.users, 'id')); + global = updateChats(global, buildCollectionByKey(result.chats, 'id')); + global = replaceChatListIds(global, 'archived', result.chatIds); + global = updateChatListSecondaryInfo(global, 'archived', result); + setGlobal(global); +} + +async function loadAndReplaceMessages(savedUsers?: ApiUser[]) { + let areMessagesLoaded = false; + let users = savedUsers || []; + + let global = getGlobal(); + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + + // Memoize drafts + const draftChatIds = Object.keys(global.messages.byChatId).map(Number); + const draftsByChatId = draftChatIds.reduce>((acc, chatId) => { + const draft = selectDraft(global, chatId, MAIN_THREAD_ID); + return draft ? { ...acc, [chatId]: draft } : acc; + }, {}); + + if (currentChatId) { + const result = await loadTopMessages(global.chats.byId[currentChatId]); + global = getGlobal(); + const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {}; + + if (result && newCurrentChatId === currentChatId) { + const currentMessageListInfo = global.messages.byChatId[currentChatId]; + const byId = buildCollectionByKey(result.messages, 'id'); + const listedIds = Object.keys(byId).map(Number); + + global = { + ...global, + messages: { + ...global.messages, + byChatId: { + [currentChatId]: { + byId, + threadsById: { + [MAIN_THREAD_ID]: { + ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]), + listedIds, + viewportIds: listedIds, + outlyingIds: undefined, + }, + }, + }, + }, + }, + }; + + global = updateChats(global, buildCollectionByKey(result.chats, 'id')); + global = updateThreadInfos(global, currentChatId, result.threadInfos); + + areMessagesLoaded = true; + users = Array.prototype.concat(users, result.users); + } + } + + if (!areMessagesLoaded) { + global = { + ...global, + messages: { + ...global.messages, + byChatId: {}, + }, + }; + } + + // Restore drafts + Object.keys(draftsByChatId).map(Number).forEach((chatId) => { + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]); + }); + + if (savedUsers) { + global = replaceUsers(global, buildCollectionByKey(users, 'id')); + } else if (users) { + // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace + global = updateUsers(global, buildCollectionByKey(users, 'id')); + } + + setGlobal(global); +} + +async function loadAndUpdateUsers() { + let global = getGlobal(); + const { recentlyFoundChatIds } = global.globalSearch; + const { userIds: contactIds } = global.contactList || {}; + if ( + (!contactIds || !contactIds.length) + && (!recentlyFoundChatIds || !recentlyFoundChatIds.length) + ) { + return; + } + + const users = [ + ...(recentlyFoundChatIds || []), + ...(contactIds || []), + ].map((id) => selectUser(global, id)).filter(Boolean as any); + + const updatedUsers = await callApi('fetchUsers', { users }); + if (!updatedUsers) { + return; + } + + global = getGlobal(); + global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id')); + setGlobal(global); +} + +function loadTopMessages(chat: ApiChat) { + return callApi('fetchMessages', { + chat, + threadId: MAIN_THREAD_ID, + offsetId: chat.lastReadInboxMessageId, + addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1), + limit: MESSAGE_LIST_SLICE, + }); +} diff --git a/src/modules/actions/api/twoFaSettings.ts b/src/modules/actions/api/twoFaSettings.ts new file mode 100644 index 000000000..a20c3eec7 --- /dev/null +++ b/src/modules/actions/api/twoFaSettings.ts @@ -0,0 +1,96 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { callApi } from '../../../api/gramjs'; +import { replaceSettings, updateTwoFaSettings } from '../../reducers'; + +addReducer('loadPasswordInfo', () => { + (async () => { + const result = await callApi('getPasswordInfo'); + if (!result) { + return; + } + + let global = getGlobal(); + global = replaceSettings(global, { hasPassword: result.hasPassword }); + global = updateTwoFaSettings(global, { hint: result.hint }); + setGlobal(global); + })(); +}); + +addReducer('checkPassword', (global, actions, payload) => { + const { currentPassword, onSuccess } = payload; + + setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined })); + + (async () => { + const isSuccess = await callApi('checkPassword', currentPassword); + + setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false })); + + if (isSuccess) { + onSuccess(); + } + })(); +}); + +addReducer('clearPassword', (global, actions, payload) => { + const { currentPassword, onSuccess } = payload; + + setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined })); + + (async () => { + const isSuccess = await callApi('clearPassword', currentPassword); + + setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false })); + + if (isSuccess) { + onSuccess(); + } + })(); +}); + +addReducer('updatePassword', (global, actions, payload) => { + const { + currentPassword, password, hint, email, onSuccess, + } = payload; + + setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined })); + + (async () => { + const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email); + + setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false })); + + if (isSuccess) { + onSuccess(); + } + })(); +}); + +addReducer('updateRecoveryEmail', (global, actions, payload) => { + const { + currentPassword, email, onSuccess, + } = payload; + + setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined })); + + (async () => { + const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email); + + setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined })); + + if (isSuccess) { + onSuccess(); + } + })(); +}); + +addReducer('provideTwoFaEmailCode', (global, actions, payload) => { + const { code } = payload; + + void callApi('provideRecoveryEmailCode', code); +}); + +addReducer('clearTwoFaError', (global) => { + return updateTwoFaSettings(global, { error: undefined }); +}); diff --git a/src/modules/actions/api/users.ts b/src/modules/actions/api/users.ts new file mode 100644 index 000000000..9252e47b3 --- /dev/null +++ b/src/modules/actions/api/users.ts @@ -0,0 +1,172 @@ +import { + addReducer, getDispatch, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { ApiUser } from '../../../api/types'; +import { ManagementProgress } from '../../../types'; + +import { debounce } from '../../../util/schedulers'; +import { buildCollectionByKey } from '../../../util/iteratees'; +import { callApi } from '../../../api/gramjs'; +import { selectUser } from '../../selectors'; +import { + addChats, addUsers, updateManagementProgress, updateUser, updateUsers, +} from '../../reducers'; + +const runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true); +const TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min + +addReducer('loadFullUser', (global, actions, payload) => { + const { userId } = payload!; + const user = selectUser(global, userId); + if (!user) { + return; + } + + const { id, accessHash } = user; + + runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash })); +}); + +addReducer('loadUser', (global, actions, payload) => { + const { userId } = payload!; + const user = selectUser(global, userId); + if (!user) { + return; + } + + (async () => { + const updatedUsers = await callApi('fetchUsers', { users: [user] }); + if (!updatedUsers) { + return; + } + + global = getGlobal(); + global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id')); + setGlobal(global); + })(); +}); + +addReducer('loadTopUsers', (global) => { + const { hash, lastRequestedAt } = global.topPeers; + + if (!lastRequestedAt || Date.now() - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) { + void loadTopUsers(hash); + } +}); + +addReducer('loadContactList', (global) => { + const { hash } = global.contactList || {}; + void loadContactList(hash); +}); + +addReducer('loadCurrentUser', () => { + void callApi('fetchCurrentUser'); +}); + +addReducer('updateContact', (global, actions, payload) => { + const { + userId, isMuted, firstName, lastName, + } = payload!; + + void updateContact(userId, isMuted, firstName, lastName); +}); + +addReducer('deleteUser', (global, actions, payload) => { + const { userId } = payload!; + + void deleteUser(userId); +}); + +async function loadTopUsers(usersHash?: number) { + const result = await callApi('fetchTopUsers', { hash: usersHash }); + if (!result) { + return; + } + + const { hash, ids, users } = result; + + let global = getGlobal(); + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = { + ...global, + topPeers: { + ...global.topPeers, + hash, + userIds: ids, + lastRequestedAt: Date.now(), + }, + }; + setGlobal(global); +} + +async function loadContactList(hash?: number) { + const contactList = await callApi('fetchContactList', { hash }); + if (!contactList) { + return; + } + + let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id')); + global = addChats(global, buildCollectionByKey(contactList.chats, 'id')); + + // Sort contact list by Last Name (or First Name), with latin names being placed first + const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || ''); + const collator = new Intl.Collator('en-US'); + + const sortedUsers = contactList.users.sort((a, b) => ( + collator.compare(getCompareString(a), getCompareString(b)) + )).filter((user) => !user.isSelf); + + setGlobal({ + ...global, + contactList: { + hash: contactList.hash, + userIds: sortedUsers.map((user) => user.id), + }, + }); +} + +async function updateContact( + userId: number, + isMuted: boolean, + firstName: string, + lastName?: string, +) { + const global = getGlobal(); + const user = selectUser(global, userId); + if (!user) { + return; + } + + getDispatch().updateChatMutedState({ chatId: userId, isMuted }); + + setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress)); + + const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName }); + + if (result) { + setGlobal(updateUser( + getGlobal(), + user.id, + { + firstName, + lastName, + }, + )); + } + + setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete)); +} + +async function deleteUser(userId: number) { + const global = getGlobal(); + const user = selectUser(global, userId); + + if (!user) { + return; + } + + const { id, accessHash } = user; + + await callApi('deleteUser', { id, accessHash }); +} diff --git a/src/modules/actions/apiUpdaters/chats.ts b/src/modules/actions/apiUpdaters/chats.ts new file mode 100644 index 000000000..3c2b1d181 --- /dev/null +++ b/src/modules/actions/apiUpdaters/chats.ts @@ -0,0 +1,321 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { ApiUpdate } from '../../../api/types'; + +import { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config'; +import { pick } from '../../../util/iteratees'; +import { + updateChat, + replaceChatListIds, + updateChatListIds, + updateChatListType, +} from '../../reducers'; +import { + selectChat, + selectCommonBoxChatId, + selectIsChatListed, + selectChatListType, +} from '../../selectors'; + +const TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + switch (update['@type']) { + case 'updateChat': { + if (!selectIsChatListed(global, update.id)) { + // Chat can appear in dialogs list. + actions.loadTopChats(); + } + + setGlobal(updateChat(global, update.id, update.chat)); + + break; + } + + case 'updateChatJoin': { + const listType = selectChatListType(global, update.id); + if (!listType) { + break; + } + + global = updateChatListIds(global, listType, [update.id]); + global = updateChat(global, update.id, { isNotJoined: false }); + setGlobal(global); + + const chat = selectChat(global, update.id); + if (chat) { + actions.requestChatUpdate({ chatId: chat.id }); + } + break; + } + + case 'updateChatLeave': { + const listType = selectChatListType(global, update.id); + if (!listType) { + break; + } + + const { [listType]: listIds } = global.chats.listIds; + + if (listIds) { + global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id)); + } + + global = updateChat(global, update.id, { isNotJoined: true }); + setGlobal(global); + + break; + } + + case 'updateChatInbox': { + setGlobal(updateChat(global, update.id, update.chat)); + + break; + } + + case 'updateChatTypingStatus': { + const { id, typingStatus } = update; + setGlobal(updateChat(global, id, { typingStatus })); + + setTimeout(() => { + const newGlobal = getGlobal(); + const chat = selectChat(newGlobal, id); + if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) { + setGlobal(updateChat(newGlobal, id, { typingStatus: undefined })); + } + }, TYPING_STATUS_CLEAR_DELAY); + + break; + } + + case 'newMessage': { + if (update.message.senderId === global.currentUserId) { + return; + } + + const chat = selectChat(global, update.chatId); + if (!chat) { + return; + } + + setGlobal(updateChat(global, update.chatId, { + unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1, + ...(update.message.hasUnreadMention && { + unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1, + }), + })); + + break; + } + + case 'updateCommonBoxMessages': + case 'updateChannelMessages': { + const { ids, messageUpdate } = update; + if (messageUpdate.hasUnreadMention !== false) { + return; + } + + ids.forEach((id) => { + const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id); + const chat = selectChat(global, chatId); + if (chat && chat.unreadMentionsCount) { + global = updateChat(global, chatId, { + unreadMentionsCount: chat.unreadMentionsCount - 1, + }); + } + }); + + setGlobal(global); + + break; + } + + case 'updateChatFullInfo': { + const { fullInfo } = update; + const targetChat = global.chats.byId[update.id]; + if (!targetChat) { + return; + } + + setGlobal(updateChat(global, update.id, { + fullInfo: { + ...targetChat.fullInfo, + ...fullInfo, + }, + })); + + break; + } + + case 'updatePinnedChatIds': { + const { ids, folderId } = update; + + const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active'; + + global = { + ...global, + chats: { + ...global.chats, + orderedPinnedIds: { + ...global.chats.orderedPinnedIds, + [listType]: ids.length ? ids : undefined, + }, + }, + }; + + setGlobal(global); + + break; + } + + case 'updateChatPinned': { + const { id, isPinned } = update; + const listType = selectChatListType(global, id); + if (listType) { + const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds; + + let newOrderedPinnedIds = orderedPinnedIds || []; + if (!isPinned) { + newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id); + } else if (!newOrderedPinnedIds.includes(id)) { + // When moving pinned chats to archive, active ordered pinned ids don't get updated + // (to preserve chat pinned state when it returns from archive) + // If user already has max pinned chats, we should check for orderedIds + // that don't point to listed chats + if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) { + const listIds = global.chats.listIds.active; + newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId)); + } + + newOrderedPinnedIds = [id, ...newOrderedPinnedIds]; + } + + global = { + ...global, + chats: { + ...global.chats, + orderedPinnedIds: { + ...global.chats.orderedPinnedIds, + [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined, + }, + }, + }; + } + + setGlobal(global); + + break; + } + + case 'updateChatListType': { + const { id, folderId } = update; + + setGlobal(updateChatListType(global, id, folderId)); + + break; + } + + case 'updateChatFolder': { + const { id, folder } = update; + const { byId: chatFoldersById, orderedIds } = global.chatFolders; + + const newChatFoldersById = folder + ? { ...chatFoldersById, [id]: folder } + : pick( + chatFoldersById, + Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id), + ); + + const newOrderedIds = folder + ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id] + : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined; + + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + byId: newChatFoldersById, + orderedIds: newOrderedIds, + }, + }); + + break; + } + + case 'updateChatFoldersOrder': { + const { orderedIds } = update; + + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + orderedIds, + }, + }); + + break; + } + + case 'updateRecommendedChatFolders': { + const { folders } = update; + + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + recommended: folders, + }, + }); + + break; + } + + case 'updateChatMembers': { + const targetChat = global.chats.byId[update.id]; + const { replacedMembers, addedMember, deletedMemberId } = update; + if (!targetChat) { + return; + } + + let shouldUpdate = false; + let members = targetChat.fullInfo && targetChat.fullInfo.members + ? [...targetChat.fullInfo.members] + : []; + + if (replacedMembers) { + members = replacedMembers; + shouldUpdate = true; + } else if (addedMember) { + if ( + !members.length + || !members.some((m) => m.userId === addedMember.userId) + ) { + members.push(addedMember); + shouldUpdate = true; + } + } else if (members.length && deletedMemberId) { + const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId); + if (deleteIndex > -1) { + members.slice(deleteIndex, 1); + shouldUpdate = true; + } + } + + if (shouldUpdate) { + const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin); + // TODO Kicked members? + + setGlobal(updateChat(global, update.id, { + membersCount: members.length, + fullInfo: { + ...targetChat.fullInfo, + members, + adminMembers, + }, + })); + } + + break; + } + } +}); diff --git a/src/modules/actions/apiUpdaters/initial.ts b/src/modules/actions/apiUpdaters/initial.ts new file mode 100644 index 000000000..6bbbd5296 --- /dev/null +++ b/src/modules/actions/apiUpdaters/initial.ts @@ -0,0 +1,153 @@ +import { + addReducer, getDispatch, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { GlobalState } from '../../../global/types'; + +import { + ApiUpdate, + ApiUpdateAuthorizationState, + ApiUpdateAuthorizationError, + ApiUpdateConnectionState, + ApiUpdateCurrentUser, +} from '../../../api/types'; +import { DEBUG } from '../../../config'; +import { updateUser } from '../../reducers'; +import { setLanguage } from '../../../util/langProvider'; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + if (DEBUG) { + if (update['@type'] !== 'updateUserStatus') { + // eslint-disable-next-line no-console + console.log('[GramJs] UPDATE', update['@type'], { update }); + } + } + + switch (update['@type']) { + case 'updateApiReady': + onUpdateApiReady(global); + break; + + case 'updateAuthorizationState': + onUpdateAuthorizationState(update); + break; + + case 'updateAuthorizationError': + onUpdateAuthorizationError(update); + break; + + case 'updateConnectionState': + onUpdateConnectionState(update); + break; + + case 'updateCurrentUser': + onUpdateCurrentUser(update); + break; + + case 'error': + if (update.error.message === 'SESSION_REVOKED') { + actions.signOut(); + } + + actions.showError({ error: update.error }); + + break; + } +}); + +function onUpdateApiReady(global: GlobalState) { + setLanguage(global.settings.byKey.language); +} + +function onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) { + let global = getGlobal(); + + const wasAuthReady = global.authState === 'authorizationStateReady'; + const authState = update.authorizationState; + + setGlobal({ + ...global, + authState, + authIsLoading: false, + }); + + global = getGlobal(); + + switch (authState) { + case 'authorizationStateLoggingOut': + setGlobal({ + ...global, + isLoggingOut: true, + }); + break; + case 'authorizationStateWaitCode': + setGlobal({ + ...global, + authIsCodeViaApp: update.isCodeViaApp, + }); + break; + case 'authorizationStateWaitPassword': + setGlobal({ + ...global, + authHint: update.hint, + }); + break; + case 'authorizationStateWaitQrCode': + setGlobal({ + ...global, + authIsLoadingQrCode: false, + authQrCode: update.qrCode, + }); + break; + case 'authorizationStateReady': { + if (wasAuthReady) { + break; + } + + setGlobal({ + ...global, + isLoggingOut: false, + lastSyncTime: Date.now(), + }); + + const { sessionId } = update; + if (sessionId && global.authRememberMe) { + getDispatch().saveSession({ sessionId }); + } + + break; + } + } +} + +function onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) { + setGlobal({ + ...getGlobal(), + authError: update.message, + }); +} + +function onUpdateConnectionState(update: ApiUpdateConnectionState) { + const { connectionState } = update; + const global = getGlobal(); + + setGlobal({ + ...global, + connectionState, + }); + + if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') { + getDispatch().sync(); + } else if (connectionState === 'connectionStateBroken') { + getDispatch().signOut(); + } +} + +function onUpdateCurrentUser(update: ApiUpdateCurrentUser) { + const { currentUser } = update; + + setGlobal({ + ...updateUser(getGlobal(), currentUser.id, currentUser), + currentUserId: currentUser.id, + }); +} diff --git a/src/modules/actions/apiUpdaters/messages.ts b/src/modules/actions/apiUpdaters/messages.ts new file mode 100644 index 000000000..39e8b7b11 --- /dev/null +++ b/src/modules/actions/apiUpdaters/messages.ts @@ -0,0 +1,580 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { + ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID, +} from '../../../api/types'; + +import { unique } from '../../../util/iteratees'; +import { + updateChat, + deleteChatMessages, + updateChatMessage, + updateListedIds, + addViewportId, + updateThreadInfo, + replaceThreadParam, + updateScheduledMessage, + deleteChatScheduledMessages, +} from '../../reducers'; +import { GlobalActions, GlobalState } from '../../../global/types'; +import { + selectChat, + selectChatMessage, + selectChatMessages, + selectIsViewportNewest, + selectListedIds, + selectChatMessageByPollId, + selectCommonBoxChatId, + selectIsChatListed, + selectThreadInfo, + selectThreadByMessage, + selectPinnedIds, + selectScheduledMessage, + selectScheduledMessages, + isMessageInCurrentMessageList, + selectScheduledIds, +} from '../../selectors'; +import { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers'; + +const ANIMATION_DELAY = 350; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + switch (update['@type']) { + case 'newMessage': { + const { chatId, id, message } = update; + global = updateWithLocalMedia(global, chatId, id, message); + global = updateListedAndViewportIds(global, message as ApiMessage); + + const chat = selectChat(global, chatId); + if (chat) { + const newMessage = selectChatMessage(global, chatId, id)!; + global = updateChatLastMessage(global, chatId, newMessage); + } + + if (message.threadInfo) { + global = updateThreadInfo( + global, + message.threadInfo.chatId, + message.threadInfo.threadId, + message.threadInfo, + ); + } + + setGlobal(global); + + if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) { + if (message.isOutgoing && !(message.content && message.content.action)) { + // TODO Avoid duplicated focusing for the same message when content has not changed + actions.focusLastMessage(); + } + + const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {}; + if (threadInfo) { + actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId }); + } + } + + // Edge case: New message in an old (not loaded) chat. + if (!selectIsChatListed(global, chatId)) { + actions.loadTopChats(); + } + + break; + } + + case 'newScheduledMessage': { + const { chatId, id, message } = update; + + global = updateWithLocalMedia(global, chatId, id, message, true); + + const scheduledIds = selectScheduledIds(global, chatId) || []; + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id])); + + setGlobal(global); + + break; + } + + case 'updateMessage': { + const { chatId, id, message } = update; + + const currentMessage = selectChatMessage(global, chatId, id); + if (!currentMessage) { + return; + } + + global = updateWithLocalMedia(global, chatId, id, message); + + const newMessage = selectChatMessage(global, chatId, id)!; + if (message.threadInfo) { + global = updateThreadInfo( + global, + message.threadInfo.chatId, + message.threadInfo.threadId, + message.threadInfo, + ); + } + global = updateChatLastMessage(global, chatId, newMessage); + + setGlobal(global); + + break; + } + + case 'updateScheduledMessage': { + const { chatId, id, message } = update; + + const currentMessage = selectScheduledMessage(global, chatId, id); + if (!currentMessage) { + return; + } + + global = updateWithLocalMedia(global, chatId, id, message, true); + const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a); + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids); + setGlobal(global); + + break; + } + + case 'updateMessageSendSucceeded': { + const { chatId, localId, message } = update; + + global = updateListedAndViewportIds(global, message as ApiMessage); + + const currentMessage = selectChatMessage(global, chatId, localId); + + global = deleteChatMessages(global, chatId, [localId]); + + // Edge case for "Send When Online" + if (message.isScheduled) { + global = deleteChatScheduledMessages(global, chatId, [localId]); + } + + global = updateChatMessage(global, chatId, message.id, { + ...currentMessage, + ...message, + previousLocalId: localId, + }); + + const newMessage = selectChatMessage(global, chatId, message.id)!; + global = updateChatLastMessage(global, chatId, newMessage); + + setGlobal(global); + + break; + } + + case 'updateScheduledMessageSendSucceeded': { + const { chatId, localId, message } = update; + const scheduledIds = selectScheduledIds(global, chatId) || []; + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]); + + const currentMessage = selectScheduledMessage(global, chatId, localId); + + global = deleteChatScheduledMessages(global, chatId, [localId]); + global = updateScheduledMessage(global, chatId, message.id, { + ...currentMessage, + ...message, + previousLocalId: localId, + }); + + setGlobal(global); + break; + } + + case 'updatePinnedIds': { + const { chatId, isPinned, messageIds } = update; + + const currentPinnedIds = selectPinnedIds(global, chatId) || []; + const newPinnedIds = isPinned + ? [...currentPinnedIds, ...messageIds] + : currentPinnedIds.filter((id) => !messageIds.includes(id)); + + setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds)); + + break; + } + + case 'updateThreadInfo': { + const { chatId, threadId, threadInfo } = update; + + const currentThreadInfo = selectThreadInfo(global, chatId, threadId); + const newTheadInfo = { + ...currentThreadInfo, + ...threadInfo, + }; + + if (!newTheadInfo.threadId) { + return; + } + + global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo); + setGlobal(global); + + break; + } + + case 'resetMessages': { + const { id: chatId } = update; + const messagesById = selectChatMessages(global, chatId); + + if (messagesById && !isChatPrivate(chatId)) { + global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number)); + setGlobal(global); + actions.loadFullChat({ chatId, force: true }); + } + + break; + } + + case 'deleteMessages': { + const { ids, chatId } = update; + + deleteMessages(chatId, ids, actions, global); + break; + } + + case 'deleteScheduledMessages': { + const { ids, chatId } = update; + + deleteScheduledMessages(chatId, ids, actions, global); + break; + } + + case 'deleteHistory': { + const { chatId } = update; + const ids = Object.keys(global.messages.byChatId[chatId].byId).map(Number); + + deleteMessages(chatId, ids, actions, global); + break; + } + + case 'updateCommonBoxMessages': { + const { ids, messageUpdate } = update; + + ids.forEach((id) => { + const chatId = selectCommonBoxChatId(global, id); + if (chatId) { + global = updateChatMessage(global, chatId, id, messageUpdate); + } + }); + + setGlobal(global); + + break; + } + + case 'updateChannelMessages': { + const { channelId, ids, messageUpdate } = update; + + ids.forEach((id) => { + global = updateChatMessage(global, channelId, id, messageUpdate); + }); + + setGlobal(global); + + break; + } + + case 'updateMessagePoll': { + const { pollId, pollUpdate } = update; + + const message = selectChatMessageByPollId(global, pollId); + + if (message && message.content.poll) { + const updatedPoll = { ...message.content.poll, ...pollUpdate }; + + // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user + const { results: updatedResults } = updatedPoll.results || {}; + if (updatedResults && !updatedResults.some(((result) => result.isChosen))) { + const { results } = message.content.poll.results; + const chosenAnswers = results && results.filter((result) => result.isChosen); + if (chosenAnswers) { + chosenAnswers.forEach((chosenAnswer) => { + const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option); + if (chosenAnswerIndex >= 0) { + updatedPoll.results.results![chosenAnswerIndex].isChosen = true; + } + }); + } + } + + setGlobal(updateChatMessage( + global, + message.chatId, + message.id, + { + content: { + ...message.content, + poll: updatedPoll, + }, + }, + )); + } + break; + } + + case 'updateMessagePollVote': { + const { pollId, userId, options } = update; + const message = selectChatMessageByPollId(global, pollId); + if (!message || !message.content.poll || !message.content.poll.results) { + break; + } + + const { poll } = message.content; + + const { recentVoterIds, totalVoters, results } = poll.results; + const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : []; + const newTotalVoters = totalVoters ? totalVoters + 1 : 1; + const newResults = results ? [...results] : []; + + newRecentVoterIds.push(userId); + + options.forEach((option) => { + const targetOption = newResults.find((result) => result.option === option); + const targetOptionIndex = newResults.findIndex((result) => result.option === option); + const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 }; + + updatedOption.votersCount += 1; + if (userId === global.currentUserId) { + updatedOption.isChosen = true; + } + + if (targetOptionIndex) { + newResults[targetOptionIndex] = updatedOption; + } else { + newResults.push(updatedOption); + } + }); + + setGlobal(updateChatMessage( + global, + message.chatId, + message.id, + { + content: { + ...message.content, + poll: { + ...poll, + results: { + ...poll.results, + recentVoterIds: newRecentVoterIds, + totalVoters: newTotalVoters, + results: newResults, + }, + }, + }, + }, + )); + + break; + } + } +}); + +function updateWithLocalMedia( + global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false, +) { + // Preserve locally uploaded media. + const currentMessage = isScheduled + ? selectScheduledMessage(global, chatId, id) + : selectChatMessage(global, chatId, id); + if (currentMessage && message.content) { + const { + photo, video, sticker, document, + } = getMessageContent(currentMessage); + if (photo && message.content.photo) { + message.content.photo.blobUrl = photo.blobUrl; + message.content.photo.thumbnail = photo.thumbnail; + } else if (video && message.content.video) { + message.content.video.blobUrl = video.blobUrl; + } else if (sticker && message.content.sticker) { + message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally; + } else if (document && message.content.document) { + message.content.document.previewBlobUrl = document.previewBlobUrl; + } + } + + return isScheduled + ? updateScheduledMessage(global, chatId, id, message) + : updateChatMessage(global, chatId, id, message); +} + +function updateListedAndViewportIds(global: GlobalState, message: ApiMessage) { + const { id, chatId } = message; + + global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]); + + if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) { + global = addViewportId(global, chatId, MAIN_THREAD_ID, id); + } + + const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {}; + + if (!firstMessageId && isMessageLocal(message)) { + return global; + } + + if (threadInfo) { + global = updateListedIds(global, chatId, threadInfo.threadId, [id]); + + if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) { + global = addViewportId(global, chatId, threadInfo.threadId, id); + + if (!firstMessageId) { + global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id); + } + + if (!threadInfo.lastMessageId) { + global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', { + ...threadInfo, + lastMessageId: message.id, + }); + } + } + } + + return global; +} + +function updateChatLastMessage( + global: GlobalState, + chatId: number, + message: ApiMessage, + force = false, +) { + const { chats } = global; + const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage; + + if (currentLastMessage && !force) { + const isSameOrNewer = ( + currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId + ) || message.id > currentLastMessage.id; + + if (!isSameOrNewer) { + return global; + } + } + + return updateChat(global, chatId, { lastMessage: message }); +} + +function findLastMessage(global: GlobalState, chatId: number) { + const byId = selectChatMessages(global, chatId); + const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID); + + if (!byId || !listedIds) { + return undefined; + } + + let i = listedIds.length; + while (i--) { + const message = byId[listedIds[i]]; + if (!message.isDeleting) { + return message; + } + } + + return undefined; +} + +function deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) { + // Channel update + + if (chatId) { + ids.forEach((id) => { + global = updateChatMessage(global, chatId, id, { + isDeleting: true, + }); + + const newLastMessage = findLastMessage(global, chatId); + if (newLastMessage) { + global = updateChatLastMessage(global, chatId, newLastMessage, true); + } + }); + + setGlobal(global); + + actions.requestChatUpdate({ chatId }); + + const threadIdsToUpdate: number[] = []; + + ids.forEach((id) => { + const message = selectChatMessage(global, chatId, id); + if (!message) { + return; + } + + const { threadInfo } = selectThreadByMessage(global, chatId, message) || {}; + if (threadInfo) { + threadIdsToUpdate.push(threadInfo.threadId); + } + }); + + unique(threadIdsToUpdate).forEach((threadId) => { + actions.requestThreadInfoUpdate({ chatId, threadId }); + }); + + setTimeout(() => { + setGlobal(deleteChatMessages(getGlobal(), chatId, ids)); + }, ANIMATION_DELAY); + + return; + } + + // Common box update + + const chatsIdsToUpdate: number[] = []; + + ids.forEach((id) => { + const commonBoxChatId = selectCommonBoxChatId(global, id); + if (commonBoxChatId) { + chatsIdsToUpdate.push(commonBoxChatId); + + global = updateChatMessage(global, commonBoxChatId, id, { + isDeleting: true, + }); + + const newLastMessage = findLastMessage(global, commonBoxChatId); + if (newLastMessage) { + global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true); + } + + setTimeout(() => { + setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id])); + }, ANIMATION_DELAY); + } + }); + + setGlobal(global); + + unique(chatsIdsToUpdate).forEach((id) => { + actions.requestChatUpdate({ chatId: id }); + }); +} + +function deleteScheduledMessages( + chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState, +) { + if (!chatId) { + return; + } + + ids.forEach((id) => { + global = updateScheduledMessage(global, chatId, id, { + isDeleting: true, + }); + }); + + setGlobal(global); + + setTimeout(() => { + global = deleteChatScheduledMessages(getGlobal(), chatId, ids); + const scheduledMessages = selectScheduledMessages(global, chatId); + global = replaceThreadParam( + global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number), + ); + setGlobal(global); + }, ANIMATION_DELAY); +} diff --git a/src/modules/actions/apiUpdaters/misc.ts b/src/modules/actions/apiUpdaters/misc.ts new file mode 100644 index 000000000..ab202fdff --- /dev/null +++ b/src/modules/actions/apiUpdaters/misc.ts @@ -0,0 +1,39 @@ +import { + addReducer, getGlobal, setGlobal, +} from '../../../lib/teact/teactn'; + +import { ApiUpdate } from '../../../api/types'; +import { ApiPrivacyKey } from '../../../types'; + +import { addBlockedContact, removeBlockedContact } from '../../reducers'; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + switch (update['@type']) { + case 'updatePeerBlocked': + if (update.isBlocked) { + return addBlockedContact(getGlobal(), update.id); + } else { + return removeBlockedContact(getGlobal(), update.id); + } + + case 'updateResetContactList': + setGlobal({ + ...getGlobal(), + contactList: { + hash: 0, + userIds: [], + }, + }); + break; + + case 'updateFavoriteStickers': + actions.loadFavoriteStickers(); + break; + + case 'updatePrivacy': + global.settings.privacy[update.key as ApiPrivacyKey] = update.rules; + break; + } + + return undefined; +}); diff --git a/src/modules/actions/apiUpdaters/settings.ts b/src/modules/actions/apiUpdaters/settings.ts new file mode 100644 index 000000000..450e8df54 --- /dev/null +++ b/src/modules/actions/apiUpdaters/settings.ts @@ -0,0 +1,15 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { ApiUpdate } from '../../../api/types'; +import { GlobalState } from '../../../global/types'; +import { updateNotifySettings } from '../../reducers'; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => { + switch (update['@type']) { + case 'updateNotifySettings': { + return updateNotifySettings(global, update.peerType, update.isSilent, update.isShowPreviews); + } + } + + return undefined; +}); diff --git a/src/modules/actions/apiUpdaters/symbols.ts b/src/modules/actions/apiUpdaters/symbols.ts new file mode 100644 index 000000000..8254127b0 --- /dev/null +++ b/src/modules/actions/apiUpdaters/symbols.ts @@ -0,0 +1,15 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { ApiUpdate } from '../../../api/types'; + +import { updateStickerSet } from '../../reducers'; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + switch (update['@type']) { + case 'updateStickerSet': { + return updateStickerSet(global, update.id, update.stickerSet); + } + } + + return undefined; +}); diff --git a/src/modules/actions/apiUpdaters/twoFaSettings.ts b/src/modules/actions/apiUpdaters/twoFaSettings.ts new file mode 100644 index 000000000..fac10e27a --- /dev/null +++ b/src/modules/actions/apiUpdaters/twoFaSettings.ts @@ -0,0 +1,31 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { ApiUpdate } from '../../../api/types'; +import { GlobalState } from '../../../global/types'; + +addReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => { + switch (update['@type']) { + case 'updateTwoFaStateWaitCode': { + return { + ...global, + twoFaSettings: { + ...global.twoFaSettings, + isLoading: false, + waitingEmailCodeLength: update.length, + }, + }; + } + + case 'updateTwoFaError': { + return { + ...global, + twoFaSettings: { + ...global.twoFaSettings, + error: update.message, + }, + }; + } + } + + return undefined; +}); diff --git a/src/modules/actions/apiUpdaters/users.ts b/src/modules/actions/apiUpdaters/users.ts new file mode 100644 index 000000000..f790bf982 --- /dev/null +++ b/src/modules/actions/apiUpdaters/users.ts @@ -0,0 +1,64 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { ApiUpdate, ApiUserStatus } from '../../../api/types'; + +import { deleteUser, updateUser } from '../../reducers'; +import { throttle } from '../../../lib/lovely-chart/utils'; + +const STATUS_UPDATE_THROTTLE = 3000; + +const flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true); + +let pendingStatusUpdates: [number, ApiUserStatus][] = []; + +function scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) { + pendingStatusUpdates.push([userId, statusUpdate]); + flushStatusUpdatesThrottled(); +} + +function flushStatusUpdates() { + let global = getGlobal(); + pendingStatusUpdates.forEach(([userId, statusUpdate]) => { + global = updateUser(global, userId, { + status: statusUpdate, + }); + }); + setGlobal(global); + + pendingStatusUpdates = []; +} + +addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { + switch (update['@type']) { + case 'deleteUser': { + return deleteUser(global, update.id); + } + + case 'updateUser': { + return updateUser(global, update.id, update.user); + } + + case 'updateUserStatus': { + // Status updates come very often so we throttle them + scheduleStatusUpdate(update.userId, update.status); + return undefined; + } + + case 'updateUserFullInfo': { + const { id, fullInfo } = update; + const targetUser = global.users.byId[id]; + if (!targetUser) { + return undefined; + } + + return updateUser(global, id, { + fullInfo: { + ...targetUser.fullInfo, + ...fullInfo, + }, + }); + } + } + + return undefined; +}); diff --git a/src/modules/actions/initial.ts b/src/modules/actions/initial.ts new file mode 100644 index 000000000..d4b2cb2ba --- /dev/null +++ b/src/modules/actions/initial.ts @@ -0,0 +1,3 @@ +import './ui/initial'; +import './api/initial'; +import './apiUpdaters/initial'; diff --git a/src/modules/actions/ui/chats.ts b/src/modules/actions/ui/chats.ts new file mode 100644 index 000000000..8b8b2d7ce --- /dev/null +++ b/src/modules/actions/ui/chats.ts @@ -0,0 +1,52 @@ +import { addReducer, setGlobal } from '../../../lib/teact/teactn'; +import { + exitMessageSelectMode, + updateCurrentMessageList, +} from '../../reducers'; +import { selectCurrentMessageList } from '../../selectors'; + +addReducer('openChat', (global, actions, payload) => { + const { id, threadId, type } = payload!; + + const currentMessageList = selectCurrentMessageList(global); + + if (currentMessageList + && ( + currentMessageList.chatId !== id + || currentMessageList.threadId !== threadId + || currentMessageList.type !== type + )) { + global = exitMessageSelectMode(global); + + global = { + ...global, + messages: { + ...global.messages, + contentToBeScheduled: undefined, + }, + ...(id !== global.forwardMessages.toChatId && { + forwardMessages: {}, + }), + }; + + setGlobal(global); + } + + return updateCurrentMessageList(global, id, threadId, type); +}); + +addReducer('openChatWithInfo', (global, actions, payload) => { + setGlobal({ + ...global, + isChatInfoShown: true, + }); + + actions.openChat(payload); +}); + +addReducer('resetChatCreation', (global) => { + return { + ...global, + chatCreation: undefined, + }; +}); diff --git a/src/modules/actions/ui/globalSearch.ts b/src/modules/actions/ui/globalSearch.ts new file mode 100644 index 000000000..c7c06e99c --- /dev/null +++ b/src/modules/actions/ui/globalSearch.ts @@ -0,0 +1,51 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers'; + +const MAX_RECENTLY_FOUND_IDS = 10; + +addReducer('setGlobalSearchQuery', (global, actions, payload) => { + const { query } = payload!; + const { chatId } = global.globalSearch; + + return updateGlobalSearch(global, { + globalResults: {}, + localResults: {}, + resultsByType: undefined, + ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }), + query, + }); +}); + +addReducer('addRecentlyFoundChatId', (global, actions, payload) => { + const { id } = payload!; + const { recentlyFoundChatIds } = global.globalSearch; + + if (!recentlyFoundChatIds) { + return updateGlobalSearch(global, { recentlyFoundChatIds: [id] }); + } + + const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id); + newRecentIds.unshift(id); + if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) { + newRecentIds.pop(); + } + + return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds }); +}); + +addReducer('clearRecentlyFoundChats', (global) => { + return updateGlobalSearch(global, { recentlyFoundChatIds: undefined }); +}); + +addReducer('setGlobalSearchContent', (global, actions, payload) => { + const { content } = payload!; + + return updateGlobalSearchContent(global, content); +}); + +addReducer('setGlobalSearchChatId', (global, actions, payload) => { + const { id } = payload!; + + return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined }); +}); diff --git a/src/modules/actions/ui/initial.ts b/src/modules/actions/ui/initial.ts new file mode 100644 index 000000000..882a7f619 --- /dev/null +++ b/src/modules/actions/ui/initial.ts @@ -0,0 +1,57 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { + IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV, +} from '../../../util/environment'; +import { setLanguage } from '../../../util/langProvider'; + +addReducer('init', (global) => { + const { animationLevel, messageTextSize, language } = global.settings.byKey; + + setLanguage(language); + + document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`); + document.body.classList.add(`animation-level-${animationLevel}`); + document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env'); + + if (IS_SAFARI) { + document.body.classList.add('is-safari'); + } + if (IS_IOS) { + document.body.classList.add('is-ios'); + } else if (IS_ANDROID) { + document.body.classList.add('is-android'); + } +}); + +addReducer('setIsUiReady', (global, actions, payload) => { + const { uiReadyState } = payload!; + + return { + ...global, + uiReadyState, + }; +}); + +addReducer('setAuthPhoneNumber', (global, actions, payload) => { + const { phoneNumber } = payload!; + + return { + ...global, + authPhoneNumber: phoneNumber, + }; +}); + +addReducer('setAuthRememberMe', (global, actions, payload) => { + return { + ...global, + authRememberMe: Boolean(payload), + }; +}); + +addReducer('clearAuthError', (global) => { + return { + ...global, + authError: undefined, + }; +}); diff --git a/src/modules/actions/ui/localSearch.ts b/src/modules/actions/ui/localSearch.ts new file mode 100644 index 000000000..3d83e45a2 --- /dev/null +++ b/src/modules/actions/ui/localSearch.ts @@ -0,0 +1,59 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { + updateLocalTextSearch, + replaceLocalTextSearchResults, + updateLocalMediaSearchType, +} from '../../reducers'; +import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; +import { selectCurrentMessageList } from '../../selectors'; +import { buildChatThreadKey } from '../../helpers'; + +addReducer('openLocalTextSearch', (global) => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + return updateLocalTextSearch(global, chatId, threadId, true); +}); + +addReducer('closeLocalTextSearch', (global) => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + global = updateLocalTextSearch(global, chatId, threadId, false); + global = replaceLocalTextSearchResults(global, chatId, threadId, undefined); + return global; +}); + +addReducer('setLocalTextSearchQuery', (global, actions, payload) => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + const { query } = payload!; + const chatThreadKey = buildChatThreadKey(chatId, threadId); + const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {}; + + if (query !== currentQuery) { + global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY); + } + + global = updateLocalTextSearch(global, chatId, threadId, true, query); + + return global; +}); + +addReducer('setLocalMediaSearchType', (global, actions, payload) => { + const { chatId } = selectCurrentMessageList(global) || {}; + if (!chatId) { + return undefined; + } + + const { mediaType } = payload!; + return updateLocalMediaSearchType(global, chatId, mediaType); +}); diff --git a/src/modules/actions/ui/messages.ts b/src/modules/actions/ui/messages.ts new file mode 100644 index 000000000..b7411682f --- /dev/null +++ b/src/modules/actions/ui/messages.ts @@ -0,0 +1,355 @@ +import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn'; + +import { MAIN_THREAD_ID } from '../../../api/types'; +import { FocusDirection } from '../../../types'; + +import { + enterMessageSelectMode, + toggleMessageSelection, + exitMessageSelectMode, + replaceThreadParam, + updateFocusDirection, + updateFocusedMessage, +} from '../../reducers'; +import { + selectCurrentChat, + selectViewportIds, + selectIsRightColumnShown, + selectCurrentMessageList, + selectChat, + selectThreadInfo, + selectChatMessages, + selectAllowedMessageActions, + selectMessageIdsByGroupId, + selectForwardedMessageIdsByGroupId, +} from '../../selectors'; +import { findLast } from '../../../util/iteratees'; + +const FOCUS_DURATION = 2000; +const POLL_RESULT_OPEN_DELAY_MS = 450; + +let blurTimeout: number | undefined; + +addReducer('setScrollOffset', (global, actions, payload) => { + const { chatId, threadId, scrollOffset } = payload!; + + return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset); +}); + +addReducer('setReplyingToId', (global, actions, payload) => { + const { messageId } = payload!; + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return undefined; + } + const { chatId, threadId } = currentMessageList; + + return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId); +}); + +addReducer('setEditingId', (global, actions, payload) => { + const { messageId } = payload!; + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return undefined; + } + + const { chatId, threadId, type } = currentMessageList; + const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId'; + + return replaceThreadParam(global, chatId, threadId, paramName, messageId); +}); + +addReducer('editLastMessage', (global) => { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + const chatMessages = selectChatMessages(global, chatId); + const viewportIds = selectViewportIds(global, chatId, threadId); + if (!chatMessages || !viewportIds) { + return undefined; + } + + const lastOwnEditableMessageId = findLast(viewportIds, (id) => { + return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit); + }); + + if (!lastOwnEditableMessageId) { + return undefined; + } + + return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId); +}); + +addReducer('openMediaViewer', (global, actions, payload) => { + const { + chatId, threadId, messageId, avatarOwnerId, origin, + } = payload!; + + return { + ...global, + mediaViewer: { + chatId, + threadId, + messageId, + avatarOwnerId, + origin, + }, + forwardMessages: {}, + }; +}); + +addReducer('closeMediaViewer', (global) => { + return { + ...global, + mediaViewer: {}, + }; +}); + +addReducer('openAudioPlayer', (global, actions, payload) => { + const { + chatId, threadId, messageId, + } = payload!; + + return { + ...global, + audioPlayer: { + chatId, + threadId, + messageId, + }, + }; +}); + +addReducer('closeAudioPlayer', (global) => { + return { + ...global, + audioPlayer: {}, + }; +}); + +addReducer('openPollResults', (global, actions, payload) => { + const { chatId, messageId } = payload!; + + const shouldOpenInstantly = selectIsRightColumnShown(global); + + if (!shouldOpenInstantly) { + window.setTimeout(() => { + const newGlobal = getGlobal(); + + setGlobal({ + ...newGlobal, + pollResults: { + chatId, + messageId, + voters: {}, + }, + }); + }, POLL_RESULT_OPEN_DELAY_MS); + } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) { + setGlobal({ + ...global, + pollResults: { + chatId, + messageId, + voters: {}, + }, + }); + } +}); + +addReducer('closePollResults', (global) => { + setGlobal({ + ...global, + pollResults: {}, + }); +}); + +addReducer('focusLastMessage', (global, actions) => { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return; + } + + const { chatId, threadId } = currentMessageList; + + let lastMessageId: number | undefined; + if (threadId === MAIN_THREAD_ID) { + const chat = selectChat(global, chatId); + + lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined; + } else { + const threadInfo = selectThreadInfo(global, chatId, threadId); + + lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined; + } + + if (!lastMessageId) { + return; + } + + actions.focusMessage({ + chatId, threadId, messageId: lastMessageId, noHighlight: true, + }); +}); + +addReducer('focusMessage', (global, actions, payload) => { + const { + chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId, + } = payload!; + + let { messageId } = payload!; + + if (groupedId !== undefined) { + const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId); + if (ids && ids.length) { + ([messageId] = ids); + } + } + + const currentMessageList = selectCurrentMessageList(global); + const shouldSwitchChat = !currentMessageList || ( + chatId !== currentMessageList.chatId + || threadId !== currentMessageList.threadId + || messageListType !== currentMessageList.type + ); + + if (blurTimeout) { + clearTimeout(blurTimeout); + blurTimeout = undefined; + } + blurTimeout = window.setTimeout(() => { + let newGlobal = getGlobal(); + newGlobal = updateFocusedMessage(newGlobal); + newGlobal = updateFocusDirection(newGlobal); + setGlobal(newGlobal); + }, FOCUS_DURATION); + + global = updateFocusedMessage(global, chatId, messageId, noHighlight); + global = updateFocusDirection(global, undefined); + + if (shouldSwitchChat) { + global = updateFocusDirection(global, FocusDirection.Static); + } + + const viewportIds = selectViewportIds(global, chatId, threadId); + if (viewportIds && viewportIds.includes(messageId)) { + setGlobal(global); + actions.openChat({ id: chatId, threadId }); + return undefined; + } + + if (shouldSwitchChat) { + global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined); + } + + global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined); + + if (viewportIds && !shouldSwitchChat) { + const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up; + global = updateFocusDirection(global, direction); + } + + setGlobal(global); + + actions.openChat({ id: chatId, threadId }); + actions.loadViewportMessages(); + return undefined; +}); + +addReducer('openForwardMenu', (global, actions, payload) => { + const { fromChatId, messageIds, groupedId } = payload!; + let groupedMessageIds; + if (groupedId) { + groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId); + } + return { + ...global, + forwardMessages: { + fromChatId, + messageIds: groupedMessageIds || messageIds, + isModalShown: true, + }, + }; +}); + +addReducer('exitForwardMode', (global) => { + setGlobal({ + ...global, + forwardMessages: {}, + }); +}); + +addReducer('setForwardChatId', (global, actions, payload) => { + const { id } = payload!; + + setGlobal({ + ...global, + forwardMessages: { + ...global.forwardMessages, + toChatId: id, + isModalShown: false, + }, + }); + + actions.openChat({ id }); + actions.closeMediaViewer(); +}); + +addReducer('openForwardMenuForSelectedMessages', (global, actions) => { + if (!global.selectedMessages) { + return; + } + + const { chatId: fromChatId, messageIds } = global.selectedMessages; + + actions.openForwardMenu({ fromChatId, messageIds }); +}); + +addReducer('enterMessageSelectMode', (global, actions, payload) => { + const { messageId } = payload || {}; + const openChat = selectCurrentChat(global); + if (!openChat) { + return global; + } + + return enterMessageSelectMode(global, openChat.id, messageId); +}); + +addReducer('toggleMessageSelection', (global, actions, payload) => { + const { + messageId, + groupedId, + childMessageIds, + withShift, + } = payload!; + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return undefined; + } + + const { chatId, threadId, type: messageListType } = currentMessageList; + + return toggleMessageSelection( + global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift, + ); +}); + + +addReducer('exitMessageSelectMode', exitMessageSelectMode); + +addReducer('openPollModal', (global) => { + return { + ...global, + isPollModalOpen: true, + }; +}); + +addReducer('closePollModal', (global) => { + return { + ...global, + isPollModalOpen: false, + }; +}); diff --git a/src/modules/actions/ui/misc.ts b/src/modules/actions/ui/misc.ts new file mode 100644 index 000000000..9844770ca --- /dev/null +++ b/src/modules/actions/ui/misc.ts @@ -0,0 +1,199 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { GlobalState } from '../../../global/types'; + +import { IS_MOBILE_SCREEN } from '../../../util/environment'; +import getReadableErrorText from '../../../util/getReadableErrorText'; +import { selectCurrentMessageList } from '../../selectors'; + +const MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis + +addReducer('toggleChatInfo', (global) => { + return { + ...global, + isChatInfoShown: !global.isChatInfoShown, + }; +}); + +addReducer('toggleManagement', (global): GlobalState | undefined => { + const { chatId } = selectCurrentMessageList(global) || {}; + + if (!chatId) { + return undefined; + } + + return { + ...global, + management: { + byChatId: { + ...global.management.byChatId, + [chatId]: { + ...global.management.byChatId[chatId], + isActive: !(global.management.byChatId[chatId] || {}).isActive, + }, + }, + }, + }; +}); + +addReducer('closeManagement', (global): GlobalState | undefined => { + const { chatId } = selectCurrentMessageList(global) || {}; + + if (!chatId) { + return undefined; + } + + return { + ...global, + management: { + byChatId: { + ...global.management.byChatId, + [chatId]: { + ...global.management.byChatId[chatId], + isActive: false, + }, + }, + }, + }; +}); + +addReducer('toggleStatistics', (global) => { + return { + ...global, + isStatisticsShown: !global.isStatisticsShown, + }; +}); + +addReducer('openChat', (global, actions, payload) => { + if (!IS_MOBILE_SCREEN) { + return undefined; + } + + const { id } = payload!; + + return { + ...global, + isLeftColumnShown: id === undefined, + }; +}); + +addReducer('toggleLeftColumn', (global) => { + return { + ...global, + isLeftColumnShown: !global.isLeftColumnShown, + }; +}); + +addReducer('addRecentEmoji', (global, action, payload) => { + const { emoji } = payload!; + const { recentEmojis } = global; + if (!recentEmojis) { + return { + ...global, + recentEmojis: [emoji], + }; + } + + const newEmojis = recentEmojis.filter((e) => e !== emoji); + newEmojis.unshift(emoji); + if (newEmojis.length > MAX_STORED_EMOJIS) { + newEmojis.pop(); + } + + return { + ...global, + recentEmojis: newEmojis, + }; +}); + +addReducer('addRecentSticker', (global, action, payload) => { + const { sticker } = payload!; + const { recent } = global.stickers; + if (!recent) { + return { + ...global, + stickers: { + ...global.stickers, + recent: { + hash: 0, + stickers: [sticker], + }, + }, + }; + } + + const newStickers = recent.stickers.filter((s) => s.id !== sticker.id); + newStickers.unshift(sticker); + + return { + ...global, + stickers: { + ...global.stickers, + recent: { + ...recent, + stickers: newStickers, + }, + }, + }; +}); + +addReducer('showNotification', (global, actions, payload) => { + const notification = payload!; + + const newNotifications = [...global.notifications]; + const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message); + if (existingNotificationIndex !== -1) { + newNotifications.splice(existingNotificationIndex, 1); + } + + newNotifications.push(notification); + + return { + ...global, + notifications: newNotifications, + }; +}); + +addReducer('dismissNotification', (global) => { + const newNotifications = [...global.notifications]; + + newNotifications.pop(); + + return { + ...global, + notifications: newNotifications, + }; +}); + +addReducer('showError', (global, actions, payload) => { + const { error } = payload!; + + // Filter out errors that we don't want to show to the user + if (!getReadableErrorText(error)) { + return global; + } + + const newErrors = [...global.errors]; + const existingErrorIndex = newErrors.findIndex((err) => err.message === error.message); + if (existingErrorIndex !== -1) { + newErrors.splice(existingErrorIndex, 1); + } + + newErrors.push(error); + + return { + ...global, + errors: newErrors, + }; +}); + +addReducer('dismissError', (global) => { + const newErrors = [...global.errors]; + + newErrors.pop(); + + return { + ...global, + errors: newErrors, + }; +}); diff --git a/src/modules/actions/ui/payments.ts b/src/modules/actions/ui/payments.ts new file mode 100644 index 000000000..12565696d --- /dev/null +++ b/src/modules/actions/ui/payments.ts @@ -0,0 +1,21 @@ +import { addReducer } from '../../../lib/teact/teactn'; +import { + clearPayment, closeInvoice, +} from '../../reducers'; + +addReducer('openPaymentModal', (global, actions, payload) => { + const { messageId } = payload; + return { + ...global, + payment: { + ...global.payment, + messageId, + isPaymentModalOpen: true, + }, + }; +}); + +addReducer('closePaymentModal', (global) => { + const newGlobal = clearPayment(global); + return closeInvoice(newGlobal); +}); diff --git a/src/modules/actions/ui/settings.ts b/src/modules/actions/ui/settings.ts new file mode 100644 index 000000000..328e79787 --- /dev/null +++ b/src/modules/actions/ui/settings.ts @@ -0,0 +1,7 @@ +import { addReducer } from '../../../lib/teact/teactn'; +import { ISettings } from '../../../types'; +import { replaceSettings } from '../../reducers'; + +addReducer('setSettingOption', (global, actions, payload?: Partial) => { + return replaceSettings(global, payload); +}); diff --git a/src/modules/actions/ui/stickerSearch.ts b/src/modules/actions/ui/stickerSearch.ts new file mode 100644 index 000000000..203d91302 --- /dev/null +++ b/src/modules/actions/ui/stickerSearch.ts @@ -0,0 +1,32 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +addReducer('setStickerSearchQuery', (global, actions, payload) => { + const { query } = payload!; + + return { + ...global, + stickers: { + ...global.stickers, + search: { + query, + resultIds: undefined, + }, + }, + }; +}); + +addReducer('setGifSearchQuery', (global, actions, payload) => { + const { query } = payload!; + + return { + ...global, + gifs: { + ...global.gifs, + search: { + query, + offsetId: undefined, + results: undefined, + }, + }, + }; +}); diff --git a/src/modules/actions/ui/users.ts b/src/modules/actions/ui/users.ts new file mode 100644 index 000000000..05cb02edf --- /dev/null +++ b/src/modules/actions/ui/users.ts @@ -0,0 +1,15 @@ +import { addReducer } from '../../../lib/teact/teactn'; + +import { GlobalState } from '../../../global/types'; + +import { updateSelectedUserId } from '../../reducers'; + +addReducer('openUserInfo', (global, actions, payload) => { + const { id } = payload!; + + actions.openChat({ id }); +}); + +const clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined); + +addReducer('openChat', clearSelectedUserId); diff --git a/src/modules/helpers/chats.ts b/src/modules/helpers/chats.ts new file mode 100644 index 000000000..3fb591bf6 --- /dev/null +++ b/src/modules/helpers/chats.ts @@ -0,0 +1,434 @@ +import { + ApiChat, + ApiUser, + ApiChatBannedRights, + ApiChatAdminRights, + ApiChatFolder, + MAIN_THREAD_ID, +} from '../../api/types'; + +import { ARCHIVED_FOLDER_ID } from '../../config'; +import { orderBy } from '../../util/iteratees'; +import { getUserFirstName } from './users'; +import { getTranslation } from '../../util/langProvider'; +import { LangFn } from '../../hooks/useLang'; + +export function isChatPrivate(chatId: number) { + return chatId > 0; +} + +export function isChatGroup(chat: ApiChat) { + return isChatBasicGroup(chat) || isChatSuperGroup(chat); +} + +export function isChatBasicGroup(chat: ApiChat) { + return chat.type === 'chatTypeBasicGroup'; +} + +export function isChatSuperGroup(chat: ApiChat) { + return chat.type === 'chatTypeSuperGroup'; +} + +export function isChatChannel(chat: ApiChat) { + return chat.type === 'chatTypeChannel'; +} + +export function isCommonBoxChat(chat: ApiChat) { + return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup'; +} + +export function getChatTypeString(chat: ApiChat) { + switch (chat.type) { + case 'chatTypePrivate': + return 'PrivateChat'; + case 'chatTypeBasicGroup': + case 'chatTypeSuperGroup': + return 'AccDescrGroup'; + case 'chatTypeChannel': + return 'AccDescrChannel'; + default: + return 'Chat'; + } +} + +export function getPrivateChatUserId(chat: ApiChat) { + if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') { + return undefined; + } + return chat.id; +} + +export function getChatTitle(chat: ApiChat, user?: ApiUser) { + if (user && chat.id === user.id && user.isSelf) { + return getTranslation('SavedMessages'); + } + return chat.title || getTranslation('HiddenName'); +} + +export function getChatDescription(chat: ApiChat) { + if (!chat.fullInfo) { + return undefined; + } + return chat.fullInfo.about; +} + +export function getChatLink(chat: ApiChat) { + const { username } = chat; + const { inviteLink } = chat.fullInfo || {}; + + if (inviteLink && inviteLink.length) { + return inviteLink; + } + + return username ? `t.me/${username}` : ''; +} + +export function getChatAvatarHash( + owner: ApiChat | ApiUser, + size: 'normal' | 'big' = 'normal', +) { + if (!owner.avatarHash) { + return undefined; + } + + switch (size) { + case 'big': + return `profile${owner.id}?${owner.avatarHash}`; + default: + return `avatar${owner.id}?${owner.avatarHash}`; + } +} + +export function isChatSummaryOnly(chat: ApiChat) { + return !chat.lastMessage; +} + +export function isChatAdmin(chat: ApiChat) { + return Boolean(chat.adminRights); +} + +export function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) { + return chat.adminRights ? chat.adminRights[key] : false; +} + +export function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) { + return Boolean( + (chat.currentUserBannedRights && chat.currentUserBannedRights[key]) + || (chat.defaultBannedRights && chat.defaultBannedRights[key]), + ); +} + +export function getCanPostInChat(chat: ApiChat, threadId: number) { + if (threadId !== MAIN_THREAD_ID) { + return true; + } + + if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) { + return false; + } + + if (chat.isCreator) { + return true; + } + + if (isChatPrivate(chat.id)) { + return true; + } + + if (isChatChannel(chat)) { + return getHasAdminRight(chat, 'postMessages'); + } + + return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages'); +} + +export interface IAllowedAttachmentOptions { + canAttachMedia: boolean; + canAttachPolls: boolean; + canSendStickers: boolean; + canSendGifs: boolean; + canAttachEmbedLinks: boolean; +} + +export function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions { + if (!chat) { + return { + canAttachMedia: false, + canAttachPolls: false, + canSendStickers: false, + canSendGifs: false, + canAttachEmbedLinks: false, + }; + } + + const isAdmin = isChatAdmin(chat); + + return { + canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'), + canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot), + canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'), + canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'), + canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'), + }; +} + +export function getMessageSendingRestrictionReason(chat: ApiChat) { + if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) { + return 'You are not allowed to send messages in this chat.'; + } + if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) { + return 'Sending messages is not allowed in this chat.'; + } + + return undefined; +} + +export function getChatSlowModeOptions(chat?: ApiChat) { + if (!chat || !chat.fullInfo) { + return undefined; + } + + return chat.fullInfo.slowMode; +} + +export function getChatOrder(chat: ApiChat) { + return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0); +} + +export function isChatArchived(chat: ApiChat) { + return chat.folderId === ARCHIVED_FOLDER_ID; +} + +export function getCanDeleteChat(chat: ApiChat) { + return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator); +} + +export function prepareFolderListIds( + chatsById: Record, + usersById: Record, + folder: ApiChatFolder, + chatIdsCache?: number[], +) { + const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined; + const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined; + const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined; + const listIds = (chatIdsCache || Object.keys(chatsById).map(Number)) + .filter((id) => { + return filterChatFolder( + chatsById[id], folder, usersById, excludedChatIds, includedChatIds, pinnedChatIds, + ); + }); + + return [listIds, folder.pinnedChatIds] as const; +} + +function filterChatFolder( + chat: ApiChat, + folder: ApiChatFolder, + usersById: Record, + excludedChatIds?: Set, + includedChatIds?: Set, + pinnedChatIds?: Set, +) { + if (excludedChatIds && excludedChatIds.has(chat.id)) { + return false; + } + + if (includedChatIds && includedChatIds.has(chat.id)) { + return true; + } + + if (pinnedChatIds && pinnedChatIds.has(chat.id)) { + return true; + } + + if (isChatArchived(chat) && folder.excludeArchived) { + return false; + } + + if (chat.isMuted && folder.excludeMuted) { + return false; + } + + if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) { + return false; + } + + if (isChatPrivate(chat.id)) { + const privateChatUser = usersById[chat.id]; + + const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot'; + if (isChatWithBot) { + if (folder.bots) { + return true; + } + } else { + if (folder.contacts && privateChatUser && privateChatUser.isContact) { + return true; + } + + if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) { + return true; + } + } + } else if (isChatGroup(chat)) { + return !!folder.groups; + } else if (isChatChannel(chat)) { + return !!folder.channels; + } + + return false; +} + +export function prepareChatList( + chatsById: Record, + listIds: number[], + orderedPinnedIds?: number[], + folderType: 'all' | 'archived' | 'folder' = 'all', +) { + function chatFilter(chat?: ApiChat) { + if (!chat || !chat.lastMessage || chat.migratedTo) { + return false; + } + + switch (folderType) { + case 'all': + if (isChatArchived(chat)) { + return false; + } + break; + case 'archived': + if (!isChatArchived(chat)) { + return false; + } + break; + } + + return !chat.isRestricted && !chat.isNotJoined; + } + + const listedChats = listIds + .map((id) => chatsById[id]) + .filter(chatFilter); + + const listIdsSet = new Set(listIds); + const pinnedChats = orderedPinnedIds + ? ( + orderedPinnedIds + .map((id) => chatsById[id]) + .filter(chatFilter) + .filter((chat) => listIdsSet.has(chat.id)) + ) + : []; + + const otherChats = orderBy( + orderedPinnedIds + ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id)) + : listedChats, + getChatOrder, + 'desc', + ); + + return { + pinnedChats, + otherChats, + }; +} + +export function getFolderUnreadDialogs( + chatsById: Record, + usersById: Record, + folder: ApiChatFolder, + chatIdsCache: number[], +) { + const [listIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache); + + const listedChats = listIds + .map((id) => chatsById[id]) + .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined)); + + const unreadDialogsCount = listedChats + .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0); + + const hasActiveDialogs = listedChats.some((chat) => ( + chat.unreadMentionsCount + || (!chat.isMuted && (chat.unreadCount || chat.hasUnreadMark)) + )); + + return { + unreadDialogsCount, + hasActiveDialogs, + }; +} + +export function getFolderDescriptionText( + chatsById: Record, + usersById: Record, + folder: ApiChatFolder, + chatIdsCache: number[], + lang: LangFn, +) { + const { + id, title, emoticon, description, pinnedChatIds, + excludedChatIds, includedChatIds, + excludeArchived, excludeMuted, excludeRead, + ...filters + } = folder; + + // If folder has multiple additive filters or uses include/exclude lists, + // we display folder chats count + if ( + Object.values(filters).filter(Boolean).length > 1 + || (excludedChatIds && excludedChatIds.length) + || (includedChatIds && includedChatIds.length) + ) { + const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache); + return lang('Chats', length); + } + + // Otherwise, we return a short description of a single filter + if (filters.bots) { + return lang('FilterBots'); + } else if (filters.groups) { + return lang('FilterGroups'); + } else if (filters.channels) { + return lang('FilterChannels'); + } else if (filters.contacts) { + return lang('FilterContacts'); + } else if (filters.nonContacts) { + return lang('FilterNonContacts'); + } else { + return undefined; + } +} + +function getFolderChatsCount( + chatsById: Record, + usersById: Record, + folder: ApiChatFolder, + chatIdsCache: number[], +) { + const [listIds, pinnedIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache); + const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder'); + return pinnedChats.length + otherChats.length; +} + +export function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat { + if (!chatOrUser) { + return false; + } + + return chatOrUser.id < 0; +} + +export function getMessageSenderName(chatId: number, sender?: ApiUser) { + if (!sender || isChatPrivate(chatId)) { + return undefined; + } + + if (sender.isSelf) { + return 'You'; + } + + return getUserFirstName(sender); +} diff --git a/src/modules/helpers/index.ts b/src/modules/helpers/index.ts new file mode 100644 index 000000000..563c05919 --- /dev/null +++ b/src/modules/helpers/index.ts @@ -0,0 +1,6 @@ +export * from './users'; +export * from './chats'; +export * from './messages'; +export * from './messageMedia'; +export * from './localSearch'; +export * from './payments'; diff --git a/src/modules/helpers/localSearch.ts b/src/modules/helpers/localSearch.ts new file mode 100644 index 000000000..c1c1cb400 --- /dev/null +++ b/src/modules/helpers/localSearch.ts @@ -0,0 +1,3 @@ +export function buildChatThreadKey(chatId: number, threadId: number) { + return `${chatId}_${threadId}`; +} diff --git a/src/modules/helpers/messageMedia.ts b/src/modules/helpers/messageMedia.ts new file mode 100644 index 000000000..849dda2e0 --- /dev/null +++ b/src/modules/helpers/messageMedia.ts @@ -0,0 +1,367 @@ +import { + ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, +} from '../../api/types'; + +import { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment'; +import { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages'; +import { getDocumentHasPreview } from '../../components/common/helpers/documentInfo'; + +export type IDimensions = { + width: number; + height: number; +}; + +type Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download'; + +const MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB + +export function getMessageContent(message: ApiMessage) { + return message.content; +} + +export function hasMessageMedia(message: ApiMessage) { + return Boolean(( + getMessagePhoto(message) + || getMessageVideo(message) + || getMessageDocument(message) + || getMessageSticker(message) + || getMessageContact(message) + || getMessagePoll(message) + || getMessageAction(message) + || getMessageAudio(message) + || getMessageVoice(message) + )); +} + +export function getMessagePhoto(message: ApiMessage) { + return message.content.photo; +} + +export function getMessageVideo(message: ApiMessage) { + return message.content.video; +} + +export function getMessageRoundVideo(message: ApiMessage) { + const { video } = message.content; + + return video && video.isRound ? video : undefined; +} + +export function getMessageAction(message: ApiMessage) { + return message.content.action; +} + +export function getMessageAudio(message: ApiMessage) { + return message.content.audio; +} + +export function getMessageVoice(message: ApiMessage) { + return message.content.voice; +} + +export function getMessageSticker(message: ApiMessage) { + return message.content.sticker; +} + +export function getMessageDocument(message: ApiMessage) { + return message.content.document; +} + +export function getMessageContact(message: ApiMessage) { + return message.content.contact; +} + +export function getMessagePoll(message: ApiMessage) { + return message.content.poll; +} + +export function getMessageInvoice(message: ApiMessage) { + return message.content.invoice; +} + +export function getMessageWebPage(message: ApiMessage) { + return message.content.webPage; +} + +export function getMessageWebPagePhoto(message: ApiMessage) { + const webPage = getMessageWebPage(message); + return webPage ? webPage.photo : undefined; +} + +export function getMessageMediaThumbnail(message: ApiMessage) { + const media = getMessagePhoto(message) + || getMessageVideo(message) + || getMessageDocument(message) + || getMessageSticker(message) + || getMessageWebPagePhoto(message); + + if (!media) { + return undefined; + } + + return media.thumbnail; +} + +export function getMessageMediaThumbDataUri(message: ApiMessage) { + const thumbnail = getMessageMediaThumbnail(message); + + return thumbnail ? thumbnail.dataUri : undefined; +} + +export function getMessageMediaHash( + message: ApiMessage, + target: Target, +) { + const { + photo, video, sticker, audio, voice, document, + } = message.content; + const webPagePhoto = getMessageWebPagePhoto(message); + + if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) { + return undefined; + } + + const base = getMessageKey(message); + + if (photo || webPagePhoto) { + switch (target) { + case 'micro': + case 'pictogram': + return `${base}?size=m`; + case 'inline': + if (hasMessageLocalBlobUrl(message)) { + return undefined; + } + + return `${base}?size=x`; + case 'viewerPreview': + return `${base}?size=x`; + case 'viewerFull': + return `${base}?size=z`; + } + } + + if (video) { + switch (target) { + case 'micro': + case 'pictogram': + return `${base}?size=m`; + case 'inline': + if (hasMessageLocalBlobUrl(message)) { + return undefined; + } + + if (canMessagePlayVideoInline(video)) { + return getVideoOrAudioBaseHash(video, base); + } + + return `${base}?size=z`; + case 'viewerPreview': + return `${base}?size=m`; + case 'viewerFull': + return getVideoOrAudioBaseHash(video, base); + case 'download': + return `${base}?download`; + } + } + + if (document) { + switch (target) { + case 'micro': + case 'pictogram': + case 'inline': + if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) { + return undefined; + } + + return `${base}?size=m`; + default: + return base; + } + } + + if (sticker) { + switch (target) { + case 'micro': + return undefined; + case 'pictogram': + return `${base}?size=m`; + default: + return base; + } + } + + if (audio) { + switch (target) { + case 'micro': + case 'pictogram': + return undefined; + default: + return getVideoOrAudioBaseHash(audio, base); + } + } + + if (voice) { + switch (target) { + case 'micro': + case 'pictogram': + return undefined; + default: + return base; + } + } + + return undefined; +} + +function getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) { + if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) { + return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`; + } + + return base; +} + +export function getMessageMediaFormat( + message: ApiMessage, target: Target, +): Exclude; +export function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat; +export function getMessageMediaFormat( + message: ApiMessage, target: Target, +): ApiMediaFormat { + const { + sticker, video, audio, voice, + } = message.content; + + if (sticker && target === 'inline' && sticker.isAnimated) { + return ApiMediaFormat.Lottie; + } else if (video && IS_PROGRESSIVE_SUPPORTED && ( + (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video)) + )) { + return ApiMediaFormat.Progressive; + } else if (audio || voice) { + // Safari + if (voice && !IS_OPUS_SUPPORTED) { + return ApiMediaFormat.BlobUrl; + } + + return ApiMediaFormat.Progressive; + } + + return ApiMediaFormat.BlobUrl; +} + +export function getMessageMediaFilename(message: ApiMessage) { + const { photo, video, webPage } = message.content; + + if (photo || (webPage && webPage.photo)) { + return `photo${message.date}.jpeg`; + } + + if (video) { + return video.fileName; + } + + return undefined; +} + +export function hasMessageLocalBlobUrl(message: ApiMessage) { + const { photo, video, document } = message.content; + + return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl); +} + +export function canMessagePlayVideoInline(video: ApiVideo): boolean { + return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE; +} + +export function getChatMediaMessageIds( + messages: Record, listedIds: number[], reverseOrder = false, +) { + const ids = getMessageContentIds(messages, listedIds, 'media'); + + return reverseOrder ? ids.reverse() : ids; +} + +export function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | undefined { + return ( + photo.sizes.find((size) => size.type === 'z') + || photo.sizes.find((size) => size.type === 'y') + || getPhotoInlineDimensions(photo) + ); +} + +export function getPhotoInlineDimensions(photo: ApiPhoto): IDimensions | undefined { + return ( + photo.sizes.find((size) => size.type === 'x') + || photo.sizes.find((size) => size.type === 'm') + || photo.sizes.find((size) => size.type === 's') + || photo.thumbnail + ); +} + +export function getVideoDimensions(video: ApiVideo): IDimensions | undefined { + if (video.width && video.height) { + return video as IDimensions; + } + + return undefined; +} + +export function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) { + const isUploading = isMessageLocal(message); + const isTransferring = isUploading || isDownloadNeeded; + const transferProgress = Number(progress); + + return { + isUploading, isTransferring, transferProgress, + }; +} + +export function getMessageContentIds( + messages: Record, messageIds: number[], contentType: ApiMessageSearchType, +) { + let validator: Function; + + switch (contentType) { + case 'media': + validator = (message: ApiMessage) => { + const video = getMessageVideo(message); + return getMessagePhoto(message) || (video && !video.isRound && !video.isGif); + }; + break; + + case 'documents': + validator = getMessageDocument; + break; + + case 'links': + validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message); + break; + + case 'audio': + validator = getMessageAudio; + break; + + default: + return [] as Array; + } + + return messageIds.reduce((result, messageId) => { + if (messages[messageId] && validator(messages[messageId])) { + result.push(messageId); + } + + return result; + }, [] as Array); +} + +export function getMediaDuration(message: ApiMessage) { + const { audio, voice, video } = getMessageContent(message); + const media = audio || voice || video; + if (!media) { + return undefined; + } + + return media.duration; +} diff --git a/src/modules/helpers/messages.ts b/src/modules/helpers/messages.ts new file mode 100644 index 000000000..b616b710d --- /dev/null +++ b/src/modules/helpers/messages.ts @@ -0,0 +1,245 @@ +import { + ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser, +} from '../../api/types'; + +import { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config'; +import parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString'; +import { getUserFullName } from './users'; +import { getChatTitle } from './chats'; + +const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram'; +const RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i'); + +export function getMessageKey(message: ApiMessage) { + const { chatId, id } = message; + + return `msg${chatId}-${id}`; +} + +export function parseMessageKey(key: string) { + const match = key.match(/^msg(-?\d+)-(\d+)/)!; + + return { chatId: Number(match[1]), messageId: Number(match[2]) }; +} + +export function getMessageOriginalId(message: ApiMessage) { + return message.previousLocalId || message.id; +} + +export function getMessageSummaryText(message: ApiMessage, noEmoji = false) { + const { + text, photo, video, audio, voice, document, sticker, contact, poll, invoice, + } = message.content; + + if (message.groupedId) { + if (text) { + return `${noEmoji ? '' : '🖼 '}${text.text}`; + } + + return 'Album'; + } + + if (photo) { + if (text) { + return `${noEmoji ? '' : '🖼 '}${text.text}`; + } + + return 'Photo'; + } + + if (video) { + if (video.isGif) { + if (text) { + return `${noEmoji ? '' : 'GIF '}${text.text}`; + } + + return 'GIF'; + } else { + if (text) { + return `${noEmoji ? '' : '📹 '}${text.text}`; + } + + return 'Video'; + } + } + + if (sticker) { + return `Sticker ${sticker.emoji}`; + } + + if (audio) { + const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text); + if (caption) { + return `🎧 ${caption}`; + } + + return 'Audio'; + } + + if (voice) { + if (text) { + return `${noEmoji ? '' : '🎤 '}${text.text}`; + } + + return 'Voice Message'; + } + + if (document) { + return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`; + } + + if (contact) { + return 'Contact'; + } + + if (poll) { + return `📊 ${poll.summary.question}`; + } + + if (invoice) { + return 'Invoice'; + } + + if (text) { + return text.text; + } + + return CONTENT_NOT_SUPPORTED; +} + +export function getMessageText(message: ApiMessage) { + const { + text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice, + } = message.content; + + if (text) { + return text.text; + } + + if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) { + return undefined; + } + + return CONTENT_NOT_SUPPORTED; +} + +export function getMessageCustomShape(message: ApiMessage): boolean | number { + const { + text, sticker, photo, video, audio, voice, document, poll, webPage, contact, + } = message.content; + + if (sticker || (video && video.isRound)) { + return true; + } + + if (!text || photo || video || audio || voice || document || poll || webPage || contact) { + return false; + } + + // This is a "dual-intent" method used to limit calls of `parseEmojiOnlyString`. + return parseEmojiOnlyString(text.text) || false; +} + +export function getMessageSingleEmoji(message: ApiMessage) { + const { text } = message.content; + if (!(text && text.text.length <= 6)) { + return undefined; + } + + if (getMessageCustomShape(message) !== 1) { + return undefined; + } + + return text.text; +} + +export function getFirstLinkInMessage(message: ApiMessage) { + const { text } = message.content; + + let match: RegExpMatchArray | null | undefined; + if (text && text.entities) { + let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl); + if (link) { + match = link.url!.match(RE_LINK); + } + + if (!match) { + link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url); + if (link) { + const { offset, length } = link; + match = text.text.substring(offset, offset + length).match(RE_LINK); + } + } + } + + if (!match && text) { + match = text.text.match(RE_LINK); + } + + if (!match) { + return undefined; + } + + return { + url: match[0], + domain: match[3], + }; +} + +export function matchLinkInMessageText(message: ApiMessage) { + const { text } = message.content; + const match = text && text.text.match(RE_LINK); + + if (!match) { + return undefined; + } + + return { + url: match[0], + domain: match[3], + }; +} + +export function isOwnMessage(message: ApiMessage) { + return message.isOutgoing; +} + +export function isReplyMessage(message: ApiMessage) { + return Boolean(message.replyToMessageId); +} + +export function isForwardedMessage(message: ApiMessage) { + return Boolean(message.forwardInfo); +} + +export function isActionMessage(message: ApiMessage) { + return !!message.content.action; +} + +export function isServiceNotificationMessage(message: ApiMessage) { + return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message); +} + +export function isAnonymousOwnMessage(message: ApiMessage) { + return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message); +} + +export function getSenderTitle(sender: ApiUser | ApiChat) { + return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(sender as ApiChat); +} + +export function getSendingState(message: ApiMessage) { + if (!message.sendingState) { + return 'succeeded'; + } + + return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending'; +} + +export function isMessageLocal(message: ApiMessage) { + return message.id >= LOCAL_MESSAGE_ID_BASE; +} + +export function isHistoryClearMessage(message: ApiMessage) { + return message.content.action && message.content.action.type === 'historyClear'; +} diff --git a/src/modules/helpers/payments.ts b/src/modules/helpers/payments.ts new file mode 100644 index 000000000..a6c60ce6f --- /dev/null +++ b/src/modules/helpers/payments.ts @@ -0,0 +1,105 @@ +const STRIPE_ERRORS: Record> = { + missing_payment_information: { + field: 'cardNumber', + fieldError: 'Incorrect card number', + }, + invalid_number: { + field: 'cardNumber', + fieldError: 'Incorrect card number', + }, + number: { + field: 'cardNumber', + fieldError: 'Incorrect card number', + }, + exp_year: { + field: 'expiry', + fieldError: 'Incorrect year', + }, + exp_month: { + field: 'expiry', + fieldError: 'Incorrect month', + }, + invalid_expiry_year: { + field: 'expiry', + fieldError: 'Incorrect year', + }, + invalid_expiry_month: { + field: 'expiry', + fieldError: 'Incorrect month', + }, + cvc: { + field: 'cvv', + fieldError: 'Incorrect CVV', + }, + invalid_cvc: { + field: 'cvv', + fieldError: 'Incorrect CVV', + }, +}; + +export function getStripeError(error: { + code: string; + message: string; + param?: string; +}) { + const { message, code, param } = error; + const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code]; + return { + field, + fieldError, + description: description || message, + }; +} + +const SHIPPING_ERRORS: Record> = { + ADDRESS_STREET_LINE1_INVALID: { + field: 'streetLine1', + fieldError: 'Incorrect street address', + }, + ADDRESS_STREET_LINE2_INVALID: { + field: 'streetLine2', + fieldError: 'Incorrect street address', + }, + ADDRESS_CITY_INVALID: { + field: 'city', + fieldError: 'Incorrect city', + }, + ADDRESS_COUNTRY_INVALID: { + field: 'countryIso2', + fieldError: 'Incorrect country', + }, + ADDRESS_POSTCODE_INVALID: { + field: 'postCode', + fieldError: 'Incorrect post code', + }, + ADDRESS_STATE_INVALID: { + field: 'state', + fieldError: 'Incorrect state', + }, + REQ_INFO_NAME_INVALID: { + field: 'fullName', + fieldError: 'Incorrect name', + }, + REQ_INFO_PHONE_INVALID: { + field: 'phone', + fieldError: 'Incorrect phone', + }, + REQ_INFO_EMAIL_INVALID: { + field: 'email', + fieldError: 'Incorrect email', + }, +}; + + +export function getShippingError(errors: Record) { + return Object.values(errors).reduce((acc, cur) => { + const error = SHIPPING_ERRORS[cur.message]; + if (error) { + acc = { + ...acc, + [error.field]: error.fieldError, + }; + } + return acc; + }, {}); +} diff --git a/src/modules/helpers/users.ts b/src/modules/helpers/users.ts new file mode 100644 index 000000000..4e5e1a774 --- /dev/null +++ b/src/modules/helpers/users.ts @@ -0,0 +1,231 @@ +import { ApiChat, ApiUser } from '../../api/types'; + +import { SERVICE_NOTIFICATIONS_USER_ID } from '../../config'; +import { formatFullDate, formatTime } from '../../util/dateFormat'; +import { orderBy } from '../../util/iteratees'; +import { LangFn } from '../../hooks/useLang'; + +const USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6]; + +export function getUserFirstName(user?: ApiUser) { + if (!user) { + return undefined; + } + + switch (user.type) { + case 'userTypeBot': + case 'userTypeRegular': { + return user.firstName; + } + + case 'userTypeDeleted': + case 'userTypeUnknown': { + return 'Deleted'; + } + + default: + return undefined; + } +} + +export function getUserFullName(user?: ApiUser) { + if (!user) { + return undefined; + } + + if (isDeletedUser(user)) { + return 'Deleted account'; + } + + switch (user.type) { + case 'userTypeBot': + case 'userTypeRegular': { + if (user.firstName && user.lastName) { + return `${user.firstName} ${user.lastName}`; + } + + if (user.firstName) { + return user.firstName; + } + + if (user.lastName) { + return user.lastName; + } + + break; + } + + case 'userTypeDeleted': + case 'userTypeUnknown': { + return 'Deleted account'; + } + } + + return undefined; +} + +export function getUserStatus(user: ApiUser, lang: LangFn) { + if (user.id === SERVICE_NOTIFICATIONS_USER_ID) { + return lang('ServiceNotifications').toLowerCase(); + } + + if (user.type && user.type === 'userTypeBot') { + return 'bot'; + } + + if (!user.status) { + return ''; + } + + switch (user.status.type) { + case 'userStatusEmpty': { + return lang('ALongTimeAgo'); + } + + case 'userStatusLastMonth': { + return lang('WithinAMonth'); + } + + case 'userStatusLastWeek': { + return lang('WithinAWeek'); + } + + case 'userStatusOffline': { + const { wasOnline } = user.status; + + if (!wasOnline) return lang('LastSeen.Offline'); + + const now = new Date(); + const wasOnlineDate = new Date(wasOnline * 1000); + + if (wasOnlineDate >= now) { + return lang('LastSeen.JustNow'); + } + + const diff = new Date(now.getTime() - wasOnlineDate.getTime()); + + // within a minute + if (diff.getTime() / 1000 < 60) { + return lang('LastSeen.JustNow'); + } + + // within an hour + if (diff.getTime() / 1000 < 60 * 60) { + const minutes = Math.floor(diff.getTime() / 1000 / 60); + return lang('LastSeen.MinutesAgo', minutes); + } + + // today + const today = new Date(); + today.setHours(0, 0, 0, 0); + if (wasOnlineDate > today) { + // up to 6 hours ago + if (diff.getTime() / 1000 < 6 * 60 * 60) { + const hours = Math.floor(diff.getTime() / 1000 / 60 / 60); + return lang('LastSeen.HoursAgo', hours); + } + + // other + return lang('LastSeen.TodayAt', formatTime(wasOnlineDate)); + } + + // yesterday + const yesterday = new Date(); + yesterday.setDate(now.getDate() - 1); + today.setHours(0, 0, 0, 0); + if (wasOnlineDate > yesterday) { + return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate)); + } + + return lang('LastSeen.AtDate', formatFullDate(wasOnlineDate)); + } + + case 'userStatusOnline': { + return lang('Online'); + } + + case 'userStatusRecently': { + return lang('Lately'); + } + + default: + return undefined; + } +} + +export function isUserOnline(user: ApiUser) { + const { id, status, type } = user; + + if (!status) { + return false; + } + + if (id === SERVICE_NOTIFICATIONS_USER_ID) { + return false; + } + + return status.type === 'userStatusOnline' && type !== 'userTypeBot'; +} + +export function isDeletedUser(user: ApiUser) { + if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) { + return false; + } + + return user.type === 'userTypeDeleted' + || user.type === 'userTypeUnknown'; +} + +export function isUserBot(user: ApiUser) { + return user.type === 'userTypeBot'; +} + +export function getSortedUserIds( + userIds: number[], + usersById: Record, + priorityIds?: number[], +) { + return orderBy(userIds, (id) => { + const now = Date.now() / 1000; + + if (priorityIds && priorityIds.includes(id)) { + /* + ** Assuming that online status expiration date can't be as far as two days from now, + ** this should place priorityIds on top of the list. + ** + ** We then subtract index of `id` in `priorityIds` to preserve selected order + */ + return now + (48 * 60 * 60) - priorityIds.indexOf(id); + } + + const user = usersById[id]; + if (!user || !user.status) { + return 0; + } + + if (user.status.type === 'userStatusOnline') { + return user.status.expires; + } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) { + return user.status.wasOnline; + } + + switch (user.status.type) { + case 'userStatusRecently': + return now - 60 * 60 * 24; + case 'userStatusLastWeek': + return now - 60 * 60 * 24 * 7; + case 'userStatusLastMonth': + return now - 60 * 60 * 24 * 7 * 30; + default: + return 0; + } + }, 'desc'); +} + +// eslint-disable-next-line max-len +// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53 +export function getUserColorKey(peer: ApiUser | ApiChat | undefined) { + const index = peer ? Math.abs(peer.id) % 7 : 0; + + return USER_COLOR_KEYS[index]; +} diff --git a/src/modules/reducers/chats.ts b/src/modules/reducers/chats.ts new file mode 100644 index 000000000..557dc0b65 --- /dev/null +++ b/src/modules/reducers/chats.ts @@ -0,0 +1,155 @@ +import { GlobalState } from '../../global/types'; +import { ApiChat } from '../../api/types'; + +import { ARCHIVED_FOLDER_ID } from '../../config'; +import { omit } from '../../util/iteratees'; + +export function replaceChatListIds( + global: GlobalState, + type: 'active' | 'archived', + newIds: number[] | undefined, +): GlobalState { + return { + ...global, + chats: { + ...global.chats, + listIds: { + ...global.chats.listIds, + [type]: newIds, + }, + }, + }; +} + +export function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState { + const { [type]: listIds } = global.chats.listIds; + const newIds = listIds && listIds.length + ? idsUpdate.filter((id) => !listIds.includes(id)) + : idsUpdate; + + if (listIds && !newIds.length) { + return global; + } + + return replaceChatListIds(global, type, [ + ...(listIds || []), + ...newIds, + ]); +} + +export function replaceChats(global: GlobalState, newById: Record): GlobalState { + return { + ...global, + chats: { + ...global.chats, + byId: newById, + }, + }; +} + +export function updateChat(global: GlobalState, chatId: number, chatUpdate: Partial): GlobalState { + const { byId } = global.chats; + const chat = byId[chatId]; + const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin; + const updatedChat = { + ...chat, + ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate), + }; + + if (!updatedChat.id || !updatedChat.type) { + return global; + } + + return replaceChats(global, { + ...byId, + [chatId]: updatedChat, + }); +} + +export function updateChats(global: GlobalState, updatedById: Record): GlobalState { + Object.keys(updatedById).forEach((id) => { + global = updateChat(global, Number(id), updatedById[Number(id)]); + }); + + return global; +} + +// @optimization Allows to avoid redundant updates which cause a lot of renders +export function addChats(global: GlobalState, addedById: Record): GlobalState { + const { byId } = global.chats; + Object.keys(addedById).map(Number).forEach((id) => { + if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) { + global = updateChat(global, id, addedById[id]); + } + }); + + return global; +} + +export function updateChatListType( + global: GlobalState, + chatId: number, + folderId?: number, +): GlobalState { + const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active'; + + let currentListIds = global.chats.listIds; + (Object.keys(currentListIds) as Array).forEach((listTypeKey) => { + const currentFolderList = currentListIds[listTypeKey] || []; + if (listTypeKey === listType && !currentFolderList.includes(chatId)) { + currentListIds = { + ...currentListIds, + [listTypeKey]: [...currentFolderList, chatId], + }; + } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) { + currentListIds = { + ...currentListIds, + [listTypeKey]: currentFolderList.filter((id) => id !== chatId), + }; + } + }); + + global = { + ...global, + chats: { + ...global.chats, + listIds: currentListIds, + }, + }; + + global = updateChat(global, chatId, { folderId: folderId || undefined }); + + return global; +} + +export function updateChatListSecondaryInfo( + global: GlobalState, + type: 'active' | 'archived', + info: { + orderedPinnedIds?: number[]; + totalChatCount: number; + }, +): GlobalState { + const totalCountKey = type === 'active' ? 'all' : 'archived'; + + return { + ...global, + chats: { + ...global.chats, + ...(info.orderedPinnedIds && { + orderedPinnedIds: { + ...global.chats.orderedPinnedIds, + [type]: info.orderedPinnedIds, + }, + }), + totalCount: { + ...global.chats.totalCount, + [totalCountKey]: info.totalChatCount, + }, + isFullyLoaded: { + ...global.chats.isFullyLoaded, + [type]: false, + }, + }, + }; +} diff --git a/src/modules/reducers/globalSearch.ts b/src/modules/reducers/globalSearch.ts new file mode 100644 index 000000000..e9b4e5b22 --- /dev/null +++ b/src/modules/reducers/globalSearch.ts @@ -0,0 +1,79 @@ +import { GlobalState } from '../../global/types'; +import { GlobalSearchContent } from '../../types'; +import { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types'; +import { areSortedArraysEqual } from '../../util/iteratees'; + +const getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`; + +export function updateGlobalSearch( + global: GlobalState, + searchStatePartial: Partial, +) { + return { + ...global, + globalSearch: { + ...global.globalSearch, + ...searchStatePartial, + }, + }; +} + +export function updateGlobalSearchContent( + global: GlobalState, + currentContent: GlobalSearchContent | undefined, +): GlobalState { + return updateGlobalSearch(global, { currentContent }); +} + +export function updateGlobalSearchResults( + global: GlobalState, + newFoundMessages: ApiMessage[], + totalCount: number, + type: ApiGlobalMessageSearchType, + nextRate?: number, +): GlobalState { + const { resultsByType } = global.globalSearch || {}; + const newFoundMessagesById = newFoundMessages.reduce((result, message) => { + result[getComplexKey(message)] = message; + + return result; + }, {} as Record); + const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined; + + if (foundIdsForType !== undefined + && Object.keys(newFoundMessagesById).every( + (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])), + ) + ) { + return updateGlobalSearchFetchingStatus(global, { messages: false }); + } + + const prevFoundIds = foundIdsForType || []; + const newFoundIds = newFoundMessages.map((message) => getComplexKey(message)); + const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds); + const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds; + + global = updateGlobalSearchFetchingStatus(global, { messages: false }); + + return updateGlobalSearch(global, { + resultsByType: { + ...(global.globalSearch || {}).resultsByType, + [type]: { + totalCount, + nextOffsetId: nextRate, + foundIds: foundOrPrevFoundIds, + }, + }, + }); +} + +export function updateGlobalSearchFetchingStatus( + global: GlobalState, newState: { chats?: boolean; messages?: boolean }, +) { + return updateGlobalSearch(global, { + fetchingStatus: { + ...global.globalSearch.fetchingStatus, + ...newState, + }, + }); +} diff --git a/src/modules/reducers/index.ts b/src/modules/reducers/index.ts new file mode 100644 index 000000000..1c445a173 --- /dev/null +++ b/src/modules/reducers/index.ts @@ -0,0 +1,10 @@ +export * from './chats'; +export * from './messages'; +export * from './symbols'; +export * from './users'; +export * from './globalSearch'; +export * from './localSearch'; +export * from './management'; +export * from './settings'; +export * from './twoFaSettings'; +export * from './payments'; diff --git a/src/modules/reducers/localSearch.ts b/src/modules/reducers/localSearch.ts new file mode 100644 index 000000000..2857118f7 --- /dev/null +++ b/src/modules/reducers/localSearch.ts @@ -0,0 +1,162 @@ +import { GlobalState } from '../../global/types'; +import { ApiMessageSearchType } from '../../api/types'; + +import { areSortedArraysEqual, unique } from '../../util/iteratees'; +import { SharedMediaType } from '../../types'; +import { buildChatThreadKey } from '../helpers'; + +interface TextSearchParams { + isActive: boolean; + query?: string; + results?: { + totalCount?: number; + nextOffsetId?: number; + foundIds?: number[]; + }; +} + +interface MediaSearchParams { + currentType?: SharedMediaType; + resultsByType?: Partial>; +} + +function replaceLocalTextSearch( + global: GlobalState, + chatThreadKey: string, + searchParams: TextSearchParams, +): GlobalState { + return { + ...global, + localTextSearch: { + byChatThreadKey: { + ...global.localTextSearch.byChatThreadKey, + [chatThreadKey]: searchParams, + }, + }, + }; +} + +export function updateLocalTextSearch( + global: GlobalState, + chatId: number, + threadId: number, + isActive: boolean, + query?: string, +): GlobalState { + const chatThreadKey = buildChatThreadKey(chatId, threadId); + + return replaceLocalTextSearch(global, chatThreadKey, { + ...global.localTextSearch.byChatThreadKey[chatThreadKey], + isActive, + query, + }); +} + +export function replaceLocalTextSearchResults( + global: GlobalState, + chatId: number, + threadId: number, + foundIds?: number[], + totalCount?: number, + nextOffsetId?: number, +): GlobalState { + const chatThreadKey = buildChatThreadKey(chatId, threadId); + + return replaceLocalTextSearch(global, chatThreadKey, { + ...global.localTextSearch.byChatThreadKey[chatThreadKey], + results: { + foundIds, + totalCount, + nextOffsetId, + }, + }); +} + +export function updateLocalTextSearchResults( + global: GlobalState, + chatId: number, + threadId: number, + newFoundIds: number[], + totalCount?: number, + nextOffsetId?: number, +): GlobalState { + const chatThreadKey = buildChatThreadKey(chatId, threadId); + const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {}; + const prevFoundIds = (results && results.foundIds) || []; + const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds))); + const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds; + + return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId); +} + +function replaceLocalMediaSearch( + global: GlobalState, + chatId: number, + searchParams: MediaSearchParams, +): GlobalState { + return { + ...global, + localMediaSearch: { + byChatId: { + ...global.localMediaSearch.byChatId, + [chatId]: searchParams, + }, + }, + }; +} + +export function updateLocalMediaSearchType( + global: GlobalState, + chatId: number, + currentType: SharedMediaType | undefined, +): GlobalState { + return replaceLocalMediaSearch(global, chatId, { + ...global.localMediaSearch.byChatId[chatId], + currentType, + }); +} + +export function replaceLocalMediaSearchResults( + global: GlobalState, + chatId: number, + type: ApiMessageSearchType, + foundIds?: number[], + totalCount?: number, + nextOffsetId?: number, +): GlobalState { + return replaceLocalMediaSearch(global, chatId, { + ...global.localMediaSearch.byChatId[chatId], + resultsByType: { + ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType, + [type]: { + foundIds, + totalCount, + nextOffsetId, + }, + }, + }); +} + +export function updateLocalMediaSearchResults( + global: GlobalState, + chatId: number, + type: SharedMediaType, + newFoundIds: number[], + totalCount?: number, + nextOffsetId?: number, +): GlobalState { + const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {}; + const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : []; + const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds))); + const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds; + + return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId); +} + +function orderFoundIds(listedIds: number[]) { + return listedIds.sort((a, b) => a - b); +} diff --git a/src/modules/reducers/management.ts b/src/modules/reducers/management.ts new file mode 100644 index 000000000..fa5dbb2b8 --- /dev/null +++ b/src/modules/reducers/management.ts @@ -0,0 +1,34 @@ +import { GlobalState } from '../../global/types'; +import { ManagementProgress } from '../../types'; + +interface ManagementState { + isActive: boolean; + isUsernameAvailable?: boolean; + error?: string; +} + +export function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState { + return { + ...global, + management: { + ...global.management, + progress, + }, + }; +} + +export function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState { + return { + ...global, + management: { + ...global.management, + byChatId: { + ...global.management.byChatId, + [chatId]: { + ...(global.management.byChatId[chatId] || {}), + ...update, + }, + }, + }, + }; +} diff --git a/src/modules/reducers/messages.ts b/src/modules/reducers/messages.ts new file mode 100644 index 000000000..189ed784d --- /dev/null +++ b/src/modules/reducers/messages.ts @@ -0,0 +1,497 @@ +import { GlobalState, MessageListType, Thread } from '../../global/types'; +import { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types'; +import { FocusDirection } from '../../types'; + +import { MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config'; +import { + selectListedIds, + selectChatMessages, + selectViewportIds, + selectOutlyingIds, + selectPinnedIds, + selectThreadInfo, + selectMessageIdsByGroupId, + selectScheduledMessages, + selectScheduledIds, + selectCurrentMessageIds, + selectChatMessage, + selectCurrentMessageList, +} from '../selectors'; +import { + areSortedArraysEqual, omit, pickTruthy, unique, +} from '../../util/iteratees'; + +type MessageStoreSections = { + byId: Record; + threadsById: Record; +}; + +export function updateCurrentMessageList( + global: GlobalState, + chatId: number | undefined, + threadId: number = MAIN_THREAD_ID, + type: MessageListType = 'thread', +): GlobalState { + return { + ...global, + messages: { + ...global.messages, + // TODO Support stack navigation + messageLists: chatId ? [{ chatId, threadId, type }] : undefined, + }, + }; +} + +function replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState { + return updateMessageStore(global, chatId, { + byId: newById, + }); +} + +function updateThread( + global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial, +): GlobalState { + const current = global.messages.byChatId[chatId]; + + return updateMessageStore(global, chatId, { + threadsById: { + ...(current && current.threadsById), + [threadId]: { + ...(current && current.threadsById[threadId]), + ...threadUpdate, + }, + }, + }); +} + +function updateMessageStore( + global: GlobalState, chatId: number, update: Partial, +): GlobalState { + const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} }; + + return { + ...global, + messages: { + ...global.messages, + byChatId: { + ...global.messages.byChatId, + [chatId]: { + ...current, + ...update, + }, + }, + }, + }; +} + +export function replaceThreadParam( + global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined, +) { + return updateThread(global, chatId, threadId, { [paramName]: newValue }); +} + +export function addMessages( + global: GlobalState, messages: ApiMessage[], +): GlobalState { + const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => { + if (!messagesByChatId[message.chatId]) { + messagesByChatId[message.chatId] = {}; + } + messagesByChatId[message.chatId][message.id] = message; + + return messagesByChatId; + }, {} as Record>); + + Object.keys(addedByChatId).map(Number).forEach((chatId) => { + global = addChatMessagesById(global, chatId, addedByChatId[chatId]); + }); + + return global; +} + +export function addChatMessagesById( + global: GlobalState, chatId: number, newById: Record, +): GlobalState { + const byId = selectChatMessages(global, chatId); + + if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) { + return global; + } + + return replaceChatMessages(global, chatId, { + ...newById, + ...byId, + }); +} + +export function updateChatMessage( + global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial, +): GlobalState { + const byId = selectChatMessages(global, chatId) || {}; + const message = byId[messageId]; + const updatedMessage = { + ...message, + ...messageUpdate, + }; + + if (!updatedMessage.id) { + return global; + } + + return replaceChatMessages(global, chatId, { + ...byId, + [messageId]: updatedMessage, + }); +} + +export function updateScheduledMessage( + global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial, +): GlobalState { + const byId = selectScheduledMessages(global, chatId) || {}; + const message = byId[messageId]; + const updatedMessage = { + ...message, + ...messageUpdate, + }; + + if (!updatedMessage.id) { + return global; + } + + return replaceScheduledMessages(global, chatId, { + ...byId, + [messageId]: updatedMessage, + }, undefined); +} + +export function deleteChatMessages( + global: GlobalState, + chatId: number, + messageIds: number[], +): GlobalState { + const byId = selectChatMessages(global, chatId); + if (!byId) { + return global; + } + const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter( + ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost, + ); + const newById = omit(byId, messageIds); + + const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number); + threadIds.forEach((threadId) => { + let listedIds = selectListedIds(global, chatId, threadId); + let outlyingIds = selectOutlyingIds(global, chatId, threadId); + let viewportIds = selectViewportIds(global, chatId, threadId); + let pinnedIds = selectPinnedIds(global, chatId); + + messageIds.forEach((messageId) => { + if (listedIds && listedIds.includes(messageId)) { + listedIds = listedIds.filter((id) => id !== messageId); + } + + if (outlyingIds && outlyingIds.includes(messageId)) { + outlyingIds = outlyingIds.filter((id) => id !== messageId); + } + + if (viewportIds && viewportIds.includes(messageId)) { + viewportIds = viewportIds.filter((id) => id !== messageId); + } + + if (pinnedIds && pinnedIds.includes(messageId)) { + pinnedIds = pinnedIds.filter((id) => id !== messageId); + } + }); + + global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds); + global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds); + global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds); + global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds); + }); + + if (deletedForwardedPosts.length) { + const currentMessageList = selectCurrentMessageList(global); + const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId + && currentMessageList.type === 'thread'; + const currentThreadId = currentMessageList && currentMessageList.threadId; + + deletedForwardedPosts.forEach((message) => { + const { fromChatId, fromMessageId } = message.forwardInfo!; + const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!); + + if (canDeleteCurrentThread && currentThreadId === fromMessageId) { + global = updateCurrentMessageList(global, chatId); + } + if (originalPost) { + global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined }); + } + }); + } + + global = replaceChatMessages(global, chatId, newById); + + return global; +} + +export function deleteChatScheduledMessages( + global: GlobalState, + chatId: number, + messageIds: number[], +): GlobalState { + const byId = selectScheduledMessages(global, chatId); + if (!byId) { + return global; + } + const newById = omit(byId, messageIds); + + let scheduledIds = selectScheduledIds(global, chatId); + if (scheduledIds) { + messageIds.forEach((messageId) => { + if (scheduledIds!.includes(messageId)) { + scheduledIds = scheduledIds!.filter((id) => id !== messageId); + } + }); + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds); + } + + global = replaceScheduledMessages(global, chatId, newById, undefined); + + return global; +} + +export function updateListedIds( + global: GlobalState, + chatId: number, + threadId: number, + idsUpdate: number[], +): GlobalState { + const listedIds = selectListedIds(global, chatId, threadId); + const newIds = listedIds && listedIds.length + ? idsUpdate.filter((id) => !listedIds.includes(id)) + : idsUpdate; + + if (listedIds && !newIds.length) { + return global; + } + + return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([ + ...(listedIds || []), + ...newIds, + ])); +} + +export function updateOutlyingIds( + global: GlobalState, + chatId: number, + threadId: number, + idsUpdate: number[], +): GlobalState { + const outlyingIds = selectOutlyingIds(global, chatId, threadId); + const newIds = outlyingIds && outlyingIds.length + ? idsUpdate.filter((id) => !outlyingIds.includes(id)) + : idsUpdate; + + if (outlyingIds && !newIds.length) { + return global; + } + + return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([ + ...(outlyingIds || []), + ...newIds, + ])); +} + +function orderHistoryIds(listedIds: number[]) { + return listedIds.sort((a, b) => a - b); +} + +export function addViewportId( + global: GlobalState, + chatId: number, + threadId: number, + newId: number, +): GlobalState { + const viewportIds = selectViewportIds(global, chatId, threadId) || []; + if (viewportIds.includes(newId)) { + return global; + } + + const newIds = orderHistoryIds([ + ...( + viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT + ? viewportIds + : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2)) + ), + newId, + ]); + + return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds); +} + +export function safeReplaceViewportIds( + global: GlobalState, + chatId: number, + threadId: number, + newViewportIds: number[], +): GlobalState { + const viewportIds = selectViewportIds(global, chatId, threadId) || []; + + return replaceThreadParam( + global, + chatId, + threadId, + 'viewportIds', + areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds, + ); +} + +export function updateThreadInfo( + global: GlobalState, chatId: number, threadId: number, update: Partial | undefined, +): GlobalState { + const newThreadInfo = { + ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo), + ...update, + }; + + if (!newThreadInfo.threadId) { + return global; + } + + return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo); +} + +export function updateThreadInfos( + global: GlobalState, chatId: number, updates: Partial[], +): GlobalState { + updates.forEach((update) => { + global = updateThreadInfo(global, update.chatId!, update.threadId!, update); + }); + + return global; +} + +export function replaceScheduledMessages( + global: GlobalState, chatId: number, newById: Record, hash: number | undefined, +): GlobalState { + return updateScheduledMessages(global, chatId, { + byId: newById, + hash, + }); +} + +function updateScheduledMessages( + global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>, +): GlobalState { + const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 }; + + return { + ...global, + scheduledMessages: { + byChatId: { + ...global.scheduledMessages.byChatId, + [chatId]: { + ...current, + ...update, + }, + }, + }, + }; +} + +export function updateFocusedMessage( + global: GlobalState, chatId?: number, messageId?: number, noHighlight = false, +): GlobalState { + return { + ...global, + focusedMessage: { + ...global.focusedMessage, + chatId, + messageId, + noHighlight, + }, + }; +} + +export function updateFocusDirection( + global: GlobalState, direction?: FocusDirection, +): GlobalState { + return { + ...global, + focusedMessage: { + ...global.focusedMessage, + direction, + }, + }; +} + +export function enterMessageSelectMode( + global: GlobalState, + chatId: number, + messageId?: number | number[], +): GlobalState { + const messageIds = messageId ? Array.prototype.concat([], messageId) : []; + return { + ...global, + selectedMessages: { + chatId, + messageIds, + }, + }; +} + +export function toggleMessageSelection( + global: GlobalState, + chatId: number, + threadId: number, + messageListType: MessageListType, + messageId: number, + groupedId?: string, + childMessageIds?: number[], + withShift = false, +): GlobalState { + const { selectedMessages: oldSelectedMessages } = global; + if (groupedId) { + childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId); + } + const selectedMessageIds = childMessageIds || [messageId]; + if (!oldSelectedMessages) { + return enterMessageSelectMode(global, chatId, selectedMessageIds); + } + + const { messageIds } = oldSelectedMessages; + + let newMessageIds; + const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id)); + if (newSelectedMessageIds && !newSelectedMessageIds.length) { + newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id)); + } else if (withShift && messageIds.length) { + const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!; + const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]); + const currentIndex = viewportIds.indexOf(messageId); + const from = Math.min(prevIndex, currentIndex); + const to = Math.max(prevIndex, currentIndex); + const slice = viewportIds.slice(from, to + 1); + newMessageIds = unique([...messageIds, ...slice]); + } else { + newMessageIds = [...messageIds, ...newSelectedMessageIds]; + } + + if (!newMessageIds.length) { + return exitMessageSelectMode(global); + } + + return { + ...global, + selectedMessages: { + ...oldSelectedMessages, + messageIds: newMessageIds, + }, + }; +} + +export function exitMessageSelectMode(global: GlobalState): GlobalState { + return { + ...global, + selectedMessages: undefined, + }; +} diff --git a/src/modules/reducers/payments.ts b/src/modules/reducers/payments.ts new file mode 100644 index 000000000..e5cc90502 --- /dev/null +++ b/src/modules/reducers/payments.ts @@ -0,0 +1,131 @@ +import { GlobalState } from '../../global/types'; +import { ShippingOption, PaymentStep } from '../../types'; +import { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types'; + +export function updateShippingOptions( + global: GlobalState, + shippingOptions: ShippingOption[], +): GlobalState { + return { + ...global, + payment: { + ...global.payment, + shippingOptions, + }, + }; +} + +export function setRequestInfoId(global: GlobalState, id: string): GlobalState { + return { + ...global, + payment: { + ...global.payment, + formId: id, + }, + }; +} + +export function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState { + return { + ...global, + payment: { + ...global.payment, + step, + }, + }; +} + +export function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState { + if (!message.content || !message.content.invoice) { + return global; + } + const { + title, + text, + description, + photoUrl, + } = message.content.invoice; + return { + ...global, + payment: { + ...global.payment, + invoiceContent: { + title, + text, + description, + photoUrl, + }, + }, + }; +} + +export function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState { + return { + ...global, + payment: { + ...global.payment, + stripeCredentials: { + ...cardInfo, + }, + }, + }; +} + +export function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState { + return { + ...global, + payment: { + ...global.payment, + ...form, + }, + }; +} + +export function setReceipt( + global: GlobalState, + receipt?: ApiReceipt, + message?: ApiMessage, +): GlobalState { + if (!receipt || !message) { + return { + ...global, + payment: { + ...global.payment, + receipt: undefined, + }, + }; + } + + const { invoice: messageInvoice } = message.content; + const { photoUrl, text, title } = (messageInvoice || {}); + + return { + ...global, + payment: { + ...global.payment, + receipt: { + ...receipt, + photoUrl, + text, + title, + }, + }, + }; +} + +export function clearPayment(global: GlobalState): GlobalState { + return { + ...global, + payment: {}, + }; +} + +export function closeInvoice(global: GlobalState): GlobalState { + return { + ...global, + payment: { + ...global.payment, + isPaymentModalOpen: false, + }, + }; +} diff --git a/src/modules/reducers/settings.ts b/src/modules/reducers/settings.ts new file mode 100644 index 000000000..31741fde6 --- /dev/null +++ b/src/modules/reducers/settings.ts @@ -0,0 +1,62 @@ +import { GlobalState } from '../../global/types'; +import { ISettings } from '../../types'; + +export function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState { + return { + ...global, + settings: { + ...global.settings, + byKey: { + ...global.settings.byKey, + ...newSettings, + }, + }, + }; +} + +export function updateNotifySettings( + global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, isShowPreviews?: boolean, +) { + switch (peerType) { + case 'contact': + return replaceSettings(global, { + ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }), + ...(typeof isShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: isShowPreviews }), + }); + case 'group': + return replaceSettings(global, { + ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }), + ...(typeof isShowPreviews !== 'undefined' && { hasGroupMessagePreview: isShowPreviews }), + }); + case 'broadcast': + return replaceSettings(global, { + ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }), + ...(typeof isShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: isShowPreviews }), + }); + + default: + return undefined; + } +} + +export function addBlockedContact(global: GlobalState, contactId: number): GlobalState { + return { + ...global, + blocked: { + ...global.blocked, + ids: [contactId, ...global.blocked.ids], + totalCount: global.blocked.totalCount + 1, + }, + }; +} + +export function removeBlockedContact(global: GlobalState, contactId: number): GlobalState { + return { + ...global, + blocked: { + ...global.blocked, + ids: global.blocked.ids.filter((id) => id !== contactId), + totalCount: global.blocked.totalCount - 1, + }, + }; +} diff --git a/src/modules/reducers/symbols.ts b/src/modules/reducers/symbols.ts new file mode 100644 index 000000000..7ee327b87 --- /dev/null +++ b/src/modules/reducers/symbols.ts @@ -0,0 +1,131 @@ +import { GlobalState } from '../../global/types'; +import { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types'; +import { buildCollectionByKey, unique } from '../../util/iteratees'; +import { selectStickersForEmoji } from '../selectors'; + +export function updateStickerSets( + global: GlobalState, + category: 'added' | 'featured' | 'search', + hash: number, + sets: ApiStickerSet[], + resultIds?: string[], +): GlobalState { + const updatedSets = sets.map((stickerSet) => { + const existing = global.stickers.setsById[stickerSet.id]; + if (!existing) { + return stickerSet; + } + + return { + ...existing, + ...stickerSet, + }; + }); + + return { + ...global, + stickers: { + ...global.stickers, + setsById: { + ...global.stickers.setsById, + ...buildCollectionByKey(updatedSets, 'id'), + }, + [category]: { + ...global.stickers[category], + hash, + ...( + category === 'search' + ? { resultIds } + : { setIds: sets.map(({ id }) => id) } + ), + }, + }, + }; +} + +export function updateStickerSet( + global: GlobalState, stickerSetId: string, update: Partial, +): GlobalState { + const currentStickerSet = global.stickers.setsById[stickerSetId] || {}; + + return { + ...global, + stickers: { + ...global.stickers, + setsById: { + ...global.stickers.setsById, + [stickerSetId]: { + ...currentStickerSet, + ...update, + }, + }, + }, + }; +} + +export function updateGifSearch( + global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string, +): GlobalState { + const { results: currentResults } = global.gifs.search; + + let newResults!: ApiVideo[]; + if (isNew || !currentResults) { + newResults = results; + } else { + const currentIds = new Set(currentResults.map((gif) => gif.id)); + newResults = [ + ...currentResults, + ...results.filter((gif) => !currentIds.has(gif.id)), + ]; + } + + return { + ...global, + gifs: { + ...global.gifs, + search: { + ...global.gifs.search, + offset: nextOffset, + results: newResults, + }, + }, + }; +} + +export function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState { + return { + ...global, + animatedEmojis: stickerSet, + }; +} + +export function updateStickersForEmoji( + global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number, +): GlobalState { + const localStickers = selectStickersForEmoji(global, emoji); + const allStickers = [...localStickers, ...(remoteStickers || [])]; + const uniqueIds = unique(allStickers.map(({ id }) => id)); + const byId = buildCollectionByKey(allStickers, 'id'); + const stickers = uniqueIds.map((id) => byId[id]); + + return { + ...global, + stickers: { + ...global.stickers, + forEmoji: { + emoji, + stickers, + hash, + }, + }, + }; +} + +export function rebuildStickersForEmoji(global: GlobalState): GlobalState { + const { emoji, stickers, hash } = global.stickers.forEmoji || {}; + if (!emoji) { + return global; + } + + return updateStickersForEmoji(global, emoji, stickers, hash); +} diff --git a/src/modules/reducers/twoFaSettings.ts b/src/modules/reducers/twoFaSettings.ts new file mode 100644 index 000000000..54093c87b --- /dev/null +++ b/src/modules/reducers/twoFaSettings.ts @@ -0,0 +1,14 @@ +import { GlobalState } from '../../global/types'; + +export function updateTwoFaSettings( + global: GlobalState, + update: GlobalState['twoFaSettings'], +): GlobalState { + return { + ...global, + twoFaSettings: { + ...global.twoFaSettings, + ...update, + }, + }; +} diff --git a/src/modules/reducers/users.ts b/src/modules/reducers/users.ts new file mode 100644 index 000000000..575317f1f --- /dev/null +++ b/src/modules/reducers/users.ts @@ -0,0 +1,94 @@ +import { GlobalState } from '../../global/types'; +import { ApiUser } from '../../api/types'; + +import { omit } from '../../util/iteratees'; +import { MEMO_EMPTY_ARRAY } from '../../util/memo'; + +export function replaceUsers(global: GlobalState, newById: Record): GlobalState { + return { + ...global, + users: { + ...global.users, + byId: newById, + }, + }; +} +export function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState { + const { byId } = global.users; + const { hash, userIds: contactUserIds } = global.contactList || {}; + const user = byId[userId]; + const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin; + const updatedUser = { + ...user, + ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate), + }; + + if (!updatedUser.id || !updatedUser.type) { + return global; + } + + if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) { + global = { + ...global, + contactList: { + hash: hash || 0, + userIds: [userId, ...contactUserIds], + }, + }; + } + + return replaceUsers(global, { + ...byId, + [userId]: updatedUser, + }); +} + +export function updateUsers(global: GlobalState, updatedById: Record): GlobalState { + Object.keys(updatedById).map(Number).forEach((id) => { + global = updateUser(global, id, updatedById[id]); + }); + + return global; +} + +// @optimization Allows to avoid redundant updates which cause a lot of renders +export function addUsers(global: GlobalState, addedById: Record): GlobalState { + const { byId } = global.users; + Object.keys(addedById).map(Number).forEach((id) => { + if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) { + global = updateUser(global, id, addedById[id]); + } + }); + + return global; +} + +export function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState { + if (global.users.selectedId === selectedId) { + return global; + } + + return { + ...global, + users: { + ...global.users, + selectedId, + }, + }; +} + +export function deleteUser(global: GlobalState, userId: number): GlobalState { + const { byId } = global.users; + const { hash, userIds } = global.contactList || {}; + delete byId[userId]; + + global = { + ...global, + contactList: { + hash: hash || 0, + userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY, + }, + }; + + return replaceUsers(global, byId); +} diff --git a/src/modules/selectors/chats.ts b/src/modules/selectors/chats.ts new file mode 100644 index 000000000..cf090de8f --- /dev/null +++ b/src/modules/selectors/chats.ts @@ -0,0 +1,152 @@ +import { ApiChat, MAIN_THREAD_ID } from '../../api/types'; +import { GlobalState } from '../../global/types'; + +import { + getPrivateChatUserId, isChatChannel, isChatPrivate, isChatSuperGroup, isHistoryClearMessage, isUserBot, isUserOnline, +} from '../helpers'; +import { selectUser } from './users'; +import { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID } from '../../config'; + +export function selectChat(global: GlobalState, chatId: number): ApiChat | undefined { + return global.chats.byId[chatId]; +} + +export function selectChatUser(global: GlobalState, chat: ApiChat) { + const userId = getPrivateChatUserId(chat); + if (!userId) { + return false; + } + + return selectUser(global, userId); +} + +export function selectIsChatWithSelf(global: GlobalState, chatId: number) { + return chatId === global.currentUserId; +} + +export function selectIsChatWithBot(global: GlobalState, chat: ApiChat) { + const user = selectChatUser(global, chat); + return user && isUserBot(user); +} + +export function selectSupportChat(global: GlobalState) { + return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport); +} + +export function selectChatOnlineCount(global: GlobalState, chat: ApiChat) { + if (isChatPrivate(chat.id) || isChatChannel(chat)) { + return undefined; + } + + if (isChatSuperGroup(chat)) { + return chat.onlineCount; + } + + if (!chat.fullInfo || !chat.fullInfo.members) { + return undefined; + } + + const memberIds = chat.fullInfo.members.map((m) => m.userId); + return memberIds.reduce((onlineCount, memberId) => { + if (global.users.byId[memberId] && isUserOnline(global.users.byId[memberId])) { + return onlineCount + 1; + } + + return onlineCount; + }, 0); +} + +export function selectChatBot(global: GlobalState, chatId: number) { + const chat = selectChat(global, chatId); + const userId = chat && getPrivateChatUserId(chat); + const user = userId && selectUser(global, userId); + if (!user || !isUserBot(user)) { + return undefined; + } + + return user; +} + +export function selectIsChatBotNotStarted(global: GlobalState, chatId: number) { + const chat = selectChat(global, chatId); + const bot = selectChatBot(global, chatId); + if (!chat || !bot) { + return false; + } + + if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) { + return true; + } + + const messageInfo = global.messages.byChatId[chatId]; + if (!messageInfo) { + return false; + } + + const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {}; + return listedIds && !listedIds.length; +} + +export function selectAreActiveChatsLoaded(global: GlobalState): boolean { + return Boolean(global.chats.listIds.active); +} + +export function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean { + const { listIds } = global.chats; + if (type) { + const targetList = listIds[type]; + return Boolean(targetList && targetList.includes(chatId)); + } + + return Object.values(listIds).some((list) => list && list.includes(chatId)); +} + +export function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined { + const chat = selectChat(global, chatId); + if (!chat || !selectIsChatListed(global, chatId)) { + return undefined; + } + + return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active'; +} + +export function selectChatFolder(global: GlobalState, folderId: number) { + return global.chatFolders.byId[folderId]; +} + +export function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number { + const { totalCount } = global.chats; + const allChatsCount = totalCount.all; + const archivedChatsCount = totalCount.archived || 0; + + if (listType === 'archived') { + return archivedChatsCount; + } + + return allChatsCount ? allChatsCount - archivedChatsCount : 0; +} + +export function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean { + const { active, archived } = global.chats.orderedPinnedIds; + + if (folderId === ALL_FOLDER_ID) { + return !!active && active.includes(chatId); + } + + if (folderId === ARCHIVED_FOLDER_ID) { + return !!archived && archived.includes(chatId); + } + + const { byId: chatFoldersById } = global.chatFolders; + + const { pinnedChatIds } = chatFoldersById[folderId] || {}; + return !!pinnedChatIds && pinnedChatIds.includes(chatId); +} + +// Slow, not to be used in `withGlobal` +export function selectChatByUsername(global: GlobalState, username: string) { + const usernameLowered = username.toLowerCase(); + return Object.values(global.chats.byId).find( + (chat) => chat.username && chat.username.toLowerCase() === usernameLowered, + ); +} diff --git a/src/modules/selectors/globalSearch.ts b/src/modules/selectors/globalSearch.ts new file mode 100644 index 000000000..4cd99670a --- /dev/null +++ b/src/modules/selectors/globalSearch.ts @@ -0,0 +1,5 @@ +import { GlobalState } from '../../global/types'; + +export function selectCurrentGlobalSearchQuery(global: GlobalState) { + return global.globalSearch.query; +} diff --git a/src/modules/selectors/index.ts b/src/modules/selectors/index.ts new file mode 100644 index 000000000..0e7d52baf --- /dev/null +++ b/src/modules/selectors/index.ts @@ -0,0 +1,9 @@ +export * from './ui'; +export * from './users'; +export * from './chats'; +export * from './messages'; +export * from './globalSearch'; +export * from './localSearch'; +export * from './management'; +export * from './symbols'; +export * from './payments'; diff --git a/src/modules/selectors/localSearch.ts b/src/modules/selectors/localSearch.ts new file mode 100644 index 000000000..9238b718d --- /dev/null +++ b/src/modules/selectors/localSearch.ts @@ -0,0 +1,35 @@ +import { GlobalState } from '../../global/types'; +import { selectCurrentMessageList } from './messages'; +import { buildChatThreadKey } from '../helpers'; + +export function selectCurrentTextSearch(global: GlobalState) { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + const chatThreadKey = buildChatThreadKey(chatId, threadId); + const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey]; + if (!currentSearch || !currentSearch.isActive) { + return undefined; + } + + return currentSearch; +} + +export function selectCurrentMediaSearchPeerId(global: GlobalState) { + const { byChatId } = global.localMediaSearch; + const { chatId } = selectCurrentMessageList(global) || {}; + const currentProfileUserId = global.users.selectedId; + + return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId; +} + +export function selectCurrentMediaSearch(global: GlobalState) { + const peerId = selectCurrentMediaSearchPeerId(global); + if (!peerId) { + return undefined; + } + + return global.localMediaSearch.byChatId[peerId]; +} diff --git a/src/modules/selectors/management.ts b/src/modules/selectors/management.ts new file mode 100644 index 000000000..0f852b575 --- /dev/null +++ b/src/modules/selectors/management.ts @@ -0,0 +1,45 @@ +import { GlobalState } from '../../global/types'; + +import { selectCurrentMessageList } from './messages'; +import { selectChat } from './chats'; +import { isChatGroup, isChatPrivate } from '../helpers'; + +export function selectManagement(global: GlobalState, chatId: number) { + return global.management.byChatId[chatId]; +} + +export function selectCurrentManagement(global: GlobalState) { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + const currentManagement = global.management.byChatId[chatId]; + if (!currentManagement || !currentManagement.isActive) { + return undefined; + } + + return currentManagement; +} + +export function selectCurrentManagementType(global: GlobalState) { + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + if (!chatId || !threadId) { + return undefined; + } + + if (isChatPrivate(chatId)) { + return 'user'; + } + + const chat = selectChat(global, chatId); + if (!chat) { + return undefined; + } + + if (isChatGroup(chat)) { + return 'group'; + } + + return 'channel'; +} diff --git a/src/modules/selectors/messages.ts b/src/modules/selectors/messages.ts new file mode 100644 index 000000000..9e3fef595 --- /dev/null +++ b/src/modules/selectors/messages.ts @@ -0,0 +1,688 @@ +import { GlobalState, MessageListType, Thread } from '../../global/types'; +import { + ApiChat, + ApiMessage, + ApiMessageOutgoingStatus, + ApiUser, + MAIN_THREAD_ID, +} from '../../api/types'; + +import { LOCAL_MESSAGE_ID_BASE } from '../../config'; +import { + selectChat, selectIsChatWithBot, selectIsChatWithSelf, +} from './chats'; +import { selectIsUserOrChatContact, selectUser } from './users'; +import { + getSendingState, + isChatChannel, + isMessageLocal, + isChatPrivate, + isForwardedMessage, + getCanPostInChat, + isUserRightBanned, + getHasAdminRight, + isChatBasicGroup, + isCommonBoxChat, + isServiceNotificationMessage, + isOwnMessage, + isActionMessage, + isChatGroup, + isChatSuperGroup, + getMessageVideo, +} from '../helpers'; +import { findLast } from '../../util/iteratees'; +import { selectIsStickerFavorite } from './symbols'; + +const MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours + +export function selectCurrentMessageList(global: GlobalState) { + const { messageLists } = global.messages; + + if (messageLists && messageLists.length) { + return messageLists[messageLists.length - 1]; + } + + return undefined; +} + +export function selectCurrentChat(global: GlobalState) { + const { chatId } = selectCurrentMessageList(global) || {}; + + return chatId ? selectChat(global, chatId) : undefined; +} + +export function selectChatMessages(global: GlobalState, chatId: number) { + const messages = global.messages.byChatId[chatId]; + + return messages ? messages.byId : undefined; +} + +export function selectScheduledMessages(global: GlobalState, chatId: number) { + const messages = global.scheduledMessages.byChatId[chatId]; + + return messages ? messages.byId : undefined; +} + +export function selectThreadParam( + global: GlobalState, + chatId: number, + threadId: number, + key: K, +) { + const messageInfo = global.messages.byChatId[chatId]; + if (!messageInfo) { + return undefined; + } + + const thread = messageInfo.threadsById[threadId]; + if (!thread) { + return undefined; + } + + return thread[key]; +} + +export function selectListedIds(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'listedIds'); +} + +export function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'outlyingIds'); +} + +export function selectCurrentMessageIds( + global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType, +) { + switch (messageListType) { + case 'thread': + return selectViewportIds(global, chatId, threadId); + case 'pinned': + return selectPinnedIds(global, chatId); + case 'scheduled': + return selectScheduledIds(global, chatId); + } + + return undefined; +} + +export function selectViewportIds(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'viewportIds'); +} + +export function selectPinnedIds(global: GlobalState, chatId: number) { + return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds'); +} + +export function selectScheduledIds(global: GlobalState, chatId: number) { + return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds'); +} + +export function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'scrollOffset'); +} + +export function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'replyingToId'); +} + +export function selectEditingId(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'editingId'); +} + +export function selectEditingScheduledId(global: GlobalState, chatId: number) { + return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId'); +} + +export function selectDraft(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'draft'); +} + +export function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'threadInfo'); +} + +export function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) { + return selectThreadParam(global, chatId, threadId, 'firstMessageId'); +} + +export function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) { + if (threadId === MAIN_THREAD_ID) { + return selectChat(global, chatId); + } + + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (!threadInfo) { + return undefined; + } + + return selectChat(global, threadInfo.originChannelId || chatId); +} + +export function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) { + if (threadId === MAIN_THREAD_ID) { + return undefined; + } + + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (!threadInfo) { + return undefined; + } + + return threadInfo.topMessageId; +} + +export function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) { + const messageInfo = global.messages.byChatId[chatId]; + if (!messageInfo) { + return undefined; + } + + const { replyToMessageId, replyToTopMessageId } = message; + if (!replyToMessageId && !replyToTopMessageId) { + return undefined; + } + + return Object.values(messageInfo.threadsById).find((thread) => { + return thread.threadInfo && ( + (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId) + || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId) + ); + }); +} + +export function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) { + const currentMessageList = selectCurrentMessageList(global); + if (!currentMessageList) { + return false; + } + + const { threadInfo } = selectThreadByMessage(global, chatId, message) || {}; + return ( + chatId === currentMessageList.chatId + && ( + (currentMessageList.threadId === MAIN_THREAD_ID) + || (threadInfo && currentMessageList.threadId === threadInfo.threadId) + ) + ); +} + +export function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) { + const viewportIds = selectViewportIds(global, chatId, threadId); + if (!viewportIds || !viewportIds.length) { + return true; + } + + let lastMessageId: number; + + if (threadId === MAIN_THREAD_ID) { + const chat = selectChat(global, chatId); + if (!chat || !chat.lastMessage) { + return true; + } + + lastMessageId = chat.lastMessage.id; + } else { + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (!threadInfo || !threadInfo.lastMessageId) { + return undefined; + } + + lastMessageId = threadInfo.lastMessageId; + } + + // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation + if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) { + return true; + } + + return viewportIds[viewportIds.length - 1] >= lastMessageId; +} + +export function selectChatMessage(global: GlobalState, chatId: number, messageId: number) { + const chatMessages = selectChatMessages(global, chatId); + + return chatMessages ? chatMessages[messageId] : undefined; +} + +export function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) { + const chatMessages = selectScheduledMessages(global, chatId); + + return chatMessages ? chatMessages[messageId] : undefined; +} + +export function selectEditingMessage( + global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType, +) { + if (messageListType === 'scheduled') { + const messageId = selectEditingScheduledId(global, chatId); + return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined; + } else { + const messageId = selectEditingId(global, chatId, threadId); + return messageId ? selectChatMessage(global, chatId, messageId) : undefined; + } +} + +export function selectChatMessageByPollId(global: GlobalState, pollId: string) { + let messageWithPoll: ApiMessage | undefined; + + // eslint-disable-next-line no-restricted-syntax + for (const chatMessages of Object.values(global.messages.byChatId)) { + const { byId } = chatMessages; + messageWithPoll = Object.values(byId).find((message) => { + return message.content.poll && message.content.poll.id === pollId; + }); + if (messageWithPoll) { + break; + } + } + + return messageWithPoll; +} + +export function selectFocusedMessageId(global: GlobalState, chatId: number) { + const { chatId: focusedChatId, messageId } = global.focusedMessage || {}; + + return focusedChatId === chatId ? messageId : undefined; +} + +export function selectIsMessageFocused(global: GlobalState, message: ApiMessage) { + const focusedId = selectFocusedMessageId(global, message.chatId); + + return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false; +} + +export function selectIsMessageUnread(global: GlobalState, message: ApiMessage) { + const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {}; + return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id; +} + +export function selectOutgoingStatus( + global: GlobalState, message: ApiMessage, isScheduledList = false, +): ApiMessageOutgoingStatus { + if (!selectIsMessageUnread(global, message) && !isScheduledList) { + return 'read'; + } + + return getSendingState(message); +} + +export function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined { + const { senderId } = message; + if (!senderId) { + return undefined; + } + + return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId); +} + +export function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined { + const { forwardInfo } = message; + if (!forwardInfo) { + return undefined; + } + + if (forwardInfo.isChannelPost && forwardInfo.fromChatId) { + return selectChat(global, forwardInfo.fromChatId); + } else if (forwardInfo.senderUserId) { + return selectUser(global, forwardInfo.senderUserId); + } + + return undefined; +} + +export function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) { + const chat = selectChat(global, message.chatId); + if (!chat || chat.isRestricted) { + return {}; + } + + const isPrivate = isChatPrivate(chat.id); + const isChatWithSelf = selectIsChatWithSelf(global, message.chatId); + const isBasicGroup = isChatBasicGroup(chat); + const isSuperGroup = isChatSuperGroup(chat); + const isChannel = isChatChannel(chat); + const isServiceNotification = isServiceNotificationMessage(message); + + const isOwn = isOwnMessage(message); + const isAction = isActionMessage(message); + const { content } = message; + const isMessageEditable = ( + (isChatWithSelf || Date.now() - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS) + && !( + content.sticker || content.contact || content.poll || content.action || content.audio + || (content.video && content.video.isRound) + ) + && !isForwardedMessage(message) + && !message.viaBotId + ); + + const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification; + + const hasPinPermission = isPrivate || ( + chat.isCreator + || (!isChannel && !isUserRightBanned(chat, 'pinMessages')) + || getHasAdminRight(chat, 'pinMessages') + ); + + let canPin = !isAction && hasPinPermission; + let canUnpin = false; + + const pinnedMessageIds = selectPinnedIds(global, chat.id); + + if (canPin) { + canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id)); + canPin = !canUnpin; + } + + const canDelete = isPrivate + || isOwn + || isBasicGroup + || chat.isCreator + || getHasAdminRight(chat, 'deleteMessages'); + + const canDeleteForAll = canDelete && !isServiceNotification && ( + (isPrivate && !isChatWithSelf) + || (isBasicGroup && ( + isOwn || getHasAdminRight(chat, 'deleteMessages') + )) + ); + + const canEdit = !isAction && isMessageEditable && ( + isOwn + || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages'))) + ); + + const canForward = !isAction && !isServiceNotification; + + const hasSticker = Boolean(message.content.sticker); + const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!); + const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker; + const canUnfaveSticker = !isAction && hasFavoriteSticker; + const canCopy = !isAction; + const canCopyLink = !isAction && (isChannel || isSuperGroup); + const canSelect = !isAction; + const noOptions = [ + canReply, + canEdit, + canPin, + canUnpin, + canDelete, + canDeleteForAll, + canForward, + canFaveSticker, + canUnfaveSticker, + canCopy, + canCopyLink, + canSelect, + ].every((ability) => !ability); + + return { + noOptions, + canReply, + canEdit, + canPin, + canUnpin, + canDelete, + canDeleteForAll, + canForward, + canFaveSticker, + canUnfaveSticker, + canCopy, + canCopyLink, + canSelect, + }; +} + +export function selectCanDeleteSelectedMessages(global: GlobalState) { + const { messageIds: selectedMessageIds } = global.selectedMessages || {}; + const { chatId, threadId } = selectCurrentMessageList(global) || {}; + const chatMessages = chatId && selectChatMessages(global, chatId); + if (!chatMessages || !selectedMessageIds || !threadId) { + return {}; + } + + const messageActions = selectedMessageIds + .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId)) + .filter(Boolean); + + return { + canDelete: messageActions.every((actions) => actions.canDelete), + canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll), + }; +} + +export function selectUploadProgress(global: GlobalState, message: ApiMessage) { + const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id]; + + return fileTransfer ? fileTransfer.progress : undefined; +} + +export function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) { + if (threadId === MAIN_THREAD_ID) { + const chat = selectChat(global, chatId); + if (!chat) { + return undefined; + } + + // `lastReadInboxMessageId` is empty for new chats + if (!chat.lastReadInboxMessageId) { + return undefined; + } + + if (!chat.lastMessage) { + return chat.lastReadInboxMessageId; + } + + if (isMessageLocal(chat.lastMessage)) { + return chat.lastMessage.id; + } + + // Some previously read messages may be deleted + return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId); + } else { + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (!threadInfo) { + return undefined; + } + + if (!threadInfo.lastReadInboxMessageId) { + return threadInfo.topMessageId; + } + + // Some previously read messages may be deleted + return threadInfo.lastMessageId + ? Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId) + : threadInfo.lastReadInboxMessageId; + } +} + +export function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) { + if (threadId === MAIN_THREAD_ID) { + const chat = selectChat(global, chatId); + if (!chat || !chat.unreadCount) { + return undefined; + } + } else { + const threadInfo = selectThreadInfo(global, chatId, threadId); + if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) { + return undefined; + } + } + + const outlyingIds = selectOutlyingIds(global, chatId, threadId); + const listedIds = selectListedIds(global, chatId, threadId); + const byId = selectChatMessages(global, chatId); + if (!byId || !(outlyingIds || listedIds)) { + return undefined; + } + + const lastReadId = selectRealLastReadId(global, chatId, threadId); + + if (outlyingIds) { + const found = outlyingIds.find((id) => !lastReadId || (id > lastReadId && byId[id] && !byId[id].isOutgoing)); + if (found) { + return found; + } + } + + if (listedIds) { + const found = listedIds.find((id) => !lastReadId || (id > lastReadId && byId[id] && !byId[id].isOutgoing)); + if (found) { + return found; + } + } + + return undefined; +} + +export function selectIsPollResultsOpen(global: GlobalState) { + const { pollResults } = global; + return Boolean(pollResults.messageId); +} + +export function selectIsForwardModalOpen(global: GlobalState) { + const { forwardMessages } = global; + return Boolean(forwardMessages.isModalShown); +} + +export function selectCommonBoxChatId(global: GlobalState, messageId: number) { + const fromLastMessage = Object.values(global.chats.byId).find((chat) => ( + isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId + )); + if (fromLastMessage) { + return fromLastMessage.id; + } + + const { byChatId } = global.messages; + return Number(Object.keys(byChatId).find((chatId) => { + const chat = selectChat(global, Number(chatId)); + return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId]; + })); +} + +export function selectIsInSelectMode(global: GlobalState) { + const { selectedMessages } = global; + + return Boolean(selectedMessages); +} + +export function selectIsMessageSelected(global: GlobalState, messageId: number) { + const { messageIds } = global.selectedMessages || {}; + if (!messageIds) { + return false; + } + + return messageIds.includes(messageId); +} + +export function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) { + const chatMessages = selectChatMessages(global, chatId); + if (!chatMessages) { + return undefined; + } + + return Object.values(chatMessages) + .filter((message) => message.groupedId === groupedId && message.forwardInfo) + .map(({ forwardInfo }) => forwardInfo!.fromMessageId); +} + +export function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) { + const chatMessages = selectChatMessages(global, chatId); + if (!chatMessages) { + return undefined; + } + + return Object.keys(chatMessages) + .map(Number) + .filter((id) => chatMessages[id].groupedId === groupedId); +} + +export function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) { + const { messageIds: selectedIds } = global.selectedMessages || {}; + if (!selectedIds) { + return false; + } + + const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId); + return groupIds && groupIds.every((id) => selectedIds.includes(id)); +} + +export function selectSelectedMessagesCount(global: GlobalState) { + const { messageIds } = global.selectedMessages || {}; + + return messageIds ? messageIds.length : 0; +} + +export function selectNewestMessageWithBotKeyboardButtons( + global: GlobalState, chatId: number, +): ApiMessage | undefined { + const chat = selectChat(global, chatId); + if (!chat) { + return undefined; + } + + if (!selectIsChatWithBot(global, chat)) { + return undefined; + } + + const chatMessages = selectChatMessages(global, chatId); + const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID); + if (!chatMessages || !viewportIds) { + return undefined; + } + + const messageId = findLast(viewportIds, (id) => { + return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons); + }); + + const replyHideMessageId = findLast(viewportIds, (id) => { + return Boolean(chatMessages[id].shouldHideKeyboardButtons); + }); + + if (messageId && replyHideMessageId && replyHideMessageId > messageId) { + return undefined; + } + + return messageId ? chatMessages[messageId] : undefined; +} + +export function selectShouldAutoLoadMedia( + global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser, +) { + const { + shouldAutoDownloadMediaFromContacts, + shouldAutoDownloadMediaInPrivateChats, + shouldAutoDownloadMediaInGroups, + shouldAutoDownloadMediaInChannels, + } = global.settings.byKey; + + return Boolean( + (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id)) + || (shouldAutoDownloadMediaInGroups && isChatGroup(chat)) + || (shouldAutoDownloadMediaInChannels && isChatChannel(chat)) + || (shouldAutoDownloadMediaFromContacts && sender && ( + sender.id === global.currentUserId + || selectIsUserOrChatContact(global, sender) + )), + ); +} + +export function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) { + const video = getMessageVideo(message); + if (!video) { + return undefined; + } + + const { + shouldAutoPlayVideos, + shouldAutoPlayGifs, + } = global.settings.byKey; + + const asGif = video.isGif || video.isRound; + + return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif); +} + +export function selectShouldLoopStickers(global: GlobalState) { + return global.settings.byKey.shouldLoopStickers; +} diff --git a/src/modules/selectors/payments.ts b/src/modules/selectors/payments.ts new file mode 100644 index 000000000..907a0a57a --- /dev/null +++ b/src/modules/selectors/payments.ts @@ -0,0 +1,18 @@ + +import { GlobalState } from '../../global/types'; + +export function selectPaymentMessageId(global: GlobalState) { + return global.payment.messageId; +} + +export function selectPaymentRequestId(global: GlobalState) { + return global.payment.formId; +} + +export function selectProviderPublishableKey(global: GlobalState) { + return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined; +} + +export function selectStripeCredentials(global: GlobalState) { + return global.payment.stripeCredentials; +} diff --git a/src/modules/selectors/symbols.ts b/src/modules/selectors/symbols.ts new file mode 100644 index 000000000..f245fe3d8 --- /dev/null +++ b/src/modules/selectors/symbols.ts @@ -0,0 +1,45 @@ +import { GlobalState } from '../../global/types'; +import { ApiSticker } from '../../api/types'; + +export function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) { + const { stickers } = global.stickers.favorite; + return stickers && stickers.some(({ id }) => id === sticker.id); +} + +export function selectCurrentStickerSearch(global: GlobalState) { + return global.stickers.search; +} + +export function selectCurrentGifSearch(global: GlobalState) { + return global.gifs.search; +} + +export function selectStickerSet(global: GlobalState, id: string) { + return global.stickers.setsById[id]; +} + +export function selectStickersForEmoji(global: GlobalState, emoji: string) { + const stickerSets = Object.values(global.stickers.setsById); + let stickersForEmoji: ApiSticker[] = []; + stickerSets.forEach(({ packs }) => { + if (!packs) { + return; + } + const stickers = packs[emoji]; + if (stickers) { + stickersForEmoji = stickersForEmoji.concat(stickers); + } + }); + return stickersForEmoji; +} + +export function selectAnimatedEmoji(global: GlobalState, emoji: string) { + const { animatedEmojis } = global; + if (!animatedEmojis || !animatedEmojis.stickers) { + return undefined; + } + + emoji = emoji.replace('\ufe0f', ''); + + return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji); +} diff --git a/src/modules/selectors/ui.ts b/src/modules/selectors/ui.ts new file mode 100644 index 000000000..0ae518ead --- /dev/null +++ b/src/modules/selectors/ui.ts @@ -0,0 +1,58 @@ +import { GlobalState } from '../../global/types'; +import { RightColumnContent } from '../../types'; + +import { IS_MOBILE_SCREEN } from '../../util/environment'; +import { selectCurrentMessageList, selectIsPollResultsOpen } from './messages'; +import { selectCurrentTextSearch } from './localSearch'; +import { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols'; +import { selectAreActiveChatsLoaded } from './chats'; +import { selectCurrentManagement } from './management'; + +export function selectIsMediaViewerOpen(global: GlobalState) { + const { mediaViewer } = global; + return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId); +} + +export function selectRightColumnContentKey(global: GlobalState) { + const { + users, + isChatInfoShown, + isStatisticsShown, + } = global; + + const isPollResults = selectIsPollResultsOpen(global); + const isSearch = Boolean(!IS_MOBILE_SCREEN && selectCurrentTextSearch(global)); + const isManagement = selectCurrentManagement(global); + const stickerSearch = selectCurrentStickerSearch(global); + const isStickerSearch = stickerSearch.query !== undefined; + const gifSearch = selectCurrentGifSearch(global); + const isGifSearch = gifSearch.query !== undefined; + const { chatId: currentChatId } = selectCurrentMessageList(global) || {}; + const currentProfileUserId = users.selectedId; + const areActiveChatsLoaded = selectAreActiveChatsLoaded(global); + const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded); + const isChatShown = Boolean(currentChatId && areActiveChatsLoaded); + const isChatInfo = isChatShown && isChatInfoShown; + + return isPollResults ? ( + RightColumnContent.PollResults + ) : isSearch ? ( + RightColumnContent.Search + ) : isManagement ? ( + RightColumnContent.Management + ) : isStatisticsShown ? ( + RightColumnContent.Statistics + ) : isStickerSearch ? ( + RightColumnContent.StickerSearch + ) : isGifSearch ? ( + RightColumnContent.GifSearch + ) : isUserInfo ? ( + RightColumnContent.UserInfo + ) : isChatInfo ? ( + RightColumnContent.ChatInfo + ) : undefined; +} + +export function selectIsRightColumnShown(global: GlobalState) { + return selectRightColumnContentKey(global) !== undefined; +} diff --git a/src/modules/selectors/users.ts b/src/modules/selectors/users.ts new file mode 100644 index 000000000..d37923156 --- /dev/null +++ b/src/modules/selectors/users.ts @@ -0,0 +1,18 @@ +import { GlobalState } from '../../global/types'; +import { ApiChat, ApiUser } from '../../api/types'; + +export function selectUser(global: GlobalState, userId: number): ApiUser | undefined { + return global.users.byId[userId]; +} + +// Slow, not to be used in `withGlobal` +export function selectUserByUsername(global: GlobalState, username: string) { + const usernameLowered = username.toLowerCase(); + return Object.values(global.users.byId).find( + (user) => user.username.toLowerCase() === usernameLowered, + ); +} + +export function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) { + return global.contactList && global.contactList.userIds.includes(userOrChat.id); +} diff --git a/src/serviceWorker.ts b/src/serviceWorker.ts new file mode 100644 index 000000000..7f3a861d7 --- /dev/null +++ b/src/serviceWorker.ts @@ -0,0 +1,45 @@ +import { DEBUG } from './config'; +import { respondForProgressive } from './serviceWorker/progressive'; +import { respondWithCache, clearAssetCache } from './serviceWorker/assetCache'; + +declare const self: ServiceWorkerGlobalScope; + +const ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\.(js|css|woff2?|svg|png|jpg|json|wasm)$/; + +self.addEventListener('install', (e) => { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('ServiceWorker installed'); + } + + // Activate worker immediately + e.waitUntil(self.skipWaiting()); +}); + +self.addEventListener('activate', (e) => { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('ServiceWorker activated'); + } + + // Become available to all pages + e.waitUntil(clearAssetCache()); + e.waitUntil(self.clients.claim()); +}); + +// eslint-disable-next-line no-restricted-globals +self.addEventListener('fetch', (e: FetchEvent) => { + e.respondWith((() => { + const { url } = e.request; + + if (url.includes('/progressive/')) { + return respondForProgressive(e); + } + + if (url.match(ASSET_CACHE_PATTERN)) { + return respondWithCache(e); + } + + return fetch(e.request); + })()); +}); diff --git a/src/serviceWorker/assetCache.ts b/src/serviceWorker/assetCache.ts new file mode 100644 index 000000000..71561db8e --- /dev/null +++ b/src/serviceWorker/assetCache.ts @@ -0,0 +1,21 @@ +import { ASSET_CACHE_NAME } from '../config'; + +declare const self: ServiceWorkerGlobalScope; + +export async function respondWithCache(e: FetchEvent) { + const cache = await self.caches.open(ASSET_CACHE_NAME); + const cached = await cache.match(e.request); + + if (cached) { + return cached; + } + + const remote = await fetch(e.request); + cache.put(e.request, remote.clone()); + + return remote; +} + +export function clearAssetCache() { + return self.caches.delete(ASSET_CACHE_NAME); +} diff --git a/src/serviceWorker/progressive.ts b/src/serviceWorker/progressive.ts new file mode 100644 index 000000000..bc7e7c99b --- /dev/null +++ b/src/serviceWorker/progressive.ts @@ -0,0 +1,193 @@ +import { pause } from '../util/schedulers'; +import generateIdFor from '../util/generateIdFor'; +import { + DEBUG, + MEDIA_CACHE_MAX_BYTES, + MEDIA_PROGRESSIVE_CACHE_DISABLED, + MEDIA_PROGRESSIVE_CACHE_NAME, +} from '../config'; + +declare const self: ServiceWorkerGlobalScope; + +type PartInfo = { + type: 'PartInfo'; + arrayBuffer: ArrayBuffer; + mimeType: 'string'; + fullSize: number; +}; + +type RequestStates = { + resolve: (response: PartInfo) => void; + reject: () => void; +}; + +const MB = 1024 * 1024; +const DEFAULT_PART_SIZE = 0.5 * MB; +const MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file +const PART_TIMEOUT = 30000; + +const requestStates = new Map(); + +export async function respondForProgressive(e: FetchEvent) { + const { url } = e.request; + const range = e.request.headers.get('range'); + const bytes = /^bytes=(\d+)-(\d+)?$/g.exec(range || '')!; + const start = Number(bytes[1]); + const originalEnd = Number(bytes[2]); + + let end = originalEnd; + if (!end || (end - start + 1) > DEFAULT_PART_SIZE) { + end = start + DEFAULT_PART_SIZE - 1; + } + + // Optimization for Safari + if (start === 0 && end === 1) { + const match = e.request.url.match(/fileSize=(\d+)&mimeType=([\w/]+)/); + const fileSize = match && Number(match[1]); + const mimeType = match && match[2]; + + if (fileSize && mimeType) { + return new Response(new Uint8Array(2).buffer, { + status: 206, + statusText: 'Partial Content', + headers: [ + ['Content-Range', `bytes 0-1/${fileSize}`], + ['Accept-Ranges', 'bytes'], + ['Content-Length', '2'], + ['Content-Type', mimeType], + ], + }); + } + } + + const cacheKey = `${url}?start=${start}&end=${end}`; + const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED ? await fetchFromCache(cacheKey) : []; + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log( + `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`, + ); + } + + if (cachedArrayBuffer) { + return new Response(cachedArrayBuffer, { + status: 206, + statusText: 'Partial Content', + headers: cachedHeaders, + }); + } + + let partInfo; + try { + partInfo = await requestPart(e, { url, start, end }); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('FETCH PROGRESSIVE', err); + } + } + + if (!partInfo) { + return new Response('', { + status: 500, + statusText: 'Failed to fetch progressive part', + }); + } + + const { arrayBuffer, fullSize, mimeType } = partInfo; + + const partSize = Math.min(end - start + 1, arrayBuffer.byteLength); + end = start + partSize - 1; + const arrayBufferPart = arrayBuffer.slice(0, partSize); + const headers = [ + ['Content-Range', `bytes ${start}-${end}/${fullSize}`], + ['Accept-Ranges', 'bytes'], + ['Content-Length', String(partSize)], + ['Content-Type', mimeType], + ]; + + if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) { + saveToCache(cacheKey, arrayBufferPart, headers); + } + + return new Response(arrayBufferPart, { + status: 206, + statusText: 'Partial Content', + headers, + }); +} + +// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359 +async function fetchFromCache(cacheKey: string) { + const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME); + + return Promise.all([ + cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)), + cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)), + ]); +} + +async function saveToCache(cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit) { + const cache = await self.caches.open(MEDIA_PROGRESSIVE_CACHE_NAME); + + return Promise.all([ + cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)), + cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))), + ]); +} + +async function requestPart( + e: FetchEvent, + params: { url: string; start: number; end: number }, +): Promise { + if (!e.clientId) { + return undefined; + } + + // eslint-disable-next-line no-restricted-globals + const client = await self.clients.get(e.clientId); + if (!client) { + return undefined; + } + + const messageId = generateIdFor(requestStates); + const requestState = {} as RequestStates; + + const promise = Promise.race([ + pause(PART_TIMEOUT).then(() => Promise.reject(new Error('ERROR_PART_TIMEOUT'))), + new Promise((resolve, reject) => { + Object.assign(requestState, { resolve, reject }); + }), + ]); + + requestStates.set(messageId, requestState); + promise + .catch(() => undefined) + .finally(() => { + requestStates.delete(messageId); + }); + + client.postMessage({ + type: 'requestPart', + messageId, + params, + }); + + return promise; +} + +self.addEventListener('message', (e) => { + const { type, messageId, result } = e.data as { + type: string; + messageId: string; + result: PartInfo; + }; + + if (type === 'partResponse') { + const requestState = requestStates.get(messageId); + if (requestState) { + requestState.resolve(result); + } + } +}); diff --git a/src/styles/Telegram T.json b/src/styles/Telegram T.json new file mode 100644 index 000000000..c2d5ab7c9 --- /dev/null +++ b/src/styles/Telegram T.json @@ -0,0 +1,3053 @@ +{ + "metadata": { + "name": "Telegram T", + "lastOpened": 0, + "created": 1617759787079 + }, + "iconSets": [ + { + "selection": [ + { + "order": 607, + "id": 30, + "name": "darkmode", + "prevSize": 32, + "code": 59769, + "tempChar": "" + }, + { + "order": 606, + "id": 29, + "name": "animations", + "prevSize": 32, + "code": 59770, + "tempChar": "" + }, + { + "order": 605, + "id": 28, + "name": "enter", + "prevSize": 32, + "code": 59771, + "tempChar": "" + }, + { + "order": 604, + "id": 27, + "name": "fontsize", + "prevSize": 32, + "code": 59772, + "tempChar": "" + }, + { + "order": 603, + "id": 26, + "name": "permissions", + "prevSize": 32, + "code": 59766, + "tempChar": "" + }, + { + "order": 602, + "id": 25, + "name": "card", + "prevSize": 32, + "code": 59767, + "tempChar": "" + }, + { + "order": 601, + "id": 24, + "name": "truck", + "prevSize": 32, + "code": 59768, + "tempChar": "" + }, + { + "order": 600, + "id": 23, + "name": "share-filled", + "prevSize": 32, + "code": 59738, + "tempChar": "" + }, + { + "order": 577, + "id": 22, + "name": "bold", + "prevSize": 32, + "code": 59745, + "tempChar": "" + }, + { + "order": 578, + "id": 21, + "name": "bot-command", + "prevSize": 32, + "code": 59746, + "tempChar": "" + }, + { + "order": 579, + "id": 20, + "name": "calendar-filter", + "prevSize": 32, + "code": 59747, + "tempChar": "" + }, + { + "order": 580, + "id": 19, + "name": "comments", + "prevSize": 32, + "code": 59748, + "tempChar": "" + }, + { + "order": 581, + "id": 18, + "name": "comments-sticker", + "prevSize": 32, + "code": 59749, + "tempChar": "" + }, + { + "order": 582, + "id": 17, + "name": "arrow-down", + "prevSize": 32, + "code": 59750, + "tempChar": "" + }, + { + "order": 585, + "id": 14, + "name": "email", + "prevSize": 32, + "code": 59751, + "tempChar": "" + }, + { + "order": 586, + "id": 13, + "name": "italic", + "prevSize": 32, + "code": 59752, + "tempChar": "" + }, + { + "order": 587, + "id": 12, + "name": "link", + "prevSize": 32, + "code": 59753, + "tempChar": "" + }, + { + "order": 588, + "id": 11, + "name": "mention", + "prevSize": 32, + "code": 59754, + "tempChar": "" + }, + { + "order": 589, + "id": 10, + "name": "monospace", + "prevSize": 32, + "code": 59755, + "tempChar": "" + }, + { + "order": 590, + "id": 9, + "name": "next", + "prevSize": 32, + "code": 59756, + "tempChar": "" + }, + { + "order": 591, + "id": 8, + "name": "password-off", + "prevSize": 32, + "code": 59757, + "tempChar": "" + }, + { + "order": 592, + "id": 7, + "name": "pin-list", + "prevSize": 32, + "code": 59758, + "tempChar": "" + }, + { + "order": 593, + "id": 6, + "name": "previous", + "prevSize": 32, + "code": 59759, + "tempChar": "" + }, + { + "order": 599, + "id": 5, + "name": "replace", + "prevSize": 32, + "code": 59760, + "tempChar": "" + }, + { + "order": 598, + "id": 4, + "name": "schedule", + "prevSize": 32, + "code": 59761, + "tempChar": "" + }, + { + "order": 597, + "id": 3, + "name": "strikethrough", + "prevSize": 32, + "code": 59762, + "tempChar": "" + }, + { + "order": 596, + "id": 2, + "name": "underlined", + "prevSize": 32, + "code": 59763, + "tempChar": "" + }, + { + "order": 595, + "id": 1, + "name": "zoom-in", + "prevSize": 32, + "code": 59764, + "tempChar": "" + }, + { + "order": 594, + "id": 0, + "name": "zoom-out", + "prevSize": 32, + "code": 59765, + "tempChar": "" + } + ], + "id": 2, + "metadata": { + "name": "Untitled Set", + "importSize": { + "width": 24, + "height": 24 + } + }, + "height": 1024, + "prevSize": 32, + "icons": [ + { + "id": 30, + "paths": [ + "M191.121 85.333c-6.545 0-11.852 5.111-11.852 11.417v6.361c0 39.273-36.885 76.535-76.158 76.535h-5.339c-6.87-0.001-12.439 5.364-12.439 11.981s5.568 11.981 12.438 11.981h5.34c39.273 0 76.158 38.007 76.158 77.281v6.362c0 6.305 5.306 11.416 11.852 11.416s11.852-5.111 11.852-11.416v-6.362c0-39.273 38.642-77.281 77.915-77.281h5.34c6.869 0 12.438-5.364 12.438-11.981s-5.569-11.982-12.439-11.981h-5.339c-39.273 0-77.915-37.261-77.915-76.535v-6.362c-0-6.305-5.306-11.416-11.852-11.416zM362.14 256c-3.927 0-7.111 3.067-7.111 6.85v3.817c0 23.564-22.131 45.921-45.695 45.921h-3.204c-4.122 0-7.463 3.218-7.463 7.188s3.341 7.188 7.463 7.188h3.204c23.564 0 45.695 22.805 45.695 46.369v3.816c-0.001 3.783 3.183 6.851 7.111 6.851s7.112-3.067 7.111-6.851v-3.816c0-23.564 23.185-46.369 46.749-46.369h3.204c4.122 0 7.463-3.218 7.463-7.188s-3.342-7.19-7.464-7.188h-3.203c-23.564 0-46.749-22.357-46.749-45.921v-3.816c0.001-3.783-3.183-6.851-7.111-6.851zM697.835 316.481c0 111.321-36.838 206.48-106.014 273.787-69.060 67.191-166.318 102.724-279.986 102.724-41.953 0-80.931-4.723-116.507-14.733 60.171 109.884 171.66 175.074 312.631 175.074 210.005 0 356.041-148.117 356.041-347.661 0-142.455-75.029-267.153-185.007-322.594 11.857 36.643 18.842 85.56 18.842 133.402zM597.218 107.393c26.091-28.846 63.795-24.154 87.966-14.902v-0.001l0.329 0.128c160.085 62.787 263.821 229.777 263.821 413.055 0 247.727-185.297 432.994-441.374 432.994-182.586 0-331.849-92.757-402.928-250.453-11.241-24.491-16.281-62.199 11.455-88.269l0.115-0.107c24.582-22.933 57.515-18.995 77.921-11.789 0.471 0.166 0.939 0.341 1.404 0.525 31.327 12.314 69.653 19.085 115.908 19.085 95.838 0 170.247-29.679 220.479-78.549 50.108-48.759 80.188-120.519 80.188-212.628 0-54.455-10.701-102.557-20.838-122.739l-0.004 0.001-0.218-0.442c-10.974-22.49-17.86-56.255 3.998-83.807 0.572-0.72 1.165-1.421 1.779-2.102z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "darkmode" + ] + }, + { + "id": 29, + "paths": [ + "M384 384c0-141.385 114.615-256 256-256s256 114.615 256 256c0 141.385-114.615 256-256 256s-256-114.615-256-256zM299.639 358.033c-0.645 8.571-0.973 17.231-0.973 25.967 0 78.878 26.755 151.509 71.686 209.306l-272.523 272.525c-16.662 16.661-16.662 43.678 0 60.339s43.677 16.661 60.34 0l272.524-272.521c57.796 44.928 130.428 71.684 209.306 71.684 8.738 0 17.395-0.329 25.967-0.973l-141.47 141.47c-16.661 16.661-16.661 43.678 0 60.339s43.678 16.661 60.339 0l298.667-298.667c4.224-4.224 7.377-9.114 9.459-14.332 54.916-60.578 88.371-140.966 88.371-229.171 0-188.513-152.819-341.333-341.333-341.333-88.205 0-168.593 33.456-229.172 88.37-5.217 2.083-10.107 5.236-14.331 9.46l-298.667 298.667c-16.662 16.661-16.662 43.678 0 60.339s43.677 16.661 60.34 0l141.469-141.469z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "animations" + ] + }, + { + "id": 28, + "paths": [ + "M810.667 128c0-23.564-19.102-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v418.133c0 24.602-0.034 40.482-1.020 52.574-0.947 11.588-2.556 15.885-3.631 17.997-4.092 8.030-10.615 14.554-18.645 18.645-2.112 1.075-6.409 2.684-17.997 3.631-12.092 0.986-27.972 1.020-52.574 1.020h-357.794l140.497-140.497c16.661-16.661 16.661-43.678 0-60.339-16.663-16.663-43.677-16.663-60.34 0l-213.333 213.333c-16.662 16.661-16.662 43.678 0 60.339l213.333 213.333c16.663 16.661 43.677 16.661 60.34 0 16.661-16.661 16.661-43.678 0-60.339l-140.497-140.497h359.441c22.49 0 41.894 0 57.873-1.306 16.87-1.378 33.647-4.42 49.792-12.646 24.085-12.271 43.665-31.851 55.936-55.936 8.226-16.145 11.268-32.922 12.646-49.792 1.306-15.979 1.306-35.383 1.306-57.873v-419.78z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "enter" + ] + }, + { + "id": 27, + "paths": [ + "M482.846 84.703c-16.435 8.41-24.589 23.36-28.343 30.632-4.233 8.203-8.563 18.79-12.979 29.593l-161.013 393.585c-8.922 21.807 1.525 46.72 23.335 55.642 21.809 8.926 46.723-1.523 55.645-23.334l41.518-101.487h221.985l41.519 101.487c8.922 21.811 33.835 32.26 55.642 23.334 21.811-8.922 32.26-33.835 23.334-55.642l-160.405-392.11-0.606-1.476c-4.416-10.803-8.747-21.39-12.979-29.593-3.755-7.272-11.908-22.221-28.343-30.632-18.308-9.369-40-9.369-58.308 0zM512 198.019l76.083 185.981h-152.166l76.083-185.981zM320.033 170.67c23.564-0.018 42.652-19.136 42.633-42.7s-19.136-42.652-42.7-42.633c-31.194 0.024-57.371 0.205-79.14 2.273-22.26 2.115-42.856 6.415-62.307 16.325-32.113 16.363-58.222 42.471-74.584 74.584-10.551 20.707-14.756 42.754-16.716 66.736-1.886 23.091-1.886 51.437-1.885 85.782v607.63c0 17.259 10.395 32.815 26.339 39.42s34.295 2.953 46.498-9.25l130.677-130.675c16.195-16.196 19.569-19.183 22.873-21.205 3.817-2.342 7.98-4.066 12.333-5.111 3.768-0.905 8.266-1.178 31.168-1.178h337.742c34.347 0 62.69 0 85.781-1.886 23.983-1.958 46.029-6.165 66.739-16.717 32.111-16.363 58.219-42.47 74.581-74.581 10.551-20.71 14.758-42.756 16.717-66.739 1.886-23.091 1.886-51.435 1.886-85.781v-233.925c0-34.345 0-62.691-1.886-85.782-1.958-23.983-6.165-46.029-16.717-66.736-16.363-32.113-42.47-58.222-74.581-74.584-19.452-9.911-40.047-14.211-62.31-16.326-21.769-2.068-47.945-2.249-79.138-2.273-23.565-0.018-42.684 19.069-42.701 42.633s19.068 42.682 42.633 42.7c32.060 0.025 54.089 0.271 71.138 1.891 16.555 1.573 25.387 4.223 31.637 7.407 16.055 8.181 29.111 21.235 37.291 37.292 3.401 6.673 6.17 16.239 7.697 34.945 1.57 19.204 1.604 44.048 1.604 80.596v230.4c0 36.548-0.034 61.393-1.604 80.597-1.527 18.705-4.297 28.271-7.697 34.944-8.179 16.055-21.235 29.111-37.291 37.291-6.673 3.401-16.239 6.17-34.944 7.697-19.204 1.57-44.049 1.604-80.597 1.604l-339.534-0.004c-17.361-0.013-32.667-0.030-47.535 3.541-13.061 3.136-25.546 8.307-36.999 15.326v0c-13.036 7.987-23.85 18.82-36.114 31.108l-2.511 2.517-57.841 57.839v-502.861c0-36.547 0.033-61.392 1.602-80.596 1.528-18.706 4.299-28.272 7.699-34.945 8.181-16.056 21.236-29.111 37.292-37.292 6.249-3.184 15.082-5.834 31.638-7.407 17.047-1.62 39.075-1.866 71.136-1.891z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "fontsize" + ] + }, + { + "id": 26, + "paths": [ + "M256 128h597.333c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v85.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-128v384c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217h-512c-70.692 0-128-57.308-128-128v-85.333c0-23.564 19.103-42.667 42.667-42.667h42.667v-384c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217v0zM554.667 725.333h-426.667v42.667c0 23.564 19.103 42.667 42.667 42.667h391.292c-4.725-13.363-7.292-27.729-7.292-42.667v-42.667zM732.617 213.333h-476.617c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v384h384c23.564 0 42.667 19.103 42.667 42.667v85.333c0 22.371 17.3 40.915 37.865 42.461l5.367 0.202c21.639-0.281 39.393-16.671 41.819-37.726l0.283-4.937v-512c0-11.968 1.643-23.553 4.715-34.541l2.569-8.126zM853.333 213.333l-4.976 0.287c-19.587 2.275-35.129 17.816-37.404 37.404l-0.287 4.976v42.667h85.333v-42.667c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "permissions" + ] + }, + { + "id": 25, + "paths": [ + "M853.333 170.667h-682.667c-47.36 0-84.907 37.973-84.907 85.333l-0.427 512c0 47.36 37.973 85.333 85.333 85.333h682.667c47.36 0 85.333-37.973 85.333-85.333v-512c0-47.36-37.973-85.333-85.333-85.333zM853.333 768h-682.667v-256h682.667v256zM853.333 341.333h-682.667v-85.333h682.667v85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "card" + ] + }, + { + "id": 24, + "paths": [ + "M853.333 341.333h-128v-170.667h-597.333c-46.933 0-85.333 38.4-85.333 85.333v469.333h85.333c0 70.827 57.173 128 128 128s128-57.173 128-128h256c0 70.827 57.173 128 128 128s128-57.173 128-128h85.333v-213.333l-128-170.667zM832 405.333l83.627 106.667h-190.293v-106.667h106.667zM256 768c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667zM350.72 640c-23.467-26.027-56.747-42.667-94.72-42.667s-71.253 16.64-94.72 42.667h-33.28v-384h512v384h-289.28zM768 768c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "truck" + ] + }, + { + "id": 23, + "paths": [ + "M524.909 204.599c0-25.135 20.376-45.511 45.511-45.511 11.45 0 22.48 4.316 30.889 12.088l332.624 307.401c18.459 17.060 19.594 45.853 1.952 64.918l-1.952 1.929-332.624 307.401c-18.459 17.060-47.253 15.925-64.313-2.535-7.771-8.409-12.088-19.439-12.088-30.889v-140.746c-171.605 4.143-288.836 58.904-354.051 163.31l-6.23 10.368c-8.55 14.834-27.506 19.928-42.34 11.378-9.467-5.457-15.362-15.495-15.517-26.421-4.404-311.701 132.134-477.967 404.411-490.876l13.727-0.518v-141.297z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "share-filled" + ] + }, + { + "id": 22, + "paths": [ + "M665.6 503.040c41.387-28.587 70.4-75.52 70.4-119.040 0-96.427-74.667-170.667-170.667-170.667h-224c-23.467 0-42.667 19.2-42.667 42.667v512c0 23.467 19.2 42.667 42.667 42.667h246.613c88.32 0 168.96-72.107 169.39-160.853 0.423-65.28-36.27-121.173-91.737-146.773zM426.667 320h128c35.413 0 64 28.587 64 64s-28.587 64-64 64h-128v-128zM576 704h-149.333v-128h149.333c35.413 0 64 28.587 64 64s-28.587 64-64 64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "bold" + ] + }, + { + "id": 21, + "paths": [ + "M789.333 42.667c106.039 0 192 85.961 192 192 0 103.009-81.119 187.072-182.962 191.791l-9.038 0.209h-106.667v170.667h106.667c103.009 0 187.072 81.119 191.791 182.962l0.209 9.038c0 106.039-85.961 192-192 192-103.009 0-187.072-81.119-191.791-182.962l-0.209-9.038v-106.667h-170.667v106.667c0 103.009-81.119 187.072-182.962 191.791l-9.038 0.209c-106.039 0-192-85.961-192-192 0-103.009 81.119-187.072 182.962-191.791l9.038-0.209h106.667v-170.667h-106.667c-103.009 0-187.072-81.119-191.791-182.962l-0.209-9.038c0-106.039 85.961-192 192-192 103.009 0 187.072 81.119 191.791 182.962l0.209 9.038v106.667h170.667v-106.667c0-103.009 81.119-187.072 182.962-191.791l9.038-0.209zM341.333 682.667h-106.667c-58.91 0-106.667 47.756-106.667 106.667s47.756 106.667 106.667 106.667c56.554 0 102.828-44.012 106.44-99.653l0.227-7.013v-106.667zM789.333 682.667h-106.667v106.667c0 58.91 47.756 106.667 106.667 106.667s106.667-47.756 106.667-106.667c0-56.554-44.012-102.828-99.653-106.44l-7.013-0.227zM597.333 426.667h-170.667v170.667h170.667v-170.667zM234.667 128c-58.91 0-106.667 47.756-106.667 106.667 0 56.554 44.012 102.828 99.653 106.44l7.013 0.227h106.667v-106.667c0-54.198-40.421-98.954-92.761-105.768l-6.892-0.671-7.013-0.227zM789.333 128c-56.554 0-102.828 44.012-106.44 99.653l-0.227 7.013v106.667h106.667c54.198 0 98.954-40.421 105.768-92.761l0.671-6.892 0.227-7.013c0-58.91-47.756-106.667-106.667-106.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "bot-command" + ] + }, + { + "id": 20, + "paths": [ + "M682.667 177.92c18.054 0 32.952 13.51 35.137 30.971l0.276 4.442v49.92h7.253c64.217 0 116.725 50.13 120.526 113.391l0.22 7.356v341.333c0 64.217-50.13 116.725-113.391 120.526l-7.356 0.22h-426.667c-64.217 0-116.725-50.13-120.526-113.391l-0.22-7.356v-341.333c0-64.217 50.13-116.725 113.391-120.526l7.356-0.22h7.253v-49.92c0-19.558 15.855-35.413 35.413-35.413 18.054 0 32.952 13.51 35.137 30.971l0.276 4.442v49.92h270.507v-49.92c0-19.558 15.855-35.413 35.413-35.413zM775.253 504.747h-526.507v220.587c0 25.732 19.469 46.917 44.481 49.627l5.439 0.293h426.667c25.732 0 46.917-19.469 49.627-44.481l0.293-5.439v-220.587zM725.333 334.080h-426.667c-25.732 0-46.917 19.469-49.627 44.481l-0.293 5.439v49.92h526.507v-49.92c0-25.732-19.469-46.917-44.481-49.627l-5.439-0.293z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "calendar-filter" + ] + }, + { + "id": 19, + "paths": [ + "M512 42.667c-257.45 0-469.333 192.199-469.333 433.658l0.222 13.894c3.701 115.213 53.485 216.034 140.585 292.181l6.35 5.355-3.088 4.267-7.117 8.461-19.641 21.936c-12.634 14.884-20.342 26.863-24.672 47.726-9.622 46.37 16.329 86.028 54.672 102.076 41.869 17.524 126.555 9.82 181.919-21.16l12.725-7.394c16.319-9.861 30.227-19.822 43.819-30.982l9.533-8.108 16.748 2.207c18.905 2.126 38.024 3.2 57.278 3.2 257.45 0 469.333-192.199 469.333-433.658s-211.884-433.658-469.333-433.658zM512 128c212.077 0 384 155.95 384 348.325s-171.923 348.325-384 348.325c-32.515 0-64.086-3.666-94.238-10.566-3.6-0.824-7.509 1.251-12.621 5.399l-8.683 7.675-11.161 10.167-9.149 7.857-10.748 8.507c-9.678 7.309-21.23 15.103-35.173 22.905-40.955 22.918-97.699 20.93-107.303 16.91-6.559-2.745-4.849-7.422 1.188-14.761l8.41-9.419 7.020-7.642 7.719-8.812c5.297-6.28 10.815-13.385 16.060-21.408 24.913-38.107 14.619-83.474 3.442-91.639-87.4-63.847-138.763-153.782-138.763-263.499 0-192.375 171.923-348.325 384-348.325z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "comments" + ] + }, + { + "id": 18, + "paths": [ + "M512 859.389c235.641 0 426.667-173.278 426.667-387.028s-191.025-387.028-426.667-387.028c-235.641 0-426.667 173.278-426.667 387.028 0 121.908 57.070 221.835 154.181 292.776 12.419 9.072 23.857 59.48-3.824 101.821-5.273 8.065-10.793 15.296-16.156 21.768l-7.876 9.148-16.661 18.26c-8.926 10.115-12.435 16.309-4.193 19.759 10.67 4.466 73.719 6.675 119.225-18.789 16.975-9.499 30.759-18.986 42.111-27.765l10.569-8.517 9.116-7.89 17.538-15.962 5.356-4.473c4.981-3.836 8.918-5.685 12.571-4.849 33.502 7.667 68.581 11.74 104.709 11.74z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "comments-sticker" + ] + }, + { + "id": 17, + "paths": [ + "M542.17 840.837l298.667-298.667c16.662-16.662 16.662-43.677 0-60.34-15.381-15.381-39.583-16.564-56.32-3.549l-4.020 3.549-225.83 225.839v-494.336c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v494.336l-225.83-225.839c-15.381-15.381-39.583-16.564-56.32-3.549l-4.020 3.549c-15.381 15.381-16.564 39.583-3.549 56.32l3.549 4.020 298.667 298.667c15.381 15.381 39.583 16.564 56.32 3.549l4.020-3.549z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "arrow-down" + ] + }, + { + "id": 14, + "paths": [ + "M810.667 170.667c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v426.667c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217h-597.333c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-426.667c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217h597.333zM853.333 335.701l-270.332 180.243c-40.466 26.977-92.463 28.564-134.286 4.761l-7.717-4.761-270.332-180.201v389.589c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h597.333c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-389.632zM810.667 256h-597.333c-2.517 0-4.984 0.218-7.381 0.636l282.381 188.307c12.739 8.493 28.907 9.437 42.408 2.831l4.926-2.831 282.381-188.307-3.646-0.475-3.736-0.161z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "email" + ] + }, + { + "id": 13, + "paths": [ + "M725.333 213.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-56.917l-177.749 426.667h64c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-213.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h56.832l177.792-426.667h-63.957c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h213.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "italic" + ] + }, + { + "id": 12, + "paths": [ + "M286.17 439.163c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-64 64c-65.812 65.812-65.812 172.515 0 238.327 63.618 63.618 165.447 65.739 231.612 6.362l6.714-6.362 64-64c16.662-16.662 43.677-16.662 60.34 0 15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-64 64c-99.137 99.137-259.87 99.137-359.006 0-96.528-96.528-99.068-251.453-7.621-351.054l7.621-7.952 64-64c16.662-16.662 43.677-16.662 60.34 0zM584.837 439.163c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-170.667 170.667c-16.662 16.662-43.677 16.662-60.34 0-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 170.667-170.667c16.662-16.662 43.677-16.662 60.34 0zM864.314 159.686c96.528 96.528 99.068 251.453 7.621 351.054l-7.621 7.952-64 64c-16.662 16.662-43.677 16.662-60.34 0-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 64-64c65.812-65.812 65.812-172.515 0-238.327-63.618-63.618-165.447-65.739-231.612-6.362l-6.714 6.362-64 64c-16.662 16.662-43.677 16.662-60.34 0-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 64-64c99.137-99.137 259.87-99.137 359.006 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "link" + ] + }, + { + "id": 11, + "paths": [ + "M786.786 131.476l5.833 4.288 17.216 13.495 12.792 10.903 12.938 11.866 12.569 12.423 7.779 8.175 7.898 8.716 13.032 15.399 12.684 16.376 5.348 7.376 9.423 13.776 4.044 6.25 9.484 15.576 11.599 21.143 4.346 8.648 9.217 20.007 3.246 7.694 4.298 10.833 3.896 10.572 5.812 17.464c3.118 10.025 5.91 20.199 8.362 30.506 2.206 9.273 4.136 18.649 5.783 28.122l3.059 20.209 0.957 7.942 1.313 13.488 0.947 13.919 0.515 13.054 0.158 12.305v106.667c0 82.475-66.859 149.333-149.333 149.333-57.935 0-108.164-32.991-132.925-81.211-46.732 49.966-113.254 81.211-187.075 81.211-141.385 0-256-114.615-256-256s114.615-256 256-256c67.294 0 128.523 25.965 174.216 68.423 6.507-15.171 21.576-25.756 39.117-25.756 21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v277.333c0 35.346 28.654 64 64 64 33.267 0 60.606-25.382 63.707-57.836l0.293-6.164v-106.667c0-208.29-165.837-377.847-372.678-383.836l-11.322-0.164c-212.077 0-384 171.923-384 384l0.367 16.932 0.676 11.615c0.702 9.565 1.756 19.067 3.159 28.495l1.042 6.565c30.307 181.807 188.347 320.394 378.756 320.394 59.019 0 116.058-13.296 167.896-38.542 21.185-10.318 46.723-1.508 57.041 19.678s1.508 46.723-19.678 57.041c-63.415 30.884-133.222 47.156-205.259 47.156-235.169 0-429.94-172.964-464.041-398.618l-2.185-16.451-0.849-7.94-0.744-8.383-1.216-21.092c-0.198-5.594-0.297-11.21-0.297-16.849 0-259.206 210.128-469.333 469.333-469.333 5.173 0 10.327 0.084 15.46 0.25l10.732 0.469 15.574 1.114 15.426 1.617 6.288 0.807c5.805 0.785 11.574 1.676 17.308 2.67 10.577 1.836 21.025 4.023 31.335 6.55l22.311 6.060 15.67 4.98 19.036 6.886 10.029 4.010 18.109 7.939 8.408 4.002 20.291 10.531 6.557 3.678 8.248 4.826 15.024 9.387 18.98 13.035zM512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "mention" + ] + }, + { + "id": 10, + "paths": [ + "M695.163 183.163c25.71-25.71 68.876-9.411 72.581 25.322l0.255 4.848v597.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-494.336l-140.497 140.506c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-140.497-140.463v494.293c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-597.333c0-36.359 42.049-55.357 69.228-33.418l3.609 3.248 183.163 183.13 183.163-183.13z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "monospace" + ] + }, + { + "id": 9, + "paths": [ + "M670.17 481.83c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-256 256c-16.662 16.662-43.677 16.662-60.34 0-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 225.797-225.83-225.797-225.83c-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 256 256z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "next" + ] + }, + { + "id": 8, + "paths": [ + "M111.484 179.614l4.020 3.549 768 768c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-115.537-115.503h-408.96c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-341.333c0-19.421 4.363-38.192 12.466-55.15l-127.969-128.013c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549zM622.293 810.667l-366.293-366.293v323.627c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h323.627zM512 0c114.72 0 208.291 90.552 213.136 204.079l0.197 9.254v85.333c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v298.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-298.667c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287h-298.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h213.333v-85.333c0-70.692-57.308-128-128-128-68.168 0-123.89 53.287-127.783 120.479l-0.217 7.521v42.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-42.667c0-117.821 95.513-213.333 213.333-213.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "password-off" + ] + }, + { + "id": 7, + "paths": [ + "M533.333 725.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-405.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h405.333zM848.13 128c43.491 0 78.067 31.095 78.067 74.233 0 19.167-7.359 37.945-20.644 55.001-12.26 15.19-32.493 32.357-57.388 49.137l-9.548 6.27-7.001 4.33 4.992 69.077 2.627 1.271c67.092 33.095 112.493 89.245 119.745 151.369l0.775 8.914 0.245 8.592c0 46.558-33.719 80.594-79.672 83.592l-6.646 0.215h-127.015v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-128h-127.015c-47.070 0-82.928-31.92-86.091-77.243l-0.227-6.564c0-66.149 43.61-127.427 111.952-164.24l9.053-4.661 2.558-1.202 4.821-69.12-6.867-4.272c-22.203-14.241-41.315-29.021-55.287-42.846l-6.548-6.826-4.982-5.809c-13.31-16.508-20.897-35.528-20.897-54.984 0-41.041 31.475-71.1 71.882-74.003l6.451-0.23h287.993zM341.333 512c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-213.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h213.333zM829.696 213.333h-251.093l1.389 1.296c10.52 9.293 25.835 20.401 43.818 31.371l9.204 5.465 8.372 4.72c12.956 7.126 21.18 20.367 22.032 34.875l-0.031 5.491-8.517 121.609c-1.178 16.824-12.156 31.375-28.010 37.127-55.313 20.069-89.761 58.352-93.234 94.844l-0.248 4.664 0.942-0.128 340.263 0.128-0.205-4.661c-3.072-32.298-30.402-66.034-74.894-87.275l-9.125-4.077-8.995-3.511c-14.044-5.113-24.254-17.135-27.2-31.521l-0.758-5.497-8.784-121.609c-1.201-16.625 7.389-32.426 21.994-40.459 22.461-12.354 42.276-25.667 56.003-36.774l5.5-4.616 1.577-1.461zM426.667 298.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-298.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h298.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "pin-list" + ] + }, + { + "id": 6, + "paths": [ + "M353.83 481.83c-15.381 15.381-16.564 39.583-3.549 56.32l3.549 4.020 256 256c16.662 16.662 43.677 16.662 60.34 0 15.381-15.381 16.564-39.583 3.549-56.32l-3.549-4.020-225.797-225.83 225.797-225.83c15.381-15.381 16.564-39.583 3.549-56.32l-3.549-4.020c-15.381-15.381-39.583-16.564-56.32-3.549l-4.020 3.549-256 256z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "previous" + ] + }, + { + "id": 5, + "paths": [ + "M853.333 512c44.986 0 81.842 34.811 85.099 78.965l0.234 6.369v256c0 44.986-34.811 81.842-78.965 85.099l-6.369 0.234h-256c-44.986 0-81.842-34.811-85.099-78.965l-0.234-6.369v-256c0-44.986 34.811-81.842 78.965-85.099l6.369-0.234h256zM218.15 584.947l4.020 3.549 106.667 106.667c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-33.83-33.797v88.96c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h106.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-106.667c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-89.003l-33.83 33.839c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549c-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 106.667-106.667c15.381-15.381 39.583-16.564 56.32-3.549zM853.333 597.333h-256v256h256v-256zM426.667 85.333c44.986 0 81.842 34.811 85.099 78.965l0.234 6.369v256c0 44.986-34.811 81.842-78.965 85.099l-6.369 0.234h-256c-44.986 0-81.842-34.811-85.099-78.965l-0.234-6.369v-256c0-44.986 34.811-81.842 78.965-85.099l6.369-0.234h256zM746.667 85.333c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v88.917l33.83-33.754c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-106.667 106.667c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-106.667-106.667c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 33.83 33.797v-88.96c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287h-106.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h106.667zM426.667 170.667h-256v256h256v-256z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "replace" + ] + }, + { + "id": 4, + "paths": [ + "M352 42.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v186.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976 0.021-86.281c-110.862 68.902-181.354 191.098-181.354 326.281 0 212.077 171.923 384 384 384s384-171.923 384-384c0-212.077-171.923-384-384-384-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333 0-155.942 76.766-297.754 199.32-383.986l-76.654-0.014c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h186.667zM512 202.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v248.96l147.503 147.537c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-160-160c-6.668-6.668-10.901-15.316-12.127-24.562l-0.37-5.608v-266.667c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "schedule" + ] + }, + { + "id": 3, + "paths": [ + "M213.333 554.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287 117.686 0.032c-18.867-28.174-30.474-61.619-32.144-97.66l-0.209-9.038v-21.333c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209h85.333c94.257 0 170.667 76.41 170.667 170.667 0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-44.986-34.811-81.842-78.965-85.099l-6.369-0.234h-85.333c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v21.333c0 56.554 44.012 102.828 99.653 106.44l7.013 0.227h320c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287-117.658 0.011c18.85 28.165 30.446 61.595 32.116 97.618l0.209 9.038v21.333c0 91.4-71.849 166.019-162.149 170.458l-8.518 0.209h-85.333c-94.257 0-170.667-76.41-170.667-170.667 0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 44.986 34.811 81.842 78.965 85.099l6.369 0.234h85.333c44.986 0 81.842-34.811 85.099-78.965l0.234-6.369v-21.333c0-56.554-44.012-102.828-99.653-106.44l-7.013-0.227h-320z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "strikethrough" + ] + }, + { + "id": 2, + "paths": [ + "M768 768c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-512c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h512zM682.667 170.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v256c0 117.821-95.513 213.333-213.333 213.333-114.72 0-208.291-90.552-213.136-204.079l-0.197-9.254v-256c0-23.564 19.103-42.667 42.667-42.667 21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v256c0 70.692 57.308 128 128 128 68.168 0 123.89-53.287 127.783-120.479l0.217-7.521v-256c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "underlined" + ] + }, + { + "id": 1, + "paths": [ + "M426.667 128c164.949 0 298.667 133.718 298.667 298.667 0 67.259-22.232 129.325-59.749 179.25l0.566 0.364 4.020 3.549 213.333 213.333c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-213.333-213.333c-1.459-1.459-2.791-2.998-3.995-4.602-49.844 37.534-111.91 59.766-179.169 59.766-164.949 0-298.667-133.718-298.667-298.667s133.718-298.667 298.667-298.667zM426.667 213.333c-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.821 0 213.333-95.513 213.333-213.333s-95.513-213.333-213.333-213.333zM426.667 298.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v42.667h42.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-42.667v42.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-42.667h-42.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h42.667v-42.667c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "zoom-in" + ] + }, + { + "id": 0, + "paths": [ + "M426.667 128c164.949 0 298.667 133.718 298.667 298.667 0 67.259-22.232 129.325-59.749 179.25l0.566 0.364 4.020 3.549 213.333 213.333c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-213.333-213.333c-1.459-1.459-2.791-2.998-3.995-4.602-49.844 37.534-111.91 59.766-179.169 59.766-164.949 0-298.667-133.718-298.667-298.667s133.718-298.667 298.667-298.667zM426.667 213.333c-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.821 0 213.333-95.513 213.333-213.333s-95.513-213.333-213.333-213.333zM512 384c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-170.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h170.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "zoom-out" + ] + } + ], + "colorThemes": [], + "invisible": false + }, + { + "icons": [ + { + "id": 97, + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM734.17 353.83c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-256 256c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-106.667-106.667c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 76.497 76.463 225.83-225.797c16.662-16.662 43.677-16.662 60.34 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "select" + ] + }, + { + "paths": [ + "M400.157 85.333c25.461 0 49.983 9.103 69.216 25.506l6.209 5.736 90.51 90.51c3.201 3.201 7.314 5.279 11.728 5.983l3.357 0.266h229.49c91.4 0 166.019 71.849 170.458 162.149l0.209 8.518v384c0 91.4-71.849 166.019-162.149 170.458l-8.518 0.209h-597.333c-91.4 0-166.019-71.849-170.458-162.149l-0.209-8.518v-512c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209h186.824zM400.157 170.667h-186.824c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v512c0 44.986 34.811 81.842 78.965 85.099l6.369 0.234h597.333c44.986 0 81.842-34.811 85.099-78.965l0.234-6.369v-384c0-44.986-34.811-81.842-78.965-85.099l-6.369-0.234h-229.49c-25.461 0-49.983-9.103-69.216-25.506l-6.209-5.736-90.51-90.51c-3.201-3.201-7.314-5.279-11.728-5.983l-3.357-0.266zM810.667 426.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-597.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h597.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "folder" + ], + "id": 1 + }, + { + "paths": [ + "M512 42.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v42.667h21.333c138.172 0 250.776 109.465 255.823 246.403l0.177 9.597v85.333h21.333l7.521 0.217c64.703 3.749 116.513 55.559 120.262 120.262l0.217 7.521v128l-0.287 4.976c-2.465 21.22-20.499 37.691-42.38 37.691s-39.915-16.471-42.38-37.691l-0.287-4.976v-128l-0.287-4.976c-2.275-19.587-17.816-35.129-37.404-37.404l-4.976-0.287h-21.333v213.333c0 91.4-71.849 166.019-162.149 170.458l-8.518 0.209h-298.667c-91.4 0-166.019-71.849-170.458-162.149l-0.209-8.518v-213.333h-21.333c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-128c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217h21.333v-85.333c0-138.172 109.465-250.776 246.403-255.823l9.597-0.177h21.333v-42.667c0-23.564 19.103-42.667 42.667-42.667zM711.521 554.449l-7.521 0.217h-384c-14.959 0-29.319-2.566-42.667-7.282v220.615c0 44.986 34.811 81.842 78.965 85.099l6.369 0.234h298.667c44.986 0 81.842-34.811 85.099-78.965l0.234-6.369 0.038-220.63c-11.104 3.929-22.912 6.369-35.184 7.080zM576 213.333h-128c-91.4 0-166.019 71.849-170.458 162.149l-0.209 8.518v42.667c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h384c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-42.667c0-91.4-71.849-166.019-162.149-170.458l-8.518-0.209zM405.333 320c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM618.667 320c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "bots" + ], + "id": 2 + }, + { + "paths": [ + "M725.333 42.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v42.667h42.667c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v512c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217h-597.333c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-512c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217h42.667v-42.667c0-23.564 19.103-42.667 42.667-42.667 21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v42.667h341.333v-42.667c0-23.564 19.103-42.667 42.667-42.667zM853.333 469.333h-682.667v298.667c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h597.333c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-298.667zM810.667 213.333h-597.333c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v128h682.667v-128c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "calendar" + ], + "id": 3 + }, + { + "paths": [ + "M512 170.667c160.012 0 289.808 130.736 300.137 295.265l0.151 3.402h28.245c99.052 0 178.66 81.343 183.257 182.73l0.21 9.27c0 102.545-76.695 186.904-174.517 191.778l-8.95 0.222h-115.2c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h115.2c53.766 0 98.133-47.057 98.133-106.667 0-57.126-40.747-102.723-91.464-106.424l-6.669-0.243h-70.4c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-24.889c0-128.303-96.933-231.111-215.467-231.111-96.368 0-180.408 68.536-207.079 167.543-4.561 16.933-18.935 29.168-36.004 31.253l-5.194 0.315h-33.323c-79.579 0-145.067 69.457-145.067 156.444 0 84.088 61.195 151.795 137.158 156.215l7.909 0.23h68.267c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-68.267c-127.866 0-230.4-108.748-230.4-241.778 0-129.863 97.709-236.586 221.311-241.594l11.436-0.212 0.198-0.493c43.791-114.561 147.684-193.819 268.067-198.382l10.988-0.208zM512 426.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v238.251l55.163-55.087c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-128 128c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-128-128c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 55.163 55.087v-238.251c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "cloud-download" + ], + "id": 4 + }, + { + "paths": [ + "M822.912 123.015l5.428 4.985 67.66 67.66c31.571 31.571 33.232 81.725 4.985 115.252l-4.985 5.428-153.003 152.96 33.839 33.864c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-33.83-33.83-353.83 353.83c-6.668 6.668-15.316 10.901-24.562 12.127l-5.608 0.37h-128c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-128c0-9.43 3.122-18.538 8.793-25.943l3.704-4.227 353.797-353.864-33.797-33.797c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 33.83 33.806 152.994-152.969c31.571-31.571 81.725-33.232 115.252-4.985zM554.667 401.707l-341.333 341.291v67.627h67.627l341.333-341.291-67.627-67.627zM768 188.34l-153.003 152.96 67.669 67.669 152.994-152.969-67.66-67.66z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "colorize" + ], + "id": 5 + }, + { + "paths": [ + "M503.575 204.599c0-36.917 29.927-66.844 66.844-66.844 16.818 0 33.017 6.339 45.368 17.754l332.624 307.401c27.112 25.056 28.779 67.347 2.558 95.67l-2.558 2.511-332.624 307.401c-27.112 25.056-69.403 23.389-94.459-3.723-11.414-12.351-17.754-28.551-17.754-45.368v-118.601c-152.889 7.862-256.331 59.141-314.429 152.148l-6.036 10.039c-14.433 25.042-46.434 33.641-71.476 19.208-15.982-9.212-25.934-26.157-26.195-44.602-4.452-315.096 133.606-490.424 404.481-511.228l13.654-0.911v-120.852zM588.909 246.862v120.072c0 23.564-19.103 42.667-42.667 42.667-226.569 0-347.682 104.819-371.281 326.55 85.156-81.425 209.864-121.75 371.281-121.75 23.564 0 42.667 19.103 42.667 42.667v120.076l286.917-265.121-286.917-265.16z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "forward" + ], + "defaultCode": 59687, + "grid": 24, + "id": 6 + }, + { + "paths": [ + "M551.482 204.599c0-36.917-29.927-66.844-66.844-66.844-16.818 0-33.017 6.339-45.368 17.754l-332.624 307.401c-27.112 25.056-28.779 67.347-2.558 95.67l2.558 2.511 332.624 307.401c27.112 25.056 69.403 23.389 94.459-3.723 11.414-12.351 17.754-28.551 17.754-45.368v-118.601c152.889 7.862 256.331 59.141 314.429 152.148l6.036 10.039c14.433 25.042 46.434 33.641 71.476 19.208 15.982-9.212 25.934-26.157 26.195-44.602 4.452-315.096-133.606-490.424-404.481-511.228l-13.654-0.911v-120.852zM466.149 246.862v120.072c0 23.564 19.103 42.667 42.667 42.667 226.569 0 347.682 104.819 371.281 326.55-85.156-81.425-209.864-121.75-371.281-121.75-23.564 0-42.667 19.103-42.667 42.667v120.076l-286.917-265.121 286.917-265.16z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "reply" + ], + "grid": 24, + "id": 7 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM511.057 652.551c28.778 0 52.079 22.114 52.079 50.308 0 27.759-23.751 50.308-52.079 50.308-28.173 0-52.079-22.847-52.079-50.308 0-27.898 23.457-50.308 52.079-50.308zM526.109 294.4c83.153 0 144.605 45.594 144.605 117.6 0 43.294-18.407 70.681-60.741 100.706l-21.333 14.543c-26.658 18.686-36.572 32.531-36.572 52.538v5.312c0 20.909-16.095 35.699-40.126 35.699-25.25 0-39.241-13.729-39.241-39.241v-5.755c0-40.023 17.424-64.886 57.174-92.491l14.635-10.26c31.961-23.045 41.082-35.548 41.082-57.51 0-31.584-24.537-52.4-62.582-52.4-26.89 0-47.284 12.59-62.294 37.483l-11.534 14.591-3.619 4.191c-8.432 9.021-17.048 12.797-31.459 12.797-18.567 0-34.371-14.423-34.371-34.814 0-7.527 1.224-14.868 3.727-23.378 14.121-46.397 69.829-79.613 142.65-79.613z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "help" + ], + "defaultCode": 59690, + "grid": 24, + "id": 8 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM512 469.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v213.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-213.333c0-23.564 19.103-42.667 42.667-42.667zM512 277.333c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "info" + ], + "defaultCode": 59691, + "grid": 24, + "id": 9 + }, + { + "paths": [ + "M512 0c282.77 0 512 229.23 512 512s-229.23 512-512 512c-282.77 0-512-229.23-512-512s229.23-512 512-512zM512 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 298.667l0.287 4.976c2.465 21.22 20.499 37.691 42.38 37.691 23.564 0 42.667-19.103 42.667-42.667v0-298.667l-0.287-4.976c-2.465-21.22-20.499-37.691-42.38-37.691zM512 234.667c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64s-28.654-64-64-64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "info-filled" + ], + "id": 10 + }, + { + "paths": [ + "M768 277.333c23.564 0 42.667 19.103 42.667 42.667v448c0 70.692-57.308 128-128 128h-341.333c-70.692 0-128-57.308-128-128v-448c0-23.564 19.103-42.667 42.667-42.667h512zM426.667 85.333h170.667c9.43 0 18.538 3.122 25.943 8.793l4.227 3.704 30.203 30.17h152.96c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-597.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h152.917l30.246-30.17c6.668-6.668 15.316-10.901 24.562-12.127l5.608-0.37z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "delete-filled" + ], + "defaultCode": 59676, + "grid": 24, + "id": 11 + }, + { + "paths": [ + "M768 277.333c23.564 0 42.667 19.103 42.667 42.667v448c0 70.692-57.308 128-128 128h-341.333c-70.692 0-128-57.308-128-128v-448c0-23.564 19.103-42.667 42.667-42.667h512zM725.333 362.667h-426.667v405.333c0 23.564 19.103 42.667 42.667 42.667h341.333c23.564 0 42.667-19.103 42.667-42.667v-405.333zM426.667 85.333h170.667c9.43 0 18.538 3.122 25.943 8.793l4.227 3.704 30.203 30.17h152.96c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-597.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h152.917l30.246-30.17c6.668-6.668 15.316-10.901 24.562-12.127l5.608-0.37z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "delete" + ], + "defaultCode": 59677, + "grid": 24, + "id": 12 + }, + { + "paths": [ + "M328.837 883.503c-8.002 8.002-18.854 12.497-30.17 12.497h-128c-23.564 0-42.667-19.103-42.667-42.667v-128c0-11.316 4.495-22.168 12.497-30.17l567.163-567.163c31.571-31.571 81.725-33.232 115.252-4.985l5.428 4.985 67.66 67.66c31.571 31.571 33.232 81.725 4.985 115.252l-4.985 5.428-567.163 567.163zM213.333 743.006v67.66h67.66l426.667-426.667-67.66-67.66-426.667 426.667zM768 188.34l-67.669 67.627 67.669 67.669 67.66-67.636-67.66-67.66z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "edit" + ], + "defaultCode": 59683, + "grid": 24, + "id": 13 + }, + { + "paths": [ + "M128 744.96v129.707c0 11.947 9.387 21.333 21.333 21.333h129.707c5.547 0 11.093-2.133 14.933-6.4l450.828-450.415c7.415-7.396 8.244-18.89 2.488-27.207l-2.481-2.956-129.83-129.83c-8.331-8.331-21.839-8.331-30.17 0l-450.408 450.408c-4.267 4.267-6.4 9.387-6.4 15.36zM883.627 300.373c16.64-16.64 16.64-43.52 0-60.16l-99.84-99.84c-16.64-16.64-43.52-16.64-60.16 0l-62.995 62.995c-8.331 8.331-8.331 21.839 0 30.17l129.83 129.83c8.331 8.331 21.839 8.331 30.17 0l62.995-62.995z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "new-chat-filled" + ], + "defaultCode": 59705, + "grid": 24, + "id": 14 + }, + { + "paths": [ + "M113.23 124.846l63.657 292.376c5.172 23.754 25.163 41.402 49.374 43.587l464.783 41.96c5.102 0.461 8.864 4.97 8.404 10.072-0.403 4.464-3.94 8.001-8.403 8.404l-464.785 41.977c-24.211 2.187-44.2 19.834-49.372 43.587l-63.656 292.355c-4.359 20.021 8.337 39.786 28.359 44.145 8.011 1.744 16.375 0.786 23.784-2.726l833.499-395.052c18.516-8.776 26.412-30.901 17.636-49.417-3.667-7.738-9.898-13.969-17.636-17.636l-833.5-395.052c-18.516-8.776-40.641-0.88-49.417 17.636-3.512 7.409-4.47 15.772-2.726 23.783z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "send" + ], + "defaultCode": 59722, + "grid": 24, + "id": 15 + }, + { + "paths": [ + "M274.688 512.012l-12.894-1.988c-37.889-5.841-68.281-34.389-76.478-71.839l-58.050-265.218c-3.614-16.51-1.625-33.753 5.651-49.007 18.084-37.914 63.479-53.988 101.393-35.904l744.874 355.295c15.727 7.502 28.402 20.176 35.904 35.903 18.085 37.913 2.010 83.309-35.903 101.393l-744.873 355.303c-15.254 7.276-32.498 9.265-49.008 5.651-41.034-8.982-67.018-49.528-58.036-90.562l58.049-265.201c8.197-37.447 38.584-65.993 76.469-71.837l12.902-1.99zM214.679 173.237l53.997 246.704c0.656 2.996 3.087 5.28 6.118 5.747l232.866 35.896c27.846 4.292 46.939 30.345 42.647 58.191-3.39 21.995-20.648 39.254-42.643 42.646l-232.87 35.918c-3.031 0.467-5.462 2.751-6.118 5.747l-53.998 246.686 710.217-338.771-710.217-338.764z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "send-outline" + ], + "defaultCode": 59723, + "grid": 24, + "id": 16 + }, + { + "paths": [ + "M384 554.667c141.778 0 245.462 35.572 308.155 109.651 21.423 25.314 33.178 57.402 33.178 90.564v55.786c0 47.128-38.205 85.333-85.333 85.333h-512c-47.128 0-85.333-38.205-85.333-85.333v-55.786c0-33.162 11.756-65.25 33.179-90.564 62.693-74.079 166.377-109.65 308.155-109.65zM805.691 298.954l4.976-0.287c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v85.333h85.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333v85.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-85.333h-85.333c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h85.333v-85.333c0-21.881 16.471-39.915 37.691-42.38v0zM384 128c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "add-user-filled" + ], + "grid": 24, + "id": 17 + }, + { + "paths": [ + "M384 554.667c141.778 0 245.462 35.572 308.155 109.651 21.423 25.314 33.178 57.402 33.178 90.564v34.452c0 58.91-47.756 106.667-106.667 106.667h-469.333c-58.91 0-106.667-47.756-106.667-106.667v-34.452c0-33.162 11.756-65.25 33.179-90.564 62.693-74.079 166.377-109.65 308.155-109.65zM384 640c-118.985 0-199.024 27.459-243.017 79.443-8.383 9.905-12.983 22.462-12.983 35.438v34.452c0 11.782 9.551 21.333 21.333 21.333h469.333c11.782 0 21.333-9.551 21.333-21.333v-34.452c0-12.976-4.6-25.533-12.983-35.438-43.993-51.984-124.033-79.443-243.017-79.443zM805.691 298.954l4.976-0.287c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v85.333h85.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333v85.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-85.333h-85.333c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h85.333v-85.333c0-21.881 16.471-39.915 37.691-42.38v0zM384 128c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM384 213.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "add-user" + ], + "grid": 24, + "id": 18 + }, + { + "paths": [ + "M384 554.667c141.778 0 245.462 35.572 308.155 109.651 21.423 25.314 33.178 57.402 33.178 90.564v34.452c0 58.91-47.756 106.667-106.667 106.667h-469.333c-58.91 0-106.667-47.756-106.667-106.667v-34.452c0-33.162 11.756-65.25 33.179-90.564 62.693-74.079 166.377-109.65 308.155-109.65zM384 640c-118.985 0-199.024 27.459-243.017 79.443-8.383 9.905-12.983 22.462-12.983 35.438v34.452c0 11.782 9.551 21.333 21.333 21.333h469.333c11.782 0 21.333-9.551 21.333-21.333v-34.452c0-12.976-4.6-25.533-12.983-35.438-43.993-51.984-124.033-79.443-243.017-79.443zM682.667 426.667h256c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-256c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287zM384 128c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM384 213.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "delete-user" + ], + "grid": 24, + "id": 19 + }, + { + "paths": [ + "M810.667 426.667c23.564 0 42.667 19.103 42.667 42.667 0 174.050-130.27 317.673-298.626 338.687l-0.041 130.646c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976 0.002-130.641c-168.377-20.995-298.669-164.628-298.669-338.693 0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 141.385 114.615 256 256 256s256-114.615 256-256c0-23.564 19.103-42.667 42.667-42.667zM512 85.333c94.257 0 170.667 76.41 170.667 170.667v213.333c0 94.257-76.41 170.667-170.667 170.667s-170.667-76.41-170.667-170.667v-213.333c0-94.257 76.41-170.667 170.667-170.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "microphone" + ], + "defaultCode": 59701, + "grid": 24, + "id": 20 + }, + { + "paths": [ + "M810.667 426.667c23.564 0 42.667 19.103 42.667 42.667 0 174.050-130.27 317.673-298.626 338.687l-0.041 130.646c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976 0.002-130.641c-168.377-20.995-298.669-164.628-298.669-338.693 0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 141.385 114.615 256 256 256s256-114.615 256-256c0-23.564 19.103-42.667 42.667-42.667zM512 85.333c94.257 0 170.667 76.41 170.667 170.667v213.333c0 94.257-76.41 170.667-170.667 170.667s-170.667-76.41-170.667-170.667v-213.333c0-94.257 76.41-170.667 170.667-170.667zM512 170.667c-47.128 0-85.333 38.205-85.333 85.333v213.333c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v-213.333c0-47.128-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "microphone-alt" + ], + "grid": 24, + "id": 21 + }, + { + "paths": [ + "M810.667 85.333c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v597.333c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217h-597.333c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-597.333c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217h597.333zM810.667 170.667h-597.333c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v597.333c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h597.333c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-597.333c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287zM512 256c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v426.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-426.667c0-23.564 19.103-42.667 42.667-42.667zM682.667 512c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v170.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-170.667c0-23.564 19.103-42.667 42.667-42.667zM341.333 384c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v298.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-298.667c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "poll" + ], + "grid": 24, + "id": 22 + }, + { + "paths": [ + "M328.837 268.497c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-128-128c-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020 128-128c16.662-16.662 43.677-16.662 60.34 0 15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-55.13 55.163h494.293c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v512c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217h-512c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-298.667c0-23.564 19.103-42.667 42.667-42.667 21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v298.667c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h512c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-512c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287h-494.293l55.13 55.163zM734.17 353.83c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-256 256c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-106.667-106.667c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 76.497 76.463 225.83-225.797c16.662-16.662 43.677-16.662 60.34 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "revote" + ], + "grid": 24, + "id": 23 + }, + { + "paths": [ + "M810.667 85.333c70.692 0 128 57.308 128 128v597.333c0 70.692-57.308 128-128 128h-597.333c-70.692 0-128-57.308-128-128v-597.333c0-70.692 57.308-128 128-128h597.333zM382.252 617.188l-2.649-1.925c-8.919-5.489-20.293-3.626-27.047 3.903l-2.302 3.086-142.026 230.78 2.533 0.226 320.269 0.076-144.516-231.209c-1.162-1.86-2.601-3.523-4.261-4.937v0zM668.078 520.22c-8.979-5.391-20.331-3.404-27.003 4.199l-2.269 3.111-103.298 172.033 96.085 153.771h179.072c23.085 0 41.888-18.334 42.643-41.236l-178.122-284.894c-1.785-2.857-4.222-5.25-7.11-6.984zM810.667 170.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667v537.856l106.911-173.66c29.588-48.082 91.16-64.453 140.398-38.56l6.349 3.618c11.674 7.184 21.831 16.536 29.937 27.525l4.613 6.786 25.86 41.427 80.91-134.719c29.059-48.403 90.449-65.447 139.967-40.095l6.388 3.548c12.034 7.225 22.499 16.738 30.819 27.974l4.73 6.944 105.783 169.287v-437.931c0-23.564-19.103-42.667-42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "photo" + ], + "defaultCode": 59712, + "grid": 24, + "id": 24 + }, + { + "paths": [ + "M519.32 85.333c33.948 0 66.505 13.486 90.51 37.49l291.346 291.346c24.005 24.005 37.49 56.562 37.49 90.51v305.987c0 70.692-57.308 128-128 128h-597.333c-70.692 0-128-57.308-128-128v-597.333c0-70.692 57.308-128 128-128h305.987zM469.333 170.667h-256c-23.564 0-42.667 19.103-42.667 42.667v597.333c0 23.564 19.103 42.667 42.667 42.667h597.333c23.564 0 42.667-19.103 42.667-42.667v-256h-256c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-256zM835.669 469.333l-281.003-281.003v238.336c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h238.336z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "document" + ], + "defaultCode": 59679, + "grid": 24, + "id": 25 + }, + { + "paths": [ + "M622.327 85.333c22.632 0 44.337 8.99 60.34 24.994l60.34 60.34h67.66c70.692 0 128 57.308 128 128v469.333c0 70.692-57.308 128-128 128h-597.333c-70.692 0-128-57.308-128-128v-469.333c0-70.692 57.308-128 128-128h67.66l60.34-60.34c16.003-16.003 37.708-24.994 60.34-24.994h220.654zM622.327 170.667h-220.654l-60.34 60.34c-16.003 16.003-37.708 24.994-60.34 24.994h-67.66c-23.564 0-42.667 19.103-42.667 42.667v469.333c0 23.564 19.103 42.667 42.667 42.667h597.333c23.564 0 42.667-19.103 42.667-42.667v-469.333c0-23.564-19.103-42.667-42.667-42.667h-67.66c-22.632 0-44.337-8.99-60.34-24.994l-60.34-60.34zM512 298.667c117.821 0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333zM512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128s-57.308-128-128-128z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "camera" + ], + "defaultCode": 59662, + "grid": 24, + "id": 26 + }, + { + "paths": [ + "M848.357 682.954l4.976-0.287c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v85.333h85.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333v85.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-85.333h-85.333c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h85.333v-85.333c0-21.881 16.471-39.915 37.691-42.38v0zM359.006 85.333h220.654c20.117 0 39.502 7.104 54.801 19.922l5.539 5.072 60.34 60.34h67.66c68.168 0 123.89 53.287 127.783 120.479l0.217 7.521v213.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-213.333c0-21.881-16.471-39.915-37.691-42.38l-4.976-0.287h-67.66c-20.117 0-39.502-7.104-54.801-19.922l-5.539-5.072-60.34-60.34h-220.654l-60.34 60.34c-14.225 14.225-32.955 22.909-52.837 24.663l-7.503 0.33h-67.66c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v469.333c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h384c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-384c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-469.333c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217h67.66l60.34-60.34c14.225-14.225 32.955-22.909 52.837-24.663l7.503-0.33zM469.333 298.667c117.821 0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333zM469.333 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128s-57.308-128-128-128z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "camera-add" + ], + "defaultCode": 59663, + "grid": 24, + "id": 27 + }, + { + "paths": [ + "M256 85.333h213.333c94.257 0 170.667 76.41 170.667 170.667 0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.521-11.344c-3.095-41.946-36.512-75.46-78.416-78.707l-6.684-0.258h-213.333c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v512c0 44.986 34.811 81.842 78.965 85.099l6.369 0.234h213.333c44.986 0 81.842-34.811 85.099-78.965l0.521-11.344c2.465-21.22 20.499-37.691 42.38-37.691 23.564 0 42.667 19.103 42.667 42.667 0 91.4-71.849 166.019-162.149 170.458l-8.518 0.209h-213.333c-91.4 0-166.019-71.849-170.458-162.149l-0.209-8.518v-512c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209zM798.17 311.163l170.667 170.667c1.51 1.51 2.883 3.105 4.12 4.77l3.058 4.746 2.28 4.81 1.51 4.495 1.059 5.014 0.396 3.806v5.058l-0.217 2.482-0.879 4.952-1.385 4.615-1.441 3.48-2.232 4.159-3.144 4.469-3.123 3.484-170.667 170.667c-16.662 16.662-43.677 16.662-60.34 0s-16.662-43.677 0-60.34l97.797-97.83h-280.96c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h280.96l-97.797-97.83c-16.662-16.662-16.662-43.677 0-60.34s43.677-16.662 60.34 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "logout" + ], + "defaultCode": 59698, + "grid": 24, + "id": 28 + }, + { + "paths": [ + "M725.333 85.333c94.257 0 170.667 76.41 170.667 170.667v608.186c0 47.128-38.205 85.335-85.333 85.335-20.37 0-40.068-7.288-55.534-20.545l-243.132-208.399-243.132 208.399c-35.782 30.671-89.653 26.527-120.324-9.256-13.257-15.466-20.543-35.164-20.543-55.534v-608.186c0-94.257 76.41-170.667 170.667-170.667h426.667zM725.333 170.667h-426.667c-47.128 0-85.333 38.205-85.333 85.333v608.186l243.132-208.399c31.956-27.391 79.112-27.391 111.068 0l243.132 208.399v-608.186c0-47.128-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "saved-messages" + ], + "defaultCode": 59720, + "grid": 24, + "id": 29 + }, + { + "paths": [ + "M574.049 42.667c44.763 0 85.055 34.149 92.639 78.255l11.132 64.743c21.986 9.976 42.789 22.111 62.102 36.238l59.204-21.999c42.327-15.728 92.075 2.624 114.342 41.844l40.694 71.677c22.083 38.896 12.844 91.038-21.177 119.995l-48.916 41.635c1.365 12.471 2.066 24.728 2.066 36.945s-0.702 24.471-2.066 36.941l48.909 41.615c34.127 29.037 43.25 81.12 21.184 119.994l-40.694 71.691c-22.281 39.253-72.139 57.537-114.343 41.855l-59.204-21.999c-19.312 14.126-40.116 26.262-62.102 36.238l-11.132 64.743c-7.563 43.987-47.98 78.255-92.639 78.255h-81.402c-44.76 0-85.054-34.144-92.647-78.246l-11.148-64.757c-21.974-9.976-42.775-22.111-62.095-36.236l-59.193 22c-42.324 15.731-92.071-2.628-114.341-41.849l-40.708-71.691c-22.089-38.901-12.854-91.046 21.174-120l48.921-41.624c-1.371-12.507-2.077-24.743-2.077-36.931 0-12.19 0.706-24.427 2.077-36.936l-48.927-41.644c-34.124-29.045-43.242-81.131-21.166-120l40.708-71.677c22.288-39.243 72.143-57.521 114.339-41.838l59.193 22c15.456-11.3 31.86-21.326 49.054-29.992l13.041-6.243 11.148-64.757c7.572-43.983 47.991-78.246 92.647-78.246h81.402zM574.049 128h-81.402c-3.005 0-8.008 4.241-8.55 7.39l-15.141 87.948c-2.578 14.975-12.926 27.449-27.167 32.749-29.427 10.951-56.391 26.714-79.781 46.637-11.769 10.024-28.039 12.898-42.53 7.512l-81.642-30.343c-2.886-1.073-8.755 1.079-10.409 3.992l-40.708 71.677c-1.871 3.295-0.626 10.408 2.274 12.877l66.78 56.84c11.46 9.754 16.934 24.825 14.405 39.66-2.856 16.758-4.312 32.167-4.312 47.062s1.456 30.303 4.312 47.062c2.529 14.838-2.947 29.911-14.411 39.665l-66.78 56.82c-2.848 2.423-4.121 9.609-2.267 12.873l40.708 71.691c1.676 2.952 7.468 5.089 10.408 3.997l81.642-30.343c14.491-5.386 30.761-2.512 42.53 7.512 23.39 19.923 50.354 35.685 79.781 46.637 14.241 5.3 24.589 17.774 27.167 32.749l15.141 87.948c0.561 3.261 5.434 7.39 8.55 7.39h81.402c3.002 0 7.999-4.237 8.539-7.381l15.121-87.948c2.576-14.983 12.93-27.463 27.18-32.762 29.447-10.949 56.4-26.706 79.753-46.618 11.769-10.035 28.047-12.915 42.544-7.528l81.661 30.343c2.889 1.074 8.757-1.078 10.41-3.99l40.694-71.691c1.872-3.299 0.626-10.413-2.271-12.879l-66.78-56.82c-11.482-9.77-16.956-24.874-14.399-39.732 2.848-16.55 4.301-31.992 4.301-46.995s-1.453-30.445-4.301-46.995c-2.556-14.855 2.915-29.957 14.394-39.727l66.78-56.84c2.855-2.43 4.13-9.622 2.279-12.882l-40.694-71.677c-1.672-2.944-7.464-5.081-10.411-3.986l-81.661 30.343c-14.498 5.387-30.775 2.507-42.544-7.528-23.353-19.912-50.306-35.669-79.753-46.618-14.25-5.298-24.603-17.779-27.18-32.762l-15.121-87.948c-0.56-3.256-5.426-7.381-8.539-7.381zM533.333 426.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "settings" + ], + "defaultCode": 59726, + "grid": 24, + "id": 30 + }, + { + "paths": [ + "M308.729 536.159l100.511-111.58c24.050-23.968 36.487-59.685 32.349-95.745l-11.022-95.78c-7.133-60.037-57.665-105.053-118.012-105.053h-65.744c-67.593 0-122.77 56.491-118.59 123.97 21.466 345.892 298.018 622.324 643.797 643.808 67.487 4.181 123.987-50.997 123.987-118.59v-65.745c0.583-59.789-44.566-110.49-104.526-117.614l-96.72-11.043c-36.036-4.135-71.753 8.302-97.334 33.883l-109.576 98.598c-66.487-43.057-123.957-98.848-168.958-163.927l-10.162-15.182zM567.25 758.597l88.897-80.052c8.782-8.7 18.694-12.151 28.908-10.979l96.55 11.024c16.741 1.99 29.224 16.008 29.065 32.436l-0.004 66.163c0 19.122-15.756 34.511-33.364 33.42-74.488-4.628-145.314-22.772-210.053-52.012zM265.405 456.776c-29.244-64.741-47.39-135.577-52.014-210.086-1.090-17.602 14.297-33.356 33.42-33.356h65.744c17.059 0 31.236 12.629 33.256 29.632l11.002 95.611c1.171 10.201-2.281 20.113-9.444 27.277l-81.964 90.923z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "phone" + ], + "defaultCode": 59711, + "grid": 24, + "id": 31 + }, + { + "paths": [ + "M497.401 370.658l-160.596 163.813c-57.774 58.931-57.773 153.256 0.002 212.186 54.925 56.023 143.615 58.882 201.973 7.943l7.659-7.175 280.991-286.603c88.906-90.684 88.906-235.835 0-326.519-84.812-86.507-222.148-90.314-311.561-10.427l-10.923 10.427-280.232 285.835c-120.038 122.438-120.038 318.415 0 440.853 114.978 117.276 301.591 121.763 422.020 12.095l12.555-12.098 160.597-163.812c16.496-16.827 16.229-43.84-0.598-60.337s-43.84-16.229-60.337 0.598l-163.664 166.879c-86.351 84.658-224.981 83.286-309.64-3.065-87.505-89.255-87.505-232.119 0-321.373l282.198-287.801c55.399-54.313 144.337-53.433 198.65 1.966 56.374 57.501 56.374 149.539 0 207.039l-281.1 286.702c-24.445 23.966-63.69 23.577-87.656-0.868-25.243-25.747-25.243-66.96-0.001-92.708l160.596-163.813c16.496-16.827 16.228-43.84-0.598-60.337s-43.84-16.228-60.337 0.598z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "attach" + ], + "defaultCode": 59657, + "grid": 24, + "id": 32 + }, + { + "paths": [ + "M768 213.333c70.692 0 128 57.308 128 128v512c0 70.692-57.308 128-128 128h-384c-70.692 0-128-57.308-128-128v-512c0-70.692 57.308-128 128-128h384zM768 298.667h-384c-23.564 0-42.667 19.103-42.667 42.667v512c0 23.564 19.103 42.667 42.667 42.667h384c23.564 0 42.667-19.103 42.667-42.667v-512c0-23.564-19.103-42.667-42.667-42.667zM213.333 42.667h426.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-426.667c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976v512c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-512c0-68.168 53.287-123.89 120.479-127.783l7.521-0.217z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "copy" + ], + "defaultCode": 59674, + "grid": 24, + "id": 33 + }, + { + "paths": [ + "M789.333 71.615c58.91 0 106.667 47.756 106.667 106.667v667.437c0 24.74-8.6 48.711-24.327 67.809-37.45 45.475-104.673 51.98-150.148 14.53l-209.525-172.581v76.524c0 68.168-53.287 123.89-120.479 127.783l-7.521 0.217c-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521-0.008-110.936c-97.372-19.769-170.659-105.858-170.659-209.064 0-117.821 95.513-213.333 213.333-213.333h176.693l246.165-202.724c19.098-15.728 43.069-24.327 67.809-24.327zM341.333 725.311v106.689c0 23.564 19.103 42.667 42.667 42.667 21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-106.689h-85.333zM789.333 156.948c-4.948 0-9.742 1.72-13.562 4.865l-246.165 202.724c-15.278 12.582-34.455 19.462-54.247 19.462h-176.693c-70.692 0-128 57.308-128 128s57.308 128 128 128h176.693c19.792 0 38.969 6.88 54.247 19.462l246.165 202.724c9.095 7.49 22.54 6.189 30.030-2.906 3.146-3.82 4.865-8.614 4.865-13.562v-667.437c0-11.782-9.551-21.333-21.333-21.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "channel" + ], + "defaultCode": 59665, + "grid": 24, + "id": 34 + }, + { + "paths": [ + "M341.333 554.667c141.778 0 245.462 35.572 308.155 109.651 21.423 25.314 33.178 57.402 33.178 90.564v34.452c0 58.91-47.756 106.667-106.667 106.667h-469.333c-58.91 0-106.667-47.756-106.667-106.667v-34.452c0-33.162 11.756-65.25 33.179-90.564 62.693-74.079 166.377-109.65 308.155-109.65zM765.931 598.766l4.984 0.049c91.863 6.21 162.691 32.125 210.977 79.407 24.687 24.173 39.497 56.524 41.794 90.78l0.314 9.385v21.612c0 50.81-39.474 92.401-89.427 95.779l-6.573 0.221h-117.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h117.333c5.049 0 9.279-3.509 10.385-8.221l0.282-2.446v-21.612c0-14.749-5.939-28.876-16.477-39.195-31.987-31.323-83.828-50.29-157.030-55.239-23.51-1.589-41.281-21.937-39.692-45.447 1.476-21.831 19.126-38.713 40.463-39.741v0zM341.333 640c-118.985 0-199.024 27.459-243.017 79.443-8.383 9.905-12.983 22.462-12.983 35.438v34.452c0 11.782 9.551 21.333 21.333 21.333h469.333c11.782 0 21.333-9.551 21.333-21.333v-34.452c0-12.976-4.6-25.533-12.983-35.438-43.993-51.984-124.033-79.443-243.017-79.443zM725.333 213.333c82.475 0 149.333 66.859 149.333 149.333s-66.859 149.333-149.333 149.333c-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333zM341.333 128c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM725.333 298.667c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64s-28.654-64-64-64zM341.333 213.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "group" + ], + "defaultCode": 59689, + "grid": 24, + "id": 35 + }, + { + "paths": [ + "M512 512c166.709 0 286.52 44.22 355.634 135.63 18.407 24.344 28.366 54.030 28.366 84.549v48.011c0 63.96-51.85 115.81-115.81 115.81h-536.381c-63.96 0-115.81-51.85-115.81-115.81v-48.009c0-30.519 9.958-60.205 28.364-84.548 69.114-91.412 188.926-135.633 355.636-135.633zM512 597.333c-142.434 0-237.024 34.911-287.568 101.763-7.202 9.525-11.099 21.141-11.099 33.084v48.009c0 16.832 13.645 30.476 30.476 30.476h536.381c16.832 0 30.476-13.645 30.476-30.476v-48.011c0-11.942-3.897-23.558-11.1-33.084-50.545-66.851-145.134-101.762-287.567-101.762zM512 85.333c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM512 170.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "user" + ], + "defaultCode": 59737, + "grid": 24, + "id": 36 + }, + { + "paths": [ + "M384 554.667c141.778 0 245.462 35.572 308.155 109.651 19.28 22.782 30.731 51.052 32.828 80.653l0.351 9.911v34.452c0 56.554-44.012 102.828-99.653 106.44l-7.013 0.227h-469.333c-56.554 0-102.828-44.012-106.44-99.653l-0.227-7.013v-34.452c0-33.162 11.756-65.25 33.179-90.564 62.693-74.079 166.377-109.65 308.155-109.65zM384 640c-118.985 0-199.024 27.459-243.017 79.443-6.986 8.254-11.344 18.35-12.603 28.995l-0.38 6.443v34.452c0 10.473 7.547 19.183 17.499 20.99l3.835 0.344h469.333c10.473 0 19.183-7.547 20.99-17.499l0.344-3.835v-34.452c0-12.976-4.6-25.533-12.983-35.438-43.993-51.984-124.033-79.443-243.017-79.443zM810.667 597.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM810.667 128c94.257 0 170.667 76.41 170.667 170.667 0 77.119-51.151 142.291-121.376 163.441l-6.624 1.807v26.752c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-64c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333 0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667c0-94.257 76.41-170.667 170.667-170.667zM384 128c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM384 213.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "non-contacts" + ], + "id": 37 + }, + { + "paths": [ + "M170.667 85.333h597.333c91.4 0 166.019 71.849 170.458 162.149l0.209 8.518v85.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-85.333c0-44.986-34.811-81.842-78.965-85.099l-6.369-0.234h-597.333c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v341.333c0 44.986 34.811 81.842 78.965 85.099l6.369 0.234h426.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333v85.333h85.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-256c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h85.333v-85.333h-256c-91.4 0-166.019-71.849-170.458-162.149l-0.209-8.518v-341.333c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209zM938.667 469.333c47.128 0 85.333 38.205 85.333 85.333v298.667c0 47.128-38.205 85.333-85.333 85.333h-128c-47.128 0-85.333-38.205-85.333-85.333v-298.667c0-47.128 38.205-85.333 85.333-85.333h128zM938.667 554.667h-128v298.667h128v-298.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "active-sessions" + ], + "grid": 24, + "id": 38 + }, + { + "paths": [ + "M512.239 21.333c16.136 0 28.168 2.465 51.412 9.18l47.256 16.287 47.087 16.644c49.569 17.663 104.683 37.693 148.222 53.908l43.063 16.255c63.073 24.566 89.387 56.573 89.387 121.782v348.951l-0.233 17.057c-4.188 147.321-66.782 208.095-342.576 364.502l-31.551 17.794c-16.838 9.217-35.485 14.972-52.068 14.972s-35.231-5.755-52.666-15.306l-60.882-34.944-42.742-25.118c-217.318-129.436-266.908-189.449-270.408-322.582l-0.207-16.376v-348.951c0-62.416 24.82-95.549 81.356-118.649l31.438-11.945 50.040-18.344 214.085-76.391c19.883-5.925 33.697-8.728 49.987-8.728zM512.028 768c-88.816 0-160.487 12.737-215.108 37.49 40.034 27.548 92.38 59.144 160.59 98.405l43.634 24.946c3.143 1.72 6.294 2.993 8.441 3.736l2.653 0.755 2.628-0.741 5.157-2.071c0.962-0.443 1.947-0.932 2.916-1.462l29.292-16.504c75.824-42.914 133.019-76.962 176.006-106.581-54.767-25.067-126.802-37.975-216.211-37.975zM512.239 106.667c-4.804 0-10.274 0.915-17.595 2.835l-5.856 1.63-232.828 83.297-56.445 21.034-9.304 3.835c-16.276 7.329-19.157 13.355-19.505 31.34v360.007l0.344 12.405c2.193 49.695 14.501 85.623 54.505 125.457 2.779-2.92 6.075-5.46 9.802-7.524 70.807-39.222 163.076-58.315 276.671-58.315 113.6 0 205.871 19.094 276.679 58.319 3.902 2.161 7.332 4.844 10.252 7.913 43.972-44.414 54.375-84.863 54.375-144.557v-348.951c0-23.34-1.807-28.455-24.028-37.849l-10.828-4.353-47.336-17.839-76.084-27.905c-35.59-12.912-72.025-25.955-103.212-36.932l-53.573-18.548-10.307-2.819c-7.258-1.839-11.561-2.477-15.726-2.477zM512 256c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM512 341.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "admin" + ], + "grid": 24, + "id": 39 + }, + { + "paths": [ + "M213.333 810.667h597.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-597.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287zM507.024 128.287l4.976-0.287c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v408.96l140.497-140.463c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-213.333 213.333c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-213.333-213.333c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 140.497 140.463v-408.96c0-21.881 16.471-39.915 37.691-42.38v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "download" + ], + "grid": 24, + "id": 40 + }, + { + "paths": [ + "M512 42.667c188.684 0 341.333 152.649 341.333 341.333 0 156.334-115.811 350.548-275.703 544.008-34.125 40.95-96.71 40.95-130.872-0.044-159.081-191.421-276.092-387.465-276.092-543.964 0-188.684 152.649-341.333 341.333-341.333zM512 128c-141.556 0-256 114.444-256 256 0 125.035 104.336 303.415 243.943 474.32l12.271 14.853 12.22-14.873c140.231-172.532 243.567-349.394 243.567-474.301 0-141.556-114.444-256-256-256zM512 298.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "location" + ], + "grid": 24, + "id": 41 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM341.333 469.333h341.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-341.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "stop" + ], + "grid": 24, + "id": 42 + }, + { + "paths": [ + "M320 42.667h384c50.361 0 97.967 22.229 130.279 60.418l6.255 7.849 64 85.333c19.941 26.588 31.636 58.35 33.776 91.357l0.358 11.043v469.333c0 94.257-76.41 170.667-170.667 170.667h-512c-94.257 0-170.667-76.41-170.667-170.667v-469.333c0-33.234 9.701-65.662 27.794-93.351l6.34-9.049 64-85.333c30.217-40.289 76.563-65.036 126.502-67.972l10.032-0.295zM768 298.667h-512c-47.128 0-85.333 38.205-85.333 85.333v384c0 47.128 38.205 85.333 85.333 85.333h512c47.128 0 85.333-38.205 85.333-85.333v-384c0-47.128-38.205-85.333-85.333-85.333zM353.83 481.83c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 97.83 97.83 97.83-97.83c16.662-16.662 43.677-16.662 60.34 0 15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-128 128c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-128-128c-16.662-16.662-16.662-43.677 0-60.34zM704 128h-384c-24.418 0-47.54 10.451-63.65 28.495l-4.617 5.638-43.503 57.975c15.158-4.411 31.188-6.775 47.769-6.775h512c16.566 0 32.581 2.36 47.727 6.763l-43.46-57.963c-14.651-19.534-36.885-31.761-60.986-33.823l-7.281-0.311z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "archive" + ], + "defaultCode": 59656, + "grid": 24, + "id": 44 + }, + { + "paths": [ + "M320 42.667h384c50.361 0 97.967 22.229 130.279 60.418l6.255 7.849 64 85.333c19.941 26.588 31.636 58.35 33.776 91.357l0.358 11.043v469.333c0 94.257-76.41 170.667-170.667 170.667h-512c-94.257 0-170.667-76.41-170.667-170.667v-469.333c0-33.234 9.701-65.662 27.794-93.351l6.34-9.049 64-85.333c30.217-40.289 76.563-65.036 126.502-67.972l10.032-0.295zM768 298.667h-512c-47.128 0-85.333 38.205-85.333 85.333v384c0 47.128 38.205 85.333 85.333 85.333h512c47.128 0 85.333-38.205 85.333-85.333v-384c0-47.128-38.205-85.333-85.333-85.333zM542.17 460.497l128 128c16.662 16.662 16.662 43.677 0 60.34s-43.677 16.662-60.34 0l-97.83-97.83-97.83 97.83c-16.662 16.662-43.677 16.662-60.34 0s-16.662-43.677 0-60.34l128-128c16.662-16.662 43.677-16.662 60.34 0zM704 128h-384c-24.418 0-47.54 10.451-63.65 28.495l-4.617 5.638-43.503 57.975c15.158-4.411 31.188-6.775 47.769-6.775h512c16.566 0 32.581 2.36 47.727 6.763l-43.46-57.963c-14.651-19.534-36.885-31.761-60.986-33.823l-7.281-0.311z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "unarchive" + ], + "grid": 24, + "id": 45 + }, + { + "paths": [ + "M725.333 128c91.4 0 166.019 71.849 170.458 162.149l0.209 8.518v149.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-149.333c0-44.986-34.811-81.842-78.965-85.099l-6.369-0.234h-426.667c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v536.96l94.081-94.048c8.916-8.916 20.555-14.483 32.962-15.892l6.259-0.354h186.698c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-174.379l-150.834 150.886c-17.019 17.019-43.858 18.235-62.28 3.647l-4.094-3.647c-7.544-7.544-12.255-17.393-13.447-27.891l-0.3-5.296v-629.699c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209h426.667zM968.837 524.497c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-213.333 213.333c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-106.667-106.667c-16.662-16.662-16.662-43.677 0-60.34 15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 76.497 76.463 183.163-183.13c16.662-16.662 43.677-16.662 60.34 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "readchats" + ], + "id": 46 + }, + { + "paths": [ + "M256 85.333h512c91.4 0 166.019 71.849 170.458 162.149l0.209 8.518v170.667c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-170.667c0-44.986-34.811-81.842-78.965-85.099l-6.369-0.234h-512c-44.986 0-81.842 34.811-85.099 78.965l-0.234 6.369v579.66l94.081-94.081c8.916-8.916 20.555-14.483 32.962-15.892l6.259-0.354h250.698c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-238.327l-150.886 150.886c-18.329 18.329-48.045 18.329-66.374 0-7.544-7.544-12.255-17.393-13.447-27.891l-0.3-5.296v-672.366c0-91.4 71.849-166.019 162.149-170.458l8.518-0.209zM810.667 512c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667zM810.667 597.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "unread" + ], + "grid": 24, + "id": 47 + }, + { + "paths": [ + "M316.34 810.667l-150.886 150.886c-18.329 18.329-48.045 18.329-66.374 0-8.802-8.802-13.746-20.739-13.746-33.187v-672.366c0-94.257 76.41-170.667 170.667-170.667h512c94.257 0 170.667 76.41 170.667 170.667v384c0 94.257-76.41 170.667-170.667 170.667h-451.66zM170.667 835.66l94.081-94.081c10.402-10.402 24.51-16.246 39.221-16.246h464.031c47.128 0 85.333-38.205 85.333-85.333v-384c0-47.128-38.205-85.333-85.333-85.333h-512c-47.128 0-85.333 38.205-85.333 85.333v579.66z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "message" + ], + "grid": 24, + "id": 48 + }, + { + "paths": [ + "M512 42.667c114.72 0 208.291 90.552 213.136 204.079l0.197 9.254v85.333c70.692 0 128 57.308 128 128v341.333c0 70.692-57.308 128-128 128h-426.667c-70.692 0-128-57.308-128-128v-341.333c0-70.692 57.308-128 128-128v-85.333c0-117.821 95.513-213.333 213.333-213.333zM725.333 426.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667v341.333c0 23.564 19.103 42.667 42.667 42.667h426.667c23.564 0 42.667-19.103 42.667-42.667v-341.333c0-23.564-19.103-42.667-42.667-42.667zM512 576c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64zM519.521 128.217l-7.521-0.217c-68.168 0-123.89 53.287-127.783 120.479l-0.217 7.521v85.333h256v-85.333c0-68.168-53.287-123.89-120.479-127.783v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lock" + ], + "grid": 24, + "id": 49 + }, + { + "paths": [ + "M758.746 42.864l9.254-0.197c114.72 0 208.291 90.552 213.136 204.079l0.197 9.254v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-128c0-70.692-57.308-128-128-128-68.168 0-123.89 53.287-127.783 120.479l-0.217 7.521v85.333c70.692 0 128 57.308 128 128v341.333c0 70.692-57.308 128-128 128h-426.667c-70.692 0-128-57.308-128-128v-341.333c0-70.692 57.308-128 128-128h341.333v-85.333c0-114.72 90.552-208.291 204.079-213.136zM640 426.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667v341.333c0 23.564 19.103 42.667 42.667 42.667h426.667c23.564 0 42.667-19.103 42.667-42.667v-341.333c0-23.564-19.103-42.667-42.667-42.667zM426.667 576c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "unlock" + ], + "grid": 24, + "id": 50 + }, + { + "paths": [ + "M469.333 853.333h85.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287zM140.95 97.383c15.608-15.149 39.825-15.971 56.367-2.708l3.966 3.609 704 725.333c16.412 16.909 16.009 43.921-0.9 60.333-15.608 15.149-39.825 15.971-56.367 2.708l-3.966-3.609-70.594-72.729-5.456 0.346h-597.333c-32.455 0-52.437-34.449-37.937-62.223l2.436-4.111 78.167-117.251v-243.082c0-43.147 9.186-85.028 26.607-123.383l-99.89-102.901c-16.412-16.909-16.009-43.921 0.9-60.333zM299.016 371.679l-0.349 12.321v243.082c0 14.44-3.664 28.604-10.595 41.183l-3.736 6.152-33.945 50.917h440.61l-385.097-396.676c-3.734 13.951-6.054 28.346-6.888 43.022zM512 85.333c161.513 0 293.082 128.204 298.493 288.399l0.173 10.268v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-128c0-117.821-95.513-213.333-213.333-213.333-26.015 0-51.327 4.639-75.1 13.582-22.055 8.297-46.66-2.857-54.957-24.912s2.857-46.66 24.912-54.957c33.342-12.543 68.828-19.046 105.145-19.046z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "mute" + ], + "grid": 24, + "id": 51 + }, + { + "paths": [ + "M469.333 853.333h85.333c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-85.333c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287zM512 85.333c164.949 0 298.667 133.718 298.667 298.667v243.082l78.167 117.251c18.903 28.354-1.423 66.334-35.501 66.334h-682.667c-34.078 0-54.404-37.98-35.501-66.334l78.167-117.251v-243.082c0-164.949 133.718-298.667 298.667-298.667zM512 170.667c-117.821 0-213.333 95.513-213.333 213.333v243.082c0 16.847-4.987 33.317-14.332 47.334l-33.945 50.917h523.22l-33.945-50.917c-9.345-14.017-14.332-30.487-14.332-47.334v-243.082c0-117.821-95.513-213.333-213.333-213.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "unmute" + ], + "grid": 24, + "id": 52 + }, + { + "paths": [ + "M774.331 85.333l6.164 0.293c32.454 3.101 57.836 30.44 57.836 63.707 0 18.683-8.164 36.434-22.349 48.592l-92.392 79.193-18.092 199.011 126.831 142.685c23.483 26.418 21.103 66.871-5.315 90.353-11.715 10.414-26.845 16.166-42.519 16.166h-229.852l0.025 213.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976-0.025-213.333h-229.803c-35.346 0-64-28.654-64-64 0-15.675 5.752-30.804 16.166-42.519l126.831-142.685-18.092-199.011-92.392-79.193c-26.837-23.003-29.945-63.406-6.942-90.243 12.159-14.185 29.909-22.349 48.592-22.349h524.661zM716.661 170.667h-409.322l48.606 41.662c16.872 14.462 27.437 34.934 29.449 57.064l18.092 199.011c2.135 23.48-5.54 46.797-21.204 64.418l-95.269 107.178h449.976l-95.269-107.178c-15.664-17.621-23.338-40.938-21.204-64.418l18.092-199.011c2.012-22.13 12.577-42.603 29.449-57.064l48.606-41.662z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "pin" + ], + "grid": 24, + "id": 53 + }, + { + "paths": [ + "M137.341 101.349l3.609-3.966c15.608-15.149 39.825-15.971 56.367-2.708l3.966 3.609 704 725.333c16.412 16.909 16.009 43.921-0.9 60.333-15.608 15.149-39.825 15.971-56.367 2.708l-3.966-3.609-153.789-158.39-2.618 0.387-4.976 0.287h-128v213.333c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-213.333h-229.827c-35.346 0-64-28.654-64-64 0-13.435 4.226-26.47 11.991-37.298l4.174-5.222 126.831-142.685-13.521-148.492-164.931-169.921c-15.149-15.608-15.971-39.825-2.708-56.367v0zM399.531 425.045l3.955 43.359c1.897 20.871-3.956 41.613-16.281 58.341l-4.923 6.077-95.263 107.135 321.109 0.043-208.597-214.955zM774.331 85.333c35.346 0 64 28.654 64 64 0 16.607-6.451 32.478-17.847 44.339l-4.502 4.254-92.392 79.193-13.987 153.859c-2.133 23.467-22.887 40.762-46.354 38.629-21.791-1.981-38.26-20.017-38.793-41.373l0.165-4.981 13.987-153.859c1.788-19.671 10.335-38.033 24.061-52.027l5.387-5.037 48.606-41.662h-332.661c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h390.331z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "unpin" + ], + "grid": 24, + "id": 54 + }, + { + "paths": [ + "M640 597.333h170.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-128v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-170.667c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287v0zM384 597.333c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-128h-128c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667h170.667zM640 170.667c23.564 0 42.667 19.103 42.667 42.667v128h128c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667zM384 170.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v170.667c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-170.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h128v-128c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "smallscreen" + ], + "id": 55 + }, + { + "paths": [ + "M213.333 597.333c23.564 0 42.667 19.103 42.667 42.667v128h128c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667zM810.667 597.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v170.667c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-170.667c-23.564 0-42.667-19.103-42.667-42.667 0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h128v-128c0-23.564 19.103-42.667 42.667-42.667zM213.333 170.667h170.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-128v128c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-170.667c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287v0zM810.667 170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-128h-128c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667h170.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "fullscreen" + ], + "id": 56 + }, + { + "paths": [ + "M398.222 199.111c15.709 0 28.444 12.735 28.444 28.444v568.889c0 15.709-12.735 28.444-28.444 28.444h-142.222c-15.709 0-28.444-12.735-28.444-28.444v-568.889c0-15.709 12.735-28.444 28.444-28.444h142.222zM768 199.111c15.709 0 28.444 12.735 28.444 28.444v568.889c0 15.709-12.735 28.444-28.444 28.444h-142.222c-15.709 0-28.444-12.735-28.444-28.444v-568.889c0-15.709 12.735-28.444 28.444-28.444h142.222z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "large-pause" + ], + "defaultCode": 59694, + "grid": 24, + "id": 57 + }, + { + "paths": [ + "M328.391 170.787l488.252 317.364c13.171 8.561 16.909 26.179 8.347 39.351-2.168 3.335-5.012 6.179-8.347 8.347l-488.252 317.364c-13.171 8.561-30.789 4.824-39.351-8.347-2.999-4.614-4.595-9.999-4.595-15.502v-634.727c0-15.709 12.735-28.444 28.444-28.444 5.503 0 10.888 1.596 15.502 4.595z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "large-play" + ], + "defaultCode": 59695, + "grid": 24, + "id": 58 + }, + { + "paths": [ + "M384 170.667c23.564 0 42.667 19.103 42.667 42.667v597.333c0 23.564-19.103 42.667-42.667 42.667h-128c-23.564 0-42.667-19.103-42.667-42.667v-597.333c0-23.564 19.103-42.667 42.667-42.667h128zM768 170.667c23.564 0 42.667 19.103 42.667 42.667v597.333c0 23.564-19.103 42.667-42.667 42.667h-128c-23.564 0-42.667-19.103-42.667-42.667v-597.333c0-23.564 19.103-42.667 42.667-42.667h128z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "pause" + ], + "defaultCode": 59709, + "grid": 24, + "id": 59 + }, + { + "paths": [ + "M264.359 119.351l548.011 365.341c15.082 10.055 19.157 30.432 9.103 45.514-2.404 3.605-5.497 6.699-9.103 9.103l-548.011 365.341c-15.082 10.055-35.459 5.979-45.514-9.103-3.594-5.391-5.512-11.726-5.512-18.206v-730.682c0-18.126 14.694-32.821 32.821-32.821 6.48 0 12.814 1.918 18.206 5.512z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "play" + ], + "defaultCode": 59715, + "grid": 24, + "id": 60 + }, + { + "paths": [ + "M512 242.526c217.604 0 404.211 215.579 404.211 269.474s-186.607 269.474-404.211 269.474c-217.604 0-404.211-215.579-404.211-269.474s186.607-269.474 404.211-269.474zM512 323.368c-104.178 0-188.632 84.453-188.632 188.632s84.453 188.632 188.632 188.632c104.178 0 188.632-84.453 188.632-188.632s-84.453-188.632-188.632-188.632zM512 417.684c52.089 0 94.316 42.227 94.316 94.316s-42.227 94.316-94.316 94.316c-52.089 0-94.316-42.227-94.316-94.316s42.227-94.316 94.316-94.316z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "channelviews" + ], + "defaultCode": 59666, + "id": 61 + }, + { + "paths": [ + "M429.452 676.33l352.606-402.978c12.74-14.56 34.872-16.036 49.432-3.295 13.104 11.466 15.61 30.54 6.692 44.854l-3.397 4.578-377.263 431.158c-12.010 13.726-32.215 15.731-46.582 5.549l-4.553-3.846-161.684-161.684c-13.681-13.681-13.681-35.861 0-49.542 12.313-12.313 31.51-13.544 45.2-3.694l4.342 3.694 135.207 135.207v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "message-delivered" + ], + "defaultCode": 59648, + "id": 62 + }, + { + "paths": [ + "M267.767 676.33l352.606-402.978c12.74-14.56 34.872-16.036 49.432-3.295 13.104 11.466 15.61 30.54 6.692 44.854l-3.397 4.578-377.263 431.158c-12.010 13.726-32.215 15.731-46.582 5.549l-4.553-3.846-161.684-161.684c-13.681-13.681-13.681-35.861 0-49.542 12.313-12.313 31.51-13.544 45.2-3.694l4.342 3.694 135.207 135.207v0zM537.241 676.33l352.606-402.978c12.74-14.56 34.872-16.036 49.432-3.295 13.104 11.466 15.61 30.54 6.692 44.854l-3.397 4.578-377.263 431.158c-12.010 13.726-32.215 15.731-46.582 5.549l-4.553-3.846-53.895-53.895c-13.681-13.681-13.681-35.861 0-49.542 12.313-12.313 31.51-13.544 45.2-3.694l4.342 3.694 27.417 27.417v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "message-read" + ], + "defaultCode": 59649, + "id": 63 + }, + { + "paths": [ + "M538.947 156.295c196.451 0 355.705 159.255 355.705 355.705s-159.255 355.705-355.705 355.705c-196.451 0-355.705-159.255-355.705-355.705s159.255-355.705 355.705-355.705zM538.947 220.968c-160.732 0-291.032 130.299-291.032 291.032s130.299 291.032 291.032 291.032c160.732 0 291.032-130.299 291.032-291.032s-130.299-291.032-291.032-291.032zM509.088 530.33l-1.138-1.991-2.551-6.222-1.073-4.755-0.308-2.675-0.103-191.319c0-19.347 15.684-35.032 35.032-35.032 17.589 0 32.15 12.962 34.652 29.855l0.38 5.177v174.134l97.529 97.516c12.313 12.313 13.544 31.51 3.694 45.2l-3.694 4.342c-12.313 12.313-31.51 13.544-45.2 3.694l-4.342-3.694-109.513-109.641-1.769-2.215-1.596-2.374z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "message-sending" + ], + "defaultCode": 59724, + "id": 64 + }, + { + "paths": [ + "M538.947 156.295c196.451 0 355.705 159.255 355.705 355.705s-159.255 355.705-355.705 355.705c-196.451 0-355.705-159.255-355.705-355.705s159.255-355.705 355.705-355.705zM538.947 633.263c-22.324 0-40.421 18.097-40.421 40.421s18.097 40.421 40.421 40.421c22.324 0 40.421-18.097 40.421-40.421s-18.097-40.421-40.421-40.421zM538.947 288.337c-19.347 0-35.032 15.684-35.032 35.032v215.579c0 19.347 15.684 35.032 35.032 35.032s35.032-15.684 35.032-35.032v-215.579c0-19.347-15.684-35.032-35.032-35.032z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "message-sending-error" + ], + "defaultCode": 59725, + "id": 65 + }, + { + "paths": [ + "M483.994 30.519c-11.111 6.212-19.9 15.981-24.885 27.825l-114.362 271.555-292.475 24.985c-31.579 2.698-54.992 30.484-52.294 62.063l0.888 6.28c2.458 12.395 8.957 23.698 18.568 32.082l222.443 194.036-66.784 288.301c-7.154 30.876 12.077 61.705 42.953 68.859l6.294 1.093c12.64 1.477 25.483-1.286 36.462-7.958l251.198-152.664 251.198 152.664c27.085 16.459 62.384 7.846 78.844-19.239l3.009-5.635c5.36-11.543 6.756-24.605 3.856-37.12l-66.827-288.301 222.486-194.036c23.885-20.833 26.358-57.084 5.525-80.969l-4.427-4.542c-9.306-8.548-21.227-13.829-33.936-14.914l-292.518-24.985-114.319-271.555c-12.296-29.211-45.945-42.924-75.156-30.627l-5.742 2.803zM512 152.619l95.102 225.948 2.504 5.202c9.153 16.8 26.189 28.062 45.503 29.712l243.707 20.78-185.441 161.804-4.521 4.402c-12.737 13.846-17.97 33.209-13.663 51.797l55.571 239.938-208.96-126.961-5.624-3.004c-17.237-8.012-37.502-7.010-53.981 3.004l-209.003 126.961 55.614-239.938 1.085-6.216c2.212-18.683-4.889-37.441-19.269-49.984l-185.483-161.804 243.75-20.78c21.246-1.815 39.734-15.261 48.007-34.914l95.102-225.948z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "favorite" + ], + "id": 66 + }, + { + "paths": [ + "M810.667 213.333c70.692 0 128 57.308 128 128v0 341.333c0 70.692-57.308 128-128 128v0h-597.333c-70.692 0-128-57.308-128-128v0-341.333c0-70.692 57.308-128 128-128v0zM810.667 298.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM640 597.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667h256zM512 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM384 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM256 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM640 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM768 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM512 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM384 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM256 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM640 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667zM768 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "keyboard" + ], + "id": 67 + }, + { + "paths": [ + "M896 128h-592.704c-44.133 0-85.153 22.735-108.544 60.16l-160 256c-25.942 41.507-25.942 94.173 0 135.68l160 256c23.391 37.425 64.411 60.16 108.544 60.16h592.704c70.692 0 128-57.308 128-128v-512c0-70.692-57.308-128-128-128zM896 213.333c23.564 0 42.667 19.103 42.667 42.667v512c0 23.564-19.103 42.667-42.667 42.667h-592.704c-14.711 0-28.384-7.578-36.181-20.053l-160-256c-8.647-13.836-8.647-31.391 0-45.227l160-256c7.797-12.475 21.47-20.053 36.181-20.053h592.704zM414.080 328.747c-16.613 16.613-16.613 43.547 0 60.16l123.093 123.093-123.093 123.093c-16.613 16.613-16.613 43.547 0 60.16s43.547 16.613 60.16 0l123.093-123.093 123.093 123.093c16.613 16.613 43.547 16.613 60.16 0s16.613-43.547 0-60.16l-123.093-123.093 123.093-123.093c16.613-16.613 16.613-43.547 0-60.16s-43.547-16.613-60.16 0l-123.093 123.093-123.093-123.093c-16.613-16.613-43.547-16.613-60.16 0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "delete-left" + ], + "id": 68 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM512 213.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v237.126l173.767 157.97c17.436 15.851 18.721 42.835 2.87 60.271-14.632 16.095-38.75 18.428-56.088 6.224l-4.184-3.354-173.767-157.97c-15.813-14.376-25.584-34.088-27.56-55.177l-0.372-7.965v-237.126c0-23.564 19.103-42.667 42.667-42.667z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "recent" + ], + "defaultCode": 59718, + "id": 69 + }, + { + "paths": [ + "M682.667 42.667c164.949 0 298.667 133.718 298.667 298.667v0 341.333c0 164.949-133.718 298.667-298.667 298.667v0h-341.333c-164.949 0-298.667-133.718-298.667-298.667v0-341.333c0-164.949 133.718-298.667 298.667-298.667v0zM682.667 128h-341.333c-117.821 0-213.333 95.513-213.333 213.333v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0h341.333c117.821 0 213.333-95.513 213.333-213.333v0-341.333c0-117.821-95.513-213.333-213.333-213.333v0zM789.333 362.667c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-64v42.667h64c23.564 0 42.667 19.103 42.667 42.667 0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-64v42.667c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-192c0-33.267 25.382-60.606 57.836-63.707l6.164-0.293h85.333zM554.667 362.667c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v213.333c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-213.333c0-23.564 19.103-42.667 42.667-42.667zM341.333 362.667c24.269 0 47.793 5.828 68.909 16.825 20.9 10.884 29.019 36.651 18.134 57.55-10.107 19.407-33.046 27.794-53.005 20.178l-4.546-2.044c-9.015-4.695-19.030-7.176-29.493-7.176-35.346 0-64 28.654-64 64s28.654 64 64 64c16.903 0 32.179-7.049 42.114-17.998l2.686-3.336h-2.133c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287 45.076 0.123 1.332 0.097c28.605 2.555 50.19 26.397 50.531 54.508l-0.219 5.674-1.88 18.709c-12.954 68.163-71.575 112.889-137.506 112.889-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "gifs" + ], + "id": 70 + }, + { + "paths": [ + "M341.329 981.334c-164.949 0-298.667-133.718-298.667-298.667v-341.334c0-164.949 133.718-298.667 298.667-298.667h341.337c164.949 0 298.667 133.718 298.667 298.667v219.297c0 33.113-9.632 65.51-27.724 93.243-39.413 60.421-84.122 115.645-134.106 165.629s-105.209 94.695-165.631 134.108c-27.734 18.091-60.131 27.723-93.243 27.723h-219.3zM682.667 128h-341.337c-117.821 0-213.333 95.513-213.333 213.333v341.334c0 117.821 95.513 213.333 213.333 213.333l170.671-0.001c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-183.467c0-61.176 47.686-111.215 107.915-114.973l7.285-0.227h183.467c21.881 0 39.915-16.471 42.38-37.691l0.287-4.976v-170.667c0-117.821-95.513-213.333-213.333-213.333zM859.908 639.875l-6.575 0.125h-183.467c-15.12 0-27.616 11.236-29.594 25.814l-0.273 4.053v183.467l-0.126 6.576c42.878-30.512 82.634-64.090 119.29-100.746s70.233-76.411 100.745-119.289z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "stickers" + ], + "id": 71 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM512 128c-212.077 0-384 171.923-384 384s171.923 384 384 384c212.077 0 384-171.923 384-384s-171.923-384-384-384zM284.419 582.407c19.94-10.175 44.353-2.258 54.528 17.682 32.942 64.559 99.285 106.044 173.053 106.044 73.655 0 139.914-41.358 172.91-105.764 10.207-19.924 34.633-27.8 54.556-17.593s27.8 34.633 17.593 54.556c-46.735 91.224-140.688 149.868-245.060 149.868-104.532 0-198.604-58.824-245.263-150.265-10.175-19.94-2.258-44.353 17.682-54.528zM373.333 341.333c29.455 0 53.333 28.654 53.333 64s-23.878 64-53.333 64c-29.455 0-53.333-28.654-53.333-64s23.878-64 53.333-64zM650.667 341.333c29.455 0 53.333 28.654 53.333 64s-23.878 64-53.333 64c-29.455 0-53.333-28.654-53.333-64s23.878-64 53.333-64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "smile" + ], + "defaultCode": 59728, + "id": 72 + }, + { + "paths": [ + "M803.377 64.527c94.561 0 160.407 159.819 126.34 350.117 10.871 29.145 20.9 60.963 28.215 90.838l16.717-3.168c22.591-4.263 44.359 10.596 48.622 33.186 3.958 20.977-8.57 41.246-28.468 47.446l-4.718 1.176-20.296 3.802-0.101 7.007c-0.954 24.969-5.424 49.44-12.956 73.143l25.637 0.020c22.989 0 41.632 18.636 41.632 41.625 0 21.347-16.077 38.94-36.779 41.346l-4.855 0.28-66.331-0.006c-81.772 121.967-244.664 208.132-404.036 208.132s-322.264-86.165-404.036-208.132l-66.331 0.006c-22.989 0-41.632-18.636-41.632-41.625 0-21.347 16.077-38.94 36.779-41.346l4.855-0.28 25.637-0.020c-8.234-25.914-12.81-52.745-13.131-80.14l-20.223-3.811c-22.591-4.263-37.449-26.031-33.186-48.622 3.958-20.977 23.010-35.287 43.799-33.811l4.822 0.624 16.721 3.175c7.32-29.875 17.353-61.699 28.234-90.868-31.589-181.841 45.831-350.093 126.317-350.093 16.936 0 26.936 5.19 43.911 19.842l11.132 9.962 50.578 48.307 12.132 11.090c12.177 10.86 22.543 19.153 31.044 24.782l7.186 4.364 3.733 1.846c53.304-12.277 82.456-16.128 131.661-16.128 44.54 0 72.715 3.161 119.308 13.436l11.429 2.589 1.862-0.819 4.942-2.695c7.833-4.653 17.511-11.943 29.019-21.794l7.123-6.218c5.66-5.029 11.659-10.549 18.414-16.919l44.196-41.982 11.154-9.901c17.013-14.57 27.058-19.76 43.929-19.76zM808.637 151.909l-4.36 3.894-39.265 37.309-17.595 16.421-14.338 12.718c-43.915 37.975-73.902 54.187-105.605 44.149-49.186-11.403-72.484-14.562-115.475-14.562-42.49 0-65.663 3.079-113.738 14.18-33.949 10.512-64.069-5.689-107.078-42.934l-14.805-13.178-14.115-13.173-41.454-39.745c-9.558 11.096-19.134 26.229-27.264 44.304-24.539 54.552-32.162 124.952-15.355 209.050l2.385 11.934-8.4 21.814c-9.115 24.581-17.716 51.919-24.088 76.899l121.879 22.946c22.591 4.263 37.449 26.031 33.186 48.622-3.958 20.977-23.010 35.287-43.799 33.811l-4.822-0.624-116.147-21.9c2.318 21.848 8.556 43.391 18.093 64.212l105.771 0.035c22.989 0 41.625 18.636 41.625 41.625 0 21.347-16.069 38.94-36.771 41.346l-4.855 0.28-46.83-0.020c72.548 73.583 185.798 124.897 296.582 124.897s224.035-51.314 296.582-124.897l-46.83 0.020c-22.989 0-41.625-18.636-41.625-41.625 0-21.347 16.069-38.94 36.771-41.346l4.855-0.28 105.771-0.035c9.536-20.82 15.775-42.363 18.093-64.212l-116.147 21.9c-22.591 4.263-44.359-10.596-48.622-33.186-3.958-20.977 8.57-41.246 28.468-47.446l4.718-1.176 121.887-22.942c-6.373-25.001-14.979-52.36-24.095-76.939l-8.401-21.809 2.386-11.937c17.344-86.773 12.554-158.644-8.238-210.642-8.652-21.638-19.276-36.902-26.426-45.045l-2.508-2.718zM494.075 584.844h38.738l4.427 0.227 4.628 0.76 4.454 1.266 4.429 1.806 2.303 1.185 1.891 1.115 2.999 2.079 4.061 3.5c1.677 1.685 3.131 3.373 4.417 5.127l1.812 2.686c0.832 1.344 1.589 2.739 2.267 4.181l1.572 3.853 1.492 5.317 0.727 4.927 0.145 3.596-0.246 4.593-1.139 6.091-0.752 2.479-18.081 54.241 1.106 3.293c3.196 7.386 10.549 12.553 19.11 12.553 11.494 0 20.813-9.318 20.813-20.813 0-22.989 18.636-41.625 41.625-41.625s41.625 18.636 41.625 41.625c0 57.472-46.591 104.064-104.064 104.064-23.445 0-45.079-7.753-62.478-20.836-17.354 13.095-38.971 20.836-62.398 20.836-57.472 0-104.064-46.591-104.064-104.064 0-22.989 18.636-41.625 41.625-41.625s41.625 18.636 41.625 41.625c0 11.494 9.318 20.813 20.813 20.813 8.56 0 15.913-5.168 19.11-12.553l1.106-3.293-17.168-51.502c-7.633-22.9 4.742-47.652 27.642-55.285l4.65-1.235 3.223-0.591 5.947-0.416zM657.687 418.343c34.483 0 62.438 27.954 62.438 62.438s-27.954 62.438-62.438 62.438c-34.483 0-62.438-27.954-62.438-62.438s27.954-62.438 62.438-62.438zM366.311 418.343c34.483 0 62.438 27.954 62.438 62.438s-27.954 62.438-62.438 62.438c-34.483 0-62.438-27.954-62.438-62.438s27.954-62.438 62.438-62.438zM645.873 185.328l-3.136-0.711-1.522 0.599 1.736-0.164 1.593 0.070 1.33 0.207z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "animals" + ], + "defaultCode": 59655, + "id": 73 + }, + { + "paths": [ + "M348.832 61.194c13.342-19.423 39.904-24.352 59.327-11.010 33.446 22.975 65.138 54.661 95.307 94.881 9.357 12.475 17.47 24.268 24.308 35.483 7.542-12.426 17.444-25.949 29.639-40.582 40.837-49.004 97.726-77.455 170.669-85.352-8.832 48.625-25.923 89.734-51.272 123.327l6.436-0.856c60.564-6.345 112.536 4.854 154.549 38.978l16.384 14.111c220.707 196.277 126.127 654.254-158.018 748.969l-4.259 1.178c-43.991 9.751-73.079 7.852-109.154-3.681l-25.15-8.694c-17.645-5.903-28.787-7.947-45.597-7.947-16.795 0-27.935 2.046-45.572 7.953l-25.186 8.717c-36.082 11.546-65.192 13.438-109.182 3.643l-4.219-1.17c-289.524-96.508-379.735-565.602-138.175-758.645 77.415-51.61 141.326-55.739 229.838-31.19l13.32 3.816c-24.135-31.66-48.532-55.808-72.982-72.604-19.423-13.342-24.352-39.904-11.010-59.327zM239.987 289.317c-184.684 147.747-111.593 531.199 112.777 608.175 26.131 5.621 40.407 4.914 61.688-1.837l8.345-2.814 18.109-6.328c25.088-8.293 44.156-11.847 71.093-11.847 26.94 0 46.002 3.548 71.090 11.831l26.426 9.121c18.636 5.906 31.906 7.191 52.451 3.67l9.287-1.804 9.742-3.575c212.168-82.926 284.334-447.443 116.911-599.538l-13.711-11.806c-23.708-18.694-53.002-24.706-92.061-20.614-19.268 2.019-38.538 6-66.596 13.353l-51.84 13.807-14.982 3.716c-17.745 4.186-27.429 5.456-39.45 5.757l-11.772 0.049c-17.461-0.26-28.883-2.268-56.363-10.474l-44.697-13.83c-72.092-21.465-113.983-19.808-166.449 14.986z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "eats" + ], + "defaultCode": 59682, + "id": 74 + }, + { + "paths": [ + "M512 42.667c259.206 0 469.333 210.128 469.333 469.333s-210.128 469.333-469.333 469.333c-259.206 0-469.333-210.128-469.333-469.333s210.128-469.333 469.333-469.333zM633.382 147.579l-99.43 59.674c-11.823 7.094-26.224 7.98-38.692 2.66l-5.212-2.66-99.43-59.674c-73.272 24.394-136.73 70.269-182.904 130.155 1.307 2.149 2.38 4.446 3.232 6.866l1.114 3.719 21.333 85.333c3.181 12.722 0.316 26.088-7.549 36.331l-3.674 4.187-85.333 85.333c-2.67 2.67-5.606 4.913-8.723 6.727l-0.113 5.77c0 98.342 36.968 188.050 97.765 255.985l94.228 0.015c14.987 0 28.876 7.863 36.586 20.715l56.656 94.465c31.514 8.363 64.619 12.82 98.764 12.82s67.25-4.457 98.764-12.82l56.649-94.465c6.747-11.245 18.224-18.671 31.028-20.352l5.559-0.363 94.235-0.015c60.797-67.935 97.765-157.643 97.765-255.985l-0.071-5.746c-3.132-1.819-6.083-4.069-8.765-6.751l-85.333-85.333c-10.598-10.598-14.858-25.978-11.223-40.518l21.333-85.333c0.951-3.804 2.386-7.361 4.221-10.62-43.172-56.11-101.644-99.936-169.159-125.296l-13.622-4.824zM537.6 307.2l170.667 128c15.914 11.935 21.468 33.284 13.389 51.462l-85.333 192c-6.848 15.408-22.128 25.338-38.989 25.338h-170.667c-16.861 0-32.141-9.93-38.989-25.338l-85.333-192c-8.079-18.178-2.525-39.527 13.389-51.462l170.667-128c15.17-11.378 36.030-11.378 51.2 0zM512 394.667l-117.871 88.403 60.265 135.597h115.211l60.265-135.597-117.871-88.403z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "sport" + ], + "defaultCode": 59729, + "id": 75 + }, + { + "paths": [ + "M981.333 853.333c0 70.692-57.308 128-128 128s-128-57.308-128-128h-426.667c0 70.692-57.308 128-128 128-68.168 0-123.89-53.287-127.783-120.479l-0.217-7.521v-299.298c0-32.477 5.297-64.736 15.682-95.507l75.86-224.771c29.566-87.604 104.073-152.458 194.916-169.665 75.184-14.241 135.961-21.425 182.875-21.425s107.691 7.185 182.874 21.425c90.844 17.206 165.35 82.060 194.917 169.664l75.86 224.772c10.385 30.771 15.682 63.031 15.682 95.507v299.298zM127.995 830.498l0.005 22.835c0 23.564 19.103 42.667 42.667 42.667 21.881 0 39.915-16.471 42.38-37.691l0.287-4.976c-31.088 0-60.235-8.312-85.338-22.835zM810.667 853.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667l0.047-22.86c-25.113 14.538-54.275 22.86-85.381 22.86zM884.798 485.816l-9.377-27.721c-14.717 7.389-30.81 11.914-47.416 13.217l-10.018 0.392h-611.974c-20.132 0-39.775-4.743-57.435-13.609l-9.377 27.721c-7.418 21.98-11.202 45.022-11.202 68.219v128.631c0 47.128 38.205 85.333 85.333 85.333h597.333c47.128 0 85.333-38.205 85.333-85.333v-128.631c0-23.198-3.784-46.24-11.202-68.219v0zM277.333 554.667c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64zM746.667 554.667c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64zM512 128c-40.757 0-96.603 6.602-166.994 19.935-60.562 11.471-110.233 54.707-129.944 113.11l-38.36 113.664c6.592 6.232 14.971 10.175 23.899 11.317l5.412 0.344 311.489-0.005c17.587-62.897 75.322-109.032 143.832-109.032s126.245 46.135 143.832 109.032l12.822 0.005c9.43 0 18.538-3.122 25.943-8.793l3.302-2.964-38.294-113.569c-19.711-58.403-69.382-101.639-129.945-113.11-70.391-13.333-126.236-19.934-166.993-19.934zM661.333 362.667c-20.052 0-37.95 9.222-49.685 23.656h99.37c-11.735-14.434-29.633-23.656-49.685-23.656z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "car" + ], + "defaultCode": 59664, + "id": 76 + }, + { + "paths": [ + "M512 42.667c212.077 0 384 171.923 384 384 0 133.866-72.94 242.659-213.333 323.805v102.862c0 70.692-57.308 128-128 128h-85.333c-70.692 0-128-57.308-128-128v-102.85l-12.964-7.682c-131.917-80.22-200.369-186.382-200.369-316.134 0-212.077 171.923-384 384-384zM426.667 853.333c0 23.564 19.103 42.667 42.667 42.667h85.333c23.564 0 42.667-19.103 42.667-42.667h-170.667zM512 128c-164.949 0-298.667 133.718-298.667 298.667 0 106.492 61.417 192.475 190.647 260.968 13.958 7.398 22.686 21.902 22.686 37.699v42.667h170.667v-42.667c0-15.791 8.721-30.29 22.67-37.691 129.241-68.569 190.663-154.56 190.663-260.976 0-164.949-133.718-298.667-298.667-298.667zM512 462.649l103.883-71.179c19.439-13.319 45.994-8.358 59.314 11.081 12.295 17.944 9.013 41.951-6.853 56.014l-4.227 3.299-109.45 74.968v103.168c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-103.125l-109.45-75.011c-17.944-12.295-23.551-35.868-13.831-54.711l2.751-4.603c12.295-17.944 35.868-23.551 54.711-13.831l4.603 2.751 103.883 71.179v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "lamp" + ], + "defaultCode": 59692, + "id": 77 + }, + { + "paths": [ + "M529.497 623.595l-88.75-87.702 1.28-1.28c74.24-82.773 127.147-177.92 158.293-278.613h82.347c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667h-256v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v42.667h-256.213c-23.446 0-42.453 19.007-42.453 42.453s19.007 42.453 42.453 42.453h434.133c-28.587 82.347-73.813 160.427-135.253 228.693-30.282-33.538-56.589-69.562-78.919-107.312l-7.737-13.608c-7.514-13.583-21.812-22.014-37.335-22.014h-17.235c-14.759 0-26.723 11.964-26.723 26.723 0 4.233 1.006 8.406 2.935 12.175l3.895 7.452c28.121 52.452 63.044 102.252 104.373 148.21l-186.671 184.104c-15.443 15.23-16.79 39.355-3.928 56.135l3.842 4.365c16.662 16.662 43.677 16.662 60.34 0l183.163-183.163 99.854 99.854c11.651 11.651 30.541 11.651 42.192 0 3.027-3.027 5.367-6.669 6.861-10.681l6.582-17.668c5.862-15.734 1.951-33.442-9.992-45.244zM759.765 426.667h-26.197c-17.785 0-33.705 11.032-39.95 27.685l-166.637 444.365c-5.734 15.29 2.013 32.334 17.303 38.067 3.32 1.245 6.836 1.883 10.382 1.883h13.052c17.808 0 33.743-11.060 39.972-27.744l37.429-100.256h202.667l37.807 100.373c6.261 16.622 22.166 27.627 39.928 27.627h13.145c16.33 0 29.568-13.238 29.568-29.568 0-3.546-0.638-7.062-1.883-10.382l-166.637-444.365c-6.245-16.653-22.165-27.685-39.95-27.685zM746.667 540.587l69.12 184.747h-138.24l69.12-184.747z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "language" + ], + "defaultCode": 59693, + "id": 78 + }, + { + "paths": [ + "M500.425 127.369l22.338 12.214c80.817 42.027 176.161 46.937 261.135 12.997l53.608-21.412c28.023-11.193 58.493 9.447 58.493 39.623v428.019c0 17.54-10.734 33.292-27.058 39.709l-53.573 21.059c-108.687 42.723-230.336 36.060-333.461-17.764l-22.941-12.426c-76.74-39.22-167.453-40.822-245.636-4.124l0.001 313.404c0 23.564-19.103 42.667-42.667 42.667-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-768c0-3.617 0.45-7.129 1.297-10.482l1.671-5.032c3.987-10.461 12.185-19.007 22.535-23.56l14.934-7.404c104.95-52.551 228.536-51.136 331.988 3.18zM213.376 197.233l-0.042 336.069 12.85-4.147c90.343-27.394 188.575-18.809 273.487 25.208l22.99 12.458c80.988 41.806 176.293 46.827 261.49 13.337l26.515-10.423v-335.997l-12.955 4.724c-104.085 35.929-218.538 27.261-316.108-24.108l-22.47-12.278c-76.646-39.6-167.465-41.459-245.759-4.844z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "flag" + ], + "defaultCode": 59686, + "id": 79 + }, + { + "paths": [ + "M512 682.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333zM512 426.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333zM512 170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "more" + ], + "defaultCode": 59702, + "id": 80 + }, + { + "paths": [ + "M405.333 128c153.167 0 277.333 124.166 277.333 277.333 0 61.172-19.805 117.718-53.353 163.576l211.523 211.588c16.662 16.662 16.662 43.677 0 60.34-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-211.588-211.523c-45.858 33.548-102.404 53.353-163.576 53.353-153.167 0-277.333-124.166-277.333-277.333s124.166-277.333 277.333-277.333zM405.333 213.333c-106.039 0-192 85.961-192 192s85.961 192 192 192c106.039 0 192-85.961 192-192s-85.961-192-192-192z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "search" + ], + "defaultCode": 59721, + "id": 81 + }, + { + "paths": [ + "M810.667 469.333c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-597.333c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h597.333z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "remove" + ], + "id": 82 + }, + { + "paths": [ + "M507.024 170.954l4.976-0.287c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v256h256c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-256v256c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976v-256h-256c-21.881 0-39.915-16.471-42.38-37.691l-0.287-4.976c0-21.881 16.471-39.915 37.691-42.38l4.976-0.287h256v-256c0-21.881 16.471-39.915 37.691-42.38v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "add" + ], + "defaultCode": 59651, + "id": 83 + }, + { + "paths": [ + "M200.837 524.497c-16.662-16.662-43.677-16.662-60.34 0s-16.662 43.677 0 60.34l213.333 213.333c16.662 16.662 43.677 16.662 60.34 0l469.333-469.333c16.662-16.662 16.662-43.677 0-60.34s-43.677-16.662-60.34 0l-439.163 439.163-183.163-183.163z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "check" + ], + "defaultCode": 59668, + "id": 84 + }, + { + "paths": [ + "M222.281 229.85l3.549-4.020c15.381-15.381 39.583-16.564 56.32-3.549l4.020 3.549 225.83 225.797 225.83-225.797c16.662-16.662 43.677-16.662 60.34 0s16.662 43.677 0 60.34l-225.797 225.83 225.797 225.83c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-225.83-225.797-225.83 225.797c-16.662 16.662-43.677 16.662-60.34 0s-16.662-43.677 0-60.34l225.797-225.83-225.797-225.83c-15.381-15.381-16.564-39.583-3.549-56.32v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "close" + ], + "defaultCode": 59673, + "id": 85 + }, + { + "paths": [ + "M183.163 481.83l298.667-298.667c16.662-16.662 43.677-16.662 60.34 0 15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020-225.839 225.83h494.336c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976c0 21.881-16.471 39.915-37.691 42.38l-4.976 0.287h-494.336l225.839 225.83c15.381 15.381 16.564 39.583 3.549 56.32l-3.549 4.020c-15.381 15.381-39.583 16.564-56.32 3.549l-4.020-3.549-298.667-298.667c-15.381-15.381-16.564-39.583-3.549-56.32l3.549-4.020v0z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "arrow-left" + ], + "defaultCode": 59661, + "id": 86 + }, + { + "paths": [ + "M840.837 481.83l-298.667-298.667c-16.662-16.662-43.677-16.662-60.34 0-15.381 15.381-16.564 39.583-3.549 56.32l3.549 4.020 225.839 225.83h-494.336c-21.881 0-39.915 16.471-42.38 37.691l-0.287 4.976c0 21.881 16.471 39.915 37.691 42.38l4.976 0.287h494.336l-225.839 225.83c-15.381 15.381-16.564 39.583-3.549 56.32l3.549 4.020c15.381 15.381 39.583 16.564 56.32 3.549l4.020-3.549 298.667-298.667c15.381-15.381 16.564-39.583 3.549-56.32l-3.549-4.020z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "arrow-right" + ], + "defaultCode": 59708, + "id": 87 + }, + { + "paths": [ + "M512 622.327l268.497-268.497c16.662-16.662 43.677-16.662 60.34 0s16.662 43.677 0 60.34l-298.667 298.667c-16.662 16.662-43.677 16.662-60.34 0l-298.667-298.667c-16.662-16.662-16.662-43.677 0-60.34s43.677-16.662 60.34 0l268.497 268.497z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "down" + ], + "defaultCode": 59680, + "id": 88 + }, + { + "paths": [ + "M512 401.673l268.497 268.497c16.662 16.662 43.677 16.662 60.34 0s16.662-43.677 0-60.34l-298.667-298.667c-16.662-16.662-43.677-16.662-60.34 0l-298.667 298.667c-16.662 16.662-16.662 43.677 0 60.34s43.677 16.662 60.34 0l268.497-268.497z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "up" + ], + "defaultCode": 59736, + "id": 89 + }, + { + "paths": [ + "M138.557 185.237c14.323-16.37 38.393-19.16 55.959-7.288l4.247 3.274 682.667 597.333c17.734 15.517 19.531 42.472 4.014 60.206-14.323 16.37-38.393 19.16-55.959 7.288l-4.247-3.274-113.642-99.426c-58.284 27.606-125.631 45.983-199.436 45.983-248.531 0-426.826-211.597-426.826-277.333 0-36.906 56.598-119.786 149.999-185.387l-92.761-81.17c-17.734-15.517-19.531-42.472-4.014-60.206zM341.333 512c0 94.257 76.41 170.667 170.667 170.667 35.709 0 68.857-10.967 96.258-29.716l-88.514-77.414c-2.539 0.306-5.123 0.464-7.744 0.464-35.101 0-63.602-28.257-63.996-63.265l-88.501-77.445c-11.623 23.062-18.169 49.121-18.169 76.71zM512.159 234.667c249.485 0 426.508 211.597 426.508 277.333 0 27.128-29.986 79.097-82.81 130.785l-174.596-152.787c-10.435-81.068-77.75-144.323-160.633-148.45l-9.311-0.214-106.655-93.298c34.013-8.496 69.975-13.369 107.496-13.369z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "eye-closed" + ], + "defaultCode": 59685, + "id": 90 + }, + { + "paths": [ + "M512.159 234.667c249.485 0 426.508 211.597 426.508 277.333s-176.070 277.333-426.508 277.333c-248.531 0-426.826-211.597-426.826-277.333s179.565-277.333 426.826-277.333zM512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667zM512 448c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "eye" + ], + "defaultCode": 59684, + "id": 91 + }, + { + "paths": [ + "M559.029 226.465c5.608 9.347 8.569 20.041 8.569 30.94v509.202c0 33.212-26.923 60.135-60.135 60.135-10.899 0-21.591-2.962-30.94-8.569l-160.939-96.566c-30.189-18.112-48.66-50.737-48.66-85.943v-247.32c0-35.207 18.472-67.829 48.66-85.943l160.939-96.566c28.48-17.087 65.418-7.853 82.505 20.627zM146.653 331.601c33.212 0 60.135 26.923 60.135 60.135v240.54c0 33.212-26.923 60.135-60.135 60.135s-60.135-26.923-60.135-60.135v-240.54c0-33.212 26.923-60.135 60.135-60.135zM890.126 387.174c11.655-8.211 27.865-7.177 38.382 3.18s11.805 26.55 3.778 38.329l-3.444 4.192-79.027 80.216 79.027 80.233c11.649 11.834 11.501 30.871-0.331 42.521-10.519 10.356-26.728 11.389-38.382 3.18l-4.139-3.511-78.329-79.604-78.32 79.604-4.139 3.511c-11.655 8.211-27.865 7.177-38.382-3.18s-11.805-26.55-3.778-38.329l3.444-4.192 78.953-80.233-78.953-80.216c-11.649-11.834-11.501-30.871 0.331-42.521 10.519-10.356 26.728-11.389 38.382-3.18l4.139 3.511 78.32 79.53 78.329-79.53 4.139-3.511z" + ], + "attrs": [ + {} + ], + "grid": 24, + "tags": [ + "muted-chat" + ], + "isMulticolor": false, + "isMulticolor2": false, + "defaultCode": 59741, + "id": 92 + }, + { + "paths": [ + "M411.469 284.444h201.062c25.242 0 48.73 12.547 62.788 33.293l2.254 3.533 32.21 53.683c6.287 10.479 9.938 22.301 10.672 34.454l0.138 4.571v249.724c0 41.892-33.96 75.852-75.852 75.852h-265.481c-41.892 0-75.852-33.96-75.852-75.852v-249.724c0-12.22 2.952-24.236 8.576-35.035l2.234-3.991 32.21-53.683c12.987-21.645 35.83-35.33 60.853-36.711l4.189-0.115v0zM644.741 398.222h-265.481c-20.946 0-37.926 16.98-37.926 37.926v227.556c0 20.946 16.98 37.926 37.926 37.926h265.481c20.946 0 37.926-16.98 37.926-37.926v-227.556c0-20.946-16.98-37.926-37.926-37.926zM441.702 517.554c6.836-6.836 17.592-7.362 25.031-1.578l1.786 1.578 43.48 43.48 43.48-43.48c7.405-7.405 19.412-7.405 26.818 0 6.836 6.836 7.362 17.592 1.578 25.031l-1.578 1.786-56.889 56.889c-6.836 6.836-17.592 7.362-25.031 1.578l-1.786-1.578-56.889-56.889c-7.405-7.405-7.405-19.412 0-26.818zM612.531 322.37h-201.062c-12.297 0-23.762 5.956-30.844 15.857l-1.677 2.556-12.348 20.564c4.117-0.692 8.346-1.052 12.66-1.052h265.481c4.313 0 8.543 0.36 12.66 1.052l-12.348-20.564c-6.327-10.545-17.332-17.312-29.466-18.29l-3.055-0.123z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "avatar-archived-chats" + ], + "defaultCode": 59658, + "id": 93 + }, + { + "paths": [ + "M512 265.481c104.73 0 189.63 84.9 189.63 189.63v265.481c0 16.894-20.426 25.355-32.372 13.409l-43.48-43.48-43.48 43.48c-7.405 7.405-19.412 7.405-26.818 0l-43.48-43.48-43.48 43.48c-7.405 7.405-19.412 7.405-26.818 0l-43.48-43.48-43.48 43.48c-11.946 11.946-32.372 3.485-32.372-13.409v-265.481c0-104.73 84.9-189.63 189.63-189.63zM512 303.407c-83.784 0-151.704 67.92-151.704 151.704v219.701l24.517-24.517c7.405-7.405 19.412-7.405 26.818 0l43.48 43.48 43.48-43.48c7.405-7.405 19.412-7.405 26.818 0l43.48 43.48 43.48-43.48c7.405-7.405 19.412-7.405 26.818 0l24.517 24.517v-219.701c0-83.784-67.92-151.704-151.704-151.704zM436.148 417.185c20.946 0 37.926 16.98 37.926 37.926s-16.98 37.926-37.926 37.926c-20.946 0-37.926-16.98-37.926-37.926s16.98-37.926 37.926-37.926zM587.852 417.185c20.946 0 37.926 16.98 37.926 37.926s-16.98 37.926-37.926 37.926c-20.946 0-37.926-16.98-37.926-37.926s16.98-37.926 37.926-37.926z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "avatar-deleted-account" + ], + "defaultCode": 59659, + "id": 94 + }, + { + "paths": [ + "M350.543 737.169c-12.639 7.022-28.172-2.118-28.172-16.577v-360.296c0-41.892 33.96-75.852 75.852-75.852h227.556c41.892 0 75.852 33.96 75.852 75.852v360.296c0 14.459-15.533 23.599-28.172 16.577l-161.457-89.699-161.457 89.699zM663.704 360.296c0-20.946-16.98-37.926-37.926-37.926h-227.556c-20.946 0-37.926 16.98-37.926 37.926v328.068l142.494-79.164c5.727-3.182 12.691-3.182 18.418 0l142.494 79.164v-328.068z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "avatar-saved-messages" + ], + "defaultCode": 59660, + "id": 95 + }, + { + "paths": [ + "M661.661 231.725c5.477 3.286 10.53 7.231 15.046 11.748l103.827 103.827c30.506 30.506 30.506 79.967 0 110.474-4.516 4.516-9.569 8.462-15.046 11.748l-81.664 48.998c10.87 64.852-15.506 128.818-75.883 189.195-13.83 13.83-36.252 13.83-50.082 0l-95.779-95.751-138.372 138.412c-12.677 12.677-32.575 13.734-46.456 3.169l-3.627-3.169c-12.677-12.677-13.734-32.575-3.169-46.456l3.169-3.627 138.406-138.42-95.74-95.724c-13.83-13.83-13.83-36.252 0-50.082 57.358-57.358 117.955-84.030 179.474-77.234l9.721 1.352 48.998-81.664c22.197-36.994 70.181-48.99 107.175-26.794zM615.219 294.959l-62.448 104.080c-8.54 14.233-25.819 20.625-41.565 15.376-38.301-12.767-76.998-4.313-118.378 28.105l188.658 188.658 6.165-8.241c27.286-38.296 33.856-74.389 21.94-110.137-5.249-15.746 1.143-33.026 15.376-41.565l104.815-62.953 0.668-0.591c2.847-2.847 2.847-7.463 0-10.31l-103.827-103.827-1.404-1.096c-3.452-2.071-7.93-0.952-10.002 2.5z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "pinned-chat" + ], + "defaultCode": 59714, + "id": 96 + } + ], + "height": 1024, + "metadata": { + "name": "icomoon", + "importSize": { + "width": 24, + "height": 24 + } + }, + "preferences": { + "showGlyphs": true, + "showCodes": true, + "showQuickUse": true, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "icon-", + "metadata": { + "fontFamily": "icomoon", + "majorVersion": 1, + "minorVersion": 0 + }, + "metrics": { + "emSize": 1024, + "baseline": 6.25, + "whitespace": 50 + }, + "embed": false, + "showMetrics": false, + "showSelector": false, + "showMetadata": false, + "showVersion": false, + "noie8": true, + "ie7": false + }, + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 0, + "bgColor": 16777215 + }, + "historySize": 50, + "gridSize": 16, + "showGrid": true + }, + "selection": [ + { + "order": 576, + "id": 63, + "name": "select", + "prevSize": 32, + "code": 59744, + "tempChar": "" + }, + { + "order": 480, + "id": 61, + "name": "folder", + "prevSize": 32, + "code": 59667, + "tempChar": "" + }, + { + "order": 481, + "id": 60, + "name": "bots", + "prevSize": 32, + "code": 59669, + "tempChar": "" + }, + { + "order": 482, + "id": 59, + "name": "calendar", + "prevSize": 32, + "code": 59670, + "tempChar": "" + }, + { + "order": 483, + "id": 58, + "name": "cloud-download", + "prevSize": 32, + "code": 59671, + "tempChar": "" + }, + { + "order": 484, + "id": 57, + "name": "colorize", + "prevSize": 32, + "code": 59672, + "tempChar": "" + }, + { + "order": 485, + "id": 0, + "name": "forward", + "prevSize": 32, + "code": 59687, + "tempChar": "" + }, + { + "order": 486, + "id": 43, + "name": "reply", + "prevSize": 32, + "code": 59719, + "tempChar": "" + }, + { + "order": 487, + "id": 3, + "name": "help", + "prevSize": 32, + "code": 59690, + "tempChar": "" + }, + { + "order": 488, + "id": 4, + "name": "info", + "prevSize": 32, + "code": 59691, + "tempChar": "" + }, + { + "order": 489, + "id": 54, + "name": "info-filled", + "prevSize": 32, + "code": 59675, + "tempChar": "" + }, + { + "order": 490, + "id": 1, + "name": "delete-filled", + "prevSize": 32, + "code": 59676, + "tempChar": "" + }, + { + "order": 491, + "id": 2, + "name": "delete", + "prevSize": 32, + "code": 59677, + "tempChar": "" + }, + { + "order": 492, + "id": 5, + "name": "edit", + "prevSize": 32, + "code": 59683, + "tempChar": "" + }, + { + "order": 493, + "id": 6, + "name": "new-chat-filled", + "prevSize": 32, + "code": 59705, + "tempChar": "" + }, + { + "order": 494, + "id": 7, + "name": "send", + "prevSize": 32, + "code": 59722, + "tempChar": "" + }, + { + "order": 495, + "id": 8, + "name": "send-outline", + "prevSize": 32, + "code": 59723, + "tempChar": "" + }, + { + "order": 496, + "id": 32, + "name": "add-user-filled", + "prevSize": 32, + "code": 59652, + "tempChar": "" + }, + { + "order": 497, + "id": 33, + "name": "add-user", + "prevSize": 32, + "code": 59653, + "tempChar": "" + }, + { + "order": 498, + "id": 36, + "name": "delete-user", + "prevSize": 32, + "code": 59678, + "tempChar": "" + }, + { + "order": 499, + "id": 15, + "name": "microphone", + "prevSize": 32, + "code": 59701, + "tempChar": "" + }, + { + "order": 500, + "id": 16, + "name": "microphone-alt", + "prevSize": 32, + "code": 59707, + "tempChar": "" + }, + { + "order": 501, + "id": 9, + "name": "poll", + "prevSize": 32, + "code": 59704, + "tempChar": "" + }, + { + "order": 502, + "id": 10, + "name": "revote", + "prevSize": 32, + "code": 59706, + "tempChar": "" + }, + { + "order": 503, + "id": 17, + "name": "photo", + "prevSize": 32, + "code": 59712, + "tempChar": "" + }, + { + "order": 504, + "id": 18, + "name": "document", + "prevSize": 32, + "code": 59679, + "tempChar": "" + }, + { + "order": 505, + "id": 19, + "name": "camera", + "prevSize": 32, + "code": 59662, + "tempChar": "" + }, + { + "order": 506, + "id": 20, + "name": "camera-add", + "prevSize": 32, + "code": 59663, + "tempChar": "" + }, + { + "order": 507, + "id": 21, + "name": "logout", + "prevSize": 32, + "code": 59698, + "tempChar": "" + }, + { + "order": 508, + "id": 22, + "name": "saved-messages", + "prevSize": 32, + "code": 59720, + "tempChar": "" + }, + { + "order": 509, + "id": 24, + "name": "settings", + "prevSize": 32, + "code": 59726, + "tempChar": "" + }, + { + "order": 510, + "id": 25, + "name": "phone", + "prevSize": 32, + "code": 59711, + "tempChar": "" + }, + { + "order": 511, + "id": 26, + "name": "attach", + "prevSize": 32, + "code": 59657, + "tempChar": "" + }, + { + "order": 512, + "id": 27, + "name": "copy", + "prevSize": 32, + "code": 59674, + "tempChar": "" + }, + { + "order": 513, + "id": 28, + "name": "channel", + "prevSize": 32, + "code": 59665, + "tempChar": "" + }, + { + "order": 514, + "id": 29, + "name": "group", + "prevSize": 32, + "code": 59689, + "tempChar": "" + }, + { + "order": 515, + "id": 30, + "name": "user", + "prevSize": 32, + "code": 59737, + "tempChar": "" + }, + { + "order": 516, + "id": 62, + "name": "non-contacts", + "prevSize": 32, + "code": 59688, + "tempChar": "" + }, + { + "order": 517, + "id": 31, + "name": "active-sessions", + "prevSize": 32, + "code": 59650, + "tempChar": "" + }, + { + "order": 518, + "id": 34, + "name": "admin", + "prevSize": 32, + "code": 59654, + "tempChar": "" + }, + { + "order": 519, + "id": 37, + "name": "download", + "prevSize": 32, + "code": 59681, + "tempChar": "" + }, + { + "order": 520, + "id": 38, + "name": "location", + "prevSize": 32, + "code": 59696, + "tempChar": "" + }, + { + "order": 521, + "id": 44, + "name": "stop", + "prevSize": 32, + "code": 59730, + "tempChar": "" + }, + { + "order": 523, + "id": 23, + "name": "archive", + "prevSize": 32, + "code": 59656, + "tempChar": "" + }, + { + "order": 524, + "id": 45, + "name": "unarchive", + "prevSize": 32, + "code": 59731, + "tempChar": "" + }, + { + "order": 525, + "id": 52, + "name": "readchats", + "prevSize": 32, + "code": 59699, + "tempChar": "" + }, + { + "order": 526, + "id": 49, + "name": "unread", + "prevSize": 32, + "code": 59735, + "tempChar": "" + }, + { + "order": 527, + "id": 40, + "name": "message", + "prevSize": 32, + "code": 59700, + "tempChar": "" + }, + { + "order": 528, + "id": 39, + "name": "lock", + "prevSize": 32, + "code": 59697, + "tempChar": "" + }, + { + "order": 529, + "id": 46, + "name": "unlock", + "prevSize": 32, + "code": 59732, + "tempChar": "" + }, + { + "order": 530, + "id": 41, + "name": "mute", + "prevSize": 32, + "code": 59703, + "tempChar": "" + }, + { + "order": 531, + "id": 47, + "name": "unmute", + "prevSize": 32, + "code": 59733, + "tempChar": "" + }, + { + "order": 532, + "id": 42, + "name": "pin", + "prevSize": 32, + "code": 59713, + "tempChar": "" + }, + { + "order": 533, + "id": 48, + "name": "unpin", + "prevSize": 32, + "code": 59734, + "tempChar": "" + }, + { + "order": 534, + "id": 5, + "name": "smallscreen", + "prevSize": 32, + "code": 59742, + "tempChar": "" + }, + { + "order": 535, + "id": 4, + "name": "fullscreen", + "prevSize": 32, + "code": 59743, + "tempChar": "" + }, + { + "order": 536, + "id": 0, + "name": "large-pause", + "prevSize": 32, + "code": 59694, + "tempChar": "" + }, + { + "order": 537, + "id": 1, + "name": "large-play", + "prevSize": 32, + "code": 59695, + "tempChar": "" + }, + { + "order": 538, + "id": 2, + "name": "pause", + "prevSize": 32, + "code": 59709, + "tempChar": "" + }, + { + "order": 539, + "id": 3, + "name": "play", + "prevSize": 32, + "code": 59715, + "tempChar": "" + }, + { + "order": 540, + "id": 0, + "name": "channelviews", + "prevSize": 32, + "code": 59666, + "tempChar": "" + }, + { + "order": 541, + "id": 1, + "name": "message-delivered", + "prevSize": 32, + "code": 59648, + "tempChar": "" + }, + { + "order": 542, + "id": 2, + "name": "message-read", + "prevSize": 32, + "code": 59649, + "tempChar": "" + }, + { + "order": 543, + "id": 3, + "name": "message-sending", + "prevSize": 32, + "code": 59724, + "tempChar": "" + }, + { + "order": 544, + "id": 4, + "name": "message-sending-error", + "prevSize": 32, + "code": 59725, + "tempChar": "" + }, + { + "order": 545, + "id": 13, + "name": "favorite", + "prevSize": 32, + "code": 59710, + "tempChar": "" + }, + { + "order": 546, + "id": 10, + "name": "keyboard", + "prevSize": 32, + "code": 59716, + "tempChar": "" + }, + { + "order": 547, + "id": 12, + "name": "delete-left", + "prevSize": 32, + "code": 59717, + "tempChar": "" + }, + { + "order": 548, + "id": 6, + "name": "recent", + "prevSize": 32, + "code": 59718, + "tempChar": "" + }, + { + "order": 549, + "id": 9, + "name": "gifs", + "prevSize": 32, + "code": 59727, + "tempChar": "" + }, + { + "order": 550, + "id": 11, + "name": "stickers", + "prevSize": 32, + "code": 59739, + "tempChar": "" + }, + { + "order": 551, + "id": 7, + "name": "smile", + "prevSize": 32, + "code": 59728, + "tempChar": "" + }, + { + "order": 552, + "id": 0, + "name": "animals", + "prevSize": 32, + "code": 59655, + "tempChar": "" + }, + { + "order": 553, + "id": 2, + "name": "eats", + "prevSize": 32, + "code": 59682, + "tempChar": "" + }, + { + "order": 554, + "id": 8, + "name": "sport", + "prevSize": 32, + "code": 59729, + "tempChar": "" + }, + { + "order": 555, + "id": 1, + "name": "car", + "prevSize": 32, + "code": 59664, + "tempChar": "" + }, + { + "order": 556, + "id": 4, + "name": "lamp", + "prevSize": 32, + "code": 59692, + "tempChar": "" + }, + { + "order": 557, + "id": 5, + "name": "language", + "prevSize": 32, + "code": 59693, + "tempChar": "" + }, + { + "order": 558, + "id": 3, + "name": "flag", + "prevSize": 32, + "code": 59686, + "tempChar": "" + }, + { + "order": 559, + "id": 0, + "name": "more", + "prevSize": 32, + "code": 59702, + "tempChar": "" + }, + { + "order": 560, + "id": 1, + "name": "search", + "prevSize": 32, + "code": 59721, + "tempChar": "" + }, + { + "order": 561, + "id": 9, + "name": "remove", + "prevSize": 32, + "code": 59740, + "tempChar": "" + }, + { + "order": 562, + "id": 2, + "name": "add", + "prevSize": 32, + "code": 59651, + "tempChar": "" + }, + { + "order": 563, + "id": 3, + "name": "check", + "prevSize": 32, + "code": 59668, + "tempChar": "" + }, + { + "order": 564, + "id": 4, + "name": "close", + "prevSize": 32, + "code": 59673, + "tempChar": "" + }, + { + "order": 565, + "id": 5, + "name": "arrow-left", + "prevSize": 32, + "code": 59661, + "tempChar": "" + }, + { + "order": 566, + "id": 6, + "name": "arrow-right", + "prevSize": 32, + "code": 59708, + "tempChar": "" + }, + { + "order": 567, + "id": 7, + "name": "down", + "prevSize": 32, + "code": 59680, + "tempChar": "" + }, + { + "order": 568, + "id": 8, + "name": "up", + "prevSize": 32, + "code": 59736, + "tempChar": "" + }, + { + "order": 569, + "id": 20, + "name": "eye-closed", + "prevSize": 32, + "code": 59685, + "tempChar": "" + }, + { + "order": 570, + "id": 19, + "name": "eye", + "prevSize": 32, + "code": 59684, + "tempChar": "" + }, + { + "order": 571, + "id": 4, + "name": "muted-chat", + "prevSize": 32, + "code": 59741, + "tempChar": "" + }, + { + "order": 572, + "id": 0, + "name": "avatar-archived-chats", + "prevSize": 32, + "code": 59658, + "tempChar": "" + }, + { + "order": 573, + "id": 1, + "name": "avatar-deleted-account", + "prevSize": 32, + "code": 59659, + "tempChar": "" + }, + { + "order": 574, + "id": 2, + "name": "avatar-saved-messages", + "prevSize": 32, + "code": 59660, + "tempChar": "" + }, + { + "order": 575, + "id": 3, + "name": "pinned-chat", + "prevSize": 32, + "code": 59714, + "tempChar": "" + } + ], + "prevSize": 32, + "id": 1, + "invisible": false, + "colorThemes": [] + } + ], + "preferences": { + "showGlyphs": true, + "showCodes": true, + "showQuickUse": true, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "icon-", + "metadata": { + "fontFamily": "icomoon", + "majorVersion": 1, + "minorVersion": 0 + }, + "metrics": { + "emSize": 1024, + "baseline": 6.25, + "whitespace": 50 + }, + "embed": false, + "showMetrics": false, + "showSelector": false, + "showMetadata": false, + "showVersion": false, + "noie8": true, + "ie7": false + }, + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 0, + "bgColor": 16777215 + }, + "historySize": 50, + "gridSize": 16, + "showGrid": true + }, + "uid": -1 +} \ No newline at end of file diff --git a/src/styles/_common.scss b/src/styles/_common.scss new file mode 100644 index 000000000..46daa7c90 --- /dev/null +++ b/src/styles/_common.scss @@ -0,0 +1,96 @@ +// Common styles for all media-type components across the app. +.media-inner { + position: relative; + + video, + img { + display: block; + } + + img, video { + object-fit: cover; + } + + video { + background: no-repeat 50% 50%; + background-size: contain; + } + + .thumbnail ~ .full-media, .media-loading { + position: absolute; + } + + .thumbnail { + &.empty { + visibility: hidden; + } + } +} + +.animated-close-icon { + position: absolute; + transform: rotate(-45deg); + + &, &::before, &::after { + width: 1.125rem; + height: 0.125rem; + border-radius: 0.125rem; + background-color: var(--color-text-secondary); + transition: transform var(--slide-transition); + } + + &::before, &::after { + position: absolute; + left: 0; + top: 0; + content: ''; + } + + &::before { + transform: rotate(90deg); + } + + &.no-transition { + &, &::before, &::after { + transition: none; + } + } + + &.state-back { + transform: rotate(180deg); + + &::before { + transform: rotate(45deg) scaleX(0.75) translate(0, -0.375rem); + } + + &::after { + transform: rotate(-45deg) scaleX(0.75) translate(0, 0.375rem); + } + } +} + +// Used by ChatList and ContactList components +.chat-list { + height: 100%; + overflow-y: auto; + padding: 0 .125rem .5rem .4375rem; + + .scroll-container { + position: relative; + } + + .ListItem.chat-item-clickable { + margin: 0; + } + + @media (max-width: 600px) { + padding-left: 0; + padding-right: 0; + } + + .no-results { + color: var(--color-text-meta); + margin-top: 2rem; + text-align: center; + } +} diff --git a/src/styles/_forms.scss b/src/styles/_forms.scss new file mode 100644 index 000000000..d5ca35059 --- /dev/null +++ b/src/styles/_forms.scss @@ -0,0 +1,157 @@ +.input-group { + position: relative; + margin-bottom: 1.5rem; + + label { + display: block; + padding: 0 0.25rem; + position: absolute; + left: 0.75rem; + top: 0.95rem; + background-color: var(--color-background); + font-size: 1rem; + font-weight: 400; + color: var(--color-placeholders); + transition: transform 0.15s ease-out, color .15s ease-out; + cursor: text; + pointer-events: none; + transform-origin: left center; + white-space: nowrap; + } + + &.with-arrow { + &::after { + content: ''; + position: absolute; + height: .75rem; + width: .75rem; + border-left: 1px var(--color-text-secondary) solid; + border-bottom: 1px var(--color-text-secondary) solid; + transform: rotate(-45deg); + right: 2rem; + top: 1rem; + } + } + + &.touched label, + &.error label, + &.success label, + .form-control:focus + label, + .form-control.focus + label { + transform: scale(.75) translate(-0.5rem, -2.25rem); + } + + input::placeholder, + .form-control::placeholder { + color: var(--color-placeholders); + } + + &.touched label { + color: var(--color-text-secondary); + } + + &.error label { + color: var(--color-error) !important; + } + + &.success label { + color: var(--color-text-green) !important; + } + + &.disabled { + opacity: 0.5; + pointer-events: none; + } +} + +.form-control { + --border-width: 1px; + display: block; + width: 100%; + height: 3.375rem; + padding: calc(0.75rem - var(--border-width)) calc(.9rem - var(--border-width)); + border: var(--border-width) solid var(--color-borders); + border-radius: var(--border-radius-default); + color: var(--color-text); + outline: none; + transition: border-color 0.15s ease; + word-break: break-word; + -webkit-appearance: none; + + font-size: 1rem; + line-height: 1.25rem; + + &:hover { + border-color: var(--color-gray); + } + + &:focus, + &.focus { + border-color: var(--color-primary); + box-shadow: inset 0 0 0 1px var(--color-primary); + caret-color: var(--color-primary); + + & + label { + color: var(--color-primary); + } + } + + &:disabled { + background: none !important; + } + + .error & { + border-color: var(--color-error); + box-shadow: inset 0 0 0 1px var(--color-error); + caret-color: var(--color-error); + } + + .success & { + border-color: var(--color-text-green); + box-shadow: inset 0 0 0 1px var(--color-text-green); + caret-color: var(--color-text-green); + } +} + +select.form-control { + option { + line-height: 2rem; + } +} + +textarea.form-control { + resize: none; + overflow: hidden; + line-height: 1.3125rem; + padding-top: calc(1rem - var(--border-width)); + padding-bottom: calc(1rem - var(--border-width)); +} + +.input-group.password-input { + position: relative; + + .form-control { + padding-right: 3.375rem; + } + + .toggle-password { + position: absolute; + top: 0; + right: 0; + width: 3.375rem; + height: 3.375rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + outline: none !important; + + color: var(--color-text-secondary); + opacity: 0.7; + font-size: 1.5rem; + + &:hover, &:focus { + opacity: 1; + } + } +} diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss new file mode 100644 index 000000000..e7df068f1 --- /dev/null +++ b/src/styles/_mixins.scss @@ -0,0 +1,6 @@ +// @optimization +@mixin while-transition() { + .Transition > div:not(.active) &, body.animating-right-column & { + @content; + } +} diff --git a/src/styles/_spacing.scss b/src/styles/_spacing.scss new file mode 100644 index 000000000..079bd76ff --- /dev/null +++ b/src/styles/_spacing.scss @@ -0,0 +1,39 @@ +$spacer: 1rem !default; +$spacers: () !default; +$spacers: map-merge( + ( + 0: 0, + 1: ($spacer * .25), + 2: ($spacer * .5), + 3: $spacer, + 4: ($spacer * 1.5), + 5: ($spacer * 2), + 6: ($spacer * 3), + ), + $spacers +); + +// Margin and Padding + +@each $prop, $abbrev in (margin: m, padding: p) { + @each $size, $length in $spacers { + + .#{$abbrev}-#{$size} { #{$prop}: $length !important; } + .#{$abbrev}t-#{$size}, + .#{$abbrev}y-#{$size} { + #{$prop}-top: $length !important; + } + .#{$abbrev}r-#{$size}, + .#{$abbrev}x-#{$size} { + #{$prop}-right: $length !important; + } + .#{$abbrev}b-#{$size}, + .#{$abbrev}y-#{$size} { + #{$prop}-bottom: $length !important; + } + .#{$abbrev}l-#{$size}, + .#{$abbrev}x-#{$size} { + #{$prop}-left: $length !important; + } + } +} diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss new file mode 100644 index 000000000..2e805f692 --- /dev/null +++ b/src/styles/_variables.scss @@ -0,0 +1,197 @@ +@function toRGB($color) { + @return red($color) + ", " + green($color) + ", " + blue($color); +} + +@function blend-normal ($foreground, $background) { + $opacity: opacity($foreground); + $background-opacity: opacity($background); + + // calculate opacity + $bm-red: red($foreground) * $opacity + red($background) * $background-opacity * (1 - $opacity); + $bm-green: green($foreground) * $opacity + green($background) * $background-opacity * (1 - $opacity); + $bm-blue: blue($foreground) * $opacity + blue($background) * $background-opacity * (1 - $opacity); + @return rgb($bm-red, $bm-green, $bm-blue); +} + +$color-primary: #50a2e9; + +$color-links: #52a1ef; + +$color-placeholders: #A2ACB4; + +$color-text-green: #4fae4e; +$color-green: #4dcd5e; +$color-light-green: #eefedf; + +$color-error: #e53935; + +$color-warning: #fb8c00; + +$color-yellow: #FDD764; + +$color-white: #ffffff; +$color-black: #000000; +$color-dark-gray: #2e3939; +$color-gray: #c4c9cc; +$color-text-secondary: #707579; +$color-text-meta: #686c72; +$color-borders: #dadce0; +$color-chat-hover: #f4f4f5; +$color-chat-active: #ededed; +$color-selection: #3993fb; + +// https://github.com/telegramdesktop/tdesktop/wiki/Theme-Reference#user-content-standard-color-constants +// Colors borrowed from https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/Resources/day-blue.tdesktop-theme +// historyPeer[1-8]UserpicBg +$color-user-1: #E17076; +$color-user-2: #7BC862; +//$color-user-3: #E5CA77; +$color-user-4: #65aadd; +$color-user-5: #a695e7; +$color-user-6: #ee7aae; +$color-user-7: #6ec9cb; +$color-user-8: #faa774; + +:root { + --color-background: #{$color-white}; + --color-background-selected: #f4f4f5; + --color-background-own: #{$color-light-green}; + --color-background-own-selected: #{darken($color-light-green, 10%)}; + --color-background-own-rgb: #{toRGB($color-light-green)}; + --color-text: #{$color-black}; + --color-text-lighter: #{$color-dark-gray}; + --color-text-secondary: #{$color-text-secondary}; + --color-text-secondary-rgb: #{toRGB($color-text-secondary)}; + --color-text-meta: #{$color-text-meta}; + --color-text-meta-rgb: #{toRGB($color-text-meta)}; + --color-text-green: #{$color-text-green}; + --color-text-green-rgb: #{toRGB($color-text-green)}; + --color-borders: #{$color-borders}; + --color-webpage-initial-background: #{$color-dark-gray}; + --color-interactive-active: var(--color-primary); + --color-interactive-inactive: rgba(var(--color-text-secondary-rgb), 0.25); + --color-interactive-buffered: rgba(var(--color-text-secondary-rgb), 0.25); // Overlays underlying inactive element + + --color-primary: #{$color-primary}; + --color-primary-rgb: #{toRGB($color-primary)}; + --color-primary-shade: #{mix($color-primary, $color-black, 92%)}; + --color-primary-shade-darker: #{mix($color-primary, $color-black, 84%)}; + --color-primary-shade-rgb: #{toRGB(mix($color-primary, $color-black, 92%))}; + + --color-green: #{$color-green}; + --color-green-darker: #{mix($color-green, $color-black, 84%)}; + + --color-error: #{$color-error}; + --color-error-shade: #{mix($color-error, $color-black, 92%)}; + --color-error-rgb: #{toRGB($color-error)}; + + --color-warning: #{$color-warning}; + + --color-yellow: #{$color-yellow}; + + --color-links: #{$color-links}; + --color-links-hover: #{darken($color-links, 8%)}; + --color-links-darker: #{darken($color-links, 15%)}; + --color-links-darker-hover: #{darken($color-links, 23%)}; + + --color-placeholders: #{$color-placeholders}; + + --color-code: #4a729a; + --color-code-bg: #{rgba($color-text-secondary, .08)}; + --color-code-own: #3c7940; + --color-code-own-bg: #{rgba($color-text-secondary, .08)}; + + --color-reply-hover: #{blend-normal(rgba($color-text-secondary, 0.08), $color-white)}; + --color-reply-active: #{blend-normal(rgba($color-text-secondary, 0.16), $color-white)}; + --color-reply-own-hover: #{blend-normal(rgba($color-text-green, 0.12), $color-light-green)}; + --color-reply-own-active: #{blend-normal(rgba($color-text-green, 0.24), $color-light-green)}; + + --color-white: #{$color-white}; + --color-gray: #{$color-gray}; + + --color-chat-hover: #{$color-chat-hover}; + --color-chat-active: #{$color-chat-active}; + + --color-selection-highlight: #{$color-selection}; + --color-selection-highlight-emoji: rgba(#{toRGB($color-selection)}, .7); + + --color-user-1: #{$color-user-1}; + --color-user-2: #{$color-user-2}; + --color-user-4: #{$color-user-4}; + --color-user-5: #{$color-user-5}; + --color-user-6: #{$color-user-6}; + --color-user-7: #{$color-user-7}; + --color-user-8: #{$color-user-8}; + + --border-radius-default: 0.75rem; + --border-radius-default-small: 0.625rem; + --border-radius-default-tiny: 0.375rem; + --border-radius-messages: 0.75rem; + --border-radius-messages-small: 0.375rem; + --messages-container-width: 45.5rem; + --right-column-width: 26.5rem; + --header-height: 3.625rem; + + --symbol-menu-width: 26.25rem; + --symbol-menu-height: 23.25rem; + --symbol-menu-footer-height: 3rem; + + @media (min-width: 1276px) and (max-width: 1680px) { + --right-column-width: 25vw; + } + + @media (max-width: 600px) { + --right-column-width: 100vw; + --header-height: 3.5rem; + --symbol-menu-width: 100vw; + --symbol-menu-height: 14.6875rem; + } + + --z-ui-loader-mask: 2000; + --z-right-column: 900; + --z-header-menu: 990; + --z-header-menu-backdrop: 980; + --z-modal: 1000; + --z-media-viewer: 1500; + --z-drop-area: 55; + --z-notification: 50; + --z-animation-fade: 50; + --z-menu-bubble: 21; + --z-menu-backdrop: 20; + --z-message-highlighted: 13; + --z-message-context-menu: 12; + --z-mobile-search: 11; + --z-middle-header: 10; + --z-middle-footer: 10; + --z-country-code-input-group: 10; + --z-message-select-control: 9; + --z-message-select-area: 8; + --z-sticky-date: 9; + --z-register-add-avatar: 5; + --z-media-viewer-head: 3; + --z-below: -1; + + --spinner-white-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==); + --spinner-white-thin-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxVjBDNS40IDAgMCA1LjQgMCAxMnM1LjQgMTIgMTIgMTIgMTItNS40IDEyLTEyaC0xYzAgNi4xLTQuOSAxMS0xMSAxMXoiLz48L3N2Zz4=); + --spinner-blue-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRlYTRmNiIvPjwvc3ZnPg==); + --spinner-black-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzJlMzkzOSIvPjwvc3ZnPg==); + --spinner-green-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzRmYWU0ZSIvPjwvc3ZnPg==); + --spinner-gray-data: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwLjggMjIuNEM2IDIxLjkgMi4xIDE4IDEuNiAxMy4yLjkgNy4xIDUuNCAxLjkgMTEuMyAxLjVjLjQgMCAuNy0uMy43LS43IDAtLjQtLjQtLjgtLjgtLjhDNC44LjQtLjIgNS45IDAgMTIuNS4yIDE4LjYgNS40IDIzLjggMTEuNSAyNGM2LjYuMiAxMi00LjggMTIuNC0xMS4yIDAtLjQtLjMtLjgtLjgtLjgtLjQgMC0uNy4zLS43LjctLjMgNS45LTUuNSAxMC40LTExLjYgOS43eiIgZmlsbD0iIzcwNzU3OSIvPjwvc3ZnPg==); + + --drag-target-border: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%23DDDFE0' stroke-width='4' stroke-dasharray='9.1%2c 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3e%3c/svg%3e"); + --drag-target-border-hovered: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2363A2E3' stroke-width='4' stroke-dasharray='9.1%2c 10.5' stroke-dashoffset='3' stroke-linecap='round'/%3e%3c/svg%3e"); + + --layer-transition: 300ms cubic-bezier(0.33, 1, 0.68, 1); + --layer-blackout-opacity: 0.3; + + --slide-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1); + + --select-transition: 200ms ease-out; + + // For some reason these parameters cause worse animation in desktop Chrome + @media (max-width: 600px) { + --layer-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1); + } + + --vh: 1vh; +} diff --git a/src/styles/icons.scss b/src/styles/icons.scss new file mode 100644 index 000000000..2b36d9d95 --- /dev/null +++ b/src/styles/icons.scss @@ -0,0 +1,399 @@ +@font-face { + font-family: 'icomoon'; + src: url('../assets/fonts/icomoon.woff2?7tsg0v') format('woff2'), + url('../assets/fonts/icomoon.woff?7tsg0v') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-darkmode:before { + content: "\e979"; +} +.icon-animations:before { + content: "\e97a"; +} +.icon-enter:before { + content: "\e97b"; +} +.icon-fontsize:before { + content: "\e97c"; +} +.icon-permissions:before { + content: "\e976"; +} +.icon-card:before { + content: "\e977"; +} +.icon-truck:before { + content: "\e978"; +} +.icon-share-filled:before { + content: "\e95a"; +} +.icon-bold:before { + content: "\e961"; +} +.icon-bot-command:before { + content: "\e962"; +} +.icon-calendar-filter:before { + content: "\e963"; +} +.icon-comments:before { + content: "\e964"; +} +.icon-comments-sticker:before { + content: "\e965"; +} +.icon-arrow-down:before { + content: "\e966"; +} +.icon-email:before { + content: "\e967"; +} +.icon-italic:before { + content: "\e968"; +} +.icon-link:before { + content: "\e969"; +} +.icon-mention:before { + content: "\e96a"; +} +.icon-monospace:before { + content: "\e96b"; +} +.icon-next:before { + content: "\e96c"; +} +.icon-password-off:before { + content: "\e96d"; +} +.icon-pin-list:before { + content: "\e96e"; +} +.icon-previous:before { + content: "\e96f"; +} +.icon-replace:before { + content: "\e970"; +} +.icon-schedule:before { + content: "\e971"; +} +.icon-strikethrough:before { + content: "\e972"; +} +.icon-underlined:before { + content: "\e973"; +} +.icon-zoom-in:before { + content: "\e974"; +} +.icon-zoom-out:before { + content: "\e975"; +} +.icon-select:before { + content: "\e960"; +} +.icon-folder:before { + content: "\e913"; +} +.icon-bots:before { + content: "\e915"; +} +.icon-calendar:before { + content: "\e916"; +} +.icon-cloud-download:before { + content: "\e917"; +} +.icon-colorize:before { + content: "\e918"; +} +.icon-forward:before { + content: "\e927"; +} +.icon-reply:before { + content: "\e947"; +} +.icon-help:before { + content: "\e92a"; +} +.icon-info:before { + content: "\e92b"; +} +.icon-info-filled:before { + content: "\e91b"; +} +.icon-delete-filled:before { + content: "\e91c"; +} +.icon-delete:before { + content: "\e91d"; +} +.icon-edit:before { + content: "\e923"; +} +.icon-new-chat-filled:before { + content: "\e939"; +} +.icon-send:before { + content: "\e94a"; +} +.icon-send-outline:before { + content: "\e94b"; +} +.icon-add-user-filled:before { + content: "\e904"; +} +.icon-add-user:before { + content: "\e905"; +} +.icon-delete-user:before { + content: "\e91e"; +} +.icon-microphone:before { + content: "\e935"; +} +.icon-microphone-alt:before { + content: "\e93b"; +} +.icon-poll:before { + content: "\e938"; +} +.icon-revote:before { + content: "\e93a"; +} +.icon-photo:before { + content: "\e940"; +} +.icon-document:before { + content: "\e91f"; +} +.icon-camera:before { + content: "\e90e"; +} +.icon-camera-add:before { + content: "\e90f"; +} +.icon-logout:before { + content: "\e932"; +} +.icon-saved-messages:before { + content: "\e948"; +} +.icon-settings:before { + content: "\e94e"; +} +.icon-phone:before { + content: "\e93f"; +} +.icon-attach:before { + content: "\e909"; +} +.icon-copy:before { + content: "\e91a"; +} +.icon-channel:before { + content: "\e911"; +} +.icon-group:before { + content: "\e929"; +} +.icon-user:before { + content: "\e959"; +} +.icon-non-contacts:before { + content: "\e928"; +} +.icon-active-sessions:before { + content: "\e902"; +} +.icon-admin:before { + content: "\e906"; +} +.icon-download:before { + content: "\e921"; +} +.icon-location:before { + content: "\e930"; +} +.icon-stop:before { + content: "\e952"; +} +.icon-archive:before { + content: "\e908"; +} +.icon-unarchive:before { + content: "\e953"; +} +.icon-readchats:before { + content: "\e933"; +} +.icon-unread:before { + content: "\e957"; +} +.icon-message:before { + content: "\e934"; +} +.icon-lock:before { + content: "\e931"; +} +.icon-unlock:before { + content: "\e954"; +} +.icon-mute:before { + content: "\e937"; +} +.icon-unmute:before { + content: "\e955"; +} +.icon-pin:before { + content: "\e941"; +} +.icon-unpin:before { + content: "\e956"; +} +.icon-smallscreen:before { + content: "\e95e"; +} +.icon-fullscreen:before { + content: "\e95f"; +} +.icon-large-pause:before { + content: "\e92e"; +} +.icon-large-play:before { + content: "\e92f"; +} +.icon-pause:before { + content: "\e93d"; +} +.icon-play:before { + content: "\e943"; +} +.icon-channelviews:before { + content: "\e912"; +} +.icon-message-succeeded:before { + content: "\e900"; +} +.icon-message-read:before { + content: "\e901"; +} +.icon-message-pending:before { + content: "\e94c"; +} +.icon-message-failed:before { + content: "\e94d"; +} +.icon-favorite:before { + content: "\e93e"; +} +.icon-keyboard:before { + content: "\e944"; +} +.icon-delete-left:before { + content: "\e945"; +} +.icon-recent:before { + content: "\e946"; +} +.icon-gifs:before { + content: "\e94f"; +} +.icon-stickers:before { + content: "\e95b"; +} +.icon-smile:before { + content: "\e950"; +} +.icon-animals:before { + content: "\e907"; +} +.icon-eats:before { + content: "\e922"; +} +.icon-sport:before { + content: "\e951"; +} +.icon-car:before { + content: "\e910"; +} +.icon-lamp:before { + content: "\e92c"; +} +.icon-language:before { + content: "\e92d"; +} +.icon-flag:before { + content: "\e926"; +} +.icon-more:before { + content: "\e936"; +} +.icon-search:before { + content: "\e949"; +} +.icon-remove:before { + content: "\e95c"; +} +.icon-add:before { + content: "\e903"; +} +.icon-check:before { + content: "\e914"; +} +.icon-close:before { + content: "\e919"; +} +.icon-arrow-left:before { + content: "\e90d"; +} +.icon-arrow-right:before { + content: "\e93c"; +} +.icon-down:before { + content: "\e920"; +} +.icon-up:before { + content: "\e958"; +} +.icon-eye-closed:before { + content: "\e925"; +} +.icon-eye:before { + content: "\e924"; +} +.icon-muted-chat:before { + content: "\e95d"; +} +.icon-avatar-archived-chats:before { + content: "\e90a"; +} +.icon-avatar-deleted-account:before { + content: "\e90b"; +} +.icon-avatar-saved-messages:before { + content: "\e90c"; +} +.icon-pinned-chat:before { + content: "\e942"; +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 000000000..71f8cd05e --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,203 @@ +@import 'reboot'; +@import 'variables'; +@import 'mixins'; +@import 'spacing'; +@import 'forms'; +@import 'icons'; +@import 'common'; +@import '../assets/fonts/roboto.css'; + +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeSpeed; +} + +html, body { + width: 100%; + height: 100%; + background: var(--color-background); + margin: 0; + padding: 0; + font-size: 16px; + font-family: Roboto, "Helvetica Neue", "Apple Color Emoji", sans-serif; + color: var(--color-text); + overflow: hidden; + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100); + } +} + +body.cursor-grabbing, body.cursor-grabbing * { + cursor: grabbing !important; +} + +#root { + height: 100%; + max-width: 1680px; + margin: 0 auto; + @media (max-width: 600px) { + height: calc(var(--vh, 1vh) * 100); + } +} + +#middle-column-portals, +#portals { + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.hidden { + visibility: hidden; +} + +.no-selection { + user-select: none; + -webkit-user-select: none !important; +} + +/* + See the article for more information on this visually-hidden pattern. + https://snook.ca/archives/html_and_css/hiding-content-for-accessibility +*/ +.visually-hidden { + position: absolute !important; + width: 0; + height: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + z-index: -1; +} + +.not-implemented { + opacity: 0.5; + + &, & * { + cursor: not-allowed !important; + } +} + +* { + box-sizing: border-box; +} + +.custom-scroll, +.custom-scroll-x { + scrollbar-width: thin; + scrollbar-color: rgba(90, 90, 90, 0) transparent; + transition: scrollbar-color .3s ease; + + -webkit-overflow-scrolling: touch; + // Fix scroll lock on iOS + pointer-events: auto; + + &::-webkit-scrollbar-thumb { + background-color: rgba(90, 90, 90, 0); + border-radius: 0.35rem; + } + + &:hover, &:focus, &:focus-within { + scrollbar-color: rgba(90, 90, 90, 0.3) transparent; + + &::-webkit-scrollbar-thumb { + background-color: rgba(90, 90, 90, 0.3); + } + } +} + +.custom-scroll { + &::-webkit-scrollbar { + width: .375rem; + } +} + +.custom-scroll-x { + &::-webkit-scrollbar { + height: .35rem; + } +} + +.no-scrollbar { + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } +} + +.emoji-small { + background: no-repeat; + background-size: 1.25rem; + color: transparent; + display: inline-block; + width: 1.25rem; + height: 1.25rem; + margin-right: 1px; + overflow: hidden; + + &::selection { + background-color: var(--color-selection-highlight-emoji); + color: transparent; + } +} + +div[role="button"] { + outline: none !important; + cursor: pointer; +} + +.opacity-transition { + opacity: 1; + transition: opacity .15s ease; + + &:not(.open) { + opacity: 0; + } + + &:not(.shown) { + display: none; + } + + &.slow { + transition-duration: .3s; + } +} + +.color-primary { + color: var(--color-primary) !important; +} + +.color-danger { + color: var(--color-error) !important; +} + +.text-muted { + color: var(--color-text-secondary) !important; +} + +@keyframes grow-icon { + 0% { + transform: scale(0.5); + opacity: .8; + } + 50% { + transform: scale(1.1); + opacity: 1; + } + 100% { + transform: scale(1); + } +} + +@keyframes hide-icon { + from { + transform: scale(1); + opacity: .4; + } + to { + transform: scale(.5); + opacity: 0; + } +} diff --git a/src/styles/reboot.css b/src/styles/reboot.css new file mode 100644 index 000000000..7a0e44731 --- /dev/null +++ b/src/styles/reboot.css @@ -0,0 +1,329 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +@-ms-viewport { + width: device-width; +} +article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: none !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 500; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +dfn { + font-style: italic; +} + +b, +strong { + font-weight: 500; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: theme-color("primary"); + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +a, +area, +button, +[role="button"], +input:not([type="range"]), +label, +select, +summary, +textarea { + touch-action: manipulation; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #868e96; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: .5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 000000000..803a00131 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,270 @@ +import { + ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress, +} from '../api/types'; + +export enum LoadMoreDirection { + Backwards, + Forwards, + Around, +} + +export enum FocusDirection { + Up, + Down, + Static, +} + +export interface IAlbum { + albumId: string; + messages: ApiMessage[]; + mainMessage: ApiMessage; +} + +export interface ISettings extends Record { + messageTextSize: number; + customBackground?: string; + isBackgroundBlurred?: boolean; + animationLevel: 0 | 1 | 2; + messageSendKeyCombo: 'enter' | 'ctrl-enter'; + shouldAutoDownloadMediaFromContacts: boolean; + shouldAutoDownloadMediaInPrivateChats: boolean; + shouldAutoDownloadMediaInGroups: boolean; + shouldAutoDownloadMediaInChannels: boolean; + shouldAutoPlayGifs: boolean; + shouldAutoPlayVideos: boolean; + shouldSuggestStickers: boolean; + shouldLoopStickers: boolean; + hasPassword?: boolean; + hasPrivateChatsNotifications?: boolean; + hasPrivateChatsMessagePreview?: boolean; + hasGroupNotifications?: boolean; + hasGroupMessagePreview?: boolean; + hasBroadcastNotifications?: boolean; + hasBroadcastMessagePreview?: boolean; + hasContactJoinedNotifications?: boolean; + languages?: ApiLanguage[]; + language: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk'; +} + +export interface ApiPrivacySettings { + visibility: PrivacyVisibility; + allowUserIds: number[]; + allowChatIds: number[]; + blockUserIds: number[]; + blockChatIds: number[]; +} + +export interface IInputPrivacyContact { + id: number; + accessHash?: string; +} + +export interface IInputPrivacyRules { + visibility: PrivacyVisibility; + allowedUsers?: IInputPrivacyContact[]; + allowedChats?: IInputPrivacyContact[]; + blockedUsers?: IInputPrivacyContact[]; + blockedChats?: IInputPrivacyContact[]; +} + +export type IAnchorPosition = { + x: number; + y: number; +}; + +export interface ShippingOption { + id: string; + title: string; + amount: number; + prices: Price[]; +} + +export interface Price { + label: string; + amount: number; +} + +export interface Invoice { + currency?: string; + emailRequested?: boolean; + emailToProvider?: boolean; + flexible?: boolean; + nameRequested?: boolean; + phoneRequested?: boolean; + phoneToProvider?: boolean; + prices?: Price[]; + shippingAddressRequested?: boolean; + test?: boolean; +} + +export interface Receipt { + currency: string; + prices: Price[]; + info?: { + shippingAddress?: ApiShippingAddress; + phone?: string; + name?: string; + }; + totalAmount: number; + credentialsTitle: string; + shippingPrices?: Price[]; + shippingMethod?: string; + photoUrl?: string; + text?: string; + title?: string; +} + +export enum SettingsScreens { + Main, + EditProfile, + Notifications, + Language, + General, + GeneralChatBackground, + GeneralChatBackgroundColor, + Privacy, + PrivacyPhoneNumber, + PrivacyLastSeen, + PrivacyProfilePhoto, + PrivacyForwarding, + PrivacyGroupChats, + PrivacyPhoneNumberAllowedContacts, + PrivacyPhoneNumberDeniedContacts, + PrivacyLastSeenAllowedContacts, + PrivacyLastSeenDeniedContacts, + PrivacyProfilePhotoAllowedContacts, + PrivacyProfilePhotoDeniedContacts, + PrivacyForwardingAllowedContacts, + PrivacyForwardingDeniedContacts, + PrivacyGroupChatsAllowedContacts, + PrivacyGroupChatsDeniedContacts, + PrivacyActiveSessions, + PrivacyBlockedUsers, + Folders, + FoldersCreateFolder, + FoldersEditFolder, + FoldersIncludedChats, + FoldersExcludedChats, + TwoFaDisabled, + TwoFaNewPassword, + TwoFaNewPasswordConfirm, + TwoFaNewPasswordHint, + TwoFaNewPasswordEmail, + TwoFaNewPasswordEmailCode, + TwoFaEnabled, + TwoFaChangePasswordCurrent, + TwoFaChangePasswordNew, + TwoFaChangePasswordConfirm, + TwoFaChangePasswordHint, + TwoFaTurnOff, + TwoFaRecoveryEmailCurrentPassword, + TwoFaRecoveryEmail, + TwoFaRecoveryEmailCode, + TwoFaCongratulations, +} + +export type StickerSetOrRecent = Pick; + +export enum LeftColumnContent { + ChatList, + GlobalSearch, + Settings, + Contacts, + Archived, + NewChannelStep1, + NewChannelStep2, + NewGroupStep1, + NewGroupStep2, +} + +export enum GlobalSearchContent { + ChatList, + Media, + Links, + Files, + Music, + Voice, +} + +export enum RightColumnContent { + ChatInfo, + UserInfo, + Search, + Management, + Statistics, + StickerSearch, + GifSearch, + PollResults, +} + +export enum MediaViewerOrigin { + Inline, + ScheduledInline, + SharedMedia, + ProfileAvatar, + MiddleHeaderAvatar, + Album, + ScheduledAlbum, + SearchResult, +} + +export enum ChatCreationProgress { + Idle, + InProgress, + Complete, + Error, +} + +export enum ProfileEditProgress { + Idle, + InProgress, + Complete, + Error, +} + +export enum ManagementProgress { + Idle, + InProgress, + Complete, + Error, +} + +export type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio'; +export type SharedMediaType = 'media' | 'documents' | 'links' | 'audio'; +export type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite'; +export type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody'; + +export enum ProfileState { + Profile, + SharedMedia, + MemberList, +} + +export enum PaymentStep { + ShippingInfo, + Shipping, + PaymentInfo, + Checkout +} + +export const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG'; + +export enum ManagementScreens { + Initial, + ChatPrivacyType, + Discussion, + ChannelSubscribers, + GroupType, + GroupPermissions, + GroupRemovedUsers, + GroupUserPermissionsCreate, + GroupUserPermissions, + ChatAdministrators, + GroupRecentActions, + ChatAdminRights, + GroupMembers, +} + +export type ManagementType = 'user' | 'group' | 'channel'; diff --git a/src/util/WorkerConnector.ts b/src/util/WorkerConnector.ts new file mode 100644 index 000000000..a3a1f4f44 --- /dev/null +++ b/src/util/WorkerConnector.ts @@ -0,0 +1,139 @@ +import generateIdFor from './generateIdFor'; + +export interface CancellableCallback { + ( + ...args: any[] + ): void; + + isCanceled?: boolean; + acceptsBuffer?: boolean; +} + +type CallMethodData = { + type: 'callMethod'; + messageId?: string; + name: string; + args: any; +}; + +type OriginMessageData = CallMethodData | { + type: 'cancelProgress'; + messageId: string; +}; + +export interface OriginMessageEvent { + data: OriginMessageData; +} + +export type WorkerMessageData = { + type: 'methodResponse'; + messageId: string; + response?: any; + error?: { message: string }; +} | { + type: 'methodCallback'; + messageId: string; + callbackArgs: any[]; +} | { + type: 'unhandledError'; + error?: { message: string }; +}; + +export interface WorkerMessageEvent { + data: WorkerMessageData; +} + +interface RequestStates { + messageId: string; + resolve: Function; + reject: Function; + callback: AnyToVoidFunction; +} + +// TODO Replace `any` with proper generics +export default class WorkerConnector { + private requestStates = new Map(); + + private requestStatesByCallback = new Map(); + + constructor(private worker: Worker) { + this.subscribe(); + } + + request(messageData: { name: string; args: any }) { + const { worker, requestStates, requestStatesByCallback } = this; + + const messageId = generateIdFor(requestStates); + const payload: CallMethodData = { + type: 'callMethod', + messageId, + ...messageData, + }; + + const requestState = { messageId } as RequestStates; + + // Re-wrap type because of `postMessage` + const promise: Promise = new Promise((resolve, reject) => { + Object.assign(requestState, { resolve, reject }); + }); + + if (typeof payload.args[payload.args.length - 1] === 'function') { + const callback = payload.args.pop() as AnyToVoidFunction; + requestState.callback = callback; + requestStatesByCallback.set(callback, requestState); + } + + requestStates.set(messageId, requestState); + promise + .catch(() => undefined) + .finally(() => { + requestStates.delete(messageId); + + if (requestState.callback) { + requestStatesByCallback.delete(requestState.callback); + } + }); + + worker.postMessage(payload); + + return promise; + } + + cancelCallback(progressCallback: CancellableCallback) { + progressCallback.isCanceled = true; + + const { messageId } = this.requestStatesByCallback.get(progressCallback) || {}; + if (!messageId) { + return; + } + + this.worker.postMessage({ + type: 'cancelProgress', + messageId, + }); + } + + private subscribe() { + const { worker, requestStates } = this; + + worker.addEventListener('message', ({ data }: WorkerMessageEvent) => { + if (data.type === 'methodResponse') { + const requestState = requestStates.get(data.messageId); + if (requestState) { + if (data.error) { + requestState.reject(data.error); + } else { + requestState.resolve(data.response); + } + } + } else if (data.type === 'methodCallback') { + const requestState = requestStates.get(data.messageId); + if (requestState && requestState.callback) { + requestState.callback(...data.callbackArgs); + } + } else if (data.type === 'unhandledError') { + throw data.error; + } + }); + } +} diff --git a/src/util/__mocks__/oggToWav.ts b/src/util/__mocks__/oggToWav.ts new file mode 100644 index 000000000..d55a539a2 --- /dev/null +++ b/src/util/__mocks__/oggToWav.ts @@ -0,0 +1,4 @@ +export default { + oggToWav() { + }, +}; diff --git a/src/util/__mocks__/voiceRecording.ts b/src/util/__mocks__/voiceRecording.ts new file mode 100644 index 000000000..ce3c03bc5 --- /dev/null +++ b/src/util/__mocks__/voiceRecording.ts @@ -0,0 +1,2 @@ +export function init() { +} diff --git a/src/util/__mocks__/webpToPng.ts b/src/util/__mocks__/webpToPng.ts new file mode 100644 index 000000000..09b14aec5 --- /dev/null +++ b/src/util/__mocks__/webpToPng.ts @@ -0,0 +1,6 @@ +export default { + webpToPng() { + }, + webpToPngBase64() { + }, +}; diff --git a/src/util/animation.ts b/src/util/animation.ts new file mode 100644 index 000000000..6b6b02a8a --- /dev/null +++ b/src/util/animation.ts @@ -0,0 +1,32 @@ +import { fastRaf } from './schedulers'; + +interface AnimationInstance { + isCancelled: boolean; +} + +let currentInstance: AnimationInstance | undefined; + +export function animateSingle(tick: Function, instance?: AnimationInstance) { + if (!instance) { + if (currentInstance && !currentInstance.isCancelled) { + currentInstance.isCancelled = true; + } + + instance = { isCancelled: false }; + currentInstance = instance; + } + + fastRaf(() => { + if (!instance!.isCancelled && tick()) { + animateSingle(tick, instance); + } + }); +} + +export function animate(tick: Function) { + fastRaf(() => { + if (tick()) { + animate(tick); + } + }); +} diff --git a/src/util/arePropsShallowEqual.ts b/src/util/arePropsShallowEqual.ts new file mode 100644 index 000000000..3ed791023 --- /dev/null +++ b/src/util/arePropsShallowEqual.ts @@ -0,0 +1,11 @@ +export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) { + const currentKeys = Object.keys(currentProps); + const currentKeysLength = currentKeys.length; + const newKeysLength = Object.keys(newProps).length; + + if (currentKeysLength !== newKeysLength) { + return false; + } + + return currentKeys.every((prop) => currentProps[prop] === newProps[prop]); +} diff --git a/src/util/audioPlayer.ts b/src/util/audioPlayer.ts new file mode 100644 index 000000000..7ee0e1289 --- /dev/null +++ b/src/util/audioPlayer.ts @@ -0,0 +1,162 @@ +import { IS_SAFARI } from './environment'; +import safePlay from './safePlay'; +import { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio'; +import { getDispatch } from '../lib/teact/teactn'; +import { parseMessageKey } from '../modules/helpers'; + +type Handler = (eventName: string, e: Event) => void; + +interface Track { + audio: HTMLAudioElement; + proxy: HTMLAudioElement; + handlers: Handler[]; + onForcePlay?: NoneToVoidFunction; +} + +const tracks = new Map(); +let queue: string[] = []; + +let currentTrackId: string | undefined; + +function createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) { + const audio = new Audio(); + + function handleEvent(eventName: string) { + return (e: Event) => { + if (!tracks.has(trackId)) { + return; + } + + if (isSafariPatchInProgress(audio)) { + return; + } + + tracks.get(trackId)!.handlers.forEach((handler) => { + handler(eventName, e); + }); + }; + } + + audio.addEventListener('timeupdate', handleEvent('onTimeUpdate')); + audio.addEventListener('play', handleEvent('onPlay')); + audio.addEventListener('pause', handleEvent('onPause')); + audio.addEventListener('loadstart', handleEvent('onLoadStart')); + audio.addEventListener('loadeddata', handleEvent('onLoadedData')); + audio.addEventListener('playing', handleEvent('onPlaying')); + audio.addEventListener('ended', () => { + if (isSafariPatchInProgress(audio)) { + return; + } + + const nextTrackId = queue[queue.indexOf(trackId) + 1]; + if (!nextTrackId) { + return; + } + + if (!tracks.has(nextTrackId)) { + // A bit hacky way to continue playlist when switching chat + getDispatch().openAudioPlayer(parseMessageKey(nextTrackId)); + + return; + } + + const nextTrack = tracks.get(nextTrackId)!; + + if (nextTrack.onForcePlay) { + nextTrack.onForcePlay(); + } + + currentTrackId = nextTrackId; + + if (nextTrack.audio.src) { + safePlay(nextTrack.audio); + } + }); + + return { + audio, + proxy: new Proxy(audio, { + get: (origin, key: keyof HTMLAudioElement) => origin[key], + }), + handlers: [], + onForcePlay, + }; +} + +export function stopCurrentAudio() { + const currentTrack = currentTrackId && tracks.get(currentTrackId); + if (currentTrack) { + currentTrack.audio.pause(); + } +} + +export function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) { + if (!tracks.has(trackId)) { + tracks.set(trackId, createAudio(trackId, onForcePlay)); + + if (!queue.includes(trackId)) { + queue.push(trackId); + } + } + + const { audio, proxy, handlers } = tracks.get(trackId)!; + + handlers.push(handler); + + return { + play(src: string) { + if (currentTrackId && currentTrackId !== trackId) { + tracks.get(currentTrackId)!.audio.pause(); + } + + currentTrackId = trackId; + + if (!audio.src) { + audio.src = src; + audio.preload = 'auto'; + + if (src.includes('/progressive/') && IS_SAFARI) { + patchSafariProgressiveAudio(audio); + } + } + + safePlay(audio); + }, + + pause() { + if (currentTrackId === trackId) { + audio.pause(); + } + }, + + setCurrentTime(time: number) { + if (currentTrackId === trackId) { + audio.currentTime = time; + } + }, + + proxy, + + destroy(shouldRemoveFromQueue = false) { + const track = tracks.get(trackId); + if (!track) { + return; + } + + track.handlers = track.handlers.filter((h) => h !== handler); + + if (!track.handlers.length) { + track.audio.pause(); + tracks.delete(trackId); + + if (shouldRemoveFromQueue) { + queue = queue.filter((id) => id !== trackId); + } + + if (trackId === currentTrackId) { + currentTrackId = undefined; + } + } + }, + }; +} diff --git a/src/util/buildClassName.ts b/src/util/buildClassName.ts new file mode 100644 index 000000000..3e04c8b0b --- /dev/null +++ b/src/util/buildClassName.ts @@ -0,0 +1,5 @@ +type Parts = (string | false | undefined)[]; + +export default (...parts: Parts) => { + return parts.filter(Boolean).join(' '); +}; diff --git a/src/util/cacheApi.ts b/src/util/cacheApi.ts new file mode 100644 index 000000000..0819a9628 --- /dev/null +++ b/src/util/cacheApi.ts @@ -0,0 +1,68 @@ +// eslint-disable-next-line no-restricted-globals +const cacheApi = self.caches; + +export enum Type { + Text, + Blob, + Json, +} + +export async function fetch(cacheName: string, key: string, type: Type) { + if (!cacheApi) { + return undefined; + } + + const request = new Request(key); + const cache = await cacheApi.open(cacheName); + const response = await cache.match(request); + if (!response) { + return undefined; + } + + switch (type) { + case Type.Text: + return response.text(); + case Type.Blob: { + const blob = await response.blob(); + + // Safari does not return correct Content-Type header for webp images. + if (key.substr(0, 7) === 'sticker') { + return new Blob([blob], { type: 'image/webp' }); + } + + // iOS Safari fails to preserve `type` in cache + if (!blob.type) { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + return new Blob([blob], { type: contentType }); + } + } + + return blob; + } + case Type.Json: + return response.json(); + default: + return undefined; + } +} + +export async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) { + if (!cacheApi) { + return undefined; + } + + const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data); + const request = new Request(key); + const response = new Response(cacheData); + const cache = await cacheApi.open(cacheName); + return cache.put(request, response); +} + +export function clear(cacheName: string) { + if (!cacheApi) { + return undefined; + } + + return cacheApi.delete(cacheName); +} diff --git a/src/util/callbacks.ts b/src/util/callbacks.ts new file mode 100644 index 000000000..a923141d4 --- /dev/null +++ b/src/util/callbacks.ts @@ -0,0 +1,30 @@ +export function createCallbackManager() { + const callbacks: AnyToVoidFunction[] = []; + + function addCallback(cb: AnyToVoidFunction) { + callbacks.push(cb); + + return () => { + removeCallback(cb); + }; + } + + function removeCallback(cb: AnyToVoidFunction) { + const index = callbacks.indexOf(cb); + if (index !== -1) { + callbacks.splice(index, 1); + } + } + + function runCallbacks(...args: any[]) { + callbacks.forEach((callback) => { + callback(...args); + }); + } + + return { + runCallbacks, + addCallback, + removeCallback, + }; +} diff --git a/src/util/captureEscKeyListener.ts b/src/util/captureEscKeyListener.ts new file mode 100644 index 000000000..2ab04ce32 --- /dev/null +++ b/src/util/captureEscKeyListener.ts @@ -0,0 +1,7 @@ +import captureKeyboardListener from './captureKeyboardListeners'; + +type IHandlerFunction = () => void; + +export default function captureEscKeyListener(handler: IHandlerFunction) { + return captureKeyboardListener({ onEsc: handler }); +} diff --git a/src/util/captureEvents.ts b/src/util/captureEvents.ts new file mode 100644 index 000000000..6fd856e99 --- /dev/null +++ b/src/util/captureEvents.ts @@ -0,0 +1,170 @@ +export enum SwipeDirection { + Up, + Down, + Left, + Right, +} + +interface CaptureOptions { + onCapture?: (e: MouseEvent | TouchEvent) => void; + onRelease?: (e: MouseEvent | TouchEvent) => void; + onDrag?: ( + e: MouseEvent | TouchEvent, + captureEvent: MouseEvent | TouchEvent, + params: { + dragOffsetX: number; + dragOffsetY: number; + }, + ) => void; + onSwipe?: (e: Event, direction: SwipeDirection) => void; + onClick?: (e: MouseEvent | TouchEvent) => void; + excludedClosestSelector?: string; + withCursor?: boolean; +} + +// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad +// Android does not have this value, and iOS has it but as read-only +export interface RealTouchEvent extends TouchEvent { + pageX?: number; + pageY?: number; +} + +const MOVED_THRESHOLD = 15; +const SWIPE_THRESHOLD = 50; + +export function captureEvents(element: HTMLElement, options: CaptureOptions) { + let captureEvent: MouseEvent | RealTouchEvent | undefined; + let hasMoved = false; + + function onCapture(e: MouseEvent | RealTouchEvent) { + if (options.excludedClosestSelector && ( + (e.target as HTMLElement).matches(options.excludedClosestSelector) + || (e.target as HTMLElement).closest(options.excludedClosestSelector) + )) { + return; + } + + captureEvent = e; + + if (e.type === 'mousedown') { + document.addEventListener('mousemove', onMove); + document.addEventListener('mouseup', onRelease); + } else if (e.type === 'touchstart') { + document.addEventListener('touchmove', onMove); + document.addEventListener('touchend', onRelease); + document.addEventListener('touchcancel', onRelease); + + if ('touches' in e) { + if (e.pageX === undefined) { + e.pageX = e.touches[0].pageX; + } + + if (e.pageY === undefined) { + e.pageY = e.touches[0].pageY; + } + } + } + + document.body.classList.add('no-selection'); + if (options.withCursor) { + document.body.classList.add('cursor-grabbing'); + } + + if (options.onCapture) { + options.onCapture(e); + } + } + + function onRelease(e: MouseEvent | TouchEvent) { + if (captureEvent) { + if (options.withCursor) { + document.body.classList.remove('cursor-grabbing'); + } + document.body.classList.remove('no-selection'); + + document.removeEventListener('mouseup', onRelease); + document.removeEventListener('mousemove', onMove); + document.removeEventListener('touchcancel', onRelease); + document.removeEventListener('touchend', onRelease); + document.removeEventListener('touchmove', onMove); + + captureEvent = undefined; + + if (hasMoved) { + if (options.onRelease) { + options.onRelease(e); + } + } else if (options.onClick) { + options.onClick(e); + } + } + + hasMoved = false; + } + + function onMove(e: MouseEvent | RealTouchEvent) { + if (captureEvent) { + if (e.type === 'touchmove' && ('touches' in e)) { + if (e.pageX === undefined) { + e.pageX = e.touches[0].pageX; + } + + if (e.pageY === undefined) { + e.pageY = e.touches[0].pageY; + } + } + + const dragOffsetX = e.pageX! - captureEvent.pageX!; + const dragOffsetY = e.pageY! - captureEvent.pageY!; + + if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) { + hasMoved = true; + } + + if (options.onDrag) { + options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY }); + } + + if (options.onSwipe) { + processSwipe(e, dragOffsetX, dragOffsetY, options.onSwipe); + } + } + } + + element.addEventListener('mousedown', onCapture); + element.addEventListener('touchstart', onCapture, { passive: true }); + + return () => { + element.removeEventListener('mousedown', onCapture); + element.removeEventListener('touchstart', onCapture); + }; +} + +function processSwipe( + e: Event, dragOffsetX: number, dragOffsetY: number, onSwipe: (e: Event, direction: SwipeDirection) => void, +) { + const xAbs = Math.abs(dragOffsetX); + const yAbs = Math.abs(dragOffsetY); + + if (dragOffsetX && dragOffsetY) { + const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs); + // Diagonal swipe + if (ratio < 2) { + return; + } + } + + if (xAbs >= SWIPE_THRESHOLD) { + if (dragOffsetX < 0) { + onSwipe(e, SwipeDirection.Left); + } else { + onSwipe(e, SwipeDirection.Right); + } + } else if (yAbs >= SWIPE_THRESHOLD) { + if (dragOffsetY < 0) { + onSwipe(e, SwipeDirection.Up); + } else { + onSwipe(e, SwipeDirection.Down); + } + } +} diff --git a/src/util/captureKeyboardListeners.ts b/src/util/captureKeyboardListeners.ts new file mode 100644 index 000000000..8a087c335 --- /dev/null +++ b/src/util/captureKeyboardListeners.ts @@ -0,0 +1,83 @@ +type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onTab'; +type Handler = (e: KeyboardEvent) => void; +type CaptureOptions = Partial>; + +const keyToHandlerName: Record = { + Enter: 'onEnter', + Backspace: 'onBackspace', + Delete: 'onDelete', + Esc: 'onEsc', + Escape: 'onEsc', + ArrowUp: 'onUp', + ArrowDown: 'onDown', + Tab: 'onTab', +}; + +const handlers: Record = { + onEnter: [], + onDelete: [], + onBackspace: [], + onEsc: [], + onUp: [], + onDown: [], + onTab: [], +}; + +export default function captureKeyboardListeners(options: CaptureOptions) { + if (!hasActiveHandlers()) { + document.addEventListener('keydown', handleKeyDown, true); + } + + (Object.keys(options) as Array).forEach((handlerName) => { + const handler = options[handlerName]; + if (!handler) { + return; + } + + const currentEventHandlers = handlers[handlerName]; + if (currentEventHandlers) { + currentEventHandlers.push(handler); + } + }); + + return () => { + releaseKeyboardListener(options); + }; +} + +function hasActiveHandlers() { + return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length)); +} + +function handleKeyDown(e: KeyboardEvent) { + const handlerName = keyToHandlerName[e.key]; + if (!handlerName) { + return; + } + + const { length } = handlers[handlerName]; + if (!length) { + return; + } + e.stopPropagation(); + + const handler = handlers[handlerName][length - 1]; + handler!(e); +} + +function releaseKeyboardListener(options: CaptureOptions) { + (Object.keys(options) as Array).forEach((handlerName) => { + const handler = options[handlerName]; + const currentEventHandlers = handlers[handlerName]; + if (currentEventHandlers) { + const index = currentEventHandlers.findIndex((cb) => cb === handler); + if (index !== -1) { + currentEventHandlers.splice(index, 1); + } + } + }); + + if (!hasActiveHandlers()) { + document.removeEventListener('keydown', handleKeyDown, false); + } +} diff --git a/src/util/clipboard.ts b/src/util/clipboard.ts new file mode 100644 index 000000000..80196514e --- /dev/null +++ b/src/util/clipboard.ts @@ -0,0 +1,64 @@ +import { DEBUG } from '../config'; + +export const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem; + +const textCopyEl = document.createElement('textarea'); +textCopyEl.setAttribute('readonly', ''); +textCopyEl.tabIndex = -1; +textCopyEl.className = 'visually-hidden'; + +export const copyTextToClipboard = (str: string): void => { + textCopyEl.value = str; + document.body.appendChild(textCopyEl); + const selection = document.getSelection(); + + if (selection) { + // Store previous selection + const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0); + textCopyEl.select(); + document.execCommand('copy'); + // Restore the original selection + if (rangeToRestore) { + selection.removeAllRanges(); + selection.addRange(rangeToRestore); + } + } + + document.body.removeChild(textCopyEl); +}; + +export const copyImageToClipboard = (imageUrl: string) => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + const imageEl = new Image(); + imageEl.onload = (e: Event) => { + if (ctx && e.currentTarget) { + const img = e.currentTarget as HTMLImageElement; + canvas.width = img.width; + canvas.height = img.height; + ctx.drawImage(img, 0, 0, img.width, img.height); + canvas.toBlob(copyBlobToClipboard, 'image/png', 1); + } + }; + + imageEl.src = imageUrl; +}; + +async function copyBlobToClipboard(pngBlob: Blob | null) { + if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) { + return; + } + + try { + await navigator.clipboard.write([ + new window.ClipboardItem({ + [pngBlob.type]: pngBlob, + }), + ]); + } catch (error) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(error); + } + } +} diff --git a/src/util/colors.ts b/src/util/colors.ts new file mode 100644 index 000000000..37aed35d4 --- /dev/null +++ b/src/util/colors.ts @@ -0,0 +1,134 @@ +/* eslint-disable eqeqeq */ +/* eslint-disable prefer-template */ +/* eslint-disable prefer-const */ +/* eslint-disable prefer-destructuring */ +/* eslint-disable one-var */ +/* eslint-disable one-var-declaration-per-line */ + +/** + * HEX > RGB + * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive + * output: [r, g, b] ([0-255, 0-255, 0-255]) + */ +export function hex2rgb(param: string): [number, number, number] { + return [ + parseInt(param.substring(0, 2), 16), + parseInt(param.substring(2, 4), 16), + parseInt(param.substring(4, 6), 16), + ]; +} + +/** + * RGB > HEX + * input: [r, g, b] ([0-255, 0-255, 0-255]) + * output: 'xxxxxx' (ex. 'ff0000') + */ +export function rgb2hex(param: [number, number, number]) { + const p0 = param[0].toString(16); + const p1 = param[1].toString(16); + const p2 = param[2].toString(16); + return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2); +} + +/** + * Converts an RGB color value to HSV. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSV_color_space. + * Assumes r, g, and b are contained in the set [0, 255] and + * returns h, s, and v in the set [0, 1]. + * + * @param Number r The red color value + * @param Number g The green color value + * @param Number b The blue color value + * @return Array The HSV representation + */ +export function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] { + r /= 255; + g /= 255; + b /= 255; + + let max = Math.max(r, g, b), min = Math.min(r, g, b); + let h!: number, s: number, v: number = max; + + let d = max - min; + s = max == 0 ? 0 : d / max; + + if (max == min) { + h = 0; // achromatic + } else { + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + + h /= 6; + } + + return [h, s, v]; +} + +/** + * Converts an HSV color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSV_color_space. + * Assumes h, s, and v are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param Number h The hue + * @param Number s The saturation + * @param Number v The value + * @return Array The RGB representation + */ +export function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] { + let r!: number, g!: number, b!: number; + + let i = Math.floor(h * 6); + let f = h * 6 - i; + let p = v * (1 - s); + let q = v * (1 - f * s); + let t = v * (1 - (1 - f) * s); + + switch (i % 6) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + case 5: + r = v; + g = p; + b = q; + break; + } + + return [ + Math.round(r * 255), + Math.round(g * 255), + Math.round(b * 255), + ]; +} diff --git a/src/util/countries.ts b/src/util/countries.ts new file mode 100644 index 000000000..d09677a8d --- /dev/null +++ b/src/util/countries.ts @@ -0,0 +1,209 @@ +const DATA = `AF🇦🇫93Afghanistan +AO🇦🇴244Angola +AL🇦🇱355Albania +AD🇦🇩376Andorra +AE🇦🇪971United Arab Emirates +AR🇦🇷54Argentina +AM🇦🇲374Armenia +AG🇦🇬1268Antigua and Barbuda +AU🇦🇺61Australia +AT🇦🇹43Austria +AZ🇦🇿994Azerbaijan +BI🇧🇮257Burundi +BE🇧🇪32Belgium +BJ🇧🇯229Benin +BF🇧🇫226Burkina Faso +BD🇧🇩880Bangladesh +BG🇧🇬359Bulgaria +BH🇧🇭973Bahrain +BS🇧🇸1242Bahamas +BA🇧🇦387Bosnia and Herzegovina +BY🇧🇾375Belarus +BZ🇧🇿501Belize +BO🇧🇴591Bolivia +BR🇧🇷55Brazil +BB🇧🇧1246Barbados +BN🇧🇳673Brunei +BT🇧🇹975Bhutan +BW🇧🇼267Botswana +CF🇨🇫236Central African Republic +CA🇨🇦1Canada +CH🇨🇭41Switzerland +CL🇨🇱56Chile +CN🇨🇳86China +CI🇨🇮225Ivory Coast +CM🇨🇲237Cameroon +CD🇨🇩243DR Congo +CG🇨🇬242Republic of the Congo +CO🇨🇴57Colombia +KM🇰🇲269Comoros +CV🇨🇻238Cape Verde +CR🇨🇷506Costa Rica +CU🇨🇺53Cuba +CY🇨🇾357Cyprus +CZ🇨🇿420Czechia +DE🇩🇪49Germany +DJ🇩🇯253Djibouti +DM🇩🇲1767Dominica +DK🇩🇰45Denmark +DO🇩🇴1Dominican Republic +DZ🇩🇿213Algeria +EC🇪🇨593Ecuador +EG🇪🇬20Egypt +ER🇪🇷291Eritrea +ES🇪🇸34Spain +EE🇪🇪372Estonia +ET🇪🇹251Ethiopia +FI🇫🇮358Finland +FJ🇫🇯679Fiji +FR🇫🇷33France +FM🇫🇲691Micronesia +GA🇬🇦241Gabon +GB🇬🇧44United Kingdom +GE🇬🇪995Georgia +GH🇬🇭233Ghana +GN🇬🇳224Guinea +GM🇬🇲220Gambia +GW🇬🇼245Guinea-Bissau +GQ🇬🇶240Equatorial Guinea +GR🇬🇷30Greece +GD🇬🇩1473Grenada +GT🇬🇹502Guatemala +GY🇬🇾592Guyana +HN🇭🇳504Honduras +HR🇭🇷385Croatia +HT🇭🇹509Haiti +HU🇭🇺36Hungary +ID🇮🇩62Indonesia +IN🇮🇳91India +IE🇮🇪353Ireland +IR🇮🇷98Iran +IQ🇮🇶964Iraq +IS🇮🇸354Iceland +IL🇮🇱972Israel +IT🇮🇹39Italy +JM🇯🇲1876Jamaica +JO🇯🇴962Jordan +JP🇯🇵81Japan +KZ🇰🇿7Kazakhstan +KE🇰🇪254Kenya +KG🇰🇬996Kyrgyzstan +KH🇰🇭855Cambodia +KI🇰🇮686Kiribati +KN🇰🇳1869Saint Kitts and Nevis +KR🇰🇷82South Korea +KW🇰🇼965Kuwait +LA🇱🇦856Laos +LB🇱🇧961Lebanon +LR🇱🇷231Liberia +LY🇱🇾218Libya +LC🇱🇨1758Saint Lucia +LI🇱🇮423Liechtenstein +LK🇱🇰94Sri Lanka +LS🇱🇸266Lesotho +LT🇱🇹370Lithuania +LU🇱🇺352Luxembourg +LV🇱🇻371Latvia +MA🇲🇦212Morocco +MC🇲🇨377Monaco +MD🇲🇩373Moldova +MG🇲🇬261Madagascar +MV🇲🇻960Maldives +MX🇲🇽52Mexico +MH🇲🇭692Marshall Islands +MK🇲🇰389North Macedonia +ML🇲🇱223Mali +MT🇲🇹356Malta +MM🇲🇲95Myanmar +ME🇲🇪382Montenegro +MN🇲🇳976Mongolia +MZ🇲🇿258Mozambique +MR🇲🇷222Mauritania +MU🇲🇺230Mauritius +MW🇲🇼265Malawi +MY🇲🇾60Malaysia +NA🇳🇦264Namibia +NE🇳🇪227Niger +NG🇳🇬234Nigeria +NI🇳🇮505Nicaragua +NL🇳🇱31Netherlands +NO🇳🇴47Norway +NP🇳🇵977Nepal +NR🇳🇷674Nauru +NZ🇳🇿64New Zealand +OM🇴🇲968Oman +PK🇵🇰92Pakistan +PA🇵🇦507Panama +PE🇵🇪51Peru +PH🇵🇭63Philippines +PW🇵🇼680Palau +PG🇵🇬675Papua New Guinea +PL🇵🇱48Poland +KP🇰🇵850North Korea +PT🇵🇹351Portugal +PY🇵🇾595Paraguay +QA🇶🇦974Qatar +RO🇷🇴40Romania +RU🇷🇺7Russia +RW🇷🇼250Rwanda +SA🇸🇦966Saudi Arabia +SD🇸🇩249Sudan +SN🇸🇳221Senegal +SG🇸🇬65Singapore +SB🇸🇧677Solomon Islands +SL🇸🇱232Sierra Leone +SV🇸🇻503El Salvador +SM🇸🇲378San Marino +SO🇸🇴252Somalia +RS🇷🇸381Serbia +SS🇸🇸211South Sudan +ST🇸🇹239São Tomé and Príncipe +SR🇸🇷597Suriname +SK🇸🇰421Slovakia +SI🇸🇮386Slovenia +SE🇸🇪46Sweden +SZ🇸🇿268Eswatini +SC🇸🇨248Seychelles +SY🇸🇾963Syria +TD🇹🇩235Chad +TG🇹🇬228Togo +TH🇹🇭66Thailand +TJ🇹🇯992Tajikistan +TM🇹🇲993Turkmenistan +TL🇹🇱670Timor-Leste +TO🇹🇴676Tonga +TT🇹🇹1868Trinidad and Tobago +TN🇹🇳216Tunisia +TR🇹🇷90Turkey +TV🇹🇻688Tuvalu +TZ🇹🇿255Tanzania +UG🇺🇬256Uganda +UA🇺🇦380Ukraine +UY🇺🇾598Uruguay +US🇺🇸1United States +UZ🇺🇿998Uzbekistan +VA🇻🇦3Vatican City +VC🇻🇨1784Saint Vincent and the Grenadines +VE🇻🇪58Venezuela +VN🇻🇳84Vietnam +VU🇻🇺678Vanuatu +WS🇼🇸685Samoa +YE🇾🇪967Yemen +ZA🇿🇦27South Africa +ZM🇿🇲260Zambia +ZW🇿🇼263Zimbabwe`; + +const parsed = DATA + .split('\n') + .map((str) => { + const id = str.substr(0, 2); + const flag = str.substr(2, 4); + const code = `+${str.match(/\d+/)![0]}`; + const name = str.split(/\d+/)[1]; + + return { + id, flag, code, name, + }; + }); + +export default parsed; diff --git a/src/util/createWorkerInterface.ts b/src/util/createWorkerInterface.ts new file mode 100644 index 000000000..fcefbc684 --- /dev/null +++ b/src/util/createWorkerInterface.ts @@ -0,0 +1,99 @@ +import { CancellableCallback, OriginMessageEvent, WorkerMessageData } from './WorkerConnector'; +import { DEBUG } from '../config'; + +declare const self: WorkerGlobalScope; + +handleErrors(); + +const callbackState = new Map(); + +export default function createInterface(api: Record) { + onmessage = async (message: OriginMessageEvent) => { + const { data } = message; + + switch (data.type) { + case 'callMethod': { + const { messageId, name, args } = data; + try { + if (messageId) { + const callback = (...callbackArgs: any[]) => { + const lastArg = callbackArgs[callbackArgs.length - 1]; + + sendToOrigin({ + type: 'methodCallback', + messageId, + callbackArgs, + }, lastArg instanceof ArrayBuffer ? [lastArg] : undefined); + }; + + callbackState.set(messageId, callback); + + args.push(callback as never); + } + + const [response, arrayBuffers] = (await api[name](...args)) || []; + + if (messageId) { + sendToOrigin( + { + type: 'methodResponse', + messageId, + response, + }, + arrayBuffers, + ); + } + } catch (error) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(error); + } + + if (messageId) { + sendToOrigin({ + type: 'methodResponse', + messageId, + error: { message: error.message }, + }); + } + } + + if (messageId) { + callbackState.delete(messageId); + } + + break; + } + case 'cancelProgress': { + const callback = callbackState.get(data.messageId); + if (callback) { + callback.isCanceled = true; + } + + break; + } + } + }; +} + +function handleErrors() { + self.onerror = (err) => { + // eslint-disable-next-line no-console + console.error(err); + sendToOrigin({ type: 'unhandledError', error: { message: 'Uncaught exception in worker' } }); + }; + + self.addEventListener('unhandledrejection', (err) => { + // eslint-disable-next-line no-console + console.error(err); + sendToOrigin({ type: 'unhandledError', error: { message: 'Uncaught rejection in worker' } }); + }); +} + +function sendToOrigin(data: WorkerMessageData, arrayBuffers?: ArrayBuffer[]) { + if (arrayBuffers) { + postMessage(data, arrayBuffers); + } else { + postMessage(data); + } +} diff --git a/src/util/cycleRestrict.ts b/src/util/cycleRestrict.ts new file mode 100644 index 000000000..e9d14b438 --- /dev/null +++ b/src/util/cycleRestrict.ts @@ -0,0 +1,3 @@ +export default function cycleRestrict(length: number, index: number) { + return index - Math.floor(index / length) * length; +} diff --git a/src/util/dateFormat.ts b/src/util/dateFormat.ts new file mode 100644 index 000000000..fef4595df --- /dev/null +++ b/src/util/dateFormat.ts @@ -0,0 +1,233 @@ +import { MILISECONDS_IN_DAY } from '../lib/lovely-chart/constants'; +import { getTranslation } from './langProvider'; + +const WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; +const MONTHS_FULL = [ + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December', +]; + +const MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase()); +const MIN_SEARCH_YEAR = 2015; +const MAX_DAY_IN_MONTH = 31; +const MAX_MONTH_IN_YEAR = 12; + +export function getDayStart(datetime: number | Date) { + const date = new Date(datetime); + date.setHours(0, 0, 0, 0); + return date; +} + +export function getDayStartAt(datetime: number | Date) { + return getDayStart(datetime).getTime(); +} + +export function toYearMonth(timestamp: number) { + const date = new Date(timestamp * 1000); + return `${date.getFullYear()}-${date.getMonth()}`; +} + +function toIsoString(date: Date) { + return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; +} + +export function formatTime(datetime: number | Date) { + const date = typeof datetime === 'number' ? new Date(datetime) : datetime; + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + + return `${hours}:${minutes}`; +} + +export function formatPastTimeShort(datetime: number | Date) { + const date = typeof datetime === 'number' ? new Date(datetime) : datetime; + + const today = getDayStart(new Date()); + if (date >= today) { + return formatTime(date); + } + + const weekAgo = new Date(today); + weekAgo.setDate(today.getDate() - 7); + if (date >= weekAgo) { + return getTranslation(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`); + } + + const withYear = date.getFullYear() !== today.getFullYear(); + const format = ( + getTranslation(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule') + || (withYear ? 'd MMM yyyy' : 'd MMM') + ); + + return formatDate(date, format); +} + +export function formatFullDate(datetime: number | Date) { + const date = typeof datetime === 'number' ? new Date(datetime) : datetime; + const format = getTranslation('formatterYearMax') || 'dd.MM.yyyy'; + + return formatDate(date, format); +} + +export function formatMonthAndYear(date: Date, isShort = false) { + const format = getTranslation(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy'; + + return formatDate(date, format); +} + +export function formatHumanDate(datetime: number | Date, isShort = false, noWeekdays = false) { + const date = typeof datetime === 'number' ? new Date(datetime) : datetime; + + const today = getDayStart(new Date()); + + if (!noWeekdays) { + if (toIsoString(date) === toIsoString(today)) { + return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Today')); + } + + const yesterday = new Date(today); + yesterday.setDate(today.getDate() - 1); + if (toIsoString(date) === toIsoString(yesterday)) { + return (isShort ? lowerFirst : upperFirst)(getTranslation('Weekday.Yesterday')); + } + + const weekAgo = new Date(today); + const weekAhead = new Date(today); + weekAgo.setDate(today.getDate() - 7); + weekAhead.setDate(today.getDate() + 7); + if (date >= weekAgo && date <= weekAhead) { + const weekDay = WEEKDAYS_FULL[date.getDay()]; + return isShort + ? lowerFirst(getTranslation(`Weekday.Short${weekDay}`)) + : upperFirst(getTranslation(`Weekday.${weekDay}`)); + } + } + + const withYear = date.getFullYear() !== today.getFullYear(); + const formatKey = isShort + ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule') + : (withYear ? 'chatFullDate' : 'chatDate'); + const format = getTranslation(formatKey) || 'd MMMM yyyy'; + + return (isShort ? lowerFirst : upperFirst)(formatDate(date, format)); +} + +function formatDate(date: Date, format: string) { + const day = date.getDate(); + const monthIndex = date.getMonth(); + + return format + .replace('LLLL', getTranslation(MONTHS_FULL[monthIndex])) + .replace('MMMM', getTranslation(`Month.Gen${MONTHS_FULL[monthIndex]}`)) + .replace('MMM', getTranslation(`Month.Short${MONTHS_FULL[monthIndex]}`)) + .replace('MM', String(monthIndex + 1).padStart(2, '0')) + .replace('dd', String(day).padStart(2, '0')) + .replace('d', String(day)) + .replace('yyyy', String(date.getFullYear())); +} + +export function formatMediaDateTime(datetime: number | Date) { + const date = typeof datetime === 'number' ? new Date(datetime) : datetime; + + return `${formatHumanDate(date, true)}, ${formatTime(date)}`; +} + +export function formatMediaDuration(duration: number) { + const hours = Math.floor(duration / 3600); + const minutes = Math.floor((duration % 3600) / 60); + const seconds = Math.floor(duration % 3600 % 60); + + let string = ''; + if (hours > 0) { + string += `${String(hours).padStart(2, '0')}:`; + string += `${String(minutes).padStart(2, '0')}:`; + } else { + string += `${String(minutes)}:`; + } + string += String(seconds).padStart(2, '0'); + + return string; +} + +export function formatVoiceRecordDuration(durationInMs: number) { + const parts = []; + + let milliseconds = durationInMs % 1000; + durationInMs -= milliseconds; + milliseconds = Math.floor(milliseconds / 10); + + durationInMs = Math.floor(durationInMs / 1000); + const seconds = durationInMs % 60; + durationInMs -= seconds; + + durationInMs = Math.floor(durationInMs / 60); + const minutes = durationInMs % 60; + durationInMs -= minutes; + + durationInMs = Math.floor(durationInMs / 60); + const hours = durationInMs % 60; + + if (hours > 0) { + parts.push(String(hours).padStart(2, '0')); + } + parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0')); + parts.push(String(seconds).padStart(2, '0')); + + return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`; +} + +export function formatDateToString(date: Date) { + return date.toLocaleString( + 'en-US', + { + year: 'numeric', + month: 'short', + day: 'numeric', + }, + ); +} + +function isValidDate(day: number, month: number, year = 2021): boolean { + if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) { + return false; + } + const date = new Date(year, month, day); + return !Number.isNaN(date.getTime()) && date.getDate() === day; +} + +export function parseDateString(query = ''): string | undefined { + const matchStringDate = query.match(/\d{1,2}\s[a-zA-Z]{3,}/); + const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\s\d{1,2}/); + const matchNumberDate = query.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/); + if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) { + return undefined; + } + + if (matchNumberDate) { + const [date, month, year] = query.split(/[./-]/).map(Number); + return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined) + ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}` + : undefined; + } + + const dateParts = query.split(' '); + const date = matchStringDate ? dateParts[0] : dateParts[1]; + const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase(); + const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month)); + + return monthIndex !== -1 && isValidDate(Number(date), monthIndex) + ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}` + : undefined; +} + +export function timestampPlusDay(timestamp: number) { + return timestamp + MILISECONDS_IN_DAY / 1000; +} + +function lowerFirst(str: string) { + return `${str[0].toLowerCase()}${str.slice(1)}`; +} + +function upperFirst(str: string) { + return `${str[0].toUpperCase()}${str.slice(1)}`; +} diff --git a/src/util/deleteLastCharacterOutsideSelection.ts b/src/util/deleteLastCharacterOutsideSelection.ts new file mode 100644 index 000000000..2c1d3ae51 --- /dev/null +++ b/src/util/deleteLastCharacterOutsideSelection.ts @@ -0,0 +1,34 @@ +export default function deleteLastCharacterOutsideSelection(html: string) { + const tempInput = document.createElement('div'); + tempInput.contentEditable = 'true'; + tempInput.style.position = 'absolute'; + tempInput.style.left = '-10000px'; + tempInput.style.top = '-10000px'; + tempInput.innerHTML = html; + document.body.appendChild(tempInput); + let element = tempInput.lastChild!; + + if (element.lastChild) { + // Selects the last and the deepest child of the element. + while (element.lastChild) { + element = element.lastChild; + } + } + + // Gets length of the element's content. + const textLength = element.textContent!.length; + const range = document.createRange(); + const selection = window.getSelection()!; + + // Sets selection position to the end of the element. + range.setStart(element, textLength); + range.setEnd(element, textLength); + selection.removeAllRanges(); + selection.addRange(range); + document.execCommand('delete', false); + + const result = tempInput.innerHTML; + document.body.removeChild(tempInput); + + return result; +} diff --git a/src/util/download.ts b/src/util/download.ts new file mode 100644 index 000000000..90470b93d --- /dev/null +++ b/src/util/download.ts @@ -0,0 +1,6 @@ +export default function download(url: string, filename: string) { + const link = document.createElement('a'); + link.href = url; + link.download = filename; + link.click(); +} diff --git a/src/util/emoji.ts b/src/util/emoji.ts new file mode 100644 index 000000000..8dc9e5547 --- /dev/null +++ b/src/util/emoji.ts @@ -0,0 +1,73 @@ +// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data +// https://github.com/iamcal/emoji-data/issues/136 +const EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol']; + +export type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json'); +export type EmojiModule = { default: EmojiRawData }; + +export type EmojiData = { + categories: Array; + emojis: Record; +}; + +function unifiedToNative(unified: string) { + const unicodes = unified.split('-'); + const codePoints = unicodes.map((i) => parseInt(i, 16)); + + return String.fromCodePoint(...codePoints); +} + +export function nativeToUnfified(emoji: string) { + let code; + + if (emoji.length === 1) { + code = emoji.charCodeAt(0).toString(16).padStart(4, '0'); + } else { + const pairs = []; + for (let i = 0; i < emoji.length; i++) { + if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) { + if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) { + pairs.push( + (emoji.charCodeAt(i) - 0xd800) * 0x400 + + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000, + ); + } + } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) { + pairs.push(emoji.charCodeAt(i)); + } + } + + code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-'); + } + + return code; +} + +export function uncompressEmoji(data: EmojiRawData): EmojiData { + const emojiData: EmojiData = { categories: [], emojis: {} }; + + for (let i = 0; i < data.length; i += 2) { + const category = { + id: data[i][0], + name: data[i][1], + emojis: [], + } as EmojiCategory; + + for (let j = 0; j < data[i + 1].length; j++) { + const emojiRaw = data[i + 1][j]; + if (!EXCLUDE_EMOJIS.includes(emojiRaw[1])) { + category.emojis.push(emojiRaw[1]); + emojiData.emojis[emojiRaw[1]] = { + id: emojiRaw[1], + colons: `:${emojiRaw[1]}:`, + native: unifiedToNative(emojiRaw[0]), + image: emojiRaw[0].toLowerCase(), + }; + } + } + + emojiData.categories.push(category); + } + + return emojiData; +} diff --git a/src/util/environment.ts b/src/util/environment.ts new file mode 100644 index 000000000..71e486974 --- /dev/null +++ b/src/util/environment.ts @@ -0,0 +1,77 @@ +import { + MOBILE_SCREEN_MAX_WIDTH, + MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT, + MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH, +} from '../config'; + +export function getPlatform() { + const { userAgent, platform } = window.navigator; + const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']; + const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']; + const iosPlatforms = ['iPhone', 'iPad', 'iPod']; + let os: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined; + + if (macosPlatforms.indexOf(platform) !== -1) { + os = 'Mac OS'; + } else if (iosPlatforms.indexOf(platform) !== -1) { + os = 'iOS'; + } else if (windowsPlatforms.indexOf(platform) !== -1) { + os = 'Windows'; + } else if (/Android/.test(userAgent)) { + os = 'Android'; + } else if (/Linux/.test(platform)) { + os = 'Linux'; + } + + return os; +} + +export const PLATFORM_ENV = getPlatform(); +export const IS_MAC_OS = PLATFORM_ENV === 'Mac OS'; +export const IS_IOS = PLATFORM_ENV === 'iOS'; +export const IS_ANDROID = PLATFORM_ENV === 'Android'; +export const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + +export const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches; +// Keep in mind the landscape orientation +export const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || ( + window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT +); +export const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && ( + window.AudioContext || (window as any).webkitAudioContext +)); +export const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style; +export const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS); +export const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator; +// TODO Consider failed service worker +export const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED; +export const IS_STREAMING_SUPPORTED = 'MediaSource' in window; +export const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus')); + +export const DPR = window.devicePixelRatio || 1; + +// `mask-image` CSS property for custom background slows down the scroll performance significantly +export const MASK_IMAGE_ENABLED = IS_IOS; + +let isWebpSupportedCache: boolean | undefined; + +export function isWebpSupported() { + return Boolean(isWebpSupportedCache); +} + +function testWebp(): Promise { + return new Promise((resolve) => { + const webp = new Image(); + // eslint-disable-next-line max-len + webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; + const handleLoadOrError = () => { + resolve(webp.height === 2); + }; + webp.onload = handleLoadOrError; + webp.onerror = handleLoadOrError; + }); +} + +testWebp().then((hasWebp) => { + isWebpSupportedCache = hasWebp; +}); diff --git a/src/util/fastSmoothScroll.ts b/src/util/fastSmoothScroll.ts new file mode 100644 index 000000000..61216d1d3 --- /dev/null +++ b/src/util/fastSmoothScroll.ts @@ -0,0 +1,97 @@ +import { FocusDirection } from '../types'; + +import { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck'; +import { fastRaf } from './schedulers'; +import { animateSingle } from './animation'; + +const MAX_DISTANCE = 1500; +const MIN_JS_DURATION = 250; +const MAX_JS_DURATION = 600; + +export default function fastSmoothScroll( + container: HTMLElement, + element: HTMLElement, + position: ScrollLogicalPosition, + margin = 0, + maxDistance = MAX_DISTANCE, + forceDirection?: FocusDirection, + forceDuration?: number, +) { + if (forceDirection === FocusDirection.Static) { + element.scrollIntoView({ block: position }); + + return; + } + + const { offsetTop } = element; + + if (forceDirection === undefined) { + const offset = offsetTop - container.scrollTop; + + if (offset < -maxDistance) { + container.scrollTop += (offset + maxDistance); + } else if (offset > maxDistance) { + container.scrollTop += (offset - maxDistance); + } + } else if (forceDirection === FocusDirection.Up) { + container.scrollTop = offsetTop + maxDistance; + } else if (forceDirection === FocusDirection.Down) { + container.scrollTop = Math.max(0, offsetTop - maxDistance); + } + + fastRaf(() => { + dispatchHeavyAnimationEvent(MAX_JS_DURATION); + scrollWithJs(container, element, position, margin, forceDuration); + }); +} + +function scrollWithJs( + container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number, +) { + const { offsetTop: elementTop, offsetHeight: elementHeight } = element; + const { scrollTop, offsetHeight: containerHeight, scrollHeight } = container; + let path!: number; + + switch (position) { + case 'start': + path = (elementTop - margin) - scrollTop; + break; + case 'end': + path = (elementTop + elementHeight + margin) - (scrollTop + containerHeight); + break; + // 'nearest' is not supported yet + case 'nearest': + case 'center': + path = elementHeight < containerHeight + ? (elementTop + elementHeight / 2) - (scrollTop + containerHeight / 2) + : (elementTop - margin) - scrollTop; + break; + } + + if (path < 0) { + const remainingPath = -scrollTop; + path = Math.max(path, remainingPath); + } else if (path > 0) { + const remainingPath = scrollHeight - (scrollTop + containerHeight); + path = Math.min(path, remainingPath); + } + + const target = container.scrollTop + path; + const duration = forceDuration || ( + MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION) + ); + const startAt = Date.now(); + + animateSingle(() => { + const t = Math.min((Date.now() - startAt) / duration, 1); + + const currentPath = path * (1 - transition(t)); + container.scrollTop = Math.round(target - currentPath); + + return t < 1; + }); +} + +function transition(t: number) { + return 1 - ((1 - t) ** 3.5); +} diff --git a/src/util/fastSmoothScrollHorizontal.ts b/src/util/fastSmoothScrollHorizontal.ts new file mode 100644 index 000000000..5050b3a50 --- /dev/null +++ b/src/util/fastSmoothScrollHorizontal.ts @@ -0,0 +1,45 @@ +import { fastRaf } from './schedulers'; +import { animate } from './animation'; +import { IS_IOS } from './environment'; + +const DURATION = 450; + +export default function fastSmoothScroll(container: HTMLElement, left: number) { + // Native way seems to be smoother in Chrome + if (!IS_IOS) { + container.scrollTo({ left, behavior: 'smooth' }); + } else { + fastRaf(() => { + scrollWithJs(container, left); + }); + } +} + +function scrollWithJs(container: HTMLElement, left: number) { + const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container; + let path = left - scrollLeft; + + if (path < 0) { + const remainingPath = -scrollLeft; + path = Math.max(path, remainingPath); + } else if (path > 0) { + const remainingPath = scrollWidth - (scrollLeft + containerWidth); + path = Math.min(path, remainingPath); + } + + const target = container.scrollLeft + path; + const startAt = Date.now(); + + animate(() => { + const t = Math.min((Date.now() - startAt) / DURATION, 1); + + const currentPath = path * (1 - transition(t)); + container.scrollLeft = Math.round(target - currentPath); + + return t < 1; + }); +} + +function transition(t: number) { + return 1 - ((1 - t) ** 3.5); +} diff --git a/src/util/files.ts b/src/util/files.ts new file mode 100644 index 000000000..581868738 --- /dev/null +++ b/src/util/files.ts @@ -0,0 +1,120 @@ +import { pause } from './schedulers'; + +// Polyfill for Safari: `File` is not available in web worker +if (typeof File === 'undefined') { + // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names + self.File = class extends Blob { + name: string; + + constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) { + if (options) { + const { type, ...rest } = options; + super(fileBits, { type }); + Object.assign(this, rest); + } else { + super(fileBits); + } + + this.name = fileName; + } + } as typeof File; +} + +export function dataUriToBlob(dataUri: string) { + const arr = dataUri.split(','); + const mime = arr[0].match(/:(.*?);/)![1]; + const bstr = atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + return new Blob([u8arr], { type: mime }); +} + +export function blobToDataUri(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + + reader.onload = (e: ProgressEvent) => { + const { result } = e.target || {}; + if (typeof result === 'string') { + resolve(result); + } + + reject(new Error('Failed to read blob')); + }; + + reader.onerror = reject; + reader.readAsDataURL(blob); + }); +} + +export function blobToFile(blob: Blob, fileName: string) { + return new File([blob], fileName, { + lastModified: Date.now(), + type: blob.type, + }); +} + +export function preloadImage(url: string): Promise { + return new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = reject; + img.src = url; + }); +} + +export function preloadVideo(url: string): Promise { + return new Promise((resolve, reject) => { + const video = document.createElement('video'); + video.volume = 0; + video.onloadedmetadata = () => resolve(video); + video.onerror = reject; + video.src = url; + }); +} + +export async function createPosterForVideo(url: string): Promise { + const video = await preloadVideo(url); + + return Promise.race([ + pause(2000) as Promise, + new Promise((resolve, reject) => { + video.onseeked = () => { + const canvas = document.createElement('canvas'); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + const ctx = canvas.getContext('2d')!; + ctx.drawImage(video, 0, 0); + resolve(canvas.toDataURL('image/jpeg')); + }; + video.onerror = reject; + video.currentTime = Math.min(video.duration, 1); + }), + ]); +} + +export async function fetchBlob(blobUrl: string) { + const response = await fetch(blobUrl); + return response.blob(); +} + +export async function fetchFile(blobUrl: string, fileName: string) { + const blob = await fetchBlob(blobUrl); + return blobToFile(blob, fileName); +} + +export function imgToCanvas(img: HTMLImageElement) { + const canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + + const ctx = canvas.getContext('2d')!; + ctx.drawImage(img, 0, 0); + + return canvas; +} diff --git a/src/util/findInViewport.ts b/src/util/findInViewport.ts new file mode 100644 index 000000000..b4ff2166a --- /dev/null +++ b/src/util/findInViewport.ts @@ -0,0 +1,34 @@ +export default function findInViewport( + container: HTMLElement, + selectorOrElements: string | NodeListOf, + margin = 0, + isDense = false, + shouldContainBottom = false, +) { + const viewportY1 = container.scrollTop; + const viewportY2 = viewportY1 + container.offsetHeight; + const allElements = typeof selectorOrElements === 'string' + ? container.querySelectorAll(selectorOrElements) + : selectorOrElements; + const { length } = allElements; + const visibleIndexes: number[] = []; + let isFound = false; + + for (let i = 0; i < length; i++) { + const element = allElements[i]; + const y1 = element.offsetTop; + const y2 = y1 + element.offsetHeight; + const isVisible = shouldContainBottom + ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin + : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin; + + if (isVisible) { + visibleIndexes.push(i); + isFound = true; + } else if (isFound && !isDense) { + break; + } + } + + return { allElements, visibleIndexes }; +} diff --git a/src/util/focusEditableElement.ts b/src/util/focusEditableElement.ts new file mode 100644 index 000000000..f987914df --- /dev/null +++ b/src/util/focusEditableElement.ts @@ -0,0 +1,16 @@ +export default function focusEditableElement(element: HTMLElement, force?: boolean) { + if (!force && element === document.activeElement) { + return; + } + const selection = window.getSelection()!; + const range = document.createRange(); + + if (!element.lastChild || !element.lastChild.nodeValue) { + element.focus(); + return; + } + + range.setStart(element.lastChild, element.lastChild.nodeValue.length); + selection.removeAllRanges(); + selection.addRange(range); +} diff --git a/src/util/fonts.ts b/src/util/fonts.ts new file mode 100644 index 000000000..97ee6f5ff --- /dev/null +++ b/src/util/fonts.ts @@ -0,0 +1,9 @@ +const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto']; + +export default function preloadFonts() { + if ('fonts' in document) { + return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font))); + } + + return undefined; +} diff --git a/src/util/generateIdFor.ts b/src/util/generateIdFor.ts new file mode 100644 index 000000000..652f60438 --- /dev/null +++ b/src/util/generateIdFor.ts @@ -0,0 +1,9 @@ +export default (store: AnyLiteral) => { + let id; + + do { + id = String(Math.random()).replace('0.', 'id'); + } while (store.hasOwnProperty(id)); + + return id; +}; diff --git a/src/util/getElementHasScroll.ts b/src/util/getElementHasScroll.ts new file mode 100644 index 000000000..7d0233f3b --- /dev/null +++ b/src/util/getElementHasScroll.ts @@ -0,0 +1,3 @@ +export default function getElementHasScroll(el: HTMLElement): boolean { + return el.scrollHeight > el.clientHeight; +} diff --git a/src/util/getReadableErrorText.ts b/src/util/getReadableErrorText.ts new file mode 100644 index 000000000..6aacf1685 --- /dev/null +++ b/src/util/getReadableErrorText.ts @@ -0,0 +1,73 @@ +import { ApiError } from '../api/types'; + +const READABLE_ERROR_MESSAGES: Record = { + CHAT_RESTRICTED: 'You can\'t send messages in this chat, you were restricted', + CHAT_WRITE_FORBIDDEN: 'You can\'t write in this chat', + CHAT_SEND_POLL_FORBIDDEN: 'You can\'t create polls in this chat', + CHAT_SEND_STICKERS_FORBIDDEN: 'You can\'t send stickers in this chat', + CHAT_SEND_GIFS_FORBIDDEN: 'You can\'t send gifs in this chat', + CHAT_SEND_MEDIA_FORBIDDEN: 'You can\'t send media in this chat', + CHAT_LINK_EXISTS: 'The chat is public, you can\'t hide the history to new users', + // eslint-disable-next-line max-len + SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.', + USER_BANNED_IN_CHANNEL: 'You\'re banned from sending messages in supergroups / channels', + USER_IS_BLOCKED: 'You were blocked by this user', + YOU_BLOCKED_USER: 'You blocked this user', + IMAGE_PROCESS_FAILED: 'Failure while processing image', + MEDIA_EMPTY: 'The provided media object is invalid', + MEDIA_INVALID: 'Media invalid', + PHOTO_EXT_INVALID: 'The extension of the photo is invalid', + PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid', + PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later', + // eslint-disable-next-line max-len + MESSAGE_DELETE_FORBIDDEN: 'You can\'t delete one of the messages you tried to delete, most likely because it is a service message.', + MESSAGE_POLL_CLOSED: 'Poll closed', + MESSAGE_EDIT_TIME_EXPIRED: 'You can\'t edit this message anymore.', + CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this', + PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top', + DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\'t have more than 10 folders', + CHANNEL_PRIVATE: 'This channel is private', + MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long', + ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid', + ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid', + ADDRESS_CITY_INVALID: 'The city you provided is not valid', + ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid', + ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid', + ADDRESS_STATE_INVALID: 'The state you provided is not valid', + REQ_INFO_NAME_INVALID: 'The name you provided is not valid', + REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid', + REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid', + CHANNEL_INVALID: 'An error occurred. Please try again later', + LINK_NOT_MODIFIED: 'This discussion is already linked to the channel', + + // Non-API errors + SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.', + // eslint-disable-next-line max-len + CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.', + // eslint-disable-next-line max-len + FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session', + + BOTS_TOO_MUCH: 'There are too many bots in this chat/channel', + BOT_GROUPS_BLOCKED: 'This bot can\'t be added to groups', + USERS_TOO_MUCH: 'The maximum number of users has been exceeded', + USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups', + USER_KICKED: 'This user was kicked from this supergroup/channel', + USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact', + USER_PRIVACY_RESTRICTED: 'The user\'s privacy settings do not allow you to do this', +}; + +export default function getReadableErrorText(error: ApiError) { + const { message, isSlowMode, textParams } = error; + // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs + if (isSlowMode) { + const extraPartIndex = message.indexOf(' (caused by'); + return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message; + } + let errorMessage = READABLE_ERROR_MESSAGES[message]; + if (errorMessage && textParams) { + errorMessage = Object.keys(textParams).reduce((acc, current) => { + return acc.replace(current, textParams[current]); + }, errorMessage as string); + } + return errorMessage; +} diff --git a/src/util/handleError.ts b/src/util/handleError.ts new file mode 100644 index 000000000..e17d42a3a --- /dev/null +++ b/src/util/handleError.ts @@ -0,0 +1,51 @@ +import { + DEBUG_ALERT_MSG, GLOBAL_STATE_CACHE_KEY, GRAMJS_SESSION_ID_KEY, +} from '../config'; +import { throttle } from './schedulers'; + +window.addEventListener('error', handleErrorEvent); +window.addEventListener('unhandledrejection', handleErrorEvent); + +// eslint-disable-next-line prefer-destructuring +const APP_ENV = process.env.APP_ENV; +const STARTUP_TIMEOUT = 5000; + +const startedAt = Date.now(); +let isReloading = false; + +function handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) { + e.preventDefault(); + + handleError(e instanceof ErrorEvent ? e.error : e.reason); +} + +const throttledAlert = throttle(window.alert, 1000); + +export function handleError(err: Error) { + // eslint-disable-next-line no-console + console.error(err); + + if (isReloading) { + return; + } + + // For startup errors, we just clean the cache or the session and refresh the page. + if (Date.now() - startedAt <= STARTUP_TIMEOUT) { + if (localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) { + localStorage.removeItem(GLOBAL_STATE_CACHE_KEY); + } else if (localStorage.getItem(GRAMJS_SESSION_ID_KEY)) { + localStorage.removeItem(GRAMJS_SESSION_ID_KEY); + } else { + return; + } + + isReloading = true; + window.location.reload(); + + return; + } + + if (APP_ENV === 'development' || APP_ENV === 'staging') { + throttledAlert(`${DEBUG_ALERT_MSG}\n\n${(err && err.message) || err}\n${err && err.stack}`); + } +} diff --git a/src/util/insertHtmlInSelection.ts b/src/util/insertHtmlInSelection.ts new file mode 100644 index 000000000..082c78eb8 --- /dev/null +++ b/src/util/insertHtmlInSelection.ts @@ -0,0 +1,18 @@ +export default function insertHtmlInSelection(html: string) { + const selection = window.getSelection(); + + if (selection && selection.getRangeAt && selection.rangeCount) { + const range = selection.getRangeAt(0); + range.deleteContents(); + + const fragment = range.createContextualFragment(html); + const lastInsertedNode = fragment.lastChild; + range.insertNode(fragment); + if (lastInsertedNode) { + range.setStartAfter(lastInsertedNode); + range.setEndAfter(lastInsertedNode); + selection.removeAllRanges(); + selection.addRange(range); + } + } +} diff --git a/src/util/isFullyVisible.ts b/src/util/isFullyVisible.ts new file mode 100644 index 000000000..7cdeed367 --- /dev/null +++ b/src/util/isFullyVisible.ts @@ -0,0 +1,9 @@ +function isFullyVisible(container: HTMLElement, element: HTMLElement) { + const viewportY1 = container.scrollTop; + const viewportY2 = viewportY1 + container.offsetHeight; + const y1 = element.offsetTop; + const y2 = y1 + element.offsetHeight; + return y1 > viewportY1 && y2 < viewportY2; +} + +export default isFullyVisible; diff --git a/src/util/iteratees.ts b/src/util/iteratees.ts new file mode 100644 index 000000000..d4b8b3d5c --- /dev/null +++ b/src/util/iteratees.ts @@ -0,0 +1,183 @@ +type CollectionByKey = Record; + +type OrderDirection = 'asc' | 'desc'; + +interface OrderCallback { + (member: T): any; +} + +export function buildCollectionByKey(collection: T[], key: keyof T) { + return collection.reduce((byKey: CollectionByKey, member: T) => { + byKey[member[key]] = member; + + return byKey; + }, {}); +} + +export function mapValues( + byKey: CollectionByKey, + callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R, +): CollectionByKey { + return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => { + newByKey[key] = callback(byKey[key], key, index, byKey); + return newByKey; + }, {}); +} + +export function pick(object: T, keys: K[]) { + return keys.reduce((result, key) => { + result[key] = object[key]; + return result; + }, {} as Pick); +} + +export function pickTruthy(object: T, keys: K[]) { + return keys.reduce((result, key) => { + if (object[key]) { + result[key] = object[key]; + } + + return result; + }, {} as Pick); +} + +export function omit(object: T, keys: K[]) { + const stringKeys = new Set(keys.map(String)); + const savedKeys = Object.keys(object) + .filter((key) => !stringKeys.has(key)) as Array>; + + return pick(object, savedKeys); +} + +export function orderBy( + collection: T[], + orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[], + mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc', +): T[] { + return collection.sort((a, b) => { + if (Array.isArray(orderKey)) { + const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode]; + const [orderKey1, orderKey2] = orderKey; + + let aValue1; + let bValue1; + + if (typeof orderKey1 === 'function') { + aValue1 = orderKey1(a) || 0; + bValue1 = orderKey1(b) || 0; + } else if (typeof orderKey1 === 'string') { + aValue1 = a[orderKey1] || 0; + bValue1 = b[orderKey1] || 0; + } + + if (aValue1 !== bValue1) { + return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1; + } else { + let aValue2; + let bValue2; + + if (typeof orderKey2 === 'function') { + aValue2 = orderKey2(a) || 0; + bValue2 = orderKey2(b) || 0; + } else if (typeof orderKey2 === 'string') { + aValue2 = a[orderKey2] || 0; + bValue2 = b[orderKey2] || 0; + } + + return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2; + } + } + + let aValue; + let bValue; + + if (typeof orderKey === 'function') { + aValue = orderKey(a) || 0; + bValue = orderKey(b) || 0; + } else if (typeof orderKey === 'string') { + aValue = a[orderKey] || 0; + bValue = b[orderKey] || 0; + } + + return mode === 'asc' ? aValue - bValue : bValue - aValue; + }); +} + +export function flatten(array: any[]) { + return array.reduce((result, member) => { + if (Array.isArray(member)) { + return result.concat(member); + } else { + result.push(member); + return result; + } + }, []); +} + +export function unique(array: T[]): T[] { + return Array.from(new Set(array)); +} + +export function compact(array: any[]) { + return array.filter(Boolean); +} + +export function areSortedArraysEqual(array1: any[], array2: any[]) { + if (array1.length !== array2.length) { + return false; + } + + return array1.every((item, i) => item === array2[i]); +} + +export function areSortedArraysIntersecting(array1: any[], array2: any[]) { + return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0]; +} + +export function findIntersectionWithSet(array: T[], set: Set): T[] { + return array.filter((a) => set.has(a)); +} + +export function split(array: any[], chunkSize: number) { + const result = []; + for (let i = 0; i < array.length; i += chunkSize) { + result.push(array.slice(i, i + chunkSize)); + } + + return result; +} + +export function cloneDeep(value: T): T { + if (typeof value !== 'object') { + return value; + } + + if (Array.isArray(value)) { + return value.map(cloneDeep) as typeof value; + } + + return Object.keys(value).reduce((acc, key) => { + acc[key as keyof T] = cloneDeep(value[key as keyof T]); + return acc; + }, {} as T); +} + +/** + * Returns the index of the last element in the array where predicate is true, and -1 otherwise. + * + * @param array The source array to search in + * @param predicate find calls predicate once for each element of the array, in descending + * order, until it finds one where predicate returns true. If such an element is found, + * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1. + */ +export function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined { + let cursor = array.length; + + while (cursor--) { + if (predicate(array[cursor], cursor, array)) { + return array[cursor]; + } + } + + return undefined; +} diff --git a/src/util/langProvider.ts b/src/util/langProvider.ts new file mode 100644 index 000000000..8ebdf6402 --- /dev/null +++ b/src/util/langProvider.ts @@ -0,0 +1,162 @@ +import { ApiLangPack } from '../api/types'; + +import { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config'; +import * as cacheApi from './cacheApi'; +import { callApi } from '../api/gramjs'; +import { createCallbackManager } from './callbacks'; +import { mapValues } from './iteratees'; + +import enExtraJson from '../assets/lang/en-extra.json'; +import esExtraJson from '../assets/lang/es-extra.json'; +import itExtraJson from '../assets/lang/it-extra.json'; +import plExtraJson from '../assets/lang/pl-extra.json'; +import ruExtraJson from '../assets/lang/ru-extra.json'; +import { formatInteger } from './textFormat'; + +const EXTRA_PACK_PATHS: Record = { + en: enExtraJson as unknown as string, + es: esExtraJson as unknown as string, + it: itExtraJson as unknown as string, + pl: plExtraJson as unknown as string, + ru: ruExtraJson as unknown as string, +}; + +const PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const; +const PLURAL_RULES = { + /* eslint-disable max-len */ + en: (n: number) => (n !== 1 ? 6 : 2), + ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6), + ca: (n: number) => (n !== 1 ? 6 : 2), + de: (n: number) => (n !== 1 ? 6 : 2), + es: (n: number) => (n !== 1 ? 6 : 2), + fa: (n: number) => (n > 1 ? 6 : 2), + fr: (n: number) => (n > 1 ? 6 : 2), + id: () => 0, + it: (n: number) => (n !== 1 ? 6 : 2), + ko: () => 0, + ms: () => 0, + nl: (n: number) => (n !== 1 ? 6 : 2), + pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5), + pt_BR: (n: number) => (n > 1 ? 6 : 2), + ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5), + tr: (n: number) => (n > 1 ? 6 : 2), + uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5), + uz: (n: number) => (n > 1 ? 6 : 2), + /* eslint-enable max-len */ +}; + +const cache = new Map(); + +let langPack: ApiLangPack; + +const { + addCallback, + removeCallback, + runCallbacks, +} = createCallbackManager(); + +export { addCallback, removeCallback }; + +let currentLangCode: string | undefined; + +export async function setLanguage(langCode: string, callback?: NoneToVoidFunction) { + if (langPack && langCode === currentLangCode) { + document.documentElement.lang = langCode; + if (callback) { + callback(); + } + + return; + } + + const newLangPack = await fetchFromCacheOrRemote(langCode); + if (!newLangPack) { + return; + } + + if (EXTRA_PACK_PATHS[langCode]) { + try { + const response = await fetch(EXTRA_PACK_PATHS[langCode]); + const pairs = await response.json(); + const extraLangPack = mapValues(pairs, (value, key) => ({ key, value })); + + Object.assign(newLangPack, extraLangPack); + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error(err); + } + } + } + + cache.clear(); + + currentLangCode = langCode; + langPack = newLangPack; + document.documentElement.lang = langCode; + + if (callback) { + callback(); + } + + runCallbacks(langPack); +} + +export function getTranslation(key: string, value?: any, format?: 'i') { + if (value !== undefined) { + const cached = cache.get(`${key}_${value}_${format}`); + if (cached) { + return cached; + } + } + + if (!langPack) { + return key; + } + + const langString = langPack[key]; + if (!langString) { + return key; + } + + const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value']; + if (!template) { + return key; + } + + if (value !== undefined) { + const formattedValue = format === 'i' ? formatInteger(value) : value; + const result = processTemplate(template, formattedValue); + cache.set(`${key}_${value}_${format}`, result); + return result; + } + + return template; +} + +async function fetchFromCacheOrRemote(langCode: string): Promise { + const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json); + if (cached) { + return cached; + } + + const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode }); + if (remote) { + await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack); + return remote.langPack; + } + + return undefined; +} + +function getPluralOption(amount: number) { + const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES] + ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount) + : 0; + + return PLURAL_OPTIONS[optionIndex]; +} + +function processTemplate(template: string, value: any) { + return template.replace(/%\d?\$?[sdf@]/, String(value)); +} diff --git a/src/util/mediaLoader.ts b/src/util/mediaLoader.ts new file mode 100644 index 000000000..35ff44ca4 --- /dev/null +++ b/src/util/mediaLoader.ts @@ -0,0 +1,206 @@ +import { + ApiMediaFormat, + ApiMediaFormatToPrepared, + ApiOnProgress, + ApiParsedMedia, + ApiPreparedMedia, +} from '../api/types'; + +import { + DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS, +} from '../config'; +import { callApi, cancelApiProgress } from '../api/gramjs'; +import * as cacheApi from './cacheApi'; +import { fetchBlob } from './files'; +import { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment'; +import { oggToWav } from './oggToWav'; +import { webpToPng } from './webpToPng'; + +const asCacheApiType = { + [ApiMediaFormat.DataUri]: cacheApi.Type.Text, + [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob, + [ApiMediaFormat.Lottie]: cacheApi.Type.Json, + [ApiMediaFormat.Progressive]: undefined, + [ApiMediaFormat.Stream]: undefined, +}; + +const PROGRESSIVE_URL_PREFIX = './progressive/'; + +const memoryCache = new Map(); +const fetchPromises = new Map>(); + +export function fetch( + url: string, mediaFormat: T, onProgress?: ApiOnProgress, +): Promise> { + if (mediaFormat === ApiMediaFormat.Progressive) { + return ( + IS_PROGRESSIVE_SUPPORTED + ? getProgressive(url) + : fetch(url, ApiMediaFormat.BlobUrl, onProgress) + ) as Promise>; + } + + if (!fetchPromises.has(url)) { + const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress) + .catch((err) => { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn(err); + } + + return undefined; + }) + .finally(() => { + fetchPromises.delete(url); + }); + + fetchPromises.set(url, promise); + } + + return fetchPromises.get(url) as Promise>; +} + +export function getFromMemory(url: string) { + return memoryCache.get(url) as ApiMediaFormatToPrepared; +} + +export function cancelProgress(progressCallback: ApiOnProgress) { + cancelApiProgress(progressCallback); +} + +function getProgressive(url: string) { + const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`; + + memoryCache.set(url, progressiveUrl); + + return Promise.resolve(progressiveUrl); +} + +async function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) { + if (!MEDIA_CACHE_DISABLED) { + const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME; + const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!); + if (cached) { + let media = cached; + + if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) { + media = await oggToWav(media); + } + + if (cached.type === 'image/webp' && !isWebpSupported() && media) { + const mediaPng = await webpToPng(url, media); + if (mediaPng) { + media = mediaPng; + } + } + + const prepared = prepareMedia(media); + + memoryCache.set(url, prepared); + + return prepared; + } + } + + if (mediaFormat === ApiMediaFormat.Stream) { + const mediaSource = new MediaSource(); + const streamUrl = URL.createObjectURL(mediaSource); + let isOpen = false; + + mediaSource.addEventListener('sourceopen', () => { + if (isOpen) { + return; + } + isOpen = true; + + const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg'); + + void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => { + if (onProgress) { + onProgress(progress); + } + + if (progress === 1) { + mediaSource.endOfStream(); + } + + if (!arrayBuffer) { + return; + } + + sourceBuffer.appendBuffer(arrayBuffer!); + }); + }); + + memoryCache.set(url, streamUrl); + return streamUrl; + } + + const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress); + if (!remote) { + throw new Error('Failed to fetch media'); + } + + let { prepared, mimeType } = remote; + + if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) { + const blob = await fetchBlob(prepared as string); + URL.revokeObjectURL(prepared as string); + const media = await oggToWav(blob); + prepared = prepareMedia(media); + mimeType = blob.type; + } + + if (mimeType === 'image/webp' && !isWebpSupported()) { + const blob = await fetchBlob(prepared as string); + URL.revokeObjectURL(prepared as string); + const media = await webpToPng(url, blob); + if (media) { + prepared = prepareMedia(media); + mimeType = blob.type; + } + } + + memoryCache.set(url, prepared); + + return prepared; +} + +function prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia { + if (mediaData instanceof Blob) { + return URL.createObjectURL(mediaData); + } + + return mediaData; +} + +if (IS_PROGRESSIVE_SUPPORTED) { + navigator.serviceWorker.addEventListener('message', async (e) => { + const { type, messageId, params } = e.data as { + type: string; + messageId: string; + params: { url: string; start: number; end: number }; + }; + + if (type !== 'requestPart') { + return; + } + + const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params }); + if (!result) { + return; + } + + const { arrayBuffer, mimeType, fullSize } = result; + + navigator.serviceWorker.controller!.postMessage({ + type: 'partResponse', + messageId, + result: { + arrayBuffer, + mimeType, + fullSize, + }, + }, [arrayBuffer!]); + }); +} diff --git a/src/util/memo.ts b/src/util/memo.ts new file mode 100644 index 000000000..24917cf66 --- /dev/null +++ b/src/util/memo.ts @@ -0,0 +1 @@ +export const MEMO_EMPTY_ARRAY = []; diff --git a/src/util/moduleLoader.ts b/src/util/moduleLoader.ts new file mode 100644 index 000000000..438017844 --- /dev/null +++ b/src/util/moduleLoader.ts @@ -0,0 +1,77 @@ +import { DEBUG } from '../config'; + +export enum Bundles { + Auth, + Main, + Extra +} + +interface ImportedBundles { + [Bundles.Auth]: typeof import('../bundles/auth'); + [Bundles.Main]: typeof import('../bundles/main'); + [Bundles.Extra]: typeof import('../bundles/extra'); +} + +type BundlePromises = { + [K in keyof ImportedBundles]: Promise +}; + +export type BundleModules = keyof ImportedBundles[B]; + +const LOAD_PROMISES: Partial = {}; +const MEMORY_CACHE: Partial = {}; + +export async function loadModule>(bundleName: B, moduleName: M) { + if (!LOAD_PROMISES[bundleName]) { + switch (bundleName) { + case Bundles.Auth: + LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth'); + break; + case Bundles.Main: + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('>>> START LOAD MAIN BUNDLE'); + } + + LOAD_PROMISES[Bundles.Main] = import('../bundles/main'); + break; + case Bundles.Extra: + LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra'); + break; + } + + (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad); + } + + const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B]; + + if (!MEMORY_CACHE[bundleName]) { + MEMORY_CACHE[bundleName] = bundle; + } + + return getModuleFromMemory(bundleName, moduleName); +} + +export function getModuleFromMemory>(bundleName: B, moduleName: M) { + const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B]; + + if (!bundle) { + return undefined; + } + + return bundle[moduleName]; +} + +const listeners: NoneToVoidFunction[] = []; + +export function addLoadListener(listener: NoneToVoidFunction) { + if (!listeners.includes(listener)) { + listeners.push(listener); + } +} + +function handleBundleLoad() { + listeners.forEach((listener) => { + listener(); + }); +} diff --git a/src/util/oggToWav.ts b/src/util/oggToWav.ts new file mode 100644 index 000000000..4995471a6 --- /dev/null +++ b/src/util/oggToWav.ts @@ -0,0 +1,61 @@ +import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min'; +import WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min'; + +const SAMPLE_RATE = 48000; +const BIT_DEPTH = 16; + +export async function oggToWav(opusData: Blob): Promise { + const arrayBuffer = await new Response(opusData).arrayBuffer(); + + return new Promise((resolve) => { + const typedArray = new Uint8Array(arrayBuffer); + + let decoderWorker: DecoderWorker | undefined = new DecoderWorker(); + let wavWorker: WavWorker | undefined = new WavWorker(); + + decoderWorker.onmessage = (e) => { + // eslint-disable-next-line no-null/no-null + if (e.data === null) { + // `null` means decoder is finished + wavWorker!.postMessage({ command: 'done' }); + } else { + // `e.data` contains decoded buffers as float32 values + wavWorker!.postMessage( + { + command: 'encode', + buffers: e.data, + }, + e.data.map(({ buffer }: Float32Array) => buffer), + ); + } + }; + + wavWorker.onmessage = (e) => { + if (e.data.message === 'page') { + resolve(new Blob([e.data.page], { type: 'audio/wav' })); + + decoderWorker!.terminate(); + decoderWorker = undefined; + wavWorker!.terminate(); + wavWorker = undefined; + } + }; + + wavWorker.postMessage({ + command: 'init', + wavBitDepth: BIT_DEPTH, + wavSampleRate: SAMPLE_RATE, + }); + + decoderWorker.postMessage({ + command: 'init', + decoderSampleRate: SAMPLE_RATE, + outputBufferSampleRate: SAMPLE_RATE, + }); + + decoderWorker.postMessage({ + command: 'decode', + pages: typedArray, + }, [typedArray.buffer]); + }); +} diff --git a/src/util/patchSafariProgressiveAudio.ts b/src/util/patchSafariProgressiveAudio.ts new file mode 100644 index 000000000..727b49eb3 --- /dev/null +++ b/src/util/patchSafariProgressiveAudio.ts @@ -0,0 +1,39 @@ +/* + * Thanks to Ace Monkey for this mind-blowing patch. + */ + +export function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) { + if (audioEl.dataset.patchedForSafari) { + return; + } + + audioEl.addEventListener('play', () => { + const t = audioEl.currentTime; + + function onProgress() { + if (!audioEl.buffered.length) { + return; + } + + audioEl.dataset.patchForSafariInProgress = 'true'; + audioEl.currentTime = audioEl.duration - 1; + audioEl.addEventListener('progress', () => { + delete audioEl.dataset.patchForSafariInProgress; + audioEl.currentTime = t; + if (audioEl.paused) { + audioEl.play(); + } + }, { once: true }); + + audioEl.removeEventListener('progress', onProgress); + } + + audioEl.addEventListener('progress', onProgress); + }, { once: true }); + + audioEl.dataset.patchedForSafari = 'true'; +} + +export function isSafariPatchInProgress(audioEl: HTMLAudioElement) { + return Boolean(audioEl.dataset.patchForSafariInProgress); +} diff --git a/src/util/phoneNumber.ts b/src/util/phoneNumber.ts new file mode 100644 index 000000000..6b1b81f29 --- /dev/null +++ b/src/util/phoneNumber.ts @@ -0,0 +1,71 @@ +import countryList from './countries'; + +export function getCountryById(id: string) { + return countryList.find((c) => c.id === id) as Country; +} + +// Empty groups are used to preserve 5 callback arguments for `replace` method +function getPhoneNumberFormat(country?: Country) { + const id = country ? country.id : 'UNKNOWN'; + + switch (id) { + case 'RU': + case 'US': + return /(\d{1,3})(\d{1,3})?(\d{1,2})?(\d{1,2})?()?/; + case 'GB': + return /(\d{1,4})(\d{1,5})?()?()?()?/; + case 'UA': + case 'FI': + case 'AE': + return /(\d{1,2})(\d{1,3})?(\d{1,2})?(\d{1,2})?()?/; + default: + return /(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/; + } +} + +export function getCountryFromPhoneNumber(input: string) { + let phoneNumber = input.replace(/[^\d+]+/g, ''); + if (!phoneNumber.startsWith('+')) { + phoneNumber = `+${phoneNumber}`; + } + + const possibleCountries = countryList + .filter((country: Country) => phoneNumber.startsWith(country.code)) + .sort((a, b) => a.code.length - b.code.length); + + return possibleCountries[possibleCountries.length - 1]; +} + +export function formatPhoneNumber(input: string, country?: Country) { + let phoneNumber = input.replace(/[^\d]+/g, ''); + if (country) { + phoneNumber = phoneNumber.substr(country.code.length - 1); + } else if (input.startsWith('+')) { + return input; + } + + phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => { + const separator = country && country.id === 'GB' ? ' ' : '-'; + + let output = ''; + if (p1) output = `${p1}`; + if (p2) output += ` ${p2}`; + if (p3) output += `${separator}${p3}`; + if (p4) output += `${separator}${p4}`; + if (p5) output += `${separator}${p5}`; + return output; + }); + + return phoneNumber; +} + +export function formatPhoneNumberWithCode(phoneNumber: string) { + const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`; + const country = getCountryFromPhoneNumber(numberWithPlus); + if (!country) { + return numberWithPlus; + } + return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`; +} + +export { countryList }; diff --git a/src/util/requestQuery.ts b/src/util/requestQuery.ts new file mode 100644 index 000000000..fdd36f75a --- /dev/null +++ b/src/util/requestQuery.ts @@ -0,0 +1,4 @@ +export function buildQueryString(data: Record) { + const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&'); + return query.length > 0 ? `?${query}` : ''; +} diff --git a/src/util/resetScroll.ts b/src/util/resetScroll.ts new file mode 100644 index 000000000..12acc3683 --- /dev/null +++ b/src/util/resetScroll.ts @@ -0,0 +1,15 @@ +import { IS_IOS } from './environment'; + +export default (container: HTMLDivElement, scrollTop?: number) => { + if (IS_IOS) { + container.style.overflow = 'hidden'; + } + + if (scrollTop !== undefined) { + container.scrollTop = scrollTop; + } + + if (IS_IOS) { + container.style.overflow = ''; + } +}; diff --git a/src/util/safePlay.ts b/src/util/safePlay.ts new file mode 100644 index 000000000..15619bedc --- /dev/null +++ b/src/util/safePlay.ts @@ -0,0 +1,10 @@ +import { DEBUG } from '../config'; + +export default (mediaEl: HTMLMediaElement) => { + mediaEl.play().catch((err) => { + if (DEBUG) { + // eslint-disable-next-line no-console + console.warn(err); + } + }); +}; diff --git a/src/util/schedulers.ts b/src/util/schedulers.ts new file mode 100644 index 000000000..7cb25ff25 --- /dev/null +++ b/src/util/schedulers.ts @@ -0,0 +1,152 @@ +type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow; + +export function debounce( + fn: F, + ms: number, + shouldRunFirst = true, + shouldRunLast = true, +) { + let waitingTimeout: number | undefined; + + return (...args: Parameters) => { + if (waitingTimeout) { + clearTimeout(waitingTimeout); + waitingTimeout = undefined; + } else if (shouldRunFirst) { + // @ts-ignore + fn(...args); + } + + // eslint-disable-next-line no-restricted-globals + waitingTimeout = self.setTimeout(() => { + if (shouldRunLast) { + // @ts-ignore + fn(...args); + } + + waitingTimeout = undefined; + }, ms); + }; +} + +export function throttle( + fn: F, + ms: number, + shouldRunFirst = true, +) { + let interval: number | undefined; + let isPending: boolean; + let args: Parameters; + + return (..._args: Parameters) => { + isPending = true; + args = _args; + + if (!interval) { + if (shouldRunFirst) { + isPending = false; + // @ts-ignore + fn(...args); + } + + // eslint-disable-next-line no-restricted-globals + interval = self.setInterval(() => { + if (!isPending) { + // eslint-disable-next-line no-restricted-globals + self.clearInterval(interval!); + interval = undefined; + return; + } + + isPending = false; + // @ts-ignore + fn(...args); + }, ms); + } + }; +} + +export function throttleWithRaf(fn: F) { + return throttleWith(fastRaf, fn); +} + +export function throttleWithPrimaryRaf(fn: F) { + return throttleWith(fastPrimaryRaf, fn); +} + +export function throttleWithTickEnd(fn: F) { + return throttleWith(onTickEnd, fn); +} + +export function throttleWithNow(fn: F) { + return throttleWith(runNow, fn); +} + +export function throttleWith(schedulerFn: Scheduler, fn: F) { + let waiting = false; + let args: Parameters; + + return (..._args: Parameters) => { + args = _args; + + if (!waiting) { + waiting = true; + + schedulerFn(() => { + waiting = false; + // @ts-ignore + fn(...args); + }); + } + }; +} + +export function onTickEnd(cb: NoneToVoidFunction) { + Promise.resolve().then(cb); +} + +export function onIdle(cb: NoneToVoidFunction) { + // eslint-disable-next-line no-restricted-globals + if (self.requestIdleCallback) { + // eslint-disable-next-line no-restricted-globals + self.requestIdleCallback(cb); + } else { + onTickEnd(cb); + } +} + +function runNow(fn: NoneToVoidFunction) { + fn(); +} + +export const pause = (ms: number) => new Promise((resolve) => { + setTimeout(() => resolve(), ms); +}); + +export function rafPromise() { + return new Promise((resolve) => { + requestAnimationFrame(resolve); + }); +} + +let fastRafCallbacks: NoneToVoidFunction[] | undefined; + +export function fastRaf(callback: NoneToVoidFunction, isPrimary = false) { + if (!fastRafCallbacks) { + fastRafCallbacks = [callback]; + + requestAnimationFrame(() => { + const currentCallbacks = fastRafCallbacks!; + fastRafCallbacks = undefined; + currentCallbacks.forEach((cb) => cb()); + }); + } else if (isPrimary) { + fastRafCallbacks.unshift(callback); + } else { + fastRafCallbacks.push(callback); + } +} + +export function fastPrimaryRaf(callback: NoneToVoidFunction) { + return fastRaf(callback, true); +} diff --git a/src/util/scrollLock.ts b/src/util/scrollLock.ts new file mode 100644 index 000000000..aa2b716e8 --- /dev/null +++ b/src/util/scrollLock.ts @@ -0,0 +1,41 @@ +const IGNORED_KEYS: Record = { + Down: true, + ArrowDown: true, + Up: true, + ArrowUp: true, + Left: true, + ArrowLeft: true, + Right: true, + ArrowRight: true, + ' ': true, + PageUp: true, + PageDown: true, + End: true, + Home: true, + Tab: true, +}; + +const preventDefault = (e: Event) => { + e.preventDefault(); +}; + +function preventDefaultForScrollKeys(e: KeyboardEvent) { + if (IGNORED_KEYS[e.key]) { + preventDefault(e); + } +} + +export function disableScrolling() { + // Disable scrolling in Chrome + document.addEventListener('wheel', preventDefault, { passive: false }); + window.ontouchmove = preventDefault; // mobile + document.onkeydown = preventDefaultForScrollKeys; +} + +export function enableScrolling() { + document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome + // eslint-disable-next-line no-null/no-null + window.ontouchmove = null; + // eslint-disable-next-line no-null/no-null + document.onkeydown = null; +} diff --git a/src/util/searchWords.ts b/src/util/searchWords.ts new file mode 100644 index 000000000..5b3b52bd8 --- /dev/null +++ b/src/util/searchWords.ts @@ -0,0 +1,14 @@ +const RE_NOT_LETTER = /[^\wа-яё]+/; + +export default function searchWords(haystack: string, needle: string) { + if (!haystack || !needle) { + return false; + } + + const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER); + const needleWords = needle.toLowerCase().split(RE_NOT_LETTER); + + return needleWords.every((needleWord) => ( + haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord)) + )); +} diff --git a/src/util/setupServiceWorker.ts b/src/util/setupServiceWorker.ts new file mode 100644 index 000000000..d69e969a3 --- /dev/null +++ b/src/util/setupServiceWorker.ts @@ -0,0 +1,38 @@ +import { scriptUrl } from 'service-worker-loader!../serviceWorker'; + +import { DEBUG } from '../config'; +import { IS_SERVICE_WORKER_SUPPORTED } from './environment'; +import { getDispatch } from '../lib/teact/teactn'; + +if (IS_SERVICE_WORKER_SUPPORTED) { + window.addEventListener('load', async () => { + try { + await navigator.serviceWorker.register(scriptUrl); + + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('ServiceWorker registered'); + } + + await navigator.serviceWorker.ready; + + if (navigator.serviceWorker.controller) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.log('ServiceWorker ready'); + } + } else { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('ServiceWorker not available'); + } + getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } }); + } + } catch (err) { + if (DEBUG) { + // eslint-disable-next-line no-console + console.error('ServiceWorker registration failed: ', err); + } + } + }); +} diff --git a/src/util/systemFilesDialog.ts b/src/util/systemFilesDialog.ts new file mode 100644 index 000000000..3fd4ddcbe --- /dev/null +++ b/src/util/systemFilesDialog.ts @@ -0,0 +1,23 @@ +let fileSelector: HTMLInputElement; + +export function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) { + if (!fileSelector) { + fileSelector = document.createElement('input'); + fileSelector.setAttribute('type', 'file'); + } + + fileSelector.setAttribute('accept', accept); + + if (noMultiple) { + fileSelector.removeAttribute('multiple'); + } else { + fileSelector.setAttribute('multiple', 'multiple'); + } + + // eslint-disable-next-line no-null/no-null + fileSelector.onchange = null; + fileSelector.value = ''; + fileSelector.onchange = callback; + + fileSelector.click(); +} diff --git a/src/util/textFormat.ts b/src/util/textFormat.ts new file mode 100644 index 000000000..63f8053b9 --- /dev/null +++ b/src/util/textFormat.ts @@ -0,0 +1,34 @@ +export function formatInteger(value: number) { + return String(value).replace(/\d(?=(\d{3})+$)/g, '$& '); +} + +function formatFixedNumber(number: number) { + const fixed = String(number.toFixed(1)); + if (fixed.substr(-2) === '.0') { + return Math.round(number); + } + + return number.toFixed(1).replace('.', ','); +} + +export function formatIntegerCompact(views: number) { + if (views < 1e3) { + return views; + } + + if (views < 1e6) { + return `${formatFixedNumber(views / 1e3)}K`; + } + + return `${formatFixedNumber(views / 1e6)}M`; +} + +export function getFirstLetters(phrase: string, count = 2) { + return phrase + .replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi, '') + .trim() + .split(/\s+/) + .slice(0, count) + .map((word: string) => word.length && word.match(/./u)![0].toUpperCase()) + .join(''); +} diff --git a/src/util/trapFocus.ts b/src/util/trapFocus.ts new file mode 100644 index 000000000..29746f7dd --- /dev/null +++ b/src/util/trapFocus.ts @@ -0,0 +1,39 @@ +export default function trapFocus(element: HTMLElement) { + function handleKeyDown(e: KeyboardEvent) { + if (e.key !== 'Tab') { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + const focusableElements = Array.from( + element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'), + ) as HTMLElement[]; + if (!focusableElements.length) { + return; + } + + const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement)); + let newFocusedIndex = 0; + if (currentFocusedIndex >= 0) { + if (e.shiftKey) { + newFocusedIndex = currentFocusedIndex > 0 + ? currentFocusedIndex - 1 + : focusableElements.length - 1; + } else { + newFocusedIndex = currentFocusedIndex < focusableElements.length - 1 + ? currentFocusedIndex + 1 + : 0; + } + } + + focusableElements[newFocusedIndex].focus(); + } + + document.addEventListener('keydown', handleKeyDown, false); + + return () => { + document.removeEventListener('keydown', handleKeyDown, false); + }; +} diff --git a/src/util/trimText.ts b/src/util/trimText.ts new file mode 100644 index 000000000..20038fdf8 --- /dev/null +++ b/src/util/trimText.ts @@ -0,0 +1,9 @@ +const DEFAULT_MAX_TEXT_LENGTH = 30; + +export default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) { + if (!text || text.length <= length) { + return text; + } + + return `${text.substr(0, length)}...`; +} diff --git a/src/util/voiceRecording.ts b/src/util/voiceRecording.ts new file mode 100644 index 000000000..c1c00c228 --- /dev/null +++ b/src/util/voiceRecording.ts @@ -0,0 +1,118 @@ +// @ts-ignore +import encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min'; + +export type Result = { blob: Blob; duration: number; waveform: number[] }; + +interface OpusRecorder extends Omit { + new(options: AnyLiteral): OpusRecorder; + + start(stream?: MediaStreamAudioSourceNode): void; + + sourceNode: MediaStreamAudioSourceNode; + + ondataavailable: (typedArray: Uint8Array) => void; +} + +const MIN_RECORDING_TIME = 1000; +const POLYFILL_OPTIONS = { encoderPath, reuseWorker: true }; +const BLOB_PARAMS = { type: 'audio/ogg' }; +const FFT_SIZE = 64; +const MIN_VOLUME = 0.1; + +let opusRecorderPromise: Promise<{ default: OpusRecorder }>; +let OpusRecorder: OpusRecorder; +let mediaRecorder: OpusRecorder; + +export async function init() { + if (!opusRecorderPromise) { + // @ts-ignore + opusRecorderPromise = import('opus-recorder'); + OpusRecorder = (await opusRecorderPromise).default; + mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS); + } + + return opusRecorderPromise; +} + +export async function start(analyzerCallback: Function) { + await startMediaRecorder(); + + const startedAt = Date.now(); + let pausedAt: number; + const chunks: Uint8Array[] = []; + const waveform: number[] = []; + + mediaRecorder.ondataavailable = (typedArray) => { + chunks.push(typedArray); + }; + + const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => { + waveform.push(volume * 255); + analyzerCallback(volume); + }); + + return { + stop: () => new Promise((resolve, reject) => { + mediaRecorder.onstop = () => { + resolve({ + blob: new Blob(chunks, BLOB_PARAMS), + duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000), + waveform, + }); + }; + mediaRecorder.onerror = reject; + + const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now()); + setTimeout(() => { + mediaRecorder.stop(); + releaseAnalyzer(); + }, delayStop); + }), + pause: () => { + const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now()); + setTimeout(() => { + mediaRecorder.pause(); + pausedAt = Date.now(); + releaseAnalyzer(); + }, delayStop); + }, + }; +} + +async function startMediaRecorder() { + await init(); + await mediaRecorder.start(); +} + +function subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) { + const source = recorder.sourceNode; + const analyser = source.context.createAnalyser(); + analyser.fftSize = FFT_SIZE; + source.connect(analyser); + + const dataLength = analyser.frequencyBinCount; + const dataArray = new Uint8Array(dataLength); + let isDestroyed = false; + + function tick() { + if (isDestroyed) { + return; + } + + analyser.getByteFrequencyData(dataArray); + + const sum = dataArray.reduce((acc, current) => acc + current, 0); + const mean = (sum / dataLength); + const volume = mean / 255; + + cb(volume < MIN_VOLUME ? 0 : volume); + + requestAnimationFrame(tick); + } + + tick(); + + return () => { + isDestroyed = true; + }; +} diff --git a/src/util/waveform.ts b/src/util/waveform.ts new file mode 100644 index 000000000..c89cb1c7a --- /dev/null +++ b/src/util/waveform.ts @@ -0,0 +1,51 @@ +/* eslint-disable no-bitwise */ + +// eslint-disable-next-line max-len +// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018 +export function decodeWaveform(encoded5bit: Uint8Array) { + const bitsCount = encoded5bit.length * 8; + const valuesCount = Math.floor(bitsCount / 5); + if (!valuesCount) { + return []; + } + + // Read each 5 bit of encoded5bit as 0-31 unsigned char. + // We count the index of the byte in which the desired 5-bit sequence starts. + // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits. + // + // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it. + // Because it will be an overflow (we'll access one byte after the available memory). + // We see, that only the last 5 bits could start in the last available byte and be problematic. + // So we read in a general way all the entries in a general way except the last one. + const result = Array(valuesCount); + const bitsData = encoded5bit; + for (let i = 0, l = valuesCount - 1; i !== l; ++i) { + const byteIndex = Math.floor((i * 5) / 8); + const bitShift = Math.floor((i * 5) % 8); + const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8); + result[i] = ((value >> bitShift) & 0x1F); + } + const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8); + const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8); + const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8); + result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F; + + return result; +} + +export function interpolateArray(data: number[], fitCount: number) { + let peak = 0; + const newData = new Array(fitCount); + const springFactor = data.length / fitCount; + const leftFiller = data[0]; + const rightFiller = data[data.length - 1]; + for (let i = 0; i < fitCount; i++) { + const idx = Math.floor(i * springFactor); + const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3; + newData[i] = val; + if (peak < val) { + peak = val; + } + } + return { data: newData, peak }; +} diff --git a/src/util/webpToPng.ts b/src/util/webpToPng.ts new file mode 100644 index 000000000..1d5e3312e --- /dev/null +++ b/src/util/webpToPng.ts @@ -0,0 +1,104 @@ +import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker'; +import { isWebpSupported } from './environment'; +import { dataUriToBlob, blobToDataUri } from './files'; +import { pause } from './schedulers'; + +type TEncodedImage = { + result: Uint8ClampedArray; + width: number; + height: number; +}; + +const WORKER_INITIALIZATION_TIMEOUT = 2000; + +let canvas: HTMLCanvasElement; +let worker: IWebpWorker; + +export const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk' + + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII='; + +export async function webpToPng(url: string, blob: Blob): Promise { + initWebpWorker(); + + while (!worker.wasmReady) { + await pause(WORKER_INITIALIZATION_TIMEOUT); + } + + const { result, width, height } = await getDecodePromise(url, blob); + if (!width || !height) { + return undefined; + } + + return createPng({ result, width, height }); +} + +export async function webpToPngBase64(key: string, url: string): Promise { + if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') { + return url; + } + + initWebpWorker(); + + const pngBlob = await webpToPng(key, dataUriToBlob(url)); + + if (!pngBlob) { + throw new Error(`Can't convert webp to png. Url: ${url}`); + } + + return blobToDataUri(pngBlob); +} + +function initWebpWorker() { + if (!worker) { + worker = new WebpWorker() as IWebpWorker; + worker.wasmReady = false; + worker.onmessage = handleLibWebpMessage; + } +} + +function createPng({ result, width, height }: TEncodedImage): Promise { + if (!canvas) { + canvas = document.createElement('canvas'); + } + + return new Promise((resolve) => { + const img = new ImageData(result, width, height); + + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext('2d')!; + ctx.putImageData(img, 0, 0); + + canvas.toBlob((blob) => { + resolve(blob ?? undefined); + }, 'image/png', 1); + }); +} + +function handleLibWebpMessage(e: MessageEvent) { + const { id } = e.data; + switch (e.data.type) { + case 'initialized': { + worker.wasmReady = true; + break; + } + + case 'result': { + if (worker.requests.has(id)) { + const resolve = worker.requests.get(id)!; + + worker.requests.delete(id); + resolve(e.data!); + } + break; + } + } +} + +function getDecodePromise(url: string, blob: Blob): Promise { + return new Promise((resolve) => { + worker.requests = worker.requests || new Map(); + worker.requests.set(url, resolve); + worker.postMessage({ id: url, blob }); + }); +} diff --git a/src/util/windowSize.ts b/src/util/windowSize.ts new file mode 100644 index 000000000..fd8de5a9c --- /dev/null +++ b/src/util/windowSize.ts @@ -0,0 +1,30 @@ +import { throttle } from './schedulers'; + +type IDimensions = { + width: number; + height: number; +}; + +let windowSize = updateSizes(); + +export function updateSizes(): IDimensions { + const vh = window.innerHeight * 0.01; + + document.documentElement.style.setProperty('--vh', `${vh}px`); + + return { + width: window.innerWidth, + height: window.innerHeight, + }; +} + +const handleResize = throttle(() => { + windowSize = updateSizes(); +}, 250, true); + +window.addEventListener('resize', handleResize); +window.addEventListener('orientationchange', handleResize); + +export default { + get: () => windowSize, +}; diff --git a/tests/assertions.ts b/tests/assertions.ts new file mode 100644 index 000000000..413198ae1 --- /dev/null +++ b/tests/assertions.ts @@ -0,0 +1,186 @@ +import { ActionTypes } from '../src/global/types'; +import { addReducer, getGlobal } from '../src/lib/teact/teactn'; + +import { selectChat, selectUser } from '../src/modules/selectors'; +import { getChatTitle, getUserFullName } from '../src/modules/helpers'; + +export function expectIncoming(messageElement: HTMLDivElement) { + expect(messageElement).not.toHaveClass('own'); +} + +export function expectOutgoing(messageElement: HTMLDivElement) { + expect(messageElement).toHaveClass('own'); + expectNoAvatar(messageElement); +} + +export function expectAsForwarded(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.message-content')).toHaveClass('is-forwarded'); + expect(messageElement.querySelector('.message-title')).toHaveTextContent('Forwarded message'); +} + +export function expectNotAsForwarded(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.message-content')).not.toHaveClass('is-forwarded'); + + const messageTitle = messageElement.querySelector('.message-title'); + if (messageTitle) { + expect(messageTitle).not.toHaveTextContent('Forwarded message'); + } +} + +export function expectInteractiveSender(messageElement: HTMLDivElement, senderId: number) { + const senderName = messageElement.querySelector('.content-inner .message-title')!; + expect(senderName.firstChild).toHaveClass('interactive'); + + if (senderId > 0) { + const user = selectUser(getGlobal(), senderId)!; + expect(senderName.firstChild).toHaveTextContent(getUserFullName(user)!); + expectClickToCallAction(senderName.firstChild as Element, 'openUserInfo', { id: senderId }); + } else { + const chat = selectChat(getGlobal(), senderId)!; + expect(senderName.firstChild).toHaveTextContent(getChatTitle(chat)!); + expectClickToCallAction(senderName.firstChild as Element, 'openChat', { id: senderId }); + } +} + +export function expectHiddenSender(messageElement: HTMLDivElement, hiddenSenderName: string) { + const senderName = messageElement.querySelector('.content-inner .message-title')!; + expect(senderName.firstChild).not.toHaveClass('interactive'); + expect(senderName.firstChild).toHaveTextContent(hiddenSenderName); + expectClickNotToCallAction(senderName.firstChild as Element, 'openUserInfo'); + expectClickNotToCallAction(senderName.firstChild as Element, 'openChat'); +} + +export function expectNoSender(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.message-title')).toBeNull(); +} + +export function expectViaBot(messageElement: HTMLDivElement, botId: number) { + const botName = messageElement.querySelector('.content-inner .message-title')!; + const { children, children: { length } } = botName; + expect(children[length - 2]).toHaveClass('via'); + expect(children[length - 1]).toHaveClass('interactive'); + const bot = selectUser(getGlobal(), botId)!; + expect(children[length - 1]).toHaveTextContent(`@${bot.username}`); + expectClickToCallAction(children[length - 1], 'openUserInfo', { id: botId }); +} + +export function expectAvatar(messageElement: HTMLDivElement, senderId?: number, hiddenNameInitial?: string) { + const avatar = messageElement.querySelector(':scope > .Avatar')!; + + if (senderId) { + expect(avatar).toHaveAttribute('data-test-sender-id', String(senderId)); + expectClickToCallAction(avatar, senderId > 0 ? 'openUserInfo' : 'openChat', { id: senderId }); + } else { + expect(avatar).not.toHaveAttribute('data-test-sender-id'); + expect(avatar).toHaveTextContent(hiddenNameInitial!); + expectClickNotToCallAction(avatar, 'openUserInfo'); + expectClickNotToCallAction(avatar, 'openChat'); + } +} + +export function expectNoAvatar(messageElement: HTMLDivElement) { + expect(messageElement.querySelector(':scope > .Avatar')).toBeNull(); +} + +export function expectFocusButton(messageElement: HTMLDivElement, chatId: number, messageId: number) { + const button = messageElement.querySelector('.message-action-button')!; + expect(button).not.toBeNull(); + expect(button.querySelector('i')).toHaveClass('icon-arrow-right'); + expectClickToCallAction(button, 'focusMessage', { chatId, messageId }); +} + +export function expectForwardButton(messageElement: HTMLDivElement) { + const button = messageElement.querySelector('.message-action-button .icon-share-filled')!; + expect(button).not.toBeNull(); +} + +export function expectNoFocusButton(messageElement: HTMLDivElement) { + const button = messageElement.querySelector('.message-action-button')!; + expect(button).toBeNull(); +} + +export function expectAdminTitle(messageElement: HTMLDivElement, value: string) { + expect(messageElement.querySelector('.admin-title')).toHaveTextContent(value); +} + +export function expectNoAdminTitle(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.admin-title')).toBeNull(); +} + +export function expectSignature(messageElement: HTMLDivElement, value: string) { + expect(messageElement.querySelector('.message-signature')).toHaveTextContent(value); +} + +export function expectNoSignature(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.message-signature')).toBeNull(); +} + +export function expectSingleGroup(messageElement: HTMLDivElement) { + expect(messageElement).toHaveClass('first-in-group', 'last-in-group'); +} + +export function expectInGroup(messageElement: HTMLDivElement) { + expect(messageElement).not.toHaveClass('first-in-group', 'last-in-group'); +} + +export function expectCommentButton( + messageElement: HTMLDivElement, + commentsCount: number, + authorsCount: number, + messageId: number, + discussionChatId: number, +) { + const button = messageElement.querySelector('.CommentButton')!; + expect(button).not.toBeNull(); + + if (commentsCount) { + expect(button.querySelector('.label')).toHaveTextContent(`${commentsCount} Comments`); + expect(button.querySelectorAll('.Avatar')).toHaveLength(Math.min(authorsCount, 3)); + } else { + expect(button.querySelector('.label')).toHaveTextContent('Leave a Comment'); + expect(button.querySelectorAll('.Avatar')).toHaveLength(0); + } + + expectClickToCallAction(button, 'openChat', { id: discussionChatId, threadId: messageId }); +} + +export function expectNoCommentButton(messageElement: HTMLDivElement) { + const button = messageElement.querySelector('.CommentButton')!; + expect(button).toBeNull(); +} + +export function expectReply(messageElement: HTMLDivElement, originSenderId: number) { + const senderName = messageElement.querySelector('.EmbeddedMessage .message-title')!; + expect(senderName).not.toHaveClass('interactive'); + + if (originSenderId > 0) { + const user = selectUser(getGlobal(), originSenderId)!; + expect(senderName).toHaveTextContent(getUserFullName(user)!); + } else { + const chat = selectChat(getGlobal(), originSenderId)!; + expect(senderName).toHaveTextContent(getChatTitle(chat)!); + } +} + +export function expectNoReply(messageElement: HTMLDivElement) { + expect(messageElement.querySelector('.EmbeddedMessage')).toBeNull(); +} + +export function expectThreadTop(messageElement: HTMLDivElement) { + expect(messageElement).toHaveClass('is-thread-top'); + expect(messageElement.nextElementSibling).toHaveTextContent('Discussion started'); +} + +export function expectClickToCallAction(element: Element, action: ActionTypes, args: any) { + const reducer = jest.fn(); + addReducer(action, reducer); + element.dispatchEvent(new Event('click', { bubbles: true })); + expect(reducer).toBeCalledWith(expect.anything(), expect.anything(), args); +} + +export function expectClickNotToCallAction(element: Element, action: ActionTypes) { + const reducer = jest.fn(); + addReducer(action, reducer); + element.dispatchEvent(new Event('click', { bubbles: true })); + expect(reducer).not.toBeCalled(); +} diff --git a/tests/config.ts b/tests/config.ts new file mode 100644 index 000000000..15564003a --- /dev/null +++ b/tests/config.ts @@ -0,0 +1,3 @@ +export const REQUEST_DELAY = 3000; +export const AFTER_ALL_DELAY = 500; +export const BEFORE_ALL_TIMEOUT = 5000; diff --git a/tests/helpers.ts b/tests/helpers.ts new file mode 100644 index 000000000..de62d0bfb --- /dev/null +++ b/tests/helpers.ts @@ -0,0 +1,3 @@ +export function getMessageElement(messageId: number) { + return document.getElementById(`message${messageId}`) as HTMLDivElement; +} diff --git a/tests/init.js b/tests/init.js new file mode 100644 index 000000000..4d1a483ba --- /dev/null +++ b/tests/init.js @@ -0,0 +1,61 @@ +import '@testing-library/jest-dom'; + +import { Buffer } from 'buffer/'; +import { Crypto } from '@peculiar/webcrypto'; + +require('dotenv') + .config(); + +localStorage.setItem('GramJs:sessionId', 'GramJs-session-TEST'); +localStorage.setItem('GramJs-session-TEST', process.env.TEST_SESSION); + +jest.mock('../src/api/gramjs/worker/provider'); +jest.mock('../src/util/oggToWav'); +jest.mock('../src/util/webpToPng'); +jest.mock('../src/util/voiceRecording'); +jest.mock('../src/lib/rlottie/RLottie'); + +Object.assign(global, { + Buffer, + crypto: new Crypto(), +}); + +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest.fn() + .mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // Deprecated + removeListener: jest.fn(), // Deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })), +}); + +Object.defineProperty(global.Element.prototype, 'innerText', { + get() { + const el = this.cloneNode(true); // can skip if mutability isn't a concern + el.querySelectorAll('script,style') + .forEach((s) => s.remove()); + return el.textContent; + }, + configurable: true, // make it so that it doesn't blow chunks on re-running tests with things like --watch +}); + +Object.defineProperty(global, 'IntersectionObserver', { + writable: true, + configurable: true, + value: class { + observe() { + } + + unobserve() { + } + + disconnect() { + } + }, +}); diff --git a/tests/initApp.tsx b/tests/initApp.tsx new file mode 100644 index 000000000..a460f38e6 --- /dev/null +++ b/tests/initApp.tsx @@ -0,0 +1,24 @@ +import React from '../src/lib/teact/teact'; +import TeactDOM from '../src/lib/teact/teact-dom'; +import { addReducer, getDispatch } from '../src/lib/teact/teactn'; +import '../src/global'; +import Main from '../src/components/main/Main'; + +export default () => { + return new Promise((resolve) => { + const root = document.createElement('div'); + document.body.appendChild(root); + + getDispatch().init(); + getDispatch().initApi(); + + TeactDOM.render( +

    , + root, + ); + + addReducer('saveSession', () => { + resolve(); + }); + }); +}; diff --git a/tests/messageLayout.test.tsx b/tests/messageLayout.test.tsx new file mode 100644 index 000000000..f72b2410e --- /dev/null +++ b/tests/messageLayout.test.tsx @@ -0,0 +1,428 @@ +import { getDispatch } from '../src/lib/teact/teactn'; + +import { AFTER_ALL_DELAY, BEFORE_ALL_TIMEOUT, REQUEST_DELAY } from './config'; +import initApp from './initApp'; +import { getMessageElement } from './helpers'; +import { + expectAvatar, + expectNoAvatar, + expectAdminTitle, + expectNoAdminTitle, + expectFocusButton, + expectNoFocusButton, + expectIncoming, + expectOutgoing, + expectInteractiveSender, + expectNoSender, + expectHiddenSender, + expectThreadTop, + expectReply, + expectNoReply, + expectSingleGroup, + expectInGroup, + expectAsForwarded, + expectNotAsForwarded, + expectViaBot, + expectForwardButton, + expectCommentButton, + expectNoCommentButton, + expectNoSignature, + expectSignature, +} from './assertions'; +import { pause } from '../src/util/schedulers'; +import { LoadMoreDirection } from '../src/types'; + +describe('Message layout', () => { + beforeAll(async () => { + await initApp(); + }, BEFORE_ALL_TIMEOUT); + + describe('Saved Messages', () => { + beforeAll(async () => { + getDispatch().openChat({ id: 628495532 }); + await pause(REQUEST_DELAY); + }, BEFORE_ALL_TIMEOUT); + + afterAll(async () => { + await pause(AFTER_ALL_DELAY); + }); + + test('Incoming forwarded simple (`isFirstInGroup`, not `isLastInGroup`)', () => { + const messageElement = getMessageElement(2955); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 314552265); + expectNoAvatar(messageElement); + expectFocusButton(messageElement, -178999811, 2950); + }); + + test('Incoming forwarded simple (`isLastInGroup`, not `isFirstInGroup`)', () => { + const messageElement = getMessageElement(2956); + expectIncoming(messageElement); + expectNoSender(messageElement); + expectAvatar(messageElement, 314552265); + expectFocusButton(messageElement, -178999811, 2951); + }); + + test('Outgoing simple (`isFirstInGroup`, `isLastInGroup`)', () => { + const messageElement = getMessageElement(2957); + expectOutgoing(messageElement); + expectNoSender(messageElement); + }); + + test('Incoming forwarded direct from hidden ', () => { + const messageElement = getMessageElement(2959); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectHiddenSender(messageElement, 'Mike Ravdonikas'); + expectAvatar(messageElement, undefined, 'MR'); + expectNoFocusButton(messageElement); + }); + + test('Incoming forwarded from group from hidden ', () => { + const messageElement = getMessageElement(2958); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectHiddenSender(messageElement, 'Антон'); + expectAvatar(messageElement, undefined, 'А'); + expectFocusButton(messageElement, -178999811, 2935); + }); + + test('Incoming forwarded via bot', () => { + const messageElement = getMessageElement(2960); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectInteractiveSender(messageElement, 408193052); + expectViaBot(messageElement, 140267078); + expectAvatar(messageElement, 408193052); + expectFocusButton(messageElement, -178999811, 2934); + }); + + test('Outgoing forwarded via bot', () => { + const messageElement = getMessageElement(2964); + expectOutgoing(messageElement); + expectNotAsForwarded(messageElement); + expect(messageElement.querySelector('.content-inner .message-title')!.childElementCount).toEqual(2); + expectViaBot(messageElement, 140267078); + }); + + test('Incoming forwarded channel post', () => { + const messageElement = getMessageElement(2965); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1038976893); + expectAvatar(messageElement, -1038976893); + expectFocusButton(messageElement, -1038976893, 192); + }); + }); + + describe('Group', () => { + beforeAll(async () => { + getDispatch().openChat({ id: -178999811 }); + await pause(REQUEST_DELAY); + + getDispatch().loadViewportMessages({ direction: LoadMoreDirection.Backwards }); + await pause(REQUEST_DELAY); + }, BEFORE_ALL_TIMEOUT * 2); + + afterAll(async () => { + await pause(AFTER_ALL_DELAY); + }); + + test('Incoming simple (`isFirstInGroup`, not `isLastInGroup`)', () => { + const messageElement = getMessageElement(2945); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 3718260); + expectNoAvatar(messageElement); + }); + + test('Incoming simple (`isLastInGroup`, not `isFirstInGroup`)', () => { + const messageElement = getMessageElement(2946); + expectIncoming(messageElement); + expectNoSender(messageElement); + expectAvatar(messageElement, 3718260); + }); + + test('Outgoing simple (`isFirstInGroup`, `isLastInGroup`)', () => { + const messageElement = getMessageElement(2943); + expectOutgoing(messageElement); + expectNoSender(messageElement); + }); + + test('Incoming forwarded (not `isLastInGroup`)', () => { + const messageElement = getMessageElement(2950); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, 314552265); + expectNoAvatar(messageElement); + }); + + test('Incoming forwarded (`isLastInGroup`)', () => { + const messageElement = getMessageElement(2951); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, 314552265); + expectAvatar(messageElement, 3718260); + }); + + test('Outgoing forwarded', () => { + const messageElement = getMessageElement(2954); + expectOutgoing(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, 3718260); + }); + + test('Incoming forwarded from hidden', () => { + const messageElement = getMessageElement(2935); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectHiddenSender(messageElement, 'Антон'); + expectAvatar(messageElement, 3718260); + }); + + test('Outgoing forwarded from hidden', () => { + const messageElement = getMessageElement(2936); + expectOutgoing(messageElement); + expectAsForwarded(messageElement); + expectHiddenSender(messageElement, 'Антон'); + }); + + test('Incoming forwarded via bot', () => { + const messageElement = getMessageElement(2934); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, 408193052); + expectViaBot(messageElement, 140267078); + expectAvatar(messageElement, 3718260); + }); + + test('Outgoing forwarded via bot', () => { + const messageElement = getMessageElement(2732); + expectOutgoing(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, 408193052); + expectViaBot(messageElement, 140267078); + }); + + test('Incoming forwarded channel post', () => { + const messageElement = getMessageElement(2952); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1038976893); + expectAvatar(messageElement, 3718260); + expectFocusButton(messageElement, -1038976893, 192); + }); + + test('Outgoing forwarded channel post', () => { + const messageElement = getMessageElement(2953); + expectOutgoing(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1038976893); + expectFocusButton(messageElement, -1038976893, 192); + }); + }); + + describe('Channel', () => { + beforeAll(async () => { + getDispatch().openChat({ id: -1386471086 }); + await pause(REQUEST_DELAY); + }, BEFORE_ALL_TIMEOUT); + + afterAll(async () => { + await pause(AFTER_ALL_DELAY); + }); + + test('Single post with comments', () => { + const messageElement = getMessageElement(2); + expectIncoming(messageElement); + expectNoSender(messageElement); + expectNoAvatar(messageElement); + expectForwardButton(messageElement); + expectNoAdminTitle(messageElement); + expectSingleGroup(messageElement); + expectCommentButton(messageElement, 4, 2, 2, -1403448678); + expectNoSignature(messageElement); + }); + + test('Post in group (first)', () => { + const messageElement = getMessageElement(3); + expectIncoming(messageElement); + expectNoSender(messageElement); + expectNoAvatar(messageElement); + expectForwardButton(messageElement); + expectNoAdminTitle(messageElement); + expectInGroup(messageElement); + expectCommentButton(messageElement, 0, 0, 3, -1403448678); + }); + + test('Post in group (last)', () => { + const messageElement = getMessageElement(4); + expectIncoming(messageElement); + expectNoSender(messageElement); + expectNoAvatar(messageElement); + expectForwardButton(messageElement); + expectNoAdminTitle(messageElement); + expectInGroup(messageElement); + expectCommentButton(messageElement, 0, 0, 4, -1403448678); + }); + + test('Signed post', () => { + const messageElement = getMessageElement(10); + expectSignature(messageElement, 'Sasha Alejandro'); + expectNoSender(messageElement); + expectNoAdminTitle(messageElement); + }); + + test('Post which was removed from discussion', () => { + const messageElement = getMessageElement(15); + expectNoCommentButton(messageElement); + }); + }); + + describe('Discussion', () => { + beforeAll(async () => { + getDispatch().openChat({ id: -1403448678 }); + await pause(REQUEST_DELAY); + }, BEFORE_ALL_TIMEOUT); + + afterAll(async () => { + await pause(AFTER_ALL_DELAY); + }); + + test('Linked channel post', () => { + const messageElement = getMessageElement(14); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1386471086); + expectNoAvatar(messageElement); + expectFocusButton(messageElement, -1386471086, 3); + expectAdminTitle(messageElement, 'channel'); + expectInGroup(messageElement); + }); + + test('Linked channel post (following previous)', () => { + const messageElement = getMessageElement(15); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectNoSender(messageElement); + expectAvatar(messageElement, -1386471086); + expectFocusButton(messageElement, -1386471086, 4); + expectNoAdminTitle(messageElement); + expectInGroup(messageElement); + }); + + test('Incoming forwarded not linked channel post', () => { + const messageElement = getMessageElement(6); + expectIncoming(messageElement); + expectAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1038976893); + expectAvatar(messageElement, 3718260); + expectFocusButton(messageElement, -1038976893, 192); + expectNoAdminTitle(messageElement); + }); + + test('Incoming simple (`isFirstInGroup`, `isLastInGroup`)', () => { + const messageElement = getMessageElement(4); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 3718260); + expectAvatar(messageElement, 3718260); + }); + + test('Outgoing as anonymous (`isFirstInGroup`)', () => { + const messageElement = getMessageElement(11); + expectOutgoing(messageElement); + expectInteractiveSender(messageElement, -1403448678); + }); + + test('Incoming reply to linked post', () => { + const messageElement = getMessageElement(7); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 3718260); + expectAvatar(messageElement, 3718260); + expectReply(messageElement, -1386471086); + }); + + test('Outgoing reply to anonymous post', () => { + const messageElement = getMessageElement(13); + expectOutgoing(messageElement); + expectInteractiveSender(messageElement, -1403448678); + expectReply(messageElement, -1403448678); + }); + + test('Outgoing reply to linked post (with admin title)', () => { + const messageElement = getMessageElement(42); + expectOutgoing(messageElement); + expectInteractiveSender(messageElement, -1403448678); + expectReply(messageElement, -1386471086); + expectAdminTitle(messageElement, 'Super Name'); + expectNoSignature(messageElement); + }); + + test('Incoming linked channel post (signed)', () => { + const messageElement = getMessageElement(111); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1386471086); + expectFocusButton(messageElement, -1386471086, 10); + expectAdminTitle(messageElement, 'channel'); + expectSignature(messageElement, 'Sasha Alejandro'); + }); + }); + + describe('Comment Thread', () => { + beforeAll(async () => { + getDispatch().openChat({ id: -1386471086 }); + await pause(REQUEST_DELAY); + + getDispatch().openChat({ id: -1403448678, threadId: 2 }); + await pause(REQUEST_DELAY); + }, BEFORE_ALL_TIMEOUT * 2); + + afterAll(async () => { + await pause(AFTER_ALL_DELAY); + }); + + test('Original channel post', () => { + const messageElement = getMessageElement(2); + expectIncoming(messageElement); + expectNotAsForwarded(messageElement); + expectInteractiveSender(messageElement, -1386471086); + expectNoAvatar(messageElement); + expectFocusButton(messageElement, -1386471086, 2); + expectAdminTitle(messageElement, 'channel'); + expectSingleGroup(messageElement); + expectThreadTop(messageElement); + }); + + test('Incoming reply to original post', () => { + const messageElement = getMessageElement(7); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 3718260); + expectAvatar(messageElement, 3718260); + expectNoReply(messageElement); + }); + + test('Outgoing reply', () => { + const messageElement = getMessageElement(39); + expectOutgoing(messageElement); + expectInteractiveSender(messageElement, -1403448678); + expectNoReply(messageElement); + }); + + test('Incoming reply to another comment', () => { + const messageElement = getMessageElement(41); + expectIncoming(messageElement); + expectInteractiveSender(messageElement, 3718260); + expectAvatar(messageElement, 3718260); + expectReply(messageElement, -1403448678); + }); + + test('Outgoing reply (with admin title)', () => { + const messageElement = getMessageElement(42); + expectOutgoing(messageElement); + expectInteractiveSender(messageElement, -1403448678); + expectNoReply(messageElement); + expectAdminTitle(messageElement, 'Super Name'); + expectNoSignature(messageElement); + }); + }); +}); diff --git a/tests/staticFileMock.js b/tests/staticFileMock.js new file mode 100644 index 000000000..b2b70519d --- /dev/null +++ b/tests/staticFileMock.js @@ -0,0 +1,2 @@ +// This fixed an error related to the CSS and loading gif breaking my Jest test +module.exports = 'test-file-stub'; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..1b3181804 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + // We don't care about this since Parcel runs Babel after TypeScript + "target": "esnext", + "lib": [ + "dom", + "webworker", + "es7" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react" + }, + "include": [ + "src" + ] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..5a95227ff --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,135 @@ +const path = require('path'); +const dotenv = require('dotenv'); + +const { EnvironmentPlugin } = require('webpack'); +const HtmlPlugin = require('html-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); +const TerserJSPlugin = require('terser-webpack-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); + +dotenv.config(); + +module.exports = (env = {}, argv = {}) => { + return { + mode: argv.mode, + entry: './src/index.tsx', + devServer: { + contentBase: [ + path.resolve(__dirname, 'public'), + path.resolve(__dirname, 'node_modules/emoji-data-ios'), + path.resolve(__dirname, 'node_modules/opus-recorder/dist'), + path.resolve(__dirname, 'src/lib/webp'), + path.resolve(__dirname, 'src/lib/rlottie'), + ], + port: 1234, + host: '0.0.0.0', + disableHostCheck: true, + stats: 'minimal', + }, + output: { + filename: '[name].[contenthash].js', + chunkFilename: '[id].[chunkhash].js', + path: path.resolve(__dirname, argv['output-path'] || 'dist'), + }, + module: { + rules: [ + { + test: /\.(ts|tsx|js)$/, + loader: 'babel-loader', + exclude: /node_modules/, + }, + { + test: /\.css$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + importLoaders: 1, + }, + }, + 'postcss-loader', + ], + }, + { + test: /\.scss$/, + use: [ + MiniCssExtractPlugin.loader, + 'css-loader', + 'postcss-loader', + 'sass-loader', + ], + }, + { + test: /\.(woff(2)?|ttf|eot|svg|png|jpg|tgs)(\?v=\d+\.\d+\.\d+)?$/, + loader: 'file-loader', + options: { + name: '[name].[contenthash].[ext]', + }, + }, + { + test: /-extra\.json$/, + loader: 'file-loader', + type: 'javascript/auto', + options: { + name: '[name].[contenthash].[ext]', + }, + }, + { + test: /\.wasm$/, + loader: 'file-loader', + type: 'javascript/auto', + options: { + name: '[name].[contenthash].[ext]', + }, + }, + { + test: /\.tl$/i, + loader: 'raw-loader', + }, + ], + }, + resolve: { + extensions: ['.js', '.ts', '.tsx'], + }, + plugins: [ + new HtmlPlugin({ + template: 'src/index.html', + }), + new MiniCssExtractPlugin({ + filename: '[name].[contenthash].css', + chunkFilename: '[name].[chunkhash].css', + ignoreOrder: true, + }), + new EnvironmentPlugin({ + APP_ENV: 'production', + TELEGRAM_T_API_ID: '', + TELEGRAM_T_API_HASH: '', + }), + ...(argv.mode === 'production' ? [ + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + }), + ] : []), + ], + node: { + fs: 'empty', + }, + + ...(!env.noSourceMap && { + devtool: 'source-map', + }), + + ...(argv['optimize-minimize'] && { + optimization: { + minimize: !env.noMinify, + minimizer: [ + new TerserJSPlugin({ sourceMap: true }), + new OptimizeCSSAssetsPlugin({}), + ], + }, + }), + }; +};